[gimp] app: make sure overlay widgets are keyboard navigatable



commit 2d68b1d4f9749bb71707b0a3ff36918d4d5a4e40
Author: Michael Natterer <mitch gimp org>
Date:   Sat Jun 8 15:27:14 2013 +0200

    app: make sure overlay widgets are keyboard navigatable
    
    Tab key events are not handled by the widget itself, they are supposed
    to bubble up until they hit the generic keyboard navigation code
    that knows about the focus chain, therefore:
    
    gimp_display_shell_canvas_tool_events(): if an overlay widget is
    focussed, don't handle Tab events and toggle dock visibility. Instead,
    simply bail out with FALSE so the event reaches te keyboard navigation
    code.
    
    Also treat GDK_KEY_KP_Tab like GDK_KEY_Tab all over the place.

 app/display/gimpdisplayshell-tool-events.c |   27 ++++++++++++++++++++++-----
 1 files changed, 22 insertions(+), 5 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c
index 58a9d03..26df542 100644
--- a/app/display/gimpdisplayshell-tool-events.c
+++ b/app/display/gimpdisplayshell-tool-events.c
@@ -195,6 +195,7 @@ gimp_display_shell_events (GtkWidget        *widget,
           case GDK_KEY_space:
           case GDK_KEY_KP_Space:
           case GDK_KEY_Tab:
+          case GDK_KEY_KP_Tab:
           case GDK_KEY_ISO_Left_Tab:
           case GDK_KEY_Alt_L:     case GDK_KEY_Alt_R:
           case GDK_KEY_Shift_L:   case GDK_KEY_Shift_R:
@@ -278,7 +279,8 @@ gimp_display_shell_canvas_no_image_events (GtkWidget        *canvas,
       {
         GdkEventKey *kevent = (GdkEventKey *) event;
 
-        if (kevent->keyval == GDK_KEY_Tab ||
+        if (kevent->keyval == GDK_KEY_Tab    ||
+            kevent->keyval == GDK_KEY_KP_Tab ||
             kevent->keyval == GDK_KEY_ISO_Left_Tab)
           {
             return gimp_display_shell_tab_pressed (shell, kevent);
@@ -1077,9 +1079,22 @@ gimp_display_shell_canvas_tool_events (GtkWidget        *canvas,
                 break;
 
               case GDK_KEY_Tab:
+              case GDK_KEY_KP_Tab:
               case GDK_KEY_ISO_Left_Tab:
-                gimp_display_shell_tab_pressed (shell, kevent);
-                return_val = TRUE;
+                if (! gtk_widget_has_focus (shell->canvas))
+                  {
+                    /*  The event was in an overlay widget and not
+                     *  handled there, make sure the overlay widgets
+                     *  are keyboard navigatable by letting the generic
+                     *  focus handler deal with tabs.
+                     */
+                    return FALSE;
+                  }
+                else
+                  {
+                    gimp_display_shell_tab_pressed (shell, kevent);
+                    return_val = TRUE;
+                  }
                 break;
 
                 /*  Update the state based on modifiers being pressed  */
@@ -1586,7 +1601,8 @@ gimp_display_shell_tab_pressed (GimpDisplayShell  *shell,
     {
       if (image && ! gimp_image_is_empty (image))
         {
-          if (kevent->keyval == GDK_KEY_Tab)
+          if (kevent->keyval == GDK_KEY_Tab ||
+              kevent->keyval == GDK_KEY_KP_Tab)
             gimp_display_shell_layer_select_init (shell,
                                                   1, kevent->time);
           else
@@ -1600,7 +1616,8 @@ gimp_display_shell_tab_pressed (GimpDisplayShell  *shell,
     {
       if (image)
         {
-          if (kevent->keyval == GDK_KEY_Tab)
+          if (kevent->keyval == GDK_KEY_Tab ||
+              kevent->keyval == GDK_KEY_KP_Tab)
             gimp_ui_manager_activate_action (manager, "windows",
                                              "windows-show-display-next");
           else


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]