# HG changeset patch # User mikael # Date 1114112303 0 # Node ID 93dcc4e15d4ac75cedfa6d7163946521b04c8b44 # Parent 2b4cc6bc5bf257e1de1bfafd85495db10d93985b [/trunk] Changeset 117 by mikael * Optimize scr_handle_tab() * Add /roster command completion (with its parameters) * Clean up compl.c (debug stuff) * Update TODO diff -r 2b4cc6bc5bf2 -r 93dcc4e15d4a mcabber/src/TODO --- a/mcabber/src/TODO Thu Apr 21 19:06:27 2005 +0000 +++ b/mcabber/src/TODO Thu Apr 21 19:38:23 2005 +0000 @@ -3,8 +3,6 @@ * Should not stay on buddy buffer when one moves to a group * Pending message not displayed if buddy outside Contact window -* Command not recognised if there is a trailing space! ("/quit ") -* Completion is buggy when we're not at the EOL... TODO: @@ -34,7 +32,6 @@ * External commands for events * Multi-lines * Handle window resize -* Command line completion * Scroll back history * Save history * Shortcut to jump to next message received (shift-tab?) diff -r 2b4cc6bc5bf2 -r 93dcc4e15d4a mcabber/src/commands.c --- a/mcabber/src/commands.c Thu Apr 21 19:06:27 2005 +0000 +++ b/mcabber/src/commands.c Thu Apr 21 19:38:23 2005 +0000 @@ -62,6 +62,7 @@ cmd_add("quit", "Exit the software", 0, 0, NULL); //cmd_add("rename"); //cmd_add("request_auth"); + cmd_add("roster", "Manipulate the roster/buddylist", COMPL_ROSTER, 0, NULL); cmd_add("say", "Say something to the selected buddy", 0, 0, NULL); //cmd_add("search"); //cmd_add("send_auth"); @@ -76,6 +77,12 @@ compl_add_category_word(COMPL_STATUS, "busy"); compl_add_category_word(COMPL_STATUS, "notavail"); compl_add_category_word(COMPL_STATUS, "away"); + + // Roster category + compl_add_category_word(COMPL_ROSTER, "bottom"); + compl_add_category_word(COMPL_ROSTER, "hide_offline"); + compl_add_category_word(COMPL_ROSTER, "show_offline"); + compl_add_category_word(COMPL_ROSTER, "top"); } // cmd_get diff -r 2b4cc6bc5bf2 -r 93dcc4e15d4a mcabber/src/compl.c --- a/mcabber/src/compl.c Thu Apr 21 19:06:27 2005 +0000 +++ b/mcabber/src/compl.c Thu Apr 21 19:38:23 2005 +0000 @@ -170,42 +170,3 @@ return NULL; } - -/* -void test_dump_categories(void) -{ - GSList *sl_cat; - // Look for category - for (sl_cat=Categories; sl_cat; sl_cat = g_slist_next(sl_cat)) { - GSList *sl_words; - category *cat = (category*)sl_cat->data; - printf("Category: %u\n", cat->flag); - for (sl_words=cat->words; sl_words; sl_words = g_slist_next(sl_words)) { - char *word = sl_words->data; - printf(" Keyword: [%s]\n", word); - } - } -} - -void test_comp(guint cat_flags, char *prefix) -{ - GSList *list = compl_get_category_list(cat_flags); - if (list) { - const char *cchar; - guint back; - int i; - new_completion(prefix, list); - cchar = complete(); - printf("Complete -> \"%s\"\n", cchar); - for (i=0 ; i<5; i++) { - back = cancel_completion(); - printf("Back: %d\n", back); - cchar = complete(); - printf("Complete -> \"%s\"\n", cchar); - } - back = cancel_completion(); - printf("Back: %d\n", back); - done_completion(); - } -} -*/ diff -r 2b4cc6bc5bf2 -r 93dcc4e15d4a mcabber/src/compl.h --- a/mcabber/src/compl.h Thu Apr 21 19:06:27 2005 +0000 +++ b/mcabber/src/compl.h Thu Apr 21 19:38:23 2005 +0000 @@ -3,12 +3,13 @@ #include -#define COMPL_CMD 1 // Not implemented yet +#define COMPL_CMD 1 #define COMPL_JID 2 // Not implemented yet #define COMPL_URLJID 4 // Not implemented yet #define COMPL_NAME 8 // Not implemented yet -#define COMPL_STATUS 16 // Not implemented yet +#define COMPL_STATUS 16 #define COMPL_FILENAME 32 // Not implemented yet +#define COMPL_ROSTER 64 void compl_add_category_word(guint, const char *command); GSList *compl_get_category_list(guint cat_flags); diff -r 2b4cc6bc5bf2 -r 93dcc4e15d4a mcabber/src/screen.c --- a/mcabber/src/screen.c Thu Apr 21 19:06:27 2005 +0000 +++ b/mcabber/src/screen.c Thu Apr 21 19:38:23 2005 +0000 @@ -634,84 +634,54 @@ void scr_handle_tab(void) { int nrow; - cmd *com; char *row; const char *cchar; + guint compl_categ; nrow = which_row(&row); - if (nrow == -1) return; // No completion if no leading slash + // a) No completion if no leading slash ('cause not a command) + // b) We can't have more than 2 parameters (we use 2 flags) + if (nrow < 0 || nrow > 2) return; - if (nrow == 0) { // Command completion - if (!completion_started) { - GSList *list = compl_get_category_list(COMPL_CMD); - if (list) { - char *prefix = g_strndup(&inputLine[1], ptr_inputline-inputLine-1); - // Init completion - new_completion(prefix, list); - g_free(prefix); - // Now complete - cchar = complete(); - if (cchar) - scr_insert_text(cchar); - completion_started = TRUE; - } - } else { // Completion already initialized - char *c; - guint back = cancel_completion(); - // Remove $back chars - ptr_inputline -= back; - c = ptr_inputline; - for ( ; *c ; c++) - *c = *(c+back); - // Now complete again + if (nrow == 0) { // Command completion + row = &inputLine[1]; + compl_categ = COMPL_CMD; + } else { // Other completion, depending on the command + cmd *com = cmd_get(inputLine); + if (!com || !row) { + scr_LogPrint("I cannot complete that..."); + return; + } + compl_categ = com->completion_flags[nrow-1]; + } + + if (!completion_started) { + GSList *list = compl_get_category_list(compl_categ); + if (list) { + char *prefix = g_strndup(row, ptr_inputline-row); + // Init completion + new_completion(prefix, list); + g_free(prefix); + // Now complete cchar = complete(); if (cchar) scr_insert_text(cchar); + completion_started = TRUE; } - return; - } - - // Other completion, depending on the command - com = cmd_get(inputLine); - if (!com) { - scr_LogPrint("I cannot complete for this command"); - return; + } else { // Completion already initialized + char *c; + guint back = cancel_completion(); + // Remove $back chars + ptr_inputline -= back; + c = ptr_inputline; + for ( ; *c ; c++) + *c = *(c+back); + // Now complete again + cchar = complete(); + if (cchar) + scr_insert_text(cchar); } - // Now we have the command and the column. - scr_LogPrint("CMD_FLAGR1=%d COL=%d row=[%s]", com->completion_flags[0], nrow, row); - - // We can't have more than 2 parameters (we use 2 flags) - if (nrow > 2) - return; - - // Dirty copy & paste - if (!completion_started) { - GSList *list = compl_get_category_list(com->completion_flags[nrow-1]); - if (list) { - char *prefix = g_strndup(row, ptr_inputline-row); - // Init completion - new_completion(prefix, list); - g_free(prefix); - // Now complete - cchar = complete(); - if (cchar) - scr_insert_text(cchar); - completion_started = TRUE; - } - } else { // Completion already initialized - char *c; - guint back = cancel_completion(); - // Remove $back chars - ptr_inputline -= back; - c = ptr_inputline; - for ( ; *c ; c++) - *c = *(c+back); - // Now complete again - cchar = complete(); - if (cchar) - scr_insert_text(cchar); - } } void scr_cancel_current_completion(void)