From c456ba93ba1b004fd9ad55c1824facad1ae18d7e Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 26 Jun 1999 11:16:47 +0000 Subject: [PATCH] app/[all tool related files] app/commands.c app/disp_callbacks.c 1999-06-26 Michael Natterer * app/[all tool related files] * app/commands.c * app/disp_callbacks.c * app/gdisplay.c * app/gimage.c * app/interface.c: hopefully fixed the bugs that appeared with my last fix. And some more changes... - Slightly changed the conditions which cause the tools to be re-initialized on button_press events and the global initialisation functions. - The dialog tools now explicitly set tool->gdisp_ptr so they can be properly hidden on display deletion. - Create the crop info dialog only once and avoid ugly redraw bugs by blocking the sizeentries' signal when initializing them. - Standardized the tools_new_() functions. They are scheduled to be moved to a common constructor in tools.c - Various stuff... --- ChangeLog | 28 +++- app/actions/help-commands.c | 16 ++- app/airbrush.c | 6 +- app/base/color-balance.c | 58 ++++---- app/base/curves.c | 24 +++- app/base/hue-saturation.c | 17 ++- app/base/threshold.c | 22 ++- app/bezier_select.c | 30 ++-- app/blend.c | 7 +- app/brightness_contrast.c | 19 ++- app/bucket_fill.c | 7 +- app/by_color_select.c | 7 +- app/color_balance.c | 58 ++++---- app/color_picker.c | 7 +- app/commands.c | 16 ++- app/core/gimpdrawable-blend.c | 7 +- app/core/gimpprojection.c | 8 ++ app/crop.c | 171 ++++++++++------------- app/curves.c | 24 +++- app/disp_callbacks.c | 27 ++-- app/display/gimpdisplay-callbacks.c | 27 ++-- app/display/gimpdisplay.c | 8 ++ app/display/gimpdisplayshell-callbacks.c | 27 ++-- app/display/gimpdisplayshell-draw.c | 14 +- app/display/gimpdisplayshell.c | 14 +- app/draw_core.c | 29 ++-- app/ellipse_select.c | 5 +- app/flip_tool.c | 4 +- app/free_select.c | 5 +- app/fuzzy_select.c | 15 +- app/gdisplay.c | 8 ++ app/gimage.c | 22 +-- app/gui/commands.c | 16 ++- app/gui/help-commands.c | 16 ++- app/histogram_tool.c | 31 ++-- app/hue_saturation.c | 17 ++- app/ink.c | 3 + app/interface.c | 14 +- app/iscissors.c | 7 +- app/levels.c | 16 ++- app/magnify.c | 4 + app/move.c | 13 +- app/paint/gimpairbrush.c | 6 +- app/paint/gimpink.c | 3 + app/paint_core.c | 3 + app/posterize.c | 24 +++- app/rect_select.c | 21 +-- app/rotate_tool.c | 30 ++-- app/text_tool.c | 6 +- app/threshold.c | 22 ++- app/tools.c | 42 ++---- app/tools/airbrush.c | 6 +- app/tools/bezier_select.c | 30 ++-- app/tools/blend.c | 7 +- app/tools/brightness_contrast.c | 19 ++- app/tools/bucket_fill.c | 7 +- app/tools/by_color_select.c | 7 +- app/tools/color_balance.c | 58 ++++---- app/tools/color_picker.c | 7 +- app/tools/crop.c | 171 ++++++++++------------- app/tools/curves.c | 24 +++- app/tools/ellipse_select.c | 5 +- app/tools/flip_tool.c | 4 +- app/tools/free_select.c | 5 +- app/tools/fuzzy_select.c | 15 +- app/tools/gimpairbrushtool.c | 6 +- app/tools/gimpblendtool.c | 7 +- app/tools/gimpbrightnesscontrasttool.c | 19 ++- app/tools/gimpbucketfilltool.c | 7 +- app/tools/gimpbycolorselecttool.c | 7 +- app/tools/gimpcolorbalancetool.c | 58 ++++---- app/tools/gimpcroptool.c | 171 ++++++++++------------- app/tools/gimpcurvestool.c | 24 +++- app/tools/gimpellipseselecttool.c | 5 +- app/tools/gimpfliptool.c | 4 +- app/tools/gimpfreeselecttool.c | 5 +- app/tools/gimpfuzzyselecttool.c | 15 +- app/tools/gimphistogramtool.c | 31 ++-- app/tools/gimphuesaturationtool.c | 17 ++- app/tools/gimpinktool.c | 3 + app/tools/gimpiscissorstool.c | 7 +- app/tools/gimplevelstool.c | 16 ++- app/tools/gimpmagnifytool.c | 4 + app/tools/gimpmovetool.c | 13 +- app/tools/gimpposterizetool.c | 24 +++- app/tools/gimprectselecttool.c | 21 +-- app/tools/gimpregionselecttool.c | 15 +- app/tools/gimprotatetool.c | 30 ++-- app/tools/gimptexttool.c | 6 +- app/tools/gimpthresholdtool.c | 22 ++- app/tools/histogram_tool.c | 31 ++-- app/tools/hue_saturation.c | 17 ++- app/tools/ink.c | 3 + app/tools/iscissors.c | 7 +- app/tools/levels.c | 16 ++- app/tools/magnify.c | 4 + app/tools/move.c | 13 +- app/tools/paint_core.c | 3 + app/tools/posterize.c | 24 +++- app/tools/rect_select.c | 21 +-- app/tools/rotate_tool.c | 30 ++-- app/tools/text_tool.c | 6 +- app/tools/threshold.c | 22 ++- app/tools/tools.c | 42 ++---- app/tools/transform_core.c | 43 +++--- app/tools/transform_tool.c | 10 +- app/transform_core.c | 43 +++--- app/transform_tool.c | 10 +- 108 files changed, 1361 insertions(+), 917 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c7b17a864..fbce57b32b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,25 @@ -1999-06-26 Sven Neumann +1999-06-26 Michael Natterer + + * app/[all tool related files] + * app/commands.c + * app/disp_callbacks.c + * app/gdisplay.c + * app/gimage.c + * app/interface.c: hopefully fixed the bugs that appeared with my + last fix. And some more changes... + + - Slightly changed the conditions which cause the tools to be + re-initialized on button_press events and the global + initialisation functions. + - The dialog tools now explicitly set tool->gdisp_ptr so they can + be properly hidden on display deletion. + - Create the crop info dialog only once and avoid ugly redraw bugs + by blocking the sizeentries' signal when initializing them. + - Standardized the tools_new_() functions. They are + scheduled to be moved to a common constructor in tools.c + - Various stuff... + +1999-06-26 Sven Neumann Michael Natterer * app/app_procs.c @@ -12,8 +33,9 @@ Fri Jun 25 22:09:04 BST 1999 Andy Thomas dialog and then the busy cursors stuff tried to change the cursor on a dialog that has been removed. (ie the LCP dialog should be unregistered when it is destroyed) - - Small previews in LCP dialog image menu do not get created when no preview preference is set. + + Small previews in LCP dialog image menu do not get created when + no preview preference is set. Thu Jun 24 18:13:35 PDT 1999 Manish Singh diff --git a/app/actions/help-commands.c b/app/actions/help-commands.c index 1d4ccb5db5..d075d7ba9f 100644 --- a/app/actions/help-commands.c +++ b/app/actions/help-commands.c @@ -976,20 +976,30 @@ tools_select_cmd_callback (GtkWidget *widget, GDisplay * gdisp; gdisp = gdisplay_active (); - /* Activate the approriate widget. + /* Activate the appropriate widget. * Implicitly calls tools_select() */ gtk_widget_activate (tool_info[callback_action].tool_widget); + /* Paranoia */ + active_tool->drawable = NULL; + /* Complete the initialisation by doing the same stuff * tools_initialize() does after it did what tools_select() does */ - if (tool_info[callback_action].init_func && gdisp) + if (tool_info[callback_action].init_func) { (* tool_info[callback_action].init_func) (gdisp); - active_tool->gdisp_ptr = gdisp; + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } + + /* setting the gdisp_ptr here is a HACK to allow the tools' + * dialog windows being hidden if the tool was selected from + * a tear-off-menu and there was no mouse click in the display + * before deleting it + */ + active_tool->gdisp_ptr = gdisp; } void diff --git a/app/airbrush.c b/app/airbrush.c index 10277fbb27..743522aea0 100644 --- a/app/airbrush.c +++ b/app/airbrush.c @@ -34,10 +34,10 @@ #include "libgimp/gimpintl.h" /* The maximum amount of pressure that can be exerted */ -#define MAX_PRESSURE 0.075 +#define MAX_PRESSURE 0.075 -#define OFF 0 -#define ON 1 +#define OFF 0 +#define ON 1 /* the airbrush structures */ diff --git a/app/base/color-balance.c b/app/base/color-balance.c index 6b809c903a..a13ac248eb 100644 --- a/app/base/color-balance.c +++ b/app/base/color-balance.c @@ -157,6 +157,8 @@ color_balance_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -204,13 +206,7 @@ color_balance_control (Tool *tool, case HALT: if (color_balance_dialog) - { - active_tool->preserve = TRUE; - image_map_abort (color_balance_dialog->image_map); - active_tool->preserve = FALSE; - color_balance_dialog->image_map = NULL; - color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); - } + color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); break; default: @@ -237,18 +233,20 @@ tools_new_color_balance () tool->type = COLOR_BALANCE; tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ - tool->private = (void *) private; tool->auto_snap_to = TRUE; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_balance_button_press; tool->button_release_func = color_balance_button_release; tool->motion_func = color_balance_motion; - tool->arrow_keys_func = standard_arrow_keys_func; tool->modifier_key_func = standard_modifier_key_func; + tool->arrow_keys_func = standard_arrow_keys_func; + tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_balance_cursor_update; tool->control_func = color_balance_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -294,22 +292,18 @@ color_balance_initialize (GDisplay *gdisp) color_balance_dialog->yellow_blue[i] = 0.0; } color_balance_dialog->drawable = gimage_active_drawable (gdisp->gimage); - color_balance_dialog->image_map = image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_dialog->image_map = + image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_update (color_balance_dialog, ALL); } -/****************************/ -/* Select by Color dialog */ -/****************************/ +/**************************/ +/* Color Balance dialog */ +/**************************/ /* the action area structure */ -static ActionAreaItem action_items[] = -{ - { N_("OK"), color_balance_ok_callback, NULL, NULL }, - { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } -}; - static ColorBalanceDialog * color_balance_new_dialog () { @@ -326,13 +320,21 @@ color_balance_new_dialog () GtkObject *data; GSList *group = NULL; int i; - char *appl_mode_names[3] = + + static ActionAreaItem action_items[] = + { + { N_("OK"), color_balance_ok_callback, NULL, NULL }, + { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } + }; + + char *appl_mode_names[] = { N_("Shadows"), N_("Midtones"), N_("Highlights") }; - ActionCallback appl_mode_callbacks[3] = + + ActionCallback appl_mode_callbacks[] = { color_balance_shadows_callback, color_balance_midtones_callback, @@ -657,6 +659,9 @@ color_balance_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cbd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -684,10 +689,13 @@ color_balance_cancel_callback (GtkWidget *widget, active_tool->preserve = TRUE; image_map_abort (cbd->image_map); active_tool->preserve = FALSE; + gdisplays_flush (); + cbd->image_map = NULL; } - cbd->image_map = NULL; + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/base/curves.c b/app/base/curves.c index 47385953b9..2c2453aff8 100644 --- a/app/base/curves.c +++ b/app/base/curves.c @@ -177,12 +177,17 @@ curves_button_press (Tool *tool, gdisp = gdisp_ptr; drawable = gimage_active_drawable (gdisp->gimage); + tool->gdisp_ptr = gdisp; + if (drawable != tool->drawable) { active_tool->preserve = TRUE; image_map_abort (curves_dialog->image_map); active_tool->preserve = FALSE; - curves_dialog->drawable = tool->drawable = drawable; + + tool->drawable = drawable; + + curves_dialog->drawable = drawable; curves_dialog->color = drawable_color (drawable); curves_dialog->image_map = image_map_create (gdisp, drawable); } @@ -380,6 +385,10 @@ tools_new_curves () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = curves_button_press; tool->button_release_func = curves_button_release; tool->motion_func = curves_motion; @@ -388,8 +397,6 @@ tools_new_curves () tool->cursor_update_func = curves_cursor_update; tool->control_func = curves_control; - tool->preserve = FALSE; - return tool; } @@ -471,12 +478,11 @@ curves_initialize (GDisplay *gdisp) gtk_widget_set_sensitive( channel_items[i].widget, FALSE); /* set the current selection */ - gtk_option_menu_set_history ( GTK_OPTION_MENU (curves_dialog->channel_menu), 0); + gtk_option_menu_set_history (GTK_OPTION_MENU (curves_dialog->channel_menu), 0); if (!GTK_WIDGET_VISIBLE (curves_dialog->shell)) gtk_widget_show (curves_dialog->shell); - curves_update (curves_dialog, GRAPH | DRAW); } @@ -1174,6 +1180,9 @@ curves_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -1192,9 +1201,12 @@ curves_cancel_callback (GtkWidget *widget, image_map_abort (cd->image_map); active_tool->preserve = FALSE; - cd->image_map = NULL; gdisplays_flush (); + cd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint diff --git a/app/base/hue-saturation.c b/app/base/hue-saturation.c index 16e1f8b615..1bf696479a 100644 --- a/app/base/hue-saturation.c +++ b/app/base/hue-saturation.c @@ -237,6 +237,8 @@ hue_saturation_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -310,6 +312,10 @@ tools_new_hue_saturation () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = hue_saturation_button_press; tool->button_release_func = hue_saturation_button_release; tool->motion_func = hue_saturation_motion; @@ -317,9 +323,6 @@ tools_new_hue_saturation () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = hue_saturation_cursor_update; tool->control_func = hue_saturation_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -744,6 +747,9 @@ hue_saturation_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; hsd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -772,9 +778,12 @@ hue_saturation_cancel_callback (GtkWidget *widget, image_map_abort (hsd->image_map); active_tool->preserve = FALSE; - hsd->image_map = NULL; gdisplays_flush (); + hsd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/base/threshold.c b/app/base/threshold.c index 3c336786fb..071cb04275 100644 --- a/app/base/threshold.c +++ b/app/base/threshold.c @@ -166,6 +166,8 @@ threshold_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -246,6 +248,10 @@ tools_new_threshold () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = threshold_button_press; tool->button_release_func = threshold_button_release; tool->motion_func = threshold_motion; @@ -254,8 +260,6 @@ tools_new_threshold () tool->cursor_update_func = threshold_cursor_update; tool->control_func = threshold_control; - tool->preserve = FALSE; - return tool; } @@ -291,16 +295,18 @@ threshold_initialize (GDisplay *gdisp) threshold_dialog->drawable = gimage_active_drawable (gdisp->gimage); threshold_dialog->color = drawable_color (threshold_dialog->drawable); - threshold_dialog->image_map = image_map_create (gdisp, threshold_dialog->drawable); + threshold_dialog->image_map = + image_map_create (gdisp, threshold_dialog->drawable); - gimp_histogram_calculate_drawable(threshold_dialog->hist, - threshold_dialog->drawable); + gimp_histogram_calculate_drawable (threshold_dialog->hist, + threshold_dialog->drawable); histogram_widget_update (threshold_dialog->histogram, threshold_dialog->hist); histogram_widget_range (threshold_dialog->histogram, threshold_dialog->low_threshold, threshold_dialog->high_threshold); + if (threshold_dialog->preview) threshold_preview (threshold_dialog); } @@ -453,6 +459,9 @@ threshold_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; td->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -484,6 +493,9 @@ threshold_cancel_callback (GtkWidget *widget, td->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/bezier_select.c b/app/bezier_select.c index 26fc4f2571..402958b0eb 100644 --- a/app/bezier_select.c +++ b/app/bezier_select.c @@ -202,7 +202,7 @@ Tool* tools_new_bezier_select () { Tool * tool; - BezierSelect * bezier_sel; + BezierSelect * private; /* The tool options */ if (! bezier_options) @@ -213,19 +213,23 @@ tools_new_bezier_select () } tool = g_malloc (sizeof (Tool)); + private = g_malloc (sizeof (BezierSelect)); - bezier_sel = g_new0(BezierSelect,1); - - bezier_sel->num_points = 0; - bezier_sel->mask = NULL; - bezier_sel->core = draw_core_new (bezier_select_draw); - bezier_select_reset (bezier_sel); + private->num_points = 0; + private->mask = NULL; + private->core = draw_core_new (bezier_select_draw); + bezier_select_reset (private); tool->type = BEZIER_SELECT; tool->state = INACTIVE; tool->scroll_lock = 1; /* Do not allow scrolling */ tool->auto_snap_to = TRUE; - tool->private = (void *) bezier_sel; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = bezier_select_button_press; tool->button_release_func = bezier_select_button_release; tool->motion_func = bezier_select_motion; @@ -233,13 +237,12 @@ tools_new_bezier_select () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = bezier_select_cursor_update; tool->control_func = bezier_select_control; - tool->preserve = FALSE; - curCore = bezier_sel->core; - curSel = bezier_sel; + curCore = private->core; + curSel = private; curTool = tool; - paths_new_bezier_select_tool(); + paths_new_bezier_select_tool (); return tool; } @@ -834,6 +837,9 @@ bezier_select_button_press (Tool *tool, int halfwidth, dummy; gdisp = (GDisplay *) gdisp_ptr; + + tool->drawable = gimage_active_drawable (gdisp->gimage); + bezier_sel = tool->private; grab_pointer = 0; diff --git a/app/blend.c b/app/blend.c index 30f4fc25d7..f34e0e0cbd 100644 --- a/app/blend.c +++ b/app/blend.c @@ -1741,7 +1741,11 @@ tools_new_blend () tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = blend_button_press; tool->button_release_func = blend_button_release; @@ -1750,7 +1754,6 @@ tools_new_blend () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = blend_cursor_update; tool->control_func = blend_control; - tool->preserve = TRUE; return tool; } diff --git a/app/brightness_contrast.c b/app/brightness_contrast.c index 08213db478..2a79ad95c5 100644 --- a/app/brightness_contrast.c +++ b/app/brightness_contrast.c @@ -112,6 +112,8 @@ brightness_contrast_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -186,6 +188,10 @@ tools_new_brightness_contrast () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = brightness_contrast_button_press; tool->button_release_func = brightness_contrast_button_release; tool->motion_func = brightness_contrast_motion; @@ -193,9 +199,6 @@ tools_new_brightness_contrast () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = brightness_contrast_cursor_update; tool->control_func = brightness_contrast_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -236,8 +239,8 @@ brightness_contrast_initialize (GDisplay *gdisp) brightness_contrast_dialog->contrast = 0.0; brightness_contrast_dialog->drawable = gimage_active_drawable (gdisp->gimage); - brightness_contrast_dialog->image_map = image_map_create (gdisp, - brightness_contrast_dialog->drawable); + brightness_contrast_dialog->image_map = + image_map_create (gdisp, brightness_contrast_dialog->drawable); brightness_contrast_update (brightness_contrast_dialog, ALL); } @@ -454,6 +457,9 @@ brightness_contrast_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; bcd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -485,6 +491,9 @@ brightness_contrast_cancel_callback (GtkWidget *widget, bcd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/bucket_fill.c b/app/bucket_fill.c index eb67ceecd1..0868d90473 100644 --- a/app/bucket_fill.c +++ b/app/bucket_fill.c @@ -611,7 +611,11 @@ tools_new_bucket_fill (void) tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = bucket_fill_button_press; tool->button_release_func = bucket_fill_button_release; @@ -620,7 +624,6 @@ tools_new_bucket_fill (void) tool->modifier_key_func = bucket_fill_modifier_key_func; tool->cursor_update_func = bucket_fill_cursor_update; tool->control_func = bucket_fill_control; - tool->preserve = TRUE; return tool; } diff --git a/app/by_color_select.c b/app/by_color_select.c index 70ba457a47..9e13e9460b 100644 --- a/app/by_color_select.c +++ b/app/by_color_select.c @@ -483,6 +483,10 @@ tools_new_by_color_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = by_color_select_button_press; tool->button_release_func = by_color_select_button_release; tool->motion_func = by_color_select_motion; @@ -490,9 +494,6 @@ tools_new_by_color_select () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = by_color_select_cursor_update; tool->control_func = by_color_select_control; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - tool->preserve = TRUE; return tool; } diff --git a/app/color_balance.c b/app/color_balance.c index 6b809c903a..a13ac248eb 100644 --- a/app/color_balance.c +++ b/app/color_balance.c @@ -157,6 +157,8 @@ color_balance_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -204,13 +206,7 @@ color_balance_control (Tool *tool, case HALT: if (color_balance_dialog) - { - active_tool->preserve = TRUE; - image_map_abort (color_balance_dialog->image_map); - active_tool->preserve = FALSE; - color_balance_dialog->image_map = NULL; - color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); - } + color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); break; default: @@ -237,18 +233,20 @@ tools_new_color_balance () tool->type = COLOR_BALANCE; tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ - tool->private = (void *) private; tool->auto_snap_to = TRUE; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_balance_button_press; tool->button_release_func = color_balance_button_release; tool->motion_func = color_balance_motion; - tool->arrow_keys_func = standard_arrow_keys_func; tool->modifier_key_func = standard_modifier_key_func; + tool->arrow_keys_func = standard_arrow_keys_func; + tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_balance_cursor_update; tool->control_func = color_balance_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -294,22 +292,18 @@ color_balance_initialize (GDisplay *gdisp) color_balance_dialog->yellow_blue[i] = 0.0; } color_balance_dialog->drawable = gimage_active_drawable (gdisp->gimage); - color_balance_dialog->image_map = image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_dialog->image_map = + image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_update (color_balance_dialog, ALL); } -/****************************/ -/* Select by Color dialog */ -/****************************/ +/**************************/ +/* Color Balance dialog */ +/**************************/ /* the action area structure */ -static ActionAreaItem action_items[] = -{ - { N_("OK"), color_balance_ok_callback, NULL, NULL }, - { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } -}; - static ColorBalanceDialog * color_balance_new_dialog () { @@ -326,13 +320,21 @@ color_balance_new_dialog () GtkObject *data; GSList *group = NULL; int i; - char *appl_mode_names[3] = + + static ActionAreaItem action_items[] = + { + { N_("OK"), color_balance_ok_callback, NULL, NULL }, + { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } + }; + + char *appl_mode_names[] = { N_("Shadows"), N_("Midtones"), N_("Highlights") }; - ActionCallback appl_mode_callbacks[3] = + + ActionCallback appl_mode_callbacks[] = { color_balance_shadows_callback, color_balance_midtones_callback, @@ -657,6 +659,9 @@ color_balance_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cbd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -684,10 +689,13 @@ color_balance_cancel_callback (GtkWidget *widget, active_tool->preserve = TRUE; image_map_abort (cbd->image_map); active_tool->preserve = FALSE; + gdisplays_flush (); + cbd->image_map = NULL; } - cbd->image_map = NULL; + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/color_picker.c b/app/color_picker.c index 95fa53d4ff..2daffbf061 100644 --- a/app/color_picker.c +++ b/app/color_picker.c @@ -625,7 +625,11 @@ tools_new_color_picker () tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_picker_button_press; tool->button_release_func = color_picker_button_release; @@ -634,7 +638,6 @@ tools_new_color_picker () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_picker_cursor_update; tool->control_func = color_picker_control; - tool->preserve = TRUE; return tool; } diff --git a/app/commands.c b/app/commands.c index 1d4ccb5db5..d075d7ba9f 100644 --- a/app/commands.c +++ b/app/commands.c @@ -976,20 +976,30 @@ tools_select_cmd_callback (GtkWidget *widget, GDisplay * gdisp; gdisp = gdisplay_active (); - /* Activate the approriate widget. + /* Activate the appropriate widget. * Implicitly calls tools_select() */ gtk_widget_activate (tool_info[callback_action].tool_widget); + /* Paranoia */ + active_tool->drawable = NULL; + /* Complete the initialisation by doing the same stuff * tools_initialize() does after it did what tools_select() does */ - if (tool_info[callback_action].init_func && gdisp) + if (tool_info[callback_action].init_func) { (* tool_info[callback_action].init_func) (gdisp); - active_tool->gdisp_ptr = gdisp; + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } + + /* setting the gdisp_ptr here is a HACK to allow the tools' + * dialog windows being hidden if the tool was selected from + * a tear-off-menu and there was no mouse click in the display + * before deleting it + */ + active_tool->gdisp_ptr = gdisp; } void diff --git a/app/core/gimpdrawable-blend.c b/app/core/gimpdrawable-blend.c index 30f4fc25d7..f34e0e0cbd 100644 --- a/app/core/gimpdrawable-blend.c +++ b/app/core/gimpdrawable-blend.c @@ -1741,7 +1741,11 @@ tools_new_blend () tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = blend_button_press; tool->button_release_func = blend_button_release; @@ -1750,7 +1754,6 @@ tools_new_blend () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = blend_cursor_update; tool->control_func = blend_control; - tool->preserve = TRUE; return tool; } diff --git a/app/core/gimpprojection.c b/app/core/gimpprojection.c index 791c94a2ff..ebe6df5da3 100644 --- a/app/core/gimpprojection.c +++ b/app/core/gimpprojection.c @@ -1731,6 +1731,14 @@ gdisplay_expose_full (GDisplay *gdisp) GDisplay * gdisplay_active () { + GdkEvent *event; + + event = gtk_get_current_event (); + if (event != NULL) + { + gdk_event_free (event); + } + return gimp_context_get_display (gimp_context_get_user ()); } diff --git a/app/crop.c b/app/crop.c index 1e97b807a2..80d10f8bfe 100644 --- a/app/crop.c +++ b/app/crop.c @@ -113,7 +113,7 @@ static void crop_control (Tool *, ToolAction, gpointer); static void crop_arrow_keys_func (Tool *, GdkEventKey *, gpointer); static void crop_modifier_key_func (Tool *, GdkEventKey *, gpointer); -/* Crop helper functions */ +/* Crop helper functions */ static void crop_recalc (Tool *, Crop *); static void crop_start (Tool *, Crop *); static void crop_adjust_guides (GImage *, int, int, int, int); @@ -132,18 +132,18 @@ typedef enum { AUTO_CROP_COLOR = 2 } AutoCropType; -typedef guchar * (*GetColorFunc) (GtkObject *, int, int); -typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); +typedef guchar * (*GetColorFunc) (GtkObject *, int, int); +typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); -static void crop_selection_callback (GtkWidget *, gpointer); -static void crop_automatic_callback (GtkWidget *, gpointer); +static void crop_selection_callback (GtkWidget *, gpointer); +static void crop_automatic_callback (GtkWidget *, gpointer); static AutoCropType crop_guess_bgcolor (GtkObject *, GetColorFunc, int, int, int, int, guchar *); -static int crop_colors_equal (guchar *, guchar *, int); -static int crop_colors_alpha (guchar *, guchar *, int); +static int crop_colors_equal (guchar *, guchar *, int); +static int crop_colors_alpha (guchar *, guchar *, int); /* Crop dialog callback funtions */ -static void crop_orig_changed (GtkWidget *, gpointer); -static void crop_size_changed (GtkWidget *, gpointer); +static void crop_orig_changed (GtkWidget *, gpointer); +static void crop_size_changed (GtkWidget *, gpointer); /* Functions */ @@ -168,7 +168,7 @@ crop_options_new (void) GtkWidget *frame; gchar* type_label[2] = { N_("Crop"), N_("Resize") }; gint type_value[2] = { CROP_CROP, RESIZE_CROP }; - + /* the new crop tool options structure */ options = (CropOptions *) g_malloc (sizeof (CropOptions)); tool_options_init ((ToolOptions *) options, @@ -205,7 +205,7 @@ crop_options_new (void) gtk_widget_show (options->allow_enlarge_w); /* tool toggle */ - frame = tool_options_radio_buttons_new (N_("Tool Toggle"), + frame = tool_options_radio_buttons_new (_("Tool Toggle"), &options->type, options->type_w, type_label, @@ -218,7 +218,6 @@ crop_options_new (void) return options; } - static void crop_button_press (Tool *tool, GdkEventButton *bevent, @@ -230,10 +229,11 @@ crop_button_press (Tool *tool, gdisp = (GDisplay *) gdisp_ptr; crop = (Crop *) tool->private; - if (tool->state == INACTIVE) - crop->function = CREATING; - else if (gdisp_ptr != tool->gdisp_ptr) - crop->function = CREATING; + if (tool->state == INACTIVE || + gdisp_ptr != tool->gdisp_ptr) + { + crop->function = CREATING; + } else { /* If the cursor is in either the upper left or lower right boxes, @@ -268,6 +268,7 @@ crop_button_press (Tool *tool, draw_core_stop (crop->core, tool); tool->gdisp_ptr = gdisp_ptr; + tool->drawable = gimage_active_drawable (gdisp->gimage); gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &crop->tx1, &crop->ty1, TRUE, FALSE); @@ -283,7 +284,8 @@ crop_button_press (Tool *tool, crop->lasty = crop->starty; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -317,9 +319,7 @@ crop_button_release (Tool *tool, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } else crop_info_update (tool); @@ -671,18 +671,17 @@ crop_control (Tool *tool, switch (action) { - case PAUSE : + case PAUSE: draw_core_pause (crop->core, tool); break; - case RESUME : + case RESUME: crop_recalc (tool, crop); draw_core_resume (crop->core, tool); break; - case HALT : - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); + case HALT: + crop_close_callback (NULL, NULL); break; default: @@ -696,12 +695,12 @@ crop_draw (Tool *tool) Crop * crop; GDisplay * gdisp; -#define SRW 10 -#define SRH 10 - gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; +#define SRW 10 +#define SRH 10 + gdk_draw_line (crop->core->win, crop->core->gc, crop->x1, crop->y1, gdisp->disp_width, crop->y1); gdk_draw_line (crop->core->win, crop->core->gc, @@ -723,6 +722,9 @@ crop_draw (Tool *tool) gdk_draw_rectangle (crop->core->win, crop->core->gc, 1, crop->x1, crop->y2-crop->srh, crop->srw, crop->srh); +#undef SRW +#undef SRH + crop_info_update (tool); } @@ -752,6 +754,10 @@ tools_new_crop () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; /* XXX Check me */ + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = crop_button_press; tool->button_release_func = crop_button_release; tool->motion_func = crop_motion; @@ -759,7 +765,6 @@ tools_new_crop () tool->modifier_key_func = crop_modifier_key_func; tool->cursor_update_func = crop_cursor_update; tool->control_func = crop_control; - tool->preserve = TRUE; /* XXX Check me */ return tool; } @@ -777,10 +782,7 @@ tools_free_crop (Tool *tool) draw_core_free (crop->core); if (crop_info) - { - info_dialog_popdown (crop_info); - crop_info = NULL; - } + crop_close_callback (NULL, NULL); g_free (crop); } @@ -957,6 +959,9 @@ crop_start (Tool *tool, if (! crop_info) crop_info_create (tool); + gtk_signal_handler_block_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + gtk_signal_handler_block_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, gdisp->gimage->xresolution, FALSE); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, @@ -993,6 +998,9 @@ crop_start (Tool *tool, } } + gtk_signal_handler_unblock_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gtk_signal_handler_unblock_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + old_gdisp = gdisp; /* initialize the statusbar display */ @@ -1005,16 +1013,9 @@ crop_start (Tool *tool, } -/*******************************************************/ -/* Crop dialog functions */ -/*******************************************************/ - -static ActionAreaItem action_items[3] = -{ - { N_("Crop"), crop_crop_callback, NULL, NULL }, - { N_("Resize"), crop_resize_callback, NULL, NULL }, - { N_("Close"), crop_close_callback, NULL, NULL }, -}; +/***************************/ +/* Crop dialog functions */ +/***************************/ static void crop_info_create (Tool *tool) @@ -1024,6 +1025,13 @@ crop_info_create (Tool *tool) GtkWidget *bbox; GtkWidget *button; + static ActionAreaItem action_items[] = + { + { N_("Crop"), crop_crop_callback, NULL, NULL }, + { N_("Resize"), crop_resize_callback, NULL, NULL }, + { N_("Close"), crop_close_callback, NULL, NULL }, + }; + gdisp = (GDisplay *) tool->gdisp_ptr; /* create the info dialog */ @@ -1037,30 +1045,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_orig_changed, tool); + crop_orig_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (origin_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - orig_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - orig_vals[1]); - spinbutton = info_dialog_add_spinbutton (crop_info, _("Width:"), NULL, -1, 1, 1, 10, 1, 1, 2, NULL, NULL); size_sizeentry = @@ -1068,28 +1061,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_size_changed, tool); + crop_size_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (size_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 0, size_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 1, size_vals[1]); - gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 0, 0); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 1, 6); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 2, 0); @@ -1151,9 +1131,7 @@ crop_crop_callback (GtkWidget *w, crop_options->layer_only, TRUE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } static void @@ -1171,8 +1149,26 @@ crop_resize_callback (GtkWidget *w, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); + crop_close_callback (NULL, NULL); +} + +static void +crop_close_callback (GtkWidget *w, + gpointer client_data) +{ + Tool * tool; + Crop * crop; + + tool = active_tool; + crop = (Crop *) tool->private; + + if (tool->state == ACTIVE) + draw_core_stop (crop->core, tool); + info_dialog_popdown (crop_info); + + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->state = INACTIVE; } @@ -1442,19 +1438,6 @@ crop_colors_alpha (guchar *dummy, return FALSE; } -static void -crop_close_callback (GtkWidget *w, - gpointer client_data) -{ - Tool * tool; - - tool = active_tool; - - draw_core_stop (((Crop *) tool->private)->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; -} - static void crop_orig_changed (GtkWidget *w, gpointer data) @@ -1465,9 +1448,9 @@ crop_orig_changed (GtkWidget *w, int ox; int oy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; @@ -1498,9 +1481,9 @@ crop_size_changed (GtkWidget *w, int sx; int sy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; diff --git a/app/curves.c b/app/curves.c index 47385953b9..2c2453aff8 100644 --- a/app/curves.c +++ b/app/curves.c @@ -177,12 +177,17 @@ curves_button_press (Tool *tool, gdisp = gdisp_ptr; drawable = gimage_active_drawable (gdisp->gimage); + tool->gdisp_ptr = gdisp; + if (drawable != tool->drawable) { active_tool->preserve = TRUE; image_map_abort (curves_dialog->image_map); active_tool->preserve = FALSE; - curves_dialog->drawable = tool->drawable = drawable; + + tool->drawable = drawable; + + curves_dialog->drawable = drawable; curves_dialog->color = drawable_color (drawable); curves_dialog->image_map = image_map_create (gdisp, drawable); } @@ -380,6 +385,10 @@ tools_new_curves () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = curves_button_press; tool->button_release_func = curves_button_release; tool->motion_func = curves_motion; @@ -388,8 +397,6 @@ tools_new_curves () tool->cursor_update_func = curves_cursor_update; tool->control_func = curves_control; - tool->preserve = FALSE; - return tool; } @@ -471,12 +478,11 @@ curves_initialize (GDisplay *gdisp) gtk_widget_set_sensitive( channel_items[i].widget, FALSE); /* set the current selection */ - gtk_option_menu_set_history ( GTK_OPTION_MENU (curves_dialog->channel_menu), 0); + gtk_option_menu_set_history (GTK_OPTION_MENU (curves_dialog->channel_menu), 0); if (!GTK_WIDGET_VISIBLE (curves_dialog->shell)) gtk_widget_show (curves_dialog->shell); - curves_update (curves_dialog, GRAPH | DRAW); } @@ -1174,6 +1180,9 @@ curves_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -1192,9 +1201,12 @@ curves_cancel_callback (GtkWidget *widget, image_map_abort (cd->image_map); active_tool->preserve = FALSE; - cd->image_map = NULL; gdisplays_flush (); + cd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c index 9b3510fd33..f77f4c446c 100644 --- a/app/disp_callbacks.c +++ b/app/disp_callbacks.c @@ -202,6 +202,7 @@ gdisplay_canvas_events (GtkWidget *canvas, case GDK_LEAVE_NOTIFY: gdisplay_update_cursor (gdisp, 0, 0); gtk_label_set_text (GTK_LABEL (gdisp->cursor_label), ""); + case GDK_PROXIMITY_OUT: gdisp->proximity = FALSE; break; @@ -245,23 +246,26 @@ gdisplay_canvas_events (GtkWidget *canvas, update_cursor = TRUE; } - /* reset the current tool if ... */ + /* reset the current tool if ... */ + if ((/* it has no drawable */ + ! active_tool->drawable || - if (/* it has no display */ - ! active_tool->gdisp_ptr || + /* or a drawable different from the current one */ + (gimage_active_drawable (gdisp->gimage) != + active_tool->drawable)) && - /* or no drawable */ - ! active_tool->drawable || - - /* or a drawable different from it's current one... */ - ((gimage_active_drawable (gdisp->gimage) != - active_tool->drawable) && - /* ...and doesn't want to preserve it */ - ! active_tool->preserve)) + /* and doesn't want to be preserved across drawable changes */ + ! active_tool->preserve) { tools_initialize (active_tool->type, gdisp); } + /* otherwise set it's drawable if it has none */ + else if (! active_tool->drawable) + { + active_tool->drawable = gimage_active_drawable (gdisp->gimage); + } + (* active_tool->button_press_func) (active_tool, bevent, gdisp); } break; @@ -277,6 +281,7 @@ gdisplay_canvas_events (GtkWidget *canvas, state |= GDK_BUTTON3_MASK; gtk_menu_popup (GTK_MENU (gdisp->popup), NULL, NULL, NULL, NULL, 3, bevent->time); + return_val = TRUE; break; default: diff --git a/app/display/gimpdisplay-callbacks.c b/app/display/gimpdisplay-callbacks.c index 9b3510fd33..f77f4c446c 100644 --- a/app/display/gimpdisplay-callbacks.c +++ b/app/display/gimpdisplay-callbacks.c @@ -202,6 +202,7 @@ gdisplay_canvas_events (GtkWidget *canvas, case GDK_LEAVE_NOTIFY: gdisplay_update_cursor (gdisp, 0, 0); gtk_label_set_text (GTK_LABEL (gdisp->cursor_label), ""); + case GDK_PROXIMITY_OUT: gdisp->proximity = FALSE; break; @@ -245,23 +246,26 @@ gdisplay_canvas_events (GtkWidget *canvas, update_cursor = TRUE; } - /* reset the current tool if ... */ + /* reset the current tool if ... */ + if ((/* it has no drawable */ + ! active_tool->drawable || - if (/* it has no display */ - ! active_tool->gdisp_ptr || + /* or a drawable different from the current one */ + (gimage_active_drawable (gdisp->gimage) != + active_tool->drawable)) && - /* or no drawable */ - ! active_tool->drawable || - - /* or a drawable different from it's current one... */ - ((gimage_active_drawable (gdisp->gimage) != - active_tool->drawable) && - /* ...and doesn't want to preserve it */ - ! active_tool->preserve)) + /* and doesn't want to be preserved across drawable changes */ + ! active_tool->preserve) { tools_initialize (active_tool->type, gdisp); } + /* otherwise set it's drawable if it has none */ + else if (! active_tool->drawable) + { + active_tool->drawable = gimage_active_drawable (gdisp->gimage); + } + (* active_tool->button_press_func) (active_tool, bevent, gdisp); } break; @@ -277,6 +281,7 @@ gdisplay_canvas_events (GtkWidget *canvas, state |= GDK_BUTTON3_MASK; gtk_menu_popup (GTK_MENU (gdisp->popup), NULL, NULL, NULL, NULL, 3, bevent->time); + return_val = TRUE; break; default: diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c index 791c94a2ff..ebe6df5da3 100644 --- a/app/display/gimpdisplay.c +++ b/app/display/gimpdisplay.c @@ -1731,6 +1731,14 @@ gdisplay_expose_full (GDisplay *gdisp) GDisplay * gdisplay_active () { + GdkEvent *event; + + event = gtk_get_current_event (); + if (event != NULL) + { + gdk_event_free (event); + } + return gimp_context_get_display (gimp_context_get_user ()); } diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c index 9b3510fd33..f77f4c446c 100644 --- a/app/display/gimpdisplayshell-callbacks.c +++ b/app/display/gimpdisplayshell-callbacks.c @@ -202,6 +202,7 @@ gdisplay_canvas_events (GtkWidget *canvas, case GDK_LEAVE_NOTIFY: gdisplay_update_cursor (gdisp, 0, 0); gtk_label_set_text (GTK_LABEL (gdisp->cursor_label), ""); + case GDK_PROXIMITY_OUT: gdisp->proximity = FALSE; break; @@ -245,23 +246,26 @@ gdisplay_canvas_events (GtkWidget *canvas, update_cursor = TRUE; } - /* reset the current tool if ... */ + /* reset the current tool if ... */ + if ((/* it has no drawable */ + ! active_tool->drawable || - if (/* it has no display */ - ! active_tool->gdisp_ptr || + /* or a drawable different from the current one */ + (gimage_active_drawable (gdisp->gimage) != + active_tool->drawable)) && - /* or no drawable */ - ! active_tool->drawable || - - /* or a drawable different from it's current one... */ - ((gimage_active_drawable (gdisp->gimage) != - active_tool->drawable) && - /* ...and doesn't want to preserve it */ - ! active_tool->preserve)) + /* and doesn't want to be preserved across drawable changes */ + ! active_tool->preserve) { tools_initialize (active_tool->type, gdisp); } + /* otherwise set it's drawable if it has none */ + else if (! active_tool->drawable) + { + active_tool->drawable = gimage_active_drawable (gdisp->gimage); + } + (* active_tool->button_press_func) (active_tool, bevent, gdisp); } break; @@ -277,6 +281,7 @@ gdisplay_canvas_events (GtkWidget *canvas, state |= GDK_BUTTON3_MASK; gtk_menu_popup (GTK_MENU (gdisp->popup), NULL, NULL, NULL, NULL, 3, bevent->time); + return_val = TRUE; break; default: diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index 3cc8f1b7ea..48640db34e 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -690,10 +690,6 @@ create_display_shell (GDisplay* gdisp, gdisp->hrule = gtk_hruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->hrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /* Still need to sort out the best way of using this metrics stuff. - * For the moment, we do everything in terms of pixels - * -- austin 25/Jan/99 */ - /*gtk_ruler_set_metric (GTK_RULER (gdisp->hrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->hrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->hrule)); @@ -704,7 +700,6 @@ create_display_shell (GDisplay* gdisp, gdisp->vrule = gtk_vruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->vrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /*gtk_ruler_set_metric (GTK_RULER (gdisp->vrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->vrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->vrule)); @@ -722,11 +717,16 @@ create_display_shell (GDisplay* gdisp, gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK); gtk_widget_set_extension_events (gdisp->canvas, GDK_EXTENSION_EVENTS_ALL); GTK_WIDGET_SET_FLAGS (gdisp->canvas, GTK_CAN_FOCUS); + gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); + + /* set the active display before doing any other canvas event processing */ + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", + (GtkSignalFunc) gdisplay_shell_events, + gdisp); + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", (GtkSignalFunc) gdisplay_canvas_events, gdisp); - gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); - /* pack all the widgets */ gtk_table_attach (GTK_TABLE (table), table_inner, 0, 1, 0, 1, diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 3cc8f1b7ea..48640db34e 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -690,10 +690,6 @@ create_display_shell (GDisplay* gdisp, gdisp->hrule = gtk_hruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->hrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /* Still need to sort out the best way of using this metrics stuff. - * For the moment, we do everything in terms of pixels - * -- austin 25/Jan/99 */ - /*gtk_ruler_set_metric (GTK_RULER (gdisp->hrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->hrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->hrule)); @@ -704,7 +700,6 @@ create_display_shell (GDisplay* gdisp, gdisp->vrule = gtk_vruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->vrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /*gtk_ruler_set_metric (GTK_RULER (gdisp->vrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->vrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->vrule)); @@ -722,11 +717,16 @@ create_display_shell (GDisplay* gdisp, gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK); gtk_widget_set_extension_events (gdisp->canvas, GDK_EXTENSION_EVENTS_ALL); GTK_WIDGET_SET_FLAGS (gdisp->canvas, GTK_CAN_FOCUS); + gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); + + /* set the active display before doing any other canvas event processing */ + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", + (GtkSignalFunc) gdisplay_shell_events, + gdisp); + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", (GtkSignalFunc) gdisplay_canvas_events, gdisp); - gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); - /* pack all the widgets */ gtk_table_attach (GTK_TABLE (table), table_inner, 0, 1, 0, 1, diff --git a/app/draw_core.c b/app/draw_core.c index a454a53eca..3e44f0edb8 100644 --- a/app/draw_core.c +++ b/app/draw_core.c @@ -15,14 +15,12 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include "appenv.h" #include "draw_core.h" DrawCore * -draw_core_new (draw_func) - DrawCoreDraw draw_func; +draw_core_new (DrawCoreDraw draw_func) { DrawCore * core; @@ -43,10 +41,9 @@ draw_core_new (draw_func) void -draw_core_start (core, win, tool) - DrawCore *core; - GdkWindow *win; - Tool *tool; +draw_core_start (DrawCore *core, + GdkWindow *win, + Tool *tool) { GdkColor fg, bg; @@ -76,9 +73,8 @@ draw_core_start (core, win, tool) void -draw_core_stop (core, tool) - DrawCore * core; - Tool * tool; +draw_core_stop (DrawCore *core, + Tool *tool) { if (core->draw_state == INVISIBLE) return; @@ -90,9 +86,8 @@ draw_core_stop (core, tool) void -draw_core_resume (core, tool) - DrawCore * core; - Tool * tool; +draw_core_resume (DrawCore *core, + Tool *tool) { core->paused_count = (core->paused_count > 0) ? core->paused_count - 1 : 0; if (core->paused_count == 0) @@ -104,9 +99,8 @@ draw_core_resume (core, tool) void -draw_core_pause (core, tool) - DrawCore * core; - Tool * tool; +draw_core_pause (DrawCore *core, + Tool *tool) { if (core->paused_count == 0) { @@ -118,8 +112,7 @@ draw_core_pause (core, tool) void -draw_core_free (core) - DrawCore * core; +draw_core_free (DrawCore *core) { if (core) { diff --git a/app/ellipse_select.c b/app/ellipse_select.c index b29aaf955d..292326a2f4 100644 --- a/app/ellipse_select.c +++ b/app/ellipse_select.c @@ -136,6 +136,10 @@ tools_new_ellipse_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -143,7 +147,6 @@ tools_new_ellipse_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/flip_tool.c b/app/flip_tool.c index 3727f13f63..0a313706aa 100644 --- a/app/flip_tool.c +++ b/app/flip_tool.c @@ -190,7 +190,6 @@ flip_cursor_update (Tool *tool, Tool * tools_new_flip () { - Tool * tool; TransformCore * private; @@ -205,9 +204,10 @@ tools_new_flip () private = tool->private; private->trans_func = flip_tool_transform; + private->trans_info[FLIP_INFO] = -1.0; + tool->modifier_key_func = flip_modifier_key_func; tool->cursor_update_func = flip_cursor_update; - private->trans_info[FLIP_INFO] = -1.0; return tool; } diff --git a/app/free_select.c b/app/free_select.c index 122a33f59b..c59a12ea7c 100644 --- a/app/free_select.c +++ b/app/free_select.c @@ -476,6 +476,10 @@ tools_new_free_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = free_select_button_press; tool->button_release_func = free_select_button_release; tool->motion_func = free_select_motion; @@ -483,7 +487,6 @@ tools_new_free_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = free_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/fuzzy_select.c b/app/fuzzy_select.c index 21b82eaca8..4cf684855c 100644 --- a/app/fuzzy_select.c +++ b/app/fuzzy_select.c @@ -340,11 +340,13 @@ fuzzy_select_button_press (Tool *tool, GdkEventButton *bevent, fuzzy_sel->threshold = default_threshold; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; - tool->gdisp_ptr = gdisp_ptr; + tool->gdisp_ptr = gdisp; if (fuzzy_sel->op == SELECTION_MOVE_MASK) { @@ -385,10 +387,11 @@ fuzzy_select_button_release (Tool *tool, GdkEventButton *bevent, /* First take care of the case where the user "cancels" the action */ if (! (bevent->state & GDK_BUTTON3_MASK)) { - drawable = (fuzzy_options->sample_merged) ? NULL : gimage_active_drawable (gdisp->gimage); + drawable = ((fuzzy_options->sample_merged) ? + NULL : gimage_active_drawable (gdisp->gimage)); + fuzzy_select (gdisp->gimage, drawable, fuzzy_sel->op, fuzzy_options->feather, fuzzy_options->feather_radius); - gdisplays_flush (); /* adapt the threshold based on the final value of this use */ @@ -569,6 +572,10 @@ tools_new_fuzzy_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = fuzzy_select_button_press; tool->button_release_func = fuzzy_select_button_release; tool->motion_func = fuzzy_select_motion; diff --git a/app/gdisplay.c b/app/gdisplay.c index 791c94a2ff..ebe6df5da3 100644 --- a/app/gdisplay.c +++ b/app/gdisplay.c @@ -1731,6 +1731,14 @@ gdisplay_expose_full (GDisplay *gdisp) GDisplay * gdisplay_active () { + GdkEvent *event; + + event = gtk_get_current_event (); + if (event != NULL) + { + gdk_event_free (event); + } + return gimp_context_get_display (gimp_context_get_user ()); } diff --git a/app/gimage.c b/app/gimage.c index c4b2b917fa..854ac9e16b 100644 --- a/app/gimage.c +++ b/app/gimage.c @@ -90,16 +90,20 @@ gimage_invalidate_previews (void) } static void -gimage_dirty_handler (GimpImage* gimage){ - if (active_tool && !active_tool->preserve) { - GDisplay* gdisp = active_tool->gdisp_ptr; - if (gdisp) { - if (gdisp->gimage == gimage) - tools_initialize (active_tool->type, gdisp); - else - tools_initialize (active_tool->type, NULL); +gimage_dirty_handler (GimpImage* gimage) +{ + if (active_tool && !active_tool->preserve) + { + GDisplay* gdisp = active_tool->gdisp_ptr; + + if (gdisp) + { + if (gdisp->gimage == gimage) + tools_initialize (active_tool->type, gdisp); + else + tools_initialize (active_tool->type, NULL); + } } - } } static void diff --git a/app/gui/commands.c b/app/gui/commands.c index 1d4ccb5db5..d075d7ba9f 100644 --- a/app/gui/commands.c +++ b/app/gui/commands.c @@ -976,20 +976,30 @@ tools_select_cmd_callback (GtkWidget *widget, GDisplay * gdisp; gdisp = gdisplay_active (); - /* Activate the approriate widget. + /* Activate the appropriate widget. * Implicitly calls tools_select() */ gtk_widget_activate (tool_info[callback_action].tool_widget); + /* Paranoia */ + active_tool->drawable = NULL; + /* Complete the initialisation by doing the same stuff * tools_initialize() does after it did what tools_select() does */ - if (tool_info[callback_action].init_func && gdisp) + if (tool_info[callback_action].init_func) { (* tool_info[callback_action].init_func) (gdisp); - active_tool->gdisp_ptr = gdisp; + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } + + /* setting the gdisp_ptr here is a HACK to allow the tools' + * dialog windows being hidden if the tool was selected from + * a tear-off-menu and there was no mouse click in the display + * before deleting it + */ + active_tool->gdisp_ptr = gdisp; } void diff --git a/app/gui/help-commands.c b/app/gui/help-commands.c index 1d4ccb5db5..d075d7ba9f 100644 --- a/app/gui/help-commands.c +++ b/app/gui/help-commands.c @@ -976,20 +976,30 @@ tools_select_cmd_callback (GtkWidget *widget, GDisplay * gdisp; gdisp = gdisplay_active (); - /* Activate the approriate widget. + /* Activate the appropriate widget. * Implicitly calls tools_select() */ gtk_widget_activate (tool_info[callback_action].tool_widget); + /* Paranoia */ + active_tool->drawable = NULL; + /* Complete the initialisation by doing the same stuff * tools_initialize() does after it did what tools_select() does */ - if (tool_info[callback_action].init_func && gdisp) + if (tool_info[callback_action].init_func) { (* tool_info[callback_action].init_func) (gdisp); - active_tool->gdisp_ptr = gdisp; + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } + + /* setting the gdisp_ptr here is a HACK to allow the tools' + * dialog windows being hidden if the tool was selected from + * a tear-off-menu and there was no mouse click in the display + * before deleting it + */ + active_tool->gdisp_ptr = gdisp; } void diff --git a/app/histogram_tool.c b/app/histogram_tool.c index 168fcffb68..a67be924b5 100644 --- a/app/histogram_tool.c +++ b/app/histogram_tool.c @@ -15,9 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #include "config.h" -#include -#include + #include #include "appenv.h" #include "actionarea.h" @@ -89,7 +89,6 @@ histogram_tool_histogram_range (HistogramWidget *w, pixels = gimp_histogram_get_count(htd->hist, 0, 255); count = gimp_histogram_get_count(htd->hist, start, end); - htd->mean = gimp_histogram_get_mean(htd->hist, htd->channel, start, end); htd->std_dev = gimp_histogram_get_std_dev(htd->hist, htd->channel, start, end); @@ -110,34 +109,34 @@ histogram_tool_dialog_update (HistogramToolDialog *htd, char text[12]; /* mean */ - sprintf (text, "%3.1f", htd->mean); + g_snprintf (text, 12, "%3.1f", htd->mean); gtk_label_set_text (GTK_LABEL (htd->info_labels[0]), text); /* std dev */ - sprintf (text, "%3.1f", htd->std_dev); + g_snprintf (text, 12, "%3.1f", htd->std_dev); gtk_label_set_text (GTK_LABEL (htd->info_labels[1]), text); /* median */ - sprintf (text, "%3.1f", htd->median); + g_snprintf (text, 12, "%3.1f", htd->median); gtk_label_set_text (GTK_LABEL (htd->info_labels[2]), text); /* pixels */ - sprintf (text, "%8.1f", htd->pixels); + g_snprintf (text, 12, "%8.1f", htd->pixels); gtk_label_set_text (GTK_LABEL (htd->info_labels[3]), text); /* intensity */ if (start == end) - sprintf (text, "%d", start); + g_snprintf (text, 12, "%d", start); else - sprintf (text, "%d..%d", start, end); + g_snprintf (text, 12, "%d..%d", start, end); gtk_label_set_text (GTK_LABEL (htd->info_labels[4]), text); /* count */ - sprintf (text, "%8.1f", htd->count); + g_snprintf (text, 12, "%8.1f", htd->count); gtk_label_set_text (GTK_LABEL (htd->info_labels[5]), text); /* percentile */ - sprintf (text, "%2.2f", htd->percentile * 100); + g_snprintf (text, 12, "%2.2f", htd->percentile * 100); gtk_label_set_text (GTK_LABEL (htd->info_labels[6]), text); } @@ -151,6 +150,8 @@ histogram_tool_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -224,6 +225,10 @@ tools_new_histogram_tool () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = histogram_tool_button_press; tool->button_release_func = histogram_tool_button_release; tool->motion_func = histogram_tool_motion; @@ -232,8 +237,6 @@ tools_new_histogram_tool () tool->cursor_update_func = histogram_tool_cursor_update; tool->control_func = histogram_tool_control; - tool->preserve = FALSE; - return tool; } @@ -428,7 +431,7 @@ histogram_tool_new_dialog () static void histogram_tool_close_callback (GtkWidget *widget, - gpointer client_data) + gpointer client_data) { HistogramToolDialog *htd; diff --git a/app/hue_saturation.c b/app/hue_saturation.c index 16e1f8b615..1bf696479a 100644 --- a/app/hue_saturation.c +++ b/app/hue_saturation.c @@ -237,6 +237,8 @@ hue_saturation_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -310,6 +312,10 @@ tools_new_hue_saturation () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = hue_saturation_button_press; tool->button_release_func = hue_saturation_button_release; tool->motion_func = hue_saturation_motion; @@ -317,9 +323,6 @@ tools_new_hue_saturation () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = hue_saturation_cursor_update; tool->control_func = hue_saturation_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -744,6 +747,9 @@ hue_saturation_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; hsd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -772,9 +778,12 @@ hue_saturation_cancel_callback (GtkWidget *widget, image_map_abort (hsd->image_map); active_tool->preserve = FALSE; - hsd->image_map = NULL; gdisplays_flush (); + hsd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/ink.c b/app/ink.c index 1fed084bf0..67e6a52839 100644 --- a/app/ink.c +++ b/app/ink.c @@ -1564,7 +1564,10 @@ tools_new_ink (void) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = ink_button_press; tool->button_release_func = ink_button_release; diff --git a/app/interface.c b/app/interface.c index 3cc8f1b7ea..48640db34e 100644 --- a/app/interface.c +++ b/app/interface.c @@ -690,10 +690,6 @@ create_display_shell (GDisplay* gdisp, gdisp->hrule = gtk_hruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->hrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /* Still need to sort out the best way of using this metrics stuff. - * For the moment, we do everything in terms of pixels - * -- austin 25/Jan/99 */ - /*gtk_ruler_set_metric (GTK_RULER (gdisp->hrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->hrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->hrule)); @@ -704,7 +700,6 @@ create_display_shell (GDisplay* gdisp, gdisp->vrule = gtk_vruler_new (); gtk_widget_set_events (GTK_WIDGET (gdisp->vrule), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); - /*gtk_ruler_set_metric (GTK_RULER (gdisp->vrule), ruler_units);*/ gtk_signal_connect_object (GTK_OBJECT (gdisp->shell), "motion_notify_event", (GtkSignalFunc) GTK_WIDGET_CLASS (GTK_OBJECT (gdisp->vrule)->klass)->motion_notify_event, GTK_OBJECT (gdisp->vrule)); @@ -722,11 +717,16 @@ create_display_shell (GDisplay* gdisp, gtk_widget_set_events (gdisp->canvas, CANVAS_EVENT_MASK); gtk_widget_set_extension_events (gdisp->canvas, GDK_EXTENSION_EVENTS_ALL); GTK_WIDGET_SET_FLAGS (gdisp->canvas, GTK_CAN_FOCUS); + gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); + + /* set the active display before doing any other canvas event processing */ + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", + (GtkSignalFunc) gdisplay_shell_events, + gdisp); + gtk_signal_connect (GTK_OBJECT (gdisp->canvas), "event", (GtkSignalFunc) gdisplay_canvas_events, gdisp); - gtk_object_set_user_data (GTK_OBJECT (gdisp->canvas), (gpointer) gdisp); - /* pack all the widgets */ gtk_table_attach (GTK_TABLE (table), table_inner, 0, 1, 0, 1, diff --git a/app/iscissors.c b/app/iscissors.c index d030405d2d..e0a209d672 100644 --- a/app/iscissors.c +++ b/app/iscissors.c @@ -431,8 +431,13 @@ tools_new_iscissors () tool->type = ISCISSORS; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ + tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = iscissors_button_press; tool->button_release_func = iscissors_button_release; tool->motion_func = iscissors_motion; @@ -440,8 +445,6 @@ tools_new_iscissors () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = iscissors_control; - tool->auto_snap_to = 0; - tool->preserve = TRUE; last_tool = tool; diff --git a/app/levels.c b/app/levels.c index 90d43d1891..04b35d0a6a 100644 --- a/app/levels.c +++ b/app/levels.c @@ -174,6 +174,8 @@ levels_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -247,6 +249,10 @@ tools_new_levels () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = levels_button_press; tool->button_release_func = levels_button_release; tool->motion_func = levels_motion; @@ -254,9 +260,6 @@ tools_new_levels () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = levels_cursor_update; tool->control_func = levels_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -971,6 +974,9 @@ levels_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; ld->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -999,10 +1005,12 @@ levels_cancel_callback (GtkWidget *widget, image_map_abort (ld->image_map); active_tool->preserve = FALSE; - ld->image_map = NULL; gdisplays_flush (); + ld->image_map = NULL; } + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/magnify.c b/app/magnify.c index 5daf50bc6f..8201fa4186 100644 --- a/app/magnify.c +++ b/app/magnify.c @@ -372,6 +372,10 @@ tools_new_magnify (void) tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = magnify_button_press; tool->button_release_func = magnify_button_release; tool->motion_func = magnify_motion; diff --git a/app/move.c b/app/move.c index c09bfd0aa2..fbda598d26 100644 --- a/app/move.c +++ b/app/move.c @@ -447,12 +447,20 @@ tools_new_move_tool () tool = (Tool *) g_malloc (sizeof (Tool)); private = (MoveTool *) g_malloc (sizeof (MoveTool)); + private->layer = NULL; + private->guide = NULL; + private->disp = NULL; + tool->type = MOVE; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = move_tool_button_press; tool->button_release_func = move_tool_button_release; tool->motion_func = move_tool_motion; @@ -460,11 +468,6 @@ tools_new_move_tool () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = move_tool_cursor_update; tool->control_func = move_tool_control; - tool->preserve = TRUE; - - private->layer = NULL; - private->guide = NULL; - private->disp = NULL; return tool; } diff --git a/app/paint/gimpairbrush.c b/app/paint/gimpairbrush.c index 10277fbb27..743522aea0 100644 --- a/app/paint/gimpairbrush.c +++ b/app/paint/gimpairbrush.c @@ -34,10 +34,10 @@ #include "libgimp/gimpintl.h" /* The maximum amount of pressure that can be exerted */ -#define MAX_PRESSURE 0.075 +#define MAX_PRESSURE 0.075 -#define OFF 0 -#define ON 1 +#define OFF 0 +#define ON 1 /* the airbrush structures */ diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c index 1fed084bf0..67e6a52839 100644 --- a/app/paint/gimpink.c +++ b/app/paint/gimpink.c @@ -1564,7 +1564,10 @@ tools_new_ink (void) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = ink_button_press; tool->button_release_func = ink_button_release; diff --git a/app/paint_core.c b/app/paint_core.c index 246cbaa53f..5f7a6243ad 100644 --- a/app/paint_core.c +++ b/app/paint_core.c @@ -529,7 +529,10 @@ paint_core_new (int type) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = paint_core_button_press; tool->button_release_func = paint_core_button_release; diff --git a/app/posterize.c b/app/posterize.c index a3a98d27e1..0847c35955 100644 --- a/app/posterize.c +++ b/app/posterize.c @@ -98,6 +98,8 @@ posterize_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -178,6 +180,10 @@ tools_new_posterize () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = posterize_button_press; tool->button_release_func = posterize_button_release; tool->motion_func = posterize_motion; @@ -186,10 +192,6 @@ tools_new_posterize () tool->cursor_update_func = posterize_cursor_update; tool->control_func = posterize_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - return tool; } @@ -200,7 +202,7 @@ tools_free_posterize (Tool *tool) post = (Posterize *) tool->private; - /* Close the color select dialog */ + /* Close the posterize dialog */ if (posterize_dialog) posterize_cancel_callback (NULL, (gpointer) posterize_dialog); @@ -222,8 +224,11 @@ posterize_initialize (GDisplay *gdisp) else if (!GTK_WIDGET_VISIBLE (posterize_dialog->shell)) gtk_widget_show (posterize_dialog->shell); + posterize_dialog->drawable = gimage_active_drawable (gdisp->gimage); - posterize_dialog->image_map = image_map_create (gdisp, posterize_dialog->drawable); + posterize_dialog->image_map = + image_map_create (gdisp, posterize_dialog->drawable); + if (posterize_dialog->preview) posterize_preview (posterize_dialog); } @@ -351,6 +356,9 @@ posterize_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; pd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -380,6 +388,9 @@ posterize_cancel_callback (GtkWidget *widget, pd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -418,4 +429,3 @@ posterize_levels_text_update (GtkWidget *w, posterize_preview (pd); } } - diff --git a/app/rect_select.c b/app/rect_select.c index da465c499a..4426403598 100644 --- a/app/rect_select.c +++ b/app/rect_select.c @@ -154,7 +154,8 @@ rect_select_button_press (Tool *tool, rect_sel->center = FALSE; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -447,8 +448,10 @@ rect_select_draw (Tool *tool) void -static selection_tool_update_op_state(RectSelect *rect_sel, int x, int y, int state, - GDisplay *gdisp) +static selection_tool_update_op_state (RectSelect *rect_sel, + int x, int y, + int state, + GDisplay *gdisp) { if (active_tool->state == ACTIVE) return; @@ -485,8 +488,8 @@ rect_select_cursor_update (Tool *tool, active = (active_tool->state == ACTIVE); rect_sel = (RectSelect*)tool->private; - selection_tool_update_op_state(rect_sel, mevent->x, mevent->y, - mevent->state, gdisp_ptr); + selection_tool_update_op_state (rect_sel, mevent->x, mevent->y, + mevent->state, gdisp_ptr); switch (rect_sel->op) { @@ -505,7 +508,7 @@ rect_select_cursor_update (Tool *tool, case SELECTION_MOVE_MASK: gdisplay_install_tool_cursor (gdisp, GDK_DIAMOND_CROSS); break; - case SELECTION_MOVE: + case SELECTION_MOVE: gdisplay_install_tool_cursor (gdisp, GDK_FLEUR); } } @@ -572,6 +575,10 @@ tools_new_rect_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -580,8 +587,6 @@ tools_new_rect_select () tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/rotate_tool.c b/app/rotate_tool.c index cc459fce53..006b732c73 100644 --- a/app/rotate_tool.c +++ b/app/rotate_tool.c @@ -35,33 +35,33 @@ #include "libgimp/gimpintl.h" #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif /* M_PI */ /* index into trans_info array */ -#define ANGLE 0 -#define REAL_ANGLE 1 -#define CENTER_X 2 -#define CENTER_Y 3 +#define ANGLE 0 +#define REAL_ANGLE 1 +#define CENTER_X 2 +#define CENTER_Y 3 -#define EPSILON 0.018 /* ~ 1 degree */ -#define FIFTEEN_DEG (M_PI / 12.0) +#define EPSILON 0.018 /* ~ 1 degree */ +#define FIFTEEN_DEG (M_PI / 12.0) /* variables local to this file */ -static gdouble angle_val; -static gdouble center_vals[2]; +static gdouble angle_val; +static gdouble center_vals[2]; /* needed for size update */ -static GtkWidget *sizeentry; +static GtkWidget *sizeentry; /* forward function declarations */ -static void * rotate_tool_recalc (Tool *, void *); -static void rotate_tool_motion (Tool *, void *); -static void rotate_info_update (Tool *); +static void * rotate_tool_recalc (Tool *, void *); +static void rotate_tool_motion (Tool *, void *); +static void rotate_info_update (Tool *); /* callback functions for the info dialog sizeentries */ -static void rotate_angle_changed (GtkWidget *entry, gpointer data); -static void rotate_center_changed (GtkWidget *entry, gpointer data); +static void rotate_angle_changed (GtkWidget *entry, gpointer data); +static void rotate_center_changed (GtkWidget *entry, gpointer data); void * rotate_tool_transform (Tool *tool, diff --git a/app/text_tool.c b/app/text_tool.c index c330e813ca..0a415aaf1b 100644 --- a/app/text_tool.c +++ b/app/text_tool.c @@ -251,6 +251,10 @@ tools_new_text () tool->auto_snap_to = TRUE; tool->private = (void *) the_text_tool; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = text_button_press; tool->button_release_func = text_button_release; tool->motion_func = text_motion; @@ -259,8 +263,6 @@ tools_new_text () tool->cursor_update_func = text_cursor_update; tool->control_func = text_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/threshold.c b/app/threshold.c index 3c336786fb..071cb04275 100644 --- a/app/threshold.c +++ b/app/threshold.c @@ -166,6 +166,8 @@ threshold_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -246,6 +248,10 @@ tools_new_threshold () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = threshold_button_press; tool->button_release_func = threshold_button_release; tool->motion_func = threshold_motion; @@ -254,8 +260,6 @@ tools_new_threshold () tool->cursor_update_func = threshold_cursor_update; tool->control_func = threshold_control; - tool->preserve = FALSE; - return tool; } @@ -291,16 +295,18 @@ threshold_initialize (GDisplay *gdisp) threshold_dialog->drawable = gimage_active_drawable (gdisp->gimage); threshold_dialog->color = drawable_color (threshold_dialog->drawable); - threshold_dialog->image_map = image_map_create (gdisp, threshold_dialog->drawable); + threshold_dialog->image_map = + image_map_create (gdisp, threshold_dialog->drawable); - gimp_histogram_calculate_drawable(threshold_dialog->hist, - threshold_dialog->drawable); + gimp_histogram_calculate_drawable (threshold_dialog->hist, + threshold_dialog->drawable); histogram_widget_update (threshold_dialog->histogram, threshold_dialog->hist); histogram_widget_range (threshold_dialog->histogram, threshold_dialog->low_threshold, threshold_dialog->high_threshold); + if (threshold_dialog->preview) threshold_preview (threshold_dialog); } @@ -453,6 +459,9 @@ threshold_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; td->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -484,6 +493,9 @@ threshold_cancel_callback (GtkWidget *widget, td->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools.c b/app/tools.c index 84135825be..37de4c3761 100644 --- a/app/tools.c +++ b/app/tools.c @@ -605,7 +605,7 @@ active_tool_free (void) return; tools_options_hide (active_tool->type); - + (* tool_info[(int) active_tool->type].free_func) (active_tool); g_free (active_tool); @@ -636,37 +636,25 @@ void tools_initialize (ToolType type, GDisplay *gdisp) { - if (active_tool) - active_tool_free (); + /* Tools which have an init function have dialogs and + * cannot be initialized without a display + */ + if (tool_info[(int) type].init_func && !gdisp) + type = RECT_SELECT; + + /* Activate the appropriate widget. + * Implicitly calls tools_select() + */ + tools_select (type); - /* If you're wondering... only these dialog type tools have init functions */ if (tool_info[(int) type].init_func) { - if (gdisp) - { - active_tool = (* tool_info[(int) type].new_func) (); - (* tool_info[(int) type].init_func) (gdisp); - } - else - { - active_tool = tools_new_rect_select (); - } - } - else - { - active_tool = (* tool_info[(int) type].new_func) (); + (* tool_info[(int) type].init_func) (gdisp); + + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } - tools_options_show (active_tool->type); - - /* Set the paused count variable to 0 */ - active_tool->paused_count = 0; - active_tool->gdisp_ptr = gdisp; - active_tool->drawable = NULL; - active_tool->ID = global_tool_ID++; - - if (gdisp) - active_tool->drawable = gimage_active_drawable (gdisp->gimage); + /* don't set gdisp_ptr here !!! (see commands.c) */ } void diff --git a/app/tools/airbrush.c b/app/tools/airbrush.c index 10277fbb27..743522aea0 100644 --- a/app/tools/airbrush.c +++ b/app/tools/airbrush.c @@ -34,10 +34,10 @@ #include "libgimp/gimpintl.h" /* The maximum amount of pressure that can be exerted */ -#define MAX_PRESSURE 0.075 +#define MAX_PRESSURE 0.075 -#define OFF 0 -#define ON 1 +#define OFF 0 +#define ON 1 /* the airbrush structures */ diff --git a/app/tools/bezier_select.c b/app/tools/bezier_select.c index 26fc4f2571..402958b0eb 100644 --- a/app/tools/bezier_select.c +++ b/app/tools/bezier_select.c @@ -202,7 +202,7 @@ Tool* tools_new_bezier_select () { Tool * tool; - BezierSelect * bezier_sel; + BezierSelect * private; /* The tool options */ if (! bezier_options) @@ -213,19 +213,23 @@ tools_new_bezier_select () } tool = g_malloc (sizeof (Tool)); + private = g_malloc (sizeof (BezierSelect)); - bezier_sel = g_new0(BezierSelect,1); - - bezier_sel->num_points = 0; - bezier_sel->mask = NULL; - bezier_sel->core = draw_core_new (bezier_select_draw); - bezier_select_reset (bezier_sel); + private->num_points = 0; + private->mask = NULL; + private->core = draw_core_new (bezier_select_draw); + bezier_select_reset (private); tool->type = BEZIER_SELECT; tool->state = INACTIVE; tool->scroll_lock = 1; /* Do not allow scrolling */ tool->auto_snap_to = TRUE; - tool->private = (void *) bezier_sel; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = bezier_select_button_press; tool->button_release_func = bezier_select_button_release; tool->motion_func = bezier_select_motion; @@ -233,13 +237,12 @@ tools_new_bezier_select () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = bezier_select_cursor_update; tool->control_func = bezier_select_control; - tool->preserve = FALSE; - curCore = bezier_sel->core; - curSel = bezier_sel; + curCore = private->core; + curSel = private; curTool = tool; - paths_new_bezier_select_tool(); + paths_new_bezier_select_tool (); return tool; } @@ -834,6 +837,9 @@ bezier_select_button_press (Tool *tool, int halfwidth, dummy; gdisp = (GDisplay *) gdisp_ptr; + + tool->drawable = gimage_active_drawable (gdisp->gimage); + bezier_sel = tool->private; grab_pointer = 0; diff --git a/app/tools/blend.c b/app/tools/blend.c index 30f4fc25d7..f34e0e0cbd 100644 --- a/app/tools/blend.c +++ b/app/tools/blend.c @@ -1741,7 +1741,11 @@ tools_new_blend () tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = blend_button_press; tool->button_release_func = blend_button_release; @@ -1750,7 +1754,6 @@ tools_new_blend () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = blend_cursor_update; tool->control_func = blend_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/brightness_contrast.c b/app/tools/brightness_contrast.c index 08213db478..2a79ad95c5 100644 --- a/app/tools/brightness_contrast.c +++ b/app/tools/brightness_contrast.c @@ -112,6 +112,8 @@ brightness_contrast_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -186,6 +188,10 @@ tools_new_brightness_contrast () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = brightness_contrast_button_press; tool->button_release_func = brightness_contrast_button_release; tool->motion_func = brightness_contrast_motion; @@ -193,9 +199,6 @@ tools_new_brightness_contrast () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = brightness_contrast_cursor_update; tool->control_func = brightness_contrast_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -236,8 +239,8 @@ brightness_contrast_initialize (GDisplay *gdisp) brightness_contrast_dialog->contrast = 0.0; brightness_contrast_dialog->drawable = gimage_active_drawable (gdisp->gimage); - brightness_contrast_dialog->image_map = image_map_create (gdisp, - brightness_contrast_dialog->drawable); + brightness_contrast_dialog->image_map = + image_map_create (gdisp, brightness_contrast_dialog->drawable); brightness_contrast_update (brightness_contrast_dialog, ALL); } @@ -454,6 +457,9 @@ brightness_contrast_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; bcd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -485,6 +491,9 @@ brightness_contrast_cancel_callback (GtkWidget *widget, bcd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/bucket_fill.c b/app/tools/bucket_fill.c index eb67ceecd1..0868d90473 100644 --- a/app/tools/bucket_fill.c +++ b/app/tools/bucket_fill.c @@ -611,7 +611,11 @@ tools_new_bucket_fill (void) tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = bucket_fill_button_press; tool->button_release_func = bucket_fill_button_release; @@ -620,7 +624,6 @@ tools_new_bucket_fill (void) tool->modifier_key_func = bucket_fill_modifier_key_func; tool->cursor_update_func = bucket_fill_cursor_update; tool->control_func = bucket_fill_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/by_color_select.c b/app/tools/by_color_select.c index 70ba457a47..9e13e9460b 100644 --- a/app/tools/by_color_select.c +++ b/app/tools/by_color_select.c @@ -483,6 +483,10 @@ tools_new_by_color_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = by_color_select_button_press; tool->button_release_func = by_color_select_button_release; tool->motion_func = by_color_select_motion; @@ -490,9 +494,6 @@ tools_new_by_color_select () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = by_color_select_cursor_update; tool->control_func = by_color_select_control; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/color_balance.c b/app/tools/color_balance.c index 6b809c903a..a13ac248eb 100644 --- a/app/tools/color_balance.c +++ b/app/tools/color_balance.c @@ -157,6 +157,8 @@ color_balance_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -204,13 +206,7 @@ color_balance_control (Tool *tool, case HALT: if (color_balance_dialog) - { - active_tool->preserve = TRUE; - image_map_abort (color_balance_dialog->image_map); - active_tool->preserve = FALSE; - color_balance_dialog->image_map = NULL; - color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); - } + color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); break; default: @@ -237,18 +233,20 @@ tools_new_color_balance () tool->type = COLOR_BALANCE; tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ - tool->private = (void *) private; tool->auto_snap_to = TRUE; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_balance_button_press; tool->button_release_func = color_balance_button_release; tool->motion_func = color_balance_motion; - tool->arrow_keys_func = standard_arrow_keys_func; tool->modifier_key_func = standard_modifier_key_func; + tool->arrow_keys_func = standard_arrow_keys_func; + tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_balance_cursor_update; tool->control_func = color_balance_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -294,22 +292,18 @@ color_balance_initialize (GDisplay *gdisp) color_balance_dialog->yellow_blue[i] = 0.0; } color_balance_dialog->drawable = gimage_active_drawable (gdisp->gimage); - color_balance_dialog->image_map = image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_dialog->image_map = + image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_update (color_balance_dialog, ALL); } -/****************************/ -/* Select by Color dialog */ -/****************************/ +/**************************/ +/* Color Balance dialog */ +/**************************/ /* the action area structure */ -static ActionAreaItem action_items[] = -{ - { N_("OK"), color_balance_ok_callback, NULL, NULL }, - { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } -}; - static ColorBalanceDialog * color_balance_new_dialog () { @@ -326,13 +320,21 @@ color_balance_new_dialog () GtkObject *data; GSList *group = NULL; int i; - char *appl_mode_names[3] = + + static ActionAreaItem action_items[] = + { + { N_("OK"), color_balance_ok_callback, NULL, NULL }, + { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } + }; + + char *appl_mode_names[] = { N_("Shadows"), N_("Midtones"), N_("Highlights") }; - ActionCallback appl_mode_callbacks[3] = + + ActionCallback appl_mode_callbacks[] = { color_balance_shadows_callback, color_balance_midtones_callback, @@ -657,6 +659,9 @@ color_balance_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cbd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -684,10 +689,13 @@ color_balance_cancel_callback (GtkWidget *widget, active_tool->preserve = TRUE; image_map_abort (cbd->image_map); active_tool->preserve = FALSE; + gdisplays_flush (); + cbd->image_map = NULL; } - cbd->image_map = NULL; + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/color_picker.c b/app/tools/color_picker.c index 95fa53d4ff..2daffbf061 100644 --- a/app/tools/color_picker.c +++ b/app/tools/color_picker.c @@ -625,7 +625,11 @@ tools_new_color_picker () tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_picker_button_press; tool->button_release_func = color_picker_button_release; @@ -634,7 +638,6 @@ tools_new_color_picker () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_picker_cursor_update; tool->control_func = color_picker_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/crop.c b/app/tools/crop.c index 1e97b807a2..80d10f8bfe 100644 --- a/app/tools/crop.c +++ b/app/tools/crop.c @@ -113,7 +113,7 @@ static void crop_control (Tool *, ToolAction, gpointer); static void crop_arrow_keys_func (Tool *, GdkEventKey *, gpointer); static void crop_modifier_key_func (Tool *, GdkEventKey *, gpointer); -/* Crop helper functions */ +/* Crop helper functions */ static void crop_recalc (Tool *, Crop *); static void crop_start (Tool *, Crop *); static void crop_adjust_guides (GImage *, int, int, int, int); @@ -132,18 +132,18 @@ typedef enum { AUTO_CROP_COLOR = 2 } AutoCropType; -typedef guchar * (*GetColorFunc) (GtkObject *, int, int); -typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); +typedef guchar * (*GetColorFunc) (GtkObject *, int, int); +typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); -static void crop_selection_callback (GtkWidget *, gpointer); -static void crop_automatic_callback (GtkWidget *, gpointer); +static void crop_selection_callback (GtkWidget *, gpointer); +static void crop_automatic_callback (GtkWidget *, gpointer); static AutoCropType crop_guess_bgcolor (GtkObject *, GetColorFunc, int, int, int, int, guchar *); -static int crop_colors_equal (guchar *, guchar *, int); -static int crop_colors_alpha (guchar *, guchar *, int); +static int crop_colors_equal (guchar *, guchar *, int); +static int crop_colors_alpha (guchar *, guchar *, int); /* Crop dialog callback funtions */ -static void crop_orig_changed (GtkWidget *, gpointer); -static void crop_size_changed (GtkWidget *, gpointer); +static void crop_orig_changed (GtkWidget *, gpointer); +static void crop_size_changed (GtkWidget *, gpointer); /* Functions */ @@ -168,7 +168,7 @@ crop_options_new (void) GtkWidget *frame; gchar* type_label[2] = { N_("Crop"), N_("Resize") }; gint type_value[2] = { CROP_CROP, RESIZE_CROP }; - + /* the new crop tool options structure */ options = (CropOptions *) g_malloc (sizeof (CropOptions)); tool_options_init ((ToolOptions *) options, @@ -205,7 +205,7 @@ crop_options_new (void) gtk_widget_show (options->allow_enlarge_w); /* tool toggle */ - frame = tool_options_radio_buttons_new (N_("Tool Toggle"), + frame = tool_options_radio_buttons_new (_("Tool Toggle"), &options->type, options->type_w, type_label, @@ -218,7 +218,6 @@ crop_options_new (void) return options; } - static void crop_button_press (Tool *tool, GdkEventButton *bevent, @@ -230,10 +229,11 @@ crop_button_press (Tool *tool, gdisp = (GDisplay *) gdisp_ptr; crop = (Crop *) tool->private; - if (tool->state == INACTIVE) - crop->function = CREATING; - else if (gdisp_ptr != tool->gdisp_ptr) - crop->function = CREATING; + if (tool->state == INACTIVE || + gdisp_ptr != tool->gdisp_ptr) + { + crop->function = CREATING; + } else { /* If the cursor is in either the upper left or lower right boxes, @@ -268,6 +268,7 @@ crop_button_press (Tool *tool, draw_core_stop (crop->core, tool); tool->gdisp_ptr = gdisp_ptr; + tool->drawable = gimage_active_drawable (gdisp->gimage); gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &crop->tx1, &crop->ty1, TRUE, FALSE); @@ -283,7 +284,8 @@ crop_button_press (Tool *tool, crop->lasty = crop->starty; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -317,9 +319,7 @@ crop_button_release (Tool *tool, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } else crop_info_update (tool); @@ -671,18 +671,17 @@ crop_control (Tool *tool, switch (action) { - case PAUSE : + case PAUSE: draw_core_pause (crop->core, tool); break; - case RESUME : + case RESUME: crop_recalc (tool, crop); draw_core_resume (crop->core, tool); break; - case HALT : - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); + case HALT: + crop_close_callback (NULL, NULL); break; default: @@ -696,12 +695,12 @@ crop_draw (Tool *tool) Crop * crop; GDisplay * gdisp; -#define SRW 10 -#define SRH 10 - gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; +#define SRW 10 +#define SRH 10 + gdk_draw_line (crop->core->win, crop->core->gc, crop->x1, crop->y1, gdisp->disp_width, crop->y1); gdk_draw_line (crop->core->win, crop->core->gc, @@ -723,6 +722,9 @@ crop_draw (Tool *tool) gdk_draw_rectangle (crop->core->win, crop->core->gc, 1, crop->x1, crop->y2-crop->srh, crop->srw, crop->srh); +#undef SRW +#undef SRH + crop_info_update (tool); } @@ -752,6 +754,10 @@ tools_new_crop () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; /* XXX Check me */ + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = crop_button_press; tool->button_release_func = crop_button_release; tool->motion_func = crop_motion; @@ -759,7 +765,6 @@ tools_new_crop () tool->modifier_key_func = crop_modifier_key_func; tool->cursor_update_func = crop_cursor_update; tool->control_func = crop_control; - tool->preserve = TRUE; /* XXX Check me */ return tool; } @@ -777,10 +782,7 @@ tools_free_crop (Tool *tool) draw_core_free (crop->core); if (crop_info) - { - info_dialog_popdown (crop_info); - crop_info = NULL; - } + crop_close_callback (NULL, NULL); g_free (crop); } @@ -957,6 +959,9 @@ crop_start (Tool *tool, if (! crop_info) crop_info_create (tool); + gtk_signal_handler_block_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + gtk_signal_handler_block_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, gdisp->gimage->xresolution, FALSE); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, @@ -993,6 +998,9 @@ crop_start (Tool *tool, } } + gtk_signal_handler_unblock_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gtk_signal_handler_unblock_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + old_gdisp = gdisp; /* initialize the statusbar display */ @@ -1005,16 +1013,9 @@ crop_start (Tool *tool, } -/*******************************************************/ -/* Crop dialog functions */ -/*******************************************************/ - -static ActionAreaItem action_items[3] = -{ - { N_("Crop"), crop_crop_callback, NULL, NULL }, - { N_("Resize"), crop_resize_callback, NULL, NULL }, - { N_("Close"), crop_close_callback, NULL, NULL }, -}; +/***************************/ +/* Crop dialog functions */ +/***************************/ static void crop_info_create (Tool *tool) @@ -1024,6 +1025,13 @@ crop_info_create (Tool *tool) GtkWidget *bbox; GtkWidget *button; + static ActionAreaItem action_items[] = + { + { N_("Crop"), crop_crop_callback, NULL, NULL }, + { N_("Resize"), crop_resize_callback, NULL, NULL }, + { N_("Close"), crop_close_callback, NULL, NULL }, + }; + gdisp = (GDisplay *) tool->gdisp_ptr; /* create the info dialog */ @@ -1037,30 +1045,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_orig_changed, tool); + crop_orig_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (origin_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - orig_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - orig_vals[1]); - spinbutton = info_dialog_add_spinbutton (crop_info, _("Width:"), NULL, -1, 1, 1, 10, 1, 1, 2, NULL, NULL); size_sizeentry = @@ -1068,28 +1061,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_size_changed, tool); + crop_size_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (size_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 0, size_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 1, size_vals[1]); - gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 0, 0); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 1, 6); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 2, 0); @@ -1151,9 +1131,7 @@ crop_crop_callback (GtkWidget *w, crop_options->layer_only, TRUE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } static void @@ -1171,8 +1149,26 @@ crop_resize_callback (GtkWidget *w, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); + crop_close_callback (NULL, NULL); +} + +static void +crop_close_callback (GtkWidget *w, + gpointer client_data) +{ + Tool * tool; + Crop * crop; + + tool = active_tool; + crop = (Crop *) tool->private; + + if (tool->state == ACTIVE) + draw_core_stop (crop->core, tool); + info_dialog_popdown (crop_info); + + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->state = INACTIVE; } @@ -1442,19 +1438,6 @@ crop_colors_alpha (guchar *dummy, return FALSE; } -static void -crop_close_callback (GtkWidget *w, - gpointer client_data) -{ - Tool * tool; - - tool = active_tool; - - draw_core_stop (((Crop *) tool->private)->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; -} - static void crop_orig_changed (GtkWidget *w, gpointer data) @@ -1465,9 +1448,9 @@ crop_orig_changed (GtkWidget *w, int ox; int oy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; @@ -1498,9 +1481,9 @@ crop_size_changed (GtkWidget *w, int sx; int sy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; diff --git a/app/tools/curves.c b/app/tools/curves.c index 47385953b9..2c2453aff8 100644 --- a/app/tools/curves.c +++ b/app/tools/curves.c @@ -177,12 +177,17 @@ curves_button_press (Tool *tool, gdisp = gdisp_ptr; drawable = gimage_active_drawable (gdisp->gimage); + tool->gdisp_ptr = gdisp; + if (drawable != tool->drawable) { active_tool->preserve = TRUE; image_map_abort (curves_dialog->image_map); active_tool->preserve = FALSE; - curves_dialog->drawable = tool->drawable = drawable; + + tool->drawable = drawable; + + curves_dialog->drawable = drawable; curves_dialog->color = drawable_color (drawable); curves_dialog->image_map = image_map_create (gdisp, drawable); } @@ -380,6 +385,10 @@ tools_new_curves () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = curves_button_press; tool->button_release_func = curves_button_release; tool->motion_func = curves_motion; @@ -388,8 +397,6 @@ tools_new_curves () tool->cursor_update_func = curves_cursor_update; tool->control_func = curves_control; - tool->preserve = FALSE; - return tool; } @@ -471,12 +478,11 @@ curves_initialize (GDisplay *gdisp) gtk_widget_set_sensitive( channel_items[i].widget, FALSE); /* set the current selection */ - gtk_option_menu_set_history ( GTK_OPTION_MENU (curves_dialog->channel_menu), 0); + gtk_option_menu_set_history (GTK_OPTION_MENU (curves_dialog->channel_menu), 0); if (!GTK_WIDGET_VISIBLE (curves_dialog->shell)) gtk_widget_show (curves_dialog->shell); - curves_update (curves_dialog, GRAPH | DRAW); } @@ -1174,6 +1180,9 @@ curves_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -1192,9 +1201,12 @@ curves_cancel_callback (GtkWidget *widget, image_map_abort (cd->image_map); active_tool->preserve = FALSE; - cd->image_map = NULL; gdisplays_flush (); + cd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint diff --git a/app/tools/ellipse_select.c b/app/tools/ellipse_select.c index b29aaf955d..292326a2f4 100644 --- a/app/tools/ellipse_select.c +++ b/app/tools/ellipse_select.c @@ -136,6 +136,10 @@ tools_new_ellipse_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -143,7 +147,6 @@ tools_new_ellipse_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/flip_tool.c b/app/tools/flip_tool.c index 3727f13f63..0a313706aa 100644 --- a/app/tools/flip_tool.c +++ b/app/tools/flip_tool.c @@ -190,7 +190,6 @@ flip_cursor_update (Tool *tool, Tool * tools_new_flip () { - Tool * tool; TransformCore * private; @@ -205,9 +204,10 @@ tools_new_flip () private = tool->private; private->trans_func = flip_tool_transform; + private->trans_info[FLIP_INFO] = -1.0; + tool->modifier_key_func = flip_modifier_key_func; tool->cursor_update_func = flip_cursor_update; - private->trans_info[FLIP_INFO] = -1.0; return tool; } diff --git a/app/tools/free_select.c b/app/tools/free_select.c index 122a33f59b..c59a12ea7c 100644 --- a/app/tools/free_select.c +++ b/app/tools/free_select.c @@ -476,6 +476,10 @@ tools_new_free_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = free_select_button_press; tool->button_release_func = free_select_button_release; tool->motion_func = free_select_motion; @@ -483,7 +487,6 @@ tools_new_free_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = free_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/fuzzy_select.c b/app/tools/fuzzy_select.c index 21b82eaca8..4cf684855c 100644 --- a/app/tools/fuzzy_select.c +++ b/app/tools/fuzzy_select.c @@ -340,11 +340,13 @@ fuzzy_select_button_press (Tool *tool, GdkEventButton *bevent, fuzzy_sel->threshold = default_threshold; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; - tool->gdisp_ptr = gdisp_ptr; + tool->gdisp_ptr = gdisp; if (fuzzy_sel->op == SELECTION_MOVE_MASK) { @@ -385,10 +387,11 @@ fuzzy_select_button_release (Tool *tool, GdkEventButton *bevent, /* First take care of the case where the user "cancels" the action */ if (! (bevent->state & GDK_BUTTON3_MASK)) { - drawable = (fuzzy_options->sample_merged) ? NULL : gimage_active_drawable (gdisp->gimage); + drawable = ((fuzzy_options->sample_merged) ? + NULL : gimage_active_drawable (gdisp->gimage)); + fuzzy_select (gdisp->gimage, drawable, fuzzy_sel->op, fuzzy_options->feather, fuzzy_options->feather_radius); - gdisplays_flush (); /* adapt the threshold based on the final value of this use */ @@ -569,6 +572,10 @@ tools_new_fuzzy_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = fuzzy_select_button_press; tool->button_release_func = fuzzy_select_button_release; tool->motion_func = fuzzy_select_motion; diff --git a/app/tools/gimpairbrushtool.c b/app/tools/gimpairbrushtool.c index 10277fbb27..743522aea0 100644 --- a/app/tools/gimpairbrushtool.c +++ b/app/tools/gimpairbrushtool.c @@ -34,10 +34,10 @@ #include "libgimp/gimpintl.h" /* The maximum amount of pressure that can be exerted */ -#define MAX_PRESSURE 0.075 +#define MAX_PRESSURE 0.075 -#define OFF 0 -#define ON 1 +#define OFF 0 +#define ON 1 /* the airbrush structures */ diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c index 30f4fc25d7..f34e0e0cbd 100644 --- a/app/tools/gimpblendtool.c +++ b/app/tools/gimpblendtool.c @@ -1741,7 +1741,11 @@ tools_new_blend () tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = blend_button_press; tool->button_release_func = blend_button_release; @@ -1750,7 +1754,6 @@ tools_new_blend () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = blend_cursor_update; tool->control_func = blend_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/gimpbrightnesscontrasttool.c b/app/tools/gimpbrightnesscontrasttool.c index 08213db478..2a79ad95c5 100644 --- a/app/tools/gimpbrightnesscontrasttool.c +++ b/app/tools/gimpbrightnesscontrasttool.c @@ -112,6 +112,8 @@ brightness_contrast_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -186,6 +188,10 @@ tools_new_brightness_contrast () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = brightness_contrast_button_press; tool->button_release_func = brightness_contrast_button_release; tool->motion_func = brightness_contrast_motion; @@ -193,9 +199,6 @@ tools_new_brightness_contrast () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = brightness_contrast_cursor_update; tool->control_func = brightness_contrast_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -236,8 +239,8 @@ brightness_contrast_initialize (GDisplay *gdisp) brightness_contrast_dialog->contrast = 0.0; brightness_contrast_dialog->drawable = gimage_active_drawable (gdisp->gimage); - brightness_contrast_dialog->image_map = image_map_create (gdisp, - brightness_contrast_dialog->drawable); + brightness_contrast_dialog->image_map = + image_map_create (gdisp, brightness_contrast_dialog->drawable); brightness_contrast_update (brightness_contrast_dialog, ALL); } @@ -454,6 +457,9 @@ brightness_contrast_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; bcd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -485,6 +491,9 @@ brightness_contrast_cancel_callback (GtkWidget *widget, bcd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/gimpbucketfilltool.c b/app/tools/gimpbucketfilltool.c index eb67ceecd1..0868d90473 100644 --- a/app/tools/gimpbucketfilltool.c +++ b/app/tools/gimpbucketfilltool.c @@ -611,7 +611,11 @@ tools_new_bucket_fill (void) tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ tool->auto_snap_to = TRUE; - tool->private = private; + tool->private = (void *) private; + + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = bucket_fill_button_press; tool->button_release_func = bucket_fill_button_release; @@ -620,7 +624,6 @@ tools_new_bucket_fill (void) tool->modifier_key_func = bucket_fill_modifier_key_func; tool->cursor_update_func = bucket_fill_cursor_update; tool->control_func = bucket_fill_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/gimpbycolorselecttool.c b/app/tools/gimpbycolorselecttool.c index 70ba457a47..9e13e9460b 100644 --- a/app/tools/gimpbycolorselecttool.c +++ b/app/tools/gimpbycolorselecttool.c @@ -483,6 +483,10 @@ tools_new_by_color_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = by_color_select_button_press; tool->button_release_func = by_color_select_button_release; tool->motion_func = by_color_select_motion; @@ -490,9 +494,6 @@ tools_new_by_color_select () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = by_color_select_cursor_update; tool->control_func = by_color_select_control; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/gimpcolorbalancetool.c b/app/tools/gimpcolorbalancetool.c index 6b809c903a..a13ac248eb 100644 --- a/app/tools/gimpcolorbalancetool.c +++ b/app/tools/gimpcolorbalancetool.c @@ -157,6 +157,8 @@ color_balance_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -204,13 +206,7 @@ color_balance_control (Tool *tool, case HALT: if (color_balance_dialog) - { - active_tool->preserve = TRUE; - image_map_abort (color_balance_dialog->image_map); - active_tool->preserve = FALSE; - color_balance_dialog->image_map = NULL; - color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); - } + color_balance_cancel_callback (NULL, (gpointer) color_balance_dialog); break; default: @@ -237,18 +233,20 @@ tools_new_color_balance () tool->type = COLOR_BALANCE; tool->state = INACTIVE; tool->scroll_lock = 1; /* Disallow scrolling */ - tool->private = (void *) private; tool->auto_snap_to = TRUE; + tool->private = (void *) private; + + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = color_balance_button_press; tool->button_release_func = color_balance_button_release; tool->motion_func = color_balance_motion; - tool->arrow_keys_func = standard_arrow_keys_func; tool->modifier_key_func = standard_modifier_key_func; + tool->arrow_keys_func = standard_arrow_keys_func; + tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = color_balance_cursor_update; tool->control_func = color_balance_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -294,22 +292,18 @@ color_balance_initialize (GDisplay *gdisp) color_balance_dialog->yellow_blue[i] = 0.0; } color_balance_dialog->drawable = gimage_active_drawable (gdisp->gimage); - color_balance_dialog->image_map = image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_dialog->image_map = + image_map_create (gdisp, color_balance_dialog->drawable); + color_balance_update (color_balance_dialog, ALL); } -/****************************/ -/* Select by Color dialog */ -/****************************/ +/**************************/ +/* Color Balance dialog */ +/**************************/ /* the action area structure */ -static ActionAreaItem action_items[] = -{ - { N_("OK"), color_balance_ok_callback, NULL, NULL }, - { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } -}; - static ColorBalanceDialog * color_balance_new_dialog () { @@ -326,13 +320,21 @@ color_balance_new_dialog () GtkObject *data; GSList *group = NULL; int i; - char *appl_mode_names[3] = + + static ActionAreaItem action_items[] = + { + { N_("OK"), color_balance_ok_callback, NULL, NULL }, + { N_("Cancel"), color_balance_cancel_callback, NULL, NULL } + }; + + char *appl_mode_names[] = { N_("Shadows"), N_("Midtones"), N_("Highlights") }; - ActionCallback appl_mode_callbacks[3] = + + ActionCallback appl_mode_callbacks[] = { color_balance_shadows_callback, color_balance_midtones_callback, @@ -657,6 +659,9 @@ color_balance_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cbd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -684,10 +689,13 @@ color_balance_cancel_callback (GtkWidget *widget, active_tool->preserve = TRUE; image_map_abort (cbd->image_map); active_tool->preserve = FALSE; + gdisplays_flush (); + cbd->image_map = NULL; } - cbd->image_map = NULL; + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/gimpcroptool.c b/app/tools/gimpcroptool.c index 1e97b807a2..80d10f8bfe 100644 --- a/app/tools/gimpcroptool.c +++ b/app/tools/gimpcroptool.c @@ -113,7 +113,7 @@ static void crop_control (Tool *, ToolAction, gpointer); static void crop_arrow_keys_func (Tool *, GdkEventKey *, gpointer); static void crop_modifier_key_func (Tool *, GdkEventKey *, gpointer); -/* Crop helper functions */ +/* Crop helper functions */ static void crop_recalc (Tool *, Crop *); static void crop_start (Tool *, Crop *); static void crop_adjust_guides (GImage *, int, int, int, int); @@ -132,18 +132,18 @@ typedef enum { AUTO_CROP_COLOR = 2 } AutoCropType; -typedef guchar * (*GetColorFunc) (GtkObject *, int, int); -typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); +typedef guchar * (*GetColorFunc) (GtkObject *, int, int); +typedef AutoCropType (*ColorsEqualFunc) (guchar *, guchar *, int); -static void crop_selection_callback (GtkWidget *, gpointer); -static void crop_automatic_callback (GtkWidget *, gpointer); +static void crop_selection_callback (GtkWidget *, gpointer); +static void crop_automatic_callback (GtkWidget *, gpointer); static AutoCropType crop_guess_bgcolor (GtkObject *, GetColorFunc, int, int, int, int, guchar *); -static int crop_colors_equal (guchar *, guchar *, int); -static int crop_colors_alpha (guchar *, guchar *, int); +static int crop_colors_equal (guchar *, guchar *, int); +static int crop_colors_alpha (guchar *, guchar *, int); /* Crop dialog callback funtions */ -static void crop_orig_changed (GtkWidget *, gpointer); -static void crop_size_changed (GtkWidget *, gpointer); +static void crop_orig_changed (GtkWidget *, gpointer); +static void crop_size_changed (GtkWidget *, gpointer); /* Functions */ @@ -168,7 +168,7 @@ crop_options_new (void) GtkWidget *frame; gchar* type_label[2] = { N_("Crop"), N_("Resize") }; gint type_value[2] = { CROP_CROP, RESIZE_CROP }; - + /* the new crop tool options structure */ options = (CropOptions *) g_malloc (sizeof (CropOptions)); tool_options_init ((ToolOptions *) options, @@ -205,7 +205,7 @@ crop_options_new (void) gtk_widget_show (options->allow_enlarge_w); /* tool toggle */ - frame = tool_options_radio_buttons_new (N_("Tool Toggle"), + frame = tool_options_radio_buttons_new (_("Tool Toggle"), &options->type, options->type_w, type_label, @@ -218,7 +218,6 @@ crop_options_new (void) return options; } - static void crop_button_press (Tool *tool, GdkEventButton *bevent, @@ -230,10 +229,11 @@ crop_button_press (Tool *tool, gdisp = (GDisplay *) gdisp_ptr; crop = (Crop *) tool->private; - if (tool->state == INACTIVE) - crop->function = CREATING; - else if (gdisp_ptr != tool->gdisp_ptr) - crop->function = CREATING; + if (tool->state == INACTIVE || + gdisp_ptr != tool->gdisp_ptr) + { + crop->function = CREATING; + } else { /* If the cursor is in either the upper left or lower right boxes, @@ -268,6 +268,7 @@ crop_button_press (Tool *tool, draw_core_stop (crop->core, tool); tool->gdisp_ptr = gdisp_ptr; + tool->drawable = gimage_active_drawable (gdisp->gimage); gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &crop->tx1, &crop->ty1, TRUE, FALSE); @@ -283,7 +284,8 @@ crop_button_press (Tool *tool, crop->lasty = crop->starty; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -317,9 +319,7 @@ crop_button_release (Tool *tool, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } else crop_info_update (tool); @@ -671,18 +671,17 @@ crop_control (Tool *tool, switch (action) { - case PAUSE : + case PAUSE: draw_core_pause (crop->core, tool); break; - case RESUME : + case RESUME: crop_recalc (tool, crop); draw_core_resume (crop->core, tool); break; - case HALT : - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); + case HALT: + crop_close_callback (NULL, NULL); break; default: @@ -696,12 +695,12 @@ crop_draw (Tool *tool) Crop * crop; GDisplay * gdisp; -#define SRW 10 -#define SRH 10 - gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; +#define SRW 10 +#define SRH 10 + gdk_draw_line (crop->core->win, crop->core->gc, crop->x1, crop->y1, gdisp->disp_width, crop->y1); gdk_draw_line (crop->core->win, crop->core->gc, @@ -723,6 +722,9 @@ crop_draw (Tool *tool) gdk_draw_rectangle (crop->core->win, crop->core->gc, 1, crop->x1, crop->y2-crop->srh, crop->srw, crop->srh); +#undef SRW +#undef SRH + crop_info_update (tool); } @@ -752,6 +754,10 @@ tools_new_crop () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; /* XXX Check me */ + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = crop_button_press; tool->button_release_func = crop_button_release; tool->motion_func = crop_motion; @@ -759,7 +765,6 @@ tools_new_crop () tool->modifier_key_func = crop_modifier_key_func; tool->cursor_update_func = crop_cursor_update; tool->control_func = crop_control; - tool->preserve = TRUE; /* XXX Check me */ return tool; } @@ -777,10 +782,7 @@ tools_free_crop (Tool *tool) draw_core_free (crop->core); if (crop_info) - { - info_dialog_popdown (crop_info); - crop_info = NULL; - } + crop_close_callback (NULL, NULL); g_free (crop); } @@ -957,6 +959,9 @@ crop_start (Tool *tool, if (! crop_info) crop_info_create (tool); + gtk_signal_handler_block_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + gtk_signal_handler_block_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, gdisp->gimage->xresolution, FALSE); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, @@ -993,6 +998,9 @@ crop_start (Tool *tool, } } + gtk_signal_handler_unblock_by_data (GTK_OBJECT (size_sizeentry), crop_info); + gtk_signal_handler_unblock_by_data (GTK_OBJECT (origin_sizeentry), crop_info); + old_gdisp = gdisp; /* initialize the statusbar display */ @@ -1005,16 +1013,9 @@ crop_start (Tool *tool, } -/*******************************************************/ -/* Crop dialog functions */ -/*******************************************************/ - -static ActionAreaItem action_items[3] = -{ - { N_("Crop"), crop_crop_callback, NULL, NULL }, - { N_("Resize"), crop_resize_callback, NULL, NULL }, - { N_("Close"), crop_close_callback, NULL, NULL }, -}; +/***************************/ +/* Crop dialog functions */ +/***************************/ static void crop_info_create (Tool *tool) @@ -1024,6 +1025,13 @@ crop_info_create (Tool *tool) GtkWidget *bbox; GtkWidget *button; + static ActionAreaItem action_items[] = + { + { N_("Crop"), crop_crop_callback, NULL, NULL }, + { N_("Resize"), crop_resize_callback, NULL, NULL }, + { N_("Close"), crop_close_callback, NULL, NULL }, + }; + gdisp = (GDisplay *) tool->gdisp_ptr; /* create the info dialog */ @@ -1037,30 +1045,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_orig_changed, tool); + crop_orig_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (origin_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (origin_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 0, - orig_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (origin_sizeentry), 1, - orig_vals[1]); - spinbutton = info_dialog_add_spinbutton (crop_info, _("Width:"), NULL, -1, 1, 1, 10, 1, 1, 2, NULL, NULL); size_sizeentry = @@ -1068,28 +1061,15 @@ crop_info_create (Tool *tool) gdisp->dot_for_dot ? UNIT_PIXEL : gdisp->gimage->unit, "%a", TRUE, TRUE, FALSE, GIMP_SIZE_ENTRY_UPDATE_SIZE, - crop_size_changed, tool); + crop_size_changed, crop_info); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (size_sizeentry), GTK_SPIN_BUTTON (spinbutton), NULL); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 0, - gdisp->gimage->xresolution, FALSE); - gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (size_sizeentry), 1, - gdisp->gimage->yresolution, FALSE); - gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 0, -65536, 65536); gimp_size_entry_set_refval_boundaries (GIMP_SIZE_ENTRY (size_sizeentry), 1, -65536, 65536); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 0, - 0, gdisp->gimage->width); - gimp_size_entry_set_size (GIMP_SIZE_ENTRY (size_sizeentry), 1, - 0, gdisp->gimage->height); - - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 0, size_vals[0]); - gimp_size_entry_set_refval (GIMP_SIZE_ENTRY (size_sizeentry), 1, size_vals[1]); - gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 0, 0); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 1, 6); gtk_table_set_row_spacing (GTK_TABLE (crop_info->info_table), 2, 0); @@ -1151,9 +1131,7 @@ crop_crop_callback (GtkWidget *w, crop_options->layer_only, TRUE); /* Finish the tool */ - draw_core_stop (crop->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; + crop_close_callback (NULL, NULL); } static void @@ -1171,8 +1149,26 @@ crop_resize_callback (GtkWidget *w, crop_options->layer_only, FALSE); /* Finish the tool */ - draw_core_stop (crop->core, tool); + crop_close_callback (NULL, NULL); +} + +static void +crop_close_callback (GtkWidget *w, + gpointer client_data) +{ + Tool * tool; + Crop * crop; + + tool = active_tool; + crop = (Crop *) tool->private; + + if (tool->state == ACTIVE) + draw_core_stop (crop->core, tool); + info_dialog_popdown (crop_info); + + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->state = INACTIVE; } @@ -1442,19 +1438,6 @@ crop_colors_alpha (guchar *dummy, return FALSE; } -static void -crop_close_callback (GtkWidget *w, - gpointer client_data) -{ - Tool * tool; - - tool = active_tool; - - draw_core_stop (((Crop *) tool->private)->core, tool); - info_dialog_popdown (crop_info); - tool->state = INACTIVE; -} - static void crop_orig_changed (GtkWidget *w, gpointer data) @@ -1465,9 +1448,9 @@ crop_orig_changed (GtkWidget *w, int ox; int oy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; @@ -1498,9 +1481,9 @@ crop_size_changed (GtkWidget *w, int sx; int sy; - tool = (Tool *)data; + tool = active_tool; - if (tool) + if (tool && active_tool->type == CROP) { gdisp = (GDisplay *) tool->gdisp_ptr; crop = (Crop *) tool->private; diff --git a/app/tools/gimpcurvestool.c b/app/tools/gimpcurvestool.c index 47385953b9..2c2453aff8 100644 --- a/app/tools/gimpcurvestool.c +++ b/app/tools/gimpcurvestool.c @@ -177,12 +177,17 @@ curves_button_press (Tool *tool, gdisp = gdisp_ptr; drawable = gimage_active_drawable (gdisp->gimage); + tool->gdisp_ptr = gdisp; + if (drawable != tool->drawable) { active_tool->preserve = TRUE; image_map_abort (curves_dialog->image_map); active_tool->preserve = FALSE; - curves_dialog->drawable = tool->drawable = drawable; + + tool->drawable = drawable; + + curves_dialog->drawable = drawable; curves_dialog->color = drawable_color (drawable); curves_dialog->image_map = image_map_create (gdisp, drawable); } @@ -380,6 +385,10 @@ tools_new_curves () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = curves_button_press; tool->button_release_func = curves_button_release; tool->motion_func = curves_motion; @@ -388,8 +397,6 @@ tools_new_curves () tool->cursor_update_func = curves_cursor_update; tool->control_func = curves_control; - tool->preserve = FALSE; - return tool; } @@ -471,12 +478,11 @@ curves_initialize (GDisplay *gdisp) gtk_widget_set_sensitive( channel_items[i].widget, FALSE); /* set the current selection */ - gtk_option_menu_set_history ( GTK_OPTION_MENU (curves_dialog->channel_menu), 0); + gtk_option_menu_set_history (GTK_OPTION_MENU (curves_dialog->channel_menu), 0); if (!GTK_WIDGET_VISIBLE (curves_dialog->shell)) gtk_widget_show (curves_dialog->shell); - curves_update (curves_dialog, GRAPH | DRAW); } @@ -1174,6 +1180,9 @@ curves_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; cd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -1192,9 +1201,12 @@ curves_cancel_callback (GtkWidget *widget, image_map_abort (cd->image_map); active_tool->preserve = FALSE; - cd->image_map = NULL; gdisplays_flush (); + cd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint diff --git a/app/tools/gimpellipseselecttool.c b/app/tools/gimpellipseselecttool.c index b29aaf955d..292326a2f4 100644 --- a/app/tools/gimpellipseselecttool.c +++ b/app/tools/gimpellipseselecttool.c @@ -136,6 +136,10 @@ tools_new_ellipse_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -143,7 +147,6 @@ tools_new_ellipse_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/gimpfliptool.c b/app/tools/gimpfliptool.c index 3727f13f63..0a313706aa 100644 --- a/app/tools/gimpfliptool.c +++ b/app/tools/gimpfliptool.c @@ -190,7 +190,6 @@ flip_cursor_update (Tool *tool, Tool * tools_new_flip () { - Tool * tool; TransformCore * private; @@ -205,9 +204,10 @@ tools_new_flip () private = tool->private; private->trans_func = flip_tool_transform; + private->trans_info[FLIP_INFO] = -1.0; + tool->modifier_key_func = flip_modifier_key_func; tool->cursor_update_func = flip_cursor_update; - private->trans_info[FLIP_INFO] = -1.0; return tool; } diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c index 122a33f59b..c59a12ea7c 100644 --- a/app/tools/gimpfreeselecttool.c +++ b/app/tools/gimpfreeselecttool.c @@ -476,6 +476,10 @@ tools_new_free_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = free_select_button_press; tool->button_release_func = free_select_button_release; tool->motion_func = free_select_motion; @@ -483,7 +487,6 @@ tools_new_free_select (void) tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = free_select_control; - tool->preserve = TRUE; return tool; } diff --git a/app/tools/gimpfuzzyselecttool.c b/app/tools/gimpfuzzyselecttool.c index 21b82eaca8..4cf684855c 100644 --- a/app/tools/gimpfuzzyselecttool.c +++ b/app/tools/gimpfuzzyselecttool.c @@ -340,11 +340,13 @@ fuzzy_select_button_press (Tool *tool, GdkEventButton *bevent, fuzzy_sel->threshold = default_threshold; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; - tool->gdisp_ptr = gdisp_ptr; + tool->gdisp_ptr = gdisp; if (fuzzy_sel->op == SELECTION_MOVE_MASK) { @@ -385,10 +387,11 @@ fuzzy_select_button_release (Tool *tool, GdkEventButton *bevent, /* First take care of the case where the user "cancels" the action */ if (! (bevent->state & GDK_BUTTON3_MASK)) { - drawable = (fuzzy_options->sample_merged) ? NULL : gimage_active_drawable (gdisp->gimage); + drawable = ((fuzzy_options->sample_merged) ? + NULL : gimage_active_drawable (gdisp->gimage)); + fuzzy_select (gdisp->gimage, drawable, fuzzy_sel->op, fuzzy_options->feather, fuzzy_options->feather_radius); - gdisplays_flush (); /* adapt the threshold based on the final value of this use */ @@ -569,6 +572,10 @@ tools_new_fuzzy_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = fuzzy_select_button_press; tool->button_release_func = fuzzy_select_button_release; tool->motion_func = fuzzy_select_motion; diff --git a/app/tools/gimphistogramtool.c b/app/tools/gimphistogramtool.c index 168fcffb68..a67be924b5 100644 --- a/app/tools/gimphistogramtool.c +++ b/app/tools/gimphistogramtool.c @@ -15,9 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #include "config.h" -#include -#include + #include #include "appenv.h" #include "actionarea.h" @@ -89,7 +89,6 @@ histogram_tool_histogram_range (HistogramWidget *w, pixels = gimp_histogram_get_count(htd->hist, 0, 255); count = gimp_histogram_get_count(htd->hist, start, end); - htd->mean = gimp_histogram_get_mean(htd->hist, htd->channel, start, end); htd->std_dev = gimp_histogram_get_std_dev(htd->hist, htd->channel, start, end); @@ -110,34 +109,34 @@ histogram_tool_dialog_update (HistogramToolDialog *htd, char text[12]; /* mean */ - sprintf (text, "%3.1f", htd->mean); + g_snprintf (text, 12, "%3.1f", htd->mean); gtk_label_set_text (GTK_LABEL (htd->info_labels[0]), text); /* std dev */ - sprintf (text, "%3.1f", htd->std_dev); + g_snprintf (text, 12, "%3.1f", htd->std_dev); gtk_label_set_text (GTK_LABEL (htd->info_labels[1]), text); /* median */ - sprintf (text, "%3.1f", htd->median); + g_snprintf (text, 12, "%3.1f", htd->median); gtk_label_set_text (GTK_LABEL (htd->info_labels[2]), text); /* pixels */ - sprintf (text, "%8.1f", htd->pixels); + g_snprintf (text, 12, "%8.1f", htd->pixels); gtk_label_set_text (GTK_LABEL (htd->info_labels[3]), text); /* intensity */ if (start == end) - sprintf (text, "%d", start); + g_snprintf (text, 12, "%d", start); else - sprintf (text, "%d..%d", start, end); + g_snprintf (text, 12, "%d..%d", start, end); gtk_label_set_text (GTK_LABEL (htd->info_labels[4]), text); /* count */ - sprintf (text, "%8.1f", htd->count); + g_snprintf (text, 12, "%8.1f", htd->count); gtk_label_set_text (GTK_LABEL (htd->info_labels[5]), text); /* percentile */ - sprintf (text, "%2.2f", htd->percentile * 100); + g_snprintf (text, 12, "%2.2f", htd->percentile * 100); gtk_label_set_text (GTK_LABEL (htd->info_labels[6]), text); } @@ -151,6 +150,8 @@ histogram_tool_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -224,6 +225,10 @@ tools_new_histogram_tool () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = histogram_tool_button_press; tool->button_release_func = histogram_tool_button_release; tool->motion_func = histogram_tool_motion; @@ -232,8 +237,6 @@ tools_new_histogram_tool () tool->cursor_update_func = histogram_tool_cursor_update; tool->control_func = histogram_tool_control; - tool->preserve = FALSE; - return tool; } @@ -428,7 +431,7 @@ histogram_tool_new_dialog () static void histogram_tool_close_callback (GtkWidget *widget, - gpointer client_data) + gpointer client_data) { HistogramToolDialog *htd; diff --git a/app/tools/gimphuesaturationtool.c b/app/tools/gimphuesaturationtool.c index 16e1f8b615..1bf696479a 100644 --- a/app/tools/gimphuesaturationtool.c +++ b/app/tools/gimphuesaturationtool.c @@ -237,6 +237,8 @@ hue_saturation_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -310,6 +312,10 @@ tools_new_hue_saturation () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = hue_saturation_button_press; tool->button_release_func = hue_saturation_button_release; tool->motion_func = hue_saturation_motion; @@ -317,9 +323,6 @@ tools_new_hue_saturation () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = hue_saturation_cursor_update; tool->control_func = hue_saturation_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -744,6 +747,9 @@ hue_saturation_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; hsd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -772,9 +778,12 @@ hue_saturation_cancel_callback (GtkWidget *widget, image_map_abort (hsd->image_map); active_tool->preserve = FALSE; - hsd->image_map = NULL; gdisplays_flush (); + hsd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/gimpinktool.c b/app/tools/gimpinktool.c index 1fed084bf0..67e6a52839 100644 --- a/app/tools/gimpinktool.c +++ b/app/tools/gimpinktool.c @@ -1564,7 +1564,10 @@ tools_new_ink (void) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = ink_button_press; tool->button_release_func = ink_button_release; diff --git a/app/tools/gimpiscissorstool.c b/app/tools/gimpiscissorstool.c index d030405d2d..e0a209d672 100644 --- a/app/tools/gimpiscissorstool.c +++ b/app/tools/gimpiscissorstool.c @@ -431,8 +431,13 @@ tools_new_iscissors () tool->type = ISCISSORS; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ + tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = iscissors_button_press; tool->button_release_func = iscissors_button_release; tool->motion_func = iscissors_motion; @@ -440,8 +445,6 @@ tools_new_iscissors () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = iscissors_control; - tool->auto_snap_to = 0; - tool->preserve = TRUE; last_tool = tool; diff --git a/app/tools/gimplevelstool.c b/app/tools/gimplevelstool.c index 90d43d1891..04b35d0a6a 100644 --- a/app/tools/gimplevelstool.c +++ b/app/tools/gimplevelstool.c @@ -174,6 +174,8 @@ levels_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -247,6 +249,10 @@ tools_new_levels () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = levels_button_press; tool->button_release_func = levels_button_release; tool->motion_func = levels_motion; @@ -254,9 +260,6 @@ tools_new_levels () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = levels_cursor_update; tool->control_func = levels_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -971,6 +974,9 @@ levels_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; ld->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -999,10 +1005,12 @@ levels_cancel_callback (GtkWidget *widget, image_map_abort (ld->image_map); active_tool->preserve = FALSE; - ld->image_map = NULL; gdisplays_flush (); + ld->image_map = NULL; } + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/gimpmagnifytool.c b/app/tools/gimpmagnifytool.c index 5daf50bc6f..8201fa4186 100644 --- a/app/tools/gimpmagnifytool.c +++ b/app/tools/gimpmagnifytool.c @@ -372,6 +372,10 @@ tools_new_magnify (void) tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = magnify_button_press; tool->button_release_func = magnify_button_release; tool->motion_func = magnify_motion; diff --git a/app/tools/gimpmovetool.c b/app/tools/gimpmovetool.c index c09bfd0aa2..fbda598d26 100644 --- a/app/tools/gimpmovetool.c +++ b/app/tools/gimpmovetool.c @@ -447,12 +447,20 @@ tools_new_move_tool () tool = (Tool *) g_malloc (sizeof (Tool)); private = (MoveTool *) g_malloc (sizeof (MoveTool)); + private->layer = NULL; + private->guide = NULL; + private->disp = NULL; + tool->type = MOVE; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = move_tool_button_press; tool->button_release_func = move_tool_button_release; tool->motion_func = move_tool_motion; @@ -460,11 +468,6 @@ tools_new_move_tool () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = move_tool_cursor_update; tool->control_func = move_tool_control; - tool->preserve = TRUE; - - private->layer = NULL; - private->guide = NULL; - private->disp = NULL; return tool; } diff --git a/app/tools/gimpposterizetool.c b/app/tools/gimpposterizetool.c index a3a98d27e1..0847c35955 100644 --- a/app/tools/gimpposterizetool.c +++ b/app/tools/gimpposterizetool.c @@ -98,6 +98,8 @@ posterize_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -178,6 +180,10 @@ tools_new_posterize () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = posterize_button_press; tool->button_release_func = posterize_button_release; tool->motion_func = posterize_motion; @@ -186,10 +192,6 @@ tools_new_posterize () tool->cursor_update_func = posterize_cursor_update; tool->control_func = posterize_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - return tool; } @@ -200,7 +202,7 @@ tools_free_posterize (Tool *tool) post = (Posterize *) tool->private; - /* Close the color select dialog */ + /* Close the posterize dialog */ if (posterize_dialog) posterize_cancel_callback (NULL, (gpointer) posterize_dialog); @@ -222,8 +224,11 @@ posterize_initialize (GDisplay *gdisp) else if (!GTK_WIDGET_VISIBLE (posterize_dialog->shell)) gtk_widget_show (posterize_dialog->shell); + posterize_dialog->drawable = gimage_active_drawable (gdisp->gimage); - posterize_dialog->image_map = image_map_create (gdisp, posterize_dialog->drawable); + posterize_dialog->image_map = + image_map_create (gdisp, posterize_dialog->drawable); + if (posterize_dialog->preview) posterize_preview (posterize_dialog); } @@ -351,6 +356,9 @@ posterize_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; pd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -380,6 +388,9 @@ posterize_cancel_callback (GtkWidget *widget, pd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -418,4 +429,3 @@ posterize_levels_text_update (GtkWidget *w, posterize_preview (pd); } } - diff --git a/app/tools/gimprectselecttool.c b/app/tools/gimprectselecttool.c index da465c499a..4426403598 100644 --- a/app/tools/gimprectselecttool.c +++ b/app/tools/gimprectselecttool.c @@ -154,7 +154,8 @@ rect_select_button_press (Tool *tool, rect_sel->center = FALSE; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -447,8 +448,10 @@ rect_select_draw (Tool *tool) void -static selection_tool_update_op_state(RectSelect *rect_sel, int x, int y, int state, - GDisplay *gdisp) +static selection_tool_update_op_state (RectSelect *rect_sel, + int x, int y, + int state, + GDisplay *gdisp) { if (active_tool->state == ACTIVE) return; @@ -485,8 +488,8 @@ rect_select_cursor_update (Tool *tool, active = (active_tool->state == ACTIVE); rect_sel = (RectSelect*)tool->private; - selection_tool_update_op_state(rect_sel, mevent->x, mevent->y, - mevent->state, gdisp_ptr); + selection_tool_update_op_state (rect_sel, mevent->x, mevent->y, + mevent->state, gdisp_ptr); switch (rect_sel->op) { @@ -505,7 +508,7 @@ rect_select_cursor_update (Tool *tool, case SELECTION_MOVE_MASK: gdisplay_install_tool_cursor (gdisp, GDK_DIAMOND_CROSS); break; - case SELECTION_MOVE: + case SELECTION_MOVE: gdisplay_install_tool_cursor (gdisp, GDK_FLEUR); } } @@ -572,6 +575,10 @@ tools_new_rect_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -580,8 +587,6 @@ tools_new_rect_select () tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/tools/gimpregionselecttool.c b/app/tools/gimpregionselecttool.c index 21b82eaca8..4cf684855c 100644 --- a/app/tools/gimpregionselecttool.c +++ b/app/tools/gimpregionselecttool.c @@ -340,11 +340,13 @@ fuzzy_select_button_press (Tool *tool, GdkEventButton *bevent, fuzzy_sel->threshold = default_threshold; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | + GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; - tool->gdisp_ptr = gdisp_ptr; + tool->gdisp_ptr = gdisp; if (fuzzy_sel->op == SELECTION_MOVE_MASK) { @@ -385,10 +387,11 @@ fuzzy_select_button_release (Tool *tool, GdkEventButton *bevent, /* First take care of the case where the user "cancels" the action */ if (! (bevent->state & GDK_BUTTON3_MASK)) { - drawable = (fuzzy_options->sample_merged) ? NULL : gimage_active_drawable (gdisp->gimage); + drawable = ((fuzzy_options->sample_merged) ? + NULL : gimage_active_drawable (gdisp->gimage)); + fuzzy_select (gdisp->gimage, drawable, fuzzy_sel->op, fuzzy_options->feather, fuzzy_options->feather_radius); - gdisplays_flush (); /* adapt the threshold based on the final value of this use */ @@ -569,6 +572,10 @@ tools_new_fuzzy_select (void) tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = fuzzy_select_button_press; tool->button_release_func = fuzzy_select_button_release; tool->motion_func = fuzzy_select_motion; diff --git a/app/tools/gimprotatetool.c b/app/tools/gimprotatetool.c index cc459fce53..006b732c73 100644 --- a/app/tools/gimprotatetool.c +++ b/app/tools/gimprotatetool.c @@ -35,33 +35,33 @@ #include "libgimp/gimpintl.h" #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif /* M_PI */ /* index into trans_info array */ -#define ANGLE 0 -#define REAL_ANGLE 1 -#define CENTER_X 2 -#define CENTER_Y 3 +#define ANGLE 0 +#define REAL_ANGLE 1 +#define CENTER_X 2 +#define CENTER_Y 3 -#define EPSILON 0.018 /* ~ 1 degree */ -#define FIFTEEN_DEG (M_PI / 12.0) +#define EPSILON 0.018 /* ~ 1 degree */ +#define FIFTEEN_DEG (M_PI / 12.0) /* variables local to this file */ -static gdouble angle_val; -static gdouble center_vals[2]; +static gdouble angle_val; +static gdouble center_vals[2]; /* needed for size update */ -static GtkWidget *sizeentry; +static GtkWidget *sizeentry; /* forward function declarations */ -static void * rotate_tool_recalc (Tool *, void *); -static void rotate_tool_motion (Tool *, void *); -static void rotate_info_update (Tool *); +static void * rotate_tool_recalc (Tool *, void *); +static void rotate_tool_motion (Tool *, void *); +static void rotate_info_update (Tool *); /* callback functions for the info dialog sizeentries */ -static void rotate_angle_changed (GtkWidget *entry, gpointer data); -static void rotate_center_changed (GtkWidget *entry, gpointer data); +static void rotate_angle_changed (GtkWidget *entry, gpointer data); +static void rotate_center_changed (GtkWidget *entry, gpointer data); void * rotate_tool_transform (Tool *tool, diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c index c330e813ca..0a415aaf1b 100644 --- a/app/tools/gimptexttool.c +++ b/app/tools/gimptexttool.c @@ -251,6 +251,10 @@ tools_new_text () tool->auto_snap_to = TRUE; tool->private = (void *) the_text_tool; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = text_button_press; tool->button_release_func = text_button_release; tool->motion_func = text_motion; @@ -259,8 +263,6 @@ tools_new_text () tool->cursor_update_func = text_cursor_update; tool->control_func = text_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/tools/gimpthresholdtool.c b/app/tools/gimpthresholdtool.c index 3c336786fb..071cb04275 100644 --- a/app/tools/gimpthresholdtool.c +++ b/app/tools/gimpthresholdtool.c @@ -166,6 +166,8 @@ threshold_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -246,6 +248,10 @@ tools_new_threshold () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = threshold_button_press; tool->button_release_func = threshold_button_release; tool->motion_func = threshold_motion; @@ -254,8 +260,6 @@ tools_new_threshold () tool->cursor_update_func = threshold_cursor_update; tool->control_func = threshold_control; - tool->preserve = FALSE; - return tool; } @@ -291,16 +295,18 @@ threshold_initialize (GDisplay *gdisp) threshold_dialog->drawable = gimage_active_drawable (gdisp->gimage); threshold_dialog->color = drawable_color (threshold_dialog->drawable); - threshold_dialog->image_map = image_map_create (gdisp, threshold_dialog->drawable); + threshold_dialog->image_map = + image_map_create (gdisp, threshold_dialog->drawable); - gimp_histogram_calculate_drawable(threshold_dialog->hist, - threshold_dialog->drawable); + gimp_histogram_calculate_drawable (threshold_dialog->hist, + threshold_dialog->drawable); histogram_widget_update (threshold_dialog->histogram, threshold_dialog->hist); histogram_widget_range (threshold_dialog->histogram, threshold_dialog->low_threshold, threshold_dialog->high_threshold); + if (threshold_dialog->preview) threshold_preview (threshold_dialog); } @@ -453,6 +459,9 @@ threshold_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; td->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -484,6 +493,9 @@ threshold_cancel_callback (GtkWidget *widget, td->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/histogram_tool.c b/app/tools/histogram_tool.c index 168fcffb68..a67be924b5 100644 --- a/app/tools/histogram_tool.c +++ b/app/tools/histogram_tool.c @@ -15,9 +15,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #include "config.h" -#include -#include + #include #include "appenv.h" #include "actionarea.h" @@ -89,7 +89,6 @@ histogram_tool_histogram_range (HistogramWidget *w, pixels = gimp_histogram_get_count(htd->hist, 0, 255); count = gimp_histogram_get_count(htd->hist, start, end); - htd->mean = gimp_histogram_get_mean(htd->hist, htd->channel, start, end); htd->std_dev = gimp_histogram_get_std_dev(htd->hist, htd->channel, start, end); @@ -110,34 +109,34 @@ histogram_tool_dialog_update (HistogramToolDialog *htd, char text[12]; /* mean */ - sprintf (text, "%3.1f", htd->mean); + g_snprintf (text, 12, "%3.1f", htd->mean); gtk_label_set_text (GTK_LABEL (htd->info_labels[0]), text); /* std dev */ - sprintf (text, "%3.1f", htd->std_dev); + g_snprintf (text, 12, "%3.1f", htd->std_dev); gtk_label_set_text (GTK_LABEL (htd->info_labels[1]), text); /* median */ - sprintf (text, "%3.1f", htd->median); + g_snprintf (text, 12, "%3.1f", htd->median); gtk_label_set_text (GTK_LABEL (htd->info_labels[2]), text); /* pixels */ - sprintf (text, "%8.1f", htd->pixels); + g_snprintf (text, 12, "%8.1f", htd->pixels); gtk_label_set_text (GTK_LABEL (htd->info_labels[3]), text); /* intensity */ if (start == end) - sprintf (text, "%d", start); + g_snprintf (text, 12, "%d", start); else - sprintf (text, "%d..%d", start, end); + g_snprintf (text, 12, "%d..%d", start, end); gtk_label_set_text (GTK_LABEL (htd->info_labels[4]), text); /* count */ - sprintf (text, "%8.1f", htd->count); + g_snprintf (text, 12, "%8.1f", htd->count); gtk_label_set_text (GTK_LABEL (htd->info_labels[5]), text); /* percentile */ - sprintf (text, "%2.2f", htd->percentile * 100); + g_snprintf (text, 12, "%2.2f", htd->percentile * 100); gtk_label_set_text (GTK_LABEL (htd->info_labels[6]), text); } @@ -151,6 +150,8 @@ histogram_tool_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -224,6 +225,10 @@ tools_new_histogram_tool () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = histogram_tool_button_press; tool->button_release_func = histogram_tool_button_release; tool->motion_func = histogram_tool_motion; @@ -232,8 +237,6 @@ tools_new_histogram_tool () tool->cursor_update_func = histogram_tool_cursor_update; tool->control_func = histogram_tool_control; - tool->preserve = FALSE; - return tool; } @@ -428,7 +431,7 @@ histogram_tool_new_dialog () static void histogram_tool_close_callback (GtkWidget *widget, - gpointer client_data) + gpointer client_data) { HistogramToolDialog *htd; diff --git a/app/tools/hue_saturation.c b/app/tools/hue_saturation.c index 16e1f8b615..1bf696479a 100644 --- a/app/tools/hue_saturation.c +++ b/app/tools/hue_saturation.c @@ -237,6 +237,8 @@ hue_saturation_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -310,6 +312,10 @@ tools_new_hue_saturation () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = hue_saturation_button_press; tool->button_release_func = hue_saturation_button_release; tool->motion_func = hue_saturation_motion; @@ -317,9 +323,6 @@ tools_new_hue_saturation () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = hue_saturation_cursor_update; tool->control_func = hue_saturation_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -744,6 +747,9 @@ hue_saturation_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; hsd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -772,9 +778,12 @@ hue_saturation_cancel_callback (GtkWidget *widget, image_map_abort (hsd->image_map); active_tool->preserve = FALSE; - hsd->image_map = NULL; gdisplays_flush (); + hsd->image_map = NULL; } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/ink.c b/app/tools/ink.c index 1fed084bf0..67e6a52839 100644 --- a/app/tools/ink.c +++ b/app/tools/ink.c @@ -1564,7 +1564,10 @@ tools_new_ink (void) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = ink_button_press; tool->button_release_func = ink_button_release; diff --git a/app/tools/iscissors.c b/app/tools/iscissors.c index d030405d2d..e0a209d672 100644 --- a/app/tools/iscissors.c +++ b/app/tools/iscissors.c @@ -431,8 +431,13 @@ tools_new_iscissors () tool->type = ISCISSORS; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ + tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = iscissors_button_press; tool->button_release_func = iscissors_button_release; tool->motion_func = iscissors_motion; @@ -440,8 +445,6 @@ tools_new_iscissors () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = rect_select_cursor_update; tool->control_func = iscissors_control; - tool->auto_snap_to = 0; - tool->preserve = TRUE; last_tool = tool; diff --git a/app/tools/levels.c b/app/tools/levels.c index 90d43d1891..04b35d0a6a 100644 --- a/app/tools/levels.c +++ b/app/tools/levels.c @@ -174,6 +174,8 @@ levels_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -247,6 +249,10 @@ tools_new_levels () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = levels_button_press; tool->button_release_func = levels_button_release; tool->motion_func = levels_motion; @@ -254,9 +260,6 @@ tools_new_levels () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = levels_cursor_update; tool->control_func = levels_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; return tool; } @@ -971,6 +974,9 @@ levels_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; ld->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -999,10 +1005,12 @@ levels_cancel_callback (GtkWidget *widget, image_map_abort (ld->image_map); active_tool->preserve = FALSE; - ld->image_map = NULL; gdisplays_flush (); + ld->image_map = NULL; } + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/magnify.c b/app/tools/magnify.c index 5daf50bc6f..8201fa4186 100644 --- a/app/tools/magnify.c +++ b/app/tools/magnify.c @@ -372,6 +372,10 @@ tools_new_magnify (void) tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = magnify_button_press; tool->button_release_func = magnify_button_release; tool->motion_func = magnify_motion; diff --git a/app/tools/move.c b/app/tools/move.c index c09bfd0aa2..fbda598d26 100644 --- a/app/tools/move.c +++ b/app/tools/move.c @@ -447,12 +447,20 @@ tools_new_move_tool () tool = (Tool *) g_malloc (sizeof (Tool)); private = (MoveTool *) g_malloc (sizeof (MoveTool)); + private->layer = NULL; + private->guide = NULL; + private->disp = NULL; + tool->type = MOVE; tool->state = INACTIVE; tool->scroll_lock = 0; /* Allow scrolling */ tool->auto_snap_to = FALSE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = move_tool_button_press; tool->button_release_func = move_tool_button_release; tool->motion_func = move_tool_motion; @@ -460,11 +468,6 @@ tools_new_move_tool () tool->modifier_key_func = standard_modifier_key_func; tool->cursor_update_func = move_tool_cursor_update; tool->control_func = move_tool_control; - tool->preserve = TRUE; - - private->layer = NULL; - private->guide = NULL; - private->disp = NULL; return tool; } diff --git a/app/tools/paint_core.c b/app/tools/paint_core.c index 246cbaa53f..5f7a6243ad 100644 --- a/app/tools/paint_core.c +++ b/app/tools/paint_core.c @@ -529,7 +529,10 @@ paint_core_new (int type) tool->auto_snap_to = TRUE; tool->gdisp_ptr = NULL; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = paint_core_button_press; tool->button_release_func = paint_core_button_release; diff --git a/app/tools/posterize.c b/app/tools/posterize.c index a3a98d27e1..0847c35955 100644 --- a/app/tools/posterize.c +++ b/app/tools/posterize.c @@ -98,6 +98,8 @@ posterize_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -178,6 +180,10 @@ tools_new_posterize () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = posterize_button_press; tool->button_release_func = posterize_button_release; tool->motion_func = posterize_motion; @@ -186,10 +192,6 @@ tools_new_posterize () tool->cursor_update_func = posterize_cursor_update; tool->control_func = posterize_control; - tool->preserve = FALSE; - tool->gdisp_ptr = NULL; - tool->drawable = NULL; - return tool; } @@ -200,7 +202,7 @@ tools_free_posterize (Tool *tool) post = (Posterize *) tool->private; - /* Close the color select dialog */ + /* Close the posterize dialog */ if (posterize_dialog) posterize_cancel_callback (NULL, (gpointer) posterize_dialog); @@ -222,8 +224,11 @@ posterize_initialize (GDisplay *gdisp) else if (!GTK_WIDGET_VISIBLE (posterize_dialog->shell)) gtk_widget_show (posterize_dialog->shell); + posterize_dialog->drawable = gimage_active_drawable (gdisp->gimage); - posterize_dialog->image_map = image_map_create (gdisp, posterize_dialog->drawable); + posterize_dialog->image_map = + image_map_create (gdisp, posterize_dialog->drawable); + if (posterize_dialog->preview) posterize_preview (posterize_dialog); } @@ -351,6 +356,9 @@ posterize_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; pd->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -380,6 +388,9 @@ posterize_cancel_callback (GtkWidget *widget, pd->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void @@ -418,4 +429,3 @@ posterize_levels_text_update (GtkWidget *w, posterize_preview (pd); } } - diff --git a/app/tools/rect_select.c b/app/tools/rect_select.c index da465c499a..4426403598 100644 --- a/app/tools/rect_select.c +++ b/app/tools/rect_select.c @@ -154,7 +154,8 @@ rect_select_button_press (Tool *tool, rect_sel->center = FALSE; gdk_pointer_grab (gdisp->canvas->window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, NULL, NULL, bevent->time); tool->state = ACTIVE; @@ -447,8 +448,10 @@ rect_select_draw (Tool *tool) void -static selection_tool_update_op_state(RectSelect *rect_sel, int x, int y, int state, - GDisplay *gdisp) +static selection_tool_update_op_state (RectSelect *rect_sel, + int x, int y, + int state, + GDisplay *gdisp) { if (active_tool->state == ACTIVE) return; @@ -485,8 +488,8 @@ rect_select_cursor_update (Tool *tool, active = (active_tool->state == ACTIVE); rect_sel = (RectSelect*)tool->private; - selection_tool_update_op_state(rect_sel, mevent->x, mevent->y, - mevent->state, gdisp_ptr); + selection_tool_update_op_state (rect_sel, mevent->x, mevent->y, + mevent->state, gdisp_ptr); switch (rect_sel->op) { @@ -505,7 +508,7 @@ rect_select_cursor_update (Tool *tool, case SELECTION_MOVE_MASK: gdisplay_install_tool_cursor (gdisp, GDK_DIAMOND_CROSS); break; - case SELECTION_MOVE: + case SELECTION_MOVE: gdisplay_install_tool_cursor (gdisp, GDK_FLEUR); } } @@ -572,6 +575,10 @@ tools_new_rect_select () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = rect_select_button_press; tool->button_release_func = rect_select_button_release; tool->motion_func = rect_select_motion; @@ -580,8 +587,6 @@ tools_new_rect_select () tool->cursor_update_func = rect_select_cursor_update; tool->control_func = rect_select_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/tools/rotate_tool.c b/app/tools/rotate_tool.c index cc459fce53..006b732c73 100644 --- a/app/tools/rotate_tool.c +++ b/app/tools/rotate_tool.c @@ -35,33 +35,33 @@ #include "libgimp/gimpintl.h" #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif /* M_PI */ /* index into trans_info array */ -#define ANGLE 0 -#define REAL_ANGLE 1 -#define CENTER_X 2 -#define CENTER_Y 3 +#define ANGLE 0 +#define REAL_ANGLE 1 +#define CENTER_X 2 +#define CENTER_Y 3 -#define EPSILON 0.018 /* ~ 1 degree */ -#define FIFTEEN_DEG (M_PI / 12.0) +#define EPSILON 0.018 /* ~ 1 degree */ +#define FIFTEEN_DEG (M_PI / 12.0) /* variables local to this file */ -static gdouble angle_val; -static gdouble center_vals[2]; +static gdouble angle_val; +static gdouble center_vals[2]; /* needed for size update */ -static GtkWidget *sizeentry; +static GtkWidget *sizeentry; /* forward function declarations */ -static void * rotate_tool_recalc (Tool *, void *); -static void rotate_tool_motion (Tool *, void *); -static void rotate_info_update (Tool *); +static void * rotate_tool_recalc (Tool *, void *); +static void rotate_tool_motion (Tool *, void *); +static void rotate_info_update (Tool *); /* callback functions for the info dialog sizeentries */ -static void rotate_angle_changed (GtkWidget *entry, gpointer data); -static void rotate_center_changed (GtkWidget *entry, gpointer data); +static void rotate_angle_changed (GtkWidget *entry, gpointer data); +static void rotate_center_changed (GtkWidget *entry, gpointer data); void * rotate_tool_transform (Tool *tool, diff --git a/app/tools/text_tool.c b/app/tools/text_tool.c index c330e813ca..0a415aaf1b 100644 --- a/app/tools/text_tool.c +++ b/app/tools/text_tool.c @@ -251,6 +251,10 @@ tools_new_text () tool->auto_snap_to = TRUE; tool->private = (void *) the_text_tool; + tool->preserve = TRUE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = text_button_press; tool->button_release_func = text_button_release; tool->motion_func = text_motion; @@ -259,8 +263,6 @@ tools_new_text () tool->cursor_update_func = text_cursor_update; tool->control_func = text_control; - tool->preserve = TRUE; - return tool; } diff --git a/app/tools/threshold.c b/app/tools/threshold.c index 3c336786fb..071cb04275 100644 --- a/app/tools/threshold.c +++ b/app/tools/threshold.c @@ -166,6 +166,8 @@ threshold_button_press (Tool *tool, GDisplay *gdisp; gdisp = gdisp_ptr; + + tool->gdisp_ptr = gdisp; tool->drawable = gimage_active_drawable (gdisp->gimage); } @@ -246,6 +248,10 @@ tools_new_threshold () tool->auto_snap_to = TRUE; tool->private = (void *) private; + tool->preserve = FALSE; + tool->gdisp_ptr = NULL; + tool->drawable = NULL; + tool->button_press_func = threshold_button_press; tool->button_release_func = threshold_button_release; tool->motion_func = threshold_motion; @@ -254,8 +260,6 @@ tools_new_threshold () tool->cursor_update_func = threshold_cursor_update; tool->control_func = threshold_control; - tool->preserve = FALSE; - return tool; } @@ -291,16 +295,18 @@ threshold_initialize (GDisplay *gdisp) threshold_dialog->drawable = gimage_active_drawable (gdisp->gimage); threshold_dialog->color = drawable_color (threshold_dialog->drawable); - threshold_dialog->image_map = image_map_create (gdisp, threshold_dialog->drawable); + threshold_dialog->image_map = + image_map_create (gdisp, threshold_dialog->drawable); - gimp_histogram_calculate_drawable(threshold_dialog->hist, - threshold_dialog->drawable); + gimp_histogram_calculate_drawable (threshold_dialog->hist, + threshold_dialog->drawable); histogram_widget_update (threshold_dialog->histogram, threshold_dialog->hist); histogram_widget_range (threshold_dialog->histogram, threshold_dialog->low_threshold, threshold_dialog->high_threshold); + if (threshold_dialog->preview) threshold_preview (threshold_dialog); } @@ -453,6 +459,9 @@ threshold_ok_callback (GtkWidget *widget, active_tool->preserve = FALSE; td->image_map = NULL; + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static gint @@ -484,6 +493,9 @@ threshold_cancel_callback (GtkWidget *widget, td->image_map = NULL; gdisplays_flush (); } + + active_tool->gdisp_ptr = NULL; + active_tool->drawable = NULL; } static void diff --git a/app/tools/tools.c b/app/tools/tools.c index 84135825be..37de4c3761 100644 --- a/app/tools/tools.c +++ b/app/tools/tools.c @@ -605,7 +605,7 @@ active_tool_free (void) return; tools_options_hide (active_tool->type); - + (* tool_info[(int) active_tool->type].free_func) (active_tool); g_free (active_tool); @@ -636,37 +636,25 @@ void tools_initialize (ToolType type, GDisplay *gdisp) { - if (active_tool) - active_tool_free (); + /* Tools which have an init function have dialogs and + * cannot be initialized without a display + */ + if (tool_info[(int) type].init_func && !gdisp) + type = RECT_SELECT; + + /* Activate the appropriate widget. + * Implicitly calls tools_select() + */ + tools_select (type); - /* If you're wondering... only these dialog type tools have init functions */ if (tool_info[(int) type].init_func) { - if (gdisp) - { - active_tool = (* tool_info[(int) type].new_func) (); - (* tool_info[(int) type].init_func) (gdisp); - } - else - { - active_tool = tools_new_rect_select (); - } - } - else - { - active_tool = (* tool_info[(int) type].new_func) (); + (* tool_info[(int) type].init_func) (gdisp); + + active_tool->drawable = gimage_active_drawable (gdisp->gimage); } - tools_options_show (active_tool->type); - - /* Set the paused count variable to 0 */ - active_tool->paused_count = 0; - active_tool->gdisp_ptr = gdisp; - active_tool->drawable = NULL; - active_tool->ID = global_tool_ID++; - - if (gdisp) - active_tool->drawable = gimage_active_drawable (gdisp->gimage); + /* don't set gdisp_ptr here !!! (see commands.c) */ } void diff --git a/app/tools/transform_core.c b/app/tools/transform_core.c index 7dc06aca83..ab05aad6e9 100644 --- a/app/tools/transform_core.c +++ b/app/tools/transform_core.c @@ -42,10 +42,10 @@ #include "libgimp/gimpintl.h" -#define SQR(x) ((x) * (x)) +#define SQR(x) ((x) * (x)) #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif /* M_PI */ /* variables */ @@ -115,7 +115,7 @@ static ActionAreaItem action_items[] = { NULL, transform_ok_callback, NULL, NULL }, { N_("Reset"), transform_reset_callback, NULL, NULL }, }; -static gint naction_items = sizeof (action_items) / sizeof (action_items[0]); +static gint n_action_items = sizeof (action_items) / sizeof (action_items[0]); static const char *action_labels[] = { @@ -133,6 +133,7 @@ transform_core_button_press (Tool *tool, TransformCore * transform_core; GDisplay * gdisp; Layer * layer; + GimpDrawable * drawable; int dist; int closest_dist; int x, y; @@ -144,7 +145,7 @@ transform_core_button_press (Tool *tool, transform_core->bpressed = TRUE; /* ALT */ - tool->drawable = gimage_active_drawable (gdisp->gimage); + drawable = gimage_active_drawable (gdisp->gimage); if (transform_core->function == CREATING && tool->state == ACTIVE) { @@ -157,7 +158,7 @@ transform_core_button_press (Tool *tool, * check to make sure that the display which currently owns the * tool is the one which just received the button pressed event */ - if ((gdisp_ptr == tool->gdisp_ptr) && transform_core->interactive) + if ((gdisp == tool->gdisp_ptr) && transform_core->interactive) { /* start drawing the bounding box and handles... */ draw_core_start (transform_core->core, gdisp->canvas->window, tool); @@ -211,35 +212,35 @@ transform_core_button_press (Tool *tool, return; } - /* Initialisation stuff: if the cursor is clicked inside the current * selection, show the bounding box and handles... */ gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); if ((layer = gimage_get_active_layer (gdisp->gimage))) { - drawable_offsets (GIMP_DRAWABLE(layer), &off_x, &off_y); + drawable_offsets (GIMP_DRAWABLE (layer), &off_x, &off_y); if (x >= off_x && y >= off_y && x < (off_x + drawable_width (GIMP_DRAWABLE(layer))) && y < (off_y + drawable_height (GIMP_DRAWABLE(layer)))) if (gimage_mask_is_empty (gdisp->gimage) || gimage_mask_value (gdisp->gimage, x, y)) { - if (layer->mask != NULL && GIMP_DRAWABLE(layer->mask)) + if (layer->mask != NULL && GIMP_DRAWABLE (layer->mask)) { g_message (_("Transformations do not work on\nlayers that contain layer masks.")); tool->state = INACTIVE; return; } - + /* If the tool is already active, clear the current state * and reset */ if (tool->state == ACTIVE) transform_core_reset (tool, gdisp_ptr); - - /* Set the pointer to the gdisplay that owns this tool */ - tool->gdisp_ptr = gdisp_ptr; + + /* Set the pointer to the active display */ + tool->gdisp_ptr = gdisp; + tool->drawable = drawable; tool->state = ACTIVE; - + /* Grab the pointer if we're in non-interactive mode */ if (!transform_core->interactive) gdk_pointer_grab (gdisp->canvas->window, FALSE, @@ -247,7 +248,7 @@ transform_core_button_press (Tool *tool, GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), NULL, NULL, bevent->time); - + /* Find the transform bounds for some tools (like scale, * perspective) that actually need the bounds for * initializing */ @@ -256,23 +257,23 @@ transform_core_button_press (Tool *tool, /* Calculate the grid line endpoints */ if (transform_tool_show_grid ()) transform_core_setup_grid (tool); - + /* Initialize the transform tool */ (* transform_core->trans_func) (tool, gdisp_ptr, INIT); - + if (transform_info != NULL && !transform_info_inited) { action_items[0].label = action_labels[tool->type - ROTATE]; action_items[0].user_data = tool; action_items[1].user_data = tool; build_action_area (GTK_DIALOG (transform_info->shell), - action_items, naction_items, 0); + action_items, n_action_items, 0); transform_info_inited = TRUE; } /* Recalculate the transform tool */ transform_core_recalc (tool, gdisp_ptr); - + /* recall this function to find which handle we're dragging */ if (transform_core->interactive) transform_core_button_press (tool, bevent, gdisp_ptr); @@ -717,7 +718,9 @@ transform_core_new (int type, tool->auto_snap_to = TRUE; tool->private = (void *) private; - tool->preserve = FALSE; /* Destroy when the image is dirtied. */ + tool->preserve = FALSE; /* Destroy when the image is dirtied */ + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = transform_core_button_press; tool->button_release_func = transform_core_button_release; @@ -829,8 +832,10 @@ transform_core_reset (Tool *tool, transform_core->function = CREATING; draw_core_stop (transform_core->core, tool); info_dialog_popdown (transform_info); + tool->state = INACTIVE; tool->gdisp_ptr = NULL; + tool->drawable = NULL; } static int diff --git a/app/tools/transform_tool.c b/app/tools/transform_tool.c index e9a8e95041..3daaf53cec 100644 --- a/app/tools/transform_tool.c +++ b/app/tools/transform_tool.c @@ -65,7 +65,6 @@ struct _TransformOptions int showpath; int showpath_d; GtkWidget *showpath_w; - }; @@ -74,7 +73,7 @@ static TransformOptions *transform_options = NULL; /* local functions */ -static void transform_change_type (int); +static void transform_change_type (int); /* functions */ @@ -107,9 +106,9 @@ transform_show_path_update (GtkWidget *widget, return; } - transform_core_showpath_changed(1); /* pause */ + transform_core_showpath_changed (1); /* pause */ tool_options_toggle_update (widget, data); - transform_core_showpath_changed(0); /* resume */ + transform_core_showpath_changed (0); /* resume */ } static void @@ -192,6 +191,7 @@ transform_options_new (void) N_("Shearing"), N_("Perspective") }; + static const char *direction_button_names[] = { N_("Traditional"), @@ -201,7 +201,7 @@ transform_options_new (void) /* the new transform tool options structure */ options = (TransformOptions *) g_malloc (sizeof (TransformOptions)); tool_options_init ((ToolOptions *) options, - N_("Transform Tool Options"), + _("Transform Tool Options"), transform_options_reset); options->type = options->type_d = ROTATE; options->smoothing = options->smoothing_d = TRUE; diff --git a/app/transform_core.c b/app/transform_core.c index 7dc06aca83..ab05aad6e9 100644 --- a/app/transform_core.c +++ b/app/transform_core.c @@ -42,10 +42,10 @@ #include "libgimp/gimpintl.h" -#define SQR(x) ((x) * (x)) +#define SQR(x) ((x) * (x)) #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif /* M_PI */ /* variables */ @@ -115,7 +115,7 @@ static ActionAreaItem action_items[] = { NULL, transform_ok_callback, NULL, NULL }, { N_("Reset"), transform_reset_callback, NULL, NULL }, }; -static gint naction_items = sizeof (action_items) / sizeof (action_items[0]); +static gint n_action_items = sizeof (action_items) / sizeof (action_items[0]); static const char *action_labels[] = { @@ -133,6 +133,7 @@ transform_core_button_press (Tool *tool, TransformCore * transform_core; GDisplay * gdisp; Layer * layer; + GimpDrawable * drawable; int dist; int closest_dist; int x, y; @@ -144,7 +145,7 @@ transform_core_button_press (Tool *tool, transform_core->bpressed = TRUE; /* ALT */ - tool->drawable = gimage_active_drawable (gdisp->gimage); + drawable = gimage_active_drawable (gdisp->gimage); if (transform_core->function == CREATING && tool->state == ACTIVE) { @@ -157,7 +158,7 @@ transform_core_button_press (Tool *tool, * check to make sure that the display which currently owns the * tool is the one which just received the button pressed event */ - if ((gdisp_ptr == tool->gdisp_ptr) && transform_core->interactive) + if ((gdisp == tool->gdisp_ptr) && transform_core->interactive) { /* start drawing the bounding box and handles... */ draw_core_start (transform_core->core, gdisp->canvas->window, tool); @@ -211,35 +212,35 @@ transform_core_button_press (Tool *tool, return; } - /* Initialisation stuff: if the cursor is clicked inside the current * selection, show the bounding box and handles... */ gdisplay_untransform_coords (gdisp, bevent->x, bevent->y, &x, &y, FALSE, FALSE); if ((layer = gimage_get_active_layer (gdisp->gimage))) { - drawable_offsets (GIMP_DRAWABLE(layer), &off_x, &off_y); + drawable_offsets (GIMP_DRAWABLE (layer), &off_x, &off_y); if (x >= off_x && y >= off_y && x < (off_x + drawable_width (GIMP_DRAWABLE(layer))) && y < (off_y + drawable_height (GIMP_DRAWABLE(layer)))) if (gimage_mask_is_empty (gdisp->gimage) || gimage_mask_value (gdisp->gimage, x, y)) { - if (layer->mask != NULL && GIMP_DRAWABLE(layer->mask)) + if (layer->mask != NULL && GIMP_DRAWABLE (layer->mask)) { g_message (_("Transformations do not work on\nlayers that contain layer masks.")); tool->state = INACTIVE; return; } - + /* If the tool is already active, clear the current state * and reset */ if (tool->state == ACTIVE) transform_core_reset (tool, gdisp_ptr); - - /* Set the pointer to the gdisplay that owns this tool */ - tool->gdisp_ptr = gdisp_ptr; + + /* Set the pointer to the active display */ + tool->gdisp_ptr = gdisp; + tool->drawable = drawable; tool->state = ACTIVE; - + /* Grab the pointer if we're in non-interactive mode */ if (!transform_core->interactive) gdk_pointer_grab (gdisp->canvas->window, FALSE, @@ -247,7 +248,7 @@ transform_core_button_press (Tool *tool, GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), NULL, NULL, bevent->time); - + /* Find the transform bounds for some tools (like scale, * perspective) that actually need the bounds for * initializing */ @@ -256,23 +257,23 @@ transform_core_button_press (Tool *tool, /* Calculate the grid line endpoints */ if (transform_tool_show_grid ()) transform_core_setup_grid (tool); - + /* Initialize the transform tool */ (* transform_core->trans_func) (tool, gdisp_ptr, INIT); - + if (transform_info != NULL && !transform_info_inited) { action_items[0].label = action_labels[tool->type - ROTATE]; action_items[0].user_data = tool; action_items[1].user_data = tool; build_action_area (GTK_DIALOG (transform_info->shell), - action_items, naction_items, 0); + action_items, n_action_items, 0); transform_info_inited = TRUE; } /* Recalculate the transform tool */ transform_core_recalc (tool, gdisp_ptr); - + /* recall this function to find which handle we're dragging */ if (transform_core->interactive) transform_core_button_press (tool, bevent, gdisp_ptr); @@ -717,7 +718,9 @@ transform_core_new (int type, tool->auto_snap_to = TRUE; tool->private = (void *) private; - tool->preserve = FALSE; /* Destroy when the image is dirtied. */ + tool->preserve = FALSE; /* Destroy when the image is dirtied */ + tool->gdisp_ptr = NULL; + tool->drawable = NULL; tool->button_press_func = transform_core_button_press; tool->button_release_func = transform_core_button_release; @@ -829,8 +832,10 @@ transform_core_reset (Tool *tool, transform_core->function = CREATING; draw_core_stop (transform_core->core, tool); info_dialog_popdown (transform_info); + tool->state = INACTIVE; tool->gdisp_ptr = NULL; + tool->drawable = NULL; } static int diff --git a/app/transform_tool.c b/app/transform_tool.c index e9a8e95041..3daaf53cec 100644 --- a/app/transform_tool.c +++ b/app/transform_tool.c @@ -65,7 +65,6 @@ struct _TransformOptions int showpath; int showpath_d; GtkWidget *showpath_w; - }; @@ -74,7 +73,7 @@ static TransformOptions *transform_options = NULL; /* local functions */ -static void transform_change_type (int); +static void transform_change_type (int); /* functions */ @@ -107,9 +106,9 @@ transform_show_path_update (GtkWidget *widget, return; } - transform_core_showpath_changed(1); /* pause */ + transform_core_showpath_changed (1); /* pause */ tool_options_toggle_update (widget, data); - transform_core_showpath_changed(0); /* resume */ + transform_core_showpath_changed (0); /* resume */ } static void @@ -192,6 +191,7 @@ transform_options_new (void) N_("Shearing"), N_("Perspective") }; + static const char *direction_button_names[] = { N_("Traditional"), @@ -201,7 +201,7 @@ transform_options_new (void) /* the new transform tool options structure */ options = (TransformOptions *) g_malloc (sizeof (TransformOptions)); tool_options_init ((ToolOptions *) options, - N_("Transform Tool Options"), + _("Transform Tool Options"), transform_options_reset); options->type = options->type_d = ROTATE; options->smoothing = options->smoothing_d = TRUE;