aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-09-09 14:00:06 +0000
committerTarmac <Unknown>2013-09-09 14:00:06 +0000
commit5878e6b03deeacda2293ff733faaa436932dda95 (patch)
tree9dab360b74ba642606d9562edbddb8ee4caa4761
parent86f3d9e211daa64c99047734cd81f7d75ad7ed09 (diff)
parent9e857c3e55be6a7f2bb30f1edbdf94f3f97c8ba7 (diff)
downloadlibayatana-indicator-5878e6b03deeacda2293ff733faaa436932dda95.tar.gz
libayatana-indicator-5878e6b03deeacda2293ff733faaa436932dda95.tar.bz2
libayatana-indicator-5878e6b03deeacda2293ff733faaa436932dda95.zip
Expose scrolling and middle clicking to fix bug #1221242 and #1204036 (make scrolling and middle clicking work on the sound indicator). Fixes: https://bugs.launchpad.net/bugs/1204036, https://bugs.launchpad.net/bugs/1221242.
Approved by Charles Kerr, PS Jenkins bot.
-rw-r--r--libindicator/indicator-ng.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/libindicator/indicator-ng.c b/libindicator/indicator-ng.c
index d8ac840..8d3304b 100644
--- a/libindicator/indicator-ng.c
+++ b/libindicator/indicator-ng.c
@@ -33,6 +33,8 @@ struct _IndicatorNg
gchar *bus_name;
gchar *profile;
gchar *header_action;
+ gchar *scroll_action;
+ gchar *secondary_action;
gint position;
guint name_watch_id;
@@ -158,6 +160,8 @@ indicator_ng_finalize (GObject *object)
g_free (self->bus_name);
g_free (self->accessible_desc);
g_free (self->header_action);
+ g_free (self->scroll_action);
+ g_free (self->secondary_action);
G_OBJECT_CLASS (indicator_ng_parent_class)->finalize (object);
}
@@ -179,6 +183,37 @@ indicator_ng_get_position (IndicatorObject *io)
}
static void
+indicator_ng_entry_scrolled (IndicatorObject *io,
+ IndicatorObjectEntry *entry,
+ gint delta,
+ IndicatorScrollDirection direction)
+{
+ IndicatorNg *self = INDICATOR_NG (io);
+
+ if (self->actions && self->scroll_action)
+ {
+ if (direction == INDICATOR_OBJECT_SCROLL_DOWN)
+ delta *= -1;
+ g_action_group_activate_action (self->actions, self->scroll_action,
+ g_variant_new_int32 (delta));
+ }
+}
+
+void
+indicator_ng_secondary_activate (IndicatorObject *io,
+ IndicatorObjectEntry *entry,
+ guint timestamp,
+ gpointer user_data)
+{
+ IndicatorNg *self = INDICATOR_NG (io);
+
+ if (self->actions && self->secondary_action)
+ {
+ g_action_group_activate_action (self->actions, self->secondary_action, NULL);
+ }
+}
+
+static void
indicator_ng_set_accessible_desc (IndicatorNg *self,
const gchar *accessible_desc)
{
@@ -332,16 +367,33 @@ indicator_ng_menu_changed (GMenuModel *menu,
if (added)
{
g_clear_pointer (&self->header_action, g_free);
+ g_clear_pointer (&self->scroll_action, g_free);
+ g_clear_pointer (&self->secondary_action, g_free);
if (indicator_ng_menu_item_is_of_type (self->menu, 0, "com.canonical.indicator.root"))
{
GMenuModel *popup;
gchar *action;
- if (g_menu_model_get_item_attribute (self->menu, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action) &&
- g_str_has_prefix (action, "indicator."))
+ if (g_menu_model_get_item_attribute (self->menu, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action))
{
- self->header_action = g_strdup (action + strlen ("indicator."));
+ if (g_str_has_prefix (action, "indicator."))
+ self->header_action = g_strdup (action + strlen ("indicator."));
+ g_free (action);
+ }
+
+ if (g_menu_model_get_item_attribute (self->menu, 0, "x-canonical-scroll-action", "s", &action))
+ {
+ if (g_str_has_prefix (action, "indicator."))
+ self->scroll_action = g_strdup (action + strlen ("indicator."));
+ g_free (action);
+ }
+
+ if (g_menu_model_get_item_attribute (self->menu, 0, "x-canonical-secondary-action", "s", &action))
+ {
+ if (g_str_has_prefix (action, "indicator."))
+ self->secondary_action = g_strdup (action + strlen ("indicator."));
+ g_free (action);
}
popup = g_menu_model_get_item_link (self->menu, 0, G_MENU_LINK_SUBMENU);
@@ -352,8 +404,6 @@ indicator_ng_menu_changed (GMenuModel *menu,
}
indicator_ng_update_entry (self);
-
- g_free (action);
}
else
g_warning ("indicator menu item must be of type 'com.canonical.indicator.root'");
@@ -570,6 +620,8 @@ indicator_ng_class_init (IndicatorNgClass *class)
io_class->get_entries = indicator_ng_get_entries;
io_class->get_position = indicator_ng_get_position;
+ io_class->entry_scrolled = indicator_ng_entry_scrolled;
+ io_class->secondary_activate = indicator_ng_secondary_activate;
properties[PROP_SERVICE_FILE] = g_param_spec_string ("service-file",
"Service file",