Merge branch 'main' into wlroots-next

This commit is contained in:
Leonardo Hernández Hernández 2023-12-07 22:43:13 -06:00
commit 0de7d1aa71
No known key found for this signature in database
GPG key ID: E538897EE11B9624
3 changed files with 31 additions and 29 deletions

View file

@ -105,7 +105,7 @@ shell command using `/bin/sh -c`. It serves a similar function to `.xinitrc`,
but differs in that the display server will not shut down when this process but differs in that the display server will not shut down when this process
terminates. Instead, dwl will send this process a SIGTERM at shutdown and wait terminates. Instead, dwl will send this process a SIGTERM at shutdown and wait
for it to terminate (if it hasn't already). This makes it ideal for execing into for it to terminate (if it hasn't already). This makes it ideal for execing into
a user service manager like [s6], [anopa], [runit], or [`systemd --user`]. a user service manager like [s6], [anopa], [runit], [dinit], or [`systemd --user`].
Note: The `-s` command is run as a *child process* of dwl, which means that it Note: The `-s` command is run as a *child process* of dwl, which means that it
does not have the ability to affect the environment of dwl or of any processes does not have the ability to affect the environment of dwl or of any processes
@ -167,6 +167,7 @@ inspiration, and to the various contributors to the project, including:
[s6]: https://skarnet.org/software/s6/ [s6]: https://skarnet.org/software/s6/
[anopa]: https://jjacky.com/anopa/ [anopa]: https://jjacky.com/anopa/
[runit]: http://smarden.org/runit/faq.html#userservices [runit]: http://smarden.org/runit/faq.html#userservices
[dinit]: https://davmac.org/projects/dinit/
[`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User [`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User
[wiki]: https://codeberg.org/dwl/dwl/wiki/Home#compatible-status-bars [wiki]: https://codeberg.org/dwl/dwl/wiki/Home#compatible-status-bars
[list of useful resources on our wiki]: [list of useful resources on our wiki]:

View file

@ -36,6 +36,7 @@ static const Layout layouts[] = {
}; };
/* monitors */ /* monitors */
/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */
static const MonitorRule monrules[] = { static const MonitorRule monrules[] = {
/* name mfact nmaster scale layout rotate/reflect x y */ /* name mfact nmaster scale layout rotate/reflect x y */
/* example of a HiDPI laptop monitor: /* example of a HiDPI laptop monitor:

56
dwl.c
View file

@ -21,7 +21,6 @@
#include <wlr/types/wlr_data_control_v1.h> #include <wlr/types/wlr_data_control_v1.h>
#include <wlr/types/wlr_data_device.h> #include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_drm.h> #include <wlr/types/wlr_drm.h>
#include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/types/wlr_export_dmabuf_v1.h> #include <wlr/types/wlr_export_dmabuf_v1.h>
#include <wlr/types/wlr_fractional_scale_v1.h> #include <wlr/types/wlr_fractional_scale_v1.h>
#include <wlr/types/wlr_gamma_control_v1.h> #include <wlr/types/wlr_gamma_control_v1.h>
@ -30,6 +29,7 @@
#include <wlr/types/wlr_input_device.h> #include <wlr/types/wlr_input_device.h>
#include <wlr/types/wlr_keyboard.h> #include <wlr/types/wlr_keyboard.h>
#include <wlr/types/wlr_layer_shell_v1.h> #include <wlr/types/wlr_layer_shell_v1.h>
#include <wlr/types/wlr_linux_dmabuf_v1.h>
#include <wlr/types/wlr_output.h> #include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_layout.h> #include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_output_management_v1.h> #include <wlr/types/wlr_output_management_v1.h>
@ -188,7 +188,7 @@ struct Monitor {
struct wlr_session_lock_surface_v1 *lock_surface; struct wlr_session_lock_surface_v1 *lock_surface;
struct wlr_box m; /* monitor area, layout-relative */ struct wlr_box m; /* monitor area, layout-relative */
struct wlr_box w; /* window area, layout-relative */ struct wlr_box w; /* window area, layout-relative */
struct wl_list layers[4]; /* LayerSurface::link */ struct wl_list layers[4]; /* LayerSurface.link */
const Layout *lt[2]; const Layout *lt[2];
unsigned int seltags; unsigned int seltags;
unsigned int sellt; unsigned int sellt;
@ -826,9 +826,9 @@ createlayersurface(struct wl_listener *listener, void *data)
l->mon = layer_surface->output->data; l->mon = layer_surface->output->data;
l->scene_layer = wlr_scene_layer_surface_v1_create(scene_layer, layer_surface); l->scene_layer = wlr_scene_layer_surface_v1_create(scene_layer, layer_surface);
l->scene = l->scene_layer->tree; l->scene = l->scene_layer->tree;
l->popups = surface->data = wlr_scene_tree_create(scene_layer); l->popups = surface->data = wlr_scene_tree_create(layer_surface->current.layer
l->scene->node.data = l; < ZWLR_LAYER_SHELL_V1_LAYER_TOP ? layers[LyrTop] : scene_layer);
l->scene->node.data = l->popups->node.data = l;
wl_list_insert(&l->mon->layers[layer_surface->pending.layer],&l->link); wl_list_insert(&l->mon->layers[layer_surface->pending.layer],&l->link);
wlr_surface_send_enter(surface, layer_surface->output); wlr_surface_send_enter(surface, layer_surface->output);
@ -878,13 +878,14 @@ createmon(struct wl_listener *listener, void *data)
m->tagset[0] = m->tagset[1] = 1; m->tagset[0] = m->tagset[1] = 1;
for (r = monrules; r < END(monrules); r++) { for (r = monrules; r < END(monrules); r++) {
if (!r->name || strstr(wlr_output->name, r->name)) { if (!r->name || strstr(wlr_output->name, r->name)) {
m->mfact = r->mfact;
m->nmaster = r->nmaster;
wlr_output_state_set_scale(&state, r->scale);
m->lt[0] = m->lt[1] = r->lt;
wlr_output_state_set_transform(&state, r->rr);
m->m.x = r->x; m->m.x = r->x;
m->m.y = r->y; m->m.y = r->y;
m->mfact = r->mfact;
m->nmaster = r->nmaster;
m->lt[0] = m->lt[1] = r->lt;
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol));
wlr_output_state_set_scale(&state, r->scale);
wlr_output_state_set_transform(&state, r->rr);
break; break;
} }
} }
@ -930,7 +931,6 @@ createmon(struct wl_listener *listener, void *data)
wlr_output_layout_add_auto(output_layout, wlr_output); wlr_output_layout_add_auto(output_layout, wlr_output);
else else
wlr_output_layout_add(output_layout, wlr_output, m->m.x, m->m.y); wlr_output_layout_add(output_layout, wlr_output, m->m.x, m->m.y);
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol));
} }
void void
@ -958,8 +958,7 @@ void
createpointer(struct wlr_pointer *pointer) createpointer(struct wlr_pointer *pointer)
{ {
if (wlr_input_device_is_libinput(&pointer->base)) { if (wlr_input_device_is_libinput(&pointer->base)) {
struct libinput_device *libinput_device = (struct libinput_device*) struct libinput_device *libinput_device = wlr_libinput_get_device_handle(&pointer->base);
wlr_libinput_get_device_handle(&pointer->base);
if (libinput_device_config_tap_get_finger_count(libinput_device)) { if (libinput_device_config_tap_get_finger_count(libinput_device)) {
libinput_device_config_tap_set_enabled(libinput_device, tap_to_click); libinput_device_config_tap_set_enabled(libinput_device, tap_to_click);
@ -1510,9 +1509,10 @@ mapnotify(struct wl_listener *listener, void *data)
: wlr_scene_subsurface_tree_create(c->scene, client_surface(c)); : wlr_scene_subsurface_tree_create(c->scene, client_surface(c));
c->scene->node.data = c->scene_surface->node.data = c; c->scene->node.data = c->scene_surface->node.data = c;
client_get_geometry(c, &c->geom);
/* Handle unmanaged clients first so we can return prior create borders */ /* Handle unmanaged clients first so we can return prior create borders */
if (client_is_unmanaged(c)) { if (client_is_unmanaged(c)) {
client_get_geometry(c, &c->geom);
/* Unmanaged clients always are floating */ /* Unmanaged clients always are floating */
wlr_scene_node_reparent(&c->scene->node, layers[LyrFloat]); wlr_scene_node_reparent(&c->scene->node, layers[LyrFloat]);
wlr_scene_node_set_position(&c->scene->node, c->geom.x + borderpx, wlr_scene_node_set_position(&c->scene->node, c->geom.x + borderpx,
@ -1525,13 +1525,13 @@ mapnotify(struct wl_listener *listener, void *data)
} }
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, bordercolor); c->border[i] = wlr_scene_rect_create(c->scene, 0, 0,
c->isurgent ? urgentcolor : bordercolor);
c->border[i]->node.data = c; c->border[i]->node.data = c;
} }
/* Initialize client geometry with room for border */ /* Initialize client geometry with room for border */
client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT);
client_get_geometry(c, &c->geom);
c->geom.width += 2 * c->bw; c->geom.width += 2 * c->bw;
c->geom.height += 2 * c->bw; c->geom.height += 2 * c->bw;
@ -2553,14 +2553,14 @@ updatemons(struct wl_listener *listener, void *data)
/* Remove this output from the layout to avoid cursor enter inside it */ /* Remove this output from the layout to avoid cursor enter inside it */
wlr_output_layout_remove(output_layout, m->wlr_output); wlr_output_layout_remove(output_layout, m->wlr_output);
closemon(m); closemon(m);
memset(&m->m, 0, sizeof(m->m)); m->m = m->w = (struct wlr_box){0};
memset(&m->w, 0, sizeof(m->w));
} }
/* Insert outputs that need to */ /* Insert outputs that need to */
wl_list_for_each(m, &mons, link) wl_list_for_each(m, &mons, link)
if (m->wlr_output->enabled if (m->wlr_output->enabled
&& !wlr_output_layout_get(output_layout, m->wlr_output)) && !wlr_output_layout_get(output_layout, m->wlr_output))
wlr_output_layout_add_auto(output_layout, m->wlr_output); wlr_output_layout_add_auto(output_layout, m->wlr_output);
/* Now that we update the output layout we can get its box */ /* Now that we update the output layout we can get its box */
wlr_output_layout_get_box(output_layout, NULL, &sgeom); wlr_output_layout_get_box(output_layout, NULL, &sgeom);
@ -2584,8 +2584,7 @@ updatemons(struct wl_listener *listener, void *data)
if (m->lock_surface) { if (m->lock_surface) {
struct wlr_scene_tree *scene_tree = m->lock_surface->surface->data; struct wlr_scene_tree *scene_tree = m->lock_surface->surface->data;
wlr_scene_node_set_position(&scene_tree->node, m->m.x, m->m.y); wlr_scene_node_set_position(&scene_tree->node, m->m.x, m->m.y);
wlr_session_lock_surface_v1_configure(m->lock_surface, m->m.width, wlr_session_lock_surface_v1_configure(m->lock_surface, m->m.width, m->m.height);
m->m.height);
} }
/* Calculate the effective monitor geometry to use for clients */ /* Calculate the effective monitor geometry to use for clients */
@ -2596,9 +2595,10 @@ updatemons(struct wl_listener *listener, void *data)
if ((c = focustop(m)) && c->isfullscreen) if ((c = focustop(m)) && c->isfullscreen)
resize(c, m->m, 0); resize(c, m->m, 0);
/* Try to re-set the gamma LUT when updating monitors,
* it's only really needed when enabling a disabled output, but meh. */
m->gamma_lut_changed = 1; m->gamma_lut_changed = 1;
config_head->state.enabled = 1;
config_head->state.mode = m->wlr_output->current_mode;
config_head->state.x = m->m.x; config_head->state.x = m->m.x;
config_head->state.y = m->m.y; config_head->state.y = m->m.y;
} }
@ -2642,10 +2642,11 @@ urgent(struct wl_listener *listener, void *data)
if (!c || c == focustop(selmon)) if (!c || c == focustop(selmon))
return; return;
if (client_surface(c)->mapped)
client_set_border_color(c, urgentcolor);
c->isurgent = 1; c->isurgent = 1;
printstatus(); printstatus();
if (client_surface(c)->mapped)
client_set_border_color(c, urgentcolor);
} }
void void
@ -2786,13 +2787,13 @@ createnotifyx11(struct wl_listener *listener, void *data)
/* Listen to the various events it can emit */ /* Listen to the various events it can emit */
LISTEN(&xsurface->events.associate, &c->associate, associatex11); LISTEN(&xsurface->events.associate, &c->associate, associatex11);
LISTEN(&xsurface->events.destroy, &c->destroy, destroynotify);
LISTEN(&xsurface->events.dissociate, &c->dissociate, dissociatex11); LISTEN(&xsurface->events.dissociate, &c->dissociate, dissociatex11);
LISTEN(&xsurface->events.request_activate, &c->activate, activatex11); LISTEN(&xsurface->events.request_activate, &c->activate, activatex11);
LISTEN(&xsurface->events.request_configure, &c->configure, configurex11); LISTEN(&xsurface->events.request_configure, &c->configure, configurex11);
LISTEN(&xsurface->events.request_fullscreen, &c->fullscreen, fullscreennotify);
LISTEN(&xsurface->events.set_hints, &c->set_hints, sethints); LISTEN(&xsurface->events.set_hints, &c->set_hints, sethints);
LISTEN(&xsurface->events.set_title, &c->set_title, updatetitle); LISTEN(&xsurface->events.set_title, &c->set_title, updatetitle);
LISTEN(&xsurface->events.destroy, &c->destroy, destroynotify);
LISTEN(&xsurface->events.request_fullscreen, &c->fullscreen, fullscreennotify);
} }
void void
@ -2825,11 +2826,10 @@ sethints(struct wl_listener *listener, void *data)
return; return;
c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints);
printstatus();
if (c->isurgent && surface && surface->mapped) if (c->isurgent && surface && surface->mapped)
client_set_border_color(c, urgentcolor); client_set_border_color(c, urgentcolor);
printstatus();
} }
void void