diff options
| author | Mikhail Novosyolov <m.novosyolov@rosa.ru> | 2026-04-28 15:11:59 +0300 |
|---|---|---|
| committer | Mikhail Novosyolov <m.novosyolov@rosalinux.ru> | 2026-04-28 16:01:04 +0300 |
| commit | 90ce95a6ba93f4f4b2e777041b77e4e7e7e65284 (patch) | |
| tree | 2b2333754983b565d7683d098d78655ef7158587 /src/app-indicator.c | |
| parent | 31e8bb083b307e1cc96af4874a94707727bd1e79 (diff) | |
| download | libayatana-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
Diffstat (limited to 'src/app-indicator.c')
| -rw-r--r-- | src/app-indicator.c | 36 |
1 files changed, 35 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; |
