static void gui_window_created(WINDOW_REC *window, void *automatic) { MAIN_WINDOW_REC *parent; int new_parent; g_return_if_fail(window != NULL); new_parent = window_create_override == 0 || window_create_override == 2 || active_win == NULL || WINDOW_GUI(active_win) == NULL; parent = !new_parent ? WINDOW_MAIN(active_win) : mainwindow_create(); if (parent == NULL) { /* not enough space for new window, but we really can't abort creation of the window anymore, so create hidden window instead. */ parent = WINDOW_MAIN(active_win); } window_create_override = -1; if (parent->active == NULL) parent->active = window; window->gui_data = gui_window_init(window, parent); /* set only non-automatic windows sticky so that the windows irssi creates at startup wont get sticky. */ if (automatic == NULL && (parent->sticky_windows || (new_parent && settings_get_bool("autostick_split_windows")))) gui_window_set_sticky(window); signal_emit("gui window created", 1, window); }
static void sig_statusbar_more_updated(void) { int visible; visible = g_slist_find(more_visible, WINDOW_MAIN(active_win)) != NULL; if (WINDOW_GUI(active_win)->view->more_text != visible) statusbar_items_redraw("more"); }
/* SYNTAX: WINDOW SIZE <lines> */ static void cmd_window_size(const char *data) { char sizestr[MAX_INT_STRLEN]; int size; if (!is_numeric(data, 0)) return; size = atoi(data); size -= WINDOW_MAIN(active_win)->height - WINDOW_MAIN(active_win)->statusbar_lines; if (size == 0) return; ltoa(sizestr, size < 0 ? -size : size); if (size < 0) cmd_window_shrink(sizestr); else cmd_window_grow(sizestr); }
/* SYNTAX: WINDOW SHRINK [<lines>] */ static void cmd_window_shrink(const char *data) { int count; count = *data == '\0' ? 1 : atoi(data); if (!mainwindow_shrink(WINDOW_MAIN(active_win), count, FALSE)) { printformat_window(active_win, MSGLEVEL_CLIENTNOTICE, TXT_WINDOW_TOO_SMALL); } }
static int window_refnum_right(int refnum, int wrap) { MAIN_WINDOW_REC *find_sticky; WINDOW_REC *window; window = window_find_refnum(refnum); g_return_val_if_fail(window != NULL, -1); find_sticky = WINDOW_MAIN(window)->sticky_windows ? WINDOW_MAIN(window) : NULL; do { refnum = window_refnum_next(refnum, wrap); if (refnum < 0) break; window = window_find_refnum(refnum); } while (!WINDOW_STICKY_MATCH(window, find_sticky)); return refnum; }
static void sig_statusbar_more_updated(void) { int visible; /* no active window, for example during /window hide */ if (active_win == NULL) return; visible = g_slist_find(more_visible, WINDOW_MAIN(active_win)) != NULL; if (WINDOW_GUI(active_win)->view->more_text != visible) statusbar_items_redraw("more"); }
/* SYNTAX: WINDOW GROW [<lines>] */ static void cmd_window_grow(const char *data) { MAIN_WINDOW_REC *window; int count; count = *data == '\0' ? 1 : atoi(data); window = WINDOW_MAIN(active_win); if (!mainwindow_grow(window, count, FALSE)) { printformat_window(active_win, MSGLEVEL_CLIENTNOTICE, TXT_WINDOW_TOO_SMALL); } }
static void gui_windows_remove_parent(MAIN_WINDOW_REC *window) { MAIN_WINDOW_REC *new_parent; GSList *tmp; new_parent = mainwindows->data; for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; if (rec->gui_data != NULL && WINDOW_MAIN(rec) == window) gui_window_reparent(rec, new_parent); } }
void gui_window_reparent(WINDOW_REC *window, MAIN_WINDOW_REC *parent) { MAIN_WINDOW_REC *oldparent; oldparent = WINDOW_MAIN(window); if (oldparent == parent) return; gui_window_set_unsticky(window); textbuffer_view_set_window(WINDOW_GUI(window)->view, NULL); WINDOW_MAIN(window) = parent; if (parent->sticky_windows) gui_window_set_sticky(window); if (MAIN_WINDOW_TEXT_HEIGHT(parent) != MAIN_WINDOW_TEXT_HEIGHT(oldparent) || parent->width != oldparent->width) { gui_window_resize(window, parent->width, MAIN_WINDOW_TEXT_HEIGHT(parent)); } }
/* 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); } }
static void sig_window_print_info(WINDOW_REC *win) { GUI_WINDOW_REC *gui; gui = WINDOW_GUI(win); if (gui->use_scroll) { printformat_window(win, MSGLEVEL_CLIENTCRAP, TXT_WINDOW_INFO_SCROLL, gui->scroll ? "yes" : "no"); } if (WINDOW_MAIN(win)->sticky_windows) windows_print_sticky(win); }
static GSList *get_sticky_windows_sorted(MAIN_WINDOW_REC *mainwin) { GSList *tmp, *list; list = NULL; for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; if (WINDOW_GUI(rec)->sticky && WINDOW_MAIN(rec) == mainwin) { list = g_slist_insert_sorted(list, rec, (GCompareFunc) window_refnum_cmp); } } return list; }
void gui_window_resize(WINDOW_REC *window, int width, int height) { GUI_WINDOW_REC *gui; if (window->width == width && window->height == height) return; gui = WINDOW_GUI(window); irssi_set_dirty(); WINDOW_MAIN(window)->dirty = TRUE; window->width = width; window->height = height; textbuffer_view_resize(gui->view, width, height); }
static void signal_window_changed(WINDOW_REC *window) { MAIN_WINDOW_REC *parent; WINDOW_REC *old_window; g_return_if_fail(window != NULL); if (quitting) return; parent = WINDOW_MAIN(window); if (is_window_visible(window)) { /* already visible */ active_mainwin = parent; } else if (active_mainwin == NULL) { /* no main window set yet */ active_mainwin = parent; } else if (WINDOW_GUI(window)->sticky) { /* window is sticky, switch to correct main window */ if (parent != active_mainwin) active_mainwin = parent; } else { /* move window to active main window */ if (active_mainwin->sticky_windows) { /* active mainwindow is sticky, we'll need to set the window active somewhere else */ active_mainwin = mainwindow_find_unsticky(); } gui_window_reparent(window, active_mainwin); } old_window = active_mainwin->active; if (old_window != NULL && old_window != window) textbuffer_view_set_window(WINDOW_GUI(old_window)->view, NULL); active_mainwin->active = window; textbuffer_view_set_window(WINDOW_GUI(window)->view, active_mainwin->screen_win); if (WINDOW_GUI(window)->view->dirty) active_mainwin->dirty = TRUE; }
MAIN_WINDOW_REC *mainwindow_create(void) { MAIN_WINDOW_REC *rec, *parent; int space; rec = g_new0(MAIN_WINDOW_REC, 1); rec->dirty = TRUE; rec->width = term_width; if (mainwindows == NULL) { active_mainwin = rec; rec->first_line = screen_reserved_top; rec->last_line = term_height-1 - screen_reserved_bottom; rec->height = rec->last_line-rec->first_line+1; } else { parent = WINDOW_MAIN(active_win); if (MAIN_WINDOW_TEXT_HEIGHT(parent) < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE) parent = find_window_with_room(); if (parent == NULL) return NULL; /* not enough space */ space = parent->height / 2; rec->first_line = parent->first_line; rec->last_line = rec->first_line + space; rec->height = rec->last_line-rec->first_line+1; parent->first_line = rec->last_line+1; parent->height = parent->last_line-parent->first_line+1; mainwindow_resize(parent, 0, -space-1); } rec->screen_win = mainwindow_create_screen(rec); term_refresh(NULL); mainwindows = g_slist_append(mainwindows, rec); signal_emit("mainwindow created", 1, rec); return rec; }
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); } }
static void windows_print_sticky(WINDOW_REC *win) { MAIN_WINDOW_REC *mainwin; GSList *tmp, *list; GString *str; mainwin = WINDOW_MAIN(win); /* convert to string */ str = g_string_new(NULL); list = get_sticky_windows_sorted(mainwin); for (tmp = list; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; g_string_sprintfa(str, "#%d, ", rec->refnum); } g_string_truncate(str, str->len-2); g_slist_free(list); printformat_window(win, MSGLEVEL_CLIENTCRAP, TXT_WINDOW_INFO_STICKY, str->str); g_string_free(str, TRUE); }
/* 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); }
static void item_more(SBAR_ITEM_REC *item, int get_size_only) { MAIN_WINDOW_REC *mainwin; int visible; if (active_win == NULL) { mainwin = NULL; visible = FALSE; } else { mainwin = WINDOW_MAIN(active_win); visible = WINDOW_GUI(active_win)->view->more_text; } if (!visible) { if (mainwin != NULL) more_visible = g_slist_remove(more_visible, mainwin); if (get_size_only) item->min_size = item->max_size = 0; return; } more_visible = g_slist_prepend(more_visible, mainwin); statusbar_item_default_handler(item, get_size_only, NULL, "", FALSE); }
static void sig_gui_window_created(WINDOW_REC *window) { statusbars_add_visible(WINDOW_MAIN(window)); }