Merge branch 'no-window-decorations' into master

Closes #163
This commit is contained in:
Daniel Eklöf 2020-10-10 22:23:08 +02:00
commit 8e161ed4e9
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 42 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,15 @@ 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
*server*, or render SSDs despite *client* or *none* being set.
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;