changeset 104:fe7257d251ac

[/trunk] Changeset 118 by mikael * Commands are ready. Callback system in place. * Implement /roster callback :) * Completion is case-insensitive (good idea??)
author mikael
date Thu, 21 Apr 2005 20:22:35 +0000
parents 93dcc4e15d4a
children 91d3ec21c24e
files mcabber/src/commands.c mcabber/src/commands.h mcabber/src/compl.c mcabber/src/screen.c mcabber/src/screen.h
diffstat 5 files changed, 77 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Thu Apr 21 19:38:23 2005 +0000
+++ b/mcabber/src/commands.c	Thu Apr 21 20:22:35 2005 +0000
@@ -29,13 +29,17 @@
 #include "utf8.h"
 #include "utils.h"
 
+// Commands callbacks
+void do_roster(char *arg);
 
+// Global variable for the commands list
 static GSList *Commands;
 
+
 //  cmd_add()
 // Adds a command to the commands list and to the CMD completion list
 void cmd_add(const char *name, const char *help,
-        guint flags_row1, guint flags_row2, void *(*f)())
+        guint flags_row1, guint flags_row2, void (*f)())
 {
   cmd *n_cmd = g_new0(cmd, 1);
   strncpy(n_cmd->name, name, 32-1);
@@ -62,7 +66,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("roster", "Manipulate the roster/buddylist", COMPL_ROSTER, 0, &do_roster);
   cmd_add("say", "Say something to the selected buddy", 0, 0, NULL);
   //cmd_add("search");
   //cmd_add("send_auth");
@@ -149,6 +153,8 @@
 int process_line(char *line)
 {
   char *p;
+  cmd *curcmd;
+
   if (*line != '/') {
     send_message(line); // FIXME: are we talking to a _buddy_?
     return 0;
@@ -165,11 +171,49 @@
   if (!strcasecmp(line, "/quit")) {
     return 255;
   }
+
   // Commands handling
-  // TODO
-  // say, send_raw...
+  curcmd = cmd_get(line);
 
-  scr_LogPrint("Unrecognised command, sorry.");
+  if (!curcmd) {
+    scr_LogPrint("Unrecognized command, sorry.");
+    return 0;
+  }
+  if (!curcmd->func) {
+    scr_LogPrint("Not yet implemented, sorry.");
+    return 0;
+  }
+  // Lets go to the command parameters
+  for (line++; *line && (*line != ' ') ; line++)
+    ;
+  // Skip spaces
+  while (*line && (*line == ' '))
+    line++;
+  // Call command-specific function
+  (*curcmd->func)(line);
   return 0;
 }
 
+/* Commands callback functions */
+
+void do_roster(char *arg)
+{
+  if (!strcasecmp(arg, "top")) {
+    scr_RosterTop();
+    scr_DrawRoster();
+  } else if (!strcasecmp(arg, "bottom")) {
+    scr_RosterBottom();
+    scr_DrawRoster();
+  } else if (!strcasecmp(arg, "hide_offline")) {
+    buddylist_hide_offline_buddies(TRUE);
+    if (current_buddy)
+      buddylist_build();
+    scr_DrawRoster();
+  } else if (!strcasecmp(arg, "show_offline")) {
+    buddylist_hide_offline_buddies(FALSE);
+    if (current_buddy)
+      buddylist_build();
+    scr_DrawRoster();
+  } else
+    scr_LogPrint("Unrecognized parameter!");
+}
--- a/mcabber/src/commands.h	Thu Apr 21 19:38:23 2005 +0000
+++ b/mcabber/src/commands.h	Thu Apr 21 20:22:35 2005 +0000
@@ -8,7 +8,7 @@
   char name[32];
   const char *help;
   guint completion_flags[2];
-  void *(*func)();
+  void (*func)();
 } cmd;
 
 void cmd_init(void);
--- a/mcabber/src/compl.c	Thu Apr 21 19:38:23 2005 +0000
+++ b/mcabber/src/compl.c	Thu Apr 21 20:22:35 2005 +0000
@@ -78,7 +78,7 @@
   // Build the list of matches
   for (sl_cat=compl_cat; sl_cat; sl_cat = g_slist_next(sl_cat)) {
     char *word = sl_cat->data;
-    if (!strncmp(prefix, word, len)) {
+    if (!strncasecmp(prefix, word, len)) {
       if (strlen(word) != len)
         c->list = g_slist_append(c->list, g_strdup(word+len)); // TODO sort
     }
--- a/mcabber/src/screen.c	Thu Apr 21 19:38:23 2005 +0000
+++ b/mcabber/src/screen.c	Thu Apr 21 20:22:35 2005 +0000
@@ -535,6 +535,22 @@
   return inputWnd;
 }
 
+void scr_RosterTop()
+{
+  current_buddy = buddylist;
+  // XXX We should rebuild the buddylist but perhaps not everytime?
+  if (chatmode)
+    scr_ShowBuddyWindow();
+}
+
+void scr_RosterBottom()
+{
+  current_buddy = g_list_last(buddylist);
+  // XXX We should rebuild the buddylist but perhaps not everytime?
+  if (chatmode)
+    scr_ShowBuddyWindow();
+}
+
 void scr_RosterUp()
 {
   if (current_buddy) {
@@ -544,6 +560,9 @@
     }
   }
   // XXX We should rebuild the buddylist but perhaps not everytime?
+
+  if (chatmode)
+    scr_ShowBuddyWindow();
 }
 
 void scr_RosterDown()
@@ -555,6 +574,9 @@
     }
   }
   // XXX We should rebuild the buddylist but perhaps not everytime?
+
+  if (chatmode)
+    scr_ShowBuddyWindow();
 }
 
 //  scr_LogPrint(...)
@@ -787,13 +809,9 @@
           break;
       case KEY_UP:
           scr_RosterUp();
-          if (chatmode)
-            scr_ShowBuddyWindow();
           break;
       case KEY_DOWN:
           scr_RosterDown();
-          if (chatmode)
-            scr_ShowBuddyWindow();
           break;
       case KEY_PPAGE:
           scr_LogPrint("PageUp??");
--- a/mcabber/src/screen.h	Thu Apr 21 19:38:23 2005 +0000
+++ b/mcabber/src/screen.h	Thu Apr 21 20:22:35 2005 +0000
@@ -33,4 +33,8 @@
 
 int process_key(int);
 
+// For commands...
+void scr_RosterTop();
+void scr_RosterBottom();
+
 #endif