Mercurial > pidgin.yaz
diff pidgin/plugins/convcolors.c @ 15374:5fe8042783c1
Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sat, 20 Jan 2007 02:32:10 +0000 |
parents | |
children | b25a5eddff9c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/plugins/convcolors.c Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,372 @@ +/* + * 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> + +/* Gaim 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 +{ + GaimMessageFlags flag; + char *prefix; + const char *text; +} formats[] = +{ + {GAIM_MESSAGE_ERROR, PREF_ERROR, N_("Error Messages")}, + {GAIM_MESSAGE_NICK, PREF_NICK, N_("Highlighted Messages")}, + {GAIM_MESSAGE_SYSTEM, PREF_SYSTEM, N_("System Messages")}, + {GAIM_MESSAGE_SEND, PREF_SEND, N_("Sent Messages")}, + {GAIM_MESSAGE_RECV, PREF_RECV, N_("Received Messages")}, + {0, NULL, NULL} +}; + +static gboolean +displaying_msg(GaimAccount *account, const char *who, char **displaying, + GaimConversation *conv, GaimMessageFlags 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 ((gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM && + !gaim_prefs_get_bool(PREF_IMS)) || + (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT && + !gaim_prefs_get_bool(PREF_CHATS))) + return FALSE; + + g_snprintf(tmp, sizeof(tmp), "%s/color", formats[i].prefix); + color = gaim_prefs_get_string(tmp); + + g_snprintf(tmp, sizeof(tmp), "%s/format", formats[i].prefix); + f = gaim_prefs_get_int(tmp); + bold = (f & FONT_BOLD); + italic = (f & FONT_ITALIC); + underline = (f & FONT_UNDERLINE); + + if (gaim_prefs_get_bool(PREF_IGNORE)) + { + t = *displaying; + *displaying = gaim_markup_strip_html(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 gboolean +plugin_load(GaimPlugin *plugin) +{ + gaim_signal_connect(gaim_gtk_conversations_get_handle(), + "displaying-im-msg", plugin, + GAIM_CALLBACK(displaying_msg), NULL); + gaim_signal_connect(gaim_gtk_conversations_get_handle(), + "displaying-chat-msg", plugin, + GAIM_CALLBACK(displaying_msg), NULL); + return TRUE; +} + +static gboolean +plugin_unload(GaimPlugin *plugin) +{ + return TRUE; +} + +/* Ripped from GaimRC */ +static void +color_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); + + gaim_prefs_set_string(tmp, colorstr); + } + + gtk_widget_destroy(GTK_WIDGET(color_dialog)); +} + +static void +set_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(gaim_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 void +toggle_something(const char *prefix, int format) +{ + int f; + char tmp[128]; + + g_snprintf(tmp, sizeof(tmp), "%s/format", prefix); + f = gaim_prefs_get_int(tmp); + f ^= format; + gaim_prefs_set_int(tmp, f); +} + +static void +toggle_bold(GtkWidget *widget, gpointer data) +{ + toggle_something(data, FONT_BOLD); +} + +static void +toggle_italic(GtkWidget *widget, gpointer data) +{ + toggle_something(data, FONT_ITALIC); +} + +static void +toggle_underline(GtkWidget *widget, gpointer data) +{ + toggle_something(data, FONT_UNDERLINE); +} + +static GtkWidget * +get_config_frame(GaimPlugin *plugin) +{ + GtkWidget *ret; + GtkWidget *frame; + int i; + + ret = gtk_vbox_new(FALSE, GAIM_HIG_CAT_SPACE); + gtk_container_set_border_width(GTK_CONTAINER(ret), GAIM_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 = gaim_prefs_get_int(tmp); + + frame = gaim_gtk_make_frame(ret, _(formats[i].text)); + vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); + gtk_box_pack_start(GTK_BOX(frame), vbox, FALSE, FALSE, 0); + + hbox = gtk_hbox_new(FALSE, GAIM_HIG_BOX_SPACE); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + button = gaim_pixbuf_button_from_stock(" Color", GTK_STOCK_SELECT_COLOR, + GAIM_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 = gaim_gtk_make_frame(ret, _("General")); + gaim_gtk_prefs_checkbox(_("Ignore incoming format"), PREF_IGNORE, frame); + gaim_gtk_prefs_checkbox(_("Apply in Chats"), PREF_CHATS, frame); + gaim_gtk_prefs_checkbox(_("Apply in IMs"), PREF_IMS, frame); + + gtk_widget_show_all(ret); + return ret; +} + +static GaimGtkPluginUiInfo ui_info = +{ + get_config_frame, + 0, +}; + +static GaimPluginInfo info = +{ + GAIM_PLUGIN_MAGIC, /* Magic */ + GAIM_MAJOR_VERSION, /* Gaim Major Version */ + GAIM_MINOR_VERSION, /* Gaim Minor Version */ + GAIM_PLUGIN_STANDARD, /* plugin type */ + GAIM_GTK_PLUGIN_TYPE, /* ui requirement */ + 0, /* flags */ + NULL, /* dependencies */ + GAIM_PRIORITY_DEFAULT, /* priority */ + + PLUGIN_ID, /* plugin id */ + PLUGIN_NAME, /* name */ + VERSION, /* version */ + PLUGIN_SUMMARY, /* summary */ + PLUGIN_DESCRIPTION, /* description */ + PLUGIN_AUTHOR, /* author */ + GAIM_WEBSITE, /* website */ + + plugin_load, /* load */ + plugin_unload, /* unload */ + NULL, /* destroy */ + + &ui_info, /* ui_info */ + NULL, /* extra_info */ + NULL, /* prefs_info */ + NULL /* actions */ +}; + +static void +init_plugin(GaimPlugin *plugin) +{ + gaim_prefs_add_none(PREF_PREFIX); + + gaim_prefs_add_bool(PREF_IGNORE, TRUE); + gaim_prefs_add_bool(PREF_CHATS, TRUE); + gaim_prefs_add_bool(PREF_IMS, TRUE); + + gaim_prefs_add_none(PREF_SEND); + gaim_prefs_add_none(PREF_RECV); + gaim_prefs_add_none(PREF_SYSTEM); + gaim_prefs_add_none(PREF_ERROR); + gaim_prefs_add_none(PREF_NICK); + + gaim_prefs_add_string(PREF_SEND_C, "#909090"); + gaim_prefs_add_string(PREF_RECV_C, "#000000"); + gaim_prefs_add_string(PREF_SYSTEM_C, "#50a050"); + gaim_prefs_add_string(PREF_ERROR_C, "#ff0000"); + gaim_prefs_add_string(PREF_NICK_C, "#0000dd"); + + gaim_prefs_add_int(PREF_SEND_F, 0); + gaim_prefs_add_int(PREF_RECV_F, 0); + gaim_prefs_add_int(PREF_SYSTEM_F, FONT_ITALIC); + gaim_prefs_add_int(PREF_ERROR_F, FONT_BOLD | FONT_UNDERLINE); + gaim_prefs_add_int(PREF_NICK_F, FONT_BOLD); +} + +GAIM_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info)