📄 maingui.c
字号:
flagk_hit (but, sess); break; case 'b': my_gtk_togglebutton_state (sess->gui->flag_b, FALSE); banlist_opengui (sess); break; default: change_channel_flag (but, sess, mode); }}static voidkey_entry (GtkWidget * igad, struct session *sess){ if (sess->server->connected && sess->channel[0]) { char outbuf[512]; sprintf (outbuf, "MODE %s +k %s\r\n", sess->channel, gtk_entry_get_text (GTK_ENTRY (igad))); tcp_send (sess->server, outbuf); sprintf (outbuf, "MODE %s\r\n", sess->channel); tcp_send (sess->server, outbuf); }}static voidlimit_entry (GtkWidget * igad, struct session *sess){ char outbuf[512]; if (sess->server->connected && sess->channel[0]) { if (check_is_number (gtk_entry_get_text (GTK_ENTRY (igad))) == FALSE) { gtk_entry_set_text (GTK_ENTRY (igad), ""); gtkutil_simpledialog (_("User limit must be a number!\n")); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (sess->gui->flag_l), FALSE); return; } sprintf (outbuf, "MODE %s +l %d\r\n", sess->channel, atoi (gtk_entry_get_text (GTK_ENTRY (igad)))); tcp_send (sess->server, outbuf); sprintf (outbuf, "MODE %s\r\n", sess->channel); tcp_send (sess->server, outbuf); }}static GtkWidget *add_flag_wid (char *tip, GtkWidget *box, char *face, session *sess){ GtkWidget *wid; wid = gtk_toggle_button_new_with_label (face); gtk_widget_set_usize (wid, 18, -1); add_tip (wid, tip); gtk_box_pack_end (GTK_BOX (box), wid, 0, 0, 0); gtk_object_set_user_data (GTK_OBJECT (wid), sess); gtk_signal_connect (GTK_OBJECT (wid), "toggled", GTK_SIGNAL_FUNC (channelmode_button_cb), face); show_and_unfocus (wid); return wid;}static voiduserlist_button (GtkWidget * box, char *label, char *cmd, struct session *sess, int a, int b, int c, int d){ GtkWidget *wid = gtk_button_new_with_label (label); gtk_object_set_user_data (GTK_OBJECT (wid), sess); gtk_signal_connect (GTK_OBJECT (wid), "clicked", GTK_SIGNAL_FUNC (userlist_button_cb), cmd); gtk_table_attach_defaults (GTK_TABLE (box), wid, a, b, c, d); show_and_unfocus (wid);}#define WORD_URL 1#define WORD_NICK 2#define WORD_CHANNEL 3#define WORD_HOST 4#define WORD_EMAIL 5#define WORD_DIALOG -1/* check if a word is clickable */intmaingui_word_check (GtkWidget * xtext, char *word){ session *sess; char *at, *dot; int i, dots; int len = strlen (word); if ((word[0] == '@' || word[0] == '+') && word[1] == '#') return WORD_CHANNEL; if (word[0] == '#' && word[1] != '#' && word[1] != 0) return WORD_CHANNEL; if (!strncasecmp (word, "irc://", 6)) return WORD_URL; if (!strncasecmp (word, "irc.", 4)) return WORD_URL; if (!strncasecmp (word, "ftp.", 4)) return WORD_URL; if (!strncasecmp (word, "ftp:", 4)) return WORD_URL; if (!strncasecmp (word, "www.", 4)) return WORD_URL; if (!strncasecmp (word, "http:", 5)) return WORD_URL; if (!strncasecmp (word, "https:", 6)) return WORD_URL; sess = gtk_object_get_user_data (GTK_OBJECT (xtext)); if (find_name (sess, word)) return WORD_NICK; at = strchr (word, '@'); /* check for email addy */ dot = strrchr (word, '.'); if (at && dot) { if ((unsigned long) at < (unsigned long) dot) { if (strchr (word, '*')) return WORD_HOST; else return WORD_EMAIL; } } /* check if it's an IP number */ dots = 0; for (i = 0; i < len; i++) { if (word[i] == '.') dots++; } if (dots == 3) { if (inet_addr (word) != -1) return WORD_HOST; } if (!strncasecmp (word + len - 5, ".html", 5)) return WORD_HOST; if (!strncasecmp (word + len - 4, ".org", 4)) return WORD_HOST; if (!strncasecmp (word + len - 4, ".net", 4)) return WORD_HOST; if (!strncasecmp (word + len - 4, ".com", 4)) return WORD_HOST; if (!strncasecmp (word + len - 4, ".edu", 4)) return WORD_HOST; if (len > 5) { if (word[len - 3] == '.' && isalpha (word[len - 2]) && isalpha (word[len - 1])) return WORD_HOST; } if (sess->type == SESS_DIALOG) return WORD_DIALOG; return 0;}/* mouse click inside text area */voidmaingui_word_clicked (GtkWidget *xtext, char *word, GdkEventButton *even, session *sess){ if (even->button == 1) /* left button */ { if (even->state & GDK_CONTROL_MASK) { switch (maingui_word_check (xtext, word)) { case WORD_URL: case WORD_HOST: goto_url (word); } } return; } if (even->button == 2) { if (sess->type == SESS_DIALOG) menu_middlemenu (sess, even); return; } switch (maingui_word_check (xtext, word)) { case 0: menu_middlemenu (sess, even); break; case WORD_URL: case WORD_HOST: menu_urlmenu (even, word); break; case WORD_NICK: menu_nickmenu (sess, even, word); break; case WORD_CHANNEL: if (*word == '@' || *word == '+') word++; menu_chanmenu (sess, even, word); break; case WORD_EMAIL: { char *newword = malloc (strlen (word) + 10); if (*word == '~') word++; sprintf (newword, "mailto:%s", word); menu_urlmenu (even, newword); free (newword); } break; case WORD_DIALOG: menu_nickmenu (sess, even, sess->channel); break; }}voidmaingui_configure (session *sess){ if (sess == 0) /* for the main_window */ { sess = menu_sess; if (main_window && prefs.mainwindow_save) { gdk_window_get_root_origin (main_window->window, &prefs.mainwindow_left, &prefs.mainwindow_top); gdk_window_get_size (main_window->window, &prefs.mainwindow_width, &prefs.mainwindow_height); } } if (sess) {#ifdef USE_ZVT if (sess->type == SESS_SHELL) { gtk_widget_queue_draw (sess->gui->textgad); } else {#endif if (((GtkXText *) sess->gui->textgad)->transparent) { gtk_widget_queue_draw (sess->gui->textgad); }#ifdef USE_ZVT }#endif }}static voidmaingui_create_textlist (struct session *sess, GtkWidget * leftpane){ sess->gui->textgad = gtk_xtext_new (prefs.indent_pixels * prefs.indent_nicks, prefs.show_separator); gtk_object_set_user_data (GTK_OBJECT (sess->gui->textgad), sess); ((GtkXText *) sess->gui->textgad)->wordwrap = prefs.wordwrap; ((GtkXText *) sess->gui->textgad)->max_auto_indent = prefs.max_auto_indent; ((GtkXText *) sess->gui->textgad)->auto_indent = prefs.auto_indent; ((GtkXText *) sess->gui->textgad)->thinline = prefs.thin_separator; ((GtkXText *) sess->gui->textgad)->max_lines = prefs.max_lines; ((GtkXText *) sess->gui->textgad)->error_function = gtkutil_simpledialog; ((GtkXText *) sess->gui->textgad)->urlcheck_function = maingui_word_check; ((GtkXText *) sess->gui->textgad)->tint_red = prefs.tint_red; ((GtkXText *) sess->gui->textgad)->tint_green = prefs.tint_green; ((GtkXText *) sess->gui->textgad)->tint_blue = prefs.tint_blue; if (prefs.timestamp && prefs.indent_nicks) ((GtkXText *) sess->gui->textgad)->time_stamp = TRUE; gtk_xtext_set_palette (GTK_XTEXT (sess->gui->textgad), colors); gtk_xtext_set_font (GTK_XTEXT (sess->gui->textgad), font_normal, 0); gtk_xtext_set_background (GTK_XTEXT (sess->gui->textgad), channelwin_pix, prefs.transparent, prefs.tint); gtk_widget_set_usize (sess->gui->textgad, prefs.mainwindow_width - 138, prefs.mainwindow_height - 106); gtk_container_add (GTK_CONTAINER (leftpane), sess->gui->textgad); show_and_unfocus (sess->gui->textgad); sess->gui->vscrollbar = gtk_vscrollbar_new (GTK_XTEXT (sess->gui->textgad)->adj); gtk_box_pack_start (GTK_BOX (leftpane), sess->gui->vscrollbar, FALSE, FALSE, 1); show_and_unfocus (sess->gui->vscrollbar); if (!sess->is_tab) gtk_signal_connect_object (GTK_OBJECT (sess->gui->window), "configure_event", GTK_SIGNAL_FUNC (maingui_configure), GTK_OBJECT (sess)); gtk_signal_connect (GTK_OBJECT (sess->gui->textgad), "word_click", GTK_SIGNAL_FUNC (maingui_word_clicked), sess);}/* called when a new tab gets focus */static voidgui_new_tab (session * sess){ current_tab = sess; menu_sess = sess; if (!prefs.use_server_tab) sess->server->front_session = sess; fe_set_away (sess->server); gtk_widget_grab_focus (sess->gui->inputgad); if (main_window) gtk_widget_set_sensitive (main_menu, TRUE);#ifdef USE_PANEL if (sess->gui->panel_button) gtk_widget_set_rc_style (GTK_BIN (sess->gui->panel_button)->child);#endif if (sess->new_data || sess->nick_said) { sess->nick_said = FALSE; sess->new_data = FALSE; gtk_widget_set_rc_style (sess->gui->changad); if (prefs.treeview) tree_default_style (sess); }}static voidgui_new_tab_callback (GtkWidget * widget, GtkNotebookPage * nbpage, guint page){ struct session *sess; GSList *list = sess_list; if (xchat_is_quitting || main_window == NULL) return; wins_update_notebooktitle (nbpage->child); while (list) { sess = (struct session *) list->data; if (sess->gui->window == nbpage->child && sess->type != SESS_SHELL) { gui_new_tab (sess); return; } list = list->next; } /* we're moved to a tab that isn't a session, the menus would crash! */ if (main_window) gtk_widget_set_sensitive (main_menu, FALSE); current_tab = 0; menu_sess = 0;}static voidgui_main_window_kill (gpointer userdata){ GSList *list; session *sess; xchat_is_quitting = TRUE; /* see if there's any non-tab windows left */ list = sess_list; while (list) { sess = (session *) list->data; if (!sess->is_tab) { xchat_is_quitting = FALSE; break; } list = list->next; } main_window = 0; current_tab = 0;}voiduserlist_hide (GtkWidget *igad, session *sess){#ifdef USE_GNOMEE if (sess->userlisthidden > 0) { if (sess->gui->paned) gtk_paned_set_position (GTK_PANED (sess->gui->paned), sess->userlisthidden); else gtk_widget_show (sess->gui->userlistbox); sess->userlisthidden = 0; } else { if (sess->gui->paned) { sess->userlisthidden = GTK_PANED (sess->gui->paned)->handle_xpos + 3; gtk_paned_set_position (GTK_PANED (sess->gui->paned), 1200); } else { sess->userlisthidden = 1; gtk_widget_hide (sess->gui->userlistbox); } }#else if (sess->userlisthidden) { if (igad) gtk_label_set (GTK_LABEL (GTK_BIN (igad)->child), ">"); if (sess->gui->paned) gtk_paned_set_position (GTK_PANED (sess->gui->paned), sess->userlisthidden); else gtk_widget_show (sess->gui->userlistbox); sess->userlisthidden = FALSE; prefs.hideuserlist = 0; } else { if (igad) gtk_label_set (GTK_LABEL (GTK_BIN (igad)->child), "<"); if (sess->gui->paned) { sess->userlisthidden = GTK_PANED (sess->gui->paned)->handle_xpos + 3; gtk_paned_set_position (GTK_PANED (sess->gui->paned), 1200); } else { sess->userlisthidden = TRUE; gtk_widget_hide (sess->gui->userlistbox); } prefs.hideuserlist = 1; }#endif}static voidmaingui_userlist_selected (GtkWidget * clist, gint row, gint column, GdkEventButton * even){ struct User *user; if (even) { if (even->type == GDK_2BUTTON_PRESS) { if (prefs.doubleclickuser[0]) { user = gtk_clist_get_row_data (GTK_CLIST (clist), row); nick_command_parse (menu_sess, prefs.doubleclickuser, user->nick, user->nick); } } else { if (!(even->state & GDK_SHIFT_MASK)) { gtk_clist_unselect_all (GTK_CLIST (clist)); gtk_clist_select_row (GTK_CLIST (clist), row, column); } } }}/* Treeview code --AGL */static GList *tree_list = NULL;#define TREE_SERVER 0#define TREE_SESSION 1struct tree_data{ int type; void *data;};static voidtree_row_destroy (struct tree_data *td){ g_free (td);}static voidtree_add_sess (GSList ** o_ret, struct server *serv){ GSList *ret = *o_ret; GSList *session; struct session *sess; session = sess_list; while (session) { sess = session->data; if (sess->server == serv && sess->type != SESS_SERVER) ret = g_slist_prepend (ret, sess); session = session->next; } *o_ret = ret; return;}static GSList *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -