diff options
Diffstat (limited to 'tools/plugin_template/pluma-plugin.c')
-rw-r--r-- | tools/plugin_template/pluma-plugin.c | 246 |
1 files changed, 184 insertions, 62 deletions
diff --git a/tools/plugin_template/pluma-plugin.c b/tools/plugin_template/pluma-plugin.c index 7fdd6d55..26422a4e 100644 --- a/tools/plugin_template/pluma-plugin.c +++ b/tools/plugin_template/pluma-plugin.c @@ -22,163 +22,285 @@ #include <config.h> #endif -#include "##(PLUGIN_MODULE)-plugin.h" - #include <glib/gi18n-lib.h> +#include <pluma/pluma-window.h> +#include <pluma/pluma-window-activatable.h> #include <pluma/pluma-debug.h> +##ifdef WITH_CONFIGURE_DIALOG +#include <libpeas-gtk/peas-gtk-configurable.h> +##endif -#define WINDOW_DATA_KEY "##(PLUGIN_ID.camel)PluginWindowData" +#include "##(PLUGIN_MODULE)-plugin.h" -#define ##(PLUGIN_ID.upper)_PLUGIN_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), TYPE_##(PLUGIN_ID.upper)_PLUGIN, ##(PLUGIN_ID.camel)PluginPrivate)) +static void pluma_window_activatable_iface_init (PlumaWindowActivatableInterface *iface); struct _##(PLUGIN_ID.camel)PluginPrivate { - gpointer dummy; + PlumaWindow *window; + + GtkActionGroup *action_group; + guint ui_id; }; -PLUMA_PLUGIN_REGISTER_TYPE (##(PLUGIN_ID.camel)Plugin, ##(PLUGIN_ID.lower)_plugin) +enum { + PROP_0, + PROP_OBJECT +}; +G_DEFINE_DYNAMIC_TYPE_EXTENDED (##(PLUGIN_ID.camel)Plugin, + ##(PLUGIN_ID.lower)_plugin, + PEAS_TYPE_EXTENSION_BASE, + 0, + G_ADD_PRIVATE_DYNAMIC (##(PLUGIN_ID.camel)Plugin) + G_IMPLEMENT_INTERFACE_DYNAMIC (PLUMA_TYPE_WINDOW_ACTIVATABLE, + pluma_window_activatable_iface_init)) ##ifdef WITH_MENU /* UI string. See pluma-ui.xml for reference */ -static const gchar ui_str = - "<ui>" - " <menubar name='MenuBar'>" - " <!-- Put your menu entries here -->" - " </menubar>" - "</ui>"; +const gchar submenu[] = +"<ui>" +" <menubar name='MenuBar'>" +" <!-- Put your menu entries here -->" +" </menubar>" +"</ui>"; /* UI actions */ static const GtkActionEntry action_entries[] = { /* Put your actions here */ }; - -typedef struct -{ - GtkActionGroup *action_group; - guint ui_id; -} WindowData; ##endif static void ##(PLUGIN_ID.lower)_plugin_init (##(PLUGIN_ID.camel)Plugin *plugin) { - plugin->priv = ##(PLUGIN_ID.upper)_PLUGIN_GET_PRIVATE (plugin); - pluma_debug_message (DEBUG_PLUGINS, - "##(PLUGIN_ID.camel)Plugin initializing"); + plugin->priv = ##(PLUGIN_ID.lower)_plugin_get_instance_private (plugin); + + pluma_debug_message (DEBUG_PLUGINS, "##(PLUGIN_ID.camel)Plugin initializing"); } static void ##(PLUGIN_ID.lower)_plugin_finalize (GObject *object) { - pluma_debug_message (DEBUG_PLUGINS, - "##(PLUGIN_ID.camel)Plugin finalizing"); + pluma_debug_message (DEBUG_PLUGINS, "##(PLUGIN_ID.camel)Plugin finalizing"); G_OBJECT_CLASS (##(PLUGIN_ID.lower)_plugin_parent_class)->finalize (object); } -##ifdef WITH_MENU static void -free_window_data (WindowData *data) +##(PLUGIN_ID.lower)_plugin_dispose (GObject *object) { - g_return_if_fail (data != NULL); + ##(PLUGIN_ID.camel)Plugin *plugin = ##(PLUGIN_ID.upper)_PLUGIN (object); + + pluma_debug_message (DEBUG_PLUGINS, "##(PLUGIN_ID.camel)Plugin disposing"); + + if (plugin->priv->window != NULL) + { + g_object_unref (plugin->priv->window); + plugin->priv->window = NULL; + } + + if (plugin->priv->action_group) + { + g_object_unref (plugin->priv->action_group); + plugin->priv->action_group = NULL; + } - g_object_unref (data->action_group); - g_free (data); + G_OBJECT_CLASS (##(PLUGIN_ID.lower)_plugin_parent_class)->dispose (object); } + +static void +update_ui (##(PLUGIN_ID.camel)PluginPrivate *data) +{ +##ifdef WITH_MENU + PlumaWindow *window; + PlumaView *view; + GtkAction *action; +##endif + + pluma_debug (DEBUG_PLUGINS); + +##ifdef WITH_MENU + window = PLUMA_WINDOW (data->window); + view = pluma_window_get_active_view (window); + + pluma_debug_message (DEBUG_PLUGINS, "View: %p", view); + + action = gtk_action_group_get_action (data->action_group, + "##(PLUGIN_ID.camel)PluginActions"); + gtk_action_set_sensitive (action, + (view != NULL) && + gtk_text_view_get_editable (GTK_TEXT_VIEW (view))); ##endif +} + static void -impl_activate (PlumaPlugin *plugin, - PlumaWindow *window) +##(PLUGIN_ID.lower)_plugin_activate (PlumaWindowActivatable *activatable) { ##ifdef WITH_MENU + ##(PLUGIN_ID.camel)PluginPrivate *data; + PlumaWindow *window; GtkUIManager *manager; - WindowData *data; + GError *error = NULL; ##endif pluma_debug (DEBUG_PLUGINS); ##ifdef WITH_MENU - data = g_new (WindowData, 1); + data = ##(PLUGIN_ID.upper)_PLUGIN (activatable)->priv; + window = PLUMA_WINDOW (data->window); + manager = pluma_window_get_ui_manager (window); data->action_group = gtk_action_group_new ("##(PLUGIN_ID.camel)PluginActions"); gtk_action_group_set_translation_domain (data->action_group, - GETTEXT_PACKAGE); + GETTEXT_PACKAGE); gtk_action_group_add_actions (data->action_group, - action_entries, - G_N_ELEMENTS (action_entries), - window); + action_entries, + G_N_ELEMENTS (action_entries), + window); gtk_ui_manager_insert_action_group (manager, data->action_group, -1); - data->ui_id = gtk_ui_manager_add_ui_from_string (manager, ui_str, - -1, NULL); - - g_object_set_data_full (G_OBJECT (window), - WINDOW_DATA_KEY, - data, - (GDestroyNotify) free_window_data); + data->ui_id = gtk_ui_manager_add_ui_from_string (manager, + submenu, + -1, + &error); + if (data->ui_id == 0) + { + g_warning ("%s", error->message); + return; + } + update_ui (data); ##endif } static void -impl_deactivate (PlumaPlugin *plugin, - PlumaWindow *window) +##(PLUGIN_ID.lower)_plugin_deactivate (PlumaWindowActivatable *activatable) { ##ifdef WITH_MENU + ##(PLUGIN_ID.camel)PluginPrivate *data; + PlumaWindow *window; GtkUIManager *manager; - WindowData *data; ##endif pluma_debug (DEBUG_PLUGINS); ##ifdef WITH_MENU - manager = pluma_window_get_ui_manager (window); + data = ##(PLUGIN_ID.upper)_PLUGIN (activatable)->priv; + window = PLUMA_WINDOW (data->window); - data = (WindowData *) g_object_get_data (G_OBJECT (window), - WINDOW_DATA_KEY); - g_return_if_fail (data != NULL); + manager = pluma_window_get_ui_manager (window); gtk_ui_manager_remove_ui (manager, data->ui_id); gtk_ui_manager_remove_action_group (manager, data->action_group); - - g_object_set_data (G_OBJECT (window), WINDOW_DATA_KEY, NULL); ##endif } static void -impl_update_ui (PlumaPlugin *plugin, - PlumaWindow *window) +##(PLUGIN_ID.lower)_plugin_update_state (PlumaWindowActivatable *activatable) { pluma_debug (DEBUG_PLUGINS); + + update_ui (##(PLUGIN_ID.upper)_PLUGIN (activatable)->priv); } ##ifdef WITH_CONFIGURE_DIALOG static GtkWidget * -impl_create_configure_dialog (PlumaPlugin *plugin) +##(PLUGIN_ID.lower)_plugin_create_configure_widget (PeasGtkConfigurable *configurable) { pluma_debug (DEBUG_PLUGINS); } ##endif static void +##(PLUGIN_ID.lower)_plugin_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ##(PLUGIN_ID.camel)Plugin *plugin = ##(PLUGIN_ID.upper)_PLUGIN (object); + + switch (prop_id) + { + case PROP_OBJECT: + plugin->priv->window = PLUMA_WINDOW (g_value_dup_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +##(PLUGIN_ID.lower)_plugin_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ##(PLUGIN_ID.camel)Plugin *plugin = ##(PLUGIN_ID.upper)_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 ##(PLUGIN_ID.lower)_plugin_class_init (##(PLUGIN_ID.camel)PluginClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - PlumaPluginClass *plugin_class = PLUMA_PLUGIN_CLASS (klass); object_class->finalize = ##(PLUGIN_ID.lower)_plugin_finalize; + object_class->dispose = ##(PLUGIN_ID.lower)_plugin_dispose; + object_class->set_property = ##(PLUGIN_ID.lower)_plugin_set_property; + object_class->get_property = ##(PLUGIN_ID.lower)_plugin_get_property; + + g_object_class_override_property (object_class, PROP_OBJECT, "object"); +} + +static void +##(PLUGIN_ID.lower)_plugin_class_finalize (##(PLUGIN_ID.camel)PluginClass *klass) +{ + /* dummy function - used by G_DEFINE_DYNAMIC_TYPE_EXTENDED */ +} + +static void +pluma_window_activatable_iface_init (PlumaWindowActivatableInterface *iface) +{ + iface->activate = ##(PLUGIN_ID.lower)_plugin_activate; + iface->deactivate = ##(PLUGIN_ID.lower)_plugin_deactivate; + iface->update_state = ##(PLUGIN_ID.lower)_plugin_update_state; +} - plugin_class->activate = impl_activate; - plugin_class->deactivate = impl_deactivate; - plugin_class->update_ui = impl_update_ui; ##ifdef WITH_CONFIGURE_DIALOG - plugin_class->create_configure_dialog = impl_create_configure_dialog; +static void +peas_gtk_configurable_iface_init (PeasGtkConfigurableInterface *iface) +{ + iface->create_configure_widget = ##(PLUGIN_ID.lower)_plugin_create_configure_widget; +} ##endif - g_type_class_add_private (object_class, - sizeof (##(PLUGIN_ID.camel)PluginPrivate)); +G_MODULE_EXPORT void +peas_register_types (PeasObjectModule *module) +{ + ##(PLUGIN_ID.lower)_plugin_register_type (G_TYPE_MODULE (module)); + + peas_object_module_register_extension_type (module, + PLUMA_TYPE_WINDOW_ACTIVATABLE, + TYPE_##(PLUGIN_ID.upper)_PLUGIN); + +##ifdef WITH_CONFIGURE_DIALOG + peas_object_module_register_extension_type (module, + PEAS_GTK_TYPE_CONFIGURABLE, + TYPE_##(PLUGIN_ID.upper)_PLUGIN); +##endif } |