diff options
Diffstat (limited to 'window-views-patch.diff')
-rw-r--r-- | window-views-patch.diff | 2672 |
1 files changed, 2672 insertions, 0 deletions
diff --git a/window-views-patch.diff b/window-views-patch.diff new file mode 100644 index 00000000..192b96b1 --- /dev/null +++ b/window-views-patch.diff @@ -0,0 +1,2672 @@ +diff -ru irssi-0.7.11/src/gui-gnome/Makefile.am irssi-0.7.11-new/src/gui-gnome/Makefile.am +--- irssi-0.7.11/src/gui-gnome/Makefile.am Sun Jun 6 18:48:07 1999 ++++ irssi-0.7.11-new/src/gui-gnome/Makefile.am Mon Jun 7 18:33:41 1999 +@@ -53,7 +52,8 @@ + gui-mainwindows.c \ + gui-printtext.c \ + gui-server.c \ +- gui-windows.c \ ++ gui-windowset.c \ ++ gui-windows-view.c \ + irssi.c \ + setup-appearance.c \ + setup-ircproxy.c \ +@@ -98,7 +98,8 @@ + gui-mainwindows.h \ + gui-printtext.h \ + gui-server.h \ +- gui-windows.h \ ++ gui-windowset.h \ ++ gui-windows-view.h \ + gtk-specific.h \ + gnome-specific.h \ + irssi.h \ +diff -ru irssi-0.7.11/src/gui-gnome/channels-newdata.c irssi-0.7.11-new/src/gui-gnome/channels-newdata.c +--- irssi-0.7.11/src/gui-gnome/channels-newdata.c Sat May 15 20:23:24 1999 ++++ irssi-0.7.11-new/src/gui-gnome/channels-newdata.c Sat Jun 12 17:55:06 1999 +@@ -57,7 +57,7 @@ + g_return_val_if_fail(channel != NULL, FALSE); + + label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(WINDOW_GUI(CHANNEL_PARENT(channel))->parent->notebook), +- WINDOW_GUI(CHANNEL_PARENT(channel))->window); ++ WINDOW_GUI(CHANNEL_PARENT(channel))->windowset->window); + newdata_label_colorify(channel, label); + + return TRUE; +diff -ru irssi-0.7.11/src/gui-gnome/dialog-channels.c irssi-0.7.11-new/src/gui-gnome/dialog-channels.c +--- irssi-0.7.11/src/gui-gnome/dialog-channels.c Wed May 12 17:54:45 1999 ++++ irssi-0.7.11-new/src/gui-gnome/dialog-channels.c Mon Jun 7 18:57:46 1999 +@@ -617,7 +617,7 @@ + { + /* channel specific background pixmap */ + path = convert_home(rec->background); +- gui_window_set_background_pixmap(CHANNEL_PARENT(channel), path); ++ gui_window_view_set_background_pixmap(WINDOW_GUI(CHANNEL_PARENT(channel)), path); + g_free(path); + } + +diff -ru irssi-0.7.11/src/gui-gnome/dialog-textwidget.c irssi-0.7.11-new/src/gui-gnome/dialog-textwidget.c +--- irssi-0.7.11/src/gui-gnome/dialog-textwidget.c Thu May 13 14:46:51 1999 ++++ irssi-0.7.11-new/src/gui-gnome/dialog-textwidget.c Sat Jun 12 17:26:21 1999 +@@ -134,7 +134,7 @@ + return; + } + +- if (WINDOW_GUI(window->active)->zvt) ++ if (window->active->active->zvt) + { + gui_dialog(DIALOG_ERROR, "Find doesn't work with ZVT windows yet"); + return; +@@ -145,7 +145,7 @@ + GNOME_STOCK_BUTTON_CLOSE, NULL); + gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", + GTK_SIGNAL_FUNC(gtk_widget_destroy), NULL); +- gui_widget_depends_data(dialog, "window destroyed", window->active); ++ gui_widget_depends_data(dialog, "window destroyed", window->active->active->window); + + hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); +@@ -160,8 +160,8 @@ + gnome_dialog_button_connect_object(GNOME_DIALOG(dialog), 1, sig_find_next, GTK_OBJECT(dialog)); + gnome_dialog_button_connect_object(GNOME_DIALOG(dialog), 2, GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog)); + +- gtk_object_set_data(GTK_OBJECT(dialog), "text", WINDOW_GUI(window->active)->text); +- gtk_object_set_data(GTK_OBJECT(dialog), "window", window->active); ++ gtk_object_set_data(GTK_OBJECT(dialog), "text", window->active->active->text); ++ gtk_object_set_data(GTK_OBJECT(dialog), "window", window->active->active->window); + gtk_object_set_data(GTK_OBJECT(dialog), "entry", entry); + + gtk_widget_show_all(dialog); +@@ -220,13 +220,13 @@ + return; + } + +- if (WINDOW_GUI(window->active)->zvt) ++ if (window->active->active->zvt) + { + gui_dialog(DIALOG_ERROR, "Save doesn't work with ZVT windows yet"); + return; + } + +- if (gtk_text_get_length(GTK_TEXT(WINDOW_GUI(window->active)->text)) == 0) ++ if (gtk_text_get_length(GTK_TEXT(window->active->active->text)) == 0) + { + gui_dialog(DIALOG_OK, _("Window doesn't have any text")); + return; +@@ -236,12 +236,12 @@ + GNOME_STOCK_BUTTON_CANCEL, NULL); + gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", + GTK_SIGNAL_FUNC(gtk_widget_destroy), NULL); +- gui_widget_depends_data(dialog, "window destroyed", window->active); ++ gui_widget_depends_data(dialog, "window destroyed", window->active->active->window); + + button = gtk_check_button_new_with_label(_("Save only selected text")); + gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox), button, FALSE, FALSE, 0); + +- if (GTK_EDITABLE(WINDOW_GUI(window->active)->text)->has_selection) ++ if (GTK_EDITABLE(window->active->active->text)->has_selection) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); + else + gtk_widget_set_sensitive(button, FALSE); +@@ -258,7 +258,7 @@ + gnome_dialog_button_connect_object(GNOME_DIALOG(dialog), 0, sig_save_ok, GTK_OBJECT(dialog)); + gnome_dialog_button_connect_object(GNOME_DIALOG(dialog), 1, GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dialog)); + +- gtk_object_set_data(GTK_OBJECT(dialog), "text", WINDOW_GUI(window->active)->text); ++ gtk_object_set_data(GTK_OBJECT(dialog), "text", window->active->active->text); + gtk_object_set_data(GTK_OBJECT(dialog), "selbut", button); + gtk_object_set_data(GTK_OBJECT(dialog), "entry", gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(entry))); + +diff -ru irssi-0.7.11/src/gui-gnome/dialog-window.c irssi-0.7.11-new/src/gui-gnome/dialog-window.c +--- irssi-0.7.11/src/gui-gnome/dialog-window.c Sun Jun 6 18:34:26 1999 ++++ irssi-0.7.11-new/src/gui-gnome/dialog-window.c Sat Jun 12 17:28:12 1999 +@@ -108,13 +108,13 @@ + hbox2 = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), hbox2, TRUE, TRUE, 0); + +- str = g_strdup_printf("%d", WINDOW_GUI(window->active)->text->allocation.width); ++ str = g_strdup_printf("%d", window->active->active->text->allocation.width); + entry = gui_create_labelentry(hbox2, _("Width"), str, TRUE); + gtk_object_set_data(GTK_OBJECT(dialog), "sizexentry", entry); + gtk_widget_set_usize(entry, 50, -1); + g_free(str); + +- str = g_strdup_printf("%d", WINDOW_GUI(window->active)->text->allocation.height); ++ str = g_strdup_printf("%d", window->active->active->text->allocation.height); + entry = gui_create_labelentry(hbox2, _("Height"), str, TRUE); + gtk_object_set_data(GTK_OBJECT(dialog), "sizeyentry", entry); + gtk_widget_set_usize(entry, 50, -1); +@@ -154,7 +154,7 @@ + gtk_widget_set_sensitive(hbox2, FALSE); + + /* window name */ +- channel = window->active->active; ++ channel = window->active->active->window->active; + name = gui_channel_get_name(channel); + if (name == NULL) name = "default"; + +diff -ru irssi-0.7.11/src/gui-gnome/gui-channels.c irssi-0.7.11-new/src/gui-gnome/gui-channels.c +--- irssi-0.7.11/src/gui-gnome/gui-channels.c Sat May 15 15:47:08 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-channels.c Sat Jun 12 17:51:30 1999 +@@ -41,7 +41,7 @@ + GList *tmp; + + label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), +- WINDOW_GUI(window)->window); ++ WINDOW_GUI(window)->windowset->window); + g_return_if_fail(label != NULL); + + str = g_string_new(NULL); +@@ -75,7 +75,7 @@ + if (channel->type == CHANNEL_TYPE_EMPTY) + rec->servermenu = TRUE; + if (channel->type == CHANNEL_TYPE_CHANNEL && toggle_show_nicklist) +- gtk_widget_show(WINDOW_GUI(window)->nickscrollbox); ++ gtk_widget_show(WINDOW_GUI(window)->windowset->nickscrollbox); + + name = gui_channel_get_name(channel); + +@@ -182,7 +182,7 @@ + /* create new window to use */ + window = !toggle_use_tabbed_windows ? NULL : + cur_channel != NULL ? CHANNEL_PARENT(cur_channel) : NULL; +- window = gui_window_create(window == NULL ? NULL : WINDOW_GUI(window)->parent); ++ window = gui_windowset_create(window == NULL ? NULL : WINDOW_GUI(window)->parent)->active->window; + } + + gui_channel_init(window, channel); +@@ -230,7 +230,7 @@ + else + { + /* window is useless, destroy it. */ +- gui_window_destroy(window); ++ gui_window_view_destroy(WINDOW_GUI(window)); + } + } + return TRUE; +@@ -253,16 +253,16 @@ + if (channel->topic == NULL || *channel->topic == '\0') + { + /* No topic in channel */ +- gtk_entry_set_text(GTK_ENTRY(WINDOW_GUI(window)->topicentry), ""); ++ gtk_entry_set_text(GTK_ENTRY(WINDOW_GUI(window)->windowset->topicentry), ""); + } + else + { +- gtk_entry_set_text(GTK_ENTRY(WINDOW_GUI(window)->topicentry), channel->topic); ++ gtk_entry_set_text(GTK_ENTRY(WINDOW_GUI(window)->windowset->topicentry), channel->topic); + g_string_sprintfa(tmp, " - %s", channel->topic); + } + } + +- if (window == WINDOW_GUI(window)->parent->active) ++ if (window == WINDOW_GUI(window)->parent->active->active->window) + gtk_window_set_title(GTK_WINDOW(WINDOW_GUI(window)->parent->window), tmp->str); + g_string_free(tmp, TRUE); + return TRUE; +@@ -276,7 +276,7 @@ + g_return_if_fail(channel->server != NULL); + + str = g_strconcat(channel->server->nick, " / ", channel->server->tag, NULL); +- gtk_label_set(GTK_LABEL(WINDOW_GUI(CHANNEL_PARENT(channel))->serverlabel), str); ++ gtk_label_set(GTK_LABEL(WINDOW_GUI(CHANNEL_PARENT(channel))->windowset->serverlabel), str); + g_free(str); + } + +@@ -322,7 +322,7 @@ + window = CHANNEL_PARENT(channel); + if (channel->type != CHANNEL_TYPE_CHANNEL || channel != window->active) + return TRUE; +- gui = WINDOW_GUI(window); ++ gui = WINDOW_GUI(window)->windowset; + + for (num = 0; num < 6; num++) + gtk_object_set_data(GTK_OBJECT(gui->modebuttons[num]), "toggling", GINT_TO_POINTER(TRUE)); +@@ -351,20 +351,21 @@ + + static gboolean signal_channel_open(CHANNEL_REC *channel) + { +- WINDOW_REC *window; ++ GUI_WINDOW_REC *gui; + + g_return_val_if_fail(channel != NULL, FALSE); + +- window = CHANNEL_PARENT(channel); +- if (WINDOW_GUI(window)->parent->active != window) ++ gui = WINDOW_GUI(CHANNEL_PARENT(channel))->windowset; ++ ++ if (gui->parent->active->active->window != CHANNEL_PARENT(channel)) + { + /* change to right window tab */ + gint page; + +- page = gtk_notebook_page_num(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), WINDOW_GUI(window)->window); +- gtk_notebook_set_page(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), page); ++ page = gtk_notebook_page_num(GTK_NOTEBOOK(gui->parent->notebook), gui->window); ++ gtk_notebook_set_page(GTK_NOTEBOOK(gui->parent->notebook), page); + } +- gdk_window_show(WINDOW_GUI(window)->parent->window->window); ++ gdk_window_show(gui->parent->window->window); + + if (CHANNEL_PARENT(channel)->active != channel) + { +diff -ru irssi-0.7.11/src/gui-gnome/gui-mainwindows.c irssi-0.7.11-new/src/gui-gnome/gui-mainwindows.c +--- irssi-0.7.11/src/gui-gnome/gui-mainwindows.c Thu May 13 15:17:33 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-mainwindows.c Sat Jun 12 17:31:42 1999 +@@ -23,7 +23,7 @@ + + GList *mainwindows; + +-static WINDOW_REC *window_find_notebook_child(MAIN_WINDOW_REC *window, GtkWidget *child) ++static GUI_WINDOW_VIEW_REC *window_find_notebook_child(MAIN_WINDOW_REC *window, GtkWidget *child) + { + GList *tmp; + +@@ -32,9 +32,9 @@ + + for (tmp = g_list_first(window->children); tmp != NULL; tmp = tmp->next) + { +- WINDOW_REC *rec = tmp->data; ++ GUI_WINDOW_VIEW_REC *rec = tmp->data; + +- if (WINDOW_GUI(rec)->window == child) return rec; ++ if (rec->windowset->window == child) return rec; + } + + return NULL; +@@ -57,9 +57,9 @@ + { + g_return_val_if_fail(window != NULL, 0); + +- if (cur_channel != window->active->active) ++ if (cur_channel != window->active->active->window->active) + { +- cur_channel = window->active->active; ++ cur_channel = window->active->active->window->active; + signal_emit("channel changed", 1, cur_channel); + signal_emit("window focused", 1, window->active); + } +@@ -70,7 +70,7 @@ + /* notebook signal: switch_page */ + static void sig_switch_page(GtkWidget *notebook, GtkNotebookPage *child, guint pagenum, MAIN_WINDOW_REC *window) + { +- WINDOW_REC *subwin; ++ GUI_WINDOW_VIEW_REC *subwin; + + g_return_if_fail(child != NULL); + g_return_if_fail(window != NULL); +@@ -84,10 +84,10 @@ + return; + } + +- window->active = subwin; +- cur_channel = subwin->active; ++ window->active->active = subwin; ++ cur_channel = subwin->window->active; + signal_emit("channel changed", 1, cur_channel); +- signal_emit("window focused", 1, subwin); ++ signal_emit("window focused", 1, subwin->window); + } + + static void window_change_page(WINDOW_REC *window) +@@ -96,7 +96,7 @@ + + g_return_if_fail(window != NULL); + +- page = gtk_notebook_page_num(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), WINDOW_GUI(window)->window); ++ page = gtk_notebook_page_num(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), WINDOW_GUI(window)->windowset->window); + gtk_notebook_set_page(GTK_NOTEBOOK(WINDOW_GUI(window)->parent->notebook), page); + } + +@@ -105,15 +105,15 @@ + /* signal: key pressed (in entry field) */ + static gint sig_keypress(GtkWidget *widget, GdkEventKey *event, MAIN_WINDOW_REC *window) + { +- GUI_WINDOW_REC *guiwin; ++ GUI_WINDOW_VIEW_REC *view; + gchar *text; + + g_return_val_if_fail(event != NULL, 0); + g_return_val_if_fail(window != NULL, 0); + +- guiwin = window->active == NULL ? NULL : WINDOW_GUI(window->active); +- if (guiwin != NULL && guiwin->topicentry != NULL && GTK_WIDGET_HAS_FOCUS(guiwin->topicentry) && +- gtk_object_get_data(GTK_OBJECT(guiwin->topicentry), "editable")) ++ view = window->active == NULL ? NULL : window->active->active ; ++ if (view != NULL && view->windowset->topicentry != NULL && GTK_WIDGET_HAS_FOCUS(view->windowset->topicentry) && ++ gtk_object_get_data(GTK_OBJECT(view->windowset->topicentry), "editable")) + { + /* trying to write topic, don't disturb it.. */ + return 0; +@@ -143,11 +143,11 @@ + gint val; + + #ifdef HAVE_GNOME +- if (guiwin->zvt) +- adj = ZVT_TERM(guiwin->text)->adjustment; ++ if (view->zvt) ++ adj = ZVT_TERM(view->text)->adjustment; + else + #endif +- adj = GTK_TEXT(guiwin->text)->vadj; ++ adj = GTK_TEXT(view->text)->vadj; + val = adj->value - (adj->page_size/2); + gtk_adjustment_set_value(adj, val > 0 ? val : 0); + } +@@ -161,11 +161,11 @@ + gint val, max; + + #ifdef HAVE_GNOME +- if (guiwin->zvt) +- adj = ZVT_TERM(guiwin->text)->adjustment; ++ if (view->zvt) ++ adj = ZVT_TERM(view->text)->adjustment; + else + #endif +- adj = GTK_TEXT(guiwin->text)->vadj; ++ adj = GTK_TEXT(view->text)->vadj; + val = adj->value + (adj->page_size/2); + max = adj->upper - adj->lower - adj->page_size; + gtk_adjustment_set_value(adj, val <= max ? val : max); +@@ -179,7 +179,7 @@ + gint pos; + + pos = gtk_editable_get_position(GTK_EDITABLE(window->entry)); +- line = completion_line(window->active->active, gtk_entry_get_text(GTK_ENTRY(window->entry)), &pos); ++ line = completion_line(window->active->active->window->active, gtk_entry_get_text(GTK_ENTRY(window->entry)), &pos); + if (line != NULL) + { + gtk_entry_set_text(GTK_ENTRY(window->entry), line); +@@ -271,14 +271,14 @@ + + ui_history_add(str, FALSE); + +- if (cur_channel != window->active->active) ++ if (cur_channel != window->active->active->window->active) + { + /* we get here at least when using click-to-focus and keyboard + focus being in different window than mouse. Is there some + event we could use instead of enter_notify_event to find out + what window really has the focus? .. probably is, I'm too lazy + to find out what it is .. */ +- cur_channel = window->active->active; ++ cur_channel = window->active->active->window->active; + signal_emit("channel changed", 1, cur_channel); + } + signal_emit("send command", 3, str, cur_channel->server, cur_channel); +@@ -386,7 +403,7 @@ + + window->destroying = TRUE; + while (window->children != NULL) +- gui_window_destroy(window->children->data); ++ gui_windowset_destroy(window->children->data); + window->destroying = FALSE; + + gtk_widget_destroy(window->window); +diff -ru irssi-0.7.11/src/gui-gnome/gui-mainwindows.h irssi-0.7.11-new/src/gui-gnome/gui-mainwindows.h +--- irssi-0.7.11/src/gui-gnome/gui-mainwindows.h Sun Apr 11 23:40:07 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-mainwindows.h Sat Jun 12 17:23:49 1999 +@@ -1,6 +1,9 @@ + #ifndef __GUI_MAINWINDOWS_H + #define __GUI_MAINWINDOWS_H + ++typedef struct _GUI_WINDOW_REC GUI_WINDOW_REC; ++typedef struct _GUI_WINDOW_VIEW_REC GUI_WINDOW_VIEW_REC; ++ + typedef struct + { + GtkWidget *window; +@@ -17,7 +20,7 @@ + guint destroying:1; + + GList *children; +- WINDOW_REC *active; ++ GUI_WINDOW_REC *active; + } + MAIN_WINDOW_REC; + +diff -ru irssi-0.7.11/src/gui-gnome/gui-printtext.c irssi-0.7.11-new/src/gui-gnome/gui-printtext.c +--- irssi-0.7.11/src/gui-gnome/gui-printtext.c Sun Jun 6 12:28:08 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-printtext.c Mon Jun 7 18:44:44 1999 +@@ -51,7 +51,7 @@ + /* Write text to ZVT window */ + static gboolean gui_printtext_zvt(CHANNEL_REC *channel, gint fgcolor, gint bgcolor, gint flags, gchar *str) + { +- GUI_WINDOW_REC *gui; ++ GUI_WINDOW_VIEW_REC *view; + WINDOW_REC *window; + gint fg, bg; + GString *out; +@@ -59,7 +59,7 @@ + g_return_val_if_fail(str != NULL, FALSE); + + window = CHANNEL_PARENT(channel); +- gui = WINDOW_GUI(window); ++ view = WINDOW_GUI(window); + + if (flags & PRINTFLAG_BEEP) + gdk_beep(); +@@ -75,7 +75,7 @@ + } + + if (*str == '\n') +- zvt_term_feed(ZVT_TERM(gui->text), "\r", 1); ++ zvt_term_feed(ZVT_TERM(view->text), "\r", 1); + + out = g_string_new("\033[0;"); + +@@ -87,8 +87,8 @@ + g_string_sprintfa(out, "3%dm", ansitab[fg & 7]); + + g_string_append(out, str); +- zvt_term_feed(ZVT_TERM(gui->text), out->str, out->len); +- vt_cursor_state(gui->text, 0); /* hide the ugly cursor */ ++ zvt_term_feed(ZVT_TERM(view->text), out->str, out->len); ++ vt_cursor_state(view->text, 0); /* hide the ugly cursor */ + + g_string_free(out, TRUE); + +@@ -99,7 +99,7 @@ + /* Write text to window */ + static gboolean gui_printtext(CHANNEL_REC *channel, gpointer fgcolor, gpointer bgcolor, gpointer flags, gchar *str) + { +- GUI_WINDOW_REC *gui; ++ GUI_WINDOW_VIEW_REC *view; + WINDOW_REC *window; + GdkColor *fg, *bg; + GdkFont *font; +@@ -109,10 +109,10 @@ + g_return_val_if_fail(str != NULL, FALSE); + + window = CHANNEL_PARENT(channel); +- gui = WINDOW_GUI(window); ++ view = WINDOW_GUI(window); + + #ifdef HAVE_GNOME +- if (gui->zvt) ++ if (view->zvt) + { + /* Use ZVT widget */ + return gui_printtext_zvt(channel, GPOINTER_TO_INT(fgcolor), +@@ -126,13 +126,13 @@ + will happen.. (and this code even looks awful ...) */ + if (*str == '\n') + { +- gui->linepos = g_list_append(gui->linepos, GINT_TO_POINTER(gui->lastlinelen)+1); +- gui->lastlinelen = 0; ++ view->linepos = g_list_append(view->linepos, GINT_TO_POINTER(view->lastlinelen)+1); ++ view->lastlinelen = 0; + } + else +- gui->lastlinelen += strlen(str); ++ view->lastlinelen += strlen(str); + +- gtk_text_freeze(GTK_TEXT(gui->text)); ++ gtk_text_freeze(GTK_TEXT(view->text)); + if (*str == '\n' && max_textwidget_lines > 0 && + max_textwidget_lines+block_remove_lines <= window->lines && + channel->type != CHANNEL_TYPE_SETUP) +@@ -143,15 +143,15 @@ + { + GList *link; + +- link = g_list_first(gui->linepos); ++ link = g_list_first(view->linepos); + len += GPOINTER_TO_INT(link->data); +- gui->linepos = g_list_remove_link(gui->linepos, link); ++ view->linepos = g_list_remove_link(view->linepos, link); + g_list_free_1(link); + window->lines--; + } +- gtk_text_set_point(GTK_TEXT(gui->text), 0); +- gtk_text_forward_delete(GTK_TEXT(gui->text), len); +- gtk_text_set_point(GTK_TEXT(gui->text), gtk_text_get_length(GTK_TEXT(gui->text))); ++ gtk_text_set_point(GTK_TEXT(view->text), 0); ++ gtk_text_forward_delete(GTK_TEXT(view->text), len); ++ gtk_text_set_point(GTK_TEXT(view->text), gtk_text_get_length(GTK_TEXT(view->text))); + } + + if (GPOINTER_TO_INT(flags) & PRINTFLAG_BOLD) +@@ -178,8 +178,8 @@ + fg = bg != NULL ? bg : &bg_color; + bg = tmp; + } +- gtk_text_insert(GTK_TEXT(gui->text), font, fg, bg, str, -1); +- gtk_text_thaw(GTK_TEXT(gui->text)); ++ gtk_text_insert(GTK_TEXT(view->text), font, fg, bg, str, -1); ++ gtk_text_thaw(GTK_TEXT(view->text)); + + if (sb_down) set_sb_down(window); + +diff -ru irssi-0.7.11/src/gui-gnome/irssi.c irssi-0.7.11-new/src/gui-gnome/irssi.c +--- irssi-0.7.11/src/gui-gnome/irssi.c Mon May 10 20:32:28 1999 ++++ irssi-0.7.11-new/src/gui-gnome/irssi.c Mon Jun 7 19:06:20 1999 +@@ -38,7 +38,8 @@ + + gui_printtext_init(); + mainwindows_init(); +- gui_windows_init(); ++ gui_windowset_init(); ++ gui_windows_view_init(); + gui_channels_init(); + gui_dcc_init(); + gui_events_init(); +@@ -86,7 +87,8 @@ + gui_events_deinit(); + gui_server_deinit(); + mainwindows_deinit(); +- gui_windows_deinit(); ++ gui_windows_view_deinit(); ++ gui_windowset_deinit(); + gui_channels_deinit(); /* channels after mainwindows_deinit()! */ + gui_printtext_deinit(); + setup_deinit(); +diff -ru irssi-0.7.11/src/gui-gnome/irssi.h irssi-0.7.11-new/src/gui-gnome/irssi.h +--- irssi-0.7.11/src/gui-gnome/irssi.h Mon May 10 20:24:46 1999 ++++ irssi-0.7.11-new/src/gui-gnome/irssi.h Mon Jun 7 18:34:03 1999 +@@ -35,7 +35,8 @@ + #include "setup.h" + #include "gui-mainwindows.h" + #include "gui-channels.h" +-#include "gui-windows.h" ++#include "gui-windowset.h" ++#include "gui-windows-view.h" + + #include "channels-newdata.h" + #include "dialogs.h" +diff -ru irssi-0.7.11/src/gui-gnome/setup-appearance.c irssi-0.7.11-new/src/gui-gnome/setup-appearance.c +--- irssi-0.7.11/src/gui-gnome/setup-appearance.c Sun Jun 6 20:10:05 1999 ++++ irssi-0.7.11-new/src/gui-gnome/setup-appearance.c Mon Jun 7 19:07:22 1999 +@@ -49,16 +49,16 @@ + + static gchar *temp_font_name; + +-static void set_window_bg(GUI_WINDOW_REC *window) ++static void set_window_bg(GUI_WINDOW_VIEW_REC *view) + { + GtkStyle *style; + +- g_return_if_fail(window != NULL); ++ g_return_if_fail(view != NULL); + +- style = gtk_style_copy(window->text->style); ++ style = gtk_style_copy(view->text->style); + gtk_style_ref(style); + style->base[0] = temp_bg_color; +- gtk_widget_set_style(window->text, style); ++ gtk_widget_set_style(view->text, style); + gtk_style_unref(style); + + } +@@ -71,14 +71,14 @@ + static gboolean old_timestamps; + static gint oldlines, len; + +- GUI_WINDOW_REC *guiwin; ++ GUI_WINDOW_VIEW_REC *view; + WINDOW_REC *window; + gint n; + + g_return_if_fail(channel != NULL); + + window = CHANNEL_PARENT(channel); +- guiwin = WINDOW_GUI(window); ++ view = WINDOW_GUI(window); + + if (init) + { +@@ -90,16 +90,16 @@ + old_timestamps = toggle_show_timestamps; + toggle_show_timestamps = FALSE; + +- set_window_bg(guiwin); ++ set_window_bg(view); + + gui_printtext_configure(); + +- oldval = GTK_TEXT(guiwin->text)->vadj->value; ++ oldval = GTK_TEXT(view->text)->vadj->value; + oldlines = window->lines; +- len = gtk_text_get_length(GTK_TEXT(guiwin->text)); ++ len = gtk_text_get_length(GTK_TEXT(view->text)); + +- gtk_text_freeze(GTK_TEXT(guiwin->text)); +- gtk_text_set_point(GTK_TEXT(guiwin->text), len); ++ gtk_text_freeze(GTK_TEXT(view->text)); ++ gtk_text_set_point(GTK_TEXT(view->text), len); + } + else + { +@@ -108,10 +108,10 @@ + window->lines = oldlines; + + /*FIXME: this doesn't remove the lines from linelen list*/ +- gtk_text_set_point(GTK_TEXT(guiwin->text), 0); +- gtk_text_forward_delete(GTK_TEXT(guiwin->text), len); +- gtk_text_thaw(GTK_TEXT(guiwin->text)); +- gtk_adjustment_set_value(GTK_TEXT(guiwin->text)->vadj, oldval); ++ gtk_text_set_point(GTK_TEXT(view->text), 0); ++ gtk_text_forward_delete(GTK_TEXT(view->text), len); ++ gtk_text_thaw(GTK_TEXT(view->text)); ++ gtk_adjustment_set_value(GTK_TEXT(view->text)->vadj, oldval); + + bg_color = old_bg_color; + memcpy(setup_colors, old_colors, sizeof(setup_colors)); +diff -ru irssi-0.7.11/src/gui-gnome/snapshot.c irssi-0.7.11-new/src/gui-gnome/snapshot.c +--- irssi-0.7.11/src/gui-gnome/snapshot.c Thu May 13 16:03:54 1999 ++++ irssi-0.7.11-new/src/gui-gnome/snapshot.c Mon Jun 7 19:08:17 1999 +@@ -24,25 +24,25 @@ + + static void snapshot_show(WINDOW_REC *window) + { +- GUI_WINDOW_REC *gui; ++ GUI_WINDOW_VIEW_REC *view; + GtkWidget *scrollbox; + GtkAdjustment *adj; + gint x, y, xsize, ysize; + + g_return_if_fail(window != NULL); + +- gui = WINDOW_GUI(window); ++ view = WINDOW_GUI(window); + gdk_window_get_pointer (NULL, &x, &y, NULL); + +- gui->snapshot = gtk_window_new(GTK_WINDOW_POPUP); ++ view->snapshot = gtk_window_new(GTK_WINDOW_POPUP); + + scrollbox = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbox), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +- gtk_container_add(GTK_CONTAINER(gui->snapshot), scrollbox); ++ gtk_container_add(GTK_CONTAINER(view->snapshot), scrollbox); + +- xsize = gui->text->allocation.width; +- ysize = gui->text->allocation.height; ++ xsize = view->text->allocation.width; ++ ysize = view->text->allocation.height; + + if (xsize <= 1) xsize = gdk_screen_width()/2; + if (ysize <= 1) ysize = gdk_screen_height()*2/5; +@@ -58,18 +58,18 @@ + else + y += 5; + +- gtk_widget_set_uposition(gui->snapshot, x, y); ++ gtk_widget_set_uposition(view->snapshot, x, y); + +- gtk_object_set_data(GTK_OBJECT(gui->text), "parent", gui->text->parent); +- gtk_widget_reparent(gui->text, scrollbox); +- gtk_widget_show_all(gui->snapshot); ++ gtk_object_set_data(GTK_OBJECT(view->text), "parent", view->text->parent); ++ gtk_widget_reparent(view->text, scrollbox); ++ gtk_widget_show_all(view->snapshot); + + #ifdef HAVE_GNOME +- if (gui->zvt) +- adj = ZVT_TERM(gui->text)->adjustment; ++ if (view->zvt) ++ adj = ZVT_TERM(view->text)->adjustment; + else + #endif +- adj = GTK_TEXT(gui->text)->vadj; ++ adj = GTK_TEXT(view->text)->vadj; + gtk_adjustment_set_value(adj, adj->upper - adj->lower - adj->page_size); + + signal_emit("window focused", 1, window); +@@ -77,18 +77,18 @@ + + static void snapshot_hide(WINDOW_REC *window) + { +- GUI_WINDOW_REC *gui; ++ GUI_WINDOW_VIEW_REC *view; + GtkWidget *parent; + + g_return_if_fail(window != NULL); + +- gui = WINDOW_GUI(window); +- parent = gtk_object_get_data(GTK_OBJECT(gui->text), "parent"); ++ view = WINDOW_GUI(window); ++ parent = gtk_object_get_data(GTK_OBJECT(view->text), "parent"); + g_return_if_fail(parent != NULL); + +- gtk_widget_reparent(gui->text, parent); +- gtk_widget_destroy(gui->snapshot); +- gui->snapshot = NULL; ++ gtk_widget_reparent(view->text, parent); ++ gtk_widget_destroy(view->snapshot); ++ view->snapshot = NULL; + + signal_emit("window focused", 1, ((MAIN_WINDOW_REC *) mainwindows->data)->active); + } +diff -ru irssi-0.7.11/src/gui-gnome/window-menus.c irssi-0.7.11-new/src/gui-gnome/window-menus.c +--- irssi-0.7.11/src/gui-gnome/window-menus.c Sat May 15 22:08:20 1999 ++++ irssi-0.7.11-new/src/gui-gnome/window-menus.c Sat Jun 12 17:34:53 1999 +@@ -280,7 +280,7 @@ + window = gtk_object_get_data(GTK_OBJECT(menuitem->parent), "window"); + g_return_if_fail(window != NULL); + +- window->active->active->server = server; ++ window->active->active->window->active->server = server; + signal_emit("window server changed", 1, window->active); + } + +@@ -330,7 +330,7 @@ + gtk_menu_append(GTK_MENU(menu), menuitem); + + if (window->active != NULL) +- gtk_option_menu_set_history(GTK_OPTION_MENU(window->servermenu), g_list_index(servers, window->active->active->server)); ++ gtk_option_menu_set_history(GTK_OPTION_MENU(window->servermenu), g_list_index(servers, window->active->active->window->active->server)); + } + + return TRUE; +@@ -381,19 +381,19 @@ + + static void menu_chan_toggle_nicklist(GtkWidget *menuitem, CHANNEL_REC *channel) + { +- GUI_WINDOW_REC *window; ++ GtkWidget *nickscrollbox; + + g_return_if_fail(menuitem != NULL); + if (channel == NULL) return; + +- window = WINDOW_GUI(CHANNEL_PARENT(channel)); +- if (window->nickscrollbox == NULL) ++ nickscrollbox = WINDOW_GUI(CHANNEL_PARENT(channel))->windowset->nickscrollbox; ++ if (nickscrollbox == NULL) + return; /* this function was called from window_create().. */ + + if (GTK_CHECK_MENU_ITEM(menuitem)->active) +- gtk_widget_show(window->nickscrollbox); ++ gtk_widget_show(nickscrollbox); + else +- gtk_widget_hide(window->nickscrollbox); ++ gtk_widget_hide(nickscrollbox); + } + + static void menu_query_close(GtkWidget *menuitem, CHANNEL_REC *channel) +@@ -433,7 +433,7 @@ + toggling = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(menuitem), "toggling")); + if (toggling) return; + +- server = window->active->active->server; ++ server = window->active->active->window->active->server; + gtk_object_set_data(GTK_OBJECT(menuitem), "toggling", GINT_TO_POINTER(TRUE)); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), + server == NULL ? FALSE : server->usermode_away); +@@ -478,9 +478,9 @@ + g_return_if_fail(menuitem != NULL); + if (window == NULL) return; + +- server = window->active->active->server; ++ server = window->active->active->window->active->server; + usermode_set(menuitem, 'i', server == NULL ? FALSE : +- server->usermode_invisible, window->active->active); ++ server->usermode_invisible, window->active->active->window->active); + } + + static void menu_usermode_wallops(GtkWidget *menuitem, MAIN_WINDOW_REC *window) +@@ -490,9 +490,9 @@ + g_return_if_fail(menuitem != NULL); + if (window == NULL) return; + +- server = window->active->active->server; ++ server = window->active->active->window->active->server; + usermode_set(menuitem, 'w', server == NULL ? FALSE : +- server->usermode_wallops, window->active->active); ++ server->usermode_wallops, window->active->active->window->active); + } + + static void menu_usermode_snotes(GtkWidget *menuitem, MAIN_WINDOW_REC *window) +@@ -502,19 +502,19 @@ + g_return_if_fail(menuitem != NULL); + if (window == NULL) return; + +- server = window->active->active->server; ++ server = window->active->active->window->active->server; + usermode_set(menuitem, 's', server == NULL ? FALSE : +- server->usermode_servernotes, window->active->active); ++ server->usermode_servernotes, window->active->active->window->active); + } + + static void menu_dcc_chat(GtkWidget *menuitem, MAIN_WINDOW_REC *window) + { +- gui_dcc_chat(window->active->active != NULL ? window->active->active->server : window->active->active->server); ++ gui_dcc_chat(window->active->active != NULL ? window->active->active->window->active->server : window->active->active->window->active->server); + } + + static void menu_dcc_send(GtkWidget *menuitem, MAIN_WINDOW_REC *window) + { +- gui_dcc_send(window->active->active != NULL ? window->active->active->server : window->active->active->server, NULL, NULL); ++ gui_dcc_send(window->active->active != NULL ? window->active->active->window->active->server : window->active->active->window->active->server, NULL, NULL); + } + + static void menu_window_new(GtkWidget *menuitem, MAIN_WINDOW_REC *window) +@@ -526,7 +526,7 @@ + + old = toggle_use_tabbed_windows; + toggle_use_tabbed_windows = FALSE; +- channel_create(window->active->active->server, _("(empty)"), CHANNEL_TYPE_EMPTY); ++ channel_create(window->active->active->window->active->server, _("(empty)"), CHANNEL_TYPE_EMPTY); + toggle_use_tabbed_windows = old; + } + +@@ -539,7 +539,7 @@ + + old = toggle_use_tabbed_windows; + toggle_use_tabbed_windows = TRUE; +- channel_create(window->active->active->server, _("(empty)"), CHANNEL_TYPE_EMPTY); ++ channel_create(window->active->active->window->active->server, _("(empty)"), CHANNEL_TYPE_EMPTY); + toggle_use_tabbed_windows = old; + } + +@@ -554,7 +554,7 @@ + toggling = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(menuitem), "toggling")); + if (toggling) return; + +- gui = CHANNEL_GUI(window->active->active); ++ gui = CHANNEL_GUI(window->active->active->window->active); + gui->autoraise = GTK_CHECK_MENU_ITEM(menuitem)->active; /* FIXME: better way for this? gtk needs a function for this.. */ + + gtk_object_set_data(GTK_OBJECT(menuitem), "toggling", GINT_TO_POINTER(TRUE)); +@@ -567,7 +567,7 @@ + g_return_if_fail(menuitem != NULL); + if (window == NULL) return; + +- gui_window_destroy(window->active); ++ gui_windowset_destroy(window->active); + } + + static void menu_settings_preferences(void) +@@ -657,7 +657,7 @@ + switch (channel->type) + { + case CHANNEL_TYPE_CHANNEL: +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(channel_submenu[2].widget), GTK_WIDGET_VISIBLE(WINDOW_GUI(CHANNEL_PARENT(channel))->nickscrollbox)); ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(channel_submenu[2].widget), GTK_WIDGET_VISIBLE(WINDOW_GUI(CHANNEL_PARENT(channel))->windowset->nickscrollbox)); + break; + + case CHANNEL_TYPE_QUERY: +Only in irssi-0.7.11-new/src/gui-gnome: window-menus.o +diff -ru irssi-0.7.11/src/gui-gnome/window-nicklist.c irssi-0.7.11-new/src/gui-gnome/window-nicklist.c +--- irssi-0.7.11/src/gui-gnome/window-nicklist.c Thu May 13 15:15:09 1999 ++++ irssi-0.7.11-new/src/gui-gnome/window-nicklist.c Mon Jun 7 19:11:02 1999 +@@ -93,7 +93,7 @@ + g_return_if_fail(nick != NULL); + + if (CHANNEL_PARENT(channel)->active != channel) return; +- gui = WINDOW_GUI(CHANNEL_PARENT(channel)); ++ gui = WINDOW_GUI(CHANNEL_PARENT(channel))->windowset; + + list = GTK_CLIST(gui->nicklist)->row_list; + for (row = 0; list != NULL; row++, list = list->next) +@@ -130,9 +130,9 @@ + window = CHANNEL_PARENT(channel); + if (window->active != channel) return; + +- row = gtk_clist_find_row_from_data(GTK_CLIST(WINDOW_GUI(window)->nicklist), nick); ++ row = gtk_clist_find_row_from_data(GTK_CLIST(WINDOW_GUI(window)->windowset->nicklist), nick); + if (row != -1) +- gtk_clist_remove(GTK_CLIST(WINDOW_GUI(window)->nicklist), row); ++ gtk_clist_remove(GTK_CLIST(WINDOW_GUI(window)->windowset->nicklist), row); + } + + void window_nicklist_redraw(CHANNEL_REC *channel) +@@ -141,7 +141,7 @@ + GList *tmp; + + if (CHANNEL_PARENT(channel)->active != channel) return; +- gui = WINDOW_GUI(CHANNEL_PARENT(channel)); ++ gui = WINDOW_GUI(CHANNEL_PARENT(channel))->windowset; + + gtk_clist_freeze(GTK_CLIST(gui->nicklist)); + gtk_clist_clear(GTK_CLIST(gui->nicklist)); +@@ -443,7 +443,7 @@ + g_return_val_if_fail(window != NULL, FALSE); + + /* create op and voice pixmaps */ +- gui = WINDOW_GUI(window); ++ gui = WINDOW_GUI(window)->windowset; + gtk_widget_realize(gui->window); + gui->op_pixmap = gdk_pixmap_create_from_xpm_d(gui->window->window, &gui->op_mask, NULL, op_xpm); + gui->voice_pixmap = gdk_pixmap_create_from_xpm_d(gui->window->window, &gui->voice_mask, NULL, voice_xpm); +@@ -477,7 +477,7 @@ + + chanrec = channel_find(server, channel); + if (chanrec != NULL && !server->names_coming) +- gtk_clist_freeze(GTK_CLIST(WINDOW_GUI(CHANNEL_PARENT(chanrec))->nicklist)); ++ gtk_clist_freeze(GTK_CLIST(WINDOW_GUI(CHANNEL_PARENT(chanrec))->windowset->nicklist)); + + g_free(params); + return TRUE; +@@ -494,7 +494,7 @@ + + chanrec = channel_find(server, channel); + if (chanrec != NULL) +- gtk_clist_thaw(GTK_CLIST(WINDOW_GUI(CHANNEL_PARENT(chanrec))->nicklist)); ++ gtk_clist_thaw(GTK_CLIST(WINDOW_GUI(CHANNEL_PARENT(chanrec))->windowset->nicklist)); + + g_free(params); + return TRUE; +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windowset.c irssi-0.7.11-new/src/gui-gnome/gui-windowset.c +--- irssi-0.7.11/src/gui-gnome/gui-windowset.c Thu Jan 1 02:00:00 1970 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windowset.c Sat Jun 12 17:39:10 1999 +@@ -0,0 +1,385 @@ ++/* ++ gui-windowset.c : irssi ++ ++ Copyright (C) 1999 Timo Sirainen ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++*/ ++ ++#include "irssi.h" ++ ++static gchar mode_flags[] = "spmint"; ++static gchar *mode_tooltips[] = ++{ ++ N_("Secret"), ++ N_("Private"), ++ N_("Moderated"), ++ N_("Joining needs an invitation"), ++ N_("No external messages"), ++ N_("Only operators can change the topic") ++}; ++ ++static gint sig_topicentry_press(GtkWidget *entry, GdkEventButton *event) ++{ ++ gboolean editable; ++ ++ g_return_val_if_fail(entry != NULL, 0); ++ g_return_val_if_fail(event != NULL, 0); ++ ++ if (event->type == GDK_2BUTTON_PRESS) ++ { ++ editable = !(gboolean) GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(entry), "editable")); ++ gtk_object_set_data(GTK_OBJECT(entry), "editable", GINT_TO_POINTER((gint) editable)); ++ gtk_entry_set_editable(GTK_ENTRY(entry), editable); ++ } ++ ++ return 0; ++} ++ ++static void sig_topicentry_activated(GtkWidget *entry, WINDOW_REC *window) ++{ ++ CHANNEL_REC *channel; ++ ++ g_return_if_fail(entry != NULL); ++ g_return_if_fail(window != NULL); ++ ++ channel = window->active; ++ if (channel == NULL || (!channel->chanop && channel->mode_optopic)) ++ { ++ /* can't change topic. */ ++ gtk_entry_set_text(GTK_ENTRY(entry), ++ (channel == NULL || channel->topic == NULL) ? ++ "" : channel->topic); ++ return; ++ } ++ ++ signal_emit("command topic", 3, gtk_entry_get_text(GTK_ENTRY(entry)), ++ window->active->server, window->active); ++} ++ ++static void sig_modebutton_toggled(GtkToggleButton *button, gint mode) ++{ ++ WINDOW_REC *window; ++ NICK_REC *nick; ++ GString *str; ++ ++ g_return_if_fail(button != NULL); ++ if (gtk_object_get_data(GTK_OBJECT(button), "toggling")) return; ++ ++ window = gtk_object_get_data(GTK_OBJECT(button), "window"); ++ g_return_if_fail(window->active != NULL); ++ ++ nick = nicklist_find(window->active, window->active->server->nick); ++ if (!window->active->chanop) ++ { ++ /* can't change mode */ ++ gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(TRUE)); ++ gtk_toggle_button_set_active(button, !button->active); ++ gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(FALSE)); ++ return; ++ } ++ ++ str = g_string_new(NULL); ++ g_string_sprintf(str, "* %c%c", button->active ? '+' : '-', mode_flags[mode]); ++ ++ gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(TRUE)); ++ signal_emit("command mode", 3, str->str, window->active->server, window->active); ++ g_string_free(str, TRUE); ++ gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(FALSE)); ++} ++ ++GUI_WINDOW_REC *gui_windowset_create(MAIN_WINDOW_REC *parent) ++{ ++ WINDOW_REC *rec; ++ GUI_WINDOW_REC *gui; ++ GUI_WINDOW_VIEW_REC *view; ++ GtkWidget *hbox, *label; ++ GtkTooltips *tooltips; ++ gint num; ++ ++ if (parent == NULL) parent = mainwindow_create(); ++ ++ rec = ui_window_create(); ++ g_return_val_if_fail(rec != NULL, NULL); ++ ++ gui = g_new0(GUI_WINDOW_REC, 1); ++ gui->parent = parent; ++ ++ if (parent->children == NULL) parent->active = gui; ++ parent->children = g_list_append(parent->children, gui); ++ ++ gui->window = gtk_vbox_new(FALSE, 2); ++ gtk_container_border_width(GTK_CONTAINER(gui->window), 2); ++ ++ /* Add channel topic and modes */ ++ gui->channelwidget = gtk_hbox_new(FALSE, 0); ++ gtk_box_pack_start(GTK_BOX(gui->window), gui->channelwidget, FALSE, FALSE, 0); ++ ++ gui->serverlabel = gtk_label_new(""); ++ gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->serverlabel, FALSE, FALSE, 0); ++ ++ gui->topicentry = gtk_entry_new(); ++ gtk_entry_set_editable(GTK_ENTRY(gui->topicentry), FALSE); ++ gtk_signal_connect(GTK_OBJECT(gui->topicentry), "button_press_event", ++ GTK_SIGNAL_FUNC(sig_topicentry_press), rec); ++ gtk_signal_connect(GTK_OBJECT(gui->topicentry), "activate", ++ GTK_SIGNAL_FUNC(sig_topicentry_activated), rec); ++ gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->topicentry, TRUE, TRUE, 3); ++ ++ tooltips = gtk_tooltips_new(); ++ ++ for (num = 0; num < 6; num++) ++ { ++ gchar str[2]; ++ ++ str[0] = toupper(mode_flags[num]); str[1] = '\0'; ++ gui->modebuttons[num] = gtk_toggle_button_new_with_label(str); ++ gtk_tooltips_set_tip(tooltips, gui->modebuttons[num], mode_tooltips[num], NULL); ++ gtk_widget_set_usize(gui->modebuttons[num], 20, -1); ++ gtk_object_set_data(GTK_OBJECT(gui->modebuttons[num]), "window", rec); ++ gtk_signal_connect(GTK_OBJECT(gui->modebuttons[num]), "toggled", ++ GTK_SIGNAL_FUNC(sig_modebutton_toggled), GINT_TO_POINTER(num)); ++ gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->modebuttons[num], FALSE, FALSE, 0); ++ } ++ ++ /* create view for window */ ++ hbox = gtk_hbox_new(FALSE, 3); ++ gtk_box_pack_start(GTK_BOX(gui->window), hbox, TRUE, TRUE, 0); ++ ++ view = gui_window_view_create(rec, gui, hbox); ++ gui->active = view; ++ ++ gtk_widget_show_all(gui->window); ++ ++ /* Add nick list */ ++ gui->nickscrollbox = gtk_scrolled_window_new(NULL, NULL); ++ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gui->nickscrollbox), ++ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); ++ gtk_box_pack_start(GTK_BOX(hbox), gui->nickscrollbox, FALSE, FALSE, 0); ++ ++ gui->nicklist = gtk_clist_new(1); ++ gtk_container_add(GTK_CONTAINER(gui->nickscrollbox), gui->nicklist); ++ gtk_widget_show(gui->nicklist); ++ ++ gtk_widget_set_usize(gui->nickscrollbox, 120, -1); ++ ++ label = gtk_label_new(_("(none)")); ++ gtk_widget_show(label); ++ ++ if (g_list_first(parent->children)->next == NULL) ++ { ++ /* only one child, don't show the notebook tabs.. */ ++ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), FALSE); ++ gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), FALSE); ++ } ++ else if (g_list_first(parent->children)->next->next == NULL) ++ { ++ /* two children, show the notebook tabs.. */ ++ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), TRUE); ++ gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), TRUE); ++ } ++ ++ gtk_notebook_append_page(GTK_NOTEBOOK(parent->notebook), gui->window, label); ++ ++ gtk_widget_hide(gui->channelwidget); ++ ++ signal_emit("gui window created", 1, rec); ++ return gui; ++} ++ ++void gui_windowset_destroy(GUI_WINDOW_REC *window) ++{ ++ MAIN_WINDOW_REC *parent; ++ gint page; ++ ++ g_return_if_fail(window != NULL); ++ ++ if (window->destroying) return; ++ ++ parent = window->parent; ++ parent->children = g_list_remove(parent->children, window); ++ ++ signal_emit("gui window destroyed", 1, window); ++ ++ window->destroying = TRUE; ++ ++ page = gtk_notebook_page_num(GTK_NOTEBOOK(parent->notebook), window->window); ++ gtk_notebook_remove_page(GTK_NOTEBOOK(parent->notebook), page); ++ ++ while (window->views != NULL) ++ gui_window_view_destroy(window->views->data); ++ ++ g_free(window); ++ ++ if (parent->children == NULL) ++ mainwindow_destroy(parent); ++ else if (g_list_length(parent->children) == 1) ++ { ++ /* only one child left, hide the notebook tabs.. */ ++ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), FALSE); ++ gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), FALSE); ++ } ++} ++ ++static gboolean gui_window_server_changed(WINDOW_REC *window) ++{ ++ MAIN_WINDOW_REC *parent; ++ SERVER_REC *server; ++ gint num; ++ ++ g_return_val_if_fail(window != NULL, FALSE); ++ ++ parent = WINDOW_GUI(window)->parent; ++ server = window->active->server; ++ ++ if (parent->usermodes[0] == NULL) return TRUE; ++ ++ for (num = 0; num < 4; num++) ++ gtk_object_set_data(GTK_OBJECT(parent->usermodes[num]), "toggling", GINT_TO_POINTER(TRUE)); ++ ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[0]), ++ server == NULL ? FALSE : server->usermode_away); ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[1]), ++ server == NULL ? FALSE : server->usermode_invisible); ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[2]), ++ server == NULL ? FALSE : server->usermode_wallops); ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[3]), ++ server == NULL ? FALSE : server->usermode_servernotes); ++ ++ for (num = 0; num < 4; num++) ++ gtk_object_set_data(GTK_OBJECT(parent->usermodes[num]), "toggling", GINT_TO_POINTER(FALSE)); ++ ++ return TRUE; ++} ++ ++static gboolean gui_windows_usermode_changed(SERVER_REC *server) ++{ ++ GList *winlist; ++ ++ for (winlist = g_list_first(mainwindows); winlist != NULL; winlist = winlist->next) ++ { ++ MAIN_WINDOW_REC *rec = winlist->data; ++ ++ if (server == rec->active->active->window->active->server) ++ signal_emit("window server changed", 1, rec->active); ++ } ++ ++ return TRUE; ++} ++ ++static gboolean signal_window_focused(WINDOW_REC *window) ++{ ++ MAIN_WINDOW_REC *mainwindow; ++ GUI_WINDOW_REC *gui; ++ CHANNEL_REC *channel; ++ ++ g_return_val_if_fail(window != NULL, FALSE); ++ ++ mainwindow = WINDOW_GUI(window)->parent; ++ channel = window->active; ++ ++ gui = mainwindow->active; ++ ++ /* remove old extra menus */ ++ if (mainwindow->extramenu != NULL) ++ { ++ window_menus_remove(mainwindow, mainwindow->extramenu); ++ g_free(mainwindow->extramenu); ++ mainwindow->extramenu = NULL; ++ } ++ if (channel == NULL) return TRUE; ++ ++ if (channel->type == CHANNEL_TYPE_CHANNEL) ++ { ++ /* Add channel menu */ ++ mainwindow->extramenu = g_strdup(channel_menu[0].label); ++ window_menus_insert(mainwindow, NULL, channel_menu, channel); ++ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(channel_submenu[2].widget), ++ GTK_WIDGET_VISIBLE(gui->nickscrollbox)); ++ gtk_widget_show(gui->channelwidget); ++ } ++ else ++ { ++ gtk_widget_hide(gui->nickscrollbox); ++ gtk_widget_hide(gui->channelwidget); ++ if (channel->type == CHANNEL_TYPE_QUERY) ++ { ++ /* Add query menu */ ++ mainwindow->extramenu = g_strdup(query_menu[0].label); ++ window_menus_insert(mainwindow, NULL, query_menu, channel); ++ } ++ } ++ ++ if (CHANNEL_GUI(channel)->servermenu) ++ { ++ /* change server selection */ ++ gtk_option_menu_set_history(GTK_OPTION_MENU(mainwindow->servermenu), ++ g_list_index(servers, channel->server)); ++ gtk_widget_show(mainwindow->servermenu); ++ } ++ else ++ gtk_widget_hide(mainwindow->servermenu); ++ ++ /* draw title bar */ ++ signal_emit("channel topic changed", 1, window->active); ++ ++ return TRUE; ++} ++ ++static gboolean gui_server_looking(SERVER_REC *server) ++{ ++ GList *tmp, *sub; ++ ++ g_return_val_if_fail(server != NULL, FALSE); ++ ++ /* try to keep some server assigned to server menus.. */ ++ for (tmp = g_list_first(windows); tmp != NULL; tmp = tmp->next) ++ { ++ WINDOW_REC *win = tmp->data; ++ gboolean changed; ++ ++ changed = FALSE; ++ for (sub = g_list_first(win->channels); sub != NULL; sub = sub->next) ++ { ++ CHANNEL_REC *chan = sub->data; ++ ++ if (chan->server == NULL) ++ { ++ chan->server = server; ++ if (!changed) ++ signal_emit("window server changed", 1, win); ++ changed = TRUE; ++ } ++ } ++ } ++ ++ return TRUE; ++} ++ ++void gui_windowset_init(void) ++{ ++ signal_add("user mode changed", (SIGNAL_FUNC) gui_windows_usermode_changed); ++ signal_add("window server changed", (SIGNAL_FUNC) gui_window_server_changed); ++ signal_add("window focused", (SIGNAL_FUNC) signal_window_focused); ++ signal_add("server looking", (SIGNAL_FUNC) gui_server_looking); ++} ++ ++void gui_windowset_deinit(void) ++{ ++ signal_remove("user mode changed", (SIGNAL_FUNC) gui_windows_usermode_changed); ++ signal_remove("window server changed", (SIGNAL_FUNC) gui_window_server_changed); ++ signal_remove("window focused", (SIGNAL_FUNC) signal_window_focused); ++ signal_remove("server looking", (SIGNAL_FUNC) gui_server_looking); ++} +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windowset.h irssi-0.7.11-new/src/gui-gnome/gui-windowset.h +--- irssi-0.7.11/src/gui-gnome/gui-windowset.h Thu Jan 1 02:00:00 1970 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windowset.h Sat Jun 12 17:22:55 1999 +@@ -0,0 +1,32 @@ ++#ifndef __GUI_WINDOWSET_H ++#define __GUI_WINDOWSET_H ++ ++struct _GUI_WINDOW_REC ++{ ++ MAIN_WINDOW_REC *parent; ++ ++ GtkWidget *window; ++ GList *views; ++ GUI_WINDOW_VIEW_REC *active; ++ ++ GtkWidget *channelwidget; ++ GtkWidget *serverlabel; ++ GtkWidget *topicentry; ++ GtkWidget *modebuttons[6]; ++ ++ /* nicklist */ ++ GtkWidget *nickscrollbox; ++ GtkWidget *nicklist; ++ GdkPixmap *op_pixmap, *voice_pixmap; ++ GdkBitmap *op_mask, *voice_mask; ++ ++ gboolean destroying; ++}; ++ ++void gui_windowset_init(void); ++void gui_windowset_deinit(void); ++ ++GUI_WINDOW_REC *gui_windowset_create(MAIN_WINDOW_REC *parent); ++void gui_windowset_destroy(GUI_WINDOW_REC *window); ++ ++#endif +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windows-view.c irssi-0.7.11-new/src/gui-gnome/gui-windows-view.c +--- irssi-0.7.11/src/gui-gnome/gui-windows-view.c Thu Jan 1 02:00:00 1970 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windows-view.c Sat Jun 12 17:16:29 1999 +@@ -0,0 +1,454 @@ ++/* ++ gui-windows-view.c : irssi ++ ++ Copyright (C) 1999 Timo Sirainen ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++*/ ++ ++#include "irssi.h" ++ ++#define iswordcut(a) (isspace((gint) a) || \ ++ (a) == '\n' || (a) == '\0' || (a) == '"' || \ ++ (a) == '(' || (a) == ')' || (a) == '[' || (a) == ']' || \ ++ (a) == '<' || (a) == '>') ++ ++#define URL_MAX_LENGTH 200 /*FIXME: no max. limits*/ ++ ++GList *window_views; ++ ++void gui_window_view_set_background_pixmap(GUI_WINDOW_VIEW_REC *view, gchar *path) ++{ ++ GtkStyle *style; ++ GdkPixmap *pixmap; ++ GdkBitmap *mask; ++#if defined (HAVE_IMLIB) || defined (HAVE_GNOME) ++ GdkImlibImage *img; ++#endif ++ ++ g_return_if_fail(view != NULL); ++ g_return_if_fail(path != NULL); ++ ++ if (view->pixmap != NULL && strcmp(view->pixmap, path) == 0) ++ { ++ /* same pixmap already set for this view.. */ ++ return; ++ } ++ if (view->pixmap != NULL) ++ g_free(view->pixmap); ++ view->pixmap = g_strdup(path); ++ ++#ifdef HAVE_GNOME ++ if (view->zvt) ++ { ++ zvt_term_set_background(ZVT_TERM(view->text), path, FALSE, FALSE); ++ return; ++ } ++#endif ++ ++ if (*path == '\0') ++ pixmap = NULL; ++ else ++ { ++#if defined (HAVE_IMLIB) || defined (HAVE_GNOME) ++ mask = NULL; ++ img = gdk_imlib_load_image(path); ++ if (img == NULL) ++ pixmap = NULL; ++ else ++ { ++ gdk_imlib_render(img, img->rgb_width, img->rgb_height); ++ pixmap = gdk_imlib_move_image(img); ++ gdk_imlib_destroy_image(img); ++ } ++#else ++ pixmap = gdk_pixmap_create_from_xpm(view->text->window, &mask, NULL, path); ++#endif ++ } ++ ++ style = gtk_style_copy(view->text->style); ++ gtk_style_ref(style); ++ style->bg_pixmap[GTK_STATE_NORMAL] = pixmap; ++ gtk_widget_set_style(view->text, style); ++ gtk_style_unref(style); ++} ++ ++static void gui_window_view_set_background(GUI_WINDOW_VIEW_REC *view) ++{ ++ GtkStyle *style; ++ gchar *path; ++ ++ g_return_if_fail(view != NULL); ++ ++#ifdef HAVE_GNOME ++ if (view->zvt) ++ { ++ if (toggle_use_transparency) ++ { ++ zvt_term_set_background(ZVT_TERM(view->text), 0, TRUE, toggle_shaded_transparency); ++ if (view->pixmap != NULL) ++ { ++ g_free(view->pixmap); ++ view->pixmap = NULL; ++ } ++ return; ++ } ++ } ++ else ++#endif ++ { ++ style = gtk_style_copy(view->text->style); ++ gtk_style_ref(style); ++ style->base[GTK_STATE_NORMAL] = bg_color;; ++ gtk_widget_set_style(view->text, style); ++ gtk_style_unref(style); ++ } ++ ++ path = convert_home(background_pixmap); ++ gui_window_view_set_background_pixmap(view, path); ++ g_free(path); ++} ++ ++static void init_colors(GtkWidget *window) ++{ ++ gint n; ++ ++ g_return_if_fail(window != NULL); ++ ++ for (n = 0; n < sizeof(setup_colors)/sizeof(setup_colors[0]); n++) ++ { ++ setup_colors[n].pixel = ++ (gulong)((setup_colors[n].red & 0xff00)*256 + ++ (setup_colors[n].green & 0xff00) + ++ (setup_colors[n].blue & 0xff00)/256); ++ gdk_color_alloc(gtk_widget_get_colormap(window), &setup_colors[n]); ++ } ++ ++ bg_color.pixel = ++ (gulong)((bg_color.red & 0xff00)*256 + ++ (bg_color.green & 0xff00) + ++ (bg_color.blue & 0xff00)/256); ++ gdk_color_alloc(gtk_widget_get_colormap(window), &bg_color); ++} ++ ++#ifdef HAVE_GNOME ++static void init_zvt_colors(ZvtTerm *zvt) ++{ ++ static gchar ansitab[16] = { 0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15 }; ++ gushort zvt_red[18], zvt_green[18], zvt_blue[18]; ++ gint num; ++ ++ for (num = 0; num < 16; num++) ++ { ++ zvt_red[num] = (gushort) setup_colors[(gint) ansitab[num]].red; ++ zvt_green[num] = (gushort) setup_colors[(gint) ansitab[num]].green; ++ zvt_blue[num] = (gushort) setup_colors[(gint) ansitab[num]].blue; ++ } ++ ++ zvt_red[16] = zvt_green[16] = zvt_blue[16] = 0xffff; ++ zvt_red[17] = zvt_green[17] = zvt_blue[17] = 0; ++ ++ zvt_term_set_color_scheme(zvt, zvt_red, zvt_green, zvt_blue); ++} ++ ++/* signal: button pressed in text window */ ++static gint sig_text_butpress_zvt(GtkWidget *widget, GdkEventButton *event, WINDOW_REC *window) ++{ ++ gint x, y, len; ++ gchar *text, *word; ++ ++ g_return_val_if_fail(widget != NULL, 0); ++ g_return_val_if_fail(event != NULL, 0); ++ g_return_val_if_fail(window != NULL, 0); ++ ++ x = event->x / ZVT_TERM(widget)->charwidth; ++ y = event->y / ZVT_TERM(widget)->charheight; ++ ++ word = NULL; ++ ++ text = zvt_term_get_buffer(ZVT_TERM(widget), &len, VT_SELTYPE_CHAR, ++ 0, y, ZVT_TERM(widget)->grid_width-1, y); ++ if (text != NULL && len > 0) ++ { ++ len = x; ++ if (!iswordcut(text[x])) ++ while (x > 0 && !iswordcut(text[x-1])) x--; ++ while (!iswordcut(text[len])) len++; len -= x; ++ ++ word = g_new(gchar, len+1); ++ memcpy(word, text+x, len); word[len] = '\0'; ++ } ++ ++ if (event->button == 3 && toggle_show_menubar) ++ { ++ /* create popup menu */ ++ window_popupmenu_create(window->active, word, event); ++ gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); ++ } ++ else if (word != NULL) ++ { ++ /* left mouse button clicked */ ++ word_clicked(window, word, event->type == GDK_2BUTTON_PRESS, event->button, NULL); ++ } ++ ++ if (word != NULL) g_free(word); ++ return 0; ++} ++#endif ++ ++/* signal: button pressed in text window */ ++static gint sig_text_butpress(GtkWidget *widget, GdkEventButton *event, GUI_WINDOW_VIEW_REC *view) ++{ ++ static gboolean cludging = FALSE; ++ GdkEventButton kludge_event; ++ ++ guint pos, spos, len; ++ gchar *text, *word; ++ ++ g_return_val_if_fail(widget != NULL, 0); ++ g_return_val_if_fail(event != NULL, 0); ++ g_return_val_if_fail(view != NULL, 0); ++ ++ /* so, here's the problem: we need know what word was just clicked, but ++ text widget haven't get button_press_event yet so cursor position is ++ still in the last clicked position.. We could use ++ gtk_signal_connect_after(), but if we create a popup menu with it, ++ text widget's selection gets broken, it never receives the ++ button_release_event .. We could also create the popup menu in ++ button_release_event but it seems to work in some weird way too .. ++ So this kludge seems to work best. */ ++ if (cludging) return 0; ++ ++ /* send faked left button click to text widget */ ++ cludging = TRUE; ++ memcpy(&kludge_event, event, sizeof(kludge_event)); ++ kludge_event.button = 1; ++ kludge_event.type = GDK_BUTTON_PRESS; ++ gtk_widget_event(widget, (GdkEvent *) &kludge_event); ++ kludge_event.type = GDK_BUTTON_RELEASE; ++ gtk_widget_event(widget, (GdkEvent *) &kludge_event); ++ cludging = FALSE; ++ ++ /* finished, cursor is now in right position! */ ++ ++ len = gtk_text_get_length(GTK_TEXT(view->text)); ++ pos = gtk_editable_get_position(GTK_EDITABLE(view->text)); ++ ++ word = NULL; ++ if (pos < len) ++ { ++ text = gtk_editable_get_chars(GTK_EDITABLE(view->text), pos < URL_MAX_LENGTH ? 0 : pos-URL_MAX_LENGTH, ++ pos+URL_MAX_LENGTH > len ? len : pos+URL_MAX_LENGTH); ++ len = spos = pos < URL_MAX_LENGTH ? pos : URL_MAX_LENGTH; ++ if (!iswordcut(text[spos])) ++ while (spos > 0 && !iswordcut(text[spos-1])) spos--; ++ while (!iswordcut(text[len])) len++; len -= spos; ++ ++ word = g_new(gchar, len+1); ++ memcpy(word, text+spos, len); word[len] = '\0'; ++ g_free(text); ++ } ++ ++ if (event->button == 3 && toggle_show_menubar) ++ { ++ /* create popup menu */ ++ window_popupmenu_create(view->window->active, word, event); ++ gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); ++ } ++ else if (word != NULL) ++ { ++ /* left mouse button clicked */ ++ word_clicked(view->window, word, event->type == GDK_2BUTTON_PRESS, event->button, NULL); ++ } ++ ++ if (word != NULL) g_free(word); ++ return 0; ++} ++ ++GUI_WINDOW_VIEW_REC *gui_window_view_create(WINDOW_REC *window, GUI_WINDOW_REC *parent, GtkWidget *box) ++{ ++ GUI_WINDOW_VIEW_REC *rec; ++ GtkWidget *scrollwin; ++ ++ g_return_val_if_fail(parent != NULL, NULL); ++ ++ rec = g_new0(GUI_WINDOW_VIEW_REC, 1); ++ parent->views = g_list_append(parent->views, rec); ++ window_views = g_list_append(window_views, rec); ++ window->gui_data = rec; ++ ++ rec->window = window; ++ rec->windowset = parent; ++ rec->parent = parent->parent;; ++ ++ /* Text window */ ++ rec->zvt = toggle_use_zvt; ++#ifdef HAVE_GNOME ++ if (toggle_use_zvt) ++ { ++ GtkWidget *scrollbar; ++ ++ rec->text = zvt_term_new(); ++ gtk_signal_connect(GTK_OBJECT(rec->text), "button_press_event", ++ GTK_SIGNAL_FUNC(sig_text_butpress_zvt), window); ++ zvt_term_set_scrollback(ZVT_TERM(rec->text), max_textwidget_lines); ++ zvt_term_set_fonts(ZVT_TERM(rec->text), font_normal, font_bold); ++ zvt_term_set_blink(ZVT_TERM(rec->text), FALSE); ++ gtk_box_pack_start(GTK_BOX(box), rec->text, TRUE, TRUE, 0); ++ ++ scrollbar = gtk_vscrollbar_new(ZVT_TERM(rec->text)->adjustment); ++ gtk_box_pack_start(GTK_BOX(box), scrollbar, FALSE, FALSE, 0); ++ } ++ else ++#endif ++ { ++ rec->text = gtk_text_new(NULL, NULL); ++ gtk_signal_connect(GTK_OBJECT(rec->text), "button_press_event", ++ GTK_SIGNAL_FUNC(sig_text_butpress), rec); ++ gtk_text_set_word_wrap(GTK_TEXT(rec->text), TRUE); ++ ++ scrollwin = gtk_scrolled_window_new(NULL, NULL); ++ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), ++ GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); ++ gtk_box_pack_start(GTK_BOX(box), scrollwin, TRUE, TRUE, 0); ++ gtk_container_add(GTK_CONTAINER(scrollwin), rec->text); ++ ++ init_colors(rec->text); ++ } ++ ++ gui_window_view_set_background(rec); ++ return rec; ++} ++ ++static gboolean gui_window_created(WINDOW_REC *window) ++{ ++ GUI_WINDOW_VIEW_REC *view; ++ GtkWidget *popup; ++ ++ g_return_val_if_fail(window != NULL, TRUE); ++ ++ /* there's only one view after window is created.. */ ++ view = WINDOW_GUI(window); ++ ++#ifdef HAVE_GNOME ++ if (view->zvt) ++ { ++ gtk_widget_realize(view->text); ++ init_zvt_colors(ZVT_TERM(view->text)); ++ vt_cursor_state(view->text, 0); ++ } ++#endif ++ ++ if (!toggle_show_menubar) ++ { ++ /* add popup menu created by mainwindow */ ++ popup = gtk_object_get_data(GTK_OBJECT(WINDOW_GUI(window)->parent->window), "popup"); ++ if (popup != NULL) gnome_popup_menu_attach(popup, view->text, view->parent); ++ } ++ ++ return TRUE; ++} ++ ++void gui_window_view_destroy(GUI_WINDOW_VIEW_REC *view) ++{ ++ WINDOW_REC *window; ++ GUI_WINDOW_REC *gui; ++ ++ if (view->destroying) return; ++ ++ window = view->window; ++ gui = view->windowset; ++ signal_emit("gui window view destroyed", 1, view); ++ ++ view->destroying = TRUE; ++ ui_window_destroy(window); ++ ++ gui->views = g_list_remove(gui->views, view); ++ window_views = g_list_remove(window_views, view); ++ ++ if (view->pixmap != NULL) g_free(view->pixmap); ++ g_list_free(view->linepos); ++ g_free(view); ++ ++ window->gui_data = NULL; ++ ++ if (gui->views == NULL) ++ gui_windowset_destroy(gui); ++} ++ ++static gboolean cmd_clear(gchar *data, SERVER_REC *server, CHANNEL_REC *channel) ++{ ++ WINDOW_REC *window; ++ GUI_WINDOW_VIEW_REC *view; ++ ++ g_return_val_if_fail(channel != NULL, FALSE); ++ ++ window = CHANNEL_PARENT(channel); ++ view = WINDOW_GUI(window); ++ ++#ifdef HAVE_GNOME ++ if (view->zvt) ++ { ++ zvt_term_set_scrollback(ZVT_TERM(view->text), 0); ++ zvt_term_feed(ZVT_TERM(view->text), "\033[H\033[2J", 7); ++ zvt_term_set_scrollback(ZVT_TERM(view->text), max_textwidget_lines); ++ } ++ else ++#endif ++ { ++ g_list_free(view->linepos); ++ view->linepos = NULL; ++ gtk_text_set_point(GTK_TEXT(view->text), 0); ++ gtk_text_forward_delete(GTK_TEXT(view->text), gtk_text_get_length(GTK_TEXT(view->text))); ++ } ++ window->lines = 0; ++ ++ return TRUE; ++} ++ ++static gboolean setup_changed(void) ++{ ++ GList *tmp; ++ ++ for (tmp = g_list_first(window_views); tmp != NULL; tmp = tmp->next) ++ { ++ GUI_WINDOW_VIEW_REC *view = tmp->data; ++ ++ gui_window_view_set_background(view); ++#ifdef HAVE_GNOME ++ if (view->zvt) ++ { ++ zvt_term_set_fonts(ZVT_TERM(view->text), font_normal, font_bold); ++ init_zvt_colors(ZVT_TERM(view->text)); ++ } ++#endif ++ } ++ ++ return TRUE; ++} ++ ++void gui_windows_view_init(void) ++{ ++ signal_add("gui window created", (SIGNAL_FUNC) gui_window_created); ++ signal_add("setup changed", (SIGNAL_FUNC) setup_changed); ++ signal_add("command clear", (SIGNAL_FUNC) cmd_clear); ++} ++ ++void gui_windows_view_deinit(void) ++{ ++ signal_remove("gui window created", (SIGNAL_FUNC) gui_window_created); ++ signal_remove("setup changed", (SIGNAL_FUNC) setup_changed); ++ signal_remove("command clear", (SIGNAL_FUNC) cmd_clear); ++} +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windows-view.h irssi-0.7.11-new/src/gui-gnome/gui-windows-view.h +--- irssi-0.7.11/src/gui-gnome/gui-windows-view.h Thu Jan 1 02:00:00 1970 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windows-view.h Sat Jun 12 17:23:39 1999 +@@ -0,0 +1,34 @@ ++#ifndef __GUI_WINDOWS_VIEW_H ++#define __GUI_WINDOWS_VIEW_H ++ ++#define WINDOW_GUI(a) ((GUI_WINDOW_VIEW_REC *) ((a)->gui_data)) ++ ++struct _GUI_WINDOW_VIEW_REC ++{ ++ WINDOW_REC *window; ++ GUI_WINDOW_REC *windowset; ++ MAIN_WINDOW_REC *parent; ++ ++ GtkWidget *text; ++ ++ gboolean zvt; /* text is a zvt widget */ ++ gchar *pixmap; /* current background pixmap */ ++ ++ GList *linepos; ++ gint lastlinelen; ++ ++ GtkWidget *snapshot; ++ gboolean destroying; ++}; ++ ++extern GList *window_views; ++ ++void gui_windows_view_init(void); ++void gui_windows_view_deinit(void); ++ ++GUI_WINDOW_VIEW_REC *gui_window_view_create(WINDOW_REC *window, GUI_WINDOW_REC *parent, GtkWidget *box); ++void gui_window_view_destroy(GUI_WINDOW_VIEW_REC *view); ++ ++void gui_window_view_set_background_pixmap(GUI_WINDOW_VIEW_REC *view, gchar *path); ++ ++#endif +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windows.c irssi-0.7.11-new/src/gui-gnome/gui-windows.c +--- irssi-0.7.11/src/gui-gnome/gui-windows.c Sat May 15 21:38:30 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windows.c Thu Jan 1 02:00:00 1970 +@@ -1,750 +0,0 @@ +-/* +- gui-windows.c : irssi +- +- Copyright (C) 1999 Timo Sirainen +- +- This program is free software; you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation; either version 2 of the License, or +- (at your option) any later version. +- +- This program is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with this program; if not, write to the Free Software +- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-*/ +- +-#include "irssi.h" +- +-#define iswordcut(a) (isspace((gint) a) || \ +- (a) == '\n' || (a) == '\0' || (a) == '"' || \ +- (a) == '(' || (a) == ')' || (a) == '[' || (a) == ']' || \ +- (a) == '<' || (a) == '>') +- +-#define URL_MAX_LENGTH 200 /*FIXME: no max. limits*/ +- +-static gchar mode_flags[] = "spmint"; +-static gchar *mode_tooltips[] = +-{ +- N_("Secret"), +- N_("Private"), +- N_("Moderated"), +- N_("Joining needs an invitation"), +- N_("No external messages"), +- N_("Only operators can change the topic") +-}; +- +-static void init_colors(GtkWidget *window) +-{ +- gint n; +- +- g_return_if_fail(window != NULL); +- +- for (n = 0; n < sizeof(setup_colors)/sizeof(setup_colors[0]); n++) +- { +- setup_colors[n].pixel = +- (gulong)((setup_colors[n].red & 0xff00)*256 + +- (setup_colors[n].green & 0xff00) + +- (setup_colors[n].blue & 0xff00)/256); +- gdk_color_alloc(gtk_widget_get_colormap(window), &setup_colors[n]); +- } +- +- bg_color.pixel = +- (gulong)((bg_color.red & 0xff00)*256 + +- (bg_color.green & 0xff00) + +- (bg_color.blue & 0xff00)/256); +- gdk_color_alloc(gtk_widget_get_colormap(window), &bg_color); +-} +- +-void gui_window_set_background_pixmap(WINDOW_REC *window, gchar *path) +-{ +- GUI_WINDOW_REC *gui; +- GtkStyle *style; +- GdkPixmap *pixmap; +- GdkBitmap *mask; +-#if defined (HAVE_IMLIB) || defined (HAVE_GNOME) +- GdkImlibImage *img; +-#endif +- +- g_return_if_fail(window != NULL); +- g_return_if_fail(path != NULL); +- +- gui = WINDOW_GUI(window); +- if (gui->pixmap != NULL && strcmp(gui->pixmap, path) == 0) +- { +- /* same pixmap already set for this window.. */ +- return; +- } +- if (gui->pixmap != NULL) +- g_free(gui->pixmap); +- gui->pixmap = g_strdup(path); +- +-#ifdef HAVE_GNOME +- if (gui->zvt) +- { +- zvt_term_set_background(ZVT_TERM(gui->text), path, FALSE, FALSE); +- return; +- } +-#endif +- +- if (*path == '\0') +- pixmap = NULL; +- else +- { +-#if defined (HAVE_IMLIB) || defined (HAVE_GNOME) +- mask = NULL; +- img = gdk_imlib_load_image(path); +- if (img == NULL) +- pixmap = NULL; +- else +- { +- gdk_imlib_render(img, img->rgb_width, img->rgb_height); +- pixmap = gdk_imlib_move_image(img); +- gdk_imlib_destroy_image(img); +- } +-#else +- pixmap = gdk_pixmap_create_from_xpm(gui->text->window, &mask, NULL, path); +-#endif +- } +- +- style = gtk_style_copy(gui->text->style); +- gtk_style_ref(style); +- style->bg_pixmap[GTK_STATE_NORMAL] = pixmap; +- gtk_widget_set_style(gui->text, style); +- gtk_style_unref(style); +-} +- +-static void gui_window_set_background(WINDOW_REC *window) +-{ +- GUI_WINDOW_REC *gui; +- GtkStyle *style; +- gchar *path; +- +- g_return_if_fail(window != NULL); +- +- gui = WINDOW_GUI(window); +-#ifdef HAVE_GNOME +- if (gui->zvt) +- { +- if (toggle_use_transparency) +- { +- zvt_term_set_background(ZVT_TERM(gui->text), 0, TRUE, toggle_shaded_transparency); +- if (gui->pixmap != NULL) +- { +- g_free(gui->pixmap); +- gui->pixmap = NULL; +- } +- return; +- } +- } +- else +-#endif +- { +- style = gtk_style_copy(gui->text->style); +- gtk_style_ref(style); +- style->base[GTK_STATE_NORMAL] = bg_color;; +- gtk_widget_set_style(gui->text, style); +- gtk_style_unref(style); +- } +- +- path = convert_home(background_pixmap); +- gui_window_set_background_pixmap(window, path); +- g_free(path); +-} +- +-#ifdef HAVE_GNOME +-static void init_zvt_colors(ZvtTerm *zvt) +-{ +- static gchar ansitab[16] = { 0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15 }; +- gushort zvt_red[18], zvt_green[18], zvt_blue[18]; +- gint num; +- +- for (num = 0; num < 16; num++) +- { +- zvt_red[num] = (gushort) setup_colors[(gint) ansitab[num]].red; +- zvt_green[num] = (gushort) setup_colors[(gint) ansitab[num]].green; +- zvt_blue[num] = (gushort) setup_colors[(gint) ansitab[num]].blue; +- } +- +- zvt_red[16] = zvt_green[16] = zvt_blue[16] = 0xffff; +- zvt_red[17] = zvt_green[17] = zvt_blue[17] = 0; +- +- zvt_term_set_color_scheme(zvt, zvt_red, zvt_green, zvt_blue); +-} +- +-/* signal: button pressed in text window */ +-static gint sig_text_butpress_zvt(GtkWidget *widget, GdkEventButton *event, WINDOW_REC *window) +-{ +- gint x, y, len; +- gchar *text, *word; +- +- g_return_val_if_fail(widget != NULL, 0); +- g_return_val_if_fail(event != NULL, 0); +- g_return_val_if_fail(window != NULL, 0); +- +- x = event->x / ZVT_TERM(widget)->charwidth; +- y = event->y / ZVT_TERM(widget)->charheight; +- +- word = NULL; +- +- text = zvt_term_get_buffer(ZVT_TERM(widget), &len, VT_SELTYPE_CHAR, +- 0, y, ZVT_TERM(widget)->grid_width-1, y); +- if (text != NULL && len > 0) +- { +- len = x; +- if (!iswordcut(text[x])) +- while (x > 0 && !iswordcut(text[x-1])) x--; +- while (!iswordcut(text[len])) len++; len -= x; +- +- word = g_new(gchar, len+1); +- memcpy(word, text+x, len); word[len] = '\0'; +- } +- +- if (event->button == 3 && toggle_show_menubar) +- { +- /* create popup menu */ +- window_popupmenu_create(window->active, word, event); +- gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); +- } +- else if (word != NULL) +- { +- /* left mouse button clicked */ +- word_clicked(window, word, event->type == GDK_2BUTTON_PRESS, event->button, NULL); +- } +- +- if (word != NULL) g_free(word); +- return 0; +-} +-#endif +- +-/* signal: button pressed in text window */ +-static gint sig_text_butpress(GtkWidget *widget, GdkEventButton *event, WINDOW_REC *window) +-{ +- static gboolean cludging = FALSE; +- GdkEventButton kludge_event; +- +- guint pos, spos, len; +- gchar *text, *word; +- +- g_return_val_if_fail(widget != NULL, 0); +- g_return_val_if_fail(event != NULL, 0); +- g_return_val_if_fail(window != NULL, 0); +- +- /* so, here's the problem: we need know what word was just clicked, but +- text widget haven't get button_press_event yet so cursor position is +- still in the last clicked position.. We could use +- gtk_signal_connect_after(), but if we create a popup menu with it, +- text widget's selection gets broken, it never receives the +- button_release_event .. We could also create the popup menu in +- button_release_event but it seems to work in some weird way too .. +- So this kludge seems to work best. */ +- if (cludging) return 0; +- +- /* send faked left button click to text widget */ +- cludging = TRUE; +- memcpy(&kludge_event, event, sizeof(kludge_event)); +- kludge_event.button = 1; +- kludge_event.type = GDK_BUTTON_PRESS; +- gtk_widget_event(widget, (GdkEvent *) &kludge_event); +- kludge_event.type = GDK_BUTTON_RELEASE; +- gtk_widget_event(widget, (GdkEvent *) &kludge_event); +- cludging = FALSE; +- +- /* finished, cursor is now in right position! */ +- +- len = gtk_text_get_length(GTK_TEXT(WINDOW_GUI(window)->text)); +- pos = gtk_editable_get_position(GTK_EDITABLE(WINDOW_GUI(window)->text)); +- +- word = NULL; +- if (pos < len) +- { +- text = gtk_editable_get_chars(GTK_EDITABLE(WINDOW_GUI(window)->text), pos < URL_MAX_LENGTH ? 0 : pos-URL_MAX_LENGTH, +- pos+URL_MAX_LENGTH > len ? len : pos+URL_MAX_LENGTH); +- len = spos = pos < URL_MAX_LENGTH ? pos : URL_MAX_LENGTH; +- if (!iswordcut(text[spos])) +- while (spos > 0 && !iswordcut(text[spos-1])) spos--; +- while (!iswordcut(text[len])) len++; len -= spos; +- +- word = g_new(gchar, len+1); +- memcpy(word, text+spos, len); word[len] = '\0'; +- g_free(text); +- } +- +- if (event->button == 3 && toggle_show_menubar) +- { +- /* create popup menu */ +- window_popupmenu_create(window->active, word, event); +- gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); +- } +- else if (word != NULL) +- { +- /* left mouse button clicked */ +- word_clicked(window, word, event->type == GDK_2BUTTON_PRESS, event->button, NULL); +- } +- +- if (word != NULL) g_free(word); +- return 0; +-} +- +-static gint sig_topicentry_press(GtkWidget *entry, GdkEventButton *event) +-{ +- gboolean editable; +- +- g_return_val_if_fail(entry != NULL, 0); +- g_return_val_if_fail(event != NULL, 0); +- +- if (event->type == GDK_2BUTTON_PRESS) +- { +- editable = !(gboolean) GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(entry), "editable")); +- gtk_object_set_data(GTK_OBJECT(entry), "editable", GINT_TO_POINTER((gint) editable)); +- gtk_entry_set_editable(GTK_ENTRY(entry), editable); +- } +- +- return 0; +-} +- +-static void sig_topicentry_activated(GtkWidget *entry, WINDOW_REC *window) +-{ +- CHANNEL_REC *channel; +- +- g_return_if_fail(entry != NULL); +- g_return_if_fail(window != NULL); +- +- channel = window->active; +- if (channel == NULL || (!channel->chanop && channel->mode_optopic)) +- { +- /* can't change topic. */ +- gtk_entry_set_text(GTK_ENTRY(entry), +- (channel == NULL || channel->topic == NULL) ? +- "" : channel->topic); +- return; +- } +- +- signal_emit("command topic", 3, gtk_entry_get_text(GTK_ENTRY(entry)), +- window->active->server, window->active); +-} +- +-static void sig_modebutton_toggled(GtkToggleButton *button, gint mode) +-{ +- WINDOW_REC *window; +- NICK_REC *nick; +- GString *str; +- +- g_return_if_fail(button != NULL); +- if (gtk_object_get_data(GTK_OBJECT(button), "toggling")) return; +- +- window = gtk_object_get_data(GTK_OBJECT(button), "window"); +- g_return_if_fail(window->active != NULL); +- +- nick = nicklist_find(window->active, window->active->server->nick); +- if (!window->active->chanop) +- { +- /* can't change mode */ +- gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(TRUE)); +- gtk_toggle_button_set_active(button, !button->active); +- gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(FALSE)); +- return; +- } +- +- str = g_string_new(NULL); +- g_string_sprintf(str, "* %c%c", button->active ? '+' : '-', mode_flags[mode]); +- +- gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(TRUE)); +- signal_emit("command mode", 3, str->str, window->active->server, window->active); +- g_string_free(str, TRUE); +- gtk_object_set_data(GTK_OBJECT(button), "toggling", GINT_TO_POINTER(FALSE)); +-} +- +-WINDOW_REC *gui_window_create(MAIN_WINDOW_REC *parent) +-{ +- WINDOW_REC *rec; +- GUI_WINDOW_REC *gui; +- GtkWidget *hbox, *scrollwin, *label; +- GtkTooltips *tooltips; +- gint num; +- +- if (parent == NULL) parent = mainwindow_create(); +- +- rec = ui_window_create(); +- g_return_val_if_fail(rec != NULL, NULL); +- +- gui = g_new0(GUI_WINDOW_REC, 1); +- rec->gui_data = gui; +- gui->parent = parent; +- +- if (parent->children == NULL) parent->active = rec; +- parent->children = g_list_append(parent->children, rec); +- +- gui->window = gtk_vbox_new(FALSE, 2); +- gtk_container_border_width(GTK_CONTAINER(gui->window), 2); +- +- /* Add channel topic and modes */ +- gui->channelwidget = gtk_hbox_new(FALSE, 0); +- gtk_box_pack_start(GTK_BOX(gui->window), gui->channelwidget, FALSE, FALSE, 0); +- +- gui->serverlabel = gtk_label_new(""); +- gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->serverlabel, FALSE, FALSE, 0); +- +- gui->topicentry = gtk_entry_new(); +- gtk_entry_set_editable(GTK_ENTRY(gui->topicentry), FALSE); +- gtk_signal_connect(GTK_OBJECT(gui->topicentry), "button_press_event", +- GTK_SIGNAL_FUNC(sig_topicentry_press), rec); +- gtk_signal_connect(GTK_OBJECT(gui->topicentry), "activate", +- GTK_SIGNAL_FUNC(sig_topicentry_activated), rec); +- gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->topicentry, TRUE, TRUE, 3); +- +- tooltips = gtk_tooltips_new(); +- +- for (num = 0; num < 6; num++) +- { +- gchar str[2]; +- +- str[0] = toupper(mode_flags[num]); str[1] = '\0'; +- gui->modebuttons[num] = gtk_toggle_button_new_with_label(str); +- gtk_tooltips_set_tip(tooltips, gui->modebuttons[num], mode_tooltips[num], NULL); +- gtk_widget_set_usize(gui->modebuttons[num], 20, -1); +- gtk_object_set_data(GTK_OBJECT(gui->modebuttons[num]), "window", rec); +- gtk_signal_connect(GTK_OBJECT(gui->modebuttons[num]), "toggled", +- GTK_SIGNAL_FUNC(sig_modebutton_toggled), GINT_TO_POINTER(num)); +- gtk_box_pack_start(GTK_BOX(gui->channelwidget), gui->modebuttons[num], FALSE, FALSE, 0); +- } +- +- /* Text window */ +- hbox = gtk_hbox_new(FALSE, 3); +- gtk_box_pack_start(GTK_BOX(gui->window), hbox, TRUE, TRUE, 0); +- +- gui->zvt = toggle_use_zvt; +-#ifdef HAVE_GNOME +- if (toggle_use_zvt) +- { +- GtkWidget *scrollbar; +- +- gui->text = zvt_term_new(); +- gtk_signal_connect(GTK_OBJECT(gui->text), "button_press_event", +- GTK_SIGNAL_FUNC(sig_text_butpress_zvt), rec); +- zvt_term_set_scrollback(ZVT_TERM(gui->text), max_textwidget_lines); +- zvt_term_set_fonts(ZVT_TERM(gui->text), font_normal, font_bold); +- zvt_term_set_blink(ZVT_TERM(gui->text), FALSE); +- gtk_box_pack_start(GTK_BOX(hbox), gui->text, TRUE, TRUE, 0); +- +- scrollbar = gtk_vscrollbar_new(ZVT_TERM(gui->text)->adjustment); +- gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, FALSE, 0); +- } +- else +-#endif +- { +- gui->text = gtk_text_new(NULL, NULL); +- gtk_signal_connect(GTK_OBJECT(gui->text), "button_press_event", +- GTK_SIGNAL_FUNC(sig_text_butpress), rec); +- gtk_text_set_word_wrap(GTK_TEXT(gui->text), TRUE); +- +- scrollwin = gtk_scrolled_window_new(NULL, NULL); +- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), +- GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +- gtk_box_pack_start(GTK_BOX(hbox), scrollwin, TRUE, TRUE, 0); +- gtk_container_add(GTK_CONTAINER(scrollwin), gui->text); +- +- init_colors(gui->text); +- } +- gui_window_set_background(rec); +- +- gtk_widget_show_all(gui->window); +- +- /* Add nick list */ +- gui->nickscrollbox = gtk_scrolled_window_new(NULL, NULL); +- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gui->nickscrollbox), +- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); +- gtk_box_pack_start(GTK_BOX(hbox), gui->nickscrollbox, FALSE, FALSE, 0); +- +- gui->nicklist = gtk_clist_new(1); +- gtk_container_add(GTK_CONTAINER(gui->nickscrollbox), gui->nicklist); +- gtk_widget_show(gui->nicklist); +- +- gtk_widget_set_usize(gui->nickscrollbox, 120, -1); +- +- label = gtk_label_new(_("(none)")); +- gtk_widget_show(label); +- +- if (g_list_first(parent->children)->next == NULL) +- { +- /* only one child, don't show the notebook tabs.. */ +- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), FALSE); +- gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), FALSE); +- } +- else if (g_list_first(parent->children)->next->next == NULL) +- { +- /* two children, show the notebook tabs.. */ +- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), TRUE); +- gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), TRUE); +- } +- +- gtk_notebook_append_page(GTK_NOTEBOOK(parent->notebook), gui->window, label); +- +-#ifdef HAVE_GNOME +- if (gui->zvt) +- { +- gtk_widget_realize(gui->text); +- init_zvt_colors(ZVT_TERM(gui->text)); +- vt_cursor_state(gui->text, 0); +- } +-#endif +- +- if (!toggle_show_menubar) +- { +- GtkWidget *popup; +- +- /* add popup menu created by mainwindow */ +- popup = gtk_object_get_data(GTK_OBJECT(parent->window), "popup"); +- if (popup != NULL) gnome_popup_menu_attach(popup, gui->text, parent); +- } +- +- gtk_widget_hide(gui->channelwidget); +- +- signal_emit("gui window created", 1, rec); +- return rec; +-} +- +-void gui_window_destroy(WINDOW_REC *window) +-{ +- MAIN_WINDOW_REC *parent; +- GUI_WINDOW_REC *gui; +- gint page; +- +- g_return_if_fail(window != NULL); +- if (WINDOW_GUI(window)->destroying) return; +- +- gui = WINDOW_GUI(window); +- parent = gui->parent; +- parent->children = g_list_remove(parent->children, window); +- +- signal_emit("gui window destroyed", 1, window); +- +- gui->destroying = TRUE; +- ui_window_destroy(window); +- +- page = gtk_notebook_page_num(GTK_NOTEBOOK(parent->notebook), gui->window); +- gtk_notebook_remove_page(GTK_NOTEBOOK(parent->notebook), page); +- +- if (gui->pixmap != NULL) g_free(gui->pixmap); +- g_free(gui); +- window->gui_data = NULL; +- +- if (parent->children == NULL) +- mainwindow_destroy(parent); +- else if (g_list_length(parent->children) == 1) +- { +- /* only one child left, hide the notebook tabs.. */ +- gtk_notebook_set_show_tabs(GTK_NOTEBOOK(parent->notebook), FALSE); +- gtk_notebook_set_show_border(GTK_NOTEBOOK(parent->notebook), FALSE); +- } +-} +- +-static gboolean gui_window_server_changed(WINDOW_REC *window) +-{ +- MAIN_WINDOW_REC *parent; +- SERVER_REC *server; +- gint num; +- +- g_return_val_if_fail(window != NULL, FALSE); +- +- parent = WINDOW_GUI(window)->parent; +- server = window->active->server; +- +- if (parent->usermodes[0] == NULL) return TRUE; +- +- for (num = 0; num < 4; num++) +- gtk_object_set_data(GTK_OBJECT(parent->usermodes[num]), "toggling", GINT_TO_POINTER(TRUE)); +- +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[0]), +- server == NULL ? FALSE : server->usermode_away); +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[1]), +- server == NULL ? FALSE : server->usermode_invisible); +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[2]), +- server == NULL ? FALSE : server->usermode_wallops); +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(parent->usermodes[3]), +- server == NULL ? FALSE : server->usermode_servernotes); +- +- for (num = 0; num < 4; num++) +- gtk_object_set_data(GTK_OBJECT(parent->usermodes[num]), "toggling", GINT_TO_POINTER(FALSE)); +- +- return TRUE; +-} +- +-static gboolean gui_windows_usermode_changed(SERVER_REC *server) +-{ +- GList *winlist; +- +- for (winlist = g_list_first(mainwindows); winlist != NULL; winlist = winlist->next) +- { +- MAIN_WINDOW_REC *rec = winlist->data; +- +- if (server == rec->active->active->server) +- signal_emit("window server changed", 1, rec->active); +- } +- +- return TRUE; +-} +- +-static gboolean cmd_clear(gchar *data, SERVER_REC *server, CHANNEL_REC *channel) +-{ +- WINDOW_REC *window; +- GUI_WINDOW_REC *gui; +- +- g_return_val_if_fail(channel != NULL, FALSE); +- +- window = CHANNEL_PARENT(channel); +- gui = WINDOW_GUI(window); +- +-#ifdef HAVE_GNOME +- if (gui->zvt) +- { +- zvt_term_set_scrollback(ZVT_TERM(gui->text), 0); +- zvt_term_feed(ZVT_TERM(gui->text), "\033[H\033[2J", 7); +- zvt_term_set_scrollback(ZVT_TERM(gui->text), max_textwidget_lines); +- } +- else +-#endif +- { +- g_list_free(gui->linepos); +- gui->linepos = NULL; +- gtk_text_set_point(GTK_TEXT(gui->text), 0); +- gtk_text_forward_delete(GTK_TEXT(gui->text), gtk_text_get_length(GTK_TEXT(gui->text))); +- } +- window->lines = 0; +- +- return TRUE; +-} +- +-static gboolean signal_window_focused(WINDOW_REC *window) +-{ +- MAIN_WINDOW_REC *mainwindow; +- GUI_WINDOW_REC *gui; +- CHANNEL_REC *channel; +- +- g_return_val_if_fail(window != NULL, FALSE); +- +- mainwindow = WINDOW_GUI(window)->parent; +- channel = window->active; +- +- gui = WINDOW_GUI(mainwindow->active); +- +- /* remove old extra menus */ +- if (mainwindow->extramenu != NULL) +- { +- window_menus_remove(mainwindow, mainwindow->extramenu); +- g_free(mainwindow->extramenu); +- mainwindow->extramenu = NULL; +- } +- if (channel == NULL) return TRUE; +- +- if (channel->type == CHANNEL_TYPE_CHANNEL) +- { +- /* Add channel menu */ +- mainwindow->extramenu = g_strdup(channel_menu[0].label); +- window_menus_insert(mainwindow, NULL, channel_menu, channel); +- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(channel_submenu[2].widget), +- GTK_WIDGET_VISIBLE(gui->nickscrollbox)); +- gtk_widget_show(gui->channelwidget); +- } +- else +- { +- gtk_widget_hide(gui->nickscrollbox); +- gtk_widget_hide(gui->channelwidget); +- if (channel->type == CHANNEL_TYPE_QUERY) +- { +- /* Add query menu */ +- mainwindow->extramenu = g_strdup(query_menu[0].label); +- window_menus_insert(mainwindow, NULL, query_menu, channel); +- } +- } +- +- if (CHANNEL_GUI(channel)->servermenu) +- { +- /* change server selection */ +- gtk_option_menu_set_history(GTK_OPTION_MENU(mainwindow->servermenu), +- g_list_index(servers, channel->server)); +- gtk_widget_show(mainwindow->servermenu); +- } +- else +- gtk_widget_hide(mainwindow->servermenu); +- +- /* draw title bar */ +- signal_emit("channel topic changed", 1, window->active); +- +- return TRUE; +-} +- +-static gboolean gui_windows_setup_changed(void) +-{ +- GList *tmp; +- +- for (tmp = g_list_first(windows); tmp != NULL; tmp = tmp->next) +- { +- WINDOW_REC *rec = tmp->data; +- +- gui_window_set_background(rec); +-#ifdef HAVE_GNOME +- if (WINDOW_GUI(rec)->zvt) +- { +- zvt_term_set_fonts(ZVT_TERM(WINDOW_GUI(rec)->text), font_normal, font_bold); +- init_zvt_colors(ZVT_TERM(WINDOW_GUI(rec)->text)); +- } +-#endif +- } +- +- return TRUE; +-} +- +-static gboolean gui_server_looking(SERVER_REC *server) +-{ +- GList *tmp, *sub; +- +- g_return_val_if_fail(server != NULL, FALSE); +- +- /* try to keep some server assigned to server menus.. */ +- for (tmp = g_list_first(windows); tmp != NULL; tmp = tmp->next) +- { +- WINDOW_REC *win = tmp->data; +- gboolean changed; +- +- changed = FALSE; +- for (sub = g_list_first(win->channels); sub != NULL; sub = sub->next) +- { +- CHANNEL_REC *chan = sub->data; +- +- if (chan->server == NULL) +- { +- chan->server = server; +- if (!changed) +- signal_emit("window server changed", 1, win); +- changed = TRUE; +- } +- } +- } +- +- return TRUE; +-} +- +-void gui_windows_init(void) +-{ +- signal_add("setup changed", (SIGNAL_FUNC) gui_windows_setup_changed); +- signal_add("user mode changed", (SIGNAL_FUNC) gui_windows_usermode_changed); +- signal_add("window server changed", (SIGNAL_FUNC) gui_window_server_changed); +- signal_add("window focused", (SIGNAL_FUNC) signal_window_focused); +- signal_add("command clear", (SIGNAL_FUNC) cmd_clear); +- signal_add("server looking", (SIGNAL_FUNC) gui_server_looking); +-} +- +-void gui_windows_deinit(void) +-{ +- signal_remove("setup changed", (SIGNAL_FUNC) gui_windows_setup_changed); +- signal_remove("user mode changed", (SIGNAL_FUNC) gui_windows_usermode_changed); +- signal_remove("window server changed", (SIGNAL_FUNC) gui_window_server_changed); +- signal_remove("window focused", (SIGNAL_FUNC) signal_window_focused); +- signal_remove("command clear", (SIGNAL_FUNC) cmd_clear); +- signal_remove("server looking", (SIGNAL_FUNC) gui_server_looking); +-} +diff -Nru irssi-0.7.11/src/gui-gnome/gui-windows.h irssi-0.7.11-new/src/gui-gnome/gui-windows.h +--- irssi-0.7.11/src/gui-gnome/gui-windows.h Thu May 13 13:24:58 1999 ++++ irssi-0.7.11-new/src/gui-gnome/gui-windows.h Thu Jan 1 02:00:00 1970 +@@ -1,44 +0,0 @@ +-#ifndef __GUI_WINDOWS_H +-#define __GUI_WINDOWS_H +- +-#define WINDOW_GUI(a) ((GUI_WINDOW_REC *) ((a)->gui_data)) +- +-typedef struct +-{ +- MAIN_WINDOW_REC *parent; +- +- GtkWidget *window; +- GtkWidget *text; +- +- gboolean zvt; /* text is a zvt widget */ +- gchar *pixmap; /* current background pixmap */ +- +- GtkWidget *channelwidget; +- GtkWidget *serverlabel; +- GtkWidget *topicentry; +- GtkWidget *modebuttons[6]; +- +- /* nicklist */ +- GtkWidget *nickscrollbox; +- GtkWidget *nicklist; +- GdkPixmap *op_pixmap, *voice_pixmap; +- GdkBitmap *op_mask, *voice_mask; +- +- GList *linepos; +- gint lastlinelen; +- +- GtkWidget *snapshot; +- gboolean destroying; +- gfloat sb_value; /* to fix those scrollbar problems... */ +-} +-GUI_WINDOW_REC; +- +-void gui_windows_init(void); +-void gui_windows_deinit(void); +- +-WINDOW_REC *gui_window_create(MAIN_WINDOW_REC *parent); +-void gui_window_destroy(WINDOW_REC *window); +- +-void gui_window_set_background_pixmap(WINDOW_REC *window, gchar *path); +- +-#endif |