diff --git a/ChangeLog b/ChangeLog index fb67b958c4..708b5dda94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2000-04-06 Michael Natterer + + * app/commands.c + * app/layers_dialog.c + * app/resize.[ch]: behave like a widget: + removed resize_widget_free() and call + gtk_widget_destroy(resize->resize_shell) instead. + + * app/interface.c: s/0/FALSE/ + + * app/color_area.c + * libgimp/gimpchainbutton.c: show the correct background also for + engine driven themes. The chainbutton's lines still don't draw + with the pixmap theme, which is probably a bug of the theme's + draw_polygon method. + 2000-04-06 Sven Neumann * app/gimage_cmds.c diff --git a/app/actions/help-commands.c b/app/actions/help-commands.c index ab95b1d4a2..743c180f5d 100644 --- a/app/actions/help-commands.c +++ b/app/actions/help-commands.c @@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); static void image_scale_callback (GtkWidget *, gpointer); -static void image_cancel_callback (GtkWidget *, gpointer); static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit, gpointer); static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, @@ -806,6 +805,7 @@ image_resize_cmd_callback (GtkWidget *widget, image_resize->resize = resize_widget_new (ResizeWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_resize_callback, - image_cancel_callback, + NULL, image_resize); + gtk_signal_connect_object (GTK_OBJECT (image_resize->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_resize); + gtk_widget_show (image_resize->resize->resize_shell); } @@ -837,6 +842,7 @@ image_scale_cmd_callback (GtkWidget *widget, image_scale->resize = resize_widget_new (ScaleWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_scale_callback, - image_cancel_callback, + NULL, image_scale); + gtk_signal_connect_object (GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_scale); + gtk_widget_show (image_scale->resize->resize_shell); } @@ -1307,7 +1318,7 @@ image_resize_callback (GtkWidget *widget, } } - resize_widget_free (image_resize->resize); + gtk_widget_destroy (image_resize->resize->resize_shell); g_free (image_resize); } @@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget, { ImageResize *image_scale = NULL; - g_assert((image_scale = (ImageResize *) client_data) != NULL); - g_assert(image_scale->gimage != NULL); - - if(TRUE == resize_check_layer_scaling(image_scale)) + g_assert ((image_scale = (ImageResize *) client_data) != NULL); + g_assert (image_scale->gimage != NULL); + + if (TRUE == resize_check_layer_scaling (image_scale)) { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } } -static void -image_cancel_callback (GtkWidget *widget, - gpointer client_data) -{ - ImageResize *image_scale; - - image_scale = (ImageResize *) client_data; - - resize_widget_free (image_scale->resize); - g_free (image_scale); -} - static void gimage_mask_feather_callback (GtkWidget *widget, gdouble size, diff --git a/app/color_area.c b/app/color_area.c index baf1c27fef..2ed0908c93 100644 --- a/app/color_area.c +++ b/app/color_area.c @@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget, return FALSE; } +static void +color_area_realize (GtkWidget *widget, + gpointer data) +{ + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); +} + GtkWidget * color_area_create (gint width, gint height, @@ -458,6 +466,10 @@ color_area_create (gint width, GTK_SIGNAL_FUNC (color_area_events), NULL); + gtk_signal_connect (GTK_OBJECT (color_area), "realize", + GTK_SIGNAL_FUNC (color_area_realize), + NULL); + default_pixmap = default_pmap; default_mask = default_msk; diff --git a/app/commands.c b/app/commands.c index ab95b1d4a2..743c180f5d 100644 --- a/app/commands.c +++ b/app/commands.c @@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); static void image_scale_callback (GtkWidget *, gpointer); -static void image_cancel_callback (GtkWidget *, gpointer); static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit, gpointer); static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, @@ -806,6 +805,7 @@ image_resize_cmd_callback (GtkWidget *widget, image_resize->resize = resize_widget_new (ResizeWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_resize_callback, - image_cancel_callback, + NULL, image_resize); + gtk_signal_connect_object (GTK_OBJECT (image_resize->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_resize); + gtk_widget_show (image_resize->resize->resize_shell); } @@ -837,6 +842,7 @@ image_scale_cmd_callback (GtkWidget *widget, image_scale->resize = resize_widget_new (ScaleWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_scale_callback, - image_cancel_callback, + NULL, image_scale); + gtk_signal_connect_object (GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_scale); + gtk_widget_show (image_scale->resize->resize_shell); } @@ -1307,7 +1318,7 @@ image_resize_callback (GtkWidget *widget, } } - resize_widget_free (image_resize->resize); + gtk_widget_destroy (image_resize->resize->resize_shell); g_free (image_resize); } @@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget, { ImageResize *image_scale = NULL; - g_assert((image_scale = (ImageResize *) client_data) != NULL); - g_assert(image_scale->gimage != NULL); - - if(TRUE == resize_check_layer_scaling(image_scale)) + g_assert ((image_scale = (ImageResize *) client_data) != NULL); + g_assert (image_scale->gimage != NULL); + + if (TRUE == resize_check_layer_scaling (image_scale)) { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } } -static void -image_cancel_callback (GtkWidget *widget, - gpointer client_data) -{ - ImageResize *image_scale; - - image_scale = (ImageResize *) client_data; - - resize_widget_free (image_scale->resize); - g_free (image_scale); -} - static void gimage_mask_feather_callback (GtkWidget *widget, gdouble size, diff --git a/app/dialogs/resize-dialog.c b/app/dialogs/resize-dialog.c index 70be6042cd..bfd9066f78 100644 --- a/app/dialogs/resize-dialog.c +++ b/app/dialogs/resize-dialog.c @@ -15,8 +15,8 @@ * 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 "config.h" + #include "appenv.h" #include "gdisplay.h" #include "resize.h" @@ -26,12 +26,14 @@ #include "libgimp/gimpchainbutton.h" #include "libgimp/gimplimits.h" +#include "libgimp/gimpmath.h" #include "libgimp/gimpsizeentry.h" + #include "libgimp/gimpintl.h" -#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK +#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK #define DRAWING_AREA_SIZE 200 -#define TEXT_WIDTH 35 +#define TEXT_WIDTH 35 typedef struct _ResizePrivate ResizePrivate; @@ -56,9 +58,6 @@ struct _ResizePrivate GtkWidget *resolution_se; GtkWidget *equal_res; - GtkObject *object; - guint object_destroy_handler; - gdouble ratio; gint old_width, old_height; gdouble old_res_x, old_res_y; @@ -85,6 +84,7 @@ Resize * resize_widget_new (ResizeType type, ResizeTarget target, GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -112,25 +112,25 @@ resize_widget_new (ResizeType type, alignment = NULL; frame = NULL; - resize = g_new (Resize, 1); private = g_new (ResizePrivate, 1); - resize->type = type; - resize->target = target; + private->old_width = width; + private->old_height = height; + private->old_res_x = resolution_x; + private->old_res_y = resolution_y; + + resize = g_new (Resize, 1); + resize->type = type; + resize->target = target; resize->private_part = private; - resize->width = width; - resize->height = height; + resize->width = width; + resize->height = height; resize->resolution_x = resolution_x; resize->resolution_y = resolution_y; - resize->unit = unit; - resize->ratio_x = 1.0; - resize->ratio_y = 1.0; - resize->offset_x = 0; - resize->offset_y = 0; - private->old_width = width; - private->old_height = height; - private->old_res_x = resolution_x; - private->old_res_y = resolution_y; - private->object = NULL; + resize->unit = unit; + resize->ratio_x = 1.0; + resize->ratio_y = 1.0; + resize->offset_x = 0; + resize->offset_y = 0; /* Get the image width and height variables, based on the gimage */ if (width > height) @@ -192,21 +192,33 @@ resize_widget_new (ResizeType type, _("OK"), ok_cb, user_data, NULL, NULL, TRUE, FALSE, - _("Cancel"), cancel_cb, - user_data, NULL, NULL, FALSE, TRUE, - + _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy, + cancel_cb ? user_data : NULL, + cancel_cb ? NULL : (gpointer) 1, + NULL, FALSE, TRUE, + NULL); + + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) private); + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) resize); } /* handle the image disappearing under our feet */ - if (object) + if (object && signal) { - const gchar *signame; - - signame = (target == ResizeLayer) ? "removed" : "destroy"; - private->object = object; - private->object_destroy_handler = - gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); + if (cancel_cb) + gtk_signal_connect (GTK_OBJECT (object), signal, + cancel_cb, + user_data); + else + gtk_signal_connect_object_while_alive + (GTK_OBJECT (object), signal, + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (resize->resize_shell)); } /* the main vbox */ @@ -638,28 +650,14 @@ resize_widget_new (ResizeType type, return resize; } -void -resize_widget_free (Resize *resize) -{ - ResizePrivate *private = resize->private_part; - - if (private->object) - gtk_signal_disconnect (GTK_OBJECT (private->object), - private->object_destroy_handler); - - gtk_widget_destroy (resize->resize_shell); - g_free (resize->private_part); - g_free (resize); -} - static void resize_draw (Resize *resize) { GtkWidget *widget; ResizePrivate *private; - int aw, ah; - int x, y; - int w, h; + gint aw, ah; + gint x, y; + gint w, h; /* Only need to draw if it's a resize widget */ if (resize->type != ResizeWidget) @@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget, /*** Resize sanity checks ***/ -void resize_scale_implement (ImageResize *image_scale) +void +resize_scale_implement (ImageResize *image_scale) { GImage *gimage = NULL; gboolean rulers_flush = FALSE; @@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale) } } -static -void resize_scale_warn_callback (GtkWidget *widget, - gboolean do_scale, - gpointer client_data) +static void +resize_scale_warn_callback (GtkWidget *widget, + gboolean do_scale, + gpointer client_data) { ImageResize *image_scale = NULL; GImage *gimage = NULL; - g_assert(client_data != NULL); + g_assert (client_data != NULL); image_scale = (ImageResize *) client_data; gimage = image_scale->gimage; - g_assert(gimage != NULL); + g_assert (gimage != NULL); - if(do_scale == TRUE) /* User doesn't mind losing layers... */ + if (do_scale == TRUE) /* User doesn't mind losing layers... */ { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } else gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); @@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale) GSList *list = NULL; Layer *layer = NULL; GtkWidget *dialog = NULL; - gchar *str = NULL; - g_assert(image_scale != NULL); + g_assert (image_scale != NULL); - if(NULL != (gimage = image_scale->gimage)) + if (NULL != (gimage = image_scale->gimage)) { /* Step through layers; test scaled dimensions. */ success = TRUE; list = gimage->layers; - while(list && success == TRUE) + while (list && success == TRUE) { layer = (Layer *)list->data; success = layer_check_scaling (layer, @@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale) } /* Warn user on failure */ - if(success == FALSE) + if (success == FALSE) { gtk_widget_set_sensitive (image_scale->resize->resize_shell, FALSE); - str = g_strdup (_("The chosen image size will shrink\n" - "some layers completely away.\nIs this what you want?")); - dialog = gimp_query_boolean_box (_("Layer Too Small"), gimp_standard_help_func, "dialogs/scale_layer_warn.html", FALSE, - str, + _("The chosen image size will shrink\n" + "some layers completely away.\n" + "Is this what you want?"), _("OK"), _("Cancel"), - NULL, NULL, + GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", resize_scale_warn_callback, image_scale); - - g_free (str); gtk_widget_show (dialog); } } diff --git a/app/dialogs/resize-dialog.h b/app/dialogs/resize-dialog.h index d2e9fc2c6b..327bf4c103 100644 --- a/app/dialogs/resize-dialog.h +++ b/app/dialogs/resize-dialog.h @@ -37,7 +37,6 @@ typedef struct _Resize Resize; struct _Resize { - /* The calling procedure is respondible for showing this widget */ GtkWidget *resize_shell; ResizeType type; @@ -66,13 +65,18 @@ typedef struct GimpImage *gimage; } ImageResize; -/* If resolution_x is zero, then don't show resolution modification - * parts of the dialog. If object is non-NULL, then attach the cancel - * callback to its destroy signal. */ +/* If resolution_x is zero, then don't show resolution modification + * parts of the dialog. + * + * If object and signal are non-NULL, then attach the cancel callback to signal. + * + * If cancel_callback is NULL, then the dialog will be destroyed on "Cancel". + */ Resize * resize_widget_new (ResizeType type, ResizeTarget target, - GtkObject * object, + GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type, GtkSignalFunc ok_cb, GtkSignalFunc cancel_cb, gpointer user_data); -void resize_widget_free (Resize * resize); /* Layer scaling sanity check and warning dialogs */ -gboolean resize_check_layer_scaling (ImageResize *); -void resize_scale_implement (ImageResize *); +gboolean resize_check_layer_scaling (ImageResize *image_resize); +void resize_scale_implement (ImageResize *image_resize); #endif /* __RESIZE_H__ */ diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index 4b563e0d8a..8b7d47d28c 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp, } gtk_widget_realize (gdisp->canvas); - gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, 0); + gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, FALSE); /* we need to realize the cursor_label widget here, so the size gets * computed correctly diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 4b563e0d8a..8b7d47d28c 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp, } gtk_widget_realize (gdisp->canvas); - gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, 0); + gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, FALSE); /* we need to realize the cursor_label widget here, so the size gets * computed correctly diff --git a/app/gui/color-area.c b/app/gui/color-area.c index baf1c27fef..2ed0908c93 100644 --- a/app/gui/color-area.c +++ b/app/gui/color-area.c @@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget, return FALSE; } +static void +color_area_realize (GtkWidget *widget, + gpointer data) +{ + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); +} + GtkWidget * color_area_create (gint width, gint height, @@ -458,6 +466,10 @@ color_area_create (gint width, GTK_SIGNAL_FUNC (color_area_events), NULL); + gtk_signal_connect (GTK_OBJECT (color_area), "realize", + GTK_SIGNAL_FUNC (color_area_realize), + NULL); + default_pixmap = default_pmap; default_mask = default_msk; diff --git a/app/gui/commands.c b/app/gui/commands.c index ab95b1d4a2..743c180f5d 100644 --- a/app/gui/commands.c +++ b/app/gui/commands.c @@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); static void image_scale_callback (GtkWidget *, gpointer); -static void image_cancel_callback (GtkWidget *, gpointer); static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit, gpointer); static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, @@ -806,6 +805,7 @@ image_resize_cmd_callback (GtkWidget *widget, image_resize->resize = resize_widget_new (ResizeWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_resize_callback, - image_cancel_callback, + NULL, image_resize); + gtk_signal_connect_object (GTK_OBJECT (image_resize->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_resize); + gtk_widget_show (image_resize->resize->resize_shell); } @@ -837,6 +842,7 @@ image_scale_cmd_callback (GtkWidget *widget, image_scale->resize = resize_widget_new (ScaleWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_scale_callback, - image_cancel_callback, + NULL, image_scale); + gtk_signal_connect_object (GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_scale); + gtk_widget_show (image_scale->resize->resize_shell); } @@ -1307,7 +1318,7 @@ image_resize_callback (GtkWidget *widget, } } - resize_widget_free (image_resize->resize); + gtk_widget_destroy (image_resize->resize->resize_shell); g_free (image_resize); } @@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget, { ImageResize *image_scale = NULL; - g_assert((image_scale = (ImageResize *) client_data) != NULL); - g_assert(image_scale->gimage != NULL); - - if(TRUE == resize_check_layer_scaling(image_scale)) + g_assert ((image_scale = (ImageResize *) client_data) != NULL); + g_assert (image_scale->gimage != NULL); + + if (TRUE == resize_check_layer_scaling (image_scale)) { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } } -static void -image_cancel_callback (GtkWidget *widget, - gpointer client_data) -{ - ImageResize *image_scale; - - image_scale = (ImageResize *) client_data; - - resize_widget_free (image_scale->resize); - g_free (image_scale); -} - static void gimage_mask_feather_callback (GtkWidget *widget, gdouble size, diff --git a/app/gui/help-commands.c b/app/gui/help-commands.c index ab95b1d4a2..743c180f5d 100644 --- a/app/gui/help-commands.c +++ b/app/gui/help-commands.c @@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean); /* local functions */ static void image_resize_callback (GtkWidget *, gpointer); static void image_scale_callback (GtkWidget *, gpointer); -static void image_cancel_callback (GtkWidget *, gpointer); static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit, gpointer); static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, @@ -806,6 +805,7 @@ image_resize_cmd_callback (GtkWidget *widget, image_resize->resize = resize_widget_new (ResizeWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_resize_callback, - image_cancel_callback, + NULL, image_resize); + gtk_signal_connect_object (GTK_OBJECT (image_resize->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_resize); + gtk_widget_show (image_resize->resize->resize_shell); } @@ -837,6 +842,7 @@ image_scale_cmd_callback (GtkWidget *widget, image_scale->resize = resize_widget_new (ScaleWidget, ResizeImage, GTK_OBJECT (gimage), + "destroy", gimage->width, gimage->height, gimage->xresolution, @@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget, gimage->unit, gdisp->dot_for_dot, image_scale_callback, - image_cancel_callback, + NULL, image_scale); + gtk_signal_connect_object (GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) image_scale); + gtk_widget_show (image_scale->resize->resize_shell); } @@ -1307,7 +1318,7 @@ image_resize_callback (GtkWidget *widget, } } - resize_widget_free (image_resize->resize); + gtk_widget_destroy (image_resize->resize->resize_shell); g_free (image_resize); } @@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget, { ImageResize *image_scale = NULL; - g_assert((image_scale = (ImageResize *) client_data) != NULL); - g_assert(image_scale->gimage != NULL); - - if(TRUE == resize_check_layer_scaling(image_scale)) + g_assert ((image_scale = (ImageResize *) client_data) != NULL); + g_assert (image_scale->gimage != NULL); + + if (TRUE == resize_check_layer_scaling (image_scale)) { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } } -static void -image_cancel_callback (GtkWidget *widget, - gpointer client_data) -{ - ImageResize *image_scale; - - image_scale = (ImageResize *) client_data; - - resize_widget_free (image_scale->resize); - g_free (image_scale); -} - static void gimage_mask_feather_callback (GtkWidget *widget, gdouble size, diff --git a/app/gui/layers-dialog.c b/app/gui/layers-dialog.c index cd15a88ee4..b5d72e7d8a 100644 --- a/app/gui/layers-dialog.c +++ b/app/gui/layers-dialog.c @@ -1148,7 +1148,7 @@ layers_dialog_set_active_layer (Layer *layer) layer_widget->list_item); gtk_object_set_user_data (GTK_OBJECT (layer_widget->list_item), layer_widget); - + layers_dialog_scroll_index (index); } @@ -2616,7 +2616,6 @@ layer_widget_button_events (GtkWidget *widget, { layer_widget_exclusive_visible (layer_widget); } - else { GIMP_DRAWABLE (layer_widget->layer)->visible = @@ -3073,17 +3072,20 @@ layer_widget_eye_redraw (LayerWidget *layer_widget) { eye_pixmap[NORMAL] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_NORMAL], &layer_widget->eye_widget->style->white); eye_pixmap[SELECTED] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_SELECTED], &layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]); eye_pixmap[INSENSITIVE] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_INSENSITIVE], &layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]); } @@ -3233,13 +3235,15 @@ layer_widget_layer_flush (GtkWidget *widget, /* Set sensitivity */ /* to false if there is a floating selection, and this aint it */ - if (! layer_is_floating_sel (layer_widget->layer) && layersD->floating_sel != NULL) + if (! layer_is_floating_sel (layer_widget->layer) && + layersD->floating_sel != NULL) { if (GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item)) gtk_widget_set_sensitive (layer_widget->list_item, FALSE); } /* to true if there is a floating selection, and this is it */ - if (layer_is_floating_sel (layer_widget->layer) && layersD->floating_sel != NULL) + if (layer_is_floating_sel (layer_widget->layer) && + layersD->floating_sel != NULL) { if (! GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item)) gtk_widget_set_sensitive (layer_widget->list_item, TRUE); @@ -3779,25 +3783,13 @@ scale_layer_query_ok_callback (GtkWidget *widget, gdisplays_flush (); } - resize_widget_free (options->resize); - g_free (options); + gtk_widget_destroy (options->resize->resize_shell); } else g_message (_("Invalid width or height.\n" "Both must be positive.")); } -static void -scale_layer_query_cancel_callback (GtkWidget *widget, - gpointer data) -{ - ScaleLayerOptions *options; - options = (ScaleLayerOptions *) data; - - resize_widget_free (options->resize); - g_free (options); -} - static void layers_dialog_scale_layer_query (GimpImage *gimage, Layer *layer) @@ -3810,16 +3802,22 @@ layers_dialog_scale_layer_query (GimpImage *gimage, options->resize = resize_widget_new (ScaleWidget, ResizeLayer, GTK_OBJECT (layer), - drawable_width (GIMP_DRAWABLE(layer)), - drawable_height (GIMP_DRAWABLE(layer)), + "removed", + drawable_width (GIMP_DRAWABLE (layer)), + drawable_height (GIMP_DRAWABLE (layer)), gimage->xresolution, gimage->yresolution, gimage->unit, TRUE, scale_layer_query_ok_callback, - scale_layer_query_cancel_callback, + NULL, options); + gtk_signal_connect_object (GTK_OBJECT (options->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) options); + gtk_widget_show (options->resize->resize_shell); } @@ -3867,25 +3865,13 @@ resize_layer_query_ok_callback (GtkWidget *widget, gdisplays_flush (); } - resize_widget_free (options->resize); - g_free (options); + gtk_widget_destroy (options->resize->resize_shell); } else g_message (_("Invalid width or height.\n" "Both must be positive.")); } -static void -resize_layer_query_cancel_callback (GtkWidget *widget, - gpointer data) -{ - ResizeLayerOptions *options; - options = (ResizeLayerOptions *) data; - - resize_widget_free (options->resize); - g_free (options); -} - static void layers_dialog_resize_layer_query (GimpImage *gimage, Layer *layer) @@ -3898,16 +3884,22 @@ layers_dialog_resize_layer_query (GimpImage *gimage, options->resize = resize_widget_new (ResizeWidget, ResizeLayer, GTK_OBJECT (layer), - drawable_width (GIMP_DRAWABLE(layer)), - drawable_height (GIMP_DRAWABLE(layer)), + "removed", + drawable_width (GIMP_DRAWABLE (layer)), + drawable_height (GIMP_DRAWABLE (layer)), gimage->xresolution, gimage->yresolution, gimage->unit, TRUE, resize_layer_query_ok_callback, - resize_layer_query_cancel_callback, + NULL, options); + gtk_signal_connect_object (GTK_OBJECT (options->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) options); + gtk_widget_show (options->resize->resize_shell); } diff --git a/app/gui/resize-dialog.c b/app/gui/resize-dialog.c index 70be6042cd..bfd9066f78 100644 --- a/app/gui/resize-dialog.c +++ b/app/gui/resize-dialog.c @@ -15,8 +15,8 @@ * 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 "config.h" + #include "appenv.h" #include "gdisplay.h" #include "resize.h" @@ -26,12 +26,14 @@ #include "libgimp/gimpchainbutton.h" #include "libgimp/gimplimits.h" +#include "libgimp/gimpmath.h" #include "libgimp/gimpsizeentry.h" + #include "libgimp/gimpintl.h" -#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK +#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK #define DRAWING_AREA_SIZE 200 -#define TEXT_WIDTH 35 +#define TEXT_WIDTH 35 typedef struct _ResizePrivate ResizePrivate; @@ -56,9 +58,6 @@ struct _ResizePrivate GtkWidget *resolution_se; GtkWidget *equal_res; - GtkObject *object; - guint object_destroy_handler; - gdouble ratio; gint old_width, old_height; gdouble old_res_x, old_res_y; @@ -85,6 +84,7 @@ Resize * resize_widget_new (ResizeType type, ResizeTarget target, GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -112,25 +112,25 @@ resize_widget_new (ResizeType type, alignment = NULL; frame = NULL; - resize = g_new (Resize, 1); private = g_new (ResizePrivate, 1); - resize->type = type; - resize->target = target; + private->old_width = width; + private->old_height = height; + private->old_res_x = resolution_x; + private->old_res_y = resolution_y; + + resize = g_new (Resize, 1); + resize->type = type; + resize->target = target; resize->private_part = private; - resize->width = width; - resize->height = height; + resize->width = width; + resize->height = height; resize->resolution_x = resolution_x; resize->resolution_y = resolution_y; - resize->unit = unit; - resize->ratio_x = 1.0; - resize->ratio_y = 1.0; - resize->offset_x = 0; - resize->offset_y = 0; - private->old_width = width; - private->old_height = height; - private->old_res_x = resolution_x; - private->old_res_y = resolution_y; - private->object = NULL; + resize->unit = unit; + resize->ratio_x = 1.0; + resize->ratio_y = 1.0; + resize->offset_x = 0; + resize->offset_y = 0; /* Get the image width and height variables, based on the gimage */ if (width > height) @@ -192,21 +192,33 @@ resize_widget_new (ResizeType type, _("OK"), ok_cb, user_data, NULL, NULL, TRUE, FALSE, - _("Cancel"), cancel_cb, - user_data, NULL, NULL, FALSE, TRUE, - + _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy, + cancel_cb ? user_data : NULL, + cancel_cb ? NULL : (gpointer) 1, + NULL, FALSE, TRUE, + NULL); + + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) private); + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) resize); } /* handle the image disappearing under our feet */ - if (object) + if (object && signal) { - const gchar *signame; - - signame = (target == ResizeLayer) ? "removed" : "destroy"; - private->object = object; - private->object_destroy_handler = - gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); + if (cancel_cb) + gtk_signal_connect (GTK_OBJECT (object), signal, + cancel_cb, + user_data); + else + gtk_signal_connect_object_while_alive + (GTK_OBJECT (object), signal, + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (resize->resize_shell)); } /* the main vbox */ @@ -638,28 +650,14 @@ resize_widget_new (ResizeType type, return resize; } -void -resize_widget_free (Resize *resize) -{ - ResizePrivate *private = resize->private_part; - - if (private->object) - gtk_signal_disconnect (GTK_OBJECT (private->object), - private->object_destroy_handler); - - gtk_widget_destroy (resize->resize_shell); - g_free (resize->private_part); - g_free (resize); -} - static void resize_draw (Resize *resize) { GtkWidget *widget; ResizePrivate *private; - int aw, ah; - int x, y; - int w, h; + gint aw, ah; + gint x, y; + gint w, h; /* Only need to draw if it's a resize widget */ if (resize->type != ResizeWidget) @@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget, /*** Resize sanity checks ***/ -void resize_scale_implement (ImageResize *image_scale) +void +resize_scale_implement (ImageResize *image_scale) { GImage *gimage = NULL; gboolean rulers_flush = FALSE; @@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale) } } -static -void resize_scale_warn_callback (GtkWidget *widget, - gboolean do_scale, - gpointer client_data) +static void +resize_scale_warn_callback (GtkWidget *widget, + gboolean do_scale, + gpointer client_data) { ImageResize *image_scale = NULL; GImage *gimage = NULL; - g_assert(client_data != NULL); + g_assert (client_data != NULL); image_scale = (ImageResize *) client_data; gimage = image_scale->gimage; - g_assert(gimage != NULL); + g_assert (gimage != NULL); - if(do_scale == TRUE) /* User doesn't mind losing layers... */ + if (do_scale == TRUE) /* User doesn't mind losing layers... */ { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } else gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); @@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale) GSList *list = NULL; Layer *layer = NULL; GtkWidget *dialog = NULL; - gchar *str = NULL; - g_assert(image_scale != NULL); + g_assert (image_scale != NULL); - if(NULL != (gimage = image_scale->gimage)) + if (NULL != (gimage = image_scale->gimage)) { /* Step through layers; test scaled dimensions. */ success = TRUE; list = gimage->layers; - while(list && success == TRUE) + while (list && success == TRUE) { layer = (Layer *)list->data; success = layer_check_scaling (layer, @@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale) } /* Warn user on failure */ - if(success == FALSE) + if (success == FALSE) { gtk_widget_set_sensitive (image_scale->resize->resize_shell, FALSE); - str = g_strdup (_("The chosen image size will shrink\n" - "some layers completely away.\nIs this what you want?")); - dialog = gimp_query_boolean_box (_("Layer Too Small"), gimp_standard_help_func, "dialogs/scale_layer_warn.html", FALSE, - str, + _("The chosen image size will shrink\n" + "some layers completely away.\n" + "Is this what you want?"), _("OK"), _("Cancel"), - NULL, NULL, + GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", resize_scale_warn_callback, image_scale); - - g_free (str); gtk_widget_show (dialog); } } diff --git a/app/gui/resize-dialog.h b/app/gui/resize-dialog.h index d2e9fc2c6b..327bf4c103 100644 --- a/app/gui/resize-dialog.h +++ b/app/gui/resize-dialog.h @@ -37,7 +37,6 @@ typedef struct _Resize Resize; struct _Resize { - /* The calling procedure is respondible for showing this widget */ GtkWidget *resize_shell; ResizeType type; @@ -66,13 +65,18 @@ typedef struct GimpImage *gimage; } ImageResize; -/* If resolution_x is zero, then don't show resolution modification - * parts of the dialog. If object is non-NULL, then attach the cancel - * callback to its destroy signal. */ +/* If resolution_x is zero, then don't show resolution modification + * parts of the dialog. + * + * If object and signal are non-NULL, then attach the cancel callback to signal. + * + * If cancel_callback is NULL, then the dialog will be destroyed on "Cancel". + */ Resize * resize_widget_new (ResizeType type, ResizeTarget target, - GtkObject * object, + GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type, GtkSignalFunc ok_cb, GtkSignalFunc cancel_cb, gpointer user_data); -void resize_widget_free (Resize * resize); /* Layer scaling sanity check and warning dialogs */ -gboolean resize_check_layer_scaling (ImageResize *); -void resize_scale_implement (ImageResize *); +gboolean resize_check_layer_scaling (ImageResize *image_resize); +void resize_scale_implement (ImageResize *image_resize); #endif /* __RESIZE_H__ */ diff --git a/app/interface.c b/app/interface.c index 4b563e0d8a..8b7d47d28c 100644 --- a/app/interface.c +++ b/app/interface.c @@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp, } gtk_widget_realize (gdisp->canvas); - gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, 0); + gdk_window_set_back_pixmap (gdisp->canvas->window, NULL, FALSE); /* we need to realize the cursor_label widget here, so the size gets * computed correctly diff --git a/app/layers_dialog.c b/app/layers_dialog.c index cd15a88ee4..b5d72e7d8a 100644 --- a/app/layers_dialog.c +++ b/app/layers_dialog.c @@ -1148,7 +1148,7 @@ layers_dialog_set_active_layer (Layer *layer) layer_widget->list_item); gtk_object_set_user_data (GTK_OBJECT (layer_widget->list_item), layer_widget); - + layers_dialog_scroll_index (index); } @@ -2616,7 +2616,6 @@ layer_widget_button_events (GtkWidget *widget, { layer_widget_exclusive_visible (layer_widget); } - else { GIMP_DRAWABLE (layer_widget->layer)->visible = @@ -3073,17 +3072,20 @@ layer_widget_eye_redraw (LayerWidget *layer_widget) { eye_pixmap[NORMAL] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_NORMAL], &layer_widget->eye_widget->style->white); eye_pixmap[SELECTED] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_SELECTED], &layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]); eye_pixmap[INSENSITIVE] = gdk_pixmap_create_from_data (layer_widget->eye_widget->window, - (gchar*) eye_bits, eye_width, eye_height, -1, + (gchar*) eye_bits, + eye_width, eye_height, -1, &layer_widget->eye_widget->style->fg[GTK_STATE_INSENSITIVE], &layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]); } @@ -3233,13 +3235,15 @@ layer_widget_layer_flush (GtkWidget *widget, /* Set sensitivity */ /* to false if there is a floating selection, and this aint it */ - if (! layer_is_floating_sel (layer_widget->layer) && layersD->floating_sel != NULL) + if (! layer_is_floating_sel (layer_widget->layer) && + layersD->floating_sel != NULL) { if (GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item)) gtk_widget_set_sensitive (layer_widget->list_item, FALSE); } /* to true if there is a floating selection, and this is it */ - if (layer_is_floating_sel (layer_widget->layer) && layersD->floating_sel != NULL) + if (layer_is_floating_sel (layer_widget->layer) && + layersD->floating_sel != NULL) { if (! GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item)) gtk_widget_set_sensitive (layer_widget->list_item, TRUE); @@ -3779,25 +3783,13 @@ scale_layer_query_ok_callback (GtkWidget *widget, gdisplays_flush (); } - resize_widget_free (options->resize); - g_free (options); + gtk_widget_destroy (options->resize->resize_shell); } else g_message (_("Invalid width or height.\n" "Both must be positive.")); } -static void -scale_layer_query_cancel_callback (GtkWidget *widget, - gpointer data) -{ - ScaleLayerOptions *options; - options = (ScaleLayerOptions *) data; - - resize_widget_free (options->resize); - g_free (options); -} - static void layers_dialog_scale_layer_query (GimpImage *gimage, Layer *layer) @@ -3810,16 +3802,22 @@ layers_dialog_scale_layer_query (GimpImage *gimage, options->resize = resize_widget_new (ScaleWidget, ResizeLayer, GTK_OBJECT (layer), - drawable_width (GIMP_DRAWABLE(layer)), - drawable_height (GIMP_DRAWABLE(layer)), + "removed", + drawable_width (GIMP_DRAWABLE (layer)), + drawable_height (GIMP_DRAWABLE (layer)), gimage->xresolution, gimage->yresolution, gimage->unit, TRUE, scale_layer_query_ok_callback, - scale_layer_query_cancel_callback, + NULL, options); + gtk_signal_connect_object (GTK_OBJECT (options->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) options); + gtk_widget_show (options->resize->resize_shell); } @@ -3867,25 +3865,13 @@ resize_layer_query_ok_callback (GtkWidget *widget, gdisplays_flush (); } - resize_widget_free (options->resize); - g_free (options); + gtk_widget_destroy (options->resize->resize_shell); } else g_message (_("Invalid width or height.\n" "Both must be positive.")); } -static void -resize_layer_query_cancel_callback (GtkWidget *widget, - gpointer data) -{ - ResizeLayerOptions *options; - options = (ResizeLayerOptions *) data; - - resize_widget_free (options->resize); - g_free (options); -} - static void layers_dialog_resize_layer_query (GimpImage *gimage, Layer *layer) @@ -3898,16 +3884,22 @@ layers_dialog_resize_layer_query (GimpImage *gimage, options->resize = resize_widget_new (ResizeWidget, ResizeLayer, GTK_OBJECT (layer), - drawable_width (GIMP_DRAWABLE(layer)), - drawable_height (GIMP_DRAWABLE(layer)), + "removed", + drawable_width (GIMP_DRAWABLE (layer)), + drawable_height (GIMP_DRAWABLE (layer)), gimage->xresolution, gimage->yresolution, gimage->unit, TRUE, resize_layer_query_ok_callback, - resize_layer_query_cancel_callback, + NULL, options); + gtk_signal_connect_object (GTK_OBJECT (options->resize->resize_shell), + "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) options); + gtk_widget_show (options->resize->resize_shell); } diff --git a/app/resize.c b/app/resize.c index 70be6042cd..bfd9066f78 100644 --- a/app/resize.c +++ b/app/resize.c @@ -15,8 +15,8 @@ * 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 "config.h" + #include "appenv.h" #include "gdisplay.h" #include "resize.h" @@ -26,12 +26,14 @@ #include "libgimp/gimpchainbutton.h" #include "libgimp/gimplimits.h" +#include "libgimp/gimpmath.h" #include "libgimp/gimpsizeentry.h" + #include "libgimp/gimpintl.h" -#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK +#define EVENT_MASK GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK #define DRAWING_AREA_SIZE 200 -#define TEXT_WIDTH 35 +#define TEXT_WIDTH 35 typedef struct _ResizePrivate ResizePrivate; @@ -56,9 +58,6 @@ struct _ResizePrivate GtkWidget *resolution_se; GtkWidget *equal_res; - GtkObject *object; - guint object_destroy_handler; - gdouble ratio; gint old_width, old_height; gdouble old_res_x, old_res_y; @@ -85,6 +84,7 @@ Resize * resize_widget_new (ResizeType type, ResizeTarget target, GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -112,25 +112,25 @@ resize_widget_new (ResizeType type, alignment = NULL; frame = NULL; - resize = g_new (Resize, 1); private = g_new (ResizePrivate, 1); - resize->type = type; - resize->target = target; + private->old_width = width; + private->old_height = height; + private->old_res_x = resolution_x; + private->old_res_y = resolution_y; + + resize = g_new (Resize, 1); + resize->type = type; + resize->target = target; resize->private_part = private; - resize->width = width; - resize->height = height; + resize->width = width; + resize->height = height; resize->resolution_x = resolution_x; resize->resolution_y = resolution_y; - resize->unit = unit; - resize->ratio_x = 1.0; - resize->ratio_y = 1.0; - resize->offset_x = 0; - resize->offset_y = 0; - private->old_width = width; - private->old_height = height; - private->old_res_x = resolution_x; - private->old_res_y = resolution_y; - private->object = NULL; + resize->unit = unit; + resize->ratio_x = 1.0; + resize->ratio_y = 1.0; + resize->offset_x = 0; + resize->offset_y = 0; /* Get the image width and height variables, based on the gimage */ if (width > height) @@ -192,21 +192,33 @@ resize_widget_new (ResizeType type, _("OK"), ok_cb, user_data, NULL, NULL, TRUE, FALSE, - _("Cancel"), cancel_cb, - user_data, NULL, NULL, FALSE, TRUE, - + _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy, + cancel_cb ? user_data : NULL, + cancel_cb ? NULL : (gpointer) 1, + NULL, FALSE, TRUE, + NULL); + + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) private); + gtk_signal_connect_object (GTK_OBJECT (resize->resize_shell), "destroy", + GTK_SIGNAL_FUNC (g_free), + (GtkObject *) resize); } /* handle the image disappearing under our feet */ - if (object) + if (object && signal) { - const gchar *signame; - - signame = (target == ResizeLayer) ? "removed" : "destroy"; - private->object = object; - private->object_destroy_handler = - gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); + if (cancel_cb) + gtk_signal_connect (GTK_OBJECT (object), signal, + cancel_cb, + user_data); + else + gtk_signal_connect_object_while_alive + (GTK_OBJECT (object), signal, + GTK_SIGNAL_FUNC (gtk_widget_destroy), + GTK_OBJECT (resize->resize_shell)); } /* the main vbox */ @@ -638,28 +650,14 @@ resize_widget_new (ResizeType type, return resize; } -void -resize_widget_free (Resize *resize) -{ - ResizePrivate *private = resize->private_part; - - if (private->object) - gtk_signal_disconnect (GTK_OBJECT (private->object), - private->object_destroy_handler); - - gtk_widget_destroy (resize->resize_shell); - g_free (resize->private_part); - g_free (resize); -} - static void resize_draw (Resize *resize) { GtkWidget *widget; ResizePrivate *private; - int aw, ah; - int x, y; - int w, h; + gint aw, ah; + gint x, y; + gint w, h; /* Only need to draw if it's a resize widget */ if (resize->type != ResizeWidget) @@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget, /*** Resize sanity checks ***/ -void resize_scale_implement (ImageResize *image_scale) +void +resize_scale_implement (ImageResize *image_scale) { GImage *gimage = NULL; gboolean rulers_flush = FALSE; @@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale) } } -static -void resize_scale_warn_callback (GtkWidget *widget, - gboolean do_scale, - gpointer client_data) +static void +resize_scale_warn_callback (GtkWidget *widget, + gboolean do_scale, + gpointer client_data) { ImageResize *image_scale = NULL; GImage *gimage = NULL; - g_assert(client_data != NULL); + g_assert (client_data != NULL); image_scale = (ImageResize *) client_data; gimage = image_scale->gimage; - g_assert(gimage != NULL); + g_assert (gimage != NULL); - if(do_scale == TRUE) /* User doesn't mind losing layers... */ + if (do_scale == TRUE) /* User doesn't mind losing layers... */ { - resize_scale_implement(image_scale); - resize_widget_free (image_scale->resize); - g_free (image_scale); + resize_scale_implement (image_scale); + gtk_widget_destroy (image_scale->resize->resize_shell); } else gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); @@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale) GSList *list = NULL; Layer *layer = NULL; GtkWidget *dialog = NULL; - gchar *str = NULL; - g_assert(image_scale != NULL); + g_assert (image_scale != NULL); - if(NULL != (gimage = image_scale->gimage)) + if (NULL != (gimage = image_scale->gimage)) { /* Step through layers; test scaled dimensions. */ success = TRUE; list = gimage->layers; - while(list && success == TRUE) + while (list && success == TRUE) { layer = (Layer *)list->data; success = layer_check_scaling (layer, @@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale) } /* Warn user on failure */ - if(success == FALSE) + if (success == FALSE) { gtk_widget_set_sensitive (image_scale->resize->resize_shell, FALSE); - str = g_strdup (_("The chosen image size will shrink\n" - "some layers completely away.\nIs this what you want?")); - dialog = gimp_query_boolean_box (_("Layer Too Small"), gimp_standard_help_func, "dialogs/scale_layer_warn.html", FALSE, - str, + _("The chosen image size will shrink\n" + "some layers completely away.\n" + "Is this what you want?"), _("OK"), _("Cancel"), - NULL, NULL, + GTK_OBJECT (image_scale->resize->resize_shell), + "destroy", resize_scale_warn_callback, image_scale); - - g_free (str); gtk_widget_show (dialog); } } diff --git a/app/resize.h b/app/resize.h index d2e9fc2c6b..327bf4c103 100644 --- a/app/resize.h +++ b/app/resize.h @@ -37,7 +37,6 @@ typedef struct _Resize Resize; struct _Resize { - /* The calling procedure is respondible for showing this widget */ GtkWidget *resize_shell; ResizeType type; @@ -66,13 +65,18 @@ typedef struct GimpImage *gimage; } ImageResize; -/* If resolution_x is zero, then don't show resolution modification - * parts of the dialog. If object is non-NULL, then attach the cancel - * callback to its destroy signal. */ +/* If resolution_x is zero, then don't show resolution modification + * parts of the dialog. + * + * If object and signal are non-NULL, then attach the cancel callback to signal. + * + * If cancel_callback is NULL, then the dialog will be destroyed on "Cancel". + */ Resize * resize_widget_new (ResizeType type, ResizeTarget target, - GtkObject * object, + GtkObject *object, + gchar *signal, gint width, gint height, gdouble resolution_x, @@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type, GtkSignalFunc ok_cb, GtkSignalFunc cancel_cb, gpointer user_data); -void resize_widget_free (Resize * resize); /* Layer scaling sanity check and warning dialogs */ -gboolean resize_check_layer_scaling (ImageResize *); -void resize_scale_implement (ImageResize *); +gboolean resize_check_layer_scaling (ImageResize *image_resize); +void resize_scale_implement (ImageResize *image_resize); #endif /* __RESIZE_H__ */ diff --git a/app/widgets/gimptoolbox-color-area.c b/app/widgets/gimptoolbox-color-area.c index baf1c27fef..2ed0908c93 100644 --- a/app/widgets/gimptoolbox-color-area.c +++ b/app/widgets/gimptoolbox-color-area.c @@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget, return FALSE; } +static void +color_area_realize (GtkWidget *widget, + gpointer data) +{ + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (widget->window, NULL, TRUE); +} + GtkWidget * color_area_create (gint width, gint height, @@ -458,6 +466,10 @@ color_area_create (gint width, GTK_SIGNAL_FUNC (color_area_events), NULL); + gtk_signal_connect (GTK_OBJECT (color_area), "realize", + GTK_SIGNAL_FUNC (color_area_realize), + NULL); + default_pixmap = default_pmap; default_mask = default_msk; diff --git a/libgimp/gimpchainbutton.c b/libgimp/gimpchainbutton.c index 6b64562237..2f4650e95a 100644 --- a/libgimp/gimpchainbutton.c +++ b/libgimp/gimpchainbutton.c @@ -53,7 +53,7 @@ static void gimp_chain_button_realize (GtkWidget *widget); static void gimp_chain_button_clicked_callback (GtkWidget *widget, GimpChainButton *gcb); static gint gimp_chain_button_draw_lines (GtkWidget *widget, - GdkEvent *event, + GdkEventExpose *eevent, GimpChainButton *gcb); static GtkTableClass *parent_class = NULL; @@ -278,6 +278,14 @@ gimp_chain_button_realize (GtkWidget *widget) gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->chain, gcb->chain_mask); else gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->broken, gcb->broken_mask); + + gtk_widget_realize (gcb->line1); + gtk_style_set_background (widget->style, gcb->line1->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (gcb->line1->window, NULL, TRUE); + + gtk_widget_realize (gcb->line2); + gtk_style_set_background (widget->style, gcb->line2->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (gcb->line2->window, NULL, TRUE); } static void @@ -299,7 +307,7 @@ gimp_chain_button_clicked_callback (GtkWidget *widget, static gint gimp_chain_button_draw_lines (GtkWidget *widget, - GdkEvent *event, + GdkEventExpose *eevent, GimpChainButton *gcb) { GdkPoint points[3]; @@ -313,13 +321,6 @@ gimp_chain_button_draw_lines (GtkWidget *widget, g_return_val_if_fail (GIMP_IS_CHAIN_BUTTON (gcb), FALSE); - /* - gdk_window_clear_area (widget->window, - 0, 0, - widget->allocation.width, - widget->allocation.height); - */ - points[0].x = widget->allocation.width / 2; points[0].y = widget->allocation.height / 2; @@ -371,13 +372,16 @@ gimp_chain_button_draw_lines (GtkWidget *widget, points[2] = buf; } - gtk_draw_polygon (widget->style, - widget->window, - GTK_STATE_NORMAL, - shadow, - points, - 3, - FALSE); + gtk_paint_polygon (widget->style, + widget->window, + GTK_STATE_NORMAL, + shadow, + &eevent->area, + widget, + "chainbutton", + points, + 3, + FALSE); return TRUE; } diff --git a/libgimpwidgets/gimpchainbutton.c b/libgimpwidgets/gimpchainbutton.c index 6b64562237..2f4650e95a 100644 --- a/libgimpwidgets/gimpchainbutton.c +++ b/libgimpwidgets/gimpchainbutton.c @@ -53,7 +53,7 @@ static void gimp_chain_button_realize (GtkWidget *widget); static void gimp_chain_button_clicked_callback (GtkWidget *widget, GimpChainButton *gcb); static gint gimp_chain_button_draw_lines (GtkWidget *widget, - GdkEvent *event, + GdkEventExpose *eevent, GimpChainButton *gcb); static GtkTableClass *parent_class = NULL; @@ -278,6 +278,14 @@ gimp_chain_button_realize (GtkWidget *widget) gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->chain, gcb->chain_mask); else gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->broken, gcb->broken_mask); + + gtk_widget_realize (gcb->line1); + gtk_style_set_background (widget->style, gcb->line1->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (gcb->line1->window, NULL, TRUE); + + gtk_widget_realize (gcb->line2); + gtk_style_set_background (widget->style, gcb->line2->window, GTK_STATE_NORMAL); + gdk_window_set_back_pixmap (gcb->line2->window, NULL, TRUE); } static void @@ -299,7 +307,7 @@ gimp_chain_button_clicked_callback (GtkWidget *widget, static gint gimp_chain_button_draw_lines (GtkWidget *widget, - GdkEvent *event, + GdkEventExpose *eevent, GimpChainButton *gcb) { GdkPoint points[3]; @@ -313,13 +321,6 @@ gimp_chain_button_draw_lines (GtkWidget *widget, g_return_val_if_fail (GIMP_IS_CHAIN_BUTTON (gcb), FALSE); - /* - gdk_window_clear_area (widget->window, - 0, 0, - widget->allocation.width, - widget->allocation.height); - */ - points[0].x = widget->allocation.width / 2; points[0].y = widget->allocation.height / 2; @@ -371,13 +372,16 @@ gimp_chain_button_draw_lines (GtkWidget *widget, points[2] = buf; } - gtk_draw_polygon (widget->style, - widget->window, - GTK_STATE_NORMAL, - shadow, - points, - 3, - FALSE); + gtk_paint_polygon (widget->style, + widget->window, + GTK_STATE_NORMAL, + shadow, + &eevent->area, + widget, + "chainbutton", + points, + 3, + FALSE); return TRUE; }