tearing: add fullscreen option

If set, labwc will try to automatically enable tearing for fullscreen
applications.

Fixes: #1557
This commit is contained in:
Consolatis 2024-02-28 03:29:07 +01:00
parent 7110b7cf3e
commit db7f300554
5 changed files with 33 additions and 5 deletions

View file

@ -157,6 +157,7 @@ Actions are used in menus and keyboard/mouse bindings.
*<action name="ToggleTearing" />*
Toggles tearing for the focused window.
Requires the config option 'allowTearing'.
*<action name="FocusOutput" output="HDMI-A-1" />*
Give focus to topmost window on given output and warp the cursor

View file

@ -142,11 +142,14 @@ this is for compatibility with Openbox.
*fullscreen* enables adaptive sync whenever a window is in fullscreen
mode.
*<core><allowTearing>* [yes|no]
*<core><allowTearing>* [yes|no|fullscreen]
Allow tearing to reduce input lag. Default is no.
This option requires setting the environment variable
WLR_DRM_NO_ATOMIC=1.
*yes* allow tearing if requested by the active window.
*yes* allows tearing if requested by the active window.
*fullscreen* enables tearing automatically for fullscreen windows.
*<core><reuseOutputMode>* [yes|no]
Try to re-use the existing output mode (resolution / refresh rate).

View file

@ -35,6 +35,12 @@ enum adaptive_sync_mode {
LAB_ADAPTIVE_SYNC_FULLSCREEN,
};
enum tearing_mode {
LAB_TEARING_DISABLED = 0,
LAB_TEARING_ENABLED,
LAB_TEARING_FULLSCREEN,
};
enum tiling_events_mode {
LAB_TILING_EVENTS_NEVER = 0,
LAB_TILING_EVENTS_REGION = 1 << 0,
@ -65,7 +71,7 @@ struct rcxml {
bool xdg_shell_server_side_deco;
int gap;
enum adaptive_sync_mode adaptive_sync;
bool allow_tearing;
enum tearing_mode allow_tearing;
bool reuse_output_mode;
enum view_placement_policy placement_policy;

View file

@ -695,6 +695,18 @@ set_adaptive_sync_mode(const char *str, enum adaptive_sync_mode *variable)
}
}
static void
set_tearing_mode(const char *str, enum tearing_mode *variable)
{
if (!strcasecmp(str, "fullscreen")) {
*variable = LAB_TEARING_FULLSCREEN;
} else if (parse_bool(str, -1) == 1) {
*variable = LAB_TEARING_ENABLED;
} else {
*variable = LAB_TEARING_DISABLED;
}
}
static void
entry(xmlNode *node, char *nodename, char *content)
{
@ -803,11 +815,11 @@ entry(xmlNode *node, char *nodename, char *content)
} else if (!strcasecmp(nodename, "adaptiveSync.core")) {
set_adaptive_sync_mode(content, &rc.adaptive_sync);
} else if (!strcasecmp(nodename, "allowTearing.core")) {
set_bool(content, &rc.allow_tearing);
set_tearing_mode(content, &rc.allow_tearing);
if (rc.allow_tearing) {
char *no_atomic_env = getenv("WLR_DRM_NO_ATOMIC");
if (!no_atomic_env || strcmp(no_atomic_env, "1") != 0) {
rc.allow_tearing = false;
rc.allow_tearing = LAB_TEARING_DISABLED;
wlr_log(WLR_ERROR, "tearing requires WLR_DRM_NO_ATOMIC=1");
}
}

View file

@ -44,6 +44,12 @@ get_tearing_preference(struct output *output)
return false;
}
/* If configured, automatically enable tearing for fullscreen applications */
if (rc.allow_tearing == LAB_TEARING_FULLSCREEN
&& server->active_view->fullscreen) {
return true;
}
/* If the active view requests tearing, or it is toggled on with action, allow it */
return server->active_view->tearing_hint;
}