app/commands.c app/layers_dialog.c behave like a widget: removed

2000-04-06  Michael Natterer  <mitch@gimp.org>

	* 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.
This commit is contained in:
Michael Natterer 2000-04-06 02:13:18 +00:00 committed by Michael Natterer
parent 56f1372519
commit 61184c16c9
21 changed files with 472 additions and 442 deletions

View File

@ -1,3 +1,19 @@
2000-04-06 Michael Natterer <mitch@gimp.org>
* 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 <sven@gimp.org> 2000-04-06 Sven Neumann <sven@gimp.org>
* app/gimage_cmds.c * app/gimage_cmds.c

View File

@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean);
/* local functions */ /* local functions */
static void image_resize_callback (GtkWidget *, gpointer); static void image_resize_callback (GtkWidget *, gpointer);
static void image_scale_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, static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit,
gpointer); gpointer);
static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, 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, image_resize->resize = resize_widget_new (ResizeWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_resize_callback, image_resize_callback,
image_cancel_callback, NULL,
image_resize); 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); 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, image_scale->resize = resize_widget_new (ScaleWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_scale_callback, image_scale_callback,
image_cancel_callback, NULL,
image_scale); 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); 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); g_free (image_resize);
} }
@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget,
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
g_assert((image_scale = (ImageResize *) client_data) != NULL); g_assert ((image_scale = (ImageResize *) client_data) != NULL);
g_assert(image_scale->gimage != NULL); g_assert (image_scale->gimage != NULL);
if(TRUE == resize_check_layer_scaling(image_scale)) if (TRUE == resize_check_layer_scaling (image_scale))
{ {
resize_scale_implement(image_scale); resize_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
} }
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 static void
gimage_mask_feather_callback (GtkWidget *widget, gimage_mask_feather_callback (GtkWidget *widget,
gdouble size, gdouble size,

View File

@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget,
return FALSE; 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 * GtkWidget *
color_area_create (gint width, color_area_create (gint width,
gint height, gint height,
@ -458,6 +466,10 @@ color_area_create (gint width,
GTK_SIGNAL_FUNC (color_area_events), GTK_SIGNAL_FUNC (color_area_events),
NULL); NULL);
gtk_signal_connect (GTK_OBJECT (color_area), "realize",
GTK_SIGNAL_FUNC (color_area_realize),
NULL);
default_pixmap = default_pmap; default_pixmap = default_pmap;
default_mask = default_msk; default_mask = default_msk;

View File

@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean);
/* local functions */ /* local functions */
static void image_resize_callback (GtkWidget *, gpointer); static void image_resize_callback (GtkWidget *, gpointer);
static void image_scale_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, static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit,
gpointer); gpointer);
static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, 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, image_resize->resize = resize_widget_new (ResizeWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_resize_callback, image_resize_callback,
image_cancel_callback, NULL,
image_resize); 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); 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, image_scale->resize = resize_widget_new (ScaleWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_scale_callback, image_scale_callback,
image_cancel_callback, NULL,
image_scale); 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); 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); g_free (image_resize);
} }
@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget,
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
g_assert((image_scale = (ImageResize *) client_data) != NULL); g_assert ((image_scale = (ImageResize *) client_data) != NULL);
g_assert(image_scale->gimage != NULL); g_assert (image_scale->gimage != NULL);
if(TRUE == resize_check_layer_scaling(image_scale)) if (TRUE == resize_check_layer_scaling (image_scale))
{ {
resize_scale_implement(image_scale); resize_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
} }
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 static void
gimage_mask_feather_callback (GtkWidget *widget, gimage_mask_feather_callback (GtkWidget *widget,
gdouble size, gdouble size,

View File

@ -15,8 +15,8 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <math.h>
#include "config.h" #include "config.h"
#include "appenv.h" #include "appenv.h"
#include "gdisplay.h" #include "gdisplay.h"
#include "resize.h" #include "resize.h"
@ -26,7 +26,9 @@
#include "libgimp/gimpchainbutton.h" #include "libgimp/gimpchainbutton.h"
#include "libgimp/gimplimits.h" #include "libgimp/gimplimits.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpsizeentry.h" #include "libgimp/gimpsizeentry.h"
#include "libgimp/gimpintl.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
@ -56,9 +58,6 @@ struct _ResizePrivate
GtkWidget *resolution_se; GtkWidget *resolution_se;
GtkWidget *equal_res; GtkWidget *equal_res;
GtkObject *object;
guint object_destroy_handler;
gdouble ratio; gdouble ratio;
gint old_width, old_height; gint old_width, old_height;
gdouble old_res_x, old_res_y; gdouble old_res_x, old_res_y;
@ -85,6 +84,7 @@ Resize *
resize_widget_new (ResizeType type, resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject *object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -112,8 +112,13 @@ resize_widget_new (ResizeType type,
alignment = NULL; alignment = NULL;
frame = NULL; frame = NULL;
resize = g_new (Resize, 1);
private = g_new (ResizePrivate, 1); private = g_new (ResizePrivate, 1);
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->type = type;
resize->target = target; resize->target = target;
resize->private_part = private; resize->private_part = private;
@ -126,11 +131,6 @@ resize_widget_new (ResizeType type,
resize->ratio_y = 1.0; resize->ratio_y = 1.0;
resize->offset_x = 0; resize->offset_x = 0;
resize->offset_y = 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;
/* Get the image width and height variables, based on the gimage */ /* Get the image width and height variables, based on the gimage */
if (width > height) if (width > height)
@ -192,21 +192,33 @@ resize_widget_new (ResizeType type,
_("OK"), ok_cb, _("OK"), ok_cb,
user_data, NULL, NULL, TRUE, FALSE, user_data, NULL, NULL, TRUE, FALSE,
_("Cancel"), cancel_cb, _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy,
user_data, NULL, NULL, FALSE, TRUE, cancel_cb ? user_data : NULL,
cancel_cb ? NULL : (gpointer) 1,
NULL, FALSE, TRUE,
NULL); 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 */ /* handle the image disappearing under our feet */
if (object) if (object && signal)
{ {
const gchar *signame; if (cancel_cb)
gtk_signal_connect (GTK_OBJECT (object), signal,
signame = (target == ResizeLayer) ? "removed" : "destroy"; cancel_cb,
private->object = object; user_data);
private->object_destroy_handler = else
gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); gtk_signal_connect_object_while_alive
(GTK_OBJECT (object), signal,
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (resize->resize_shell));
} }
/* the main vbox */ /* the main vbox */
@ -638,28 +650,14 @@ resize_widget_new (ResizeType type,
return resize; 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 static void
resize_draw (Resize *resize) resize_draw (Resize *resize)
{ {
GtkWidget *widget; GtkWidget *widget;
ResizePrivate *private; ResizePrivate *private;
int aw, ah; gint aw, ah;
int x, y; gint x, y;
int w, h; gint w, h;
/* Only need to draw if it's a resize widget */ /* Only need to draw if it's a resize widget */
if (resize->type != ResizeWidget) if (resize->type != ResizeWidget)
@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget,
/*** Resize sanity checks ***/ /*** Resize sanity checks ***/
void resize_scale_implement (ImageResize *image_scale) void
resize_scale_implement (ImageResize *image_scale)
{ {
GImage *gimage = NULL; GImage *gimage = NULL;
gboolean rulers_flush = FALSE; gboolean rulers_flush = FALSE;
@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale)
} }
} }
static static void
void resize_scale_warn_callback (GtkWidget *widget, resize_scale_warn_callback (GtkWidget *widget,
gboolean do_scale, gboolean do_scale,
gpointer client_data) gpointer client_data)
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
GImage *gimage = NULL; GImage *gimage = NULL;
g_assert(client_data != NULL); g_assert (client_data != NULL);
image_scale = (ImageResize *) client_data; image_scale = (ImageResize *) client_data;
gimage = image_scale->gimage; 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_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
else else
gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE);
@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale)
GSList *list = NULL; GSList *list = NULL;
Layer *layer = NULL; Layer *layer = NULL;
GtkWidget *dialog = 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. */ /* Step through layers; test scaled dimensions. */
success = TRUE; success = TRUE;
list = gimage->layers; list = gimage->layers;
while(list && success == TRUE) while (list && success == TRUE)
{ {
layer = (Layer *)list->data; layer = (Layer *)list->data;
success = layer_check_scaling (layer, success = layer_check_scaling (layer,
@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale)
} }
/* Warn user on failure */ /* Warn user on failure */
if(success == FALSE) if (success == FALSE)
{ {
gtk_widget_set_sensitive (image_scale->resize->resize_shell, 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 = dialog =
gimp_query_boolean_box (_("Layer Too Small"), gimp_query_boolean_box (_("Layer Too Small"),
gimp_standard_help_func, gimp_standard_help_func,
"dialogs/scale_layer_warn.html", "dialogs/scale_layer_warn.html",
FALSE, FALSE,
str, _("The chosen image size will shrink\n"
"some layers completely away.\n"
"Is this what you want?"),
_("OK"), _("Cancel"), _("OK"), _("Cancel"),
NULL, NULL, GTK_OBJECT (image_scale->resize->resize_shell),
"destroy",
resize_scale_warn_callback, resize_scale_warn_callback,
image_scale); image_scale);
g_free (str);
gtk_widget_show (dialog); gtk_widget_show (dialog);
} }
} }

View File

@ -37,7 +37,6 @@ typedef struct _Resize Resize;
struct _Resize struct _Resize
{ {
/* The calling procedure is respondible for showing this widget */
GtkWidget *resize_shell; GtkWidget *resize_shell;
ResizeType type; ResizeType type;
@ -67,12 +66,17 @@ typedef struct
} ImageResize; } ImageResize;
/* If resolution_x is zero, then don't show resolution modification /* If resolution_x is zero, then don't show resolution modification
* parts of the dialog. If object is non-NULL, then attach the cancel * parts of the dialog.
* callback to its destroy signal. */ *
* 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, Resize * resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject * object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type,
GtkSignalFunc ok_cb, GtkSignalFunc ok_cb,
GtkSignalFunc cancel_cb, GtkSignalFunc cancel_cb,
gpointer user_data); gpointer user_data);
void resize_widget_free (Resize * resize);
/* Layer scaling sanity check and warning dialogs */ /* Layer scaling sanity check and warning dialogs */
gboolean resize_check_layer_scaling (ImageResize *); gboolean resize_check_layer_scaling (ImageResize *image_resize);
void resize_scale_implement (ImageResize *); void resize_scale_implement (ImageResize *image_resize);
#endif /* __RESIZE_H__ */ #endif /* __RESIZE_H__ */

View File

@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp,
} }
gtk_widget_realize (gdisp->canvas); 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 /* we need to realize the cursor_label widget here, so the size gets
* computed correctly * computed correctly

View File

@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp,
} }
gtk_widget_realize (gdisp->canvas); 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 /* we need to realize the cursor_label widget here, so the size gets
* computed correctly * computed correctly

View File

@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget,
return FALSE; 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 * GtkWidget *
color_area_create (gint width, color_area_create (gint width,
gint height, gint height,
@ -458,6 +466,10 @@ color_area_create (gint width,
GTK_SIGNAL_FUNC (color_area_events), GTK_SIGNAL_FUNC (color_area_events),
NULL); NULL);
gtk_signal_connect (GTK_OBJECT (color_area), "realize",
GTK_SIGNAL_FUNC (color_area_realize),
NULL);
default_pixmap = default_pmap; default_pixmap = default_pmap;
default_mask = default_msk; default_mask = default_msk;

View File

@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean);
/* local functions */ /* local functions */
static void image_resize_callback (GtkWidget *, gpointer); static void image_resize_callback (GtkWidget *, gpointer);
static void image_scale_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, static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit,
gpointer); gpointer);
static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, 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, image_resize->resize = resize_widget_new (ResizeWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_resize_callback, image_resize_callback,
image_cancel_callback, NULL,
image_resize); 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); 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, image_scale->resize = resize_widget_new (ScaleWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_scale_callback, image_scale_callback,
image_cancel_callback, NULL,
image_scale); 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); 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); g_free (image_resize);
} }
@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget,
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
g_assert((image_scale = (ImageResize *) client_data) != NULL); g_assert ((image_scale = (ImageResize *) client_data) != NULL);
g_assert(image_scale->gimage != NULL); g_assert (image_scale->gimage != NULL);
if(TRUE == resize_check_layer_scaling(image_scale)) if (TRUE == resize_check_layer_scaling (image_scale))
{ {
resize_scale_implement(image_scale); resize_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
} }
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 static void
gimage_mask_feather_callback (GtkWidget *widget, gimage_mask_feather_callback (GtkWidget *widget,
gdouble size, gdouble size,

View File

@ -71,7 +71,6 @@ extern void layers_dialog_layer_merge_query (GImage *, gboolean);
/* local functions */ /* local functions */
static void image_resize_callback (GtkWidget *, gpointer); static void image_resize_callback (GtkWidget *, gpointer);
static void image_scale_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, static void gimage_mask_feather_callback (GtkWidget *, gdouble, GimpUnit,
gpointer); gpointer);
static void gimage_mask_border_callback (GtkWidget *, gdouble, GimpUnit, 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, image_resize->resize = resize_widget_new (ResizeWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -813,9 +813,14 @@ image_resize_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_resize_callback, image_resize_callback,
image_cancel_callback, NULL,
image_resize); 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); 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, image_scale->resize = resize_widget_new (ScaleWidget,
ResizeImage, ResizeImage,
GTK_OBJECT (gimage), GTK_OBJECT (gimage),
"destroy",
gimage->width, gimage->width,
gimage->height, gimage->height,
gimage->xresolution, gimage->xresolution,
@ -844,9 +850,14 @@ image_scale_cmd_callback (GtkWidget *widget,
gimage->unit, gimage->unit,
gdisp->dot_for_dot, gdisp->dot_for_dot,
image_scale_callback, image_scale_callback,
image_cancel_callback, NULL,
image_scale); 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); 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); g_free (image_resize);
} }
@ -1317,29 +1328,16 @@ image_scale_callback (GtkWidget *widget,
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
g_assert((image_scale = (ImageResize *) client_data) != NULL); g_assert ((image_scale = (ImageResize *) client_data) != NULL);
g_assert(image_scale->gimage != NULL); g_assert (image_scale->gimage != NULL);
if(TRUE == resize_check_layer_scaling(image_scale)) if (TRUE == resize_check_layer_scaling (image_scale))
{ {
resize_scale_implement(image_scale); resize_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
} }
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 static void
gimage_mask_feather_callback (GtkWidget *widget, gimage_mask_feather_callback (GtkWidget *widget,
gdouble size, gdouble size,

View File

@ -2616,7 +2616,6 @@ layer_widget_button_events (GtkWidget *widget,
{ {
layer_widget_exclusive_visible (layer_widget); layer_widget_exclusive_visible (layer_widget);
} }
else else
{ {
GIMP_DRAWABLE (layer_widget->layer)->visible = GIMP_DRAWABLE (layer_widget->layer)->visible =
@ -3073,17 +3072,20 @@ layer_widget_eye_redraw (LayerWidget *layer_widget)
{ {
eye_pixmap[NORMAL] = eye_pixmap[NORMAL] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_NORMAL],
&layer_widget->eye_widget->style->white); &layer_widget->eye_widget->style->white);
eye_pixmap[SELECTED] = eye_pixmap[SELECTED] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_SELECTED],
&layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]); &layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]);
eye_pixmap[INSENSITIVE] = eye_pixmap[INSENSITIVE] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_INSENSITIVE],
&layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]); &layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]);
} }
@ -3233,13 +3235,15 @@ layer_widget_layer_flush (GtkWidget *widget,
/* Set sensitivity */ /* Set sensitivity */
/* to false if there is a floating selection, and this aint it */ /* 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)) if (GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item))
gtk_widget_set_sensitive (layer_widget->list_item, FALSE); gtk_widget_set_sensitive (layer_widget->list_item, FALSE);
} }
/* to true if there is a floating selection, and this is it */ /* 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)) if (! GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item))
gtk_widget_set_sensitive (layer_widget->list_item, TRUE); gtk_widget_set_sensitive (layer_widget->list_item, TRUE);
@ -3779,25 +3783,13 @@ scale_layer_query_ok_callback (GtkWidget *widget,
gdisplays_flush (); gdisplays_flush ();
} }
resize_widget_free (options->resize); gtk_widget_destroy (options->resize->resize_shell);
g_free (options);
} }
else else
g_message (_("Invalid width or height.\n" g_message (_("Invalid width or height.\n"
"Both must be positive.")); "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 static void
layers_dialog_scale_layer_query (GimpImage *gimage, layers_dialog_scale_layer_query (GimpImage *gimage,
Layer *layer) Layer *layer)
@ -3810,16 +3802,22 @@ layers_dialog_scale_layer_query (GimpImage *gimage,
options->resize = resize_widget_new (ScaleWidget, options->resize = resize_widget_new (ScaleWidget,
ResizeLayer, ResizeLayer,
GTK_OBJECT (layer), GTK_OBJECT (layer),
drawable_width (GIMP_DRAWABLE(layer)), "removed",
drawable_height (GIMP_DRAWABLE(layer)), drawable_width (GIMP_DRAWABLE (layer)),
drawable_height (GIMP_DRAWABLE (layer)),
gimage->xresolution, gimage->xresolution,
gimage->yresolution, gimage->yresolution,
gimage->unit, gimage->unit,
TRUE, TRUE,
scale_layer_query_ok_callback, scale_layer_query_ok_callback,
scale_layer_query_cancel_callback, NULL,
options); 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); gtk_widget_show (options->resize->resize_shell);
} }
@ -3867,25 +3865,13 @@ resize_layer_query_ok_callback (GtkWidget *widget,
gdisplays_flush (); gdisplays_flush ();
} }
resize_widget_free (options->resize); gtk_widget_destroy (options->resize->resize_shell);
g_free (options);
} }
else else
g_message (_("Invalid width or height.\n" g_message (_("Invalid width or height.\n"
"Both must be positive.")); "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 static void
layers_dialog_resize_layer_query (GimpImage *gimage, layers_dialog_resize_layer_query (GimpImage *gimage,
Layer *layer) Layer *layer)
@ -3898,16 +3884,22 @@ layers_dialog_resize_layer_query (GimpImage *gimage,
options->resize = resize_widget_new (ResizeWidget, options->resize = resize_widget_new (ResizeWidget,
ResizeLayer, ResizeLayer,
GTK_OBJECT (layer), GTK_OBJECT (layer),
drawable_width (GIMP_DRAWABLE(layer)), "removed",
drawable_height (GIMP_DRAWABLE(layer)), drawable_width (GIMP_DRAWABLE (layer)),
drawable_height (GIMP_DRAWABLE (layer)),
gimage->xresolution, gimage->xresolution,
gimage->yresolution, gimage->yresolution,
gimage->unit, gimage->unit,
TRUE, TRUE,
resize_layer_query_ok_callback, resize_layer_query_ok_callback,
resize_layer_query_cancel_callback, NULL,
options); 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); gtk_widget_show (options->resize->resize_shell);
} }

View File

@ -15,8 +15,8 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <math.h>
#include "config.h" #include "config.h"
#include "appenv.h" #include "appenv.h"
#include "gdisplay.h" #include "gdisplay.h"
#include "resize.h" #include "resize.h"
@ -26,7 +26,9 @@
#include "libgimp/gimpchainbutton.h" #include "libgimp/gimpchainbutton.h"
#include "libgimp/gimplimits.h" #include "libgimp/gimplimits.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpsizeentry.h" #include "libgimp/gimpsizeentry.h"
#include "libgimp/gimpintl.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
@ -56,9 +58,6 @@ struct _ResizePrivate
GtkWidget *resolution_se; GtkWidget *resolution_se;
GtkWidget *equal_res; GtkWidget *equal_res;
GtkObject *object;
guint object_destroy_handler;
gdouble ratio; gdouble ratio;
gint old_width, old_height; gint old_width, old_height;
gdouble old_res_x, old_res_y; gdouble old_res_x, old_res_y;
@ -85,6 +84,7 @@ Resize *
resize_widget_new (ResizeType type, resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject *object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -112,8 +112,13 @@ resize_widget_new (ResizeType type,
alignment = NULL; alignment = NULL;
frame = NULL; frame = NULL;
resize = g_new (Resize, 1);
private = g_new (ResizePrivate, 1); private = g_new (ResizePrivate, 1);
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->type = type;
resize->target = target; resize->target = target;
resize->private_part = private; resize->private_part = private;
@ -126,11 +131,6 @@ resize_widget_new (ResizeType type,
resize->ratio_y = 1.0; resize->ratio_y = 1.0;
resize->offset_x = 0; resize->offset_x = 0;
resize->offset_y = 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;
/* Get the image width and height variables, based on the gimage */ /* Get the image width and height variables, based on the gimage */
if (width > height) if (width > height)
@ -192,21 +192,33 @@ resize_widget_new (ResizeType type,
_("OK"), ok_cb, _("OK"), ok_cb,
user_data, NULL, NULL, TRUE, FALSE, user_data, NULL, NULL, TRUE, FALSE,
_("Cancel"), cancel_cb, _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy,
user_data, NULL, NULL, FALSE, TRUE, cancel_cb ? user_data : NULL,
cancel_cb ? NULL : (gpointer) 1,
NULL, FALSE, TRUE,
NULL); 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 */ /* handle the image disappearing under our feet */
if (object) if (object && signal)
{ {
const gchar *signame; if (cancel_cb)
gtk_signal_connect (GTK_OBJECT (object), signal,
signame = (target == ResizeLayer) ? "removed" : "destroy"; cancel_cb,
private->object = object; user_data);
private->object_destroy_handler = else
gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); gtk_signal_connect_object_while_alive
(GTK_OBJECT (object), signal,
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (resize->resize_shell));
} }
/* the main vbox */ /* the main vbox */
@ -638,28 +650,14 @@ resize_widget_new (ResizeType type,
return resize; 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 static void
resize_draw (Resize *resize) resize_draw (Resize *resize)
{ {
GtkWidget *widget; GtkWidget *widget;
ResizePrivate *private; ResizePrivate *private;
int aw, ah; gint aw, ah;
int x, y; gint x, y;
int w, h; gint w, h;
/* Only need to draw if it's a resize widget */ /* Only need to draw if it's a resize widget */
if (resize->type != ResizeWidget) if (resize->type != ResizeWidget)
@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget,
/*** Resize sanity checks ***/ /*** Resize sanity checks ***/
void resize_scale_implement (ImageResize *image_scale) void
resize_scale_implement (ImageResize *image_scale)
{ {
GImage *gimage = NULL; GImage *gimage = NULL;
gboolean rulers_flush = FALSE; gboolean rulers_flush = FALSE;
@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale)
} }
} }
static static void
void resize_scale_warn_callback (GtkWidget *widget, resize_scale_warn_callback (GtkWidget *widget,
gboolean do_scale, gboolean do_scale,
gpointer client_data) gpointer client_data)
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
GImage *gimage = NULL; GImage *gimage = NULL;
g_assert(client_data != NULL); g_assert (client_data != NULL);
image_scale = (ImageResize *) client_data; image_scale = (ImageResize *) client_data;
gimage = image_scale->gimage; 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_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
else else
gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE);
@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale)
GSList *list = NULL; GSList *list = NULL;
Layer *layer = NULL; Layer *layer = NULL;
GtkWidget *dialog = 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. */ /* Step through layers; test scaled dimensions. */
success = TRUE; success = TRUE;
list = gimage->layers; list = gimage->layers;
while(list && success == TRUE) while (list && success == TRUE)
{ {
layer = (Layer *)list->data; layer = (Layer *)list->data;
success = layer_check_scaling (layer, success = layer_check_scaling (layer,
@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale)
} }
/* Warn user on failure */ /* Warn user on failure */
if(success == FALSE) if (success == FALSE)
{ {
gtk_widget_set_sensitive (image_scale->resize->resize_shell, 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 = dialog =
gimp_query_boolean_box (_("Layer Too Small"), gimp_query_boolean_box (_("Layer Too Small"),
gimp_standard_help_func, gimp_standard_help_func,
"dialogs/scale_layer_warn.html", "dialogs/scale_layer_warn.html",
FALSE, FALSE,
str, _("The chosen image size will shrink\n"
"some layers completely away.\n"
"Is this what you want?"),
_("OK"), _("Cancel"), _("OK"), _("Cancel"),
NULL, NULL, GTK_OBJECT (image_scale->resize->resize_shell),
"destroy",
resize_scale_warn_callback, resize_scale_warn_callback,
image_scale); image_scale);
g_free (str);
gtk_widget_show (dialog); gtk_widget_show (dialog);
} }
} }

View File

@ -37,7 +37,6 @@ typedef struct _Resize Resize;
struct _Resize struct _Resize
{ {
/* The calling procedure is respondible for showing this widget */
GtkWidget *resize_shell; GtkWidget *resize_shell;
ResizeType type; ResizeType type;
@ -67,12 +66,17 @@ typedef struct
} ImageResize; } ImageResize;
/* If resolution_x is zero, then don't show resolution modification /* If resolution_x is zero, then don't show resolution modification
* parts of the dialog. If object is non-NULL, then attach the cancel * parts of the dialog.
* callback to its destroy signal. */ *
* 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, Resize * resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject * object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type,
GtkSignalFunc ok_cb, GtkSignalFunc ok_cb,
GtkSignalFunc cancel_cb, GtkSignalFunc cancel_cb,
gpointer user_data); gpointer user_data);
void resize_widget_free (Resize * resize);
/* Layer scaling sanity check and warning dialogs */ /* Layer scaling sanity check and warning dialogs */
gboolean resize_check_layer_scaling (ImageResize *); gboolean resize_check_layer_scaling (ImageResize *image_resize);
void resize_scale_implement (ImageResize *); void resize_scale_implement (ImageResize *image_resize);
#endif /* __RESIZE_H__ */ #endif /* __RESIZE_H__ */

View File

@ -1077,7 +1077,7 @@ create_display_shell (GDisplay *gdisp,
} }
gtk_widget_realize (gdisp->canvas); 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 /* we need to realize the cursor_label widget here, so the size gets
* computed correctly * computed correctly

View File

@ -2616,7 +2616,6 @@ layer_widget_button_events (GtkWidget *widget,
{ {
layer_widget_exclusive_visible (layer_widget); layer_widget_exclusive_visible (layer_widget);
} }
else else
{ {
GIMP_DRAWABLE (layer_widget->layer)->visible = GIMP_DRAWABLE (layer_widget->layer)->visible =
@ -3073,17 +3072,20 @@ layer_widget_eye_redraw (LayerWidget *layer_widget)
{ {
eye_pixmap[NORMAL] = eye_pixmap[NORMAL] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_NORMAL],
&layer_widget->eye_widget->style->white); &layer_widget->eye_widget->style->white);
eye_pixmap[SELECTED] = eye_pixmap[SELECTED] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_SELECTED],
&layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]); &layer_widget->eye_widget->style->bg[GTK_STATE_SELECTED]);
eye_pixmap[INSENSITIVE] = eye_pixmap[INSENSITIVE] =
gdk_pixmap_create_from_data (layer_widget->eye_widget->window, 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->fg[GTK_STATE_INSENSITIVE],
&layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]); &layer_widget->eye_widget->style->bg[GTK_STATE_INSENSITIVE]);
} }
@ -3233,13 +3235,15 @@ layer_widget_layer_flush (GtkWidget *widget,
/* Set sensitivity */ /* Set sensitivity */
/* to false if there is a floating selection, and this aint it */ /* 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)) if (GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item))
gtk_widget_set_sensitive (layer_widget->list_item, FALSE); gtk_widget_set_sensitive (layer_widget->list_item, FALSE);
} }
/* to true if there is a floating selection, and this is it */ /* 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)) if (! GTK_WIDGET_IS_SENSITIVE (layer_widget->list_item))
gtk_widget_set_sensitive (layer_widget->list_item, TRUE); gtk_widget_set_sensitive (layer_widget->list_item, TRUE);
@ -3779,25 +3783,13 @@ scale_layer_query_ok_callback (GtkWidget *widget,
gdisplays_flush (); gdisplays_flush ();
} }
resize_widget_free (options->resize); gtk_widget_destroy (options->resize->resize_shell);
g_free (options);
} }
else else
g_message (_("Invalid width or height.\n" g_message (_("Invalid width or height.\n"
"Both must be positive.")); "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 static void
layers_dialog_scale_layer_query (GimpImage *gimage, layers_dialog_scale_layer_query (GimpImage *gimage,
Layer *layer) Layer *layer)
@ -3810,16 +3802,22 @@ layers_dialog_scale_layer_query (GimpImage *gimage,
options->resize = resize_widget_new (ScaleWidget, options->resize = resize_widget_new (ScaleWidget,
ResizeLayer, ResizeLayer,
GTK_OBJECT (layer), GTK_OBJECT (layer),
drawable_width (GIMP_DRAWABLE(layer)), "removed",
drawable_height (GIMP_DRAWABLE(layer)), drawable_width (GIMP_DRAWABLE (layer)),
drawable_height (GIMP_DRAWABLE (layer)),
gimage->xresolution, gimage->xresolution,
gimage->yresolution, gimage->yresolution,
gimage->unit, gimage->unit,
TRUE, TRUE,
scale_layer_query_ok_callback, scale_layer_query_ok_callback,
scale_layer_query_cancel_callback, NULL,
options); 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); gtk_widget_show (options->resize->resize_shell);
} }
@ -3867,25 +3865,13 @@ resize_layer_query_ok_callback (GtkWidget *widget,
gdisplays_flush (); gdisplays_flush ();
} }
resize_widget_free (options->resize); gtk_widget_destroy (options->resize->resize_shell);
g_free (options);
} }
else else
g_message (_("Invalid width or height.\n" g_message (_("Invalid width or height.\n"
"Both must be positive.")); "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 static void
layers_dialog_resize_layer_query (GimpImage *gimage, layers_dialog_resize_layer_query (GimpImage *gimage,
Layer *layer) Layer *layer)
@ -3898,16 +3884,22 @@ layers_dialog_resize_layer_query (GimpImage *gimage,
options->resize = resize_widget_new (ResizeWidget, options->resize = resize_widget_new (ResizeWidget,
ResizeLayer, ResizeLayer,
GTK_OBJECT (layer), GTK_OBJECT (layer),
drawable_width (GIMP_DRAWABLE(layer)), "removed",
drawable_height (GIMP_DRAWABLE(layer)), drawable_width (GIMP_DRAWABLE (layer)),
drawable_height (GIMP_DRAWABLE (layer)),
gimage->xresolution, gimage->xresolution,
gimage->yresolution, gimage->yresolution,
gimage->unit, gimage->unit,
TRUE, TRUE,
resize_layer_query_ok_callback, resize_layer_query_ok_callback,
resize_layer_query_cancel_callback, NULL,
options); 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); gtk_widget_show (options->resize->resize_shell);
} }

View File

@ -15,8 +15,8 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <math.h>
#include "config.h" #include "config.h"
#include "appenv.h" #include "appenv.h"
#include "gdisplay.h" #include "gdisplay.h"
#include "resize.h" #include "resize.h"
@ -26,7 +26,9 @@
#include "libgimp/gimpchainbutton.h" #include "libgimp/gimpchainbutton.h"
#include "libgimp/gimplimits.h" #include "libgimp/gimplimits.h"
#include "libgimp/gimpmath.h"
#include "libgimp/gimpsizeentry.h" #include "libgimp/gimpsizeentry.h"
#include "libgimp/gimpintl.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
@ -56,9 +58,6 @@ struct _ResizePrivate
GtkWidget *resolution_se; GtkWidget *resolution_se;
GtkWidget *equal_res; GtkWidget *equal_res;
GtkObject *object;
guint object_destroy_handler;
gdouble ratio; gdouble ratio;
gint old_width, old_height; gint old_width, old_height;
gdouble old_res_x, old_res_y; gdouble old_res_x, old_res_y;
@ -85,6 +84,7 @@ Resize *
resize_widget_new (ResizeType type, resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject *object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -112,8 +112,13 @@ resize_widget_new (ResizeType type,
alignment = NULL; alignment = NULL;
frame = NULL; frame = NULL;
resize = g_new (Resize, 1);
private = g_new (ResizePrivate, 1); private = g_new (ResizePrivate, 1);
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->type = type;
resize->target = target; resize->target = target;
resize->private_part = private; resize->private_part = private;
@ -126,11 +131,6 @@ resize_widget_new (ResizeType type,
resize->ratio_y = 1.0; resize->ratio_y = 1.0;
resize->offset_x = 0; resize->offset_x = 0;
resize->offset_y = 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;
/* Get the image width and height variables, based on the gimage */ /* Get the image width and height variables, based on the gimage */
if (width > height) if (width > height)
@ -192,21 +192,33 @@ resize_widget_new (ResizeType type,
_("OK"), ok_cb, _("OK"), ok_cb,
user_data, NULL, NULL, TRUE, FALSE, user_data, NULL, NULL, TRUE, FALSE,
_("Cancel"), cancel_cb, _("Cancel"), cancel_cb ? cancel_cb : gtk_widget_destroy,
user_data, NULL, NULL, FALSE, TRUE, cancel_cb ? user_data : NULL,
cancel_cb ? NULL : (gpointer) 1,
NULL, FALSE, TRUE,
NULL); 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 */ /* handle the image disappearing under our feet */
if (object) if (object && signal)
{ {
const gchar *signame; if (cancel_cb)
gtk_signal_connect (GTK_OBJECT (object), signal,
signame = (target == ResizeLayer) ? "removed" : "destroy"; cancel_cb,
private->object = object; user_data);
private->object_destroy_handler = else
gtk_signal_connect (GTK_OBJECT (object), signame, cancel_cb, user_data); gtk_signal_connect_object_while_alive
(GTK_OBJECT (object), signal,
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (resize->resize_shell));
} }
/* the main vbox */ /* the main vbox */
@ -638,28 +650,14 @@ resize_widget_new (ResizeType type,
return resize; 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 static void
resize_draw (Resize *resize) resize_draw (Resize *resize)
{ {
GtkWidget *widget; GtkWidget *widget;
ResizePrivate *private; ResizePrivate *private;
int aw, ah; gint aw, ah;
int x, y; gint x, y;
int w, h; gint w, h;
/* Only need to draw if it's a resize widget */ /* Only need to draw if it's a resize widget */
if (resize->type != ResizeWidget) if (resize->type != ResizeWidget)
@ -1196,7 +1194,8 @@ resize_events (GtkWidget *widget,
/*** Resize sanity checks ***/ /*** Resize sanity checks ***/
void resize_scale_implement (ImageResize *image_scale) void
resize_scale_implement (ImageResize *image_scale)
{ {
GImage *gimage = NULL; GImage *gimage = NULL;
gboolean rulers_flush = FALSE; gboolean rulers_flush = FALSE;
@ -1270,24 +1269,23 @@ void resize_scale_implement (ImageResize *image_scale)
} }
} }
static static void
void resize_scale_warn_callback (GtkWidget *widget, resize_scale_warn_callback (GtkWidget *widget,
gboolean do_scale, gboolean do_scale,
gpointer client_data) gpointer client_data)
{ {
ImageResize *image_scale = NULL; ImageResize *image_scale = NULL;
GImage *gimage = NULL; GImage *gimage = NULL;
g_assert(client_data != NULL); g_assert (client_data != NULL);
image_scale = (ImageResize *) client_data; image_scale = (ImageResize *) client_data;
gimage = image_scale->gimage; 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_scale_implement (image_scale);
resize_widget_free (image_scale->resize); gtk_widget_destroy (image_scale->resize->resize_shell);
g_free (image_scale);
} }
else else
gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE); gtk_widget_set_sensitive (image_scale->resize->resize_shell, TRUE);
@ -1309,17 +1307,16 @@ resize_check_layer_scaling (ImageResize *image_scale)
GSList *list = NULL; GSList *list = NULL;
Layer *layer = NULL; Layer *layer = NULL;
GtkWidget *dialog = 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. */ /* Step through layers; test scaled dimensions. */
success = TRUE; success = TRUE;
list = gimage->layers; list = gimage->layers;
while(list && success == TRUE) while (list && success == TRUE)
{ {
layer = (Layer *)list->data; layer = (Layer *)list->data;
success = layer_check_scaling (layer, success = layer_check_scaling (layer,
@ -1329,25 +1326,23 @@ resize_check_layer_scaling (ImageResize *image_scale)
} }
/* Warn user on failure */ /* Warn user on failure */
if(success == FALSE) if (success == FALSE)
{ {
gtk_widget_set_sensitive (image_scale->resize->resize_shell, 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 = dialog =
gimp_query_boolean_box (_("Layer Too Small"), gimp_query_boolean_box (_("Layer Too Small"),
gimp_standard_help_func, gimp_standard_help_func,
"dialogs/scale_layer_warn.html", "dialogs/scale_layer_warn.html",
FALSE, FALSE,
str, _("The chosen image size will shrink\n"
"some layers completely away.\n"
"Is this what you want?"),
_("OK"), _("Cancel"), _("OK"), _("Cancel"),
NULL, NULL, GTK_OBJECT (image_scale->resize->resize_shell),
"destroy",
resize_scale_warn_callback, resize_scale_warn_callback,
image_scale); image_scale);
g_free (str);
gtk_widget_show (dialog); gtk_widget_show (dialog);
} }
} }

View File

@ -37,7 +37,6 @@ typedef struct _Resize Resize;
struct _Resize struct _Resize
{ {
/* The calling procedure is respondible for showing this widget */
GtkWidget *resize_shell; GtkWidget *resize_shell;
ResizeType type; ResizeType type;
@ -67,12 +66,17 @@ typedef struct
} ImageResize; } ImageResize;
/* If resolution_x is zero, then don't show resolution modification /* If resolution_x is zero, then don't show resolution modification
* parts of the dialog. If object is non-NULL, then attach the cancel * parts of the dialog.
* callback to its destroy signal. */ *
* 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, Resize * resize_widget_new (ResizeType type,
ResizeTarget target, ResizeTarget target,
GtkObject * object, GtkObject *object,
gchar *signal,
gint width, gint width,
gint height, gint height,
gdouble resolution_x, gdouble resolution_x,
@ -82,11 +86,10 @@ Resize * resize_widget_new (ResizeType type,
GtkSignalFunc ok_cb, GtkSignalFunc ok_cb,
GtkSignalFunc cancel_cb, GtkSignalFunc cancel_cb,
gpointer user_data); gpointer user_data);
void resize_widget_free (Resize * resize);
/* Layer scaling sanity check and warning dialogs */ /* Layer scaling sanity check and warning dialogs */
gboolean resize_check_layer_scaling (ImageResize *); gboolean resize_check_layer_scaling (ImageResize *image_resize);
void resize_scale_implement (ImageResize *); void resize_scale_implement (ImageResize *image_resize);
#endif /* __RESIZE_H__ */ #endif /* __RESIZE_H__ */

View File

@ -438,6 +438,14 @@ color_area_events (GtkWidget *widget,
return FALSE; 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 * GtkWidget *
color_area_create (gint width, color_area_create (gint width,
gint height, gint height,
@ -458,6 +466,10 @@ color_area_create (gint width,
GTK_SIGNAL_FUNC (color_area_events), GTK_SIGNAL_FUNC (color_area_events),
NULL); NULL);
gtk_signal_connect (GTK_OBJECT (color_area), "realize",
GTK_SIGNAL_FUNC (color_area_realize),
NULL);
default_pixmap = default_pmap; default_pixmap = default_pmap;
default_mask = default_msk; default_mask = default_msk;

View File

@ -53,7 +53,7 @@ static void gimp_chain_button_realize (GtkWidget *widget);
static void gimp_chain_button_clicked_callback (GtkWidget *widget, static void gimp_chain_button_clicked_callback (GtkWidget *widget,
GimpChainButton *gcb); GimpChainButton *gcb);
static gint gimp_chain_button_draw_lines (GtkWidget *widget, static gint gimp_chain_button_draw_lines (GtkWidget *widget,
GdkEvent *event, GdkEventExpose *eevent,
GimpChainButton *gcb); GimpChainButton *gcb);
static GtkTableClass *parent_class = NULL; 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); gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->chain, gcb->chain_mask);
else else
gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->broken, gcb->broken_mask); 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 static void
@ -299,7 +307,7 @@ gimp_chain_button_clicked_callback (GtkWidget *widget,
static gint static gint
gimp_chain_button_draw_lines (GtkWidget *widget, gimp_chain_button_draw_lines (GtkWidget *widget,
GdkEvent *event, GdkEventExpose *eevent,
GimpChainButton *gcb) GimpChainButton *gcb)
{ {
GdkPoint points[3]; 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); 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].x = widget->allocation.width / 2;
points[0].y = widget->allocation.height / 2; points[0].y = widget->allocation.height / 2;
@ -371,10 +372,13 @@ gimp_chain_button_draw_lines (GtkWidget *widget,
points[2] = buf; points[2] = buf;
} }
gtk_draw_polygon (widget->style, gtk_paint_polygon (widget->style,
widget->window, widget->window,
GTK_STATE_NORMAL, GTK_STATE_NORMAL,
shadow, shadow,
&eevent->area,
widget,
"chainbutton",
points, points,
3, 3,
FALSE); FALSE);

View File

@ -53,7 +53,7 @@ static void gimp_chain_button_realize (GtkWidget *widget);
static void gimp_chain_button_clicked_callback (GtkWidget *widget, static void gimp_chain_button_clicked_callback (GtkWidget *widget,
GimpChainButton *gcb); GimpChainButton *gcb);
static gint gimp_chain_button_draw_lines (GtkWidget *widget, static gint gimp_chain_button_draw_lines (GtkWidget *widget,
GdkEvent *event, GdkEventExpose *eevent,
GimpChainButton *gcb); GimpChainButton *gcb);
static GtkTableClass *parent_class = NULL; 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); gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->chain, gcb->chain_mask);
else else
gtk_pixmap_set (GTK_PIXMAP (gcb->pixmap), gcb->broken, gcb->broken_mask); 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 static void
@ -299,7 +307,7 @@ gimp_chain_button_clicked_callback (GtkWidget *widget,
static gint static gint
gimp_chain_button_draw_lines (GtkWidget *widget, gimp_chain_button_draw_lines (GtkWidget *widget,
GdkEvent *event, GdkEventExpose *eevent,
GimpChainButton *gcb) GimpChainButton *gcb)
{ {
GdkPoint points[3]; 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); 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].x = widget->allocation.width / 2;
points[0].y = widget->allocation.height / 2; points[0].y = widget->allocation.height / 2;
@ -371,10 +372,13 @@ gimp_chain_button_draw_lines (GtkWidget *widget,
points[2] = buf; points[2] = buf;
} }
gtk_draw_polygon (widget->style, gtk_paint_polygon (widget->style,
widget->window, widget->window,
GTK_STATE_NORMAL, GTK_STATE_NORMAL,
shadow, shadow,
&eevent->area,
widget,
"chainbutton",
points, points,
3, 3,
FALSE); FALSE);