]> git.mdlowis.com Git - proto/labwc.git/commitdiff
config: only default to xwayland persistence on old wlroots versions
authorAndrew J. Hesford <ajh@sideband.org>
Wed, 11 Dec 2024 19:57:07 +0000 (14:57 -0500)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Thu, 12 Dec 2024 01:20:33 +0000 (02:20 +0100)
This is a compile-time check, so it will be too conservative if somebody
updates wlroots after building labwc, but that is still better than the
alternatives.

docs/labwc-config.5.scd
src/config/rcxml.c

index d9f939fa5fc71196a3821ca85ab80af2f5c4b5ae..1f48f62a48325609ff14c1048e084d5f316e2570 100644 (file)
@@ -219,13 +219,12 @@ this is for compatibility with Openbox.
 *<core><xwaylandPersistence>* [yes|no]
        Keep XWayland alive even when no clients are connected, rather than
        using a "lazy" policy that allows the server to launch on demand and die
-       when it is no longer needed. Default is yes.
+       when it is no longer needed.
 
-       This is only temporarily defaulting to yes to avoid a bug that is
-       present in wlroots <0.18.2 resulting in a compositor crash when
-       performing a drag-and-drop action at the same time as the XWayland
-       server is shutting down. This will be reverted to a default "no" when
-       wlroots-0.18.2 can be linked with.
+       When labwc is compiled with wlroots 0.18.2 or later, the default is no.
+       When labwc is compiled with wlroots < 0.18.2, the default is yes to
+       avoid a wlroots bug that can result in compositor crashes when
+       performing drag-and-drop actions when the XWayland server is shut down.
 
        Note: changing this setting requires a restart of labwc.
 
index a8cb9d3b32aace0c2124b053ab3cdab2dc005cc1..bdd84291535a9823f720935df51e937989607462 100644 (file)
@@ -14,6 +14,7 @@
 #include <wayland-server-core.h>
 #include <wlr/util/box.h>
 #include <wlr/util/log.h>
+#include <wlr/version.h>
 #include "action.h"
 #include "common/dir.h"
 #include "common/list.h"
@@ -36,6 +37,9 @@
 #include "window-rules.h"
 #include "workspaces.h"
 
+#define LAB_WLR_VERSION_OLDER_THAN(major, minor, micro) \
+       (WLR_VERSION_NUM < (((major) << 16) | ((minor) << 8) | (micro)))
+
 static bool in_regions;
 static bool in_usable_area_override;
 static bool in_keybind;
@@ -1089,16 +1093,14 @@ entry(xmlNode *node, char *nodename, char *content)
        } else if (!strcasecmp(nodename, "xwaylandPersistence.core")) {
                set_bool(content, &rc.xwayland_persistence);
 
-               /*
-                * TODO: Temporary warning message. Revert when wlroots-0.18.2
-                * can be linked with.
-                */
+#if LAB_WLR_VERSION_OLDER_THAN(0, 18, 2)
                if (!rc.xwayland_persistence) {
-                       wlr_log(WLR_ERROR, "setting xwaylandPersistence to 'no' "
-                               "is not encouraged unless wlroots-0.18.2 is used "
-                               "since it has a potential risk of crashing the "
-                               "entire session. See #2371 for details.");
+                       wlr_log(WLR_ERROR, "to avoid the risk of a fatal crash, "
+                               "setting xwaylandPersistence to 'no' is only "
+                               "recommended when labwc is compiled against "
+                               "wlroots >= 0.18.2. See #2371 for details.");
                }
+#endif
        } else if (!strcasecmp(nodename, "x.cascadeOffset.placement")) {
                rc.placement_cascade_offset_x = atoi(content);
        } else if (!strcasecmp(nodename, "y.cascadeOffset.placement")) {
@@ -1463,7 +1465,16 @@ rcxml_init(void)
        rc.adaptive_sync = LAB_ADAPTIVE_SYNC_DISABLED;
        rc.allow_tearing = false;
        rc.reuse_output_mode = false;
+
+#if LAB_WLR_VERSION_OLDER_THAN(0, 18, 2)
+       /*
+        * For wlroots < 0.18.2, keep xwayland alive by default to work around
+        * a fatal crash when the X server is terminated during drag-and-drop.
+        */
        rc.xwayland_persistence = true;
+#else
+       rc.xwayland_persistence = false;
+#endif
 
        init_font_defaults(&rc.font_activewindow);
        init_font_defaults(&rc.font_inactivewindow);