From a1c1fe4c70149f78381e78bcf83208220132e7e0 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 23 Jun 2003 23:34:50 +0000 Subject: [PATCH] app/core/gimpimage-undo-push.c (undo_pop_image_grid) ref/unref the grid. 2003-06-24 Michael Natterer * app/core/gimpimage-undo-push.c (undo_pop_image_grid) * app/core/gimpimage.c (gimp_image_set_grid): ref/unref the grid. * app/gui/view-commands.c (view_configure_grid_cmd_callback): set the dialog transient for the shell, make shell->grid_dialog a weak pointer of the grid dialog. * app/gui/grid-dialog.c: don't set shell->grid_dialog to NULL here, attach the grid using g_object_set_data_full() and don't unref it explicitely. Use gimp_config_is_equal_to() instead of gimp_config_diff(). --- ChangeLog | 14 ++++++++++++++ app/actions/view-commands.c | 13 ++++++++----- app/core/gimpimage-undo-push.c | 10 ++++++++-- app/core/gimpimage.c | 16 +++++++++++++--- app/dialogs/grid-dialog.c | 18 +++++------------- app/gui/grid-dialog.c | 18 +++++------------- app/gui/view-commands.c | 13 ++++++++----- 7 files changed, 61 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7e603137f1..fade5acfbf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-06-24 Michael Natterer + + * app/core/gimpimage-undo-push.c (undo_pop_image_grid) + * app/core/gimpimage.c (gimp_image_set_grid): ref/unref the grid. + + * app/gui/view-commands.c (view_configure_grid_cmd_callback): set + the dialog transient for the shell, make shell->grid_dialog a + weak pointer of the grid dialog. + + * app/gui/grid-dialog.c: don't set shell->grid_dialog to NULL + here, attach the grid using g_object_set_data_full() and don't + unref it explicitely. Use gimp_config_is_equal_to() instead of + gimp_config_diff(). + 2003-06-24 Sven Neumann * plug-ins/common/grid.c (dialog): update the preview when the diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c index 7201a72093..0b90b8f00a 100644 --- a/app/actions/view-commands.c +++ b/app/actions/view-commands.c @@ -364,11 +364,14 @@ view_configure_grid_cmd_callback (GtkWidget *widget, if (! shell->grid_dialog) { shell->grid_dialog = grid_dialog_new (GIMP_DISPLAY (gdisp)); - - g_signal_connect_object (gdisp, "disconnect", - G_CALLBACK (gtk_widget_destroy), - shell->grid_dialog, - G_CONNECT_SWAPPED); + + gtk_window_set_transient_for (GTK_WINDOW (shell->grid_dialog), + GTK_WINDOW (shell)); + gtk_window_set_destroy_with_parent (GTK_WINDOW (shell->grid_dialog), + TRUE); + + g_object_add_weak_pointer (G_OBJECT (shell->grid_dialog), + (gpointer *) &shell->grid_dialog); } gtk_window_present (GTK_WINDOW (shell->grid_dialog)); diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c index 5472c679d9..31641eb3f7 100644 --- a/app/core/gimpimage-undo-push.c +++ b/app/core/gimpimage-undo-push.c @@ -669,8 +669,6 @@ gimp_image_undo_push_image_grid (GimpImage *gimage, if (grid) gu->grid = g_object_ref (grid); - else - gu->grid = NULL; return TRUE; } @@ -689,7 +687,15 @@ undo_pop_image_grid (GimpUndo *undo, gu = (GridUndo *) undo->data; tmp = gimp_image_get_grid (undo->gimage); + + if (tmp) + g_object_ref (tmp); + gimp_image_set_grid (undo->gimage, gu->grid, FALSE); + + if (gu->grid) + g_object_unref (gu->grid); + gu->grid = tmp; return TRUE; diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index bfa40c5fc0..5c710bb156 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -3271,9 +3271,19 @@ gimp_image_set_grid (GimpImage *gimage, g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (grid == NULL || GIMP_IS_GRID (grid)); - if (push_undo) - gimp_image_undo_push_image_grid (gimage, _("Grid"), gimage->grid); + if (grid != gimage->grid) + { + if (push_undo) + gimp_image_undo_push_image_grid (gimage, _("Grid"), gimage->grid); + + if (gimage->grid) + g_object_unref (gimage->grid); + + gimage->grid = grid; + + if (gimage->grid) + g_object_ref (gimage->grid); + } - gimage->grid = grid; gimp_image_grid_changed (gimage); } diff --git a/app/dialogs/grid-dialog.c b/app/dialogs/grid-dialog.c index cd3ac253c8..ec0755cef2 100644 --- a/app/dialogs/grid-dialog.c +++ b/app/dialogs/grid-dialog.c @@ -283,7 +283,8 @@ grid_dialog_new (GimpDisplay *gdisp) g_object_set_data (G_OBJECT (dialog), "gimage", gimage); g_object_set_data (G_OBJECT (dialog), "shell", shell); - g_object_set_data (G_OBJECT (dialog), "grid", grid); + g_object_set_data_full (G_OBJECT (dialog), "grid", grid, + (GDestroyNotify) g_object_unref); g_object_set_data (G_OBJECT (dialog), "show-button", show_button); g_object_set_data (G_OBJECT (dialog), "snap-button", snap_button); @@ -353,16 +354,13 @@ remove_callback (GtkWidget *widget, { GimpImage *gimage; GimpDisplayShell *shell; - GimpGrid *grid; gimage = g_object_get_data (G_OBJECT (dialog), "gimage"); shell = g_object_get_data (G_OBJECT (dialog), "shell"); - grid = g_object_get_data (G_OBJECT (dialog), "grid"); gimp_image_set_grid (gimage, NULL, TRUE); - g_object_unref (G_OBJECT (grid)); + gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } @@ -371,14 +369,10 @@ cancel_callback (GtkWidget *widget, GtkWidget *dialog) { GimpDisplayShell *shell; - GimpGrid *grid; shell = g_object_get_data (G_OBJECT (dialog), "shell"); - grid = g_object_get_data (G_OBJECT (dialog), "grid"); - g_object_unref (G_OBJECT (grid)); gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } static void @@ -402,10 +396,9 @@ ok_callback (GtkWidget *widget, grid_orig = gimp_image_get_grid (GIMP_IMAGE (gimage)); - if (grid_orig == NULL || gimp_config_diff (G_OBJECT (grid_orig), G_OBJECT (grid), 0)) + if (grid_orig == NULL || ! gimp_config_is_equal_to (G_OBJECT (grid_orig), + G_OBJECT (grid))) gimp_image_set_grid (GIMP_IMAGE (gimage), grid, TRUE); - else - g_object_unref (G_OBJECT (grid)); show_grid = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (show_button)); gimp_display_shell_set_show_grid (GIMP_DISPLAY_SHELL (shell), show_grid); @@ -414,5 +407,4 @@ ok_callback (GtkWidget *widget, gimp_display_shell_set_snap_to_grid (GIMP_DISPLAY_SHELL (shell), snap_to_grid); gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } diff --git a/app/gui/grid-dialog.c b/app/gui/grid-dialog.c index cd3ac253c8..ec0755cef2 100644 --- a/app/gui/grid-dialog.c +++ b/app/gui/grid-dialog.c @@ -283,7 +283,8 @@ grid_dialog_new (GimpDisplay *gdisp) g_object_set_data (G_OBJECT (dialog), "gimage", gimage); g_object_set_data (G_OBJECT (dialog), "shell", shell); - g_object_set_data (G_OBJECT (dialog), "grid", grid); + g_object_set_data_full (G_OBJECT (dialog), "grid", grid, + (GDestroyNotify) g_object_unref); g_object_set_data (G_OBJECT (dialog), "show-button", show_button); g_object_set_data (G_OBJECT (dialog), "snap-button", snap_button); @@ -353,16 +354,13 @@ remove_callback (GtkWidget *widget, { GimpImage *gimage; GimpDisplayShell *shell; - GimpGrid *grid; gimage = g_object_get_data (G_OBJECT (dialog), "gimage"); shell = g_object_get_data (G_OBJECT (dialog), "shell"); - grid = g_object_get_data (G_OBJECT (dialog), "grid"); gimp_image_set_grid (gimage, NULL, TRUE); - g_object_unref (G_OBJECT (grid)); + gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } @@ -371,14 +369,10 @@ cancel_callback (GtkWidget *widget, GtkWidget *dialog) { GimpDisplayShell *shell; - GimpGrid *grid; shell = g_object_get_data (G_OBJECT (dialog), "shell"); - grid = g_object_get_data (G_OBJECT (dialog), "grid"); - g_object_unref (G_OBJECT (grid)); gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } static void @@ -402,10 +396,9 @@ ok_callback (GtkWidget *widget, grid_orig = gimp_image_get_grid (GIMP_IMAGE (gimage)); - if (grid_orig == NULL || gimp_config_diff (G_OBJECT (grid_orig), G_OBJECT (grid), 0)) + if (grid_orig == NULL || ! gimp_config_is_equal_to (G_OBJECT (grid_orig), + G_OBJECT (grid))) gimp_image_set_grid (GIMP_IMAGE (gimage), grid, TRUE); - else - g_object_unref (G_OBJECT (grid)); show_grid = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (show_button)); gimp_display_shell_set_show_grid (GIMP_DISPLAY_SHELL (shell), show_grid); @@ -414,5 +407,4 @@ ok_callback (GtkWidget *widget, gimp_display_shell_set_snap_to_grid (GIMP_DISPLAY_SHELL (shell), snap_to_grid); gtk_widget_destroy (dialog); - shell->grid_dialog = NULL; } diff --git a/app/gui/view-commands.c b/app/gui/view-commands.c index 7201a72093..0b90b8f00a 100644 --- a/app/gui/view-commands.c +++ b/app/gui/view-commands.c @@ -364,11 +364,14 @@ view_configure_grid_cmd_callback (GtkWidget *widget, if (! shell->grid_dialog) { shell->grid_dialog = grid_dialog_new (GIMP_DISPLAY (gdisp)); - - g_signal_connect_object (gdisp, "disconnect", - G_CALLBACK (gtk_widget_destroy), - shell->grid_dialog, - G_CONNECT_SWAPPED); + + gtk_window_set_transient_for (GTK_WINDOW (shell->grid_dialog), + GTK_WINDOW (shell)); + gtk_window_set_destroy_with_parent (GTK_WINDOW (shell->grid_dialog), + TRUE); + + g_object_add_weak_pointer (G_OBJECT (shell->grid_dialog), + (gpointer *) &shell->grid_dialog); } gtk_window_present (GTK_WINDOW (shell->grid_dialog));