changeset 288:1eea0fa0955e

Add /bind command * Split process_line() to process_line() + process_command() * Do not expand aliases in multi-line mode * Add /bind command The binding system is ugly (not UTF-8 compatible, I think, and certainly system dependant because it is using ncurses wgetch() values).
author Mikael Berthe <mikael@lilotux.net>
date Fri, 08 Jul 2005 21:47:17 +0100
parents c2a7e78d9ff5
children 72fa52203651
files mcabber/src/commands.c mcabber/src/commands.h mcabber/src/screen.c mcabber/src/settings.c mcabber/src/settings.h
diffstat 5 files changed, 93 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Fri Jul 08 07:31:24 2005 +0100
+++ b/mcabber/src/commands.c	Fri Jul 08 21:47:17 2005 +0100
@@ -47,6 +47,7 @@
 void do_move(char *arg);
 void do_set(char *arg);
 void do_alias(char *arg);
+void do_bind(char *arg);
 
 // Global variable for the commands list
 static GSList *Commands;
@@ -74,6 +75,7 @@
 {
   cmd_add("add", "Add a jabber user", COMPL_JID, 0, &do_add);
   cmd_add("alias", "Add an alias", 0, 0, &do_alias);
+  cmd_add("bind", "Add an key binding", 0, 0, &do_bind);
   cmd_add("buffer", "Manipulate current buddy's buffer (chat window)",
           COMPL_BUFFER, 0, &do_buffer);
   cmd_add("clear", "Clear the dialog window", 0, 0, &do_clear);
@@ -222,39 +224,15 @@
   jb_send_msg(jid, msg);
 }
 
-//  process_line(line)
-// Process a command/message line.
-// If this isn't a command, this is a message and it is sent to the
-// currently selected buddy.
-int process_line(char *line)
+//  process_command(line)
+// Process a command line.
+// Return 255 if this is the /quit command, and 0 for the other commands.
+int process_command(char *line)
 {
   char *p;
   char *xpline;
   cmd *curcmd;
 
-  if (!*line) { // User only pressed enter
-    if (scr_get_multimode()) {
-      scr_append_multiline("");
-      return 0;
-    }
-    if (current_buddy) {
-      scr_set_chatmode(TRUE);
-      buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, TRUE);
-      scr_ShowBuddyWindow();
-    }
-    return 0;
-  }
-
-  if (*line != '/') {
-    // This isn't a command
-    if (scr_get_multimode())
-      scr_append_multiline(line);
-    else
-      do_say(line);
-    return 0;
-  }
-
-  /* It is a command */
   // Remove trailing spaces:
   for (p=line ; *p ; p++)
     ;
@@ -262,7 +240,10 @@
     *p = 0;
 
   // We do alias expansion here
-  xpline = expandalias(line);
+  if (scr_get_multimode() != 2)
+    xpline = expandalias(line);
+  else
+    xpline = line; // No expansion in verbatim multi-line mode
 
   // Command "quit"?
   if ((!strncasecmp(xpline, "/quit", 5)) && (scr_get_multimode() != 2) )
@@ -301,6 +282,39 @@
   return 0;
 }
 
+//  process_line(line)
+// Process a command/message line.
+// If this isn't a command, this is a message and it is sent to the
+// currently selected buddy.
+// Return 255 if the line is the /quit command, or 0.
+int process_line(char *line)
+{
+  if (!*line) { // User only pressed enter
+    if (scr_get_multimode()) {
+      scr_append_multiline("");
+      return 0;
+    }
+    if (current_buddy) {
+      scr_set_chatmode(TRUE);
+      buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, TRUE);
+      scr_ShowBuddyWindow();
+    }
+    return 0;
+  }
+
+  if (*line != '/') {
+    // This isn't a command
+    if (scr_get_multimode())
+      scr_append_multiline(line);
+    else
+      do_say(line);
+    return 0;
+  }
+
+  /* It is (probably) a command -- except for verbatim multi-line mode */
+  return process_command(line);
+}
+
 /* Commands callback functions */
 
 void do_roster(char *arg)
@@ -724,3 +738,29 @@
   }
 }
 
+void do_bind(char *arg)
+{
+  guint assign;
+  const gchar *keycode, *value;
+  
+  assign = parse_assigment(arg, &keycode, &value);
+  if (!keycode) {
+    scr_LogPrint("Huh?");
+    return;
+  }
+  if (!assign) {
+    // This is a query
+    value = settings_get(SETTINGS_TYPE_BINDING, keycode);
+    if (value) {
+      scr_LogPrint("Key %s is bound to: %s", keycode, value);
+    } else
+      scr_LogPrint("Key %s is not bound", keycode);
+    return;
+  }
+  // Update the key binding
+  if (!value)
+    settings_del(SETTINGS_TYPE_BINDING, keycode);
+  else
+    settings_set(SETTINGS_TYPE_BINDING, keycode, value);
+}
+
--- a/mcabber/src/commands.h	Fri Jul 08 07:31:24 2005 +0100
+++ b/mcabber/src/commands.h	Fri Jul 08 21:47:17 2005 +0100
@@ -14,6 +14,7 @@
 void cmd_init(void);
 cmd *cmd_get(const char *command);
 int  process_line(char *line);
+int  process_command(char *line);
 char *expandalias(char *line);
 
 #endif /* __COMMANDS_H__ */
--- a/mcabber/src/screen.c	Fri Jul 08 07:31:24 2005 +0100
+++ b/mcabber/src/screen.c	Fri Jul 08 21:47:17 2005 +0100
@@ -1608,9 +1608,19 @@
           scr_Resize();
           break;
       default:
-          scr_LogPrint("Unknown key=%d", key);
-          if (utf8_mode)
-            scr_LogPrint("WARNING: UTF-8 not yet supported!");
+          {
+            const gchar *boundcmd = isbound(key);
+            if (boundcmd) {
+              gchar *cmd = g_strdup_printf("/%s", boundcmd);
+              if (process_command(cmd))
+                return 255;
+              g_free(cmd);
+            } else {
+              scr_LogPrint("Unknown key=%d", key);
+              if (utf8_mode)
+                scr_LogPrint("WARNING: UTF-8 not yet supported!");
+            }
+          }
     }
   }
   if (completion_started && key != 9 && key != KEY_RESIZE)
--- a/mcabber/src/settings.c	Fri Jul 08 07:31:24 2005 +0100
+++ b/mcabber/src/settings.c	Fri Jul 08 21:47:17 2005 +0100
@@ -172,3 +172,11 @@
   return 0;
 }
 
+// Return the command the key is bound to, or NULL.
+const gchar *isbound(int key)
+{
+  gchar asciikey[16];
+  g_snprintf(asciikey, 15, "%d", key);
+  return settings_get(SETTINGS_TYPE_BINDING, asciikey);
+}
+
--- a/mcabber/src/settings.h	Fri Jul 08 07:31:24 2005 +0100
+++ b/mcabber/src/settings.h	Fri Jul 08 21:47:17 2005 +0100
@@ -17,5 +17,7 @@
 const gchar *settings_get(guint type, const gchar *key);
 int     settings_get_int(guint type, const gchar *key);
 
+const gchar *isbound(int key);
+
 #endif /* __SETTINGS_H__ */