[gimp] app: let tools control how they recieve modifier keys during a stroke



commit dd30cc79b5397c6b71bf900e1568ac7672469336
Author: Michael Natterer <mitch gimp org>
Date:   Sun Oct 29 16:28:46 2017 +0100

    app: let tools control how they recieve modifier keys during a stroke
    
    Add new enum GimpToolActiveModifiers { OFF, SAME, SEPARATE } and
    new API gimp_tool_control_set,get_active_modifiers(), the default
    value is OFF.
    
    OFF: the tool gets no modifier keys at all during a stroke
    
    SAME: all modifiers are always delivered via GimpTool::modifier_key(),
    and no magic is applied whatsoever when a mouse button is pressed or
    released.
    
    SEPARATE: this is the "classic" way: modifiers while hovering and
    while stroking are delivered separately, and hover modifiers don't
    affect stroke modifiers.

 app/tools/gimptoolcontrol.c |   20 +++++
 app/tools/gimptoolcontrol.h |  190 ++++++++++++++++++++++++-------------------
 app/tools/tools-enums.c     |   31 +++++++
 app/tools/tools-enums.h     |   12 +++
 4 files changed, 168 insertions(+), 85 deletions(-)
---
diff --git a/app/tools/gimptoolcontrol.c b/app/tools/gimptoolcontrol.c
index a7d83ff..e93784e 100644
--- a/app/tools/gimptoolcontrol.c
+++ b/app/tools/gimptoolcontrol.c
@@ -69,6 +69,8 @@ gimp_tool_control_init (GimpToolControl *control)
   control->wants_triple_click     = FALSE;
   control->wants_all_key_events   = FALSE;
 
+  control->active_modifiers       = GIMP_TOOL_ACTIVE_MODIFIERS_OFF;
+
   control->cursor                 = GIMP_CURSOR_MOUSE;
   control->tool_cursor            = GIMP_TOOL_CURSOR_NONE;
   control->cursor_modifier        = GIMP_CURSOR_MODIFIER_NONE;
@@ -348,6 +350,24 @@ gimp_tool_control_get_wants_all_key_events (GimpToolControl *control)
 }
 
 void
+gimp_tool_control_set_active_modifiers (GimpToolControl         *control,
+                                        GimpToolActiveModifiers  active_modifiers)
+{
+  g_return_if_fail (GIMP_IS_TOOL_CONTROL (control));
+
+  control->active_modifiers = active_modifiers;
+}
+
+GimpToolActiveModifiers
+gimp_tool_control_get_active_modifiers (GimpToolControl *control)
+{
+  g_return_val_if_fail (GIMP_IS_TOOL_CONTROL (control),
+                        GIMP_TOOL_ACTIVE_MODIFIERS_OFF);
+
+  return control->active_modifiers;
+}
+
+void
 gimp_tool_control_set_snap_offsets (GimpToolControl *control,
                                     gint             offset_x,
                                     gint             offset_y,
diff --git a/app/tools/gimptoolcontrol.h b/app/tools/gimptoolcontrol.h
index c308511..8d3f6aa 100644
--- a/app/tools/gimptoolcontrol.h
+++ b/app/tools/gimptoolcontrol.h
@@ -64,6 +64,8 @@ struct _GimpToolControl
   gboolean             wants_triple_click;
   gboolean             wants_all_key_events;
 
+  GimpToolActiveModifiers  active_modifiers;
+
   gboolean             toggled;
 
   GimpCursorType       cursor;
@@ -91,92 +93,110 @@ struct _GimpToolControlClass
 };
 
 
-GType          gimp_tool_control_get_type         (void) G_GNUC_CONST;
-
-void           gimp_tool_control_activate         (GimpToolControl *control);
-void           gimp_tool_control_halt             (GimpToolControl *control);
-gboolean       gimp_tool_control_is_active        (GimpToolControl *control);
-
-void           gimp_tool_control_pause            (GimpToolControl *control);
-void           gimp_tool_control_resume           (GimpToolControl *control);
-gboolean       gimp_tool_control_is_paused        (GimpToolControl *control);
-
-void           gimp_tool_control_set_preserve     (GimpToolControl *control,
-                                                   gboolean         preserve);
-gboolean       gimp_tool_control_get_preserve     (GimpToolControl *control);
-
-void           gimp_tool_control_push_preserve    (GimpToolControl *control,
-                                                   gboolean         preserve);
-void           gimp_tool_control_pop_preserve     (GimpToolControl *control);
-
-void           gimp_tool_control_set_scroll_lock  (GimpToolControl *control,
-                                                   gboolean         scroll_lock);
-gboolean       gimp_tool_control_get_scroll_lock  (GimpToolControl *control);
-
-void     gimp_tool_control_set_handle_empty_image (GimpToolControl *control,
-                                                   gboolean         handle_empty);
-gboolean gimp_tool_control_get_handle_empty_image (GimpToolControl *control);
-
-void           gimp_tool_control_set_dirty_mask   (GimpToolControl *control,
-                                                   GimpDirtyMask    dirty_mask);
-GimpDirtyMask  gimp_tool_control_get_dirty_mask   (GimpToolControl *control);
-
-void           gimp_tool_control_set_motion_mode  (GimpToolControl *control,
-                                                   GimpMotionMode   motion_mode);
-GimpMotionMode gimp_tool_control_get_motion_mode  (GimpToolControl *control);
-
-void           gimp_tool_control_set_snap_to      (GimpToolControl *control,
-                                                   gboolean         snap_to);
-gboolean       gimp_tool_control_get_snap_to      (GimpToolControl *control);
-
-void           gimp_tool_control_set_wants_click  (GimpToolControl *control,
-                                                   gboolean         wants_click);
-gboolean       gimp_tool_control_get_wants_click  (GimpToolControl *control);
-
-void           gimp_tool_control_set_wants_double_click   (GimpToolControl *control,
-                                                           gboolean         wants_double_click);
-gboolean       gimp_tool_control_get_wants_double_click   (GimpToolControl *control);
-
-void           gimp_tool_control_set_wants_triple_click   (GimpToolControl *control,
-                                                           gboolean         wants_double_click);
-gboolean       gimp_tool_control_get_wants_triple_click   (GimpToolControl *control);
-
-void           gimp_tool_control_set_wants_all_key_events (GimpToolControl *control,
-                                                           gboolean         wants_key_events);
-gboolean       gimp_tool_control_get_wants_all_key_events (GimpToolControl *control);
-
-void           gimp_tool_control_set_snap_offsets (GimpToolControl *control,
-                                                   gint             offset_x,
-                                                   gint             offset_y,
-                                                   gint             width,
-                                                   gint             height);
-void           gimp_tool_control_get_snap_offsets (GimpToolControl *control,
-                                                   gint            *offset_x,
-                                                   gint            *offset_y,
-                                                   gint            *width,
-                                                   gint            *height);
-
-void           gimp_tool_control_set_precision    (GimpToolControl     *control,
-                                                   GimpCursorPrecision  precision);
+GType          gimp_tool_control_get_type           (void) G_GNUC_CONST;
+
+void           gimp_tool_control_activate           (GimpToolControl *control);
+void           gimp_tool_control_halt               (GimpToolControl *control);
+gboolean       gimp_tool_control_is_active          (GimpToolControl *control);
+
+void           gimp_tool_control_pause              (GimpToolControl *control);
+void           gimp_tool_control_resume             (GimpToolControl *control);
+gboolean       gimp_tool_control_is_paused          (GimpToolControl *control);
+
+void           gimp_tool_control_set_preserve       (GimpToolControl *control,
+                                                     gboolean         preserve);
+gboolean       gimp_tool_control_get_preserve       (GimpToolControl *control);
+
+void           gimp_tool_control_push_preserve      (GimpToolControl *control,
+                                                     gboolean         preserve);
+void           gimp_tool_control_pop_preserve       (GimpToolControl *control);
+
+void           gimp_tool_control_set_scroll_lock    (GimpToolControl *control,
+                                                     gboolean         scroll_lock);
+gboolean       gimp_tool_control_get_scroll_lock    (GimpToolControl *control);
+
+void           gimp_tool_control_set_handle_empty_image
+                                                    (GimpToolControl *control,
+                                                     gboolean         handle_empty);
+gboolean       gimp_tool_control_get_handle_empty_image
+                                                    (GimpToolControl *control);
+
+void           gimp_tool_control_set_dirty_mask     (GimpToolControl *control,
+                                                     GimpDirtyMask    dirty_mask);
+GimpDirtyMask  gimp_tool_control_get_dirty_mask     (GimpToolControl *control);
+
+void           gimp_tool_control_set_motion_mode    (GimpToolControl *control,
+                                                     GimpMotionMode   motion_mode);
+GimpMotionMode gimp_tool_control_get_motion_mode    (GimpToolControl *control);
+
+void           gimp_tool_control_set_snap_to        (GimpToolControl *control,
+                                                     gboolean         snap_to);
+gboolean       gimp_tool_control_get_snap_to        (GimpToolControl *control);
+
+void           gimp_tool_control_set_wants_click    (GimpToolControl *control,
+                                                     gboolean         wants_click);
+gboolean       gimp_tool_control_get_wants_click    (GimpToolControl *control);
+
+void           gimp_tool_control_set_wants_double_click
+                                                    (GimpToolControl *control,
+                                                     gboolean         wants_double_click);
+gboolean       gimp_tool_control_get_wants_double_click
+                                                    (GimpToolControl *control);
+
+void           gimp_tool_control_set_wants_triple_click
+                                                    (GimpToolControl *control,
+                                                     gboolean         wants_double_click);
+gboolean       gimp_tool_control_get_wants_triple_click
+                                                    (GimpToolControl *control);
+
+void           gimp_tool_control_set_wants_all_key_events
+                                                    (GimpToolControl *control,
+                                                     gboolean         wants_key_events);
+gboolean       gimp_tool_control_get_wants_all_key_events
+                                                    (GimpToolControl *control);
+
+void           gimp_tool_control_set_active_modifiers
+                                                    (GimpToolControl *control,
+                                                     GimpToolActiveModifiers  active_modifiers);
+GimpToolActiveModifiers
+               gimp_tool_control_get_active_modifiers
+                                                    (GimpToolControl *control);
+
+void           gimp_tool_control_set_snap_offsets   (GimpToolControl *control,
+                                                     gint             offset_x,
+                                                     gint             offset_y,
+                                                     gint             width,
+                                                     gint             height);
+void           gimp_tool_control_get_snap_offsets   (GimpToolControl *control,
+                                                     gint            *offset_x,
+                                                     gint            *offset_y,
+                                                     gint            *width,
+                                                     gint            *height);
+
+void           gimp_tool_control_set_precision      (GimpToolControl *control,
+                                                     GimpCursorPrecision  precision);
 GimpCursorPrecision
-               gimp_tool_control_get_precision    (GimpToolControl     *control);
-
-void           gimp_tool_control_set_toggled      (GimpToolControl *control,
-                                                   gboolean         toggled);
-gboolean       gimp_tool_control_get_toggled      (GimpToolControl *control);
-
-void gimp_tool_control_set_cursor                 (GimpToolControl    *control,
-                                                   GimpCursorType      cursor);
-void gimp_tool_control_set_tool_cursor            (GimpToolControl    *control,
-                                                   GimpToolCursorType  cursor);
-void gimp_tool_control_set_cursor_modifier        (GimpToolControl    *control,
-                                                   GimpCursorModifier  modifier);
-void gimp_tool_control_set_toggle_cursor          (GimpToolControl    *control,
-                                                   GimpCursorType      cursor);
-void gimp_tool_control_set_toggle_tool_cursor     (GimpToolControl    *control,
-                                                   GimpToolCursorType  cursor);
-void gimp_tool_control_set_toggle_cursor_modifier (GimpToolControl    *control,
-                                                   GimpCursorModifier  modifier);
+               gimp_tool_control_get_precision      (GimpToolControl *control);
+
+void           gimp_tool_control_set_toggled        (GimpToolControl *control,
+                                                     gboolean         toggled);
+gboolean       gimp_tool_control_get_toggled        (GimpToolControl *control);
+
+void           gimp_tool_control_set_cursor         (GimpToolControl *control,
+                                                     GimpCursorType   cursor);
+void           gimp_tool_control_set_tool_cursor    (GimpToolControl *control,
+                                                     GimpToolCursorType  cursor);
+void           gimp_tool_control_set_cursor_modifier
+                                                    (GimpToolControl *control,
+                                                     GimpCursorModifier  modifier);
+void           gimp_tool_control_set_toggle_cursor  (GimpToolControl *control,
+                                                     GimpCursorType   cursor);
+void           gimp_tool_control_set_toggle_tool_cursor
+                                                    (GimpToolControl *control,
+                                                     GimpToolCursorType  cursor);
+void           gimp_tool_control_set_toggle_cursor_modifier
+                                                    (GimpToolControl *control,
+                                                     GimpCursorModifier  modifier);
 
 GimpCursorType
               gimp_tool_control_get_cursor          (GimpToolControl *control);
diff --git a/app/tools/tools-enums.c b/app/tools/tools-enums.c
index ff6b00e..d869bd5 100644
--- a/app/tools/tools-enums.c
+++ b/app/tools/tools-enums.c
@@ -105,6 +105,37 @@ gimp_tool_action_get_type (void)
 }
 
 GType
+gimp_tool_active_modifiers_get_type (void)
+{
+  static const GEnumValue values[] =
+  {
+    { GIMP_TOOL_ACTIVE_MODIFIERS_OFF, "GIMP_TOOL_ACTIVE_MODIFIERS_OFF", "off" },
+    { GIMP_TOOL_ACTIVE_MODIFIERS_SAME, "GIMP_TOOL_ACTIVE_MODIFIERS_SAME", "same" },
+    { GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE, "GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE", "separate" },
+    { 0, NULL, NULL }
+  };
+
+  static const GimpEnumDesc descs[] =
+  {
+    { GIMP_TOOL_ACTIVE_MODIFIERS_OFF, "GIMP_TOOL_ACTIVE_MODIFIERS_OFF", NULL },
+    { GIMP_TOOL_ACTIVE_MODIFIERS_SAME, "GIMP_TOOL_ACTIVE_MODIFIERS_SAME", NULL },
+    { GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE, "GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE", NULL },
+    { 0, NULL, NULL }
+  };
+
+  static GType type = 0;
+
+  if (G_UNLIKELY (! type))
+    {
+      type = g_enum_register_static ("GimpToolActiveModifiers", values);
+      gimp_type_set_translation_context (type, "tool-active-modifiers");
+      gimp_enum_set_value_descriptions (type, descs);
+    }
+
+  return type;
+}
+
+GType
 gimp_matting_draw_mode_get_type (void)
 {
   static const GEnumValue values[] =
diff --git a/app/tools/tools-enums.h b/app/tools/tools-enums.h
index a7f2158..3513dc1 100644
--- a/app/tools/tools-enums.h
+++ b/app/tools/tools-enums.h
@@ -60,6 +60,18 @@ typedef enum
 } GimpToolAction;
 
 
+#define GIMP_TYPE_TOOL_ACTIVE_MODIFIERS (gimp_tool_active_modifiers_get_type ())
+
+GType gimp_tool_active_modifiers_get_type (void) G_GNUC_CONST;
+
+typedef enum
+{
+  GIMP_TOOL_ACTIVE_MODIFIERS_OFF,
+  GIMP_TOOL_ACTIVE_MODIFIERS_SAME,
+  GIMP_TOOL_ACTIVE_MODIFIERS_SEPARATE,
+} GimpToolActiveModifiers;
+
+
 #define GIMP_TYPE_MATTING_DRAW_MODE (gimp_matting_draw_mode_get_type ())
 
 GType gimp_matting_draw_mode_get_type (void) G_GNUC_CONST;


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