Try to choose better the window where we print when matching by level and

multiple windows have a match. Should fix problems with query windows with a
default msgs window + /SET window_check_level_first ON.


git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3002 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Timo Sirainen 2002-11-15 09:04:47 +00:00 committed by cras
commit 0368fa6b5b

View file

@ -268,46 +268,66 @@ const char *window_get_active_name(WINDOW_REC *window)
WINDOW_REC *window_find_level(void *server, int level) WINDOW_REC *window_find_level(void *server, int level)
{ {
GSList *tmp; GSList *tmp;
WINDOW_REC *match;
/* prefer active window if possible */ match = NULL;
if (active_win != NULL &&
WINDOW_LEVEL_MATCH(active_win, server, level))
return active_win;
for (tmp = windows; tmp != NULL; tmp = tmp->next) { for (tmp = windows; tmp != NULL; tmp = tmp->next) {
WINDOW_REC *rec = tmp->data; WINDOW_REC *rec = tmp->data;
if (WINDOW_LEVEL_MATCH(rec, server, level)) if (WINDOW_LEVEL_MATCH(rec, server, level)) {
return rec; /* prefer windows without any items */
if (rec->items == NULL)
return rec;
if (match == NULL)
match = rec;
else if (active_win == rec) {
/* prefer active window over others */
match = rec;
}
}
} }
return NULL; return match;
} }
WINDOW_REC *window_find_closest(void *server, const char *name, int level) WINDOW_REC *window_find_closest(void *server, const char *name, int level)
{ {
WINDOW_REC *window,*namewindow=NULL; WINDOW_REC *window,*namewindow=NULL;
WI_ITEM_REC *item; WI_ITEM_REC *item;
int i;
/* match by name */ /* match by name */
item = name == NULL ? NULL : item = name == NULL ? NULL :
window_item_find(server, name); window_item_find(server, name);
if (item != NULL) { if (item != NULL) {
namewindow = window_item_window(item); namewindow = window_item_window(item);
if (namewindow != NULL && ((namewindow->level & level) != 0 || if (namewindow != NULL &&
!settings_get_bool("window_check_level_first"))) ((namewindow->level & level) != 0 ||
return namewindow; !settings_get_bool("window_check_level_first"))) {
/* match, but if multiple windows have the same level
we could be choosing a bad one here, eg.
name=nick1 would get nick2's query instead of
generic msgs window. */
if (g_strcasecmp(name, item->visible_name) == 0)
return namewindow;
}
} }
/* match by level */ /* prefer windows without items */
if (level != MSGLEVEL_HILIGHT) for (i = 0; i < 2; i++) {
level &= ~(MSGLEVEL_HILIGHT | MSGLEVEL_NOHILIGHT); /* match by level */
window = window_find_level(server, level); if (level != MSGLEVEL_HILIGHT)
if (window != NULL) return window; level &= ~(MSGLEVEL_HILIGHT | MSGLEVEL_NOHILIGHT);
window = window_find_level(server, level);
if (window != NULL && (i == 1 || window->items == NULL))
return window;
/* match by level - ignore server */ /* match by level - ignore server */
window = window_find_level(NULL, level); window = window_find_level(NULL, level);
if (window != NULL) return window; if (window != NULL && (i == 1 || window->items == NULL))
return window;
}
/* still return item's window if we didnt find anything */ /* still return item's window if we didnt find anything */
if (namewindow != NULL) return namewindow; if (namewindow != NULL) return namewindow;