3737#include <gio/gio.h>
3838#include <gdk/gdk.h>
3939#include <gdk/gdkx.h>
40+ #ifdef GDK_WINDOWING_WAYLAND
41+ #include <gdk/gdkwayland.h>
42+ #endif
4043
4144#define GNOME_DESKTOP_USE_UNSTABLE_API
4245#include <libcinnamon-desktop/gnome-bg.h>
@@ -59,11 +62,14 @@ struct CsdBackgroundManagerPrivate
5962 guint proxy_signal_id ;
6063
6164 GPtrArray * mbs ;
65+
66+ guint screen_changed_id ;
6267};
6368
6469static void csd_background_manager_finalize (GObject * object );
6570
6671static void setup_bg (CsdBackgroundManager * manager );
72+ static void setup_monitors (CsdBackgroundManager * manager );
6773static void connect_screen_signals (CsdBackgroundManager * manager );
6874
6975G_DEFINE_TYPE (CsdBackgroundManager , csd_background_manager , G_TYPE_OBJECT )
@@ -77,6 +83,13 @@ draw_background_wayland_session (CsdBackgroundManager *manager)
7783
7884 cinnamon_settings_profile_start (NULL );
7985
86+ if (!manager -> priv -> mbs || manager -> priv -> mbs -> len == 0 ||
87+ manager -> priv -> screen_changed_id != 0 )
88+ {
89+ cinnamon_settings_profile_end (NULL );
90+ return ;
91+ }
92+
8093 for (i = 0 ; i < manager -> priv -> mbs -> len ; i ++ )
8194 {
8295 GtkImage * image ;
@@ -127,29 +140,19 @@ draw_background_x11_session (CsdBackgroundManager *manager)
127140}
128141
129142static gboolean
130- session_is_wayland (void )
143+ using_wayland_backend (void )
131144{
132- static gboolean session_is_wayland = FALSE;
133- static gsize once_init = 0 ;
134-
135- if (g_once_init_enter (& once_init )) {
136- const gchar * env = g_getenv ("XDG_SESSION_TYPE" );
137- if (env && g_strcmp0 (env , "wayland" ) == 0 ) {
138- session_is_wayland = TRUE;
139- }
140-
141- g_debug ("Session is Wayland? %d" , session_is_wayland );
142-
143- g_once_init_leave (& once_init , 1 );
144- }
145-
146- return session_is_wayland ;
145+ #ifdef GDK_WINDOWING_WAYLAND
146+ return GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ());
147+ #else
148+ return FALSE;
149+ #endif
147150}
148151
149152static void
150153draw_background (CsdBackgroundManager * manager )
151154{
152- if (session_is_wayland ()) {
155+ if (using_wayland_backend ()) {
153156 draw_background_wayland_session (manager );
154157 } else {
155158 draw_background_x11_session (manager );
@@ -177,12 +180,31 @@ settings_change_event_cb (GSettings *settings,
177180 return FALSE;
178181}
179182
183+ static gboolean
184+ on_screen_changed_idle (gpointer user_data )
185+ {
186+ CsdBackgroundManager * manager = CSD_BACKGROUND_MANAGER (user_data );
187+
188+ manager -> priv -> screen_changed_id = 0 ;
189+
190+ if (using_wayland_backend ()) {
191+ setup_monitors (manager );
192+ }
193+
194+ draw_background (manager );
195+
196+ return G_SOURCE_REMOVE ;
197+ }
198+
180199static void
181200on_screen_size_changed (GdkScreen * screen ,
182201 CsdBackgroundManager * manager )
183202{
203+ if (manager -> priv -> screen_changed_id != 0 )
204+ return ;
184205
185- draw_background (manager );
206+ manager -> priv -> screen_changed_id =
207+ g_timeout_add (250 , on_screen_changed_idle , manager );
186208}
187209
188210static void
@@ -193,6 +215,9 @@ setup_monitors (CsdBackgroundManager *manager)
193215
194216 display = gdk_display_get_default ();
195217
218+ if (!display )
219+ return ;
220+
196221 g_clear_pointer (& manager -> priv -> mbs , g_ptr_array_unref );
197222 manager -> priv -> mbs = g_ptr_array_new_with_free_func ((GDestroyNotify ) g_object_unref );
198223
@@ -251,7 +276,7 @@ setup_bg_and_draw_background (CsdBackgroundManager *manager)
251276{
252277 setup_bg (manager );
253278
254- if (session_is_wayland ()) {
279+ if (using_wayland_backend ()) {
255280 setup_monitors (manager );
256281 }
257282
@@ -396,6 +421,8 @@ csd_background_manager_stop (CsdBackgroundManager *manager)
396421
397422 g_debug ("Stopping background manager" );
398423
424+ g_clear_handle_id (& manager -> priv -> screen_changed_id , g_source_remove );
425+
399426 disconnect_screen_signals (manager );
400427
401428 if (manager -> priv -> proxy ) {
0 commit comments