📄 maingui.c
字号:
{#ifndef USE_GNOME GtkWidget *wid = NULL;#endif sess->gui->window = win; if (sess->is_tab) { sess->is_tab = FALSE; if (sess->type == SESS_CHANNEL) { /* turned into a toplevel window, so create a menubar */#ifdef USE_GNOME sess->gui->menu = createmenus (GNOME_APP (sess->gui->window), sess, 1);#else wid = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (sess->gui->vbox), wid, FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (sess->gui->vbox), wid, 0); sess->gui->menu = createmenus (0, sess, 1); gtk_container_add (GTK_CONTAINER (wid), sess->gui->menu); gtk_widget_show_all (wid);#endif } gtk_signal_connect (GTK_OBJECT (win), "focus_in_event", GTK_SIGNAL_FUNC (focus_in), sess); gtk_signal_connect_object (GTK_OBJECT (win), "configure_event", GTK_SIGNAL_FUNC (maingui_configure), GTK_OBJECT (sess)); /* toplevel windows can't use the notebook label as changad */ maingui_make_changad (sess); /* Hide menu if it is turned off */ if (prefs.hidemenu)#ifdef USE_GNOME menu_showhide ();#else if (wid) gtk_widget_hide (wid);#endif#ifdef USE_ZVT if (sess->type == SESS_SHELL) menu_newshell_set_palette (sess); else#endif gtk_xtext_refresh (GTK_XTEXT (sess->gui->textgad), 1); } else { sess->is_tab = TRUE; if (sess->gui->menu) {#ifndef USE_GNOME /* this will destroy the HandleBox and its children */ gtk_widget_destroy (sess->gui->menu->parent);#else /* causes GTK_IS_WIDGET failed warning */ /*gtk_widget_destroy (sess->gui->menu);*/#endif sess->gui->menu = NULL; } /* tabs don't have the changad near the topic bar */ if (sess->gui->changad != NULL) gtk_widget_destroy (sess->gui->changad); sess->gui->changad = wins_get_notebooklabel (sess->gui->window);#ifdef USE_GNOME /* why does only gnome need this ?? */ /* dialog windows don't have this box */ if (sess->gui->userlistbox && sess->type != SESS_DIALOG) { gtk_widget_realize (sess->gui->userlistbox); gdk_window_set_background (sess->gui->userlistbox->window, &sess->gui->userlistbox-> style->bg[GTK_STATE_NORMAL]); gdk_window_set_back_pixmap (main_book->window, 0, 0); } menu_showhide ();#endif }}/* called when sess->gui->window is destroyed */static voidwindow_destroy_cb (session *sess){ kill_session_callback (sess); /* xchat.c */ if (main_window != NULL) { /* if no tabs left, destroy main window */ if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (main_book), 0) == NULL) { gtk_widget_destroy (main_window); main_window = NULL; } }}voidcreate_window (struct session *sess){ GtkWidget *leftpane, *rightpane; GtkWidget *vbox, *tbox, *bbox, *nlbox, *wid, *infbox; int justopened = FALSE; if (sess->type == SESS_DIALOG) { new_dialog (sess); if (prefs.treeview) tree_update (); return; } if (!sess->server->front_session) sess->server->front_session = sess; if (prefs.tabchannels) { sess->is_tab = TRUE; if (!main_window) { justopened = TRUE; gui_make_tab_window (sess, NULL); } sess->gui->window = wins_new (_("<none>"), "", window_destroy_cb, sess, link_cb, sess, TRUE, FALSE, NULL); if (!current_tab) current_tab = sess; } else { sess->gui->window = wins_new (_("<none>"), "", window_destroy_cb, sess, link_cb, sess, FALSE, FALSE, NULL); gtk_widget_set_usize (sess->gui->window, prefs.mainwindow_width, prefs.mainwindow_height); gtk_signal_connect ((GtkObject *) sess->gui->window, "focus_in_event", GTK_SIGNAL_FUNC (focus_in), sess); } fe_set_title (sess); palette_alloc (sess->gui->window); sess->gui->vbox = vbox = wins_get_vbox (sess->gui->window); if (!prefs.tabchannels) {#ifdef USE_GNOME sess->gui->menu = createmenus (sess->gui->window, sess, 1);#else sess->gui->menu = createmenus (0, sess, 1); gtk_widget_show (sess->gui->menu); wid = gtk_handle_box_new (); gtk_container_add (GTK_CONTAINER (wid), sess->gui->menu); gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, TRUE, 0); if (!prefs.hidemenu) gtk_widget_show (wid);#endif } sess->gui->tbox = tbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), tbox, FALSE, FALSE, 2); if (prefs.topicbar) gtk_widget_show (tbox); wins_create_linkbuttons (sess->gui->window, tbox); if (!prefs.tabchannels) maingui_make_changad (sess); sess->gui->topicgad = gtk_entry_new (); gtk_signal_connect (GTK_OBJECT (sess->gui->topicgad), "activate", GTK_SIGNAL_FUNC (handle_topicgad), sess); gtk_container_add (GTK_CONTAINER (tbox), sess->gui->topicgad); if (prefs.inputgad_superfocus) show_and_unfocus (sess->gui->topicgad); else gtk_widget_show (sess->gui->topicgad); add_tip (sess->gui->topicgad, _("The channel topic"));#ifdef USE_GNOMEE wid = gtkutil_button (sess->gui->window, GNOME_STOCK_PIXMAP_FORWARD, 0, userlist_hide, sess, 0);#else if (prefs.hideuserlist) wid = gtk_button_new_with_label ("<"); else wid = gtk_button_new_with_label (">"); gtk_signal_connect (GTK_OBJECT (wid), "clicked", GTK_SIGNAL_FUNC (userlist_hide), (gpointer) sess);#endif gtk_box_pack_end (GTK_BOX (tbox), wid, 0, 0, 0); show_and_unfocus (wid); add_tip (wid, _("Hide/Show Userlist")); if (prefs.chanmodebuttons) { sess->gui->key_entry = gtk_entry_new_with_max_length (16); gtk_widget_set_usize (sess->gui->key_entry, 30, -1); gtk_box_pack_end (GTK_BOX (tbox), sess->gui->key_entry, 0, 0, 0); gtk_signal_connect (GTK_OBJECT (sess->gui->key_entry), "activate", GTK_SIGNAL_FUNC (key_entry), (gpointer) sess); if (prefs.inputgad_superfocus) show_and_unfocus (sess->gui->key_entry); else gtk_widget_show (sess->gui->key_entry); sess->gui->flag_k = add_flag_wid (_("Keyword"), tbox, _("K"), sess); sess->gui->limit_entry = gtk_entry_new_with_max_length (10); gtk_widget_set_usize (sess->gui->limit_entry, 30, -1); gtk_box_pack_end (GTK_BOX (tbox), sess->gui->limit_entry, 0, 0, 0); gtk_signal_connect (GTK_OBJECT (sess->gui->limit_entry), "activate", GTK_SIGNAL_FUNC (limit_entry), (gpointer) sess); if (prefs.inputgad_superfocus) show_and_unfocus (sess->gui->limit_entry); else gtk_widget_show (sess->gui->limit_entry); sess->gui->flag_l = add_flag_wid (_("User Limit"), tbox, "L", sess); sess->gui->flag_b = add_flag_wid (_("Ban List"), tbox, "B", sess); sess->gui->flag_m = add_flag_wid (_("Moderated"), tbox, "M", sess); sess->gui->flag_p = add_flag_wid (_("Private"), tbox, "P", sess); sess->gui->flag_i = add_flag_wid (_("Invite Only"), tbox, "I", sess); sess->gui->flag_s = add_flag_wid (_("Secret"), tbox, "S", sess); sess->gui->flag_n = add_flag_wid (_("No outside messages"), tbox, "N", sess); sess->gui->flag_t = add_flag_wid (_("Topic Protection"), tbox, "T", sess); } else sess->gui->flag_wid[0] = 0; leftpane = gtk_hbox_new (FALSE, 0); gtk_widget_show (leftpane); if (prefs.paned_userlist) { sess->gui->paned = gtk_hpaned_new (); gtk_container_add (GTK_CONTAINER (vbox), sess->gui->paned); gtk_widget_show (sess->gui->paned); } rightpane = gtk_hbox_new (FALSE, 0); gtk_widget_show (rightpane); sess->gui->userlistbox = rightpane; if (prefs.paned_userlist) { gtk_paned_pack1 (GTK_PANED (sess->gui->paned), leftpane, TRUE, TRUE); gtk_paned_pack2 (GTK_PANED (sess->gui->paned), rightpane, FALSE, TRUE);#ifndef WIN32 /* not available in gtk 1.3 */ gtk_paned_set_gutter_size (GTK_PANED (sess->gui->paned), 4);#endif } else { wid = gtk_hbox_new (0, 2); gtk_container_add (GTK_CONTAINER (vbox), wid); gtk_widget_show (wid); gtk_container_add (GTK_CONTAINER (wid), leftpane); gtk_box_pack_end (GTK_BOX (wid), rightpane, 0, 0, 0); } sess->gui->nl_box = nlbox = gtk_vbox_new (FALSE, 1); gtk_container_add (GTK_CONTAINER (rightpane), nlbox); gtk_widget_show (nlbox); sess->gui->namelistinfo = infbox = gtk_hbox_new (0, 0); gtk_box_pack_start (GTK_BOX (nlbox), infbox, 0, 0, 0); sess->gui->namelistinfo_o = create_infoframe (pix_op, mask_op, infbox); sess->gui->namelistinfo_v = create_infoframe (pix_voice, mask_voice, infbox); sess->gui->namelistinfo_t = create_infoframe (0, 0, infbox); maingui_create_textlist (sess, leftpane); sess->gui->leftpane = leftpane; if (prefs.showhostname_in_userlist) { sess->gui->namelistgad = gtkutil_clist_new (2, 0, nlbox, GTK_POLICY_AUTOMATIC, maingui_userlist_selected, sess, 0, 0, GTK_SELECTION_MULTIPLE); gtk_clist_set_column_auto_resize ((GtkCList *) sess->gui->namelistgad, 0, TRUE); gtk_clist_set_column_auto_resize ((GtkCList *) sess->gui->namelistgad, 1, TRUE); } else { sess->gui->namelistgad = gtkutil_clist_new (1, 0, nlbox, GTK_POLICY_AUTOMATIC, maingui_userlist_selected, sess, 0, 0, GTK_SELECTION_MULTIPLE); } GTK_WIDGET_UNSET_FLAGS (sess->gui->namelistgad, GTK_CAN_FOCUS); if (prefs.style_namelistgad) gtk_widget_set_style (sess->gui->namelistgad, inputgad_style);#ifdef USE_GNOME /* set up drops */ gtk_drag_dest_set (sess->gui->namelistgad, GTK_DEST_DEFAULT_ALL, dnd_targets, 1, GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK); gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "drag_motion", GTK_SIGNAL_FUNC (userlist_dnd_motion), 0); gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "drag_leave", GTK_SIGNAL_FUNC (userlist_dnd_leave), 0); gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "drag_data_received", GTK_SIGNAL_FUNC (userlist_dnd_drop), sess);#endif gtk_clist_set_selection_mode (GTK_CLIST (sess->gui->namelistgad), GTK_SELECTION_MULTIPLE); gtk_clist_set_column_width (GTK_CLIST (sess->gui->namelistgad), 0, 10); gtk_widget_set_usize (sess->gui->namelistgad->parent, 115, 0); gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "button_press_event", GTK_SIGNAL_FUNC (ul_button_rel), sess); /*gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "key_press_event", GTK_SIGNAL_FUNC (ul_keypress_cb), sess);*/ if ((prefs.lagometer & 2) || (prefs.throttlemeter & 2)) { infbox = gtk_hbox_new (0, 0); gtk_box_pack_start (GTK_BOX (nlbox), infbox, 0, 0, 0); gtk_widget_show (infbox); } if (prefs.lagometer & 1) { sess->gui->lagometer = wid = gtk_progress_bar_new (); gtk_widget_set_usize (wid, 1, 8); gtk_box_pack_start (GTK_BOX (nlbox), wid, 0, 0, 0); gtk_widget_show (wid); } if (prefs.lagometer & 2) { sess->gui->laginfo = wid = create_infoframe (0, 0, infbox); gtk_label_set_text ((GtkLabel *) wid, "Lag"); } if (prefs.throttlemeter & 1) { sess->gui->throttlemeter = wid = gtk_progress_bar_new (); gtk_widget_set_usize (wid, 1, 8); gtk_box_pack_start (GTK_BOX (nlbox), wid, 0, 0, 0); gtk_widget_show (wid); } if (prefs.throttlemeter & 2) { sess->gui->throttleinfo = wid = create_infoframe (0, 0, infbox); gtk_label_set_text ((GtkLabel *) wid, "Throttle"); } if (prefs.userlistbuttons) maingui_createbuttons (sess); else sess->gui->button_box = 0; /* bottom hbox */ bbox = gtk_hbox_new (FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (bbox), 0); gtk_box_pack_end (GTK_BOX (vbox), bbox, FALSE, TRUE, 2); gtk_widget_show (bbox); if (prefs.nickgad) { sess->gui->op_box = gtk_hbox_new (0, 0); gtk_box_pack_start (GTK_BOX (bbox), sess->gui->op_box, FALSE, FALSE, 2); gtk_widget_show (sess->gui->op_box); sess->gui->nickgad = gtk_label_new (sess->server->nick); gtk_box_pack_start (GTK_BOX (bbox), sess->gui->nickgad, FALSE, FALSE, 4); gtk_widget_show (sess->gui->nickgad); } sess->gui->inputgad = gtk_entry_new_with_max_length (2048); gtk_container_add (GTK_CONTAINER (bbox), sess->gui->inputgad); gtk_signal_connect (GTK_OBJECT (sess->gui->inputgad), "key_press_event", GTK_SIGNAL_FUNC (key_handle_key_press), sess); if (prefs.style_inputbox) gtk_widget_set_style (sess->gui->inputgad, inputgad_style); gtk_widget_show (sess->gui->inputgad); if (prefs.newtabstofront || justopened) gtk_widget_grab_focus (sess->gui->inputgad); gui_create_toolbox (sess, bbox); gtk_widget_show (sess->gui->window); if (prefs.tabchannels) { sess->gui->changad = wins_get_notebooklabel (sess->gui->window); gtk_widget_realize (sess->gui->textgad); if (justopened) { gtk_widget_show (main_window); if (prefs.mainwindow_left || prefs.mainwindow_top) gdk_window_move (main_window->window, prefs.mainwindow_left, prefs.mainwindow_top); } if (!redtab_style) maingui_init_styles (sess->gui->changad->style); if (prefs.newtabstofront && !justopened) wins_bring_tofront (sess->gui->window); /* make switching tabs super smooth! */ gtk_widget_realize (rightpane); gdk_window_set_background (rightpane->window, &rightpane->style->bg[GTK_STATE_NORMAL]); gdk_window_set_back_pixmap (main_book->window, 0, 0); gdk_window_set_background (((GtkNotebook*)main_book)->panel, &main_book->style->bg[GTK_STATE_NORMAL]); } else { if (!redtab_style) maingui_init_styles (gtk_widget_get_style (sess->gui->changad)); if (prefs.mainwindow_left || prefs.mainwindow_top) gdk_window_move (sess->gui->window->window, prefs.mainwindow_left, prefs.mainwindow_top); } if (prefs.hideuserlist) { userlist_hide (0, sess); if (sess->gui->paned) sess->userlisthidden = GTK_PANED (sess->gui->paned)->handle_xpos; }#ifdef USE_GNOME if (!sess->is_tab || justopened) menu_showhide ();#endif fe_set_nonchannel (sess, FALSE);}voidfe_session_callback (struct session *sess){ tree_update ();#ifdef USE_PANEL if (sess->gui->panel_button) gtk_widget_destroy (sess->gui->panel_button);#endif if (sess->gui->bar) fe_progressbar_end (sess); if (menu_sess == sess && sess_list) menu_sess = (struct session *) sess_list->data;}/*voidfe_server_callback (struct server *serv){ if (serv->gui->rawlog_window) { we don't want the "destroy" callback to be called gtk_signal_disconnect_by_data (GTK_OBJECT (serv->gui->rawlog_window), serv); gtk_widget_destroy (serv->gui->rawlog_window); } }*/static voidmy_gtk_togglebutton_state (GtkWidget *wid, int state){ gpointer udata; /* remove the userdata so the callback ignores this event */ udata = gtk_object_get_user_data (GTK_OBJECT (wid)); gtk_object_set_user_data (GTK_OBJECT (wid), 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), state); /* now put it back */ gtk_object_set_user_data (GTK_OBJECT (wid), udata);}voidfe_update_mode_buttons (struct session *sess, char mode, char sign){ int state, i; if (sign == '+') state = TRUE; else state = FALSE; if (sess->gui->flag_wid[0]) { for (i = 0; i < NUM_FLAG_WIDS - 1; i++) { if (chan_flags[i] == mode) { if (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i])->active != state) my_gtk_togglebutton_state (sess->gui->flag_wid[i], state); } } }/* fe_set_title (sess);*/}voidhandle_inputgad (GtkWidget * igad, struct session *sess){ char *cmd = gtk_entry_get_text (GTK_ENTRY (igad)); if (cmd[0] == 0) return; handle_multiline (sess, cmd, TRUE, FALSE); gtk_entry_set_text (GTK_ENTRY (igad), "");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -