summaryrefslogtreecommitdiff
path: root/tools/plugin_template/pluma-plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/plugin_template/pluma-plugin.c')
-rw-r--r--tools/plugin_template/pluma-plugin.c246
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
}