Package: mate-indicator-applet
Severity: important
Version: 1.20.1-1

The MATE Indicator Applet does not handle secondary-activate events, like e.g. xfce4-indicator-applet does.

Expected behaviour

Mouse middle-click on indicator does emit signal "secondary-activate" for the ayatana indicator stack back to the application to handle the event.

Have code very similar to INDICATOR_OBJECT_SIGNAL_ENTRY_SCROLLED.

Actual behaviour

Nothing happens.

References

https://github.com/AyatanaIndicators/libayatana-indicator/blob/master/libayatana-indicator/indicator-object.h#L60
https://github.com/AyatanaIndicators/libayatana-indicator/commits/master/libayatana-indicator/indicator-object.h

Steps to reproduce the behaviour

Python with AyatanaAppIncidator3. See API:
https://lazka.github.io/pgi-docs/AyatanaAppIndicator3-0.1/classes/Indicator.html#AyatanaAppIndicator3.Indicator.set_secondary_activate_target

As a reference implementation, see xfce_indicator_button_button_release at
https://github.com/xfce-mirror/xfce4-indicator-plugin/blob/master/panel-plugin/indicator-button.c#L341

Greets,
Mike
--

DAS-NETZWERKTEAM
c\o Technik- und Ökologiezentrum Eckernförde
Mike Gabriel, Marienthaler str. 17, 24340 Eckernförde
mobile: +49 (1520) 1976 148
landline: +49 (4354) 8390 139

GnuPG Fingerprint: 9BFB AEE8 6C0A A5FF BF22  0782 9AF4 6B30 2577 1B31
mail: mike.gabr...@das-netzwerkteam.de, http://das-netzwerkteam.de

--- a/src/applet-main.c 2019-04-18 10:50:43.964025890 +0200
+++ b/src/applet-main.c 2019-04-18 20:13:16.740055539 +0200
@@ -303,6 +303,25 @@
        return FALSE;
 }
 
+static gboolean
+entry_released (GtkWidget *event_box, GdkEvent *event, gpointer data)
+{
+       if (((GdkEventButton*)event)->button == 2) /* middle button */
+       {
+               IndicatorObject *io = g_object_get_data (G_OBJECT (menuitem), 
MENU_DATA_INDICATOR_OBJECT);
+               IndicatorObjectEntry *entry = g_object_get_data (G_OBJECT 
(menuitem), MENU_DATA_INDICATOR_ENTRY);
+
+               g_return_val_if_fail(INDICATOR_IS_OBJECT(io), FALSE);
+
+               g_signal_emit_by_name (io, 
INDICATOR_OBJECT_SIGNAL_SECONDARY_ACTIVATE, entry,
+                       ((GdkEventButton*)event)->time);
+
+               return TRUE;
+       }
+
+       return FALSE;
+}
+
 static void
 accessible_desc_update_cb (GtkWidget * widget, gpointer userdata)
 {
@@ -333,15 +352,21 @@
        GtkWidget * menuitem = gtk_menu_item_new();
        GtkWidget * box = (packdirection == GTK_PACK_DIRECTION_LTR) ?
                gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3) : 
gtk_box_new(GTK_ORIENTATION_VERTICAL, 3);
+       GtkWidget * event_box = gtk_event_box_new();
 
        /* Allows indicators to receive mouse scroll event */
        gtk_widget_add_events(GTK_WIDGET(menuitem), GDK_SCROLL_MASK);
+       gtk_widget_add_events(GTK_WIDGET(event_box), GDK_BUTTON_RELEASE_MASK);
 
        g_object_set_data (G_OBJECT (menuitem), "indicator", io);
        g_object_set_data (G_OBJECT (menuitem), "box", box);
+       g_object_set_data (G_OBJECT (menuitem), "event-box", event_box);
 
        g_signal_connect(G_OBJECT(menuitem), "activate", 
G_CALLBACK(entry_activated), entry);
        g_signal_connect(G_OBJECT(menuitem), "scroll-event", 
G_CALLBACK(entry_scrolled), entry);
+       g_signal_connect(G_OBJECT(event_box), "button-release-event", 
G_CALLBACK(entry_released), entry);
+
+       gtk_box_pack_start(GTK_BOX(event_box), GTK_WIDGET(box), FALSE, FALSE, 
1);
 
        if (entry->image != NULL) {
                gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(entry->image), 
FALSE, FALSE, 1);
@@ -386,8 +411,8 @@
 
                g_signal_connect(G_OBJECT(entry->label), "notify::sensitive", 
G_CALLBACK(sensitive_cb), menuitem);
        }
-       gtk_container_add(GTK_CONTAINER(menuitem), box);
-       gtk_widget_show(box);
+       gtk_container_add(GTK_CONTAINER(menuitem), event_box);
+       gtk_widget_show_all(event_box);
 
        if (entry->menu != NULL) {
                gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), 
GTK_WIDGET(entry->menu));
@@ -828,14 +853,15 @@
 static gboolean
 reorient_box_cb (GtkWidget *menuitem, gpointer data)
 {
+       GtkWidget *event_box = g_object_get_data(G_OBJECT(menuitem), 
"event-box");
        GtkWidget *from = g_object_get_data(G_OBJECT(menuitem), "box");
        GtkWidget *to = (packdirection == GTK_PACK_DIRECTION_LTR) ?
                gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0) : 
gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        g_object_set_data(G_OBJECT(from), "to", to);
        gtk_container_foreach(GTK_CONTAINER(from), (GtkCallback)swap_orient_cb,
                        from);
-       gtk_container_remove(GTK_CONTAINER(menuitem), from);
-       gtk_container_add(GTK_CONTAINER(menuitem), to);
+       gtk_container_remove(GTK_CONTAINER(event_box), from);
+       gtk_container_add(GTK_CONTAINER(event_box), to);
        g_object_set_data(G_OBJECT(menuitem), "box", to);
        gtk_widget_show_all(menuitem);
        return TRUE;

Attachment: pgpwVg6I4aFF7.pgp
Description: Digitale PGP-Signatur

Reply via email to