window->destroying = TRUE;
windows = g_slist_remove(windows, window);
- if (active_win == window && windows != NULL) {
- active_win = NULL; /* it's corrupted */
- window_set_active(windows->data);
+ if (active_win == window) {
+ active_win = NULL; /* it's corrupted */
+ if (windows != NULL)
+ window_set_active(windows->data);
}
while (window->items != NULL)
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);
}
void window_set_name(WINDOW_REC *window, const char *name)
{
g_free_not_null(window->name);
- window->name = g_strdup(name);
+ window->name = name == NULL || *name == '\0' ? NULL : g_strdup(name);
signal_emit("window name changed", 1, window);
}
return window->name;
}
+#define WINDOW_LEVEL_MATCH(window, server, level) \
+ (((window)->level & level) && \
+ (server == NULL || (window)->active_server == server))
+
WINDOW_REC *window_find_level(void *server, int level)
{
- WINDOW_REC *match;
GSList *tmp;
- match = NULL;
+ /* prefer active window if possible */
+ if (active_win != NULL &&
+ WINDOW_LEVEL_MATCH(active_win, server, level))
+ return active_win;
+
for (tmp = windows; tmp != NULL; tmp = tmp->next) {
WINDOW_REC *rec = tmp->data;
- if ((server == NULL || rec->active_server == server) &&
- (rec->level & level)) {
- if (server == NULL || rec->active_server == server)
- return rec;
- match = rec;
- }
+ if (WINDOW_LEVEL_MATCH(rec, server, level))
+ return rec;
}
- return match;
+ return NULL;
}
WINDOW_REC *window_find_closest(void *server, const char *name, int level)
item = server == NULL ? NULL :
window_item_find(server, name);
- if (item == NULL && server == NULL) {
+ if (item == NULL) {
/* not found from the active server - any server? */
item = window_item_find(NULL, name);
}
- if (item == NULL) {
- char *chan;
-
- /* still nothing? maybe user just left the # in front of
- channel, try again with it.. */
- chan = g_strdup_printf("#%s", name);
- item = server == NULL ? NULL :
- window_item_find(server, chan);
- if (item == NULL) item = window_item_find(NULL, chan);
- g_free(chan);
- }
-
if (item == NULL)
return 0;