diff mcabber/src/screen.c @ 102:2b4cc6bc5bf2

[/trunk] Changeset 116 by mikael * Can now complete command parameters :-)
author mikael
date Thu, 21 Apr 2005 19:06:27 +0000
parents 4f3ad00b5187
children 93dcc4e15d4a
line wrap: on
line diff
--- a/mcabber/src/screen.c	Thu Apr 21 17:31:28 2005 +0000
+++ b/mcabber/src/screen.c	Thu Apr 21 19:06:27 2005 +0000
@@ -587,7 +587,8 @@
 // -1 -> normal text
 //  0 -> command
 //  1 -> parameter 1 (etc.)
-int which_row(void)
+//  If > 0, then *p_row is set to the beginning of the row
+int which_row(char **p_row)
 {
   int row = -1;
   char *p;
@@ -607,8 +608,10 @@
     }
     if (*p == '"' && *(p-1) != '\\') {
       quote = TRUE;
-    } else if (*p == ' ' && *(p-1) != ' ')
+    } else if (*p == ' ' && *(p-1) != ' ') {
       row++;
+      *p_row = p+1;
+    }
   }
   return row;
 }
@@ -630,13 +633,16 @@
 
 void scr_handle_tab(void)
 {
-  int row;
-  row = which_row();
+  int nrow;
+  cmd *com;
+  char *row;
+  const char *cchar;
 
-  if (row == -1) return;    // No completion if no leading slash
+  nrow = which_row(&row);
 
-  if (row == 0) {   // Command completion
-    const char *cchar;
+  if (nrow == -1) return;   // No completion if no leading slash
+
+  if (nrow == 0) {          // Command completion
     if (!completion_started) {
       GSList *list = compl_get_category_list(COMPL_CMD);
       if (list) {
@@ -650,7 +656,7 @@
           scr_insert_text(cchar);
         completion_started = TRUE;
       }
-    } else {
+    } else {    // Completion already initialized
       char *c;
       guint back = cancel_completion();
       // Remove $back chars
@@ -667,7 +673,45 @@
   }
 
   // Other completion, depending on the command
-  scr_LogPrint("I'm unable to complete that yet");
+  com = cmd_get(inputLine);
+  if (!com) {
+    scr_LogPrint("I cannot complete for this command");
+    return;
+  }
+  // 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)