From c2ea82642d6f948f8a8ad6a94483aabd795f64e5 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 1 Jan 2001 17:13:55 +0000 Subject: [PATCH] Some query changes. They should now work properly with /SAVEWINDOWS git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1043 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/core/queries.c | 11 +++++------ src/core/queries.h | 2 +- src/fe-common/core/fe-queries.c | 23 +++++++++++++++++++---- src/fe-common/core/window-save.c | 19 +++++++------------ src/fe-common/irc/dcc/fe-dcc.c | 3 ++- src/irc/core/irc-queries.c | 11 +++++------ src/irc/core/irc-queries.h | 2 +- 7 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/core/queries.c b/src/core/queries.c index 1912faeb..2468256d 100644 --- a/src/core/queries.c +++ b/src/core/queries.c @@ -28,17 +28,16 @@ GSList *queries; /* Create a new query */ -QUERY_REC *query_create(int chat_type, SERVER_REC *server, +QUERY_REC *query_create(int chat_type, const char *server_tag, const char *nick, int automatic) { QUERY_REC *query; - g_return_val_if_fail(server == NULL || IS_SERVER(server), NULL); g_return_val_if_fail(nick != NULL, NULL); query = NULL; signal_emit("query create", 5, &query, GINT_TO_POINTER(chat_type), - server, nick, GINT_TO_POINTER(automatic)); + server_tag, nick, GINT_TO_POINTER(automatic)); return query; } @@ -55,8 +54,8 @@ void query_init(QUERY_REC *query, int automatic) MODULE_DATA_INIT(query); query->type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY"); - if (query->server != NULL) - query->server_tag = g_strdup(query->server->tag); + if (query->server_tag != NULL) + query->server = server_find_tag(query->server_tag); signal_emit("query created", 2, query, GINT_TO_POINTER(automatic)); } @@ -76,9 +75,9 @@ void query_destroy(QUERY_REC *query) signal_emit("query destroyed", 1, query); MODULE_DATA_DEINIT(query); + g_free_not_null(query->server_tag); g_free_not_null(query->address); g_free(query->name); - g_free(query->server_tag); g_free(query); } diff --git a/src/core/queries.h b/src/core/queries.h index 070099c2..7e5372be 100644 --- a/src/core/queries.h +++ b/src/core/queries.h @@ -22,7 +22,7 @@ void query_init(QUERY_REC *query, int automatic); void query_destroy(QUERY_REC *query); /* Create a new query */ -QUERY_REC *query_create(int chat_type, SERVER_REC *server, +QUERY_REC *query_create(int chat_type, const char *server_tag, const char *nick, int automatic); /* Find query by name, if `server' is NULL, search from all servers */ diff --git a/src/fe-common/core/fe-queries.c b/src/fe-common/core/fe-queries.c index 146496ad..b9d559b8 100644 --- a/src/fe-common/core/fe-queries.c +++ b/src/fe-common/core/fe-queries.c @@ -45,8 +45,10 @@ QUERY_REC *privmsg_get_query(SERVER_REC *server, const char *nick, query = query_find(server, nick); if (query == NULL && (querycreate_level & level) != 0 && - (!own || settings_get_bool("autocreate_own_query"))) - query = query_create(server->chat_type, server, nick, TRUE); + (!own || settings_get_bool("autocreate_own_query"))) { + query = query_create(server->chat_type, server->tag, + nick, TRUE); + } return query; } @@ -105,6 +107,16 @@ static void signal_query_nick_changed(QUERY_REC *query, const char *oldnick) window_item_window((WI_ITEM_REC *) query), query); } +static void signal_window_item_server_changed(WINDOW_REC *window, + QUERY_REC *query) +{ + if (IS_QUERY(query)) { + g_free_and_null(query->server_tag); + if (query->server != NULL) + query->server_tag = g_strdup(query->server->tag); + } +} + static void signal_window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item) { QUERY_REC *query; @@ -127,7 +139,8 @@ static void sig_server_connected(SERVER_REC *server) QUERY_REC *rec = tmp->data; if (rec->server == NULL && - g_strcasecmp(rec->server_tag, server->tag) == 0) { + (rec->server_tag == NULL || + g_strcasecmp(rec->server_tag, server->tag) == 0)) { window_item_change_server((WI_ITEM_REC *) rec, server); server->queries = g_slist_append(server->queries, rec); } @@ -215,7 +228,7 @@ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) query = query_find(server, nick); if (query == NULL) - query_create(server->chat_type, server, nick, FALSE); + query_create(server->chat_type, server->tag, nick, FALSE); else { /* query already existed - set query active / move it to this window */ @@ -309,6 +322,7 @@ void fe_queries_init(void) signal_add("query destroyed", (SIGNAL_FUNC) signal_query_destroyed); signal_add("query server changed", (SIGNAL_FUNC) signal_query_server_changed); signal_add("query nick changed", (SIGNAL_FUNC) signal_query_nick_changed); + signal_add("window item server changed", (SIGNAL_FUNC) signal_window_item_server_changed); signal_add_last("window item destroy", (SIGNAL_FUNC) signal_window_item_destroy); signal_add("server connected", (SIGNAL_FUNC) sig_server_connected); signal_add("window changed", (SIGNAL_FUNC) sig_window_changed); @@ -330,6 +344,7 @@ void fe_queries_deinit(void) signal_remove("query destroyed", (SIGNAL_FUNC) signal_query_destroyed); signal_remove("query server changed", (SIGNAL_FUNC) signal_query_server_changed); signal_remove("query nick changed", (SIGNAL_FUNC) signal_query_nick_changed); + signal_remove("window item server changed", (SIGNAL_FUNC) signal_window_item_server_changed); signal_remove("window item destroy", (SIGNAL_FUNC) signal_window_item_destroy); signal_remove("server connected", (SIGNAL_FUNC) sig_server_connected); signal_remove("window changed", (SIGNAL_FUNC) sig_window_changed); diff --git a/src/fe-common/core/window-save.c b/src/fe-common/core/window-save.c index d9540c89..f36be916 100644 --- a/src/fe-common/core/window-save.c +++ b/src/fe-common/core/window-save.c @@ -50,19 +50,10 @@ static void sig_window_restore_item(WINDOW_REC *window, const char *type, window->waiting_channels = g_slist_append(window->waiting_channels, str); - } else if (g_strcasecmp(type, "QUERY") == 0) { + } else if (g_strcasecmp(type, "QUERY") == 0 && chat_type != NULL) { /* create query immediately */ - QUERY_REC *query; - SERVER_REC *server; - - if (chat_type == NULL) - return; - - server = tag == NULL ? NULL : server_find_tag(tag); - query = query_create(chat_protocol_lookup(chat_type), - server, name, TRUE); - if (server == NULL && tag != NULL) - query->server_tag = g_strdup(tag); + query_create(chat_protocol_lookup(chat_type), + tag, name, TRUE); } } @@ -136,6 +127,10 @@ static void window_save_items(WINDOW_REC *window, CONFIG_NODE *node) if (server != NULL) iconfig_node_set_str(subnode, "tag", server->tag); + else if (IS_QUERY(rec)) { + iconfig_node_set_str(subnode, "tag", + QUERY(rec)->server_tag); + } } } diff --git a/src/fe-common/irc/dcc/fe-dcc.c b/src/fe-common/irc/dcc/fe-dcc.c index 6d3eef73..ffe7f6ed 100644 --- a/src/fe-common/irc/dcc/fe-dcc.c +++ b/src/fe-common/irc/dcc/fe-dcc.c @@ -53,7 +53,8 @@ static void dcc_connected(DCC_REC *dcc) printformat(dcc->server, NULL, MSGLEVEL_DCC, IRCTXT_DCC_CHAT_CONNECTED, dcc->nick, dcc->addrstr, dcc->port); if (autocreate_dccquery && query_find(NULL, sender) == NULL) - irc_query_create(dcc->server, sender, TRUE); + irc_query_create(dcc->server == NULL ? NULL : + dcc->server->tag, sender, TRUE); g_free(sender); break; case DCC_TYPE_SEND: diff --git a/src/irc/core/irc-queries.c b/src/irc/core/irc-queries.c index 914b3308..2204f2c3 100644 --- a/src/irc/core/irc-queries.c +++ b/src/irc/core/irc-queries.c @@ -25,34 +25,33 @@ #include "irc.h" #include "irc-queries.h" -QUERY_REC *irc_query_create(IRC_SERVER_REC *server, +QUERY_REC *irc_query_create(const char *server_tag, const char *nick, int automatic) { QUERY_REC *rec; - g_return_val_if_fail(server == NULL || IS_IRC_SERVER(server), NULL); g_return_val_if_fail(nick != NULL, NULL); rec = g_new0(QUERY_REC, 1); rec->chat_type = IRC_PROTOCOL; rec->name = g_strdup(nick); - rec->server = (SERVER_REC *) server; + rec->server_tag = g_strdup(server_tag); query_init(rec, automatic); return rec; } static void sig_query_create(QUERY_REC **query, - void *chat_type, IRC_SERVER_REC *server, + void *chat_type, const char *server_tag, const char *nick, void *automatic) { if (chat_protocol_lookup("IRC") != GPOINTER_TO_INT(chat_type)) return; - g_return_if_fail(server == NULL || IS_IRC_SERVER(server)); g_return_if_fail(query != NULL); g_return_if_fail(nick != NULL); - *query = irc_query_create(server, nick, GPOINTER_TO_INT(automatic)); + *query = irc_query_create(server_tag, nick, + GPOINTER_TO_INT(automatic)); signal_stop(); } diff --git a/src/irc/core/irc-queries.h b/src/irc/core/irc-queries.h index ad3f0329..5e791b1f 100644 --- a/src/irc/core/irc-queries.h +++ b/src/irc/core/irc-queries.h @@ -18,7 +18,7 @@ void irc_queries_deinit(void); #define irc_query_find(server, name) \ query_find(SERVER(server), name) -QUERY_REC *irc_query_create(IRC_SERVER_REC *server, +QUERY_REC *irc_query_create(const char *server_tag, const char *nick, int automatic); #endif