config: only default to xwayland persistence on old wlroots versions

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.
This commit is contained in:
Andrew J. Hesford 2024-12-11 14:57:07 -05:00 committed by Consolatis
parent ea58ab0259
commit df6081b52c
2 changed files with 24 additions and 14 deletions

View 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.

View 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);