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

📄 textgui.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
字号:
/* X-Chat * Copyright (C) 1998 Peter Zelezny. * * 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 <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "fe-gtk.h"#include "../common/xchat.h"#include "../common/xchatc.h"#include "../common/cfgfiles.h"#include "../common/plugin.h"#include "../common/outbound.h"#include "../common/text.h"#include "gtkutil.h"#include "xtext.h"#include "wins.h"#include "palette.h"#include "textgui.h"struct text_event{	char *name;	char **help;	char *def;	int num_args;	char *sound;};extern struct text_event te[];extern char **pntevts_text;extern char **pntevts;static GtkWidget *pevent_dialog = NULL, *pevent_dialog_twid,	*pevent_dialog_entry, *pevent_dialog_sound_entry,	*pevent_dialog_list, *pevent_dialog_hlist;intget_stamp_str (time_t tim, char *dest, int size){	return strftime (dest, size, prefs.stamp_format, localtime (&tim));}static voidPrintTextLine (GtkWidget * textwidget, unsigned char *text, int len, int indent){	char *tab, *new_text;	int leftlen;	if (len == 0)		len = 1;	if (!indent)	{		if (prefs.timestamp)		{			char buf[64];			int stamp_size;			stamp_size = get_stamp_str (time (0), buf, sizeof (buf));			new_text = malloc (len + stamp_size + 1);			memcpy (new_text, buf, stamp_size);			memcpy (new_text + stamp_size, text, len);			gtk_xtext_append (GTK_XTEXT (textwidget), new_text, len + stamp_size);			free (new_text);		} else			gtk_xtext_append (GTK_XTEXT (textwidget), text, len);		return;	}	tab = strchr (text, '\t');	if (tab && (unsigned long) tab < (unsigned long) (text + len))	{		leftlen = (unsigned long) tab - (unsigned long) text;		gtk_xtext_append_indent (GTK_XTEXT (textwidget),										 text, leftlen, tab + 1, len - (leftlen + 1));	} else		gtk_xtext_append_indent (GTK_XTEXT (textwidget), 0, 0, text, len);}voidPrintTextRaw (GtkWidget * textwidget, unsigned char *text, int indent){	char *last_text = text;	int len = 0;	/* split the text into separate lines */	while (1)	{		switch (*text)		{		case 0:			PrintTextLine (textwidget, last_text, len, indent);			return;		case '\n':			PrintTextLine (textwidget, last_text, len, indent);			text++;			if (*text == 0)				return;			last_text = text;			len = 0;			break;		case ATTR_BEEP:			*text = ' ';			if (!prefs.filterbeep)				gdk_beep ();		default:			text++;			len++;		}	}}static voidpevent_dialog_close (gpointer * arg){	pevent_dialog = NULL;	pevent_save (NULL);}static voidpevent_dialog_update_sound (GtkWidget * wid, GtkWidget * clist){	int row, sig;	row = gtkutil_clist_selection (pevent_dialog_list);	if (row == -1)		return;	gtk_clist_set_text (GTK_CLIST (clist), row, 2,							  gtk_entry_get_text (GTK_ENTRY (wid)));	sig = (int) gtk_clist_get_row_data (GTK_CLIST (clist), row);	if (te[sig].sound)		free (te[sig].sound);	te[sig].sound = strdup (gtk_entry_get_text (GTK_ENTRY (wid)));}static voidpevent_dialog_update (GtkWidget * wid, GtkWidget * twid){	int row, len, m;	char *text, *out;	int sig;	row = gtkutil_clist_selection (pevent_dialog_list);	if (row == -1)		return;	sig = (int) gtk_clist_get_row_data (GTK_CLIST (pevent_dialog_list), row);	text = gtk_entry_get_text (GTK_ENTRY (wid));	len = strlen (text);	if (pevt_build_string (text, &out, &m) != 0)	{		gtkutil_simpledialog (_("There was an error parsing the string"));		return;	}	if (m > te[sig].num_args)	{		free (out);		out = malloc (4096);		snprintf (out, 4096,					 _("This signal is only passed %d args, $%d is invalid"),					 te[sig].num_args, m);		gtkutil_simpledialog (out);		free (out);		return;	}	gtk_clist_set_text (GTK_CLIST (pevent_dialog_list), row, 1, text);	if (pntevts_text[sig])		free (pntevts_text[sig]);	if (pntevts[sig])		free (pntevts[sig]);	pntevts_text[sig] = malloc (len + 1);	memcpy (pntevts_text[sig], text, len + 1);	pntevts[sig] = out;	out = malloc (len + 2);	memcpy (out, text, len + 1);	out[len] = '\n';	out[len + 1] = 0;	check_special_chars (out, TRUE);	PrintTextRaw (twid, out, 0);	free (out);}static voidpevent_dialog_unselect (GtkWidget * clist, gint row, gint column,								GdkEventButton * even, gpointer none){	gtk_entry_set_text (GTK_ENTRY (pevent_dialog_sound_entry), "");	gtk_entry_set_text (GTK_ENTRY (pevent_dialog_entry), "");	gtk_clist_clear (GTK_CLIST (pevent_dialog_hlist));}static voidpevent_dialog_hfill (GtkWidget * list, int e){	gchar *nnew[2];	int i = 0;	char *text, buf[64];	if (!text_event (e))		return;	text = _(te[e].help[i]);	gtk_clist_clear (GTK_CLIST (list));	while (text)	{		snprintf (buf, sizeof (buf), "%d", i + 1);		if (text[0] == '\001')			text++;		nnew[0] = buf;		nnew[1] = text;		gtk_clist_append (GTK_CLIST (list), nnew);		i++;		text = _(te[e].help[i]);	}}static voidpevent_dialog_select (GtkWidget * clist, gint row, gint column,							 GdkEventButton * even, gpointer none){	char *cmd, *snd;	int sig;	row = gtkutil_clist_selection (pevent_dialog_list);	if (row != -1)	{		gtk_clist_get_text (GTK_CLIST (clist), row, 1, &cmd);		gtk_entry_set_text (GTK_ENTRY (pevent_dialog_entry), cmd);		gtk_clist_get_text (GTK_CLIST (clist), row, 2, &snd);		gtk_entry_set_text (GTK_ENTRY (pevent_dialog_sound_entry), snd);		sig = (int) gtk_clist_get_row_data (GTK_CLIST (clist), row);		pevent_dialog_hfill (pevent_dialog_hlist, sig);	} else	{		pevent_dialog_unselect (0, 0, 0, 0, 0);	}}static voidpevent_dialog_fill (GtkWidget * list){	int i, row;	gchar *nnew[3];	gtk_clist_clear (GTK_CLIST (list));	for (i = 0; i < NUM_XP; i++)	{		if (!text_event (i))			continue;		nnew[0] = te[i].name;		nnew[1] = pntevts_text[i];		if (te[i].sound)			nnew[2] = te[i].sound;		else			nnew[2] = "";		row = gtk_clist_append (GTK_CLIST (list), nnew);		gtk_clist_set_row_data (GTK_CLIST (list), row, (void *) i);	}}static voidpevent_save_req_cb (void *arg1, void *arg2, char *file){	if (file)	{		pevent_save (file);		free (file);	}}static voidpevent_save_cb (GtkWidget * wid, void *data){	if (data)	{		gtkutil_file_req (_("Print Texts File"), pevent_save_req_cb, NULL, NULL,								TRUE);		return;	}	pevent_save (NULL);}static voidpevent_load_req_cb (void *arg1, void *arg2, char *file){	if (file)	{		pevent_load (file);		pevent_make_pntevts ();		pevent_dialog_fill (pevent_dialog_list);		pevent_dialog_select (pevent_dialog_list, -1, -1, NULL, NULL);		free (file);	}}static voidpevent_load_cb (GtkWidget * wid, void *data){	gtkutil_file_req (_("Print Texts File"), pevent_load_req_cb, NULL, NULL,							FALSE);}static voidpevent_ok_cb (GtkWidget * wid, void *data){	gtk_widget_destroy (pevent_dialog);}static voidpevent_test_cb (GtkWidget * wid, GtkWidget * twid){	int len, n;	char *out, *text;	for (n = 0; n < NUM_XP; n++)	{		if (!text_event (n))			continue;		text = _(pntevts_text[n]);		len = strlen (text);		out = malloc (len + 2);		memcpy (out, text, len + 1);		out[len] = '\n';		out[len + 1] = 0;		check_special_chars (out, TRUE);		PrintTextRaw (twid, out, 0);		free (out);	}}/* from settings.c - but its not there anymore */static voidgui_entry (char *label, int max, GtkWidget * box, GtkWidget ** entry){	GtkWidget *wid, *hbox;	hbox = gtk_hbox_new (0, 0);	gtk_widget_show (hbox);	gtkutil_label_new (label, hbox);	*entry = wid = gtk_entry_new_with_max_length (max);	gtk_container_add (GTK_CONTAINER (hbox), wid);	gtk_widget_show (wid);	gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);}voidpevent_dialog_show (){	GtkWidget *vbox, *vbox2, *hbox, *tbox, *wid, *bh, *th;	gchar *titles[] = { _("Event"), _("Text"), _("Sound") };	gchar *help_titles[] = { _("$ Number"), _("Description") };	if (pevent_dialog)	{		wins_bring_tofront (pevent_dialog);		return;	}	pevent_dialog = maingui_window ("edit events", _("Edit Events"),											  TRUE, FALSE, pevent_dialog_close, NULL,											  600, 455, NULL);	vbox2 = gtk_vbox_new (0, 2);	vbox = wins_get_vbox (pevent_dialog);	gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);	wid = gtk_vpaned_new ();	th = gtk_vbox_new (0, 2);	bh = gtk_vbox_new (0, 2);	gtk_widget_show (th);	gtk_widget_show (bh);	gtk_paned_pack1 (GTK_PANED (wid), th, 1, 1);	gtk_paned_pack2 (GTK_PANED (wid), bh, 0, 1);	gtk_box_pack_start (GTK_BOX (vbox), wid, 1, 1, 0);	gtk_widget_show (wid);	pevent_dialog_list = gtkutil_clist_new (3, titles, th, GTK_POLICY_ALWAYS,														 pevent_dialog_select, 0,														 pevent_dialog_unselect, 0,														 GTK_SELECTION_BROWSE);	gtk_clist_set_column_width (GTK_CLIST (pevent_dialog_list), 0, 80);	gtk_clist_set_column_width (GTK_CLIST (pevent_dialog_list), 1, 380);	pevent_dialog_twid = gtk_xtext_new (0, 0);	gtk_xtext_set_palette (GTK_XTEXT (pevent_dialog_twid), colors);	gtk_xtext_set_font (GTK_XTEXT (pevent_dialog_twid), font_normal, 0);	gtk_xtext_set_background (GTK_XTEXT (pevent_dialog_twid),									  channelwin_pix, prefs.transparent, prefs.tint);	pevent_dialog_entry = gtk_entry_new_with_max_length (255);	gtk_widget_set_usize (pevent_dialog_entry, 96, 0);	gtk_signal_connect (GTK_OBJECT (pevent_dialog_entry), "activate",							  GTK_SIGNAL_FUNC (pevent_dialog_update),							  pevent_dialog_twid);	gtk_box_pack_start (GTK_BOX (bh), pevent_dialog_entry, 0, 0, 0);	gtk_widget_show (pevent_dialog_entry);	gui_entry (_("Sound file: "), 64, bh, &pevent_dialog_sound_entry);	gtk_signal_connect (GTK_OBJECT (pevent_dialog_sound_entry), "activate",							  GTK_SIGNAL_FUNC (pevent_dialog_update_sound),							  pevent_dialog_list);	tbox = gtk_hbox_new (0, 0);	gtk_container_add (GTK_CONTAINER (bh), tbox);	gtk_widget_show (tbox);	gtk_widget_set_usize (pevent_dialog_twid, 150, 20);	gtk_container_add (GTK_CONTAINER (tbox), pevent_dialog_twid);	gtk_widget_show (pevent_dialog_twid);	wid = gtk_vscrollbar_new (GTK_XTEXT (pevent_dialog_twid)->adj);	gtk_box_pack_start (GTK_BOX (tbox), wid, FALSE, FALSE, 0);	show_and_unfocus (wid);	pevent_dialog_hlist = gtkutil_clist_new (2, help_titles, bh,														  GTK_POLICY_ALWAYS,														  NULL, 0, NULL, 0,														  GTK_SELECTION_BROWSE);	gtk_clist_set_column_width (GTK_CLIST (pevent_dialog_list), 0, 120);	gtk_widget_show (pevent_dialog_hlist);	pevent_dialog_fill (pevent_dialog_list);	hbox = gtk_hbox_new (0, 2);	gtk_box_pack_end (GTK_BOX (vbox), hbox, 0, 0, 0);	wid = gtk_button_new_with_label (_("Save"));	gtk_box_pack_end (GTK_BOX (hbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (pevent_save_cb), NULL);	gtk_widget_show (wid);	wid = gtk_button_new_with_label (_("Save As"));	gtk_box_pack_end (GTK_BOX (hbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (pevent_save_cb), (void *) 1);	gtk_widget_show (wid);	wid = gtk_button_new_with_label (_("Load From"));	gtk_box_pack_end (GTK_BOX (hbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (pevent_load_cb), (void *) 0);	gtk_widget_show (wid);	wid = gtk_button_new_with_label (_("Test All"));	gtk_box_pack_end (GTK_BOX (hbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (pevent_test_cb), pevent_dialog_twid);	gtk_widget_show (wid);#ifdef USE_GNOME	wid = gnome_stock_button (GNOME_STOCK_BUTTON_OK);#else	wid = gtk_button_new_with_label (_("Ok"));#endif	gtk_box_pack_start (GTK_BOX (hbox), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (pevent_ok_cb), NULL);	gtk_widget_show (wid);	gtk_widget_show (hbox);	gtk_widget_show (pevent_dialog);}

⌨️ 快捷键说明

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