[gimp] app: add intrastructure to send key_release events to tools



commit c0aa4498d23e7737ce5e383c84615dd5ffcbb108
Author: Michael Natterer <mitch gimp org>
Date:   Thu Feb 18 20:50:11 2010 +0100

    app: add intrastructure to send key_release events to tools
    
    The code is 100% identical to the key_press handling and simply
    dispatches key_release events too tools which selected them via
    GimpToolControl.

 app/display/gimpdisplayshell-callbacks.c |   12 ++++++++++++
 app/tools/gimptool.c                     |   24 ++++++++++++++++++++++++
 app/tools/gimptool.h                     |    6 ++++++
 app/tools/tool_manager.c                 |   21 +++++++++++++++++++++
 app/tools/tool_manager.h                 |    3 +++
 5 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c
index a3910d5..476cae5 100644
--- a/app/display/gimpdisplayshell-callbacks.c
+++ b/app/display/gimpdisplayshell-callbacks.c
@@ -1620,6 +1620,18 @@ gimp_display_shell_canvas_tool_events (GtkWidget        *canvas,
           {
             tool_manager_focus_display_active (gimp, display);
 
+            if (gimp_tool_control_get_wants_all_key_events (active_tool->control))
+              {
+                if (tool_manager_key_release_active (gimp, kevent, display))
+                  {
+                    /* FIXME: need to do some of the stuff below, like
+                     * calling oper_update()
+                     */
+
+                    return TRUE;
+                  }
+              }
+
             switch (kevent->keyval)
               {
               case GDK_space:
diff --git a/app/tools/gimptool.c b/app/tools/gimptool.c
index c199526..c9d59b8 100644
--- a/app/tools/gimptool.c
+++ b/app/tools/gimptool.c
@@ -88,6 +88,9 @@ static void       gimp_tool_real_motion         (GimpTool              *tool,
 static gboolean   gimp_tool_real_key_press      (GimpTool              *tool,
                                                  GdkEventKey           *kevent,
                                                  GimpDisplay           *display);
+static gboolean   gimp_tool_real_key_release    (GimpTool              *tool,
+                                                 GdkEventKey           *kevent,
+                                                 GimpDisplay           *display);
 static void       gimp_tool_real_modifier_key   (GimpTool              *tool,
                                                  GdkModifierType        key,
                                                  gboolean               press,
@@ -140,6 +143,7 @@ gimp_tool_class_init (GimpToolClass *klass)
   klass->button_release      = gimp_tool_real_button_release;
   klass->motion              = gimp_tool_real_motion;
   klass->key_press           = gimp_tool_real_key_press;
+  klass->key_release         = gimp_tool_real_key_release;
   klass->modifier_key        = gimp_tool_real_modifier_key;
   klass->active_modifier_key = gimp_tool_real_active_modifier_key;
   klass->oper_update         = gimp_tool_real_oper_update;
@@ -335,6 +339,14 @@ gimp_tool_real_key_press (GimpTool    *tool,
   return FALSE;
 }
 
+static gboolean
+gimp_tool_real_key_release (GimpTool    *tool,
+                            GdkEventKey *kevent,
+                            GimpDisplay *display)
+{
+  return FALSE;
+}
+
 static void
 gimp_tool_real_modifier_key (GimpTool        *tool,
                              GdkModifierType  key,
@@ -692,6 +704,18 @@ gimp_tool_key_press (GimpTool    *tool,
   return GIMP_TOOL_GET_CLASS (tool)->key_press (tool, kevent, display);
 }
 
+gboolean
+gimp_tool_key_release (GimpTool    *tool,
+                       GdkEventKey *kevent,
+                       GimpDisplay *display)
+{
+  g_return_val_if_fail (GIMP_IS_TOOL (tool), FALSE);
+  g_return_val_if_fail (GIMP_IS_DISPLAY (display), FALSE);
+  g_return_val_if_fail (display == tool->focus_display, FALSE);
+
+  return GIMP_TOOL_GET_CLASS (tool)->key_release (tool, kevent, display);
+}
+
 static void
 gimp_tool_modifier_key (GimpTool        *tool,
                         GdkModifierType  key,
diff --git a/app/tools/gimptool.h b/app/tools/gimptool.h
index 9bdeaeb..4b4c594 100644
--- a/app/tools/gimptool.h
+++ b/app/tools/gimptool.h
@@ -108,6 +108,9 @@ struct _GimpToolClass
   gboolean        (* key_press)           (GimpTool              *tool,
                                            GdkEventKey           *kevent,
                                            GimpDisplay           *display);
+  gboolean        (* key_release)         (GimpTool              *tool,
+                                           GdkEventKey           *kevent,
+                                           GimpDisplay           *display);
   void            (* modifier_key)        (GimpTool              *tool,
                                            GdkModifierType        key,
                                            gboolean               press,
@@ -172,6 +175,9 @@ void          gimp_tool_motion              (GimpTool            *tool,
 gboolean      gimp_tool_key_press           (GimpTool            *tool,
                                              GdkEventKey         *kevent,
                                              GimpDisplay         *display);
+gboolean      gimp_tool_key_release         (GimpTool            *tool,
+                                             GdkEventKey         *kevent,
+                                             GimpDisplay         *display);
 
 void          gimp_tool_set_focus_display   (GimpTool            *tool,
                                              GimpDisplay         *display);
diff --git a/app/tools/tool_manager.c b/app/tools/tool_manager.c
index ed2d014..5cd034e 100644
--- a/app/tools/tool_manager.c
+++ b/app/tools/tool_manager.c
@@ -358,6 +358,27 @@ tool_manager_key_press_active (Gimp        *gimp,
   return FALSE;
 }
 
+gboolean
+tool_manager_key_release_active (Gimp        *gimp,
+                                 GdkEventKey *kevent,
+                                 GimpDisplay *display)
+{
+  GimpToolManager *tool_manager;
+
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
+
+  tool_manager = tool_manager_get (gimp);
+
+  if (tool_manager->active_tool)
+    {
+      return gimp_tool_key_release (tool_manager->active_tool,
+                                    kevent,
+                                    display);
+    }
+
+  return FALSE;
+}
+
 void
 tool_manager_focus_display_active (Gimp        *gimp,
                                    GimpDisplay *display)
diff --git a/app/tools/tool_manager.h b/app/tools/tool_manager.h
index 7597a75..54fad22 100644
--- a/app/tools/tool_manager.h
+++ b/app/tools/tool_manager.h
@@ -56,6 +56,9 @@ void       tool_manager_motion_active              (Gimp             *gimp,
 gboolean   tool_manager_key_press_active           (Gimp             *gimp,
                                                     GdkEventKey      *kevent,
                                                     GimpDisplay      *display);
+gboolean   tool_manager_key_release_active         (Gimp             *gimp,
+                                                    GdkEventKey      *kevent,
+                                                    GimpDisplay      *display);
 
 void       tool_manager_focus_display_active       (Gimp             *gimp,
                                                     GimpDisplay      *display);



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