void window_destroy(WINDOW_REC *window) { int refnum; g_return_if_fail(window != NULL); if (window->destroying) return; window->destroying = TRUE; while (window->items != NULL) window_remove_item(window, window->items->data); windows = g_slist_remove(windows, window); signal_emit("window destroyed", 1, window); g_slist_foreach(window->waiting_channels, (GFunc) g_free, NULL); g_slist_free(window->waiting_channels); refnum = window->refnum; g_free_not_null(window->name); g_free(window); if (active_win == window && windows != NULL) { active_win = NULL; /* it's corrupted */ window_set_active(windows->data); } windows_pack(refnum); }
static void cmd_join(const char *data, SERVER_REC *server) { WINDOW_REC *window; CHANNEL_REC *channel; GHashTable *optlist; char *channelname; void *free_arg; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "join", &optlist, &channelname)) return; /* -<server tag> */ server = cmd_options_get_server("join", optlist, server); channel = channel_find(server, channelname); if (channel != NULL) { /* already joined to channel, set it active */ window = window_item_window(channel); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *) channel); } cmd_params_free(free_arg); }
/* SYNTAX: WINDOW HIDE [<number>|<name>] */ static void cmd_window_hide(const char *data) { WINDOW_REC *window; if (mainwindows->next == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_CANT_HIDE_LAST); return; } if (*data == '\0') window = active_win; else if (is_numeric(data, 0)) window = window_find_refnum(atoi(data)); else window = window_find_item(active_win, data); if (window == NULL) return; if (!is_window_visible(window)) return; mainwindow_destroy(WINDOW_GUI(window)->parent); if (active_mainwin == NULL) { active_mainwin = WINDOW_GUI(active_win)->parent; window_set_active(active_mainwin->active); } }
static void cmd_query(gchar *data, IRC_SERVER_REC *server, WI_IRC_REC *item) { WINDOW_REC *window; QUERY_REC *query; g_return_if_fail(data != NULL); if (*data == '\0') { /* remove current query */ cmd_unquery("", server, item); return; } if (*data != '=' && (server == NULL || !server->connected)) cmd_return_error(CMDERR_NOT_CONNECTED); query = query_find(server, data); if (query != NULL) { /* query already existed - change to query window */ window = window_item_window((WI_ITEM_REC *) query); g_return_if_fail(window != NULL); window_set_active(window); window_item_set_active(window, (WI_ITEM_REC *) query); return; } query_create(server, data, FALSE); }
void window_add_item(WINDOW_REC *window, WI_ITEM_REC *item, int automatic) { g_return_if_fail(window != NULL); g_return_if_fail(item != NULL); MODULE_DATA_SET(item, window); if (window->items == NULL) { window->active = item; window->active_server = item->server; } signal_emit("gui window item init", 1, item); if (!automatic || settings_get_bool("window_auto_change")) { if (automatic) signal_emit("window changed automatic", 1, window); window_set_active(window); } window->items = g_slist_append(window->items, item); signal_emit("window item new", 2, window, item); if (!automatic || g_slist_length(window->items) == 1) { window->active = NULL; window_item_set_active(window, item); } }
void gui_frame_set_active(Frame *frame) { active_frame = frame; if (frame != NULL && frame->active_tab != NULL && frame->active_tab->active_win != NULL) window_set_active(frame->active_tab->active_win); }
/* SYNTAX: WINDOW GOTO active|<number>|<name> */ static void cmd_window_goto(const char *data) { WINDOW_REC *window; char *target; void *free_arg; g_return_if_fail(data != NULL); if (is_numeric(data, 0)) { cmd_window_refnum(data); return; } if (!cmd_get_params(data, &free_arg, 1, &target)) return; if (g_ascii_strcasecmp(target, "active") == 0) window = window_highest_activity(active_win); else { window = window_find_name(target); if (window == NULL && active_win->active_server != NULL) window = window_find_item_cycle(active_win->active_server, target); if (window == NULL) window = window_find_item_cycle(NULL, target); } if (window != NULL) window_set_active(window); cmd_params_free(free_arg); }
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); }
static void window_item_add_signal(WINDOW_REC *window, WI_ITEM_REC *item, int automatic, int send_signal) { g_return_if_fail(window != NULL); g_return_if_fail(item != NULL); g_return_if_fail(item->window == NULL); item->window = window; if (window->items == NULL) { window->active = item; window->active_server = item->server; } if (!automatic || settings_get_bool("window_auto_change")) { if (automatic) signal_emit("window changed automatic", 1, window); window_set_active(window); } window->items = g_slist_append(window->items, item); if (send_signal) signal_emit("window item new", 2, window, item); if (g_slist_length(window->items) == 1 || (!automatic && settings_get_bool("autofocus_new_items"))) { window->active = NULL; window_item_set_active(window, item); } }
/* SYNTAX: WINDOW LEFT */ static void cmd_window_left(const char *data, SERVER_REC *server, void *item) { int refnum; refnum = window_refnum_left(active_win->refnum, TRUE); if (refnum != -1) window_set_active(window_find_refnum(refnum)); }
/* SYNTAX: WINDOW DOWN */ static void cmd_window_down(void) { MAIN_WINDOW_REC *rec; rec = mainwindows_find_lower(active_mainwin->last_line); if (rec != NULL) window_set_active(rec->active); }
/* SYNTAX: WINDOW UP */ static void cmd_window_up(void) { MAIN_WINDOW_REC *rec; rec = mainwindows_find_upper(active_mainwin->first_line); if (rec != NULL) window_set_active(rec->active); }
/* SYNTAX: WINDOW RIGHT */ static void cmd_window_right(void) { int refnum; refnum = window_refnum_right(active_win->refnum, TRUE); if (refnum != -1) window_set_active(window_find_refnum(refnum)); }
static gboolean event_focus(GtkWidget *widget, GdkEventFocus *event, Frame *frame) { gui_frame_set_active(frame); if (frame->active_tab != NULL && frame->active_tab->active_win != NULL) window_set_active(frame->active_tab->active_win); return FALSE; }
/* SYNTAX: WINDOW PREVIOUS */ static void cmd_window_previous(void) { int num; num = window_refnum_prev(active_win->refnum, TRUE); if (num < 1) num = window_refnum_next(0, TRUE); window_set_active(window_find_refnum(num)); }
/* SYNTAX: WINDOW NEXT */ static void cmd_window_next(void) { int num; num = window_refnum_next(active_win->refnum, TRUE); if (num < 1) num = windows_refnum_last(); window_set_active(window_find_refnum(num)); }
/* SYNTAX: JOIN [-window] [-invite] [-<server tag>] <channels> [<keys>] */ static void cmd_join(const char *data, SERVER_REC *server) { WINDOW_REC *window; CHANNEL_REC *channel; GHashTable *optlist; char *pdata; int invite; int samewindow; void *free_arg; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST | PARAM_FLAG_STRIP_TRAILING_WS, "join", &optlist, &pdata)) return; invite = g_hash_table_lookup(optlist, "invite") != NULL; samewindow = g_hash_table_lookup(optlist, "window") != NULL; if (!invite && *pdata == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); /* -<server tag> */ server = cmd_options_get_server("join", optlist, server); channel = channel_find(server, pdata); if (channel != NULL) { /* already joined to channel, set it active */ window = window_item_window(channel); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *) channel); } else { if (server == NULL || !server->connected) cmd_param_error(CMDERR_NOT_CONNECTED); if (invite) { if (server->last_invite == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_NOT_INVITED); signal_stop(); cmd_params_free(free_arg); return; } pdata = server->last_invite; } if (samewindow) signal_add("channel created", (SIGNAL_FUNC) signal_channel_created_curwin); server->channels_join(server, pdata, FALSE); if (samewindow) signal_remove("channel created", (SIGNAL_FUNC) signal_channel_created_curwin); } cmd_params_free(free_arg); }
static void sig_query_raise(XMPP_SERVER_REC *server, QUERY_REC *query) { WINDOW_REC *window; g_return_if_fail(query != NULL); window = window_item_window(query); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *)query); }
/* SYNTAX: WINDOW REFNUM <number> */ static void cmd_window_refnum(const char *data) { WINDOW_REC *window; if (!is_numeric(data, 0)) return; window = window_find_refnum(atoi(data)); if (window != NULL) window_set_active(window); }
static void window_reparent(WINDOW_REC *win, MAIN_WINDOW_REC *mainwin) { MAIN_WINDOW_REC *old_mainwin; old_mainwin = WINDOW_MAIN(win); if (old_mainwin != mainwin) { gui_window_set_unsticky(win); if (old_mainwin->active == win) { mainwindow_change_active(old_mainwin, win); if (active_mainwin == NULL) { active_mainwin = mainwin; window_set_active(mainwin->active); } } gui_window_reparent(win, mainwin); window_set_active(win); } }
void mainwindow_change_active(MAIN_WINDOW_REC *mainwin, WINDOW_REC *skip_window) { WINDOW_REC *window, *other; GSList *tmp; mainwin->active = NULL; if (mainwin->sticky_windows) { /* sticky window */ tmp = get_sticky_windows_sorted(mainwin); window = tmp->data; if (window == skip_window) { window = tmp->next == NULL ? NULL : tmp->next->data; } g_slist_free(tmp); if (window != NULL) { window_set_active(window); return; } } other = NULL; for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; if (rec != skip_window) { other = rec; break; } } window_set_active(other); if (mainwindows->next != NULL) mainwindow_destroy(mainwin); }
WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic) { WINDOW_REC *rec; rec = g_new0(WINDOW_REC, 1); rec->refnum = window_get_new_refnum(); windows = g_slist_prepend(windows, rec); signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic)); if (item != NULL) window_add_item(rec, item, automatic); if (windows->next == NULL || !automatic || settings_get_bool("window_auto_change")) { if (automatic && windows->next != NULL) signal_emit("window changed automatic", 1, rec); window_set_active(rec); } return rec; }
/* SYNTAX: WINDOW SHOW <number>|<name> */ static void cmd_window_show(const char *data) { WINDOW_REC *window; if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); window = is_numeric(data, 0) ? window_find_refnum(atoi(data)) : window_find_item(active_win, data); if (window == NULL) return; if (is_window_visible(window)) return; WINDOW_GUI(window)->parent = mainwindow_create(); WINDOW_GUI(window)->parent->active = window; active_mainwin = NULL; window_set_active(window); }
/* SYNTAX: WINDOW GOTO active|<number>|<name> */ static void cmd_window_goto(const char *data) { WINDOW_REC *window; g_return_if_fail(data != NULL); if (is_numeric(data, 0)) { cmd_window_refnum(data); return; } if (g_strcasecmp(data, "active") == 0) window = window_highest_activity(active_win); else window = window_find_item(active_win, data); if (window != NULL) window_set_active(window); }
static gboolean event_switch_page(GtkWidget *notebook, GtkNotebookPage *page, gint page_num, Frame *frame) { Tab *tab; tab = frame->active_tab; if (tab != NULL) { gtk_widget_modify_bg(tab->tab_label_widget, GTK_STATE_NORMAL, ¬ebook->style->bg[GTK_STATE_ACTIVE]); } tab = gui_tab_get_page(frame, page_num); gtk_widget_modify_bg(tab->tab_label_widget, GTK_STATE_NORMAL, ¬ebook->style->bg[GTK_STATE_NORMAL]); frame->active_tab = tab; if (tab->active_win != NULL) window_set_active(tab->active_win); return FALSE; }
/* SYNTAX: WINDOW HIDE [<number>|<name>] */ static void cmd_window_hide(const char *data) { WINDOW_REC *window; if (mainwindows->next == NULL) { printformat_window(active_win, MSGLEVEL_CLIENTNOTICE, TXT_CANT_HIDE_LAST); return; } if (*data == '\0') window = active_win; else if (is_numeric(data, 0)) { window = window_find_refnum(atoi(data)); if (window == NULL) { printformat_window(active_win, MSGLEVEL_CLIENTERROR, TXT_REFNUM_NOT_FOUND, data); } } else { window = window_find_item(active_win->active_server, data); } if (window == NULL || !is_window_visible(window)) return; if (WINDOW_MAIN(window)->sticky_windows) { printformat_window(active_win, MSGLEVEL_CLIENTERROR, TXT_CANT_HIDE_STICKY_WINDOWS); return; } mainwindow_destroy(WINDOW_MAIN(window)); if (active_mainwin == NULL) { active_mainwin = WINDOW_MAIN(active_win); window_set_active(active_mainwin->active); } }
/* SYNTAX: WINDOW SHOW <number>|<name> */ static void cmd_window_show(const char *data) { MAIN_WINDOW_REC *parent; WINDOW_REC *window; if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); if (is_numeric(data, '\0')) { window = window_find_refnum(atoi(data)); if (window == NULL) { printformat_window(active_win, MSGLEVEL_CLIENTERROR, TXT_REFNUM_NOT_FOUND, data); } } else { window = window_find_item(active_win->active_server, data); } if (window == NULL || is_window_visible(window)) return; if (WINDOW_MAIN(window)->sticky_windows) { printformat_window(active_win, MSGLEVEL_CLIENTERROR, TXT_CANT_SHOW_STICKY_WINDOWS); return; } parent = mainwindow_create(); parent->active = window; gui_window_reparent(window, parent); if (settings_get_bool("autostick_split_windows")) gui_window_set_sticky(window); active_mainwin = NULL; window_set_active(window); }
/* SYNTAX: WINDOW LAST */ static void cmd_window_last(void) { if (windows->next != NULL) window_set_active(windows->next->data); }
/* SYNTAX: QUERY [-window] [-<server tag>] <nick> [<message>] */ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; QUERY_REC *query; char *nick, *msg; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "query", &optlist, &nick, &msg)) return; if (*nick == '\0') { /* remove current query */ cmd_unquery("", server, item); cmd_params_free(free_arg); return; } server = cmd_options_get_server("query", optlist, server); if (server == NULL) { cmd_params_free(free_arg); return; } if (*nick != '=' && (server == NULL || !server->connected)) cmd_param_error(CMDERR_NOT_CONNECTED); if (g_hash_table_lookup(optlist, "window") != NULL) { signal_add("query created", (SIGNAL_FUNC) signal_query_created_curwin); } query = query_find(server, nick); if (query == NULL) query = CHAT_PROTOCOL(server)-> query_create(server->tag, nick, FALSE); else { /* query already exists, set it active */ WINDOW_REC *window = window_item_window(query); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *) query); } if (g_hash_table_lookup(optlist, "window") != NULL) { signal_remove("query created", (SIGNAL_FUNC) signal_query_created_curwin); } if (*msg != '\0') { msg = g_strdup_printf("-nick %s %s", nick, msg); signal_emit("command msg", 3, msg, server, query); g_free(msg); } cmd_params_free(free_arg); }