[gimp] Bug 650348 - Window unmaximizes when a document is closed
- From: Martin Nordholts <martinn src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 650348 - Window unmaximizes when a document is closed
- Date: Tue, 9 Aug 2011 18:27:11 +0000 (UTC)
commit b9ccf189b49ac2a272c00ee038df7da8a287213a
Author: Martin Nordholts <martinn src gnome org>
Date: Tue Aug 9 20:23:51 2011 +0200
Bug 650348 - Window unmaximizes when a document is closed
Refactor GimpImageWindow session management. As far as session
management goes, there are four states and four transitions that are
interesting.
The states are:
State Window mode Images opened
------------------------------------------
s1 swm 0
s2 swm >0
s3 mwm 0
s4 mwm >0
The transitions are:
Transition Description
-------------------------------------------
t1 Enter single-window mode (swm)
t2 Enter multi-window mwm (mwm)
t3 Open an image
t4 Close an image
When thinking of it like this, it is pretty easy to see when to call
gimp_image_window_session_clear() and when to call
gimp_image_window_session_apply(). So kill
gimp_image_window_set_entry_id() and handle all transitions in
gimp_image_window_session_update().
NEWS | 2 +
app/display/gimpimagewindow.c | 113 +++++++++++++++++++++++------------------
2 files changed, 65 insertions(+), 50 deletions(-)
---
diff --git a/NEWS b/NEWS
index 30e1e64..c361d72 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,8 @@ UI:
better
- Add a canvas item for the transform grid, fixing a major speed
regression, and add the same guides options as in the rectangle tools
+ - Don't unmaximize the single-window mode image window when closing
+ images
Core:
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index 319dd3e..5d3a2ab 100644
--- a/app/display/gimpimagewindow.c
+++ b/app/display/gimpimagewindow.c
@@ -173,11 +173,9 @@ static void gimp_image_window_session_apply (GimpImageWindow *win
const gchar *entry_id);
static void gimp_image_window_session_update (GimpImageWindow *window,
GimpDisplay *new_display,
- gboolean from_switch_page);
+ const gchar *new_entry_id);
static const gchar *
gimp_image_window_config_to_entry_id (GimpGuiConfig *config);
-static void gimp_image_window_set_entry_id (GimpImageWindow *window,
- const gchar *entry_id);
static void gimp_image_window_show_tooltip (GimpUIManager *manager,
const gchar *tooltip,
GimpImageWindow *window);
@@ -419,11 +417,9 @@ gimp_image_window_constructed (GObject *object)
G_CALLBACK (gimp_image_window_config_notify),
window, G_CONNECT_SWAPPED);
- private->entry_id = gimp_image_window_config_to_entry_id (config);
-
gimp_image_window_session_update (window,
NULL /*new_display*/,
- FALSE /*from_switch_page*/);
+ gimp_image_window_config_to_entry_id (config));
}
static void
@@ -1494,8 +1490,9 @@ gimp_image_window_config_notify (GimpImageWindow *window,
/* Session management */
if (strcmp (pspec->name, "single-window-mode") == 0)
{
- gimp_image_window_set_entry_id (window,
- gimp_image_window_config_to_entry_id (config));
+ gimp_image_window_session_update (window,
+ NULL /*new_display*/,
+ gimp_image_window_config_to_entry_id (config));
}
}
@@ -1608,7 +1605,7 @@ gimp_image_window_switch_page (GtkNotebook *notebook,
gimp_image_window_session_update (window,
active_display,
- TRUE /*from_switch_page*/);
+ NULL /*new_entry_id*/);
gimp_ui_manager_update (private->menubar_manager, active_display);
}
@@ -1670,7 +1667,7 @@ gimp_image_window_image_notify (GimpDisplay *display,
gimp_image_window_session_update (window,
display,
- FALSE /*from_switch_page*/);
+ NULL /*new_entry_id*/);
view = gtk_notebook_get_tab_label (GTK_NOTEBOOK (private->notebook),
GTK_WIDGET (gimp_display_get_shell (display)));
@@ -1736,24 +1733,73 @@ gimp_image_window_session_apply (GimpImageWindow *window,
static void
gimp_image_window_session_update (GimpImageWindow *window,
GimpDisplay *new_display,
- gboolean from_switch_page)
+ const gchar *new_entry_id)
{
GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
- if (private->entry_id == NULL)
- return;
+ /* Handle changes to the entry id */
+ if (new_entry_id)
+ {
+ if (! private->entry_id)
+ {
+ /* We're initializing. If we're in single-window mode, this
+ * will be the only window, so start to session manage
+ * it. If we're in multi-window mode, we will find out if we
+ * should session manage ourselves when we get a display
+ */
+ if (strcmp (new_entry_id, GIMP_SINGLE_IMAGE_WINDOW_ENTRY_ID) == 0)
+ {
+ gimp_image_window_session_apply (window, new_entry_id);
+ }
+ }
+ else if (strcmp (private->entry_id, new_entry_id) != 0)
+ {
+ /* The entry id changed, immediately and always stop session
+ * managing the old entry
+ */
+ gimp_image_window_session_clear (window);
+
+ if (strcmp (new_entry_id, GIMP_EMPTY_IMAGE_WINDOW_ENTRY_ID) == 0)
+ {
+ /* If there is only one imageless display, we shall
+ * become the empty image window
+ */
+ if (private->active_shell &&
+ private->active_shell->display &&
+ ! gimp_display_get_image (private->active_shell->display) &&
+ g_list_length (private->shells) <= 1)
+ {
+ gimp_image_window_session_apply (window, new_entry_id);
+ }
+ }
+ else if (strcmp (new_entry_id, GIMP_SINGLE_IMAGE_WINDOW_ENTRY_ID) == 0)
+ {
+ /* As soon as we become the single image window, we
+ * shall session manage ourself until single-window mode
+ * is exited
+ */
+ gimp_image_window_session_apply (window, new_entry_id);
+ }
+ }
+
+ private->entry_id = new_entry_id;
+ }
- if (strcmp (private->entry_id, GIMP_EMPTY_IMAGE_WINDOW_ENTRY_ID) == 0)
+ /* Handle changes to the displays. When in single-window mode, we
+ * just keep session managing the single image window. We only need
+ * to care about the multi-window mode case here
+ */
+ if (new_display &&
+ strcmp (private->entry_id, GIMP_EMPTY_IMAGE_WINDOW_ENTRY_ID) == 0)
{
- if (new_display && gimp_display_get_image (new_display))
+ if (gimp_display_get_image (new_display))
{
/* As soon as we have an image we should not affect the size of the
* empty image window
*/
gimp_image_window_session_clear (window);
}
- else if (new_display &&
- ! gimp_display_get_image (new_display) &&
+ else if (! gimp_display_get_image (new_display) &&
g_list_length (private->shells) <= 1)
{
/* As soon as we have no image (and no other shells that may
@@ -1762,18 +1808,6 @@ gimp_image_window_session_update (GimpImageWindow *window,
gimp_image_window_session_apply (window, private->entry_id);
}
}
- else if (strcmp (private->entry_id, GIMP_SINGLE_IMAGE_WINDOW_ENTRY_ID) == 0)
- {
- /* Always session manage the single image window, but not if all
- * we did was switch tabs
- */
- if (! from_switch_page)
- gimp_image_window_session_apply (window, private->entry_id);
- }
- else
- {
- g_assert_not_reached ();
- }
}
static const gchar *
@@ -1785,27 +1819,6 @@ gimp_image_window_config_to_entry_id (GimpGuiConfig *config)
}
static void
-gimp_image_window_set_entry_id (GimpImageWindow *window,
- const gchar *entry_id)
-{
- GimpImageWindowPrivate *private = GIMP_IMAGE_WINDOW_GET_PRIVATE (window);
-
- g_return_if_fail (entry_id != NULL);
-
- if ((private->entry_id && strcmp (private->entry_id, entry_id) == 0) ||
- ! private->active_shell)
- return;
-
- gimp_image_window_session_clear (window);
-
- private->entry_id = entry_id;
-
- gimp_image_window_session_update (window,
- private->active_shell->display,
- FALSE /*from_switch_page*/);
-}
-
-static void
gimp_image_window_shell_scaled (GimpDisplayShell *shell,
GimpImageWindow *window)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]