diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c index 91153814..6d894b9a 100644 --- a/src/fe-common/core/fe-windows.c +++ b/src/fe-common/core/fe-windows.c @@ -161,11 +161,30 @@ void window_set_active(WINDOW_REC *window) void window_change_server(WINDOW_REC *window, void *server) { + SERVER_REC *active, *connect; + if (server != NULL && SERVER(server)->disconnected) return; - window->active_server = server; - signal_emit("window server changed", 2, window, server); + if (server == NULL) { + active = connect = NULL; + } else if (SERVER(server)->connected) { + active = server; + connect = NULL; + } else { + active = NULL; + connect = server; + } + + if (window->connect_server != connect) { + window->connect_server = connect; + signal_emit("window connect changed", 2, window, connect); + } + + if (window->active_server != active) { + window->active_server = active; + signal_emit("window server changed", 2, window, active); + } } void window_set_refnum(WINDOW_REC *window, int refnum) @@ -519,7 +538,8 @@ static void sig_server_disconnected(SERVER_REC *server) for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; - if (rec->active_server == server) { + if (rec->active_server == server || + rec->connect_server == server) { window_change_server(rec, rec->servertag != NULL ? NULL : new_server); } @@ -609,6 +629,7 @@ void windows_init(void) settings_add_str("lookandfeel", "window_default_level", "NONE"); read_settings(); + signal_add("server looking", (SIGNAL_FUNC) sig_server_connected); signal_add("server connected", (SIGNAL_FUNC) sig_server_connected); signal_add("server disconnected", (SIGNAL_FUNC) sig_server_disconnected); signal_add("server connect failed", (SIGNAL_FUNC) sig_server_disconnected); @@ -620,6 +641,7 @@ void windows_deinit(void) if (daytag != -1) g_source_remove(daytag); if (daycheck == 1) signal_remove("print text", (SIGNAL_FUNC) sig_print_text); + signal_remove("server looking", (SIGNAL_FUNC) sig_server_connected); signal_remove("server connected", (SIGNAL_FUNC) sig_server_connected); signal_remove("server disconnected", (SIGNAL_FUNC) sig_server_disconnected); signal_remove("server connect failed", (SIGNAL_FUNC) sig_server_disconnected); diff --git a/src/fe-common/core/fe-windows.h b/src/fe-common/core/fe-windows.h index 64aaddd4..58c316ef 100644 --- a/src/fe-common/core/fe-windows.h +++ b/src/fe-common/core/fe-windows.h @@ -26,6 +26,7 @@ struct _WINDOW_REC { GSList *items; WI_ITEM_REC *active; SERVER_REC *active_server; + SERVER_REC *connect_server; char *servertag; /* active_server must be either NULL or have this tag (unless there's items in this window) */ int level; /* message level */ diff --git a/src/fe-common/core/window-commands.c b/src/fe-common/core/window-commands.c index 26ec2286..43629423 100644 --- a/src/fe-common/core/window-commands.c +++ b/src/fe-common/core/window-commands.c @@ -393,6 +393,8 @@ static void cmd_window_server(const char *data) if (*tag == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); server = server_find_tag(tag); + if (server == NULL) + server = server_find_lookup_tag(tag); if (g_hash_table_lookup(optlist, "unsticky") != NULL && active_win->servertag != NULL) { diff --git a/src/fe-common/irc/fe-irc-server.c b/src/fe-common/irc/fe-irc-server.c index 44563000..a3253cec 100644 --- a/src/fe-common/irc/fe-irc-server.c +++ b/src/fe-common/irc/fe-irc-server.c @@ -119,9 +119,22 @@ static void cmd_server_list(const char *data) g_string_free(str, TRUE); } +static void server_command(const char *data, SERVER_REC *server, + WI_ITEM_REC *item) +{ + if (server == NULL) { + /* this command accepts non-connected server too */ + server = active_win->connect_server; + } + + signal_continue(3, data, server, item); +} + void fe_irc_server_init(void) { signal_add("server add fill", (SIGNAL_FUNC) sig_server_add_fill); + command_bind_first("server", NULL, (SIGNAL_FUNC) server_command); + command_bind_first("disconnect", NULL, (SIGNAL_FUNC) server_command); command_bind("server list", NULL, (SIGNAL_FUNC) cmd_server_list); command_set_options("server add", "-ircnet -cmdspeed -cmdmax -querychans"); @@ -130,5 +143,7 @@ void fe_irc_server_init(void) void fe_irc_server_deinit(void) { signal_remove("server add fill", (SIGNAL_FUNC) sig_server_add_fill); + command_unbind("server", (SIGNAL_FUNC) server_command); + command_unbind("disconnect", (SIGNAL_FUNC) server_command); command_unbind("server list", (SIGNAL_FUNC) cmd_server_list); } diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 2e93f649..1cabfac7 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -483,43 +483,98 @@ static void key_active_window(void) signal_emit("command window goto", 3, "active", active_win->active_server, active_win->active); } +static SERVER_REC *get_prev_server(SERVER_REC *current) +{ + int pos; + + if (current == NULL) { + return servers != NULL ? g_slist_last(servers)->data : + lookup_servers != NULL ? + g_slist_last(lookup_servers)->data : NULL; + } + + /* connect2 -> connect1 -> server2 -> server1 -> connect2 -> .. */ + + pos = g_slist_index(servers, current); + if (pos != -1) { + if (pos > 0) + return g_slist_nth(servers, pos-1)->data; + if (lookup_servers != NULL) + return g_slist_last(lookup_servers)->data; + return g_slist_last(servers)->data; + } + + pos = g_slist_index(lookup_servers, current); + g_assert(pos >= 0); + + if (pos > 0) + return g_slist_nth(lookup_servers, pos-1)->data; + if (servers != NULL) + return g_slist_last(servers)->data; + return g_slist_last(lookup_servers)->data; +} + +static SERVER_REC *get_next_server(SERVER_REC *current) +{ + GSList *pos; + + if (current == NULL) { + return servers != NULL ? servers->data : + lookup_servers != NULL ? lookup_servers->data : NULL; + } + + /* server1 -> server2 -> connect1 -> connect2 -> server1 -> .. */ + + pos = g_slist_find(servers, current); + if (pos != NULL) { + if (pos->next != NULL) + return pos->next->data; + if (lookup_servers != NULL) + return lookup_servers->data; + return servers->data; + } + + pos = g_slist_find(lookup_servers, current); + g_assert(pos != NULL); + + if (pos->next != NULL) + return pos->next->data; + if (servers != NULL) + return servers->data; + return lookup_servers->data; +} + static void key_previous_window_item(void) { SERVER_REC *server; - GSList *pos; - if (active_win->items != NULL) - signal_emit("command window item prev", 3, "", active_win->active_server, active_win->active); - else if (servers != NULL) { + if (active_win->items != NULL) { + signal_emit("command window item prev", 3, "", + active_win->active_server, active_win->active); + } else if (servers != NULL || lookup_servers != NULL) { /* change server */ - if (active_win->active_server == NULL) - server = servers->data; - else { - pos = g_slist_find(servers, active_win->active_server); - server = pos->next != NULL ? pos->next->data : servers->data; - } - signal_emit("command window server", 3, server->tag, active_win->active_server, active_win->active); + server = active_win->active_server; + if (server == NULL) + server = active_win->connect_server; + server = get_prev_server(server); + signal_emit("command window server", 3, server->tag, + active_win->active_server, active_win->active); } } static void key_next_window_item(void) { SERVER_REC *server; - int index; if (active_win->items != NULL) { signal_emit("command window item next", 3, "", active_win->active_server, active_win->active); - } - else if (servers != NULL) { + } else if (servers != NULL || lookup_servers != NULL) { /* change server */ - if (active_win->active_server == NULL) - server = servers->data; - else { - index = g_slist_index(servers, active_win->active_server); - server = index > 0 ? g_slist_nth(servers, index-1)->data : - g_slist_last(servers)->data; - } + server = active_win->active_server; + if (server == NULL) + server = active_win->connect_server; + server = get_next_server(server); signal_emit("command window server", 3, server->tag, active_win->active_server, active_win->active); }