8dd3032
diff -up gimp-2.6.6/app/display/gimpdisplay-foreach.c.minimize-dialogs gimp-2.6.6/app/display/gimpdisplay-foreach.c
8dd3032
--- gimp-2.6.6/app/display/gimpdisplay-foreach.c.minimize-dialogs	2008-11-20 23:43:04.000000000 +0100
8dd3032
+++ gimp-2.6.6/app/display/gimpdisplay-foreach.c	2009-03-30 14:24:05.145595522 +0200
8dd3032
@@ -227,6 +227,35 @@ gimp_displays_reconnect (Gimp      *gimp
8dd3032
   g_list_free (contexts);
8dd3032
 }
8dd3032
 
8dd3032
+gint
8dd3032
+gimp_displays_get_num_visible (Gimp *gimp)
8dd3032
+{
8dd3032
+  GList *list;
8dd3032
+  gint   visible = 0;
8dd3032
+
8dd3032
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), 0);
8dd3032
+
8dd3032
+  for (list = GIMP_LIST (gimp->displays)->list;
8dd3032
+       list;
8dd3032
+       list = g_list_next (list))
8dd3032
+    {
8dd3032
+      GimpDisplay *display = list->data;
8dd3032
+
8dd3032
+      if (GTK_WIDGET_DRAWABLE (display->shell))
8dd3032
+        {
8dd3032
+          GdkWindowState state = gdk_window_get_state (display->shell->window);
8dd3032
+
8dd3032
+          if ((state & (GDK_WINDOW_STATE_WITHDRAWN |
8dd3032
+                        GDK_WINDOW_STATE_ICONIFIED)) == 0)
8dd3032
+            {
8dd3032
+              visible++;
8dd3032
+            }
8dd3032
+        }
8dd3032
+    }
8dd3032
+
8dd3032
+  return visible;
8dd3032
+}
8dd3032
+
8dd3032
 void
8dd3032
 gimp_displays_set_busy (Gimp *gimp)
8dd3032
 {
8dd3032
diff -up gimp-2.6.6/app/display/gimpdisplay-foreach.h.minimize-dialogs gimp-2.6.6/app/display/gimpdisplay-foreach.h
8dd3032
--- gimp-2.6.6/app/display/gimpdisplay-foreach.h.minimize-dialogs	2008-11-20 23:43:04.000000000 +0100
8dd3032
+++ gimp-2.6.6/app/display/gimpdisplay-foreach.h	2009-03-30 14:24:05.146606054 +0200
8dd3032
@@ -28,6 +28,8 @@ void            gimp_displays_reconnect 
8dd3032
                                                 GimpImage *old,
8dd3032
                                                 GimpImage *new);
8dd3032
 
8dd3032
+gint            gimp_displays_get_num_visible  (Gimp      *gimp);
8dd3032
+
8dd3032
 void            gimp_displays_set_busy         (Gimp      *gimp);
8dd3032
 void            gimp_displays_unset_busy       (Gimp      *gimp);
8dd3032
 
8dd3032
diff -up gimp-2.6.6/app/display/gimpdisplayshell.c.minimize-dialogs gimp-2.6.6/app/display/gimpdisplayshell.c
8dd3032
--- gimp-2.6.6/app/display/gimpdisplayshell.c.minimize-dialogs	2009-03-15 21:57:09.000000000 +0100
8dd3032
+++ gimp-2.6.6/app/display/gimpdisplayshell.c	2009-03-30 14:24:05.147606111 +0200
8dd3032
@@ -59,6 +59,7 @@
8dd3032
 
8dd3032
 #include "gimpcanvas.h"
8dd3032
 #include "gimpdisplay.h"
8dd3032
+#include "gimpdisplay-foreach.h"
8dd3032
 #include "gimpdisplayoptions.h"
8dd3032
 #include "gimpdisplayshell.h"
8dd3032
 #include "gimpdisplayshell-appearance.h"
8dd3032
@@ -615,12 +616,12 @@ gimp_display_shell_window_state_event (G
8dd3032
                                        GdkEventWindowState *event)
8dd3032
 {
8dd3032
   GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (widget);
8dd3032
+  Gimp             *gimp  = shell->display->gimp;
8dd3032
 
8dd3032
   shell->window_state = event->new_window_state;
8dd3032
 
8dd3032
   if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
8dd3032
     {
8dd3032
-      Gimp            *gimp = shell->display->gimp;
8dd3032
       GimpActionGroup *group;
8dd3032
       gboolean         fullscreen;
8dd3032
 
8dd3032
@@ -644,6 +645,19 @@ gimp_display_shell_window_state_event (G
8dd3032
 
8dd3032
   if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED)
8dd3032
     {
8dd3032
+      gboolean iconified = (event->new_window_state &
8dd3032
+                            GDK_WINDOW_STATE_ICONIFIED) != 0;
8dd3032
+
8dd3032
+      if (iconified)
8dd3032
+        {
8dd3032
+          if (gimp_displays_get_num_visible (gimp) == 0)
8dd3032
+            gimp_dialog_factories_hide_with_display ();
8dd3032
+        }
8dd3032
+      else
8dd3032
+        {
8dd3032
+          gimp_dialog_factories_show_with_display ();
8dd3032
+        }
8dd3032
+
8dd3032
       gimp_display_shell_progress_window_state_changed (shell);
8dd3032
     }
8dd3032
 
8dd3032
diff -up gimp-2.6.6/app/widgets/gimpdialogfactory.c.minimize-dialogs gimp-2.6.6/app/widgets/gimpdialogfactory.c
8dd3032
--- gimp-2.6.6/app/widgets/gimpdialogfactory.c.minimize-dialogs	2008-11-20 23:43:05.000000000 +0100
8dd3032
+++ gimp-2.6.6/app/widgets/gimpdialogfactory.c	2009-03-30 14:24:05.148606028 +0200
8dd3032
@@ -45,6 +45,13 @@
8dd3032
 #include "gimp-log.h"
8dd3032
 
8dd3032
 
8dd3032
+typedef enum
8dd3032
+{
8dd3032
+  GIMP_DIALOGS_SHOWN,
8dd3032
+  GIMP_DIALOGS_HIDDEN_EXPLICITLY,  /* user used the Tab key to hide dialogs */
8dd3032
+  GIMP_DIALOGS_HIDDEN_WITH_DISPLAY /* dialogs are hidden with the display   */
8dd3032
+} GimpDialogsState;
8dd3032
+
8dd3032
 enum
8dd3032
 {
8dd3032
   DOCK_ADDED,
8dd3032
@@ -103,7 +110,7 @@ G_DEFINE_TYPE (GimpDialogFactory, gimp_d
8dd3032
 
8dd3032
 static guint factory_signals[LAST_SIGNAL] = { 0 };
8dd3032
 
8dd3032
-static gboolean dialogs_shown = TRUE;  /* FIXME */
8dd3032
+static GimpDialogsState dialogs_state = GIMP_DIALOGS_SHOWN;
8dd3032
 
8dd3032
 
8dd3032
 static void
8dd3032
@@ -1079,7 +1086,7 @@ gimp_dialog_factory_hide_dialog (GtkWidg
8dd3032
 
8dd3032
   gtk_widget_hide (dialog);
8dd3032
 
8dd3032
-  if (! dialogs_shown)
8dd3032
+  if (dialogs_state != GIMP_DIALOGS_SHOWN)
8dd3032
     g_object_set_data (G_OBJECT (dialog), GIMP_DIALOG_VISIBILITY_KEY,
8dd3032
                        GINT_TO_POINTER (GIMP_DIALOG_VISIBILITY_INVISIBLE));
8dd3032
 }
8dd3032
@@ -1122,30 +1129,66 @@ gimp_dialog_factories_session_clear (voi
8dd3032
                         NULL);
8dd3032
 }
8dd3032
 
8dd3032
-void
8dd3032
-gimp_dialog_factories_toggle (void)
8dd3032
+static void
8dd3032
+gimp_dialog_factories_set_state (GimpDialogsState state)
8dd3032
 {
8dd3032
   GimpDialogFactoryClass *factory_class;
8dd3032
 
8dd3032
   factory_class = g_type_class_peek (GIMP_TYPE_DIALOG_FACTORY);
8dd3032
 
8dd3032
-  if (dialogs_shown)
8dd3032
+  dialogs_state = state;
8dd3032
+
8dd3032
+  if (state == GIMP_DIALOGS_SHOWN)
8dd3032
     {
8dd3032
-      dialogs_shown = FALSE;
8dd3032
       g_hash_table_foreach (factory_class->factories,
8dd3032
-                            (GHFunc) gimp_dialog_factories_hide_foreach,
8dd3032
+                            (GHFunc) gimp_dialog_factories_show_foreach,
8dd3032
                             NULL);
8dd3032
     }
8dd3032
   else
8dd3032
     {
8dd3032
-      dialogs_shown = TRUE;
8dd3032
       g_hash_table_foreach (factory_class->factories,
8dd3032
-                            (GHFunc) gimp_dialog_factories_show_foreach,
8dd3032
+                            (GHFunc) gimp_dialog_factories_hide_foreach,
8dd3032
                             NULL);
8dd3032
     }
8dd3032
 }
8dd3032
 
8dd3032
 void
8dd3032
+gimp_dialog_factories_show_with_display (void)
8dd3032
+{
8dd3032
+  if (dialogs_state == GIMP_DIALOGS_HIDDEN_WITH_DISPLAY)
8dd3032
+    {
8dd3032
+      gimp_dialog_factories_set_state (GIMP_DIALOGS_SHOWN);
8dd3032
+    }
8dd3032
+}
8dd3032
+
8dd3032
+void
8dd3032
+gimp_dialog_factories_hide_with_display (void)
8dd3032
+{
8dd3032
+  if (dialogs_state == GIMP_DIALOGS_SHOWN)
8dd3032
+    {
8dd3032
+      gimp_dialog_factories_set_state (GIMP_DIALOGS_HIDDEN_WITH_DISPLAY);
8dd3032
+    }
8dd3032
+}
8dd3032
+
8dd3032
+void
8dd3032
+gimp_dialog_factories_toggle (void)
8dd3032
+{
8dd3032
+  switch (dialogs_state)
8dd3032
+    {
8dd3032
+    case GIMP_DIALOGS_SHOWN:
8dd3032
+      gimp_dialog_factories_set_state (GIMP_DIALOGS_HIDDEN_EXPLICITLY);
8dd3032
+      break;
8dd3032
+
8dd3032
+    case GIMP_DIALOGS_HIDDEN_EXPLICITLY:
8dd3032
+      gimp_dialog_factories_set_state (GIMP_DIALOGS_SHOWN);
8dd3032
+      break;
8dd3032
+
8dd3032
+    case GIMP_DIALOGS_HIDDEN_WITH_DISPLAY:
8dd3032
+      break;
8dd3032
+    }
8dd3032
+}
8dd3032
+
8dd3032
+void
8dd3032
 gimp_dialog_factories_set_busy (void)
8dd3032
 {
8dd3032
   GimpDialogFactoryClass *factory_class;
8dd3032
diff -up gimp-2.6.6/app/widgets/gimpdialogfactory.h.minimize-dialogs gimp-2.6.6/app/widgets/gimpdialogfactory.h
8dd3032
--- gimp-2.6.6/app/widgets/gimpdialogfactory.h.minimize-dialogs	2008-11-20 23:43:05.000000000 +0100
8dd3032
+++ gimp-2.6.6/app/widgets/gimpdialogfactory.h	2009-03-30 14:24:05.149601894 +0200
8dd3032
@@ -103,74 +103,77 @@ struct _GimpDialogFactoryClass
8dd3032
 };
8dd3032
 
8dd3032
 
8dd3032
-GType               gimp_dialog_factory_get_type  (void) G_GNUC_CONST;
8dd3032
+GType               gimp_dialog_factory_get_type    (void) G_GNUC_CONST;
8dd3032
 
8dd3032
-GimpDialogFactory * gimp_dialog_factory_new       (const gchar       *name,
8dd3032
-                                                   GimpContext       *context,
8dd3032
-                                                   GimpMenuFactory   *menu_factory,
8dd3032
-                                                   GimpDialogNewFunc  new_dock_func,
8dd3032
-                                                   gboolean           toggle_visibility);
8dd3032
-
8dd3032
-GimpDialogFactory * gimp_dialog_factory_from_name (const gchar       *name);
8dd3032
-
8dd3032
-void        gimp_dialog_factory_set_constructor   (GimpDialogFactory *factory,
8dd3032
-                                                   GimpDialogConstructor constructor);
8dd3032
-
8dd3032
-void        gimp_dialog_factory_register_entry    (GimpDialogFactory *factory,
8dd3032
-                                                   const gchar       *identifier,
8dd3032
-                                                   const gchar       *name,
8dd3032
-                                                   const gchar       *blurb,
8dd3032
-                                                   const gchar       *stock_id,
8dd3032
-                                                   const gchar       *help_id,
8dd3032
-                                                   GimpDialogNewFunc  new_func,
8dd3032
-                                                   gint               view_size,
8dd3032
-                                                   gboolean           singleton,
8dd3032
-                                                   gboolean           session_managed,
8dd3032
-                                                   gboolean           remember_size,
8dd3032
-                                                   gboolean           remember_if_open);
8dd3032
+GimpDialogFactory * gimp_dialog_factory_new         (const gchar       *name,
8dd3032
+                                                     GimpContext       *context,
8dd3032
+                                                     GimpMenuFactory   *menu_factory,
8dd3032
+                                                     GimpDialogNewFunc  new_dock_func,
8dd3032
+                                                     gboolean           toggle_visibility);
8dd3032
+
8dd3032
+GimpDialogFactory * gimp_dialog_factory_from_name   (const gchar       *name);
8dd3032
+
8dd3032
+void        gimp_dialog_factory_set_constructor     (GimpDialogFactory *factory,
8dd3032
+                                                     GimpDialogConstructor constructor);
8dd3032
+
8dd3032
+void        gimp_dialog_factory_register_entry      (GimpDialogFactory *factory,
8dd3032
+                                                     const gchar       *identifier,
8dd3032
+                                                     const gchar       *name,
8dd3032
+                                                     const gchar       *blurb,
8dd3032
+                                                     const gchar       *stock_id,
8dd3032
+                                                     const gchar       *help_id,
8dd3032
+                                                     GimpDialogNewFunc  new_func,
8dd3032
+                                                     gint               view_size,
8dd3032
+                                                     gboolean           singleton,
8dd3032
+                                                     gboolean           session_managed,
8dd3032
+                                                     gboolean           remember_size,
8dd3032
+                                                     gboolean           remember_if_open);
8dd3032
 GimpDialogFactoryEntry * gimp_dialog_factory_find_entry
8dd3032
-                                                  (GimpDialogFactory *factory,
8dd3032
-                                                   const gchar       *identifier);
8dd3032
+                                                    (GimpDialogFactory *factory,
8dd3032
+                                                     const gchar       *identifier);
8dd3032
 
8dd3032
 GimpSessionInfo * gimp_dialog_factory_find_session_info
8dd3032
-                                                  (GimpDialogFactory *factory,
8dd3032
-                                                   const gchar       *identifier);
8dd3032
+                                                    (GimpDialogFactory *factory,
8dd3032
+                                                     const gchar       *identifier);
8dd3032
 
8dd3032
-GtkWidget * gimp_dialog_factory_dialog_new        (GimpDialogFactory *factory,
8dd3032
-                                                   GdkScreen         *screen,
8dd3032
-                                                   const gchar       *identifier,
8dd3032
-                                                   gint               view_size,
8dd3032
-                                                   gboolean           present);
8dd3032
-GtkWidget * gimp_dialog_factory_dialog_raise      (GimpDialogFactory *factory,
8dd3032
-                                                   GdkScreen         *screen,
8dd3032
-                                                   const gchar       *identifiers,
8dd3032
-                                                   gint               view_size);
8dd3032
-GtkWidget * gimp_dialog_factory_dockable_new      (GimpDialogFactory *factory,
8dd3032
-                                                   GimpDock          *dock,
8dd3032
-                                                   const gchar       *identifier,
8dd3032
-                                                   gint               view_size);
8dd3032
-GtkWidget * gimp_dialog_factory_dock_new          (GimpDialogFactory *factory,
8dd3032
-                                                   GdkScreen         *screen);
8dd3032
-
8dd3032
-void        gimp_dialog_factory_add_dialog        (GimpDialogFactory *factory,
8dd3032
-                                                   GtkWidget         *dialog);
8dd3032
-void        gimp_dialog_factory_add_foreign       (GimpDialogFactory *factory,
8dd3032
-                                                   const gchar       *identifier,
8dd3032
-                                                   GtkWidget         *dialog);
8dd3032
-void        gimp_dialog_factory_remove_dialog     (GimpDialogFactory *factory,
8dd3032
-                                                   GtkWidget         *dialog);
8dd3032
-
8dd3032
-void        gimp_dialog_factory_show_toolbox      (GimpDialogFactory *toolbox_factory);
8dd3032
-
8dd3032
-void        gimp_dialog_factory_hide_dialog       (GtkWidget         *dialog);
8dd3032
-
8dd3032
-void        gimp_dialog_factories_session_save    (GimpConfigWriter  *writer);
8dd3032
-void        gimp_dialog_factories_session_restore (void);
8dd3032
-void        gimp_dialog_factories_session_clear   (void);
8dd3032
-
8dd3032
-void        gimp_dialog_factories_toggle          (void);
8dd3032
-void        gimp_dialog_factories_set_busy        (void);
8dd3032
-void        gimp_dialog_factories_unset_busy      (void);
8dd3032
+GtkWidget * gimp_dialog_factory_dialog_new          (GimpDialogFactory *factory,
8dd3032
+                                                     GdkScreen         *screen,
8dd3032
+                                                     const gchar       *identifier,
8dd3032
+                                                     gint               view_size,
8dd3032
+                                                     gboolean           present);
8dd3032
+GtkWidget * gimp_dialog_factory_dialog_raise        (GimpDialogFactory *factory,
8dd3032
+                                                     GdkScreen         *screen,
8dd3032
+                                                     const gchar       *identifiers,
8dd3032
+                                                     gint               view_size);
8dd3032
+GtkWidget * gimp_dialog_factory_dockable_new        (GimpDialogFactory *factory,
8dd3032
+                                                     GimpDock          *dock,
8dd3032
+                                                     const gchar       *identifier,
8dd3032
+                                                     gint               view_size);
8dd3032
+GtkWidget * gimp_dialog_factory_dock_new            (GimpDialogFactory *factory,
8dd3032
+                                                     GdkScreen         *screen);
8dd3032
+
8dd3032
+void        gimp_dialog_factory_add_dialog          (GimpDialogFactory *factory,
8dd3032
+                                                     GtkWidget         *dialog);
8dd3032
+void        gimp_dialog_factory_add_foreign         (GimpDialogFactory *factory,
8dd3032
+                                                     const gchar       *identifier,
8dd3032
+                                                     GtkWidget         *dialog);
8dd3032
+void        gimp_dialog_factory_remove_dialog       (GimpDialogFactory *factory,
8dd3032
+                                                     GtkWidget         *dialog);
8dd3032
+
8dd3032
+void        gimp_dialog_factory_show_toolbox        (GimpDialogFactory *toolbox_factory);
8dd3032
+
8dd3032
+void        gimp_dialog_factory_hide_dialog         (GtkWidget         *dialog);
8dd3032
+
8dd3032
+void        gimp_dialog_factories_session_save      (GimpConfigWriter  *writer);
8dd3032
+void        gimp_dialog_factories_session_restore   (void);
8dd3032
+void        gimp_dialog_factories_session_clear     (void);
8dd3032
+
8dd3032
+void        gimp_dialog_factories_show_with_display (void);
8dd3032
+void        gimp_dialog_factories_hide_with_display (void);
8dd3032
+void        gimp_dialog_factories_toggle            (void);
8dd3032
+
8dd3032
+void        gimp_dialog_factories_set_busy          (void);
8dd3032
+void        gimp_dialog_factories_unset_busy        (void);
8dd3032
 
8dd3032
 GimpDialogFactory *
8dd3032
             gimp_dialog_factory_from_widget (GtkWidget               *dialog,