Merges bugfixes from trunk.
authorPekka Riikonen <priikone@silcnet.org>
Sat, 13 Apr 2002 06:18:39 +0000 (06:18 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sat, 13 Apr 2002 06:18:39 +0000 (06:18 +0000)
apps/irssi/src/fe-common/core/fe-exec.c
apps/irssi/src/fe-common/core/fe-exec.h
apps/irssi/src/fe-common/core/fe-windows.c

index 809726341d4fc99983cc223601b7f25de0b1c463..033e6be616499ef016b5cfa52815aae7058f1990 100644 (file)
@@ -28,6 +28,9 @@
 #include "misc.h"
 #include "levels.h"
 
+#include "channels.h"
+#include "queries.h"
+
 #include "printtext.h"
 #include "fe-exec.h"
 #include "fe-windows.h"
@@ -370,7 +373,7 @@ static void handle_exec(const char *args, GHashTable *optlist,
 {
        PROCESS_REC *rec;
         char *target, *level;
-       int notice, signum, interactive;
+       int notice, signum, interactive, target_nick, target_channel;
 
        /* check that there's no unknown options. we allowed them
           because signals can be used as options, but there should be
@@ -403,11 +406,14 @@ static void handle_exec(const char *args, GHashTable *optlist,
                return;
 
         /* common options */
+       target_channel = target_nick = FALSE;
        if (g_hash_table_lookup(optlist, "out") != NULL) {
                 /* redirect output to active channel/query */
                if (item == NULL)
                        cmd_return_error(CMDERR_NOT_JOINED);
-                target = item->name;
+               target = item->name;
+               target_channel = IS_CHANNEL(item);
+               target_nick = IS_QUERY(item);
        } else if (g_hash_table_lookup(optlist, "msg") != NULL) {
                 /* redirect output to /msg <nick> */
                target = g_hash_table_lookup(optlist, "msg");
@@ -487,6 +493,8 @@ static void handle_exec(const char *args, GHashTable *optlist,
         rec->id = process_get_new_id();
        rec->target = g_strdup(target);
        rec->target_win = active_win;
+       rec->target_channel = target_channel;
+       rec->target_nick = target_nick;
         rec->args = g_strdup(args);
        rec->notice = notice;
         rec->silent = g_hash_table_lookup(optlist, "-") != NULL;
@@ -572,7 +580,9 @@ static void sig_exec_input(PROCESS_REC *rec, const char *text)
                server = item != NULL ? item->server :
                        active_win->active_server;
 
-                str = g_strconcat(rec->target, " ", text, NULL);
+               str = g_strconcat(rec->target_nick ? "-nick " :
+                                 rec->target_channel ? "-channel " : "",
+                                 rec->target, " ", text, NULL);
                signal_emit(rec->notice ? "command notice" : "command msg",
                            3, str, server, item);
                 g_free(str);
index bebd1f82cf6384c0835797a391dad11487e1025a..a3b7edee1defb5a5fc61abacb0d8a01e887a0b18 100644 (file)
@@ -38,6 +38,8 @@ struct PROCESS_REC {
        unsigned int shell:1; /* start the program via /bin/sh */
        unsigned int notice:1; /* send text with /notice, not /msg if target is set */
        unsigned int silent:1; /* don't print "process exited with level xx" */
+       unsigned int target_channel:1; /* target is a channel */
+       unsigned int target_nick:1; /* target is a nick */
 };
 
 extern GSList *processes;
index 38dd22fec2a174904f59febf8a20b7dafefc2eb1..2370facb239552247a1f1c926c627935141bc0ea 100644 (file)
@@ -160,6 +160,9 @@ void window_set_active(WINDOW_REC *window)
 
 void window_change_server(WINDOW_REC *window, void *server)
 {
+        if (server != NULL && SERVER(server)->disconnected)
+                return;
+
        window->active_server = server;
        signal_emit("window server changed", 2, window, server);
 }