From 33f39456bba463e280a3dbb811432d6ca443ef1d Mon Sep 17 00:00:00 2001 From: Wu Xiaotian Date: Mon, 22 Jun 2020 00:09:07 +0000 Subject: tools: update template to generate new pluma plugin --- tools/plugin_template/Makefile.am | 7 +- tools/plugin_template/pluma-plugin.c | 246 +++++++++++++++++++------- tools/plugin_template/pluma-plugin.desktop.in | 6 +- tools/plugin_template/pluma-plugin.h | 9 +- 4 files changed, 196 insertions(+), 72 deletions(-) diff --git a/tools/plugin_template/Makefile.am b/tools/plugin_template/Makefile.am index 32569edd..688edca1 100644 --- a/tools/plugin_template/Makefile.am +++ b/tools/plugin_template/Makefile.am @@ -21,11 +21,12 @@ lib##(PLUGIN_MODULE)_la_LIBADD = $(PLUMA_LIBS) uidir = $(PLUMA_PLUGINS_DATA_DIR)/##(PLUGIN_MODULE) ui_DATA = -plugin_in_files = ##(PLUGIN_MODULE).pluma-plugin.desktop.in -plugin_DATA = $(plugin_in_files:.pluma-plugin.desktop.in=.pluma-plugin) +plugin_DATA = ##(PLUGIN_MODULE).plugin +plugin_in_files = $(plugin_DATA:.plugin=.plugin.desktop.in) +plugin_in_in_files = $(plugin_in_files:.plugin.desktop.in=.plugin.desktop.in.in) $(plugin_DATA): $(plugin_in_files) - $(AM_V_GEN) $(MSGFMT) --keyword=Description --desktop --template $< -d $(top_srcdir)/po -o $@ + $(AM_V_GEN) $(MSGFMT) --keyword=Name --keyword=Description --desktop --template $< -d $(top_srcdir)/po -o $@ EXTRA_DIST = $(plugin_in_files) 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 #endif -#include "##(PLUGIN_MODULE)-plugin.h" - #include +#include +#include #include +##ifdef WITH_CONFIGURE_DIALOG +#include +##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 = - "" - " " - " " - " " - ""; +const gchar submenu[] = +"" +" " +" " +" " +""; /* 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 } diff --git a/tools/plugin_template/pluma-plugin.desktop.in b/tools/plugin_template/pluma-plugin.desktop.in index 993e0e9b..ac093b73 100644 --- a/tools/plugin_template/pluma-plugin.desktop.in +++ b/tools/plugin_template/pluma-plugin.desktop.in @@ -1,8 +1,8 @@ -[Pluma Plugin] +[Plugin] Module=##(PLUGIN_MODULE) IAge=2 -_Name=##(PLUGIN_NAME) -_Description=##(DESCRIPTION) +Name=##(PLUGIN_NAME) +Description=##(DESCRIPTION) Icon=pluma-plugin Authors=##(AUTHOR_FULLNAME) <##(AUTHOR_EMAIL.lower)> Copyright=Copyright © ##(DATE_YEAR) ##(AUTHOR_FULLNAME) diff --git a/tools/plugin_template/pluma-plugin.h b/tools/plugin_template/pluma-plugin.h index 5a8305bc..4db641f9 100644 --- a/tools/plugin_template/pluma-plugin.h +++ b/tools/plugin_template/pluma-plugin.h @@ -23,7 +23,8 @@ #include #include -#include +#include +#include G_BEGIN_DECLS @@ -47,7 +48,7 @@ typedef struct _##(PLUGIN_ID.camel)Plugin ##(PLUGIN_ID.camel)Plugin; struct _##(PLUGIN_ID.camel)Plugin { - PlumaPlugin parent_instance; + PeasExtensionBase parent_instance; /*< private >*/ ##(PLUGIN_ID.camel)PluginPrivate *priv; @@ -60,7 +61,7 @@ typedef struct _##(PLUGIN_ID.camel)PluginClass ##(PLUGIN_ID.camel)PluginClass; struct _##(PLUGIN_ID.camel)PluginClass { - PlumaPluginClass parent_class; + PeasExtensionBaseClass parent_class; }; /* @@ -69,7 +70,7 @@ struct _##(PLUGIN_ID.camel)PluginClass GType ##(PLUGIN_ID.lower)_plugin_get_type (void) G_GNUC_CONST; /* All the plugins must implement this function */ -G_MODULE_EXPORT GType register_pluma_plugin (GTypeModule *module); +G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); G_END_DECLS -- cgit v1.2.1