From 1a569c2f0cda67071400682be92b01b4c2641ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Sun, 10 Jul 2011 05:18:08 +0200 Subject: Add support to the "SecondaryActivate" method Added support for the missing StatusNotifierItem SecondaryActivate signal. The indicator-application receives the "secondary-activate" signal from libindicator and redirects it via dbus to the proper watcher using the "SecondaryActivate" method, sending the X and Y pointer position as parameters (as defined by the StatusNotifierItem specs). --- src/application-service-appstore.c | 61 ++++++++++++++++++++++++++++---------- src/application-service.xml | 7 +++++ src/indicator-application.c | 37 +++++++++++++++++++---- 3 files changed, 84 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c index 9cd65b4..4353728 100644 --- a/src/application-service-appstore.c +++ b/src/application-service-appstore.c @@ -142,6 +142,7 @@ static void approver_free (gpointer papprover, gpointer user_data); static void check_with_new_approver (gpointer papp, gpointer papprove); static void check_with_old_approver (gpointer papprove, gpointer papp); static Application * find_application (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * object); +static Application * find_application_by_menu (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * menuobject); static void bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data); static void dbus_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data); static void app_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data); @@ -263,31 +264,20 @@ bus_method_call (GDBusConnection * connection, const gchar * sender, { ApplicationServiceAppstore * service = APPLICATION_SERVICE_APPSTORE(user_data); GVariant * retval = NULL; + Application *app = NULL; + const gchar *dbusaddress; + const gchar *dbusmenuobject; if (g_strcmp0(method, "GetApplications") == 0) { retval = get_applications(service); } else if (g_strcmp0(method, "ApplicationScrollEvent") == 0) { - Application *app = NULL; - const gchar *dbusaddress; - const gchar *dbusobject; gchar *orientation = NULL; gint delta; guint direction; - g_variant_get (params, "(&s&siu)", &dbusaddress, &dbusobject, + g_variant_get (params, "(&s&siu)", &dbusaddress, &dbusmenuobject, &delta, &direction); - GList *l; - for (l = service->priv->applications; l != NULL; l = l->next) { - Application *a = l->data; - - if (g_strcmp0(a->dbus_name, dbusaddress) == 0 && - g_strcmp0(a->menu, dbusobject) == 0) { - app = a; - break; - } - } - switch (direction) { case INDICATOR_OBJECT_SCROLL_UP: delta = -delta; @@ -301,11 +291,28 @@ bus_method_call (GDBusConnection * connection, const gchar * sender, orientation = "horizontal"; } + app = find_application_by_menu(service, dbusaddress, dbusmenuobject); + if (app != NULL && app->dbus_proxy != NULL && orientation != NULL) { g_dbus_proxy_call(app->dbus_proxy, "Scroll", - g_variant_new("(is)", delta, orientation), + g_variant_new("(is)", delta, orientation), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); } + } else if (g_strcmp0(method, "ApplicationSecondaryActivateEvent") == 0) { + guint time; + gint x; + gint y; + + g_variant_get (params, "(&s&suii)", &dbusaddress, &dbusmenuobject, + &time, &x, &y); + + app = find_application_by_menu(service, dbusaddress, dbusmenuobject); + + if (app != NULL && app->dbus_proxy != NULL) { + g_dbus_proxy_call(app->dbus_proxy, "SecondaryActivate", + g_variant_new("(ii)", x, y), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } } else { g_warning("Calling method '%s' on the indicator service and it's unknown", method); } @@ -1199,6 +1206,28 @@ find_application (ApplicationServiceAppstore * appstore, const gchar * address, return NULL; } +/* Looks for an application in the list of applications with the matching menu */ +static Application * +find_application_by_menu (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * menuobject) +{ + g_return_val_if_fail(appstore, NULL); + g_return_val_if_fail(address, NULL); + g_return_val_if_fail(menuobject, NULL); + + ApplicationServiceAppstorePrivate * priv = appstore->priv; + GList *l; + + for (l = priv->applications; l != NULL; l = l->next) { + Application *a = l->data; + if (g_strcmp0(a->dbus_name, address) == 0 && + g_strcmp0(a->menu, menuobject) == 0) { + return a; + } + } + + return NULL; +} + /* Removes an application. Currently only works for the apps that are shown. */ void diff --git a/src/application-service.xml b/src/application-service.xml index 1cffbc7..cd26d47 100644 --- a/src/application-service.xml +++ b/src/application-service.xml @@ -34,6 +34,13 @@ with this program. If not, see . + + + + + + + diff --git a/src/indicator-application.c b/src/indicator-application.c index dc810f4..281e397 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -110,6 +110,7 @@ static void indicator_application_finalize (GObject *object); static GList * get_entries (IndicatorObject * io); static guint get_location (IndicatorObject * io, IndicatorObjectEntry * entry); static void entry_scrolled (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction); +static void entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, guint time, gint x, gint y, gpointer data); void connection_changed (IndicatorServiceManager * sm, gboolean connected, IndicatorApplication * application); static void connected (IndicatorApplication * application); static void disconnected (IndicatorApplication * application); @@ -144,6 +145,7 @@ indicator_application_class_init (IndicatorApplicationClass *klass) io_class->get_entries = get_entries; io_class->get_location = get_location; + io_class->secondary_activate = entry_secondary_activate; io_class->entry_scrolled = entry_scrolled; return; @@ -402,9 +404,34 @@ get_location (IndicatorObject * io, IndicatorObjectEntry * entry) return g_list_index(priv->applications, entry); } +/* Redirect the secondary activate to the Application Item */ +static void +entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, + guint time, gint x, gint y, gpointer data) +{ + g_return_if_fail(IS_INDICATOR_APPLICATION(io)); + + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(io); + g_return_if_fail(priv->service_proxy); + + GList *l = g_list_find(priv->applications, entry); + if (l == NULL) + return; + + ApplicationEntry *app = l->data; + + if (app && app->dbusaddress && app->dbusobject && priv->service_proxy) { + g_dbus_proxy_call(priv->service_proxy, "ApplicationSecondaryActivateEvent", + g_variant_new("(ssuii)", app->dbusaddress, + app->dbusobject, + time, x, y), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + } +} + /* Redirect the scroll event to the Application Item */ -static void entry_scrolled (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction) { - +static void entry_scrolled (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction) +{ g_return_if_fail(IS_INDICATOR_APPLICATION(io)); IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(io); @@ -418,9 +445,9 @@ static void entry_scrolled (IndicatorObject * io, IndicatorObjectEntry * entry, if (app && app->dbusaddress && app->dbusobject && priv->service_proxy) { g_dbus_proxy_call(priv->service_proxy, "ApplicationScrollEvent", - g_variant_new("(ssiu)", app->dbusaddress, - app->dbusobject, - delta, direction), + g_variant_new("(ssiu)", app->dbusaddress, + app->dbusobject, + delta, direction), G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); } } -- cgit v1.2.3 From 7cd70567cf7c2f1423416513777b85c2efc93c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 21 Jul 2011 18:28:23 +0200 Subject: Don't use "SecondaryActivate" method Using XAyatanaSecondaryActivate as libindicator doesn't support the mouse x,y position in secondary_activate signal anymore. This will drop the middle-click support also for KDE status notifier items, but this is needed as we can't control what they would do with this signal (and according to our policies we can't do anything that isn't doable also using a menu item). --- src/application-service-appstore.c | 12 ++++-------- src/application-service.xml | 2 -- src/indicator-application.c | 12 ++++++------ 3 files changed, 10 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c index 4353728..09c2a99 100644 --- a/src/application-service-appstore.c +++ b/src/application-service-appstore.c @@ -300,18 +300,14 @@ bus_method_call (GDBusConnection * connection, const gchar * sender, } } else if (g_strcmp0(method, "ApplicationSecondaryActivateEvent") == 0) { guint time; - gint x; - gint y; - - g_variant_get (params, "(&s&suii)", &dbusaddress, &dbusmenuobject, - &time, &x, &y); + g_variant_get (params, "(&s&su)", &dbusaddress, &dbusmenuobject, &time); app = find_application_by_menu(service, dbusaddress, dbusmenuobject); if (app != NULL && app->dbus_proxy != NULL) { - g_dbus_proxy_call(app->dbus_proxy, "SecondaryActivate", - g_variant_new("(ii)", x, y), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + g_dbus_proxy_call(app->dbus_proxy, "XAyatanaSecondaryActivate", + g_variant_new("(u)", time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); } } else { g_warning("Calling method '%s' on the indicator service and it's unknown", method); diff --git a/src/application-service.xml b/src/application-service.xml index cd26d47..434cfd8 100644 --- a/src/application-service.xml +++ b/src/application-service.xml @@ -38,8 +38,6 @@ with this program. If not, see . - - diff --git a/src/indicator-application.c b/src/indicator-application.c index 281e397..f94b8b8 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -110,7 +110,7 @@ static void indicator_application_finalize (GObject *object); static GList * get_entries (IndicatorObject * io); static guint get_location (IndicatorObject * io, IndicatorObjectEntry * entry); static void entry_scrolled (IndicatorObject * io, IndicatorObjectEntry * entry, gint delta, IndicatorScrollDirection direction); -static void entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, guint time, gint x, gint y, gpointer data); +static void entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, guint time, gpointer data); void connection_changed (IndicatorServiceManager * sm, gboolean connected, IndicatorApplication * application); static void connected (IndicatorApplication * application); static void disconnected (IndicatorApplication * application); @@ -407,7 +407,7 @@ get_location (IndicatorObject * io, IndicatorObjectEntry * entry) /* Redirect the secondary activate to the Application Item */ static void entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, - guint time, gint x, gint y, gpointer data) + guint time, gpointer data) { g_return_if_fail(IS_INDICATOR_APPLICATION(io)); @@ -422,10 +422,10 @@ entry_secondary_activate (IndicatorObject * io, IndicatorObjectEntry * entry, if (app && app->dbusaddress && app->dbusobject && priv->service_proxy) { g_dbus_proxy_call(priv->service_proxy, "ApplicationSecondaryActivateEvent", - g_variant_new("(ssuii)", app->dbusaddress, - app->dbusobject, - time, x, y), - G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + g_variant_new("(ssu)", app->dbusaddress, + app->dbusobject, + time), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); } } -- cgit v1.2.3