[gimp] Bug 724692 - Canvas rotation stuck with specific order of actions.



commit b279c2d2177081142bf8ce36850beafe0be1beed
Author: Jehan <jehan girinstud io>
Date:   Fri Mar 16 02:31:43 2018 +0100

    Bug 724692 - Canvas rotation stuck with specific order of actions.
    
    The bug was affecting actually both canvas rotation and panning when
    done with space key. If the first mouse button was also clicked, then
    released after the space key, we ended up in some stuck action. It could
    only be unstuck by hitting/releasing space again.
    
    I am actually unsure that this was not originally done on purpose,
    especially since the code has these 2 status variables space_pressed and
    space_release_pending, but really apart from looking at this code, the
    behavior just looks very buggy and impracticable.
    The new behavior is to just stop the canvas panning/rotation as soon as
    space is released (which is also how it is documented in our manual, and
    how everyone seems to use the feature). I only kept the variable
    space_release_pending, which I use as was used space_pressed before.

 app/display/gimpdisplayshell-tool-events.c |  118 ++++++++++++----------------
 app/display/gimpdisplayshell.h             |    1 -
 2 files changed, 50 insertions(+), 69 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c
index e4d04a2..c72690f 100644
--- a/app/display/gimpdisplayshell-tool-events.c
+++ b/app/display/gimpdisplayshell-tool-events.c
@@ -161,7 +161,7 @@ gimp_display_shell_events (GtkWidget        *widget,
         if (gimp->busy)
           return TRUE;
 
-        /*  do not process any key events while BUTTON1 is down. We do this
+        /*  do not process most key events while BUTTON1 is down. We do this
          *  so tools keep the modifier state they were in when BUTTON1 was
          *  pressed and to prevent accelerators from being invoked.
          */
@@ -174,30 +174,13 @@ gimp_display_shell_events (GtkWidget        *widget,
                 kevent->keyval == GDK_KEY_Alt_L     ||
                 kevent->keyval == GDK_KEY_Alt_R     ||
                 kevent->keyval == GDK_KEY_Meta_L    ||
-                kevent->keyval == GDK_KEY_Meta_R)
+                kevent->keyval == GDK_KEY_Meta_R    ||
+                kevent->keyval == GDK_KEY_space     ||
+                kevent->keyval == GDK_KEY_KP_Space)
               {
                 break;
               }
 
-            if (event->type == GDK_KEY_PRESS)
-              {
-                if ((kevent->keyval == GDK_KEY_space ||
-                     kevent->keyval == GDK_KEY_KP_Space) && shell->space_release_pending)
-                  {
-                    shell->space_pressed         = TRUE;
-                    shell->space_release_pending = FALSE;
-                  }
-              }
-            else
-              {
-                if ((kevent->keyval == GDK_KEY_space ||
-                     kevent->keyval == GDK_KEY_KP_Space) && shell->space_pressed)
-                  {
-                    shell->space_pressed         = FALSE;
-                    shell->space_release_pending = TRUE;
-                  }
-              }
-
             return TRUE;
           }
 
@@ -222,7 +205,7 @@ gimp_display_shell_events (GtkWidget        *widget,
             break;
 
           default:
-            if (shell->space_pressed || shell->scrolling)
+            if (shell->space_release_pending || shell->scrolling)
               return TRUE;
             break;
           }
@@ -762,7 +745,7 @@ gimp_display_shell_canvas_tool_events_internal (GtkWidget         *canvas,
             if (! gimp_display_shell_pointer_grab (shell, NULL, 0))
               return TRUE;
 
-            if (! shell->space_pressed && ! shell->space_release_pending)
+            if (! shell->space_release_pending)
               if (! gimp_display_shell_keyboard_grab (shell, event))
                 {
                   gimp_display_shell_pointer_ungrab (shell, NULL);
@@ -875,7 +858,7 @@ gimp_display_shell_canvas_tool_events_internal (GtkWidget         *canvas,
             if (! shell->pointer_grabbed || shell->scrolling)
               return TRUE;
 
-            if (! shell->space_pressed && ! shell->space_release_pending)
+            if (! shell->space_release_pending)
               gimp_display_shell_keyboard_ungrab (shell, event);
 
             if (active_tool &&
@@ -904,9 +887,6 @@ gimp_display_shell_canvas_tool_events_internal (GtkWidget         *canvas,
                                                &image_coords, 0);
 
             gimp_display_shell_pointer_ungrab (shell, NULL);
-
-            if (shell->space_release_pending)
-              gimp_display_shell_space_released (shell, event, &image_coords);
           }
         else if (bevent->button == 2)
           {
@@ -1197,27 +1177,27 @@ gimp_display_shell_canvas_tool_events_internal (GtkWidget         *canvas,
 
         if (state & GDK_BUTTON1_MASK)
           {
-            switch (kevent->keyval)
+            if (kevent->keyval == GDK_KEY_Alt_L     ||
+                kevent->keyval == GDK_KEY_Alt_R     ||
+                kevent->keyval == GDK_KEY_Shift_L   ||
+                kevent->keyval == GDK_KEY_Shift_R   ||
+                kevent->keyval == GDK_KEY_Control_L ||
+                kevent->keyval == GDK_KEY_Control_R ||
+                kevent->keyval == GDK_KEY_Meta_L    ||
+                kevent->keyval == GDK_KEY_Meta_R)
               {
-              case GDK_KEY_Alt_L:     case GDK_KEY_Alt_R:
-              case GDK_KEY_Shift_L:   case GDK_KEY_Shift_R:
-              case GDK_KEY_Control_L: case GDK_KEY_Control_R:
-              case GDK_KEY_Meta_L:    case GDK_KEY_Meta_R:
-                {
-                  GdkModifierType key;
+                GdkModifierType key;
 
-                  key = gimp_display_shell_key_to_state (kevent->keyval);
-                  state |= key;
+                key = gimp_display_shell_key_to_state (kevent->keyval);
+                state |= key;
 
-                  if (active_tool                                        &&
-                      gimp_tool_control_is_active (active_tool->control) &&
-                      ! gimp_image_is_empty (image))
-                    {
-                      tool_manager_active_modifier_state_active (gimp, state,
-                                                                 display);
-                    }
-                }
-                break;
+                if (active_tool                                        &&
+                    gimp_tool_control_is_active (active_tool->control) &&
+                    ! gimp_image_is_empty (image))
+                  {
+                    tool_manager_active_modifier_state_active (gimp, state,
+                                                               display);
+                  }
               }
           }
         else
@@ -1326,29 +1306,32 @@ gimp_display_shell_canvas_tool_events_internal (GtkWidget         *canvas,
 
         active_tool = tool_manager_get_active (gimp);
 
-        if (state & GDK_BUTTON1_MASK)
+        if ((state & GDK_BUTTON1_MASK)      &&
+            (! shell->space_release_pending ||
+             (kevent->keyval != GDK_KEY_space &&
+              kevent->keyval != GDK_KEY_KP_Space)))
           {
-            switch (kevent->keyval)
+            if (kevent->keyval == GDK_KEY_Alt_L     ||
+                kevent->keyval == GDK_KEY_Alt_R     ||
+                kevent->keyval == GDK_KEY_Shift_L   ||
+                kevent->keyval == GDK_KEY_Shift_R   ||
+                kevent->keyval == GDK_KEY_Control_L ||
+                kevent->keyval == GDK_KEY_Control_R ||
+                kevent->keyval == GDK_KEY_Meta_L    ||
+                kevent->keyval == GDK_KEY_Meta_R)
               {
-              case GDK_KEY_Alt_L:     case GDK_KEY_Alt_R:
-              case GDK_KEY_Shift_L:   case GDK_KEY_Shift_R:
-              case GDK_KEY_Control_L: case GDK_KEY_Control_R:
-              case GDK_KEY_Meta_L:    case GDK_KEY_Meta_R:
-                {
-                  GdkModifierType key;
+                GdkModifierType key;
 
-                  key = gimp_display_shell_key_to_state (kevent->keyval);
-                  state &= ~key;
+                key = gimp_display_shell_key_to_state (kevent->keyval);
+                state &= ~key;
 
-                  if (active_tool                                        &&
-                      gimp_tool_control_is_active (active_tool->control) &&
-                      ! gimp_image_is_empty (image))
-                    {
-                      tool_manager_active_modifier_state_active (gimp, state,
-                                                                 display);
-                    }
-                }
-                break;
+                if (active_tool                                        &&
+                    gimp_tool_control_is_active (active_tool->control) &&
+                    ! gimp_image_is_empty (image))
+                  {
+                    tool_manager_active_modifier_state_active (gimp, state,
+                                                               display);
+                  }
               }
           }
         else
@@ -1597,7 +1580,7 @@ gimp_display_shell_space_pressed (GimpDisplayShell *shell,
 {
   Gimp *gimp = gimp_display_get_gimp (shell->display);
 
-  if (shell->space_pressed)
+  if (shell->space_release_pending)
     return;
 
   if (! gimp_display_shell_keyboard_grab (shell, event))
@@ -1651,7 +1634,7 @@ gimp_display_shell_space_pressed (GimpDisplayShell *shell,
       break;
     }
 
-  shell->space_pressed = TRUE;
+  shell->space_release_pending = TRUE;
 }
 
 static void
@@ -1661,7 +1644,7 @@ gimp_display_shell_space_released (GimpDisplayShell *shell,
 {
   Gimp *gimp = gimp_display_get_gimp (shell->display);
 
-  if (! shell->space_pressed && ! shell->space_release_pending)
+  if (! shell->space_release_pending)
     return;
 
   switch (shell->display->config->space_bar_action)
@@ -1701,7 +1684,6 @@ gimp_display_shell_space_released (GimpDisplayShell *shell,
 
   gimp_display_shell_keyboard_ungrab (shell, event);
 
-  shell->space_pressed         = FALSE;
   shell->space_release_pending = FALSE;
 }
 
diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h
index 5f93f25..d5aabab 100644
--- a/app/display/gimpdisplayshell.h
+++ b/app/display/gimpdisplayshell.h
@@ -189,7 +189,6 @@ struct _GimpDisplayShell
 
   gboolean           inferior_ignore_mode;
 
-  gboolean           space_pressed;
   gboolean           space_release_pending;
   const gchar       *space_shaded_tool;
 


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