diff --git a/ChangeLog b/ChangeLog index 8d6a10450c88e9f325f586e8431f97595d17e3e5..d7fc6f44a887573b822df04d9bc559316db85f9b 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 2d9232dd45afd7d3fec518345163de80410caedc..9d144defdf5dbb05673630ea089ac779543e57c5 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 6179548aa380f3d545439ba6949ab54012b8bc91..b47b78fbc7dcb0acf3ca061e780b862ee2189d0d 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); } }