void window_destroy(WINDOW_REC *window) { g_return_if_fail(window != NULL); if (window->destroying) return; 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); } while (window->items != NULL) window_item_destroy(window->items->data); if (settings_get_bool("windows_auto_renumber")) windows_pack(window->refnum); signal_emit("window destroyed", 1, window); while (window->bound_items != NULL) window_bind_destroy(window, window->bound_items->data); g_free_not_null(window->hilight_color); g_free_not_null(window->servertag); g_free_not_null(window->theme_name); g_free_not_null(window->name); g_free(window); }
void window_bind_remove_unsticky(WINDOW_REC *window) { GSList *tmp, *next; for (tmp = window->bound_items; tmp != NULL; tmp = next) { WINDOW_BIND_REC *rec = tmp->data; next = tmp->next; if (!rec->sticky) window_bind_destroy(window, rec); } }
void windows_layout_reset(void) { GSList *tmp; for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *window = tmp->data; while (window->bound_items != NULL) window_bind_destroy(window, window->bound_items->data); } iconfig_set_str(NULL, "windows", NULL); signal_emit("layout reset", 0); printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_WINDOWS_LAYOUT_RESET); }
static void window_save(WINDOW_REC *window, CONFIG_NODE *node) { char refnum[MAX_INT_STRLEN]; ltoa(refnum, window->refnum); node = iconfig_node_section(node, refnum, NODE_TYPE_BLOCK); if (window->sticky_refnum) iconfig_node_set_bool(node, "sticky_refnum", TRUE); if (window->immortal) iconfig_node_set_bool(node, "immortal", TRUE); if (window->name != NULL) iconfig_node_set_str(node, "name", window->name); if (window->history_name != NULL) iconfig_node_set_str(node, "history_name", window->history_name); if (window->servertag != NULL) iconfig_node_set_str(node, "servertag", window->servertag); if (window->level != 0) { char *level = bits2level(window->level); iconfig_node_set_str(node, "level", level); g_free(level); } if (window->theme_name != NULL) iconfig_node_set_str(node, "theme", window->theme_name); while (window->bound_items != NULL) window_bind_destroy(window, window->bound_items->data); if (window->items != NULL) window_save_items(window, node); signal_emit("layout save window", 2, window, node); }
void window_item_create(WI_ITEM_REC *item, int automatic) { WINDOW_REC *window; WINDOW_BIND_REC *bind; GSList *tmp, *sorted; int clear_waiting, reuse_unused_windows; g_return_if_fail(item != NULL); reuse_unused_windows = settings_get_bool("reuse_unused_windows"); clear_waiting = TRUE; window = NULL; sorted = windows_get_sorted(); for (tmp = sorted; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; /* is item bound to this window? */ if (item->server != NULL) { bind = window_bind_find(rec, item->server->tag, item->visible_name); if (bind != NULL) { if (!bind->sticky) window_bind_destroy(rec, bind); window = rec; clear_waiting = FALSE; break; } } /* use this window IF: - reuse_unused_windows is ON - window has no existing items - window has no name - window has no sticky binds (/LAYOUT SAVEd) - we already haven't found "good enough" window, except if - this is the active window - old window had some temporary bounds and this one doesn't */ if (reuse_unused_windows && rec->items == NULL && rec->name == NULL && !window_bind_has_sticky(rec) && (window == NULL || rec == active_win || window->bound_items != NULL)) window = rec; } g_slist_free(sorted); if (window == NULL && !settings_get_bool("autocreate_windows")) { /* never create new windows automatically */ window = active_win; } if (window == NULL) { /* create new window to use */ if (settings_get_bool("autocreate_split_windows")) { signal_emit("gui window create override", 1, GINT_TO_POINTER(0)); } window = window_create(item, automatic); } else { /* use existing window */ window_item_add(window, item, automatic); } if (clear_waiting) window_bind_remove_unsticky(window); }