From d87faadec4a94fd20b1cd15a3dfa8f5af3a2dc64 Mon Sep 17 00:00:00 2001
From: Jerome Guelfucci <jeromeg@xfce.org>
Date: Wed, 12 Nov 2008 18:57:54 +0000
Subject: [PATCH] Try to fix bug 4601.

(Old svn revision: 6074)
---
 ChangeLog                 | 10 ++++++++++
 lib/screenshooter-utils.c | 37 ++++++++++++++++++-------------------
 src/main.c                |  9 ++++++++-
 3 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8d6a1045..d7fc6f44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-11-12 jeromeg
+
+  * lib/screenshooter-utils.c: 
+    - (screenshooter_take_screenshot) rework the window grabbing to try to fix
+      bug 4601.
+  * src/main.c (main) try to fix 4601:
+    - hide the dialog instead of destroying it.
+    - sync the display before taking the screenshot.
+    - ugly, wait 1 second before taking the screenshot.
+
 2008-11-09 jeromeg
 
   * Post release bump.
diff --git a/lib/screenshooter-utils.c b/lib/screenshooter-utils.c
index 2d9232dd..9d144def 100644
--- a/lib/screenshooter-utils.c
+++ b/lib/screenshooter-utils.c
@@ -130,9 +130,9 @@ GdkPixbuf *screenshooter_take_screenshot (gint       mode,
                                           gint       delay)
 {
   GdkPixbuf *screenshot;
-  GdkWindow *window = NULL;
+  GdkWindow *window, *window2;
   GdkScreen *screen;
-  
+    
   gint width;
   gint height;
   /* gdk_get_default_root_window (), needs_unref enables us to unref *window 
@@ -151,32 +151,31 @@ GdkPixbuf *screenshooter_take_screenshot (gint       mode,
   else if (mode == ACTIVE_WINDOW)
     {
       window = gdk_screen_get_active_window (screen);
-      
+            
       /* If we are supposed to take a screenshot of the active window, and if 
       the active window is the desktop background, grab the whole screen.*/      
-      if (window == NULL || 
-          gdk_window_get_type_hint (window) == GDK_WINDOW_TYPE_HINT_DESKTOP)
+      if (window == NULL)
         {
-          if (!(window == NULL))
-            {
-              g_object_unref (window);
-            }
-          
           window = gdk_get_default_root_window ();
           needs_unref = FALSE;
         }
-      else
+            
+      if (gdk_window_get_type_hint (window) == GDK_WINDOW_TYPE_HINT_DESKTOP)
         {
-          GdkWindow *window2;
-          
-          window2 = 
-            gdk_window_foreign_new (find_toplevel_window 
-                                    (GDK_WINDOW_XID (window)));
-          
           g_object_unref (window);
-          
-          window = window2;
+                    
+          window = gdk_get_default_root_window ();
+          needs_unref = FALSE;
         }
+      else
+        {
+           window2 = gdk_window_foreign_new (find_toplevel_window 
+                                             (GDK_WINDOW_XID (window)));
+           g_object_unref (window);
+          
+           window = window2;
+        }  
+      
     }
   
   /* wait for n=delay seconds */ 
diff --git a/src/main.c b/src/main.c
index 6179548a..b47b78fb 100644
--- a/src/main.c
+++ b/src/main.c
@@ -185,6 +185,7 @@ int main(int argc, char **argv)
     {
       GtkWidget *dialog;
       gint response;
+      GdkDisplay *display = gdk_display_get_default ();
       
       /* Read the preferences */
       screenshooter_read_rc_file (rc_file, sd, FALSE);
@@ -196,8 +197,12 @@ int main(int argc, char **argv)
          window mode */
       response = gtk_dialog_run (GTK_DIALOG (dialog));
       
-      gtk_widget_destroy (dialog);
+      gtk_widget_hide_all (dialog);
       
+      gdk_display_sync (display);
+      
+      sleep (1);
+                  
       if (response == GTK_RESPONSE_OK)
         {
           gchar *screenshot_path = NULL;
@@ -239,6 +244,8 @@ int main(int argc, char **argv)
           
           /* Save preferences */     
           screenshooter_write_rc_file (rc_file, sd);
+          
+          gtk_widget_destroy (dialog);
         }
     }
   
-- 
GitLab