conf: csd.preferred can now be set to ‘none’

When csd.preferred == none, we will request CSDs from the compositor,
but internally render as if we are using SSDs. That is, we don’t
render any window decorations at all.

Note that some compositors may ignore our request to use CSDs, and
still render SSDs for us.

Closes #163
This commit is contained in:
Daniel Eklöf 2020-10-10 11:04:17 +02:00
parent e54adbfa7c
commit 6ff97128fc
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 46 additions and 20 deletions

View file

@ -39,6 +39,9 @@
from `1.0` to `3.0`.
* `shift`+`insert` now pastes from the primary selection by
default. This is in addition to middle-clicking with the mouse.
* **csd.preferred** can now be set to `none` to disable window
decorations. Note that some compositors will render SSDs despite
this option being used (https://codeberg.org/dnkl/foot/issues/163).
### Deprecated

View file

@ -813,8 +813,12 @@ parse_section_csd(const char *key, const char *value, struct config *conf,
conf->csd.preferred = CONF_CSD_PREFER_SERVER;
else if (strcmp(value, "client") == 0)
conf->csd.preferred = CONF_CSD_PREFER_CLIENT;
else if (strcmp(value, "none") == 0)
conf->csd.preferred = CONF_CSD_PREFER_NONE;
else {
LOG_AND_NOTIFY_ERR("%s:%d: csd.preferred: expected either 'server' or 'client'", path, lineno);
LOG_AND_NOTIFY_ERR(
"%s:%d: csd.preferred: expected either "
"'server', 'client' or 'none'", path, lineno);
return false;
}
}

View file

@ -140,7 +140,7 @@ struct config {
} bindings;
struct {
enum { CONF_CSD_PREFER_SERVER, CONF_CSD_PREFER_CLIENT } preferred;
enum { CONF_CSD_PREFER_NONE, CONF_CSD_PREFER_SERVER, CONF_CSD_PREFER_CLIENT } preferred;
int title_height;
int border_width;

View file

@ -238,10 +238,19 @@ values here are in AARRGGBB format. I.e. they contain an alpha
component.
*preferred*
Which type of window decorations to prefer: *client* (CSD) or
*server* (SSD). Note that this is only a hint to the
compositor. Depending on the compositor's configuration and
capabilities, it may not have any effect. Default: _server_.
Which type of window decorations to prefer: *client* (CSD),
*server* (SSD) or *none*.
Note that this is only a hint to the compositor. Depending on
compositor support, and how it has been configured, it may
instruct foot to use CSDs even though this option has been set to
*client*, or to use SSDs even though CSDs were requested.
The exception is *none*. In this mode, foot will technically
request CSDs from the compositor, but will not actually render any
window decorations at all, regardless of the compositors response.
Default: _server_.
*size*
Height, in pixels (subject to output scaling), of the

View file

@ -635,22 +635,29 @@ xdg_toplevel_decoration_configure(void *data,
{
struct wl_window *win = data;
switch (mode) {
case ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE:
LOG_INFO("using CSD decorations");
win->use_csd = CSD_YES;
csd_instantiate(win);
break;
case ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE:
LOG_INFO("using SSD decorations");
if (win->term->conf->csd.preferred == CONF_CSD_PREFER_NONE) {
/* User explicitly disabled window decorations */
LOG_INFO("window decorations disabled");
win->use_csd = CSD_NO;
csd_destroy(win);
break;
} else {
switch (mode) {
case ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE:
LOG_INFO("using CSD decorations");
win->use_csd = CSD_YES;
csd_instantiate(win);
break;
default:
LOG_ERR("unimplemented: unknown XDG toplevel decoration mode: %u", mode);
break;
case ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE:
LOG_INFO("using SSD decorations");
win->use_csd = CSD_NO;
csd_destroy(win);
break;
default:
LOG_ERR("unimplemented: unknown XDG toplevel decoration mode: %u", mode);
break;
}
}
if (win->is_configured && win->use_csd == CSD_YES) {
@ -1184,7 +1191,6 @@ wayl_win_init(struct terminal *term)
xdg_toplevel_set_app_id(win->xdg_toplevel, conf->app_id);
/* Request server-side decorations */
if (wayl->xdg_decoration_manager != NULL) {
win->xdg_toplevel_decoration = zxdg_decoration_manager_v1_get_toplevel_decoration(
wayl->xdg_decoration_manager, win->xdg_toplevel);
@ -1200,6 +1206,10 @@ wayl_win_init(struct terminal *term)
zxdg_toplevel_decoration_v1_add_listener(
win->xdg_toplevel_decoration, &xdg_toplevel_decoration_listener, win);
} else if (conf->csd.preferred == CONF_CSD_PREFER_NONE) {
/* No decoration manager - and user specifically do *not* want CSDs */
win->use_csd = CSD_NO;
LOG_INFO("no decoration manager available - user has disabled CSDs");
} else {
/* No decoration manager - thus we *must* draw our own decorations */
win->use_csd = CSD_YES;