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

📄 convcolors.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
字号:
/* * Conversation Colors * Copyright (C) 2006 * * 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 "internal.h"#define PLUGIN_ID			"gtk-plugin_pack-convcolors"#define PLUGIN_NAME			N_("Conversation Colors")#define PLUGIN_STATIC_NAME	"Conversation Colors"#define PLUGIN_SUMMARY		N_("Customize colors in the conversation window")#define PLUGIN_DESCRIPTION	N_("Customize colors in the conversation window")#define PLUGIN_AUTHOR		"Sadrul H Chowdhury <sadrul@users.sourceforge.net>"/* System headers */#include <gdk/gdk.h>#include <glib.h>#include <gtk/gtk.h>/* Purple headers */#include <gtkplugin.h>#include <version.h>#include <conversation.h>#include <gtkconv.h>#include <gtkprefs.h>#include <gtkutils.h>#define	PREF_PREFIX	"/plugins/gtk/" PLUGIN_ID#define PREF_IGNORE	PREF_PREFIX "/ignore_incoming"#define PREF_CHATS	PREF_PREFIX "/chats"#define PREF_IMS	PREF_PREFIX "/ims"#define	PREF_SEND	PREF_PREFIX "/send"#define	PREF_SEND_C	PREF_SEND "/color"#define	PREF_SEND_F	PREF_SEND "/format"#define PREF_RECV	PREF_PREFIX "/recv"#define	PREF_RECV_C	PREF_RECV "/color"#define	PREF_RECV_F	PREF_RECV "/format"#define PREF_SYSTEM	PREF_PREFIX "/system"#define	PREF_SYSTEM_C	PREF_SYSTEM "/color"#define	PREF_SYSTEM_F	PREF_SYSTEM "/format"#define PREF_ERROR	PREF_PREFIX "/error"#define	PREF_ERROR_C	PREF_ERROR "/color"#define	PREF_ERROR_F	PREF_ERROR "/format"#define PREF_NICK	PREF_PREFIX "/nick"#define	PREF_NICK_C	PREF_NICK "/color"#define	PREF_NICK_F	PREF_NICK "/format"enum{	FONT_BOLD		= 1 << 0,	FONT_ITALIC		= 1 << 1,	FONT_UNDERLINE	= 1 << 2};struct{	PurpleMessageFlags flag;	char *prefix;	const char *text;} formats[] = {	{PURPLE_MESSAGE_ERROR, PREF_ERROR, N_("Error Messages")},	{PURPLE_MESSAGE_NICK, PREF_NICK, N_("Highlighted Messages")},	{PURPLE_MESSAGE_SYSTEM, PREF_SYSTEM, N_("System Messages")},	{PURPLE_MESSAGE_SEND, PREF_SEND, N_("Sent Messages")},	{PURPLE_MESSAGE_RECV, PREF_RECV, N_("Received Messages")},	{0, NULL, NULL}};static gbooleandisplaying_msg(PurpleAccount *account, const char *who, char **displaying,				PurpleConversation *conv, PurpleMessageFlags flags){	int i;	char tmp[128], *t;	gboolean bold, italic, underline;	int f;	const char *color;	for (i = 0; formats[i].prefix; i++)		if (flags & formats[i].flag)			break;	if (!formats[i].prefix)		return FALSE;	if ((purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM &&			!purple_prefs_get_bool(PREF_IMS)) ||			(purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT &&			!purple_prefs_get_bool(PREF_CHATS)))		return FALSE;	g_snprintf(tmp, sizeof(tmp), "%s/color", formats[i].prefix);	color = purple_prefs_get_string(tmp);	g_snprintf(tmp, sizeof(tmp), "%s/format", formats[i].prefix);	f = purple_prefs_get_int(tmp);	bold = (f & FONT_BOLD);	italic = (f & FONT_ITALIC);	underline = (f & FONT_UNDERLINE);	if (purple_prefs_get_bool(PREF_IGNORE))	{		t = *displaying;		*displaying = purple_markup_strip_html(t);		g_free(t);		t = *displaying;		*displaying = g_markup_escape_text(t, -1);		g_free(t);		/* Restore the links */		t = *displaying;		*displaying = purple_markup_linkify(t);		g_free(t);	}	if (color && *color)	{		t = *displaying;		*displaying = g_strdup_printf("<FONT COLOR=\"%s\">%s</FONT>", color, t);		g_free(t);	}	t = *displaying;	*displaying = g_strdup_printf("%s%s%s%s%s%s%s",						bold ? "<B>" : "</B>",						italic ? "<I>" : "</I>",						underline ? "<U>" : "</U>",						t, 						bold ? "</B>" : "<B>",						italic ? "</I>" : "<I>",						underline ? "</U>" : "<U>"			);	g_free(t);	return FALSE;}static gbooleanplugin_load(PurplePlugin *plugin){	purple_signal_connect(pidgin_conversations_get_handle(),					"displaying-im-msg", plugin,					PURPLE_CALLBACK(displaying_msg), NULL);	purple_signal_connect(pidgin_conversations_get_handle(),					"displaying-chat-msg", plugin,					PURPLE_CALLBACK(displaying_msg), NULL);	return TRUE;}static gbooleanplugin_unload(PurplePlugin *plugin){	return TRUE;}/* Ripped from PurpleRC */static voidcolor_response(GtkDialog *color_dialog, gint response, const char *data){	if (response == GTK_RESPONSE_OK)	{		GtkWidget *colorsel = GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel;		GdkColor color;		char colorstr[8];		char tmp[128];		gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(colorsel), &color);		g_snprintf(colorstr, sizeof(colorstr), "#%02X%02X%02X",		           color.red/256, color.green/256, color.blue/256);		g_snprintf(tmp, sizeof(tmp), "%s/color", data);		purple_prefs_set_string(tmp, colorstr);	}	gtk_widget_destroy(GTK_WIDGET(color_dialog));}static voidset_color(GtkWidget *widget, const char *data){	GtkWidget *color_dialog = NULL;	GdkColor color;	char title[128];	char tmp[128];	g_snprintf(title, sizeof(title), _("Select Color for %s"), _(data));	color_dialog = gtk_color_selection_dialog_new(title);	g_signal_connect(G_OBJECT(color_dialog), "response",	                 G_CALLBACK(color_response), (gpointer)data);	g_snprintf(tmp, sizeof(tmp), "%s/color", data);	if (gdk_color_parse(purple_prefs_get_string(tmp), &color))	{		gtk_color_selection_set_current_color(				GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel), &color);	}	gtk_window_present(GTK_WINDOW(color_dialog));}static voidtoggle_something(const char *prefix, int format){	int f;	char tmp[128];		g_snprintf(tmp, sizeof(tmp), "%s/format", prefix);	f = purple_prefs_get_int(tmp);	f ^= format;	purple_prefs_set_int(tmp, f);}		static voidtoggle_bold(GtkWidget *widget, gpointer data){	toggle_something(data, FONT_BOLD);}static voidtoggle_italic(GtkWidget *widget, gpointer data){	toggle_something(data, FONT_ITALIC);}static voidtoggle_underline(GtkWidget *widget, gpointer data){	toggle_something(data, FONT_UNDERLINE);}static GtkWidget *get_config_frame(PurplePlugin *plugin){	GtkWidget *ret;	GtkWidget *frame;	int i;	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);	gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER);	for (i = 0; formats[i].prefix; i++)	{		char tmp[128];		int f;		GtkWidget *vbox, *hbox, *button;		g_snprintf(tmp, sizeof(tmp), "%s/format", formats[i].prefix);		f = purple_prefs_get_int(tmp);		frame = pidgin_make_frame(ret, _(formats[i].text));		vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);		gtk_box_pack_start(GTK_BOX(frame), vbox, FALSE, FALSE, 0);		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);		button = pidgin_pixbuf_button_from_stock(" Color", GTK_STOCK_SELECT_COLOR,				PIDGIN_BUTTON_HORIZONTAL);		gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);		g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(set_color),				formats[i].prefix);		button = gtk_check_button_new_with_label(_("Bold"));		gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);		if (f & FONT_BOLD)			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);		g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_bold),				formats[i].prefix);				button = gtk_check_button_new_with_label(_("Italic"));		gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);		if (f & FONT_ITALIC)			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);		g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_italic),				formats[i].prefix);				button = gtk_check_button_new_with_label(_("Underline"));		gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);		if (f & FONT_UNDERLINE)			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);		g_signal_connect(G_OBJECT(button), "clicked",				G_CALLBACK(toggle_underline), formats[i].prefix);	}	frame = pidgin_make_frame(ret, _("General"));	pidgin_prefs_checkbox(_("Ignore incoming format"), PREF_IGNORE, frame);	pidgin_prefs_checkbox(_("Apply in Chats"), PREF_CHATS, frame);	pidgin_prefs_checkbox(_("Apply in IMs"), PREF_IMS, frame);	gtk_widget_show_all(ret);	return ret;}static PidginPluginUiInfo ui_info = {	get_config_frame,	0,	/* padding */	NULL,	NULL,	NULL,	NULL};static PurplePluginInfo info ={	PURPLE_PLUGIN_MAGIC,            /* Magic              */	PURPLE_MAJOR_VERSION,           /* Purple Major Version */	PURPLE_MINOR_VERSION,           /* Purple Minor Version */	PURPLE_PLUGIN_STANDARD,         /* plugin type        */	PIDGIN_PLUGIN_TYPE,         /* ui requirement     */	0,                            /* flags              */	NULL,                         /* dependencies       */	PURPLE_PRIORITY_DEFAULT,        /* priority           */	PLUGIN_ID,                    /* plugin id          */	PLUGIN_NAME,                  /* name               */	VERSION,                      /* version            */	PLUGIN_SUMMARY,               /* summary            */	PLUGIN_DESCRIPTION,           /* description        */	PLUGIN_AUTHOR,                /* author             */	PURPLE_WEBSITE,                 /* website            */	plugin_load,                  /* load               */	plugin_unload,                /* unload             */	NULL,                         /* destroy            */	&ui_info,                     /* ui_info            */	NULL,                         /* extra_info         */	NULL,                         /* prefs_info         */	NULL,                         /* actions            */	/* padding */	NULL,	NULL,	NULL,	NULL};static voidinit_plugin(PurplePlugin *plugin){	purple_prefs_add_none(PREF_PREFIX);	purple_prefs_add_bool(PREF_IGNORE, TRUE);	purple_prefs_add_bool(PREF_CHATS, TRUE);	purple_prefs_add_bool(PREF_IMS, TRUE);	purple_prefs_add_none(PREF_SEND);	purple_prefs_add_none(PREF_RECV);	purple_prefs_add_none(PREF_SYSTEM);	purple_prefs_add_none(PREF_ERROR);	purple_prefs_add_none(PREF_NICK);	purple_prefs_add_string(PREF_SEND_C, "#909090");	purple_prefs_add_string(PREF_RECV_C, "#000000");	purple_prefs_add_string(PREF_SYSTEM_C, "#50a050");	purple_prefs_add_string(PREF_ERROR_C, "#ff0000");	purple_prefs_add_string(PREF_NICK_C, "#0000dd");	purple_prefs_add_int(PREF_SEND_F, 0);	purple_prefs_add_int(PREF_RECV_F, 0);	purple_prefs_add_int(PREF_SYSTEM_F, FONT_ITALIC);	purple_prefs_add_int(PREF_ERROR_F, FONT_BOLD | FONT_UNDERLINE);	purple_prefs_add_int(PREF_NICK_F, FONT_BOLD);}PURPLE_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info)

⌨️ 快捷键说明

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