*<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.
#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"
#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;
} 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")) {
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);