From 8ea24002690314d567ddd1677ba18c25d19b8771 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 17 Jun 2000 12:22:56 +0000 Subject: [PATCH] Added /SET reuse_unused_windows setting, default is OFF If window_close_on_part is ON, we don't anymore close the window if we get kicked or connection gets lost. Also don't close DCC chat window if the other side disconnects. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@357 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/fe-common/core/window-items.c | 12 ++++++------ src/fe-common/irc/dcc/fe-dcc.c | 1 + src/fe-common/irc/fe-channels.c | 12 +++++++++++- src/fe-common/irc/fe-query.c | 12 +++++++++--- src/irc/core/query.h | 1 + src/irc/dcc/dcc-chat.c | 1 + src/irc/dcc/dcc.h | 1 + 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/fe-common/core/window-items.c b/src/fe-common/core/window-items.c index 790b7207..0c71a0e4 100644 --- a/src/fe-common/core/window-items.c +++ b/src/fe-common/core/window-items.c @@ -76,9 +76,6 @@ void window_remove_item(WINDOW_REC *window, WI_ITEM_REC *item) } signal_emit("window item remove", 2, window, item); - - if (settings_get_bool("window_close_on_part") && windows->next != NULL) - window_destroy(window); } WINDOW_REC *window_item_window(WI_ITEM_REC *item) @@ -237,19 +234,22 @@ void window_item_create(WI_ITEM_REC *item, int automatic) WINDOW_REC *window; GSList *tmp; char *str; - int clear_waiting; + int clear_waiting, reuse_unused_windows; g_return_if_fail(item != NULL); str = item->server == NULL ? NULL : g_strdup_printf("%s %s", ((SERVER_REC *) item->server)->tag, item->name); + reuse_unused_windows = settings_get_bool("reuse_unused_windows"); + clear_waiting = TRUE; window = NULL; for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; - if (rec->items == NULL && rec->level == 0 && + if (reuse_unused_windows && + rec->items == NULL && rec->level == 0 && (window == NULL || rec == active_win)) { /* no items in this window, we should probably use it.. */ window = rec; @@ -297,7 +297,7 @@ static void signal_window_item_changed(WINDOW_REC *window, WI_ITEM_REC *item) void window_items_init(void) { - settings_add_bool("lookandfeel", "window_close_on_part", TRUE); + settings_add_bool("lookandfeel", "reuse_unused_windows", FALSE); signal_add_last("window item changed", (SIGNAL_FUNC) signal_window_item_changed); } diff --git a/src/fe-common/irc/dcc/fe-dcc.c b/src/fe-common/irc/dcc/fe-dcc.c index 0bc08fb9..077fb5f7 100644 --- a/src/fe-common/irc/dcc/fe-dcc.c +++ b/src/fe-common/irc/dcc/fe-dcc.c @@ -264,6 +264,7 @@ static void sig_dcc_destroyed(DCC_REC *dcc) if (query != NULL) { /* DCC chat closed, close the query with it. */ + if (dcc->connection_lost) query->unwanted = TRUE; query_destroy(query); } } diff --git a/src/fe-common/irc/fe-channels.c b/src/fe-common/irc/fe-channels.c index b38db164..7cf4f5eb 100644 --- a/src/fe-common/irc/fe-channels.c +++ b/src/fe-common/irc/fe-channels.c @@ -25,6 +25,7 @@ #include "commands.h" #include "levels.h" #include "misc.h" +#include "settings.h" #include "irc.h" #include "channels.h" @@ -54,7 +55,14 @@ static void signal_channel_destroyed(CHANNEL_REC *channel) g_return_if_fail(channel != NULL); window = window_item_window((WI_ITEM_REC *) channel); - if (window != NULL) window_remove_item(window, (WI_ITEM_REC *) channel); + if (window != NULL) { + window_remove_item(window, (WI_ITEM_REC *) channel); + + if (windows->next != NULL && (!channel->joined || channel->left) && + settings_get_bool("window_close_on_part")) { + window_destroy(window); + } + } } static void signal_window_item_removed(WINDOW_REC *window, WI_ITEM_REC *item) @@ -235,6 +243,8 @@ static void cmd_channel_remove(const char *data) void fe_channels_init(void) { + settings_add_bool("lookandfeel", "window_close_on_part", TRUE); + signal_add("channel created", (SIGNAL_FUNC) signal_channel_created); signal_add("channel destroyed", (SIGNAL_FUNC) signal_channel_destroyed); signal_add("window item remove", (SIGNAL_FUNC) signal_window_item_removed); diff --git a/src/fe-common/irc/fe-query.c b/src/fe-common/irc/fe-query.c index d93ae114..c87f7998 100644 --- a/src/fe-common/irc/fe-query.c +++ b/src/fe-common/irc/fe-query.c @@ -68,7 +68,13 @@ static void signal_query_destroyed(QUERY_REC *query) g_return_if_fail(query != NULL); window = window_item_window((WI_ITEM_REC *) query); - if (window != NULL) window_remove_item(window, (WI_ITEM_REC *) query); + if (window != NULL) { + window_remove_item(window, (WI_ITEM_REC *) query); + + if (windows->next != NULL && !query->unwanted && + settings_get_bool("window_close_on_part")) + window_destroy(window); + } } static void signal_window_item_removed(WINDOW_REC *window, WI_ITEM_REC *item) @@ -78,7 +84,7 @@ static void signal_window_item_removed(WINDOW_REC *window, WI_ITEM_REC *item) g_return_if_fail(window != NULL); query = irc_item_query(item); - if (query != NULL) query_destroy(query); + if (query != NULL) query_destroy(query); } static void sig_server_connected(IRC_SERVER_REC *server) @@ -169,7 +175,7 @@ static int sig_query_autoclose(void) window = window_item_window((WI_ITEM_REC *) rec); if (window != active_win && rec->new_data == 0 && now-window->last_line > query_auto_close) - query_destroy(rec); + query_destroy(rec); } return 1; } diff --git a/src/irc/core/query.h b/src/irc/core/query.h index c46a831e..bac2ccc5 100644 --- a/src/irc/core/query.h +++ b/src/irc/core/query.h @@ -14,6 +14,7 @@ typedef struct { char *address; char *server_tag; + int unwanted:1; /* TRUE if the other side closed or some error occured (DCC chats!) */ int destroying:1; } QUERY_REC; diff --git a/src/irc/dcc/dcc-chat.c b/src/irc/dcc/dcc-chat.c index 642cbb7e..44968ce0 100644 --- a/src/irc/dcc/dcc-chat.c +++ b/src/irc/dcc/dcc-chat.c @@ -166,6 +166,7 @@ static void dcc_chat_input(DCC_REC *dcc) ret = line_split(tmpbuf, recvlen, &str, (LINEBUF_REC **) &dcc->databuf); if (ret == -1) { /* connection lost */ + dcc->connection_lost = TRUE; signal_emit("dcc closed", 1, dcc); dcc_destroy(dcc); break; diff --git a/src/irc/dcc/dcc.h b/src/irc/dcc/dcc.h index eee5a069..f05f294b 100644 --- a/src/irc/dcc/dcc.h +++ b/src/irc/dcc/dcc.h @@ -53,6 +53,7 @@ typedef struct DCC_REC { int gotalldata:1; /* DCC fast send: got all acks from the other end (needed to make sure the end of transfer works right) */ int mirc_ctcp:1; /* DCC chat: Send CTCPs without the CTCP_MESSAGE prefix */ + int connection_lost:1; /* DCC chat: other side closed connection */ int destroyed:1; /* We're about to destroy this DCC recond */ /* read/write counter buffer */