# HG changeset patch # User Richard Laager # Date 1136348042 0 # Node ID 8ae981f2c9cbacd0ae9597385fd09d35ebf1af22 # Parent 145f76e74a9fc01d79445f6e39bf7a0e918eb995 [gaim-migrate @ 15056] SF Patch #1395207 from Sadrul "Gaim currently doesn't allow to have formatted/multiline string as a preference for core-plugins. It'd be great if core plugins could have formatted strings for preference (ie. have imhtml+toolbar for the preference in the Plugin-preference dialog) without actually having to worry about gtk-codes." committer: Tailor Script diff -r 145f76e74a9f -r 8ae981f2c9cb plugins/ChangeLog.API --- a/plugins/ChangeLog.API Wed Jan 04 03:01:32 2006 +0000 +++ b/plugins/ChangeLog.API Wed Jan 04 04:14:02 2006 +0000 @@ -211,6 +211,10 @@ * GaimConversationUiOps->present(GaimConversation *) * GaimPlugin.unloadable * gaim_plugin_is_unloadable() + * GAIM_PLUGIN_PREF_STRING_FORMAT + * gaim_plugin_pref_get_format_type() + * gaim_plugin_pref_set_format_type() + * GaimStringFormatType Signals - Changed: (See the Doxygen docs for details on all signals.) * Signal propagation now stops after a handler returns a non-NULL value. diff -r 145f76e74a9f -r 8ae981f2c9cb src/gtkpluginpref.c --- a/src/gtkpluginpref.c Wed Jan 04 03:01:32 2006 +0000 +++ b/src/gtkpluginpref.c Wed Jan 04 04:14:02 2006 +0000 @@ -31,6 +31,7 @@ #include "pluginpref.h" #include "prefs.h" +#include "gtkimhtml.h" #include "gtkpluginpref.h" #include "gtkprefs.h" #include "gtkutils.h" @@ -44,13 +45,34 @@ return FALSE; } + +static void +imhtml_cb(GtkTextBuffer *buffer, gpointer data) +{ + char *pref; + char *text; + GtkIMHtml *imhtml = data; + + pref = g_object_get_data(G_OBJECT(imhtml), "pref-key"); + g_return_if_fail(pref); + + text = gtk_imhtml_get_markup(imhtml); + + if (!text) + text = ""; + gaim_prefs_set_string(pref, text); + g_free(text); +} + static void make_string_pref(GtkWidget *parent, GaimPluginPref *pref, GtkSizeGroup *sg) { GtkWidget *hbox, *gtk_label, *entry; gchar *pref_name, *pref_label; + GaimStringFormatType format; pref_name = gaim_plugin_pref_get_name(pref); pref_label = gaim_plugin_pref_get_label(pref); + format = gaim_plugin_pref_get_format_type(pref); switch(gaim_plugin_pref_get_type(pref)) { case GAIM_PLUGIN_PREF_CHOICE: @@ -77,21 +99,41 @@ if(sg) gtk_size_group_add_widget(sg, gtk_label); - entry = gtk_entry_new(); - gtk_entry_set_text(GTK_ENTRY(entry), gaim_prefs_get_string(pref_name)); - gtk_entry_set_max_length(GTK_ENTRY(entry), + if (format == GAIM_STRING_FORMAT_TYPE_NONE) + { + entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(entry), gaim_prefs_get_string(pref_name)); + gtk_entry_set_max_length(GTK_ENTRY(entry), gaim_plugin_pref_get_max_length(pref)); - if (gaim_plugin_pref_get_masked(pref)) + if (gaim_plugin_pref_get_masked(pref)) + { + gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); + gtk_entry_set_invisible_char(GTK_ENTRY(entry), GAIM_INVISIBLE_CHAR); + } + g_signal_connect(G_OBJECT(entry), "changed", + G_CALLBACK(entry_cb), + (gpointer)pref_name); + gtk_label_set_mnemonic_widget(GTK_LABEL(gtk_label), entry); + gtk_widget_show(entry); + gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); + } + else { - gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); - gtk_entry_set_invisible_char(GTK_ENTRY(entry), GAIM_INVISIBLE_CHAR); + GtkWidget *imhtml, *toolbar, *frame; + + frame = gaim_gtk_create_imhtml(TRUE, &imhtml, &toolbar); + if (!(format & GAIM_STRING_FORMAT_TYPE_HTML)) + gtk_widget_destroy(toolbar); + + gtk_imhtml_append_text(GTK_IMHTML(imhtml), gaim_prefs_get_string(pref_name), + (format & GAIM_STRING_FORMAT_TYPE_MULTILINE) ? 0 : GTK_IMHTML_NO_NEWLINE); + gtk_label_set_mnemonic_widget(GTK_LABEL(gtk_label), imhtml); + gtk_widget_show_all(frame); + g_object_set_data(G_OBJECT(imhtml), "pref-key", pref_name); + g_signal_connect(G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(imhtml))), + "changed", G_CALLBACK(imhtml_cb), imhtml); + gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); } - g_signal_connect(G_OBJECT(entry), "changed", - G_CALLBACK(entry_cb), - (gpointer)pref_name); - gtk_label_set_mnemonic_widget(GTK_LABEL(gtk_label), entry); - gtk_widget_show(entry); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); break; } diff -r 145f76e74a9f -r 8ae981f2c9cb src/pluginpref.c --- a/src/pluginpref.c Wed Jan 04 03:01:32 2006 +0000 +++ b/src/pluginpref.c Wed Jan 04 04:14:02 2006 +0000 @@ -45,6 +45,7 @@ GList *choices; unsigned int max_length; gboolean masked; + GaimStringFormatType format; }; GaimPluginPrefFrame * @@ -293,3 +294,24 @@ return pref->masked; } + +void +gaim_plugin_pref_set_format_type(GaimPluginPref *pref, GaimStringFormatType format) +{ + g_return_if_fail(pref); + g_return_if_fail(pref->type == GAIM_PLUGIN_PREF_STRING_FORMAT); + + pref->format = format; +} + +GaimStringFormatType +gaim_plugin_pref_get_format_type(GaimPluginPref *pref) +{ + g_return_val_if_fail(pref, 0); + + if (pref->type != GAIM_PLUGIN_PREF_STRING_FORMAT) + return GAIM_STRING_FORMAT_TYPE_NONE; + + return pref->format; +} + diff -r 145f76e74a9f -r 8ae981f2c9cb src/pluginpref.h --- a/src/pluginpref.h Wed Jan 04 03:01:32 2006 +0000 +++ b/src/pluginpref.h Wed Jan 04 04:14:02 2006 +0000 @@ -33,6 +33,7 @@ GAIM_PLUGIN_PREF_NONE, GAIM_PLUGIN_PREF_CHOICE, GAIM_PLUGIN_PREF_INFO, /**< no-value label */ + GAIM_PLUGIN_PREF_STRING_FORMAT } GaimPluginPrefType; #include @@ -231,6 +232,23 @@ */ gboolean gaim_plugin_pref_get_masked(GaimPluginPref *pref); +/** + * Sets the format type for a formattable-string plugin pref. You need to set the + * pref type to GAIM_PLUGIN_PREF_STRING_FORMAT first before setting the format. + * + * @param pref The plugin pref + * @param format The format of the string + */ +void gaim_plugin_pref_set_format_type(GaimPluginPref *pref, GaimStringFormatType format); + +/** + * Gets the format type of the formattable-string plugin pref. + * + * @param pref The plugin pref + * @return The format of the pref + */ +GaimStringFormatType gaim_plugin_pref_get_format_type(GaimPluginPref *pref); + /*@}*/ #ifdef __cplusplus diff -r 145f76e74a9f -r 8ae981f2c9cb src/prefs.h --- a/src/prefs.h Wed Jan 04 03:01:32 2006 +0000 +++ b/src/prefs.h Wed Jan 04 04:14:02 2006 +0000 @@ -29,6 +29,16 @@ #include /** + * String format for preferences. + */ +typedef enum +{ + GAIM_STRING_FORMAT_TYPE_NONE = 0, + GAIM_STRING_FORMAT_TYPE_MULTILINE = 1 << 0, + GAIM_STRING_FORMAT_TYPE_HTML = 1 << 1 +} GaimStringFormatType; + +/** * Pref data types. */ typedef enum _GaimPrefType