comparison mcabber/src/screen.c @ 103:93dcc4e15d4a

[/trunk] Changeset 117 by mikael * Optimize scr_handle_tab() * Add /roster command completion (with its parameters) * Clean up compl.c (debug stuff) * Update TODO
author mikael
date Thu, 21 Apr 2005 19:38:23 +0000
parents 2b4cc6bc5bf2
children fe7257d251ac
comparison
equal deleted inserted replaced
102:2b4cc6bc5bf2 103:93dcc4e15d4a
632 } 632 }
633 633
634 void scr_handle_tab(void) 634 void scr_handle_tab(void)
635 { 635 {
636 int nrow; 636 int nrow;
637 cmd *com;
638 char *row; 637 char *row;
639 const char *cchar; 638 const char *cchar;
639 guint compl_categ;
640 640
641 nrow = which_row(&row); 641 nrow = which_row(&row);
642 642
643 if (nrow == -1) return; // No completion if no leading slash 643 // a) No completion if no leading slash ('cause not a command)
644 644 // b) We can't have more than 2 parameters (we use 2 flags)
645 if (nrow == 0) { // Command completion 645 if (nrow < 0 || nrow > 2) return;
646 if (!completion_started) { 646
647 GSList *list = compl_get_category_list(COMPL_CMD); 647 if (nrow == 0) { // Command completion
648 if (list) { 648 row = &inputLine[1];
649 char *prefix = g_strndup(&inputLine[1], ptr_inputline-inputLine-1); 649 compl_categ = COMPL_CMD;
650 // Init completion 650 } else { // Other completion, depending on the command
651 new_completion(prefix, list); 651 cmd *com = cmd_get(inputLine);
652 g_free(prefix); 652 if (!com || !row) {
653 // Now complete 653 scr_LogPrint("I cannot complete that...");
654 cchar = complete(); 654 return;
655 if (cchar) 655 }
656 scr_insert_text(cchar); 656 compl_categ = com->completion_flags[nrow-1];
657 completion_started = TRUE; 657 }
658 } 658
659 } else { // Completion already initialized 659 if (!completion_started) {
660 char *c; 660 GSList *list = compl_get_category_list(compl_categ);
661 guint back = cancel_completion(); 661 if (list) {
662 // Remove $back chars 662 char *prefix = g_strndup(row, ptr_inputline-row);
663 ptr_inputline -= back; 663 // Init completion
664 c = ptr_inputline; 664 new_completion(prefix, list);
665 for ( ; *c ; c++) 665 g_free(prefix);
666 *c = *(c+back); 666 // Now complete
667 // Now complete again
668 cchar = complete(); 667 cchar = complete();
669 if (cchar) 668 if (cchar)
670 scr_insert_text(cchar); 669 scr_insert_text(cchar);
671 } 670 completion_started = TRUE;
672 return; 671 }
673 } 672 } else { // Completion already initialized
674 673 char *c;
675 // Other completion, depending on the command 674 guint back = cancel_completion();
676 com = cmd_get(inputLine); 675 // Remove $back chars
677 if (!com) { 676 ptr_inputline -= back;
678 scr_LogPrint("I cannot complete for this command"); 677 c = ptr_inputline;
679 return; 678 for ( ; *c ; c++)
680 } 679 *c = *(c+back);
681 // Now we have the command and the column. 680 // Now complete again
682 scr_LogPrint("CMD_FLAGR1=%d COL=%d row=[%s]", com->completion_flags[0], nrow, row); 681 cchar = complete();
683 682 if (cchar)
684 // We can't have more than 2 parameters (we use 2 flags) 683 scr_insert_text(cchar);
685 if (nrow > 2) 684 }
686 return;
687
688 // Dirty copy & paste
689 if (!completion_started) {
690 GSList *list = compl_get_category_list(com->completion_flags[nrow-1]);
691 if (list) {
692 char *prefix = g_strndup(row, ptr_inputline-row);
693 // Init completion
694 new_completion(prefix, list);
695 g_free(prefix);
696 // Now complete
697 cchar = complete();
698 if (cchar)
699 scr_insert_text(cchar);
700 completion_started = TRUE;
701 }
702 } else { // Completion already initialized
703 char *c;
704 guint back = cancel_completion();
705 // Remove $back chars
706 ptr_inputline -= back;
707 c = ptr_inputline;
708 for ( ; *c ; c++)
709 *c = *(c+back);
710 // Now complete again
711 cchar = complete();
712 if (cchar)
713 scr_insert_text(cchar);
714 }
715 } 685 }
716 686
717 void scr_cancel_current_completion(void) 687 void scr_cancel_current_completion(void)
718 { 688 {
719 char *c; 689 char *c;