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
=== modified file 'src/idoscalemenuitem.c'
--- src/idoscalemenuitem.c 2013-10-31 18:07:00 +0000
+++ src/idoscalemenuitem.c 2013-11-28 10:29:04 +0000
@@ -40,6 +40,11 @@
40 guint prop_id,40 guint prop_id,
41 GValue *value,41 GValue *value,
42 GParamSpec *pspec);42 GParamSpec *pspec);
43static gboolean ido_scale_menu_item_parent_key_press_event (GtkWidget *widget,
44 GdkEventKey *event,
45 gpointer user_data);
46static void ido_scale_menu_item_select (GtkMenuItem *item);
47static void ido_scale_menu_item_deselect (GtkMenuItem *item);
43static gboolean ido_scale_menu_item_button_press_event (GtkWidget *menuitem,48static gboolean ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
44 GdkEventButton *event);49 GdkEventButton *event);
45static gboolean ido_scale_menu_item_button_release_event (GtkWidget *menuitem,50static gboolean ido_scale_menu_item_button_release_event (GtkWidget *menuitem,
@@ -76,6 +81,7 @@
76 IdoRangeStyle range_style;81 IdoRangeStyle range_style;
77 gint toggle_size;82 gint toggle_size;
78 gboolean ignore_value_changed;83 gboolean ignore_value_changed;
84 gboolean has_focus;
79};85};
8086
81enum {87enum {
@@ -274,10 +280,14 @@
274{280{
275 GObjectClass *gobject_class = G_OBJECT_CLASS (item_class);281 GObjectClass *gobject_class = G_OBJECT_CLASS (item_class);
276 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (item_class);282 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (item_class);
283 GtkMenuItemClass *menuitem_class = GTK_MENU_ITEM_CLASS (item_class);
277284
278 item_class->primary_clicked = default_primary_clicked_handler;285 item_class->primary_clicked = default_primary_clicked_handler;
279 item_class->secondary_clicked = default_secondary_clicked_handler;286 item_class->secondary_clicked = default_secondary_clicked_handler;
280287
288 menuitem_class->select = ido_scale_menu_item_select;
289 menuitem_class->deselect = ido_scale_menu_item_deselect;
290
281 widget_class->button_press_event = ido_scale_menu_item_button_press_event;291 widget_class->button_press_event = ido_scale_menu_item_button_press_event;
282 widget_class->button_release_event = ido_scale_menu_item_button_release_event;292 widget_class->button_release_event = ido_scale_menu_item_button_release_event;
283 widget_class->motion_notify_event = ido_scale_menu_item_motion_notify_event;293 widget_class->motion_notify_event = ido_scale_menu_item_motion_notify_event;
@@ -523,6 +533,55 @@
523}533}
524534
525static gboolean535static gboolean
536ido_scale_menu_item_parent_key_press_event (GtkWidget *widget,
537 GdkEventKey *event,
538 gpointer user_data)
539{
540 IdoScaleMenuItemPrivate *priv = GET_PRIVATE (user_data);
541
542 /* only listen to events when the playback menu item is selected */
543 if (!priv->has_focus)
544 return FALSE;
545
546 switch (event->keyval)
547 {
548 case GDK_KEY_Left:
549 case GDK_KEY_minus:
550 case GDK_KEY_KP_Subtract:
551 GTK_RANGE_GET_CLASS (priv->scale)->move_slider (GTK_RANGE (priv->scale), GTK_SCROLL_STEP_LEFT);
552 return TRUE;
553
554 case GDK_KEY_Right:
555 case GDK_KEY_plus:
556 case GDK_KEY_KP_Add:
557 GTK_RANGE_GET_CLASS (priv->scale)->move_slider (GTK_RANGE (priv->scale), GTK_SCROLL_STEP_RIGHT);
558 return TRUE;
559 }
560
561 return FALSE;
562}
563
564static void
565ido_scale_menu_item_select (GtkMenuItem *item)
566{
567 IdoScaleMenuItemPrivate *priv = GET_PRIVATE (item);
568
569 priv->has_focus = TRUE;
570
571 GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->select (item);
572}
573
574static void
575ido_scale_menu_item_deselect (GtkMenuItem *item)
576{
577 IdoScaleMenuItemPrivate *priv = GET_PRIVATE (item);
578
579 priv->has_focus = FALSE;
580
581 GTK_MENU_ITEM_CLASS (ido_scale_menu_item_parent_class)->deselect (item);
582}
583
584static gboolean
526ido_scale_menu_item_button_press_event (GtkWidget *menuitem,585ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
527 GdkEventButton *event)586 GdkEventButton *event)
528{587{
@@ -648,11 +707,22 @@
648 GtkWidget *parent;707 GtkWidget *parent;
649708
650 if (previous_parent)709 if (previous_parent)
651 g_signal_handlers_disconnect_by_func (previous_parent, menu_hidden, item);710 {
711 g_signal_handlers_disconnect_by_func (previous_parent, menu_hidden, item);
712 g_signal_handlers_disconnect_by_func (previous_parent, ido_scale_menu_item_parent_key_press_event, item);
713 }
652714
653 parent = gtk_widget_get_parent (item);715 parent = gtk_widget_get_parent (item);
716
654 if (parent)717 if (parent)
655 g_signal_connect (parent, "hide", G_CALLBACK (menu_hidden), item);718 {
719 g_signal_connect (parent, "hide", G_CALLBACK (menu_hidden), item);
720
721 /* Menus don't pass key events to their children. This works around
722 * that by listening to key events on the parent widget. */
723 g_signal_connect (parent, "key-press-event",
724 G_CALLBACK (ido_scale_menu_item_parent_key_press_event), item);
725 }
656}726}
657727
658static void728static void

Subscribers

People subscribed via source and target branches