changeset 1359:7daf906fbcdc

The command /quit can be used in bindings, hooks and sourced files (It used to work in bindings only)
author Mikael Berthe <mikael@lilotux.net>
date Sun, 11 Nov 2007 13:05:57 +0100
parents 005df14df743
children 8613d3f4ae91
files mcabber/src/commands.c mcabber/src/commands.h mcabber/src/hooks.c mcabber/src/jab_priv.h mcabber/src/main.c mcabber/src/screen.c mcabber/src/screen.h mcabber/src/settings.c
diffstat 8 files changed, 36 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/commands.c	Sun Nov 11 13:05:57 2007 +0100
@@ -386,6 +386,12 @@
       g_free(xpline);
       return 255;
     }
+  } else if (iscmd && !strncasecmp(xpline, "quit", 4) &&
+             (!xpline[4] || xpline[4] == ' ')) {
+    // If iscmd is true we can have the command without the command prefix
+    // character (usually '/').
+    g_free(xpline);
+    return 255;
   }
 
   // If verbatim multi-line mode, we check if another /msay command is typed
--- a/mcabber/src/commands.h	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/commands.h	Sun Nov 11 13:05:57 2007 +0100
@@ -19,6 +19,7 @@
 
 extern char *mcabber_version(void);
 extern void mcabber_connect(void);
+extern void mcabber_set_terminate_ui(void);
 
 void room_whois(gpointer bud, char *nick_locale, guint interactive);
 void room_leave(gpointer bud, char *arg);
--- a/mcabber/src/hooks.c	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/hooks.c	Sun Nov 11 13:05:57 2007 +0100
@@ -349,7 +349,8 @@
   scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
 
   cmdline = from_utf8(hook_command);
-  process_command(cmdline, TRUE); // XXX Note: /quit won't work.
+  if (process_command(cmdline, TRUE) == 255)
+    mcabber_set_terminate_ui();
 
   g_free(cmdline);
   g_free(buf);
--- a/mcabber/src/jab_priv.h	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/jab_priv.h	Sun Nov 11 13:05:57 2007 +0100
@@ -34,7 +34,6 @@
 extern enum enum_jstate jstate;
 extern xmlnode bookmarks, rosternotes;
 
-extern char *mcabber_version(void);
 const char *entity_version(void);
 
 extern time_t iqlast;           /* last message/status change time */
--- a/mcabber/src/main.c	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/main.c	Sun Nov 11 13:05:57 2007 +0100
@@ -51,6 +51,8 @@
 # define WAIT_ANY -1
 #endif
 
+static unsigned int terminate_ui;
+
 static struct termios *backup_termios;
 
 char *mcabber_version(void)
@@ -336,6 +338,11 @@
 #endif /* HAVE_GPGME */
 }
 
+void mcabber_set_terminate_ui(void)
+{
+  terminate_ui = TRUE;
+}
+
 int main(int argc, char **argv)
 {
   char *configFile = NULL;
@@ -472,12 +479,12 @@
 
   scr_LogPrint(LPRINT_DEBUG, "Entering into main loop...");
 
-  for (ret = 0 ; ret != 255 ; ) {
+  while (!terminate_ui) {
     scr_DoUpdate();
     scr_Getch(&kcode);
 
     if (kcode.value != ERR) {
-      ret = process_key(kcode);
+      process_key(kcode);
     } else {
       scr_CheckAutoAway(FALSE);
 
--- a/mcabber/src/screen.c	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/screen.c	Sun Nov 11 13:05:57 2007 +0100
@@ -3697,7 +3697,7 @@
 
 //  process_key(key)
 // Handle the pressed key, in the command line (bottom).
-int process_key(keycode kcode)
+void process_key(keycode kcode)
 {
   int key = kcode.value;
   int display_char = FALSE;
@@ -3712,8 +3712,10 @@
         break;
     case MKEY_META:
     default:
-        if (bindcommand(kcode) == 255)
-          return 255;
+        if (bindcommand(kcode) == 255) {
+          mcabber_set_terminate_ui();
+          return;
+        }
         key = ERR; // Do not process any further
   }
 
@@ -3731,8 +3733,10 @@
         readline_do_completion();
         break;
     case 13:    // Enter
-        if (readline_accept_line(FALSE) == 255)
-          return 255;
+        if (readline_accept_line(FALSE) == 255) {
+          mcabber_set_terminate_ui();
+          return;
+        }
         break;
     case 3:     // Ctrl-C
         scr_handle_CtrlC();
@@ -3751,7 +3755,7 @@
 
       // Check the line isn't too long
       if (strlen(inputLine) + 4 > INPUTLINE_LENGTH)
-        return 0;
+        return;
 
       // Insert char
       strcpy(tmpLine, ptr_inputline);
@@ -3760,8 +3764,10 @@
       check_offset(1);
     } else {
       // Look for a key binding.
-      if (!kcode.utf8 && (bindcommand(kcode) == 255))
-        return 255;
+      if (!kcode.utf8 && (bindcommand(kcode) == 255)) {
+          mcabber_set_terminate_ui();
+          return;
+        }
     }
   }
 
@@ -3779,7 +3785,7 @@
     if (chatstate)
       time(&chatstate_timestamp);
   }
-  return 0;
+  return;
 }
 
 #ifdef HAVE_ASPELL_H
--- a/mcabber/src/screen.h	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/screen.h	Sun Nov 11 13:05:57 2007 +0100
@@ -102,7 +102,7 @@
 void scr_init_bindings(void);
 
 void scr_Getch(keycode *kcode);
-int process_key(keycode kcode);
+void process_key(keycode kcode);
 
 void scr_InitLocaleCharSet(void);
 void scr_InitCurses(void);
--- a/mcabber/src/settings.c	Sun Nov 11 12:22:41 2007 +0100
+++ b/mcabber/src/settings.c	Sun Nov 11 13:05:57 2007 +0100
@@ -198,7 +198,8 @@
       // Set the leading COMMAND_CHAR to build a command line
       // and process the command
       *(--line) = COMMAND_CHAR;
-      process_command(line, TRUE);
+      if (process_command(line, TRUE) == 255)
+        mcabber_set_terminate_ui();
     } else {
       scr_LogPrint(LPRINT_LOGNORM, "Error in configuration file (l. %d): "
                    "this is not an assignment", ln);