⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 maingui.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
📖 第 1 页 / 共 4 页
字号:
		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 + -