* 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., 51 Franklin Street, Fifth Floor, Boston, MA #define PLUGIN_ID "gtk-plugin_pack-convcolors" #define PLUGIN_NAME N_("Conversation Colors") #define PLUGIN_STATIC_NAME ConversationColors #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>" #include <conversation.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_SEND_E PREF_SEND "/enabled" #define PREF_RECV PREF_PREFIX "/recv" #define PREF_RECV_C PREF_RECV "/color" #define PREF_RECV_F PREF_RECV "/format" #define PREF_RECV_E PREF_RECV "/enabled" #define PREF_SYSTEM PREF_PREFIX "/system" #define PREF_SYSTEM_C PREF_SYSTEM "/color" #define PREF_SYSTEM_F PREF_SYSTEM "/format" #define PREF_SYSTEM_E PREF_SYSTEM "/enabled" #define PREF_ERROR PREF_PREFIX "/error" #define PREF_ERROR_C PREF_ERROR "/color" #define PREF_ERROR_F PREF_ERROR "/format" #define PREF_ERROR_E PREF_ERROR "/enabled" #define PREF_NICK PREF_PREFIX "/nick" #define PREF_NICK_C PREF_NICK "/color" #define PREF_NICK_F PREF_NICK "/format" #define PREF_NICK_E PREF_NICK "/enabled" {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")}, displaying_msg(PurpleAccount *account, const char *who, char **displaying, PurpleConversation *conv, PurpleMessageFlags flags) gboolean bold, italic, underline; for (i = 0; formats[i].prefix; i++) if (flags & formats[i].flag) g_snprintf(tmp, sizeof(tmp), "%s/enabled", formats[i].prefix); if (!purple_prefs_get_bool(tmp) || (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))) 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); italic = (f & FONT_ITALIC); underline = (f & FONT_UNDERLINE); rtl = purple_markup_is_rtl(*displaying); if (purple_prefs_get_bool(PREF_IGNORE)) /* This seems to be necessary, especially for received messages. */ *displaying = purple_strreplace(t, "\n", "<br>"); *displaying = purple_markup_strip_html(t); *displaying = g_markup_escape_text(t, -1); *displaying = purple_markup_linkify(t); *displaying = g_strdup_printf("<FONT COLOR=\"%s\">%s</FONT>", color, t); *displaying = g_strdup_printf("%s%s%s%s%s%s%s%s%s", underline ? "<U>" : "</U>", rtl ? "<SPAN style=\"direction:rtl;text-align:right;\">" : "", underline ? "</U>" : "<U>" plugin_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); plugin_unload(PurplePlugin *plugin) /* Ripped from PurpleRC */ color_response(GtkDialog *color_dialog, gint response, const char *data) if (response == GTK_RESPONSE_OK) #if GTK_CHECK_VERSION(2,14,0) gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_dialog)); GtkWidget *colorsel = GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel; 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)); set_color(GtkWidget *widget, const char *data) GtkWidget *color_dialog = NULL; 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)) #if GTK_CHECK_VERSION(2,14,0) gtk_color_selection_set_current_color(GTK_COLOR_SELECTION( gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(color_dialog))), gtk_color_selection_set_current_color( GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(color_dialog)->colorsel), gtk_window_present(GTK_WINDOW(color_dialog)); toggle_enabled(GtkWidget *widget, gpointer data) const char *prefix = (char *)data; g_snprintf(tmp, sizeof(tmp), "%s/enabled", prefix); e = purple_prefs_get_bool(tmp); purple_prefs_set_bool(tmp, !e); toggle_something(const char *prefix, int format) g_snprintf(tmp, sizeof(tmp), "%s/format", prefix); f = purple_prefs_get_int(tmp); purple_prefs_set_int(tmp, f); toggle_bold(GtkWidget *widget, gpointer data) toggle_something(data, FONT_BOLD); toggle_italic(GtkWidget *widget, gpointer data) toggle_something(data, FONT_ITALIC); toggle_underline(GtkWidget *widget, gpointer data) toggle_something(data, FONT_UNDERLINE); enable_toggled(const char *name, PurplePrefType type, gconstpointer val, gpointer data) GtkWidget *widget = (GtkWidget *)data; gtk_widget_set_sensitive(widget, GPOINTER_TO_INT(val)); disconnect_prefs_callbacks(GtkObject *object, gpointer data) PurplePlugin *plugin = (PurplePlugin *)data; purple_prefs_disconnect_by_handle(plugin); get_config_frame(PurplePlugin *plugin) 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++) GtkWidget *vbox, *hbox, *button; g_snprintf(tmp2, sizeof(tmp2), "%s/enabled", formats[i].prefix); e = purple_prefs_get_bool(tmp2); 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 = gtk_check_button_new_with_label(_("Enabled")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_enabled), 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), gtk_widget_set_sensitive(button, e); purple_prefs_connect_callback(plugin, tmp2, enable_toggled, button); button = gtk_check_button_new_with_label(_("Bold")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_bold), gtk_widget_set_sensitive(button, e); purple_prefs_connect_callback(plugin, tmp2, enable_toggled, button); button = gtk_check_button_new_with_label(_("Italic")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_italic), gtk_widget_set_sensitive(button, e); purple_prefs_connect_callback(plugin, tmp2, enable_toggled, button); button = gtk_check_button_new_with_label(_("Underline")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_underline), formats[i].prefix); gtk_widget_set_sensitive(button, e); purple_prefs_connect_callback(plugin, tmp2, enable_toggled, button); g_signal_connect(GTK_OBJECT(ret), "destroy", G_CALLBACK(disconnect_prefs_callbacks), plugin); 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); static PidginPluginUiInfo ui_info = 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 */ PURPLE_PRIORITY_DEFAULT, /* priority */ PLUGIN_ID, /* plugin id */ DISPLAY_VERSION, /* version */ PLUGIN_SUMMARY, /* summary */ PLUGIN_DESCRIPTION, /* description */ PLUGIN_AUTHOR, /* author */ PURPLE_WEBSITE, /* website */ plugin_unload, /* unload */ init_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_prefs_add_bool(PREF_SEND_E, TRUE); purple_prefs_add_bool(PREF_RECV_E, TRUE); purple_prefs_add_bool(PREF_SYSTEM_E, TRUE); purple_prefs_add_bool(PREF_ERROR_E, TRUE); purple_prefs_add_bool(PREF_NICK_E, TRUE); PURPLE_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info)