From 2aafaabdaa4854b3941bd9f3319b89c807abf306 Mon Sep 17 00:00:00 2001 From: monsta Date: Sun, 4 Dec 2016 15:46:17 +0300 Subject: taglist plugin: port to libpeas mostly adapted from: https://git.gnome.org/browse/gedit/commit/?id=c3471ad0a1e2a60a588f203421da1779a60649ff https://git.gnome.org/browse/gedit/commit/?id=05ca83131a21c35e7b2792bbf76c4c6897d084e9 --- plugins/taglist/pluma-taglist-plugin.c | 181 ++++++++++++++++++++++++--------- 1 file changed, 131 insertions(+), 50 deletions(-) (limited to 'plugins/taglist/pluma-taglist-plugin.c') diff --git a/plugins/taglist/pluma-taglist-plugin.c b/plugins/taglist/pluma-taglist-plugin.c index 391a6dde..7feeeb78 100644 --- a/plugins/taglist/pluma-taglist-plugin.c +++ b/plugins/taglist/pluma-taglist-plugin.c @@ -37,23 +37,37 @@ #include #include +#include -#include +#include #include -#define WINDOW_DATA_KEY "PlumaTaglistPluginWindowData" - #define PLUMA_TAGLIST_PLUGIN_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), PLUMA_TYPE_TAGLIST_PLUGIN, PlumaTaglistPluginPrivate)) struct _PlumaTaglistPluginPrivate { - gpointer dummy; + GtkWidget *window; + + GtkWidget *taglist_panel; }; -PLUMA_PLUGIN_REGISTER_TYPE_WITH_CODE (PlumaTaglistPlugin, pluma_taglist_plugin, - pluma_taglist_plugin_panel_register_type (module); +static void peas_activatable_iface_init (PeasActivatableInterface *iface); + +G_DEFINE_DYNAMIC_TYPE_EXTENDED (PlumaTaglistPlugin, + pluma_taglist_plugin, + PEAS_TYPE_EXTENSION_BASE, + 0, + G_IMPLEMENT_INTERFACE_DYNAMIC (PEAS_TYPE_ACTIVATABLE, + peas_activatable_iface_init) \ + \ + _pluma_taglist_plugin_panel_register_type (type_module); \ ) +enum { + PROP_0, + PROP_OBJECT +}; + static void pluma_taglist_plugin_init (PlumaTaglistPlugin *plugin) { @@ -63,11 +77,24 @@ pluma_taglist_plugin_init (PlumaTaglistPlugin *plugin) } static void -pluma_taglist_plugin_finalize (GObject *object) +pluma_taglist_plugin_dispose (GObject *object) { -/* PlumaTaglistPlugin *plugin = PLUMA_TAGLIST_PLUGIN (object); -*/ + + pluma_debug_message (DEBUG_PLUGINS, "PlumaTaglistPlugin disposing"); + + if (plugin->priv->window != NULL) + { + g_object_unref (plugin->priv->window); + plugin->priv->window = NULL; + } + + G_OBJECT_CLASS (pluma_taglist_plugin_parent_class)->dispose (object); +} + +static void +pluma_taglist_plugin_finalize (GObject *object) +{ pluma_debug_message (DEBUG_PLUGINS, "PlumaTaglistPlugin finalizing"); free_taglist (); @@ -76,85 +103,139 @@ pluma_taglist_plugin_finalize (GObject *object) } static void -impl_activate (PlumaPlugin *plugin, - PlumaWindow *window) +pluma_taglist_plugin_activate (PeasActivatable *activatable) { + PlumaTaglistPluginPrivate *priv; + PlumaWindow *window; PlumaPanel *side_panel; - GtkWidget *taglist_panel; gchar *data_dir; - + pluma_debug (DEBUG_PLUGINS); - - g_return_if_fail (g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY) == NULL); - + + priv = PLUMA_TAGLIST_PLUGIN (activatable)->priv; + window = PLUMA_WINDOW (priv->window); side_panel = pluma_window_get_side_panel (window); - - data_dir = pluma_plugin_get_data_dir (plugin); - taglist_panel = pluma_taglist_plugin_panel_new (window, data_dir); + + data_dir = peas_extension_base_get_data_dir (PEAS_EXTENSION_BASE (activatable)); + priv->taglist_panel = pluma_taglist_plugin_panel_new (window, data_dir); g_free (data_dir); - + pluma_panel_add_item_with_stock_icon (side_panel, - taglist_panel, + priv->taglist_panel, _("Tags"), GTK_STOCK_ADD); - - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - taglist_panel); } static void -impl_deactivate (PlumaPlugin *plugin, - PlumaWindow *window) +pluma_taglist_plugin_deactivate (PeasActivatable *activatable) { + PlumaTaglistPluginPrivate *priv; + PlumaWindow *window; PlumaPanel *side_panel; - gpointer data; pluma_debug (DEBUG_PLUGINS); - data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); - g_return_if_fail (data != NULL); - + priv = PLUMA_TAGLIST_PLUGIN (activatable)->priv; + window = PLUMA_WINDOW (priv->window); side_panel = pluma_window_get_side_panel (window); pluma_panel_remove_item (side_panel, - GTK_WIDGET (data)); - - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - NULL); + priv->taglist_panel); } static void -impl_update_ui (PlumaPlugin *plugin, - PlumaWindow *window) +pluma_taglist_plugin_update_state (PeasActivatable *activatable) { - gpointer data; + PlumaTaglistPluginPrivate *priv; + PlumaWindow *window; PlumaView *view; - + pluma_debug (DEBUG_PLUGINS); - - data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); - g_return_if_fail (data != NULL); - + + priv = PLUMA_TAGLIST_PLUGIN (activatable)->priv; + window = PLUMA_WINDOW (priv->window); view = pluma_window_get_active_view (window); - - gtk_widget_set_sensitive (GTK_WIDGET (data), + + gtk_widget_set_sensitive (priv->taglist_panel, (view != NULL) && gtk_text_view_get_editable (GTK_TEXT_VIEW (view))); } +static void +pluma_taglist_plugin_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + PlumaTaglistPlugin *plugin = PLUMA_TAGLIST_PLUGIN (object); + + switch (prop_id) + { + case PROP_OBJECT: + plugin->priv->window = GTK_WIDGET (g_value_dup_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +pluma_taglist_plugin_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + PlumaTaglistPlugin *plugin = PLUMA_TAGLIST_PLUGIN (object); + + switch (prop_id) + { + case PROP_OBJECT: + g_value_set_object (value, plugin->priv->window); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void pluma_taglist_plugin_class_init (PlumaTaglistPluginClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - PlumaPluginClass *plugin_class = PLUMA_PLUGIN_CLASS (klass); object_class->finalize = pluma_taglist_plugin_finalize; + object_class->dispose = pluma_taglist_plugin_dispose; + object_class->set_property = pluma_taglist_plugin_set_property; + object_class->get_property = pluma_taglist_plugin_get_property; - plugin_class->activate = impl_activate; - plugin_class->deactivate = impl_deactivate; - plugin_class->update_ui = impl_update_ui; + g_object_class_override_property (object_class, PROP_OBJECT, "object"); g_type_class_add_private (object_class, sizeof (PlumaTaglistPluginPrivate)); } + +static void +pluma_taglist_plugin_class_finalize (PlumaTaglistPluginClass *klass) +{ + /* dummy function - used by G_DEFINE_DYNAMIC_TYPE_EXTENDED */ +} + +static void +peas_activatable_iface_init (PeasActivatableInterface *iface) +{ + iface->activate = pluma_taglist_plugin_activate; + iface->deactivate = pluma_taglist_plugin_deactivate; + iface->update_state = pluma_taglist_plugin_update_state; +} + +G_MODULE_EXPORT void +peas_register_types (PeasObjectModule *module) +{ + pluma_taglist_plugin_register_type (G_TYPE_MODULE (module)); + + peas_object_module_register_extension_type (module, + PEAS_TYPE_ACTIVATABLE, + PLUMA_TYPE_TAGLIST_PLUGIN); +} -- cgit v1.2.1