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

📄 chanlist.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
📖 第 1 页 / 共 2 页
字号:
#else	/* recompile the regular expression. */	regfree (&serv->gui->chanlist_match_regex);	regcomp (&serv->gui->chanlist_match_regex,				gtk_entry_get_text (GTK_ENTRY (wid)),				REG_ICASE | REG_EXTENDED | REG_NOSUB);#endif}static voidchanlist_match_channel_button_toggled (GtkWidget * wid, struct server *serv){	serv->gui->chanlist_match_wants_channel =		gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid));}static voidchanlist_match_topic_button_toggled (GtkWidget * wid, struct server *serv){	serv->gui->chanlist_match_wants_topic =		gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (wid));}static voidchanlist_click_column (GtkWidget * clist, gint column, struct server *serv){	/* If the user clicks the same column twice in a row,	 * swap the sort type. Otherwise, assume he wishes	 * to sort by another column, but using the same	 * direction. 	 */	if (serv->gui->chanlist_last_column == column)	{		if (serv->gui->chanlist_sort_type == GTK_SORT_ASCENDING)			serv->gui->chanlist_sort_type = GTK_SORT_DESCENDING;		else			serv->gui->chanlist_sort_type = GTK_SORT_ASCENDING;	}	serv->gui->chanlist_last_column = column;	gtk_clist_set_sort_type (GTK_CLIST (clist), serv->gui->chanlist_sort_type);	gtk_clist_set_sort_column (GTK_CLIST (clist), column);	/* Since ascii sorting the numbers is a no go, use a custom	 * sorter function for the 'users' column.	 */	if (column == 1)		gtk_clist_set_compare_func (GTK_CLIST (clist), (GtkCListCompareFunc)											 chanlist_compare_user);	else		/* In the 0 or 2 case, use the case-insensitive string 		 * compare function. 		 */		gtk_clist_set_compare_func (GTK_CLIST (clist), (GtkCListCompareFunc)											 chanlist_compare_text_ignore_case);	gtk_clist_sort (GTK_CLIST (clist));}static voidchanlist_join (GtkWidget * wid, struct server *serv){	int row;	char *chan;	char tbuf[256];	row = gtkutil_clist_selection (serv->gui->chanlist_list);	if (row != -1)	{		gtk_clist_get_text (GTK_CLIST (serv->gui->chanlist_list), row, 0,								  &chan);		if (serv->connected && (strcmp (chan, "*") != 0))		{			snprintf (tbuf, sizeof tbuf, "JOIN %s\r\n", chan);			tcp_send (serv, tbuf);		} else			gdk_beep ();	}}static voidchanlist_filereq_done (struct server *serv, void *data2, char *file){	time_t t = time (0);	int i = 0;	int fh;	char *chan, *users, *topic;	char buf[1024];	if (!file)		return;	fh = open (file, O_TRUNC | O_WRONLY | O_CREAT, 0600);	free (file);	if (fh == -1)		return;	snprintf (buf, sizeof buf, "X-Chat Channel List: %s - %s\n",				 serv->servername, ctime (&t));	write (fh, buf, strlen (buf));	while (1)	{		if (!gtk_clist_get_text			 (GTK_CLIST (serv->gui->chanlist_list), i, 0, &chan))			break;		gtk_clist_get_text (GTK_CLIST (serv->gui->chanlist_list), i, 1, &users);		gtk_clist_get_text (GTK_CLIST (serv->gui->chanlist_list), i, 2, &topic);		i++;		snprintf (buf, sizeof buf, "%-16s %-5s%s\n", chan, users, topic);		write (fh, buf, strlen (buf));	}	close (fh);}static voidchanlist_save (GtkWidget * wid, struct server *serv){	char *temp;	if (!gtk_clist_get_text		 (GTK_CLIST (serv->gui->chanlist_list), 0, 0, &temp))	{		gtkutil_simpledialog (_("I can't save an empty list!"));		return;	}	gtkutil_file_req (_("Select an output filename"), chanlist_filereq_done,							serv, 0, TRUE);}static voidchanlist_minusers (GtkWidget * wid, struct server *serv){	serv->gui->chanlist_minusers = atoi (gtk_entry_get_text (GTK_ENTRY (wid)));}static voidchanlist_maxusers (GtkWidget * wid, struct server *serv){	serv->gui->chanlist_maxusers = atoi (gtk_entry_get_text (GTK_ENTRY (wid)));}static voidchanlist_row_selected (GtkWidget * clist, gint row, gint column,							  GdkEventButton * even, struct server *serv){	if (even && even->type == GDK_2BUTTON_PRESS)	{		chanlist_join (0, (struct server *) serv);	}}/** * Handles the window's destroy event to free allocated memory. */static voidchanlist_destroy_widget (GtkObject * object, struct server *serv){	chanlist_data_free (serv);#ifndef WIN32	regfree (&serv->gui->chanlist_match_regex);#else	free (serv->gui->chanlist_match_regex);#endif}static voidchanlist_closegui (server *serv){	if (is_server (serv))		serv->gui->chanlist_window = 0;}voidchanlist_opengui (struct server *serv){	gchar *titles[] = { _("Channel"), _("Users"), _("Topic") };	GtkWidget *frame, *vbox, *hbox, *sortvbox, *sorthbox, *numtable,		*table, *wid, *real_wid;	char tbuf[256];	if (serv->gui->chanlist_window)	{		gdk_window_show (serv->gui->chanlist_window->window);		return;	}	snprintf (tbuf, sizeof tbuf, _("X-Chat: Channel List (%s)"),				 serv->servername);	serv->gui->chanlist_data_stored_rows = NULL;	if (!serv->gui->chanlist_minusers)		serv->gui->chanlist_minusers = 3;	if (!serv->gui->chanlist_maxusers)		serv->gui->chanlist_maxusers = 0;	serv->gui->chanlist_window =		maingui_window ("chanlist", tbuf, FALSE, TRUE, chanlist_closegui, serv,								450, 300, &serv->gui->chanlist_window);	vbox = wins_get_vbox (serv->gui->chanlist_window);	frame = gtk_frame_new (_("List display options:"));	gtk_container_set_border_width (GTK_CONTAINER (frame), 2);	gtk_widget_show (frame);	table = gtk_table_new (2, 3, FALSE);	gtk_container_set_border_width (GTK_CONTAINER (table), 2);	gtk_container_add (GTK_CONTAINER (frame), table);	gtk_widget_show (table);	gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 5);	wid = gtk_alignment_new (0.0, 0.0, 0.0, 0.0);	gtk_widget_show (wid);	numtable = gtk_table_new (2, 2, FALSE);	gtk_container_add (GTK_CONTAINER (wid), numtable);	gtk_table_attach_defaults (GTK_TABLE (table), wid, 0, 1, 0, 1);	gtk_widget_show (numtable);	wid = gtk_alignment_new (0.0, 0.0, 0.0, 0.0);	real_wid = gtk_label_new (_("Minimum Users: "));	gtk_container_add (GTK_CONTAINER (wid), real_wid);	gtk_table_attach_defaults (GTK_TABLE (numtable), wid, 0, 1, 0, 1);	gtk_widget_show (wid);	wid = gtk_entry_new_with_max_length (6);	gtk_widget_set_usize (wid, 40, 0);	sprintf (tbuf, "%d", serv->gui->chanlist_minusers);	gtk_entry_set_text (GTK_ENTRY (wid), tbuf);	gtk_signal_connect (GTK_OBJECT (wid), "changed",							  GTK_SIGNAL_FUNC (chanlist_minusers), serv);	gtk_signal_connect (GTK_OBJECT (wid), "key_press_event",							  GTK_SIGNAL_FUNC (chanlist_editable_keypress),							  (gpointer) serv);	gtk_table_attach_defaults (GTK_TABLE (numtable), wid, 1, 2, 0, 1);	gtk_widget_show (real_wid);	gtk_widget_show (wid);	wid = gtk_alignment_new (0.0, 0.0, 0.0, 0.0);	real_wid = gtk_label_new (_("Maximum Users: "));	gtk_container_add (GTK_CONTAINER (wid), real_wid);	gtk_table_attach_defaults (GTK_TABLE (numtable), wid, 0, 1, 1, 2);	gtk_widget_show (real_wid);	gtk_widget_show (wid);	wid = gtk_entry_new_with_max_length (6);	gtk_widget_set_usize (wid, 40, 0);	if (serv->gui->chanlist_maxusers > 0)		sprintf (tbuf, "%d", serv->gui->chanlist_maxusers);	else		strcpy (tbuf, "");	gtk_entry_set_text (GTK_ENTRY (wid), tbuf);	gtk_signal_connect (GTK_OBJECT (wid), "changed",							  GTK_SIGNAL_FUNC (chanlist_maxusers), serv);	gtk_signal_connect (GTK_OBJECT (wid), "key_press_event",							  GTK_SIGNAL_FUNC (chanlist_editable_keypress),							  (gpointer) serv);	gtk_table_attach_defaults (GTK_TABLE (numtable), wid, 1, 2, 1, 2);	gtk_widget_show (wid);	wid = gtk_alignment_new (1.0, 0.0, 0.0, 0.0);	sorthbox = gtk_hbox_new (FALSE, 2);	gtk_container_add (GTK_CONTAINER (wid), sorthbox);	gtk_widget_show (sorthbox);	gtk_table_attach_defaults (GTK_TABLE (table), wid, 2, 3, 0, 1);	gtk_widget_show (wid);	wid = gtk_alignment_new (1.0, 0.0, 1.0, 0.0);	real_wid = gtk_label_new (_("Regex Match: "));	gtk_container_add (GTK_CONTAINER (wid), real_wid);	gtk_box_pack_start (GTK_BOX (sorthbox), wid, 0, 0, 0);	gtk_widget_show (real_wid);	gtk_widget_show (wid);	sortvbox = gtk_vbox_new (FALSE, 2);	gtk_box_pack_start (GTK_BOX (sorthbox), sortvbox, 0, 0, 0);	gtk_widget_show (sortvbox);	wid = gtk_entry_new_with_max_length (255);	gtk_widget_set_usize (wid, 155, 0);	gtk_entry_set_text (GTK_ENTRY (wid), serv->gui->chanlist_wild_text);	gtk_signal_connect (GTK_OBJECT (wid), "changed",							  GTK_SIGNAL_FUNC (chanlist_wild), serv);	gtk_signal_connect (GTK_OBJECT (wid), "key_press_event",							  GTK_SIGNAL_FUNC (chanlist_editable_keypress),							  (gpointer) serv);	gtk_box_pack_start (GTK_BOX (sortvbox), wid, 0, 0, 0);	gtk_widget_show (wid);	serv->gui->chanlist_wild = wid;	chanlist_wild (wid, serv);	sorthbox = gtk_hbox_new (FALSE, 2);	gtk_box_pack_start (GTK_BOX (sortvbox), sorthbox, 0, 0, 0);	gtk_widget_show (sorthbox);	wid = gtk_check_button_new_with_label (_("Channel"));	gtk_box_pack_start (GTK_BOX (sorthbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "toggled",							  GTK_SIGNAL_FUNC							  (chanlist_match_channel_button_toggled), serv);	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), TRUE);	gtk_widget_show (wid);	wid = gtk_check_button_new_with_label (_("Topic"));	gtk_signal_connect (GTK_OBJECT (wid), "toggled",							  GTK_SIGNAL_FUNC (chanlist_match_topic_button_toggled),							  serv);	gtk_box_pack_start (GTK_BOX (sorthbox), wid, 0, 0, 0);	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), TRUE);	gtk_widget_show (wid);	wid = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);	real_wid = gtk_button_new_with_label (_(" Apply "));	gtk_container_add (GTK_CONTAINER (wid), real_wid);	gtk_table_attach_defaults (GTK_TABLE (table), wid, 0, 3, 1, 2);	gtk_signal_connect (GTK_OBJECT (real_wid), "pressed",							  GTK_SIGNAL_FUNC (chanlist_apply_pressed),							  (gpointer) serv);	gtk_widget_show (real_wid);	gtk_widget_show (wid);	serv->gui->chanlist_list =		gtkutil_clist_new (3, titles, vbox, GTK_POLICY_ALWAYS,								 chanlist_row_selected, (gpointer) serv, 0, 0,								 GTK_SELECTION_BROWSE);	gtk_clist_set_column_width (GTK_CLIST (serv->gui->chanlist_list), 0, 90);	gtk_clist_set_column_width (GTK_CLIST (serv->gui->chanlist_list), 1, 45);	gtk_clist_set_column_width (GTK_CLIST (serv->gui->chanlist_list), 2, 165);	gtk_clist_column_titles_active (GTK_CLIST (serv->gui->chanlist_list));	gtk_signal_connect (GTK_OBJECT (serv->gui->chanlist_list), "click_column",							  GTK_SIGNAL_FUNC (chanlist_click_column),							  (gpointer) serv);	gtk_clist_set_compare_func (GTK_CLIST (serv->gui->chanlist_list),										 (GtkCListCompareFunc)										 chanlist_compare_text_ignore_case);	gtk_clist_set_sort_column (GTK_CLIST (serv->gui->chanlist_list), 0);	gtk_clist_set_auto_sort (GTK_CLIST (serv->gui->chanlist_list), 1);	/* makes the horiz. scrollbar appear when needed */	gtk_clist_set_column_auto_resize (GTK_CLIST (serv->gui->chanlist_list),											2, TRUE);	/* make a label to store the user/channel info */	wid = gtk_label_new ("");	gtk_widget_show (wid);	gtk_box_pack_start (GTK_BOX (vbox), wid, 0, 0, 0);	serv->gui->chanlist_label = wid;	hbox = gtk_hbox_new (0, 1);	gtk_container_set_border_width (GTK_CONTAINER (hbox), 4);	gtk_box_pack_end (GTK_BOX (vbox), hbox, 0, 0, 0);	gtk_widget_show (hbox);	serv->gui->chanlist_refresh =		gtkutil_button (serv->gui->chanlist_window, GNOME_STOCK_PIXMAP_REFRESH,							 _("Refresh the list"), chanlist_refresh, serv, hbox);	gtkutil_button (serv->gui->chanlist_window, GNOME_STOCK_PIXMAP_SAVE,						 _("Save the list"), chanlist_save, serv, hbox);	gtkutil_button (serv->gui->chanlist_window, GNOME_STOCK_PIXMAP_JUMP_TO,						 _("Join Channel"), chanlist_join, serv, hbox);	/* connect a destroy event handler to this window so that the dynamic	   memory can be freed */	gtk_signal_connect (GTK_OBJECT (serv->gui->chanlist_window), "destroy",							  GTK_SIGNAL_FUNC (chanlist_destroy_widget),							  (gpointer) serv);	/* reset the sort vars and counters. */	chanlist_reset_counters (serv);	chanlist_reset_sort_vars (serv);	gtk_widget_show (serv->gui->chanlist_window);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -