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 behaviourMouse 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: [email protected], 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;
pgpwVg6I4aFF7.pgp
Description: Digitale PGP-Signatur

