Merge lp:~larsu/ido/lp1242550 into lp:ido/14.04

Proposed by Lars Karlitski
Status: Merged
Approved by: Sebastien Bacher
Approved revision: 164
Merged at revision: 164
Proposed branch: lp:~larsu/ido/lp1242550
Merge into: lp:ido/14.04
Diff against target: 119 lines (+72/-2)
1 file modified
src/idoscalemenuitem.c (+72/-2)
To merge this branch: bzr merge lp:~larsu/ido/lp1242550
Reviewer Review Type Date Requested Status
Sebastien Bacher Approve
PS Jenkins bot (community) continuous-integration Approve
Charles Kerr (community) Approve
Review via email: mp+192055@code.launchpad.net

Description of the change

IdoScaleMenuItem: intercept left and right keys

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Charles Kerr (charlesk) wrote :

Works as advertised and the code looks good.

One suggestion, it looks like we could pick up a little more spec compliance by adding '+' / '-' key support by adding GDK_KEY_KP_Add, GDK_KEY_KP_Subtract, GDK_KEY_plus, GDK_KEY_minus in the switch statement in ido_scale_menu_item_parent_key_press_event()

Revision history for this message
Lars Karlitski (larsu) wrote :

Good point, thanks. Fixed in r155.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Charles Kerr (charlesk) wrote :

Lars, could you add GDK_KEY_equal into this as well?

Revision history for this message
Charles Kerr (charlesk) :
review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
lp:~larsu/ido/lp1242550 updated
164. By Lars Karlitski

IdoScaleMenuItem: allow changing value with left/right and +/- keys

Revision history for this message
Lars Karlitski (larsu) wrote :

This patch conflicted with a previous commit, but not in a way that bzr could have noticed (parent_set was declared twice in different locations in the idoscalemenuitem.c).

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Sebastien Bacher (seb128) wrote :

tested on trusty, works as described, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/idoscalemenuitem.c'
2--- src/idoscalemenuitem.c 2013-10-31 18:07:00 +0000
3+++ src/idoscalemenuitem.c 2013-11-28 10:29:04 +0000
4@@ -40,6 +40,11 @@
5 guint prop_id,
6 GValue *value,
7 GParamSpec *pspec);
8+static gboolean ido_scale_menu_item_parent_key_press_event (GtkWidget *widget,
9+ GdkEventKey *event,
10+ gpointer user_data);
11+static void ido_scale_menu_item_select (GtkMenuItem *item);
12+static void ido_scale_menu_item_deselect (GtkMenuItem *item);
13 static gboolean ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
14 GdkEventButton *event);
15 static gboolean ido_scale_menu_item_button_release_event (GtkWidget *menuitem,
16@@ -76,6 +81,7 @@
17 IdoRangeStyle range_style;
18 gint toggle_size;
19 gboolean ignore_value_changed;
20+ gboolean has_focus;
21 };
22
23 enum {
24@@ -274,10 +280,14 @@
25 {
26 GObjectClass *gobject_class = G_OBJECT_CLASS (item_class);
27 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (item_class);
28+ GtkMenuItemClass *menuitem_class = GTK_MENU_ITEM_CLASS (item_class);
29
30 item_class->primary_clicked = default_primary_clicked_handler;
31 item_class->secondary_clicked = default_secondary_clicked_handler;
32
33+ menuitem_class->select = ido_scale_menu_item_select;
34+ menuitem_class->deselect = ido_scale_menu_item_deselect;
35+
36 widget_class->button_press_event = ido_scale_menu_item_button_press_event;
37 widget_class->button_release_event = ido_scale_menu_item_button_release_event;
38 widget_class->motion_notify_event = ido_scale_menu_item_motion_notify_event;
39@@ -523,6 +533,55 @@
40 }
41
42 static gboolean
43+ido_scale_menu_item_parent_key_press_event (GtkWidget *widget,
44+ GdkEventKey *event,
45+ gpointer user_data)
46+{
47+ IdoScaleMenuItemPrivate *priv = GET_PRIVATE (user_data);
48+
49+ /* only listen to events when the playback menu item is selected */
50+ if (!priv->has_focus)
51+ return FALSE;
52+
53+ switch (event->keyval)
54+ {
55+ case GDK_KEY_Left:
56+ case GDK_KEY_minus:
57+ case GDK_KEY_KP_Subtract:
58+ GTK_RANGE_GET_CLASS (priv->scale)->move_slider (GTK_RANGE (priv->scale), GTK_SCROLL_STEP_LEFT);
59+ return TRUE;
60+
61+ case GDK_KEY_Right:
62+ case GDK_KEY_plus:
63+ case GDK_KEY_KP_Add:
64+ GTK_RANGE_GET_CLASS (priv->scale)->move_slider (GTK_RANGE (priv->scale), GTK_SCROLL_STEP_RIGHT);
65+ return TRUE;
66+ }
67+
68+ return FALSE;
69+}
70+
71+static void
72+ido_scale_menu_item_select (GtkMenuItem *item)
73+{
74+ IdoScaleMenuItemPrivate *priv = GET_PRIVATE (item);
75+
76+ priv->has_focus = TRUE;
77+
78+ GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->select (item);
79+}
80+
81+static void
82+ido_scale_menu_item_deselect (GtkMenuItem *item)
83+{
84+ IdoScaleMenuItemPrivate *priv = GET_PRIVATE (item);
85+
86+ priv->has_focus = FALSE;
87+
88+ GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->deselect (item);
89+}
90+
91+static gboolean
92 ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
93 GdkEventButton *event)
94 {
95@@ -648,11 +707,22 @@
96 GtkWidget *parent;
97
98 if (previous_parent)
99- g_signal_handlers_disconnect_by_func (previous_parent, menu_hidden, item);
100+ {
101+ g_signal_handlers_disconnect_by_func (previous_parent, menu_hidden, item);
102+ g_signal_handlers_disconnect_by_func (previous_parent, ido_scale_menu_item_parent_key_press_event, item);
103+ }
104
105 parent = gtk_widget_get_parent (item);
106+
107 if (parent)
108- g_signal_connect (parent, "hide", G_CALLBACK (menu_hidden), item);
109+ {
110+ g_signal_connect (parent, "hide", G_CALLBACK (menu_hidden), item);
111+
112+ /* Menus don't pass key events to their children. This works around
113+ * that by listening to key events on the parent widget. */
114+ g_signal_connect (parent, "key-press-event",
115+ G_CALLBACK (ido_scale_menu_item_parent_key_press_event), item);
116+ }
117 }
118
119 static void

Subscribers

People subscribed via source and target branches