[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#927438: indicator object signal: secondary-activate / INDICATOR_OBJECT_SIGNAL_SECONDARY_ACTIVAT



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.gabriel@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: pgp9Rv4IfvN5h.pgp
Description: Digitale PGP-Signatur


Reply to: