Add button_press_event() callback into LXPanelPluginInit struct.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Sun, 9 Feb 2014 21:18:16 +0000 (23:18 +0200)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Sun, 9 Feb 2014 21:18:16 +0000 (23:18 +0200)
Plugin constructor should not add handler for "button-press-event" anymore
and plugin loader will do it automatically.

src/panel.c
src/plugin.c
src/plugin.h
src/plugins/dclock.c
src/plugins/separator.c
src/plugins/space.c

index 7132908..5d5ff76 100644 (file)
@@ -777,7 +777,7 @@ GtkMenu* lxpanel_get_plugin_menu( Panel* panel, GtkWidget* plugin, gboolean use_
 {
     GtkWidget  *menu_item, *img;
     GtkMenu *ret,*menu;
-    LXPanelPluginInit *init = PLUGIN_CLASS(plugin);
+    LXPanelPluginInit *init;
     char* tmp;
     ret = menu = GTK_MENU(gtk_menu_new());
 
@@ -789,6 +789,7 @@ GtkMenu* lxpanel_get_plugin_menu( Panel* panel, GtkWidget* plugin, gboolean use_
 
     if( plugin )
     {
+        init = PLUGIN_CLASS(plugin);
         img = gtk_image_new_from_stock( GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU );
         tmp = g_strdup_printf( _("Remove \"%s\" From Panel"), _(init->name) );
         menu_item = gtk_image_menu_item_new_with_label( tmp );
index 9923bd0..2333c9e 100644 (file)
@@ -268,11 +268,11 @@ void plugin_widget_set_background(GtkWidget * w, Panel * p)
 
 /* Handler for "button_press_event" signal with Plugin as parameter.
  * External so can be used from a plugin. */
-gboolean lxpanel_plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, GtkWidget *plugin)
+gboolean lxpanel_plugin_button_press_event(GtkWidget *plugin, GdkEventButton *event, Panel *panel)
 {
     if (event->button == 3) /* right button */
     {
-        GtkMenu* popup = (GtkMenu*)lxpanel_get_plugin_menu(PLUGIN_PANEL(plugin), plugin, FALSE);
+        GtkMenu* popup = (GtkMenu*)lxpanel_get_plugin_menu(panel, plugin, FALSE);
         gtk_menu_popup(popup, NULL, NULL, NULL, NULL, event->button, event->time);
         return TRUE;
     }
@@ -282,7 +282,7 @@ gboolean lxpanel_plugin_button_press_event(GtkWidget *widget, GdkEventButton *ev
 /* for old plugins compatibility */
 gboolean plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, Plugin *plugin)
 {
-    return lxpanel_plugin_button_press_event(widget, event, plugin->pwid);
+    return lxpanel_plugin_button_press_event(plugin->pwid, event, PLUGIN_PANEL(plugin->pwid));
 }
 
 /* Helper for position-calculation callback for popup menus. */
@@ -500,6 +500,12 @@ GtkWidget *lxpanel_add_plugin(Panel *p, const char *name, config_setting_t *cfg,
         widget = init->new_instance(p, pconf);
         if (widget == NULL)
             return widget;
+        if (init->button_press_event)
+            g_signal_connect(widget, "button-press-event",
+                             G_CALLBACK(init->button_press_event), p);
+        else
+            g_signal_connect(widget, "button-press-event",
+                             G_CALLBACK(lxpanel_plugin_button_press_event), p);
     }
     else
     {
index 136a559..499e716 100644 (file)
@@ -30,6 +30,16 @@ G_BEGIN_DECLS
 
 #define FM_MODULE_lxpanel_gtk_VERSION 1 /* version of this API */
 
+/**
+ * @init: (allow-none): callback on lxpanel start
+ * @finalize: (allow-none): callback on lxpanel exit
+ * @name: name to represent plugin in lists
+ * @description: tooltip on the plugin in lists
+ * @new_instance: callback to create new plugin instance in panel
+ * @config: (allow-none): callback to show configuration dialog
+ * @reconfigure: (allow-none): callback to apply panel configuration change
+ * @button_press_event: (allow-none): callback on "button-press-event" signal
+ */
 typedef struct {
     /*< public >*/
     void (*init)(void);         /* optional startup */
@@ -39,6 +49,7 @@ typedef struct {
     GtkWidget *(*new_instance)(Panel *panel, config_setting_t *settings);
     void (*config)(Panel *panel, GtkWidget *instance, GtkWindow *parent);
     void (*reconfigure)(Panel *panel, GtkWidget *instance);
+    gboolean (*button_press_event)(GtkWidget *widget, GdkEventButton *event, Panel *panel);
     int one_per_system : 1;     /* True to disable more than one instance */
     int expand_available : 1;   /* True if "stretch" option is available */
     int expand_default : 1;     /* True if "stretch" option is default */
@@ -58,7 +69,7 @@ extern gboolean lxpanel_register_plugin_type(const char *name, LXPanelPluginInit
 
 /* few helper functions */
 extern GtkMenu* lxpanel_get_plugin_menu(Panel* panel, GtkWidget* plugin, gboolean use_sub_menu);
-extern gboolean lxpanel_plugin_button_press_event(GtkWidget *widget, GdkEventButton *event, GtkWidget *plugin);
+extern gboolean lxpanel_plugin_button_press_event(GtkWidget *plugin, GdkEventButton *event, Panel *panel);
                        /* Handler for "button_press_event" signal with Plugin as parameter */
 extern void lxpanel_plugin_adjust_popup_position(GtkWidget * popup, GtkWidget * plugin);
                        /* Helper to move popup windows away from the panel */
index 479d8f5..3bffefb 100644 (file)
@@ -102,14 +102,16 @@ static GtkWidget * dclock_create_calendar(DClockPlugin * dc)
 }
 
 /* Handler for "button-press-event" event from main widget. */
-static gboolean dclock_button_press_event(GtkWidget * widget, GdkEventButton * evt, GtkWidget * plugin)
+static gboolean dclock_button_press_event(GtkWidget * widget, GdkEventButton * evt, Panel * panel)
 {
-    DClockPlugin * dc = lxpanel_plugin_get_data(plugin);
+    DClockPlugin * dc;
 
     /* Standard right-click handling. */
-    if (lxpanel_plugin_button_press_event(widget, evt, plugin))
+    if (lxpanel_plugin_button_press_event(widget, evt, panel))
         return TRUE;
 
+    dc = lxpanel_plugin_get_data(widget);
+
     /* If an action is set, execute it. */
     if (dc->action != NULL)
         fm_launch_command_simple(NULL, NULL, 0, dc->action, NULL);
@@ -320,9 +322,6 @@ static GtkWidget *dclock_constructor(Panel *panel, config_setting_t *settings)
     dc->clock_icon = gtk_image_new();
     gtk_container_add(GTK_CONTAINER(hbox), dc->clock_icon);
 
-    /* Connect signals. */
-    g_signal_connect(G_OBJECT (p), "button-press-event", G_CALLBACK(dclock_button_press_event), (gpointer) p);
-
     /* Initialize the clock display. */
     if (dc->clock_format == NULL)
         dc->clock_format = g_strdup(_(DEFAULT_CLOCK_FORMAT));
@@ -426,7 +425,7 @@ static void dclock_configure(Panel *panel, GtkWidget *p, GtkWindow *parent)
 {
     DClockPlugin * dc = lxpanel_plugin_get_data(p);
     GtkWidget * dlg = lxpanel_generic_config_dlg(_("Digital Clock"), panel,
-        (GSourceFunc) dclock_apply_configuration, p,
+        dclock_apply_configuration, p,
         _("Clock Format"), &dc->clock_format, CONF_TYPE_STR,
         _("Tooltip Format"), &dc->tooltip_format, CONF_TYPE_STR,
         _("Format codes: man 3 strftime; \%n for line break"), NULL, CONF_TYPE_TRIM,
@@ -451,5 +450,6 @@ LXPanelPluginInit lxpanel_static_plugin_dclock = {
 
     .new_instance = dclock_constructor,
     .config = dclock_configure,
-    .reconfigure = dclock_reconfigure
+    .reconfigure = dclock_reconfigure,
+    .button_press_event = dclock_button_press_event
 };
index c5fd63b..b6a1af4 100644 (file)
@@ -40,10 +40,6 @@ static GtkWidget *separator_constructor(Panel *panel, config_setting_t *settings
     gtk_container_add(GTK_CONTAINER(instance), sep);
     gtk_widget_show(sep);
 
-    /* Connect signals. */
-    g_signal_connect(instance, "button-press-event",
-                     G_CALLBACK(lxpanel_plugin_button_press_event), instance);
-
     /* Show the widget and return. */
     return instance;
 }
index b86ab42..5b7fd63 100644 (file)
@@ -61,10 +61,6 @@ static GtkWidget *space_constructor(Panel *panel, config_setting_t *settings)
     gtk_widget_add_events(p, GDK_BUTTON_PRESS_MASK);
     gtk_container_set_border_width(GTK_CONTAINER(p), 0);
 
-    /* Connect signals. */
-    g_signal_connect(p, "button-press-event",
-                     G_CALLBACK(lxpanel_plugin_button_press_event), p);
-
     /* Apply the configuration and show the widget. */
     space_apply_configuration(p);
     return p;