diff --git a/app/display/gimptoolpolygon.c b/app/display/gimptoolpolygon.c index 007de5716b..c20bb33482 100644 --- a/app/display/gimptoolpolygon.c +++ b/app/display/gimptoolpolygon.c @@ -66,13 +66,6 @@ enum }; #endif -enum -{ - COMMIT, - CANCEL, - LAST_SIGNAL -}; - struct _GimpToolPolygonPrivate { @@ -200,8 +193,6 @@ G_DEFINE_TYPE (GimpToolPolygon, gimp_tool_polygon, GIMP_TYPE_TOOL_WIDGET) #define parent_class gimp_tool_polygon_parent_class -static guint polygon_signals[LAST_SIGNAL] = { 0 }; - static const GimpVector2 vector2_zero = { 0.0, 0.0 }; @@ -226,24 +217,6 @@ gimp_tool_polygon_class_init (GimpToolPolygonClass *klass) widget_class->hover_modifier = gimp_tool_polygon_hover_modifier; widget_class->get_cursor = gimp_tool_polygon_get_cursor; - polygon_signals[COMMIT] = - g_signal_new ("commit", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GimpToolPolygonClass, commit), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - polygon_signals[CANCEL] = - g_signal_new ("cancel", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GimpToolPolygonClass, cancel), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - #if 0 g_object_class_install_property (object_class, PROP_X1, g_param_spec_double ("x1", NULL, NULL, @@ -507,7 +480,8 @@ gimp_tool_polygon_remove_last_segment (GimpToolPolygon *polygon) priv->n_points = 0; priv->n_segment_indices = 0; - g_signal_emit (polygon, polygon_signals[CANCEL], 0); + gimp_tool_widget_response (GIMP_TOOL_WIDGET (polygon), + GIMP_TOOL_WIDGET_RESPONSE_CANCEL); } else { @@ -1179,7 +1153,8 @@ gimp_tool_polygon_button_release (GimpToolWidget *widget, */ gimp_tool_polygon_revert_to_saved_state (polygon); - g_signal_emit (polygon, polygon_signals[COMMIT], 0); + gimp_tool_widget_response (widget, + GIMP_TOOL_WIDGET_RESPONSE_CONFIRM); } priv->last_click_time = time; @@ -1199,7 +1174,8 @@ gimp_tool_polygon_button_release (GimpToolWidget *widget, NO_CLICK_TIME_AVAILABLE, coords)) { - g_signal_emit (polygon, polygon_signals[COMMIT], 0); + gimp_tool_widget_response (widget, + GIMP_TOOL_WIDGET_RESPONSE_CONFIRM); } break; @@ -1343,21 +1319,11 @@ gimp_tool_polygon_key_press (GimpToolWidget *widget, gimp_tool_polygon_remove_last_segment (polygon); return TRUE; - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - case GDK_KEY_ISO_Enter: - g_signal_emit (polygon, polygon_signals[COMMIT], 0); - return TRUE; - - case GDK_KEY_Escape: - g_signal_emit (polygon, polygon_signals[CANCEL], 0); - return TRUE; - default: break; } - return FALSE; + return GIMP_TOOL_WIDGET_CLASS (parent_class)->key_press (widget, kevent); } static void diff --git a/app/display/gimptoolpolygon.h b/app/display/gimptoolpolygon.h index e5cb2eb5dd..b94814d28e 100644 --- a/app/display/gimptoolpolygon.h +++ b/app/display/gimptoolpolygon.h @@ -47,9 +47,6 @@ struct _GimpToolPolygon struct _GimpToolPolygonClass { GimpToolWidgetClass parent_class; - - void (* commit) (GimpToolPolygon *polygon); - void (* cancel) (GimpToolPolygon *polygon); }; diff --git a/app/display/gimptoolwidget.c b/app/display/gimptoolwidget.c index 95e137182a..2dfb5c9ebd 100644 --- a/app/display/gimptoolwidget.c +++ b/app/display/gimptoolwidget.c @@ -22,6 +22,7 @@ #include #include +#include #include "display-types.h" @@ -50,6 +51,7 @@ enum enum { CHANGED, + RESPONSE, SNAP_OFFSETS, STATUS, STATUS_COORDS, @@ -71,19 +73,22 @@ struct _GimpToolWidgetPrivate /* local function prototypes */ -static void gimp_tool_widget_finalize (GObject *object); -static void gimp_tool_widget_constructed (GObject *object); -static void gimp_tool_widget_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gimp_tool_widget_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); -static void gimp_tool_widget_properties_changed (GObject *object, - guint n_pspecs, - GParamSpec **pspecs); +static void gimp_tool_widget_finalize (GObject *object); +static void gimp_tool_widget_constructed (GObject *object); +static void gimp_tool_widget_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void gimp_tool_widget_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); +static void gimp_tool_widget_properties_changed (GObject *object, + guint n_pspecs, + GParamSpec **pspecs); + +static gboolean gimp_tool_widget_real_key_press (GimpToolWidget *widget, + GdkEventKey *kevent); G_DEFINE_TYPE (GimpToolWidget, gimp_tool_widget, GIMP_TYPE_OBJECT) @@ -104,6 +109,8 @@ gimp_tool_widget_class_init (GimpToolWidgetClass *klass) object_class->get_property = gimp_tool_widget_get_property; object_class->dispatch_properties_changed = gimp_tool_widget_properties_changed; + klass->key_press = gimp_tool_widget_real_key_press; + widget_signals[CHANGED] = g_signal_new ("changed", G_TYPE_FROM_CLASS (klass), @@ -113,6 +120,16 @@ gimp_tool_widget_class_init (GimpToolWidgetClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + widget_signals[RESPONSE] = + g_signal_new ("response", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpToolWidgetClass, response), + NULL, NULL, + gimp_marshal_VOID__INT, + G_TYPE_NONE, 1, + G_TYPE_INT); + widget_signals[SNAP_OFFSETS] = g_signal_new ("snap-offsets", G_TYPE_FROM_CLASS (klass), @@ -256,6 +273,33 @@ gimp_tool_widget_properties_changed (GObject *object, g_signal_emit (object, widget_signals[CHANGED], 0); } +static gboolean +gimp_tool_widget_real_key_press (GimpToolWidget *widget, + GdkEventKey *kevent) +{ + switch (kevent->keyval) + { + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: + case GDK_KEY_ISO_Enter: + gimp_tool_widget_response (widget, GIMP_TOOL_WIDGET_RESPONSE_CONFIRM); + return TRUE; + + case GDK_KEY_Escape: + gimp_tool_widget_response (widget, GIMP_TOOL_WIDGET_RESPONSE_CANCEL); + return TRUE; + + case GDK_KEY_BackSpace: + gimp_tool_widget_response (widget, GIMP_TOOL_WIDGET_RESPONSE_RESET); + return TRUE; + + default: + break; + } + + return FALSE; +} + /* public functions */ @@ -275,6 +319,16 @@ gimp_tool_widget_get_item (GimpToolWidget *widget) return widget->private->item; } +void +gimp_tool_widget_response (GimpToolWidget *widget, + gint response_id) +{ + g_return_if_fail (GIMP_IS_TOOL_WIDGET (widget)); + + g_signal_emit (widget, widget_signals[RESPONSE], 0, + response_id); +} + void gimp_tool_widget_set_snap_offsets (GimpToolWidget *widget, gint offset_x, diff --git a/app/display/gimptoolwidget.h b/app/display/gimptoolwidget.h index c9caae261f..e2c929bab5 100644 --- a/app/display/gimptoolwidget.h +++ b/app/display/gimptoolwidget.h @@ -25,6 +25,11 @@ #include "core/gimpobject.h" +#define GIMP_TOOL_WIDGET_RESPONSE_CONFIRM -1 +#define GIMP_TOOL_WIDGET_RESPONSE_CANCEL -2 +#define GIMP_TOOL_WIDGET_RESPONSE_RESET -3 + + #define GIMP_TYPE_TOOL_WIDGET (gimp_tool_widget_get_type ()) #define GIMP_TOOL_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_TOOL_WIDGET, GimpToolWidget)) #define GIMP_TOOL_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_TOOL_WIDGET, GimpToolWidgetClass)) @@ -49,6 +54,8 @@ struct _GimpToolWidgetClass /* signals */ void (* changed) (GimpToolWidget *widget); + void (* response) (GimpToolWidget *widget, + gint response_id); void (* snap_offsets) (GimpToolWidget *widget, gint offset_x, gint offset_y, @@ -114,6 +121,9 @@ GimpCanvasItem * gimp_tool_widget_get_item (GimpToolWidget *widget); /* for subclasses, to notify the handling tool */ +void gimp_tool_widget_response (GimpToolWidget *widget, + gint response_id); + void gimp_tool_widget_set_snap_offsets (GimpToolWidget *widget, gint offset_x, gint offset_y, diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c index d7eefb96aa..72a5aa0197 100644 --- a/app/tools/gimpblendtool.c +++ b/app/tools/gimpblendtool.c @@ -128,6 +128,9 @@ static void gimp_blend_tool_commit (GimpBlendTool *blend_ static void gimp_blend_tool_line_changed (GimpToolWidget *widget, GimpBlendTool *blend_tool); +static void gimp_blend_tool_line_response (GimpToolWidget *widget, + gint response_id, + GimpBlendTool *blend_tool); static void gimp_blend_tool_update_status (GimpBlendTool *blend_tool, GdkModifierType state, @@ -370,6 +373,9 @@ gimp_blend_tool_button_press (GimpTool *tool, g_signal_connect (blend_tool->line, "changed", G_CALLBACK (gimp_blend_tool_line_changed), blend_tool); + g_signal_connect (blend_tool->line, "response", + G_CALLBACK (gimp_blend_tool_line_response), + blend_tool); gimp_blend_tool_start (blend_tool, display); } @@ -472,23 +478,11 @@ gimp_blend_tool_key_press (GimpTool *tool, GdkEventKey *kevent, GimpDisplay *display) { - switch (kevent->keyval) + GimpBlendTool *blend_tool = GIMP_BLEND_TOOL (tool); + + if (blend_tool->line && display == tool->display) { - case GDK_KEY_BackSpace: - return TRUE; - - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - case GDK_KEY_ISO_Enter: - gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, display); - /* fall thru */ - - case GDK_KEY_Escape: - gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, display); - return TRUE; - - default: - break; + return gimp_tool_widget_key_press (blend_tool->line, kevent); } return FALSE; @@ -829,6 +823,25 @@ gimp_blend_tool_line_changed (GimpToolWidget *widget, gimp_drawable_filter_apply (blend_tool->filter, NULL); } +static void +gimp_blend_tool_line_response (GimpToolWidget *widget, + gint response_id, + GimpBlendTool *blend_tool) +{ + GimpTool *tool = GIMP_TOOL (blend_tool); + + switch (response_id) + { + case GIMP_TOOL_WIDGET_RESPONSE_CONFIRM: + gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, tool->display); + break; + + case GIMP_TOOL_WIDGET_RESPONSE_CANCEL: + gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, tool->display); + break; + } +} + static void gimp_blend_tool_update_status (GimpBlendTool *blend_tool, GdkModifierType state, diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c index a98db7d1a4..0bb076ea4a 100644 --- a/app/tools/gimpfreeselecttool.c +++ b/app/tools/gimpfreeselecttool.c @@ -107,13 +107,12 @@ static void gimp_free_select_tool_real_select (GimpFreeSelectTool static void gimp_free_select_tool_polygon_changed (GimpToolWidget *polygon, GimpFreeSelectTool *fst); +static void gimp_free_select_tool_polygon_response (GimpToolWidget *polygon, + gint response_id, + GimpFreeSelectTool *fst); static void gimp_free_select_tool_polygon_status (GimpToolWidget *polygon, const gchar *status, GimpFreeSelectTool *fst); -static void gimp_free_select_tool_polygon_commit (GimpToolWidget *polygon, - GimpFreeSelectTool *fst); -static void gimp_free_select_tool_polygon_cancel (GimpToolWidget *polygon, - GimpFreeSelectTool *fst); G_DEFINE_TYPE (GimpFreeSelectTool, gimp_free_select_tool, @@ -344,15 +343,12 @@ gimp_free_select_tool_button_press (GimpTool *tool, g_signal_connect (private->polygon, "changed", G_CALLBACK (gimp_free_select_tool_polygon_changed), fst); + g_signal_connect (private->polygon, "response", + G_CALLBACK (gimp_free_select_tool_polygon_response), + fst); g_signal_connect (private->polygon, "status", G_CALLBACK (gimp_free_select_tool_polygon_status), fst); - g_signal_connect (private->polygon, "commit", - G_CALLBACK (gimp_free_select_tool_polygon_commit), - fst); - g_signal_connect (private->polygon, "cancel", - G_CALLBACK (gimp_free_select_tool_polygon_cancel), - fst); gimp_draw_tool_start (draw_tool, display); @@ -432,7 +428,7 @@ gimp_free_select_tool_key_press (GimpTool *tool, GimpFreeSelectTool *fst = GIMP_FREE_SELECT_TOOL (tool); GimpFreeSelectToolPrivate *priv = fst->private; - if (priv->polygon) + if (priv->polygon && display == tool->display) { return gimp_tool_widget_key_press (priv->polygon, kevent); } @@ -469,7 +465,7 @@ gimp_free_select_tool_active_modifier_key (GimpTool *tool, GimpFreeSelectTool *fst = GIMP_FREE_SELECT_TOOL (tool); GimpFreeSelectToolPrivate *priv = fst->private; - if (priv->polygon && display == tool->display) + if (priv->polygon) { gimp_tool_widget_motion_modifier (priv->polygon, key, press, state); @@ -523,6 +519,25 @@ gimp_free_select_tool_polygon_changed (GimpToolWidget *polygon, { } +static void +gimp_free_select_tool_polygon_response (GimpToolWidget *polygon, + gint response_id, + GimpFreeSelectTool *fst) +{ + GimpTool *tool = GIMP_TOOL (fst); + + switch (response_id) + { + case GIMP_TOOL_WIDGET_RESPONSE_CONFIRM: + gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, tool->display); + break; + + case GIMP_TOOL_WIDGET_RESPONSE_CANCEL: + gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, tool->display); + break; + } +} + static void gimp_free_select_tool_polygon_status (GimpToolWidget *polygon, const gchar *status, @@ -539,22 +554,3 @@ gimp_free_select_tool_polygon_status (GimpToolWidget *polygon, gimp_tool_pop_status (tool, tool->display); } } - -static void -gimp_free_select_tool_polygon_commit (GimpToolWidget *polygon, - GimpFreeSelectTool *fst) -{ - GimpTool *tool = GIMP_TOOL (fst); - - gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, tool->display); -} - -static void -gimp_free_select_tool_polygon_cancel (GimpToolWidget *polygon, - GimpFreeSelectTool *fst) -{ - GimpTool *tool = GIMP_TOOL (fst); - - gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, tool->display); -} - diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c index d5b81a16a1..273341bb24 100644 --- a/app/tools/gimptransformtool.c +++ b/app/tools/gimptransformtool.c @@ -129,6 +129,9 @@ static GeglBuffer * static void gimp_transform_tool_widget_changed (GimpToolWidget *widget, GimpTransformTool *tr_tool); +static void gimp_transform_tool_widget_response (GimpToolWidget *widget, + gint response_id, + GimpTransformTool *tr_tool); static void gimp_transform_tool_widget_snap_offsets (GimpToolWidget *widget, gint offset_x, gint offset_y, @@ -480,27 +483,11 @@ gimp_transform_tool_key_press (GimpTool *tool, GdkEventKey *kevent, GimpDisplay *display) { - GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool); - GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool); + GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tool); - if (display == draw_tool->display) + if (tr_tool->widget && display == tool->display) { - switch (kevent->keyval) - { - case GDK_KEY_Return: - case GDK_KEY_KP_Enter: - case GDK_KEY_ISO_Enter: - gimp_transform_tool_response (NULL, GTK_RESPONSE_OK, tr_tool); - return TRUE; - - case GDK_KEY_BackSpace: - gimp_transform_tool_response (NULL, RESPONSE_RESET, tr_tool); - return TRUE; - - case GDK_KEY_Escape: - gimp_transform_tool_response (NULL, GTK_RESPONSE_CANCEL, tr_tool); - return TRUE; - } + return gimp_tool_widget_key_press (tr_tool->widget, kevent); } return FALSE; @@ -1116,6 +1103,27 @@ gimp_transform_tool_widget_changed (GimpToolWidget *widget, } } +static void +gimp_transform_tool_widget_response (GimpToolWidget *widget, + gint response_id, + GimpTransformTool *tr_tool) +{ + switch (response_id) + { + case GIMP_TOOL_WIDGET_RESPONSE_CONFIRM: + gimp_transform_tool_response (NULL, GTK_RESPONSE_OK, tr_tool); + break; + + case GIMP_TOOL_WIDGET_RESPONSE_CANCEL: + gimp_transform_tool_response (NULL, GTK_RESPONSE_CANCEL, tr_tool); + break; + + case GIMP_TOOL_WIDGET_RESPONSE_RESET: + gimp_transform_tool_response (NULL, RESPONSE_RESET, tr_tool); + break; + } +} + static void gimp_transform_tool_widget_snap_offsets (GimpToolWidget *widget, gint offset_x, @@ -1379,6 +1387,9 @@ gimp_transform_tool_get_widget (GimpTransformTool *tr_tool) g_signal_connect (widget, "changed", G_CALLBACK (gimp_transform_tool_widget_changed), tr_tool); + g_signal_connect (widget, "response", + G_CALLBACK (gimp_transform_tool_widget_response), + tr_tool); g_signal_connect (widget, "snap-offsets", G_CALLBACK (gimp_transform_tool_widget_snap_offsets), tr_tool);