aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Novosyolov <m.novosyolov@rosa.ru>2026-04-28 15:11:59 +0300
committerMikhail Novosyolov <m.novosyolov@rosalinux.ru>2026-04-28 16:01:04 +0300
commit90ce95a6ba93f4f4b2e777041b77e4e7e7e65284 (patch)
tree2b2333754983b565d7683d098d78655ef7158587
parent31e8bb083b307e1cc96af4874a94707727bd1e79 (diff)
downloadlibayatana-appindicator-90ce95a6ba93f4f4b2e777041b77e4e7e7e65284.tar.gz
libayatana-appindicator-90ce95a6ba93f4f4b2e777041b77e4e7e7e65284.tar.bz2
libayatana-appindicator-90ce95a6ba93f4f4b2e777041b77e4e7e7e65284.zip
Implement the Activate D-Bus method for primary click handling
Handle the org.kde.StatusNotifierItem Activate() method that KDE Plasma calls on left-click. When a signal handler is connected, emit the "activate" GObject signal and return success. When no handler is connected, return an error so the panel falls back to showing the context menu for backward compatibility. This fixes the dual menu+toggle issue for applications like Onboard that need left-click to perform a custom action instead of showing the context menu. Co-authored-by: Z.AI GLM
-rw-r--r--src/app-indicator.c36
-rw-r--r--src/app-indicator.h7
-rw-r--r--src/notification-item.xml4
3 files changed, 46 insertions, 1 deletions
diff --git a/src/app-indicator.c b/src/app-indicator.c
index 833cb90..8f714fe 100644
--- a/src/app-indicator.c
+++ b/src/app-indicator.c
@@ -120,6 +120,7 @@ enum {
CONNECTION_CHANGED,
NEW_ICON_THEME_PATH,
SCROLL_EVENT,
+ ACTIVATE_EVENT,
LAST_SIGNAL
};
@@ -625,6 +626,23 @@ app_indicator_class_init (AppIndicatorClass *klass)
_application_service_marshal_VOID__INT_UINT,
G_TYPE_NONE, 2, G_TYPE_INT, GDK_TYPE_SCROLL_DIRECTION);
+ /**
+ * AppIndicator::activate:
+ * @arg0: The #AppIndicator object
+ * @arg1: The x coordinate of the activation
+ * @arg2: The y coordinate of the activation
+ *
+ * Signaled when the #AppIndicator receives a primary activation event
+ * (e.g. left-click on the tray icon).
+ */
+ signals[ACTIVATE_EVENT] = g_signal_new (APP_INDICATOR_SIGNAL_ACTIVATE_EVENT,
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (AppIndicatorClass, activate_event),
+ NULL, NULL,
+ _application_service_marshal_VOID__INT_INT,
+ G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
+
/* DBus interfaces */
if (item_node_info == NULL) {
GError * error = NULL;
@@ -1192,7 +1210,23 @@ bus_method_call (GDBusConnection * connection, const gchar * sender,
AppIndicatorPrivate * priv = app_indicator_get_instance_private(app);
GVariant * retval = NULL;
- if (g_strcmp0(method, "Scroll") == 0) {
+ if (g_strcmp0(method, "Activate") == 0) {
+ gint x, y;
+ g_variant_get(params, "(ii)", &x, &y);
+
+ if (g_signal_has_handler_pending(app, signals[ACTIVATE_EVENT], 0, FALSE)) {
+ g_signal_emit(app, signals[ACTIVATE_EVENT], 0, x, y);
+ g_dbus_method_invocation_return_value(invocation, retval);
+ } else {
+ /* No handler connected — return error so the panel falls back
+ * to showing the context menu for backward compatibility. */
+ g_dbus_method_invocation_return_error(invocation,
+ G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD,
+ "No handler for Activate");
+ }
+ return;
+
+ } else if (g_strcmp0(method, "Scroll") == 0) {
GdkScrollDirection direction;
gint delta;
const gchar *orientation;
diff --git a/src/app-indicator.h b/src/app-indicator.h
index 059bdbd..7002d35 100644
--- a/src/app-indicator.h
+++ b/src/app-indicator.h
@@ -119,6 +119,7 @@ G_BEGIN_DECLS
#define APP_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed"
#define APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH "new-icon-theme-path"
#define APP_INDICATOR_SIGNAL_SCROLL_EVENT "scroll-event"
+#define APP_INDICATOR_SIGNAL_ACTIVATE_EVENT "activate"
/**
* AppIndicatorCategory:
@@ -169,6 +170,7 @@ typedef struct _AppIndicatorClass AppIndicatorClass;
* @new_label: Slot for #AppIndicator::new-label.
* @connection_changed: Slot for #AppIndicator::connection-changed.
* @scroll_event: Slot for #AppIndicator::scroll-event
+ * @activate_event: Slot for #AppIndicator::activate
* @app_indicator_reserved_ats: Reserved for future use.
* @fallback: Function that gets called to make a #GtkStatusIcon when
* there is no Application Indicator area available.
@@ -214,6 +216,11 @@ struct _AppIndicatorClass {
GdkScrollDirection direction,
gpointer user_data);
+ void (* activate_event) (AppIndicator * indicator,
+ gint x,
+ gint y,
+ gpointer user_data);
+
void (*app_indicator_reserved_ats)(void);
/* Overridable Functions */
diff --git a/src/notification-item.xml b/src/notification-item.xml
index c93afd7..a223ea4 100644
--- a/src/notification-item.xml
+++ b/src/notification-item.xml
@@ -20,6 +20,10 @@
<property name="XAyatanaOrderingIndex" type="u" access="read" />
<!-- Methods -->
+ <method name="Activate">
+ <arg type="i" name="x" direction="in" />
+ <arg type="i" name="y" direction="in" />
+ </method>
<method name="Scroll">
<arg type="i" name="delta" direction="in" />
<arg type="s" name="orientation" direction="in" />