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: 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;
pgpwVg6I4aFF7.pgp
Description: Digitale PGP-Signatur