From fe11741319484b3a11187732f33d72efb8eb318e Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Sat, 5 Apr 2008 20:32:24 +0000 Subject: [PATCH] added new function gimp_display_close() which decides if 2008-04-05 Sven Neumann * app/display/gimpdisplay.[ch]: added new function gimp_display_close() which decides if gimp_display_delete() or gimp_display_empty() needs to be called. * app/display/gimpdisplay-foreach.[ch]: added new function gimp_displays_close() and removed the 'do_quit' parameter from gimp_displays_delete(). * app/gui/gui.c (gui_exit_callback): changed accordingly. * app/display/gimpdisplayshell-close.c: removed gimp_display_shell_really_close() and call gimp_display_close() instead. * app/display/gimpdisplayshell.c (gimp_display_shell_empty): moved code to update the ui managers here. * app/actions/file-commands.c (file_save_cmd_callback) (file_close_cmd_callback) * app/dialogs/file-save-dialog.c (file_save_dialog_response) * app/dialogs/quit-dialog.c (quit_close_all_dialog_response): close displays instead of deleting them. * app/gui/gui-vtable.c (gui_display_delete): call gimp_display_close(). svn path=/trunk/; revision=25377 --- ChangeLog | 28 ++++++++++++++ app/actions/file-commands.c | 4 +- app/dialogs/file-save-dialog.c | 2 +- app/dialogs/quit-dialog.c | 2 +- app/display/gimpdisplay-foreach.c | 55 ++++++++++++++++++++-------- app/display/gimpdisplay-foreach.h | 4 +- app/display/gimpdisplay.c | 32 +++++++++++++++- app/display/gimpdisplay.h | 1 + app/display/gimpdisplayshell-close.c | 28 +------------- app/display/gimpdisplayshell.c | 10 +++++ app/gui/gui-vtable.c | 2 +- app/gui/gui.c | 2 +- 12 files changed, 118 insertions(+), 52 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2711747e01..949e5903b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2008-04-05 Sven Neumann + + * app/display/gimpdisplay.[ch]: added new function + gimp_display_close() which decides if gimp_display_delete() or + gimp_display_empty() needs to be called. + + * app/display/gimpdisplay-foreach.[ch]: added new function + gimp_displays_close() and removed the 'do_quit' parameter from + gimp_displays_delete(). + + * app/gui/gui.c (gui_exit_callback): changed accordingly. + + * app/display/gimpdisplayshell-close.c: removed + gimp_display_shell_really_close() and call gimp_display_close() + instead. + + * app/display/gimpdisplayshell.c (gimp_display_shell_empty): moved + code to update the ui managers here. + + * app/actions/file-commands.c (file_save_cmd_callback) + (file_close_cmd_callback) + * app/dialogs/file-save-dialog.c (file_save_dialog_response) + * app/dialogs/quit-dialog.c (quit_close_all_dialog_response): + close displays instead of deleting them. + + * app/gui/gui-vtable.c (gui_display_delete): call + gimp_display_close(). + 2008-04-05 Sven Neumann * app/widgets/gimpcolormapeditor.c (gimp_colormap_editor_draw): diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c index c4dcdb22a1..8e37fd1beb 100644 --- a/app/actions/file-commands.c +++ b/app/actions/file-commands.c @@ -302,7 +302,7 @@ file_save_cmd_callback (GtkAction *action, if (save_mode == GIMP_SAVE_MODE_SAVE_AND_CLOSE && saved && ! display->image->dirty) { - gimp_display_delete (display); + gimp_display_close (display); } } @@ -408,7 +408,7 @@ file_close_all_cmd_callback (GtkAction *action, if (! gimp_displays_dirty (gimp)) { - gimp_displays_delete (gimp, FALSE); + gimp_displays_close (gimp); } else { diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c index bbb0551c4f..ed4fd80361 100644 --- a/app/dialogs/file-save-dialog.c +++ b/app/dialogs/file-save-dialog.c @@ -156,7 +156,7 @@ file_save_dialog_response (GtkWidget *save_dialog, display = GIMP_DISPLAY_SHELL (parent)->display; if (! display->image->dirty) - gimp_display_delete (display); + gimp_display_close (display); } } } diff --git a/app/dialogs/quit-dialog.c b/app/dialogs/quit-dialog.c index e8320e908e..7cfa9c79b2 100644 --- a/app/dialogs/quit-dialog.c +++ b/app/dialogs/quit-dialog.c @@ -196,7 +196,7 @@ quit_close_all_dialog_response (GtkWidget *dialog, if (do_quit) gimp_exit (gimp, TRUE); else - gimp_displays_delete (gimp, FALSE); + gimp_displays_close (gimp); } } diff --git a/app/display/gimpdisplay-foreach.c b/app/display/gimpdisplay-foreach.c index 023388d6ef..b47fdcd117 100644 --- a/app/display/gimpdisplay-foreach.c +++ b/app/display/gimpdisplay-foreach.c @@ -139,32 +139,55 @@ gimp_displays_get_dirty_images (Gimp *gimp) return NULL; } +/** + * gimp_displays_delete: + * @gimp: + * + * Calls gimp_display_delete() an all displays in the display list. + * This closes all displays, including the first one which is usually + * kept open. + */ void -gimp_displays_delete (Gimp *gimp, - gboolean quit) +gimp_displays_delete (Gimp *gimp) { - g_return_if_fail (GIMP_IS_GIMP (gimp)); - /* this removes the GimpDisplay from the list, so do a while loop * "around" the first element to get them all */ - while (GIMP_LIST (gimp->displays)->list) + while (! gimp_container_is_empty (gimp->displays)) { - GList *list = GIMP_LIST (gimp->displays)->list; - GimpDisplay *display = list->data; + GimpDisplay *display = GIMP_LIST (gimp->displays)->list->data; - if (list->next || quit) - { - gimp_display_delete (display); - } - else - { - gimp_display_empty (display); - break; - } + gimp_display_delete (display); } } +/** + * gimp_displays_close: + * @gimp: + * + * Calls gimp_display_close() an all displays in the display list. The + * first display will remain open without an image. + */ +void +gimp_displays_close (Gimp *gimp) +{ + GList *list; + GList *iter; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + list = g_list_copy (GIMP_LIST (gimp->displays)->list); + + for (iter = list; iter; iter = g_list_next (iter)) + { + GimpDisplay *display = iter->data; + + gimp_display_close (display); + } + + g_list_free (list); +} + void gimp_displays_reconnect (Gimp *gimp, GimpImage *old, diff --git a/app/display/gimpdisplay-foreach.h b/app/display/gimpdisplay-foreach.h index 428fdcee2a..e9cbae0220 100644 --- a/app/display/gimpdisplay-foreach.h +++ b/app/display/gimpdisplay-foreach.h @@ -22,8 +22,8 @@ gboolean gimp_displays_dirty (Gimp *gimp); GimpContainer * gimp_displays_get_dirty_images (Gimp *gimp); -void gimp_displays_delete (Gimp *gimp, - gboolean quit); +void gimp_displays_delete (Gimp *gimp); +void gimp_displays_close (Gimp *gimp); void gimp_displays_reconnect (Gimp *gimp, GimpImage *old, GimpImage *new); diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c index 9f4daa3aa5..580c6514c3 100644 --- a/app/display/gimpdisplay.c +++ b/app/display/gimpdisplay.c @@ -396,6 +396,13 @@ gimp_display_new (Gimp *gimp, return display; } +/** + * gimp_display_delete: + * @display: + * + * Closes the display and removes it from the display list. You should + * not call this function directly, use gimp_display_close() instead. + */ void gimp_display_delete (GimpDisplay *display) { @@ -404,8 +411,7 @@ gimp_display_delete (GimpDisplay *display) g_return_if_fail (GIMP_IS_DISPLAY (display)); /* remove the display from the list */ - gimp_container_remove (display->gimp->displays, - GIMP_OBJECT (display)); + gimp_container_remove (display->gimp->displays, GIMP_OBJECT (display)); /* unrefs the image */ gimp_display_set_image (display, NULL); @@ -434,6 +440,28 @@ gimp_display_delete (GimpDisplay *display) g_object_unref (display); } +/** + * gimp_display_close: + * @display: + * + * Closes the display. If this is the last display, it will remain + * open, but without an image. + */ +void +gimp_display_close (GimpDisplay *display) +{ + g_return_if_fail (GIMP_IS_DISPLAY (display)); + + if (gimp_container_num_children (display->gimp->displays) > 1) + { + gimp_display_delete (display); + } + else + { + gimp_display_empty (display); + } +} + gint gimp_display_get_ID (GimpDisplay *display) { diff --git a/app/display/gimpdisplay.h b/app/display/gimpdisplay.h index d78ab0df67..bea31b708b 100644 --- a/app/display/gimpdisplay.h +++ b/app/display/gimpdisplay.h @@ -67,6 +67,7 @@ GimpDisplay * gimp_display_new (Gimp *gimp, GimpUIManager *popup_manager, GimpDialogFactory *display_factory); void gimp_display_delete (GimpDisplay *display); +void gimp_display_close (GimpDisplay *display); gint gimp_display_get_ID (GimpDisplay *display); GimpDisplay * gimp_display_get_by_ID (Gimp *gimp, diff --git a/app/display/gimpdisplayshell-close.c b/app/display/gimpdisplayshell-close.c index dcc4874c43..089425ef35 100644 --- a/app/display/gimpdisplayshell-close.c +++ b/app/display/gimpdisplayshell-close.c @@ -57,8 +57,6 @@ static gboolean gimp_display_shell_close_time_changed (GimpMessageBox *box); static void gimp_display_shell_close_response (GtkWidget *widget, gboolean close, GimpDisplayShell *shell); -static void gimp_display_shell_really_close (GimpDisplayShell *shell); - static void gimp_time_since (guint then, gint *hours, gint *minutes); @@ -96,7 +94,7 @@ gimp_display_shell_close (GimpDisplayShell *shell, } else if (image) { - gimp_display_shell_really_close (shell); + gimp_display_close (shell->display); } else { @@ -289,7 +287,7 @@ gimp_display_shell_close_response (GtkWidget *widget, switch (response_id) { case GTK_RESPONSE_CLOSE: - gimp_display_shell_really_close (shell); + gimp_display_close (shell->display); break; case RESPONSE_SAVE: @@ -302,28 +300,6 @@ gimp_display_shell_close_response (GtkWidget *widget, } } -static void -gimp_display_shell_really_close (GimpDisplayShell *shell) -{ - if (gimp_container_num_children (shell->display->gimp->displays) > 1) - { - gimp_display_delete (shell->display); - } - else - { - GimpContext *user_context; - - gimp_display_empty (shell->display); - - gimp_ui_manager_update (shell->menubar_manager, shell->display); - - user_context = gimp_get_user_context (shell->display->gimp); - - if (shell->display == gimp_context_get_display (user_context)) - gimp_ui_manager_update (shell->popup_manager, shell->display); - } -} - static void gimp_time_since (guint then, gint *hours, diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 75de359a34..026f681e0d 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -1245,6 +1245,7 @@ void gimp_display_shell_empty (GimpDisplayShell *shell) { GimpSessionInfo *session_info; + GimpContext *user_context; gint width; gint height; @@ -1298,6 +1299,15 @@ gimp_display_shell_empty (GimpDisplayShell *shell) gimp_display_shell_expose_full (shell); gtk_window_resize (GTK_WINDOW (shell), width, height); + + /* update the ui managers */ + + gimp_ui_manager_update (shell->menubar_manager, shell->display); + + user_context = gimp_get_user_context (shell->display->gimp); + + if (shell->display == gimp_context_get_display (user_context)) + gimp_ui_manager_update (shell->popup_manager, shell->display); } static gboolean diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c index fb2e46e1d8..6c97c26f21 100644 --- a/app/gui/gui-vtable.c +++ b/app/gui/gui-vtable.c @@ -363,7 +363,7 @@ gui_display_create (Gimp *gimp, static void gui_display_delete (GimpObject *display) { - gimp_display_delete (GIMP_DISPLAY (display)); + gimp_display_close (GIMP_DISPLAY (display)); } static void diff --git a/app/gui/gui.c b/app/gui/gui.c index 730403b9b2..1ab0986ccb 100644 --- a/app/gui/gui.c +++ b/app/gui/gui.c @@ -584,7 +584,7 @@ gui_exit_callback (Gimp *gimp, gui_display_changed, gimp); - gimp_displays_delete (gimp, TRUE); + gimp_displays_delete (gimp); gimp_tools_save (gimp, gui_config->save_tool_options, FALSE); gimp_tools_exit (gimp);