From 11f4783fd2ffefa973bfbdb73360b846bdda5793 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= <gael@xfce.org>
Date: Sat, 3 Feb 2024 13:53:34 +0100
Subject: [PATCH] Guard X11 code paths at buildtime and runtime

---
 savers/floaters.c                   | 14 +++--
 savers/popsquares.c                 | 12 +++-
 savers/slideshow.c                  | 13 +++-
 src/Makefile.am                     | 51 ++++++++++------
 src/gs-job.c                        | 12 +++-
 src/gs-lock-plug.c                  | 19 +++---
 src/gs-manager.c                    | 94 ++++++++++++++++++++---------
 src/gs-monitor.c                    | 19 +++---
 src/gs-window-x11.c                 | 73 ++++++++++++++++++----
 src/test-window.c                   | 37 +++++++++---
 src/xfce4-screensaver-dialog.c      | 10 ++-
 src/xfce4-screensaver-preferences.c | 25 ++++++--
 12 files changed, 279 insertions(+), 100 deletions(-)

diff --git a/savers/floaters.c b/savers/floaters.c
index e7964fc..6bc1c43 100644
--- a/savers/floaters.c
+++ b/savers/floaters.c
@@ -33,9 +33,11 @@
 #include <sysexits.h>
 #include <time.h>
 
-#include <glib.h>
-#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #include <libxfce4util/libxfce4util.h>
 
@@ -1111,7 +1113,7 @@ int
 main (int   argc,
       char *argv[]) {
     ScreenSaver     *screen_saver;
-    GtkWidget       *window;
+    GtkWidget       *window = NULL;
     GtkWidget       *drawing_area;
     GError          *error;
     gboolean         success;
@@ -1146,7 +1148,11 @@ main (int   argc,
         return EX_USAGE;
     }
 
-    window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+    }
+#endif
     gtk_widget_set_app_paintable (window, TRUE);
 
     g_signal_connect (G_OBJECT (window), "destroy",
diff --git a/savers/popsquares.c b/savers/popsquares.c
index 2be0151..1a4fc40 100644
--- a/savers/popsquares.c
+++ b/savers/popsquares.c
@@ -24,7 +24,11 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #include <libxfce4util/libxfce4util.h>
 
@@ -35,7 +39,7 @@ int
 main (int    argc,
       char **argv) {
     GSThemeEngine *engine;
-    GtkWidget     *window;
+    GtkWidget     *window = NULL;
     GError        *error;
 
     xfce_textdomain (GETTEXT_PACKAGE, XFCELOCALEDIR, "UTF-8");
@@ -49,7 +53,11 @@ main (int    argc,
         return EXIT_FAILURE;
     }
 
-    window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+    }
+#endif
     gtk_widget_set_app_paintable (window, TRUE);
     g_signal_connect (G_OBJECT (window), "destroy",
                       G_CALLBACK (gtk_main_quit), NULL);
diff --git a/savers/slideshow.c b/savers/slideshow.c
index 3b568f3..c62c52b 100644
--- a/savers/slideshow.c
+++ b/savers/slideshow.c
@@ -26,9 +26,12 @@
 #include <string.h>
 #include <unistd.h>
 
-#include <glib.h>
 #include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #include <libxfce4util/libxfce4util.h>
 
@@ -39,7 +42,7 @@
 int
 main (int argc, char **argv) {
     GSThemeEngine *engine;
-    GtkWidget     *window;
+    GtkWidget     *window = NULL;
     GError        *error;
     gboolean       ret;
     char          *location = NULL;
@@ -90,7 +93,11 @@ main (int argc, char **argv) {
 
     g_set_prgname ("slideshow");
 
-    window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        window = gtk_plug_new (strtoul (g_getenv ("XSCREENSAVER_WINDOW"), NULL, 0));
+    }
+#endif
     gtk_widget_set_app_paintable (window, TRUE);
     g_signal_connect (G_OBJECT (window), "destroy",
                       G_CALLBACK (gtk_main_quit), NULL);
diff --git a/src/Makefile.am b/src/Makefile.am
index 6eebfb9..5770f04 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -94,8 +94,6 @@ test_window_SOURCES = \
 	test-window.c    \
 	gs-window.h      \
 	gs-window-x11.c  \
-	gs-grab-x11.c    \
-	gs-grab.h        \
 	gs-marshal.c     \
 	gs-marshal.h     \
 	gs-debug.c       \
@@ -114,9 +112,6 @@ test_window_CFLAGS = \
 	$(DBUS_GLIB_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
 	$(XFCONF_CFLAGS) \
-	$(LIBX11_CFLAGS) \
-	$(LIBXEXT_CFLAGS) \
-	$(LIBXKLAVIER_CFLAGS) \
 	$(NULL)
 
 test_window_LDADD = \
@@ -125,10 +120,26 @@ test_window_LDADD = \
 	$(DBUS_GLIB_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
 	$(XFCONF_LIBS) \
+	$(NULL)
+
+if ENABLE_X11
+test_window_SOURCES += \
+	gs-grab-x11.c \
+	gs-grab.h \
+	$(NULL)
+
+test_window_CFLAGS += \
+	$(LIBX11_CFLAGS) \
+	$(LIBXEXT_CFLAGS) \
+	$(LIBXKLAVIER_CFLAGS) \
+	$(NULL)
+
+test_window_LDADD += \
 	$(LIBX11_LIBS) \
 	$(LIBXEXT_LIBS) \
 	$(LIBXKLAVIER_LIBS) \
 	$(NULL)
+endif
 
 xfce4_screensaver_dialog_built_sources = \
 	xfce4-screensaver-dialog-css.h  \
@@ -149,8 +160,6 @@ xfce4_screensaver_dialog_SOURCES = \
 	subprocs.h                                 \
 	xfce-desktop-utils.c                       \
 	xfce-desktop-utils.h                       \
-	xfcekbd-indicator.c                        \
-	xfcekbd-indicator.h                        \
 	xfce-bg.c                                  \
 	xfce-bg.h                                  \
 	$(AUTH_SOURCES)                            \
@@ -170,9 +179,6 @@ xfce4_screensaver_dialog_CFLAGS = \
 	$(LIBXFCE4UI_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(AUTH_CFLAGS) \
-	$(LIBX11_CFLAGS) \
-	$(LIBXEXT_CFLAGS) \
-	$(LIBXKLAVIER_CFLAGS) \
 	$(NULL)
 
 xfce4_screensaver_dialog_LDADD = \
@@ -182,10 +188,26 @@ xfce4_screensaver_dialog_LDADD = \
 	$(LIBXFCE4UI_LIBS) \
 	$(XFCONF_LIBS) \
 	$(AUTH_LIBS) \
+	$(NULL)
+
+if ENABLE_X11
+xfce4_screensaver_dialog_SOURCES += \
+	xfcekbd-indicator.c \
+	xfcekbd-indicator.h \
+	$(NULL)
+
+xfce4_screensaver_dialog_CFLAGS += \
+	$(LIBX11_CFLAGS) \
+	$(LIBXEXT_CFLAGS) \
+	$(LIBXKLAVIER_CFLAGS) \
+	$(NULL)
+
+xfce4_screensaver_dialog_LDADD += \
 	$(LIBX11_LIBS) \
 	$(LIBXEXT_LIBS) \
 	$(LIBXKLAVIER_LIBS) \
 	$(NULL)
+endif
 
 BUILT_SOURCES = \
 	gs-marshal.c                 \
@@ -222,8 +244,6 @@ xfce4_screensaver_SOURCES = \
 	gs-debug.h                  \
 	subprocs.c                  \
 	subprocs.h                  \
-	gs-grab-x11.c               \
-	gs-grab.h                   \
 	xfce-desktop-utils.c        \
 	xfce-desktop-utils.h        \
 	$(BUILT_SOURCES)            \
@@ -238,11 +258,6 @@ xfce4_screensaver_CFLAGS = \
 	$(GARCON_GTK3_CFLAGS) \
 	$(SYSTEMD_CFLAGS) \
 	$(ELOGIND_CFLAGS) \
-	$(LIBX11_CFLAGS) \
-	$(LIBXEXT_CFLAGS) \
-	$(LIBXSCRNSAVER_CFLAGS) \
-	$(LIBXKLAVIER_CFLAGS) \
-	$(LIBWNCK_CFLAGS) \
 	$(NULL)
 
 xfce4_screensaver_LDADD = \
@@ -260,6 +275,8 @@ if ENABLE_X11
 xfce4_screensaver_SOURCES += \
 	gs-listener-x11.c \
 	gs-listener-x11.h \
+	gs-grab-x11.c \
+	gs-grab.h \
 	$(NULL)
 
 xfce4_screensaver_CFLAGS += \
diff --git a/src/gs-job.c b/src/gs-job.c
index b188f45..af6cfdf 100644
--- a/src/gs-job.c
+++ b/src/gs-job.c
@@ -31,11 +31,12 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
-#include <glib.h>
 #include <glib/gstdio.h>
-#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#ifdef ENABLE_X11
 #include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
 #include <sys/resource.h>
@@ -77,7 +78,12 @@ widget_get_id_string (GtkWidget *widget) {
 
     g_return_val_if_fail (widget != NULL, NULL);
 
-    id = g_strdup_printf ("0x%lX", gtk_socket_get_id (GTK_SOCKET (widget)));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        id = g_strdup_printf ("0x%lX", gtk_socket_get_id (GTK_SOCKET (widget)));
+    }
+#endif
+
     return id;
 }
 
diff --git a/src/gs-lock-plug.c b/src/gs-lock-plug.c
index 2c678a0..8b535d6 100644
--- a/src/gs-lock-plug.c
+++ b/src/gs-lock-plug.c
@@ -35,9 +35,14 @@
 #include <glib/gprintf.h>
 #include <glib/gstdio.h>
 #include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#ifdef ENABLE_X11
 #include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
-#include <gtk/gtk.h>
+#ifdef WITH_KBD_LAYOUT_INDICATOR
+#include "xfcekbd-indicator.h"
+#endif
+#endif
 
 #include <libxfce4util/libxfce4util.h>
 #include <xfconf/xfconf.h>
@@ -49,10 +54,6 @@
 #include "xfce-desktop-utils.h"
 #include "xfce4-screensaver-dialog-ui.h"
 
-#ifdef WITH_KBD_LAYOUT_INDICATOR
-#include "xfcekbd-indicator.h"
-#endif
-
 #define MDM_FLEXISERVER_COMMAND "mdmflexiserver"
 #define MDM_FLEXISERVER_ARGS    "--startnew Standard"
 
@@ -1602,7 +1603,11 @@ gs_lock_plug_init (GSLockPlug *plug) {
     gs_profile_start (NULL);
 
     plug->priv = gs_lock_plug_get_instance_private (plug);
-    plug->priv->plug_widget = gtk_plug_new (0);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        plug->priv->plug_widget = gtk_plug_new (0);
+    }
+#endif
     g_object_set_data (G_OBJECT (plug->priv->plug_widget), "gs-lock-plug", plug);
 
     clear_clipboards (plug);
@@ -1612,7 +1617,7 @@ gs_lock_plug_init (GSLockPlug *plug) {
 
     /* Layout indicator */
 #ifdef WITH_KBD_LAYOUT_INDICATOR
-    if (plug->priv->auth_prompt_kbd_layout_indicator != NULL) {
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
         XklEngine *engine;
 
         engine = xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
diff --git a/src/gs-manager.c b/src/gs-manager.c
index 4a75590..a8c5376 100644
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -25,9 +25,12 @@
 
 #include <gdk/gdk.h>
 #include <gio/gio.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
+#include "gs-grab.h"
+#endif
 
 #include "gs-debug.h"
-#include "gs-grab.h"
 #include "gs-job.h"
 #include "gs-manager.h"
 #include "gs-prefs.h"
@@ -55,7 +58,9 @@ struct GSManagerPrivate {
     guint           lock_timeout_id;
     guint           cycle_timeout_id;
 
+#ifdef ENABLE_X11
     GSGrab         *grab;
+#endif
 };
 
 enum {
@@ -430,7 +435,11 @@ static void
 gs_manager_init (GSManager *manager) {
     manager->priv = gs_manager_get_instance_private (manager);
 
-    manager->priv->grab = gs_grab_new ();
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        manager->priv->grab = gs_grab_new ();
+    }
+#endif
     manager->priv->prefs = gs_prefs_new();
     manager->priv->jobs = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                                  NULL, (GDestroyNotify) remove_job);
@@ -512,6 +521,7 @@ gs_manager_show_message (GSManager  *manager,
     gs_manager_request_unlock (manager);
 }
 
+#ifdef ENABLE_X11
 static gboolean
 manager_maybe_grab_window (GSManager *manager,
                            GSWindow  *window) {
@@ -564,13 +574,18 @@ window_grab_broken_cb (GSWindow           *window,
             gs_grab_reset (manager->priv->grab);
     }
 }
+#endif
 
 static gboolean
 window_map_event_cb (GSWindow  *window,
                      GdkEvent  *event,
                      GSManager *manager) {
     gs_debug ("Handling window map_event event");
-    manager_maybe_grab_window (manager, window);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        manager_maybe_grab_window (manager, window);
+    }
+#endif
     manager_maybe_start_job_for_window (manager, window);
     return FALSE;
 }
@@ -646,14 +661,18 @@ handle_window_dialog_up (GSManager *manager,
         }
     }
 
-    /* move devices grab so that dialog can be used;
-       release the pointer grab while dialog is up so that
-       the dialog can be used. We'll regrab it when the dialog goes down */
-    gs_debug ("Initiate pointer-less grab move to %p", window);
-    gs_grab_move_to_window (manager->priv->grab,
-                            gs_window_get_gdk_window (window),
-                            gs_window_get_display (window),
-                            TRUE, FALSE);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        /* move devices grab so that dialog can be used;
+           release the pointer grab while dialog is up so that
+           the dialog can be used. We'll regrab it when the dialog goes down */
+        gs_debug ("Initiate pointer-less grab move to %p", window);
+        gs_grab_move_to_window (manager->priv->grab,
+                                gs_window_get_gdk_window (window),
+                                gs_window_get_display (window),
+                                TRUE, FALSE);
+    }
+#endif
 
     if (!manager->priv->throttled) {
         gs_debug ("Suspending jobs");
@@ -672,11 +691,15 @@ handle_window_dialog_down (GSManager *manager,
 
     gs_debug ("Handling dialog down");
 
-    /* regrab pointer */
-    gs_grab_move_to_window (manager->priv->grab,
-                            gs_window_get_gdk_window (window),
-                            gs_window_get_display (window),
-                            FALSE, FALSE);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        /* regrab pointer */
+        gs_grab_move_to_window (manager->priv->grab,
+                                gs_window_get_gdk_window (window),
+                                gs_window_get_display (window),
+                                FALSE, FALSE);
+    }
+#endif
 
     /* make all windows sensitive to get events */
     g_hash_table_iter_init (&iter, manager->priv->windows);
@@ -726,7 +749,11 @@ disconnect_window_signals (GSManager *manager,
     g_signal_handlers_disconnect_by_func (window, window_map_event_cb, manager);
     g_signal_handlers_disconnect_by_func (window, window_obscured_cb, manager);
     g_signal_handlers_disconnect_by_func (window, window_dialog_up_changed_cb, manager);
-    g_signal_handlers_disconnect_by_func (window, window_grab_broken_cb, manager);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        g_signal_handlers_disconnect_by_func (window, window_grab_broken_cb, manager);
+    }
+#endif
 }
 
 static void
@@ -752,8 +779,12 @@ connect_window_signals (GSManager *manager,
                              G_CALLBACK (window_obscured_cb), manager, G_CONNECT_AFTER);
     g_signal_connect_object (window, "notify::dialog-up",
                              G_CALLBACK (window_dialog_up_changed_cb), manager, 0);
-    g_signal_connect_object (window, "grab_broken_event",
-                             G_CALLBACK (window_grab_broken_cb), manager, G_CONNECT_AFTER);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        g_signal_connect_object (window, "grab-broken-event",
+                                 G_CALLBACK (window_grab_broken_cb), manager, G_CONNECT_AFTER);
+    }
+#endif
 }
 
 
@@ -913,14 +944,18 @@ gs_manager_finalize (GObject *object) {
     g_return_if_fail (manager->priv != NULL);
 
     remove_timers(manager);
-    gs_grab_release (manager->priv->grab, TRUE);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        gs_grab_release (manager->priv->grab, TRUE);
+        g_object_unref (manager->priv->grab);
+    }
+#endif
     g_hash_table_destroy (manager->priv->jobs);
     gs_manager_destroy_windows (manager);
     g_hash_table_destroy (manager->priv->windows);
 
     manager->priv->active = FALSE;
 
-    g_object_unref (manager->priv->grab);
     g_object_unref (manager->priv->prefs);
 
     G_OBJECT_CLASS (gs_manager_parent_class)->finalize (object);
@@ -971,8 +1006,6 @@ show_windows (GHashTable *windows) {
 
 static gboolean
 gs_manager_activate (GSManager *manager) {
-    gboolean    res;
-
     g_return_val_if_fail (manager != NULL, FALSE);
     g_return_val_if_fail (GS_IS_MANAGER (manager), FALSE);
 
@@ -981,10 +1014,13 @@ gs_manager_activate (GSManager *manager) {
         return FALSE;
     }
 
-    res = gs_grab_grab_root (manager->priv->grab, FALSE, FALSE);
-    if (!res) {
-        return FALSE;
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        if (!gs_grab_grab_root (manager->priv->grab, FALSE, FALSE)) {
+            return FALSE;
+        }
     }
+#endif
 
     gs_manager_create_windows (GS_MANAGER (manager));
 
@@ -1006,7 +1042,11 @@ gs_manager_deactivate (GSManager *manager) {
     }
 
     remove_timers (manager);
-    gs_grab_release (manager->priv->grab, TRUE);
+#ifdef ENABLE_X11
+    if (manager->priv->grab != NULL) {
+        gs_grab_release (manager->priv->grab, TRUE);
+    }
+#endif
     g_hash_table_remove_all (manager->priv->jobs);
     gs_manager_destroy_windows (manager);
 
diff --git a/src/gs-monitor.c b/src/gs-monitor.c
index 239d355..5b4859e 100644
--- a/src/gs-monitor.c
+++ b/src/gs-monitor.c
@@ -28,11 +28,10 @@
 #include <string.h>
 #include <unistd.h>
 
+#ifdef ENABLE_X11
 #include <X11/extensions/scrnsaver.h>
-
-#include <glib.h>
-#include <glib-object.h>
 #include <gdk/gdkx.h>
+#endif
 
 #include "gs-debug.h"
 #include "gs-listener-dbus.h"
@@ -64,11 +63,15 @@ static void manager_deactivated_cb(GSManager* manager, GSMonitor* monitor) {
 }
 
 static void gs_monitor_simulate_user_activity(GSMonitor* monitor) {
-    Display *display = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
-    XScreenSaverSuspend (display, TRUE);
-    XSync (display, FALSE);
-    XScreenSaverSuspend (display, FALSE);
-    XSync (display, FALSE);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        Display *display = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
+        XScreenSaverSuspend (display, TRUE);
+        XSync (display, FALSE);
+        XScreenSaverSuspend (display, FALSE);
+        XSync (display, FALSE);
+    }
+#endif
 
     /* request that the manager unlock -
        will pop up a dialog if necessary */
diff --git a/src/gs-window-x11.c b/src/gs-window-x11.c
index ab202a5..6546c33 100644
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -28,12 +28,13 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 
-#include <gdk/gdkx.h>
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
-
 #include <X11/extensions/shape.h>
+#endif
 
 #include "gs-debug.h"
 #include "gs-marshal.h"
@@ -140,6 +141,7 @@ set_invisible_cursor (GdkWindow *window,
     }
 }
 
+#ifdef ENABLE_X11
 /* derived from tomboy */
 static void
 gs_window_override_user_time (GSWindow *window) {
@@ -212,12 +214,18 @@ widget_clear_all_children (GtkWidget *widget) {
 
     gdk_x11_display_error_trap_pop_ignored (display);
 }
+#endif
 
 void
 gs_window_clear (GSWindow *window) {
+#ifdef ENABLE_X11
     GdkDisplay *display;
     g_return_if_fail (GS_IS_WINDOW (window));
 
+    if (!GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        return;
+    }
+
     gs_debug ("Clearing widgets");
 
     if (gtk_widget_get_realized (GTK_WIDGET (window))) {
@@ -234,6 +242,7 @@ gs_window_clear (GSWindow *window) {
 
     display = gtk_widget_get_display (GTK_WIDGET(window));
     gdk_display_flush (display);
+#endif
 }
 
 static cairo_region_t *
@@ -367,7 +376,11 @@ gs_window_real_realize (GtkWidget *widget) {
         GTK_WIDGET_CLASS (gs_window_parent_class)->realize (widget);
     }
 
-    gs_window_override_user_time (GS_WINDOW (widget));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        gs_window_override_user_time (GS_WINDOW (widget));
+    }
+#endif
 
     gs_window_move_resize_window (GS_WINDOW (widget), TRUE, TRUE);
 
@@ -434,6 +447,7 @@ add_emit_deactivated_idle (GSWindow *window) {
     window->priv->deactivated_idle_id = g_idle_add (emit_deactivated_idle, window);
 }
 
+#ifdef ENABLE_X11
 static void
 gs_window_raise (GSWindow *window) {
     GdkWindow *win;
@@ -562,6 +576,7 @@ window_select_shape_events (GSWindow *window) {
 
     gdk_x11_display_error_trap_pop_ignored (display);
 }
+#endif
 
 static gboolean
 gs_window_real_draw (GtkWidget *widget,
@@ -593,9 +608,13 @@ gs_window_real_show (GtkWidget *widget) {
     remove_watchdog_timer (window);
     add_watchdog_timer (window, 30);
 
-    select_popup_events ();
-    window_select_shape_events (window);
-    gdk_window_add_filter (NULL, (GdkFilterFunc)xevent_filter, window);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        select_popup_events ();
+        window_select_shape_events (window);
+        gdk_window_add_filter (NULL, (GdkFilterFunc)xevent_filter, window);
+    }
+#endif
 }
 
 static void
@@ -698,7 +717,11 @@ gs_window_real_hide (GtkWidget *widget) {
 
     window = GS_WINDOW (widget);
 
-    gdk_window_remove_filter (NULL, (GdkFilterFunc)xevent_filter, window);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        gdk_window_remove_filter (NULL, (GdkFilterFunc)xevent_filter, window);
+    }
+#endif
 
     remove_watchdog_timer (window);
 
@@ -963,6 +986,16 @@ lock_socket_destroyed (GtkWidget *widget,
     window->priv->lock_socket = NULL;
 }
 
+static GtkWidget *
+socket_new (GSWindow *window) {
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        return gtk_socket_new ();
+    }
+#endif
+    return NULL;
+}
+
 static void
 create_keyboard_socket (GSWindow *window,
                         gulong    id) {
@@ -992,7 +1025,7 @@ create_keyboard_socket (GSWindow *window,
         width = 1400; // Native width for onboard
     }
 
-    window->priv->keyboard_socket = gtk_socket_new ();
+    window->priv->keyboard_socket = socket_new (window);
     gtk_widget_set_size_request (window->priv->keyboard_socket, width, height);
     gtk_widget_set_halign (window->priv->keyboard_socket, GTK_ALIGN_CENTER);
     gtk_widget_set_valign (window->priv->keyboard_socket, GTK_ALIGN_END);
@@ -1005,7 +1038,11 @@ create_keyboard_socket (GSWindow *window,
                       G_CALLBACK (keyboard_plug_removed), window);
 
     gtk_overlay_add_overlay (GTK_OVERLAY (window->priv->overlay), window->priv->keyboard_socket);
-    gtk_socket_add_id (GTK_SOCKET (window->priv->keyboard_socket), id);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        gtk_socket_add_id (GTK_SOCKET (window->priv->keyboard_socket), id);
+    }
+#endif
 
     if (!window->priv->prefs->keyboard_displayed) {
         gtk_widget_hide (window->priv->keyboard_socket);
@@ -1146,7 +1183,7 @@ embed_keyboard (GSWindow *window) {
 static void
 create_lock_socket (GSWindow *window,
                     gulong    id) {
-    window->priv->lock_socket = gtk_socket_new ();
+    window->priv->lock_socket = socket_new (window);
     window->priv->lock_box = gtk_grid_new ();
     gtk_widget_set_halign (GTK_WIDGET (window->priv->lock_box),
                            GTK_ALIGN_CENTER);
@@ -1170,7 +1207,11 @@ create_lock_socket (GSWindow *window,
     g_signal_connect (window->priv->lock_socket, "plug_removed",
                       G_CALLBACK (lock_plug_removed), window);
 
-    gtk_socket_add_id (GTK_SOCKET (window->priv->lock_socket), id);
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        gtk_socket_add_id (GTK_SOCKET (window->priv->lock_socket), id);
+    }
+#endif
 
     if (window->priv->prefs->keyboard_enabled) {
         embed_keyboard (window);
@@ -1776,6 +1817,7 @@ gs_window_reposition (GSWindow *window) {
     gs_window_real_size_request (GTK_WIDGET (window), &requisition);
 }
 
+#ifdef ENABLE_X11
 static gboolean
 gs_window_real_grab_broken (GtkWidget          *widget,
                             GdkEventGrabBroken *event) {
@@ -1792,6 +1834,7 @@ gs_window_real_grab_broken (GtkWidget          *widget,
 
     return FALSE;
 }
+#endif
 
 gboolean
 gs_window_is_obscured (GSWindow *window) {
@@ -1857,7 +1900,11 @@ gs_window_class_init (GSWindowClass *klass) {
     widget_class->scroll_event            = gs_window_real_scroll_event;
     widget_class->get_preferred_width     = gs_window_real_get_preferred_width;
     widget_class->get_preferred_height    = gs_window_real_get_preferred_height;
-    widget_class->grab_broken_event       = gs_window_real_grab_broken;
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        widget_class->grab_broken_event   = gs_window_real_grab_broken;
+    }
+#endif
     widget_class->visibility_notify_event = gs_window_real_visibility_notify_event;
 
     signals[ACTIVITY] =
@@ -1959,7 +2006,7 @@ gs_window_init (GSWindow *window) {
     gtk_widget_show (window->priv->vbox);
     gtk_container_add (GTK_CONTAINER (window), window->priv->vbox);
 
-    window->priv->drawing_area = gtk_socket_new ();
+    window->priv->drawing_area = socket_new (window);
     gtk_widget_show (window->priv->drawing_area);
     gtk_widget_set_app_paintable (window->priv->drawing_area, TRUE);
     gtk_box_pack_start (GTK_BOX (window->priv->vbox),
diff --git a/src/test-window.c b/src/test-window.c
index 3f799ee..75a9ad0 100644
--- a/src/test-window.c
+++ b/src/test-window.c
@@ -31,10 +31,13 @@
 #include <xfconf/xfconf.h>
 
 #include "gs-debug.h"
-#include "gs-grab.h"
 #include "gs-window.h"
 
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
+#include "gs-grab.h"
 static GSGrab *grab = NULL;
+#endif
 
 static void
 window_deactivated_cb (GSWindow *window,
@@ -55,11 +58,15 @@ window_dialog_down_cb (GSWindow *window,
 static void
 window_show_cb (GSWindow *window,
                 gpointer  data) {
-    /* move devices grab so that dialog can be used */
-    gs_grab_move_to_window (grab,
-                            gs_window_get_gdk_window (window),
-                            gs_window_get_display (window),
-                            TRUE, FALSE);
+#ifdef ENABLE_X11
+    if (grab != NULL) {
+        /* move devices grab so that dialog can be used */
+        gs_grab_move_to_window (grab,
+                                gs_window_get_gdk_window (window),
+                                gs_window_get_display (window),
+                                TRUE, FALSE);
+    }
+#endif
 }
 
 static gboolean
@@ -91,7 +98,11 @@ static void
 window_destroyed_cb (GtkWindow *window,
                      gpointer   data) {
     disconnect_window_signals (GS_WINDOW (window));
-    gs_grab_release (grab, TRUE);
+#ifdef ENABLE_X11
+    if (grab != NULL) {
+        gs_grab_release (grab, TRUE);
+    }
+#endif
     gtk_main_quit ();
 }
 
@@ -152,7 +163,11 @@ main (int    argc,
 
     gs_debug_init (TRUE, FALSE);
 
-    grab = gs_grab_new ();
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        grab = gs_grab_new ();
+    }
+#endif
 
     test_window ();
 
@@ -161,7 +176,11 @@ main (int    argc,
 
     gtk_main ();
 
-    g_object_unref (grab);
+#ifdef ENABLE_X11
+    if (grab != NULL) {
+        g_object_unref (grab);
+    }
+#endif
 
     gs_debug_shutdown ();
     xfconf_shutdown ();
diff --git a/src/xfce4-screensaver-dialog.c b/src/xfce4-screensaver-dialog.c
index 467134b..506170c 100644
--- a/src/xfce4-screensaver-dialog.c
+++ b/src/xfce4-screensaver-dialog.c
@@ -33,7 +33,10 @@
 #include <unistd.h>
 
 #include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #include <libxfce4util/libxfce4util.h>
 #include <xfconf/xfconf.h>
@@ -87,7 +90,12 @@ static char* get_id_string(GtkWidget* widget) {
     g_return_val_if_fail(widget != NULL, NULL);
     g_return_val_if_fail(GTK_IS_WIDGET(widget), NULL);
 
-    id = g_strdup_printf ("%lu", gtk_plug_get_id (GTK_PLUG (widget)));
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        id = g_strdup_printf ("%lu", gtk_plug_get_id (GTK_PLUG (widget)));
+    }
+#endif
+
     return id;
 }
 
diff --git a/src/xfce4-screensaver-preferences.c b/src/xfce4-screensaver-preferences.c
index 1e92c94..d4f1ee8 100644
--- a/src/xfce4-screensaver-preferences.c
+++ b/src/xfce4-screensaver-preferences.c
@@ -32,9 +32,11 @@
 #include <unistd.h>
 
 #include <gio/gio.h>
-#include <gdk/gdkx.h>
 #include <gtk/gtk.h>
+#ifdef ENABLE_X11
+#include <gdk/gdkx.h>
 #include <gtk/gtkx.h>
+#endif
 
 #include <libxfce4ui/libxfce4ui.h>
 #include <xfconf/xfconf.h>
@@ -1805,8 +1807,12 @@ configure_capplet (void) {
     fullscreen_preview_previous = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_previous_button"));
     fullscreen_preview_next     = GTK_WIDGET (gtk_builder_get_object (builder, "fullscreen_preview_next_button"));
 
-    gtk_container_add (GTK_CONTAINER (preview), gtk_socket_new ());
-    gtk_container_add (GTK_CONTAINER (fullscreen_preview_area), gtk_socket_new ());
+#ifdef ENABLE_X11
+    if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+        gtk_container_add (GTK_CONTAINER (preview), gtk_socket_new ());
+        gtk_container_add (GTK_CONTAINER (fullscreen_preview_area), gtk_socket_new ());
+    }
+#endif
     preview = gtk_bin_get_child (GTK_BIN (preview));
     gtk_widget_set_app_paintable (preview, TRUE);
     gtk_widget_set_hexpand (preview, TRUE);
@@ -2068,11 +2074,17 @@ main (int    argc,
 
         gtk_widget_show_all (dialog);
 
-        /* To prevent the settings dialog to be saved in the session */
-        gdk_x11_set_sm_client_id("FAKE ID");
+#ifdef ENABLE_X11
+        if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
+            /* To prevent the settings dialog to be saved in the session */
+            gdk_x11_set_sm_client_id("FAKE ID");
+        }
+#endif
 
         gtk_main();
-    } else {
+    }
+#ifdef ENABLE_X11
+    else if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) {
         GtkWidget *plug;
         GObject   *plug_child;
 
@@ -2097,6 +2109,7 @@ main (int    argc,
         /* Enter main loop */
         gtk_main();
     }
+#endif
 
     finalize_capplet ();
 
-- 
GitLab