--- a/pidgin/gtkblist.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/gtkblist.c Thu Nov 14 21:53:50 2019 -0600
@@ -45,7 +45,6 @@
@@ -63,6 +62,7 @@
#include "pidgin/pidgindebugplugininfo.h"
#include "pidgin/pidgingdkpixbuf.h"
#include "pidgin/pidginlog.h"
+#include "pidgin/pidginplugininfo.h" #include "pidgin/pidginpluginsdialog.h"
#include "pidgin/pidgintooltip.h"
#include "pidginmenutray.h"
@@ -3618,7 +3618,7 @@
***************************************************/
-pidgin_plugins_dialog_cb(GtkAction *action, GtkWidget *window) {
+pidgin_blist_plugins_dialog_cb(GtkAction *action, GtkWidget *window) { GtkWidget *dialog = pidgin_plugins_dialog_new();
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(window));
@@ -3660,8 +3660,7 @@
{ "ToolsMenu", NULL, N_("_Tools"), NULL, NULL, NULL },
{ "BuddyPounces", NULL, N_("Buddy _Pounces"), NULL, NULL, pidgin_pounces_manager_show },
{ "CustomSmileys", PIDGIN_STOCK_TOOLBAR_SMILEY, N_("Custom Smile_ys"), "<control>Y", NULL, pidgin_smiley_manager_show },
- { "Plugins", PIDGIN_STOCK_TOOLBAR_PLUGINS, N_("Plu_gins"), "<control>U", NULL, pidgin_plugin_dialog_show },
- { "Plugins-NG", PIDGIN_STOCK_TOOLBAR_PLUGINS, N_("Plugins-ng"), NULL, NULL, pidgin_plugins_dialog_cb },
+ { "Plugins", PIDGIN_STOCK_TOOLBAR_PLUGINS, N_("Plu_gins"), "<control>U", NULL, pidgin_blist_plugins_dialog_cb }, { "Preferences", GTK_STOCK_PREFERENCES, N_("Pr_eferences"), "<control>P", NULL, pidgin_prefs_show },
{ "Privacy", NULL, N_("Pr_ivacy"), NULL, NULL, pidgin_privacy_dialog_show },
{ "SetMood", NULL, N_("Set _Mood"), "<control>D", NULL, set_mood_show },
@@ -3721,7 +3720,6 @@
"<menuitem action='BuddyPounces'/>"
"<menuitem action='CustomSmileys'/>"
"<menuitem action='Plugins'/>"
- "<menuitem action='Plugins-NG'/>"
"<menuitem action='Preferences'/>"
"<menuitem action='Privacy'/>"
"<menuitem action='SetMood'/>"
--- a/pidgin/libpidgin.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/libpidgin.c Thu Nov 14 21:53:50 2019 -0600
@@ -52,7 +52,6 @@
@@ -62,10 +61,11 @@
#include "gtksmiley-theme.h"
-#include "pidginstock.h"
#include "gtkwhiteboard.h"
+#include "pidginplugininfo.h" +#include "pidginstock.h" --- a/pidgin/pidginpluginsdialog.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/pidginpluginsdialog.c Thu Nov 14 21:53:50 2019 -0600
@@ -28,9 +28,14 @@
+#include "gtkpluginpref.h" struct _PidginPluginsDialog {
GtkWidget *configure_plugin_button;
@@ -38,14 +43,104 @@
GtkListStore *plugin_store;
+/* this has a short life left to it... */ + PIDGIN_PLUGIN_UI_DATA_TYPE_FRAME, + PIDGIN_PLUGIN_UI_DATA_TYPE_REQUEST + PurplePluginPrefFrame *pref_frame; + gpointer request_handle; /******************************************************************************
*****************************************************************************/
pidgin_plugins_dialog_plugin_has_config(GPluginPlugin *plugin) {
+ GPluginPluginInfo *ginfo = gplugin_plugin_get_info(plugin); + PurplePluginInfo *info = PURPLE_PLUGIN_INFO(ginfo); + GPluginPluginState state; + g_return_val_if_fail(GPLUGIN_IS_PLUGIN(plugin), FALSE); + state = gplugin_plugin_get_state(plugin); + if (state != GPLUGIN_PLUGIN_STATE_LOADED) { + ret = (purple_plugin_info_get_pref_frame_cb(info) || + purple_plugin_info_get_pref_request_cb(info)); +pidgin_plugins_dialog_get_selected(PidginPluginsDialog *dialog) { + GPluginPlugin *plugin = NULL; + GtkTreeSelection *selection = NULL; + GtkTreeModel *model = NULL; + g_return_val_if_fail(PIDGIN_IS_PLUGINS_DIALOG(dialog), NULL); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->tree_view)); + /* not sure if this is necessary, but playing defense. - grim 20191112 */ + if(selection == NULL) { + if(gtk_tree_selection_get_selected(selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, + GPLUGIN_GTK_STORE_PLUGIN_COLUMN, &plugin, +pidgin_plugins_dialog_pref_dialog_close(GPluginPlugin *plugin) { + GPluginPluginInfo *ginfo = gplugin_plugin_get_info(plugin); + PurplePluginInfo *info = PURPLE_PLUGIN_INFO(ginfo); + PidginPluginUiData *ui_data; + ui_data = purple_plugin_info_get_ui_data(info); + purple_debug_info("PidginPluginsDialog", "failed to find uidata\n"); + if (ui_data->type == PIDGIN_PLUGIN_UI_DATA_TYPE_REQUEST) { + purple_request_close(PURPLE_REQUEST_FIELDS, + ui_data->u.request_handle); + g_return_if_fail(ui_data->type == PIDGIN_PLUGIN_UI_DATA_TYPE_FRAME); + gtk_widget_destroy(ui_data->u.frame.dialog); + if (ui_data->u.frame.pref_frame) { + purple_plugin_pref_frame_destroy(ui_data->u.frame.pref_frame); + purple_plugin_info_set_ui_data(info, NULL); /******************************************************************************
@@ -80,7 +175,116 @@
+pidgin_plugins_dialog_pref_dialog_response_cb(GtkWidget *dialog, int response, + if (response == GTK_RESPONSE_CLOSE || + response == GTK_RESPONSE_DELETE_EVENT) + pidgin_plugins_dialog_pref_dialog_close(GPLUGIN_PLUGIN(data)); pidgin_plugins_dialog_config_plugin_cb(GtkWidget *button, gpointer data) {
+ PidginPluginsDialog *dialog = PIDGIN_PLUGINS_DIALOG(data); + PidginPluginUiData *ui_data; + PurplePluginInfo *info; + PurplePluginPrefFrameCb pref_frame_cb; + PurplePluginPrefRequestCb pref_request_cb; + GPluginPlugin *plugin = NULL; + GPluginPluginInfo *ginfo = NULL; + plugin = pidgin_plugins_dialog_get_selected(dialog); + if(!GPLUGIN_IS_PLUGIN(plugin)) { + ginfo = gplugin_plugin_get_info(plugin); + info = PURPLE_PLUGIN_INFO(ginfo); + if(purple_plugin_info_get_ui_data(info)) { + pref_frame_cb = purple_plugin_info_get_pref_frame_cb(info); + pref_request_cb = purple_plugin_info_get_pref_request_cb(info); + ui_data = g_new0(PidginPluginUiData, 1); + purple_plugin_info_set_ui_data(info, ui_data); + ui_data->u.frame.pref_frame = pref_frame_cb(plugin); + purple_debug_warning("gtkplugin", + "Plugin %s contains more than one prefs " + "callback, some will be ignored.", + gplugin_plugin_info_get_name(ginfo)); + g_return_if_fail(prefs_count > 0); + /* Priority: pidgin frame > purple request > purple frame + * Purple frame could be replaced with purple request some day. + ui_data->type = PIDGIN_PLUGIN_UI_DATA_TYPE_REQUEST; + ui_data->u.request_handle = pref_request_cb(plugin); + purple_request_add_close_notify(ui_data->u.request_handle, + purple_callback_set_zero, &info->ui_data); + purple_request_add_close_notify(ui_data->u.request_handle, + GtkWidget *box, *pdialog, *content, *sw; + ui_data->type = PIDGIN_PLUGIN_UI_DATA_TYPE_FRAME; + box = pidgin_plugin_pref_create_frame(ui_data->u.frame.pref_frame); + purple_debug_error("gtkplugin", + "Failed to display prefs frame"); + purple_plugin_info_set_ui_data(info, NULL); + gtk_widget_set_vexpand(box, TRUE); + ui_data->u.frame.dialog = pdialog = gtk_dialog_new_with_buttons( + PIDGIN_ALERT_TITLE, GTK_WINDOW(dialog), + GTK_DIALOG_DESTROY_WITH_PARENT, + _("Close"), GTK_RESPONSE_CLOSE, + g_signal_connect(G_OBJECT(pdialog), "response", + G_CALLBACK(pidgin_plugins_dialog_pref_dialog_response_cb), plugin); + content = gtk_dialog_get_content_area(GTK_DIALOG(pdialog)); + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_container_add(GTK_CONTAINER(content), sw); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + gtk_widget_set_size_request(sw, 400, 400); + gtk_container_add(GTK_CONTAINER(sw), box); + gtk_window_set_role(GTK_WINDOW(pdialog), "plugin_config"); + gtk_window_set_title(GTK_WINDOW(pdialog), + _(gplugin_plugin_info_get_name( + GPLUGIN_PLUGIN_INFO(info)))); + gtk_widget_show_all(pdialog); /******************************************************************************
@@ -97,6 +301,7 @@
"/im/pidgin/Pidgin/Plugins/dialog.ui"
+ gtk_widget_class_bind_template_child(widget_class, PidginPluginsDialog, tree_view); gtk_widget_class_bind_template_child(widget_class, PidginPluginsDialog, configure_plugin_button);
gtk_widget_class_bind_template_child(widget_class, PidginPluginsDialog, close_button);
gtk_widget_class_bind_template_child(widget_class, PidginPluginsDialog, plugin_info);
--- a/pidgin/plugins/extplacement.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/plugins/extplacement.c Thu Nov 14 21:53:50 2019 -0600
@@ -24,7 +24,7 @@
#include "conversation.h"
+#include "pidginplugininfo.h" --- a/pidgin/plugins/gtk-signals-test.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/plugins/gtk-signals-test.c Thu Nov 14 21:53:50 2019 -0600
@@ -30,7 +30,7 @@
+#include "pidginplugininfo.h" /**************************************************************************
* Account subsystem signal callbacks
--- a/pidgin/plugins/iconaway.c Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/plugins/iconaway.c Thu Nov 14 21:53:50 2019 -0600
@@ -26,7 +26,7 @@
+#include "pidginplugininfo.h" #define ICONAWAY_PLUGIN_ID "gtk-iconaway"
--- a/pidgin/resources/Plugins/dialog.ui Tue Nov 12 01:34:57 2019 -0600
+++ b/pidgin/resources/Plugins/dialog.ui Thu Nov 14 21:53:50 2019 -0600
@@ -68,14 +68,14 @@
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
- <object class="GPluginGtkView">
+ <object class="GPluginGtkView" id="tree_view"> <property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">plugin_store</property>
<property name="headers_clickable">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection">
- <signal name="changed" handler="pidgin_plugins_dialog_selection_cb" object="PidginPluginDialog" swapped="no"/>
+ <signal name="changed" handler="pidgin_plugins_dialog_selection_cb" object="PidginPluginsDialog" swapped="no"/>