Mercurial > hg
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; |