summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Schermer <nick@xfce.org>2013-09-21 13:10:16 +0200
committerNick Schermer <nick@xfce.org>2013-09-21 13:10:16 +0200
commit65530142f3d933613321c560f0ec0cb1732d2d65 (patch)
tree96d75bac895d72ac05aa18c0d2b2478258663506
parent93a7a18fb43536d04e818e91730e3d428e39265d (diff)
downloadthunar-nick/1.8.tar.gz
Patiently wait for screen to realize on startup.nick/1.8
No background was drawn during login because thunar was too hard trying to update the yet-to-be-initialized screens. Esp on multi screen desktops this was a problem.
-rw-r--r--thunar/thunar-desktop-window.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/thunar/thunar-desktop-window.c b/thunar/thunar-desktop-window.c
index c3b8f508..384613e0 100644
--- a/thunar/thunar-desktop-window.c
+++ b/thunar/thunar-desktop-window.c
@@ -62,6 +62,8 @@ struct _ThunarDesktopWindow
GtkWindow __parent__;
ThunarDesktopBackground *background;
+
+ guint screen_changed_idle_id;
};
@@ -115,14 +117,11 @@ thunar_desktop_window_size_request (GtkWidget *widget,
-static void
-thunar_desktop_window_screen_changed (GdkScreen *screen,
- ThunarDesktopWindow *window)
+static gboolean
+thunar_desktop_window_screen_changed_idle (gpointer data)
{
- GdkWindow *gdk_window;
-
- _thunar_return_if_fail (GDK_IS_SCREEN (screen));
- _thunar_return_if_fail (THUNAR_DESKTOP_WINDOW (window));
+ ThunarDesktopWindow *window = THUNAR_DESKTOP_WINDOW (data);
+ GdkWindow *gdk_window;
/* release background */
if (window->background != NULL)
@@ -134,6 +133,34 @@ thunar_desktop_window_screen_changed (GdkScreen *screen,
/* allocate bg and set it on the window */
gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
window->background = thunar_desktop_background_new (gdk_window);
+
+ return FALSE;
+}
+
+
+
+static void
+thunar_desktop_window_screen_changed_idle_destoyed (gpointer data)
+{
+ THUNAR_DESKTOP_WINDOW (data)->screen_changed_idle_id = 0;
+}
+
+
+
+static void
+thunar_desktop_window_screen_changed (GdkScreen *screen,
+ ThunarDesktopWindow *window)
+{
+ _thunar_return_if_fail (GDK_IS_SCREEN (screen));
+ _thunar_return_if_fail (THUNAR_DESKTOP_WINDOW (window));
+
+ if (window->screen_changed_idle_id == 0)
+ {
+ /* avoid multiple calls of screen changed during session startup */
+ window->screen_changed_idle_id =
+ g_idle_add_full (G_PRIORITY_LOW, thunar_desktop_window_screen_changed_idle,
+ window, thunar_desktop_window_screen_changed_idle_destoyed);
+ }
}
@@ -180,6 +207,10 @@ thunar_desktop_window_unrealize (GtkWidget *widget)
GdkScreen *screen;
GdkWindow *root;
+ /* no more new backgrounds */
+ if (window->screen_changed_idle_id != 0)
+ g_source_remove (window->screen_changed_idle_id);
+
/* drop background */
if (window->background != NULL)
{