From c017916d35795cf85e5181907f5e97a1d702612a Mon Sep 17 00:00:00 2001 From: Leonardo Hernández Hernández Date: Wed, 31 Aug 2022 16:05:19 -0500 Subject: Revert "various improvements to layer surface" see https://github.com/djpohly/dwl/issues/289#issuecomment-1231287114 This reverts commit 226051974060746d02d787ac1ef70b6267ee51b4. --- dwl.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/dwl.c b/dwl.c index 8556cba..a3b13b6 100644 --- a/dwl.c +++ b/dwl.c @@ -783,23 +783,25 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data) { LayerSurface *layersurface = wl_container_of(listener, layersurface, surface_commit); struct wlr_layer_surface_v1 *wlr_layer_surface = layersurface->layer_surface; + struct wlr_output *wlr_output = wlr_layer_surface->output; - if (!layersurface->mon) + if (!wlr_output || !(layersurface->mon = wlr_output->data)) return; - if (layers[wlr_layer_surface->current.layer] != layersurface->scene) { - wlr_scene_node_reparent(layersurface->scene, - layers[wlr_layer_surface->current.layer]); - wl_list_remove(&layersurface->link); - wl_list_insert(&layersurface->mon->layers[wlr_layer_surface->current.layer], - &layersurface->link); - } + wlr_scene_node_reparent(layersurface->scene, + layers[wlr_layer_surface->current.layer]); if (wlr_layer_surface->current.committed == 0 && layersurface->mapped == wlr_layer_surface->mapped) return; + layersurface->mapped = wlr_layer_surface->mapped; + if (layers[wlr_layer_surface->current.layer] != layersurface->scene) { + wl_list_remove(&layersurface->link); + wl_list_insert(&layersurface->mon->layers[wlr_layer_surface->current.layer], + &layersurface->link); + } arrangelayers(layersurface->mon); } @@ -866,13 +868,14 @@ createlayersurface(struct wl_listener *listener, void *data) LayerSurface *layersurface; struct wlr_layer_surface_v1_state old_state; - if (!wlr_layer_surface->output) + if (!wlr_layer_surface->output) { wlr_layer_surface->output = selmon->wlr_output; + } layersurface = ecalloc(1, sizeof(LayerSurface)); layersurface->type = LayerShell; LISTEN(&wlr_layer_surface->surface->events.commit, - &layersurface->surface_commit, commitlayersurfacenotify); + &layersurface->surface_commit, commitlayersurfacenotify); LISTEN(&wlr_layer_surface->events.destroy, &layersurface->destroy, destroylayersurfacenotify); LISTEN(&wlr_layer_surface->events.map, &layersurface->map, @@ -881,8 +884,8 @@ createlayersurface(struct wl_listener *listener, void *data) unmaplayersurfacenotify); layersurface->layer_surface = wlr_layer_surface; - layersurface->mon = wlr_layer_surface->output->data; wlr_layer_surface->data = layersurface; + layersurface->mon = wlr_layer_surface->output->data; layersurface->scene = wlr_layer_surface->surface->data = wlr_scene_subsurface_tree_create(layers[wlr_layer_surface->pending.layer], @@ -1073,8 +1076,11 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data) wl_list_remove(&layersurface->unmap.link); wl_list_remove(&layersurface->surface_commit.link); wlr_scene_node_destroy(layersurface->scene); - if (layersurface->mon) - arrangelayers(layersurface->mon); + if (layersurface->layer_surface->output) { + if ((layersurface->mon = layersurface->layer_surface->output->data)) + arrangelayers(layersurface->mon); + layersurface->layer_surface->output = NULL; + } free(layersurface); } @@ -1374,8 +1380,10 @@ killclient(const Arg *arg) void maplayersurfacenotify(struct wl_listener *listener, void *data) { - LayerSurface *l = wl_container_of(listener, l, map); - wlr_surface_send_enter(l->layer_surface->surface, l->mon->wlr_output); + LayerSurface *layersurface = wl_container_of(listener, layersurface, map); + layersurface->mon = layersurface->layer_surface->output->data; + wlr_surface_send_enter(layersurface->layer_surface->surface, + layersurface->mon->wlr_output); motionnotify(0); } -- cgit v1.2.3 From 40b1c0b849ee48c428f7f901afcdc67d20f3cf7c Mon Sep 17 00:00:00 2001 From: Leonardo Hernández Hernández Date: Fri, 2 Sep 2022 16:54:53 -0500 Subject: Revert "Revert "various improvements to layer surface"" This reverts commit c017916d35795cf85e5181907f5e97a1d702612a. --- dwl.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/dwl.c b/dwl.c index a3b13b6..8556cba 100644 --- a/dwl.c +++ b/dwl.c @@ -783,25 +783,23 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data) { LayerSurface *layersurface = wl_container_of(listener, layersurface, surface_commit); struct wlr_layer_surface_v1 *wlr_layer_surface = layersurface->layer_surface; - struct wlr_output *wlr_output = wlr_layer_surface->output; - if (!wlr_output || !(layersurface->mon = wlr_output->data)) + if (!layersurface->mon) return; - wlr_scene_node_reparent(layersurface->scene, - layers[wlr_layer_surface->current.layer]); + if (layers[wlr_layer_surface->current.layer] != layersurface->scene) { + wlr_scene_node_reparent(layersurface->scene, + layers[wlr_layer_surface->current.layer]); + wl_list_remove(&layersurface->link); + wl_list_insert(&layersurface->mon->layers[wlr_layer_surface->current.layer], + &layersurface->link); + } if (wlr_layer_surface->current.committed == 0 && layersurface->mapped == wlr_layer_surface->mapped) return; - layersurface->mapped = wlr_layer_surface->mapped; - if (layers[wlr_layer_surface->current.layer] != layersurface->scene) { - wl_list_remove(&layersurface->link); - wl_list_insert(&layersurface->mon->layers[wlr_layer_surface->current.layer], - &layersurface->link); - } arrangelayers(layersurface->mon); } @@ -868,14 +866,13 @@ createlayersurface(struct wl_listener *listener, void *data) LayerSurface *layersurface; struct wlr_layer_surface_v1_state old_state; - if (!wlr_layer_surface->output) { + if (!wlr_layer_surface->output) wlr_layer_surface->output = selmon->wlr_output; - } layersurface = ecalloc(1, sizeof(LayerSurface)); layersurface->type = LayerShell; LISTEN(&wlr_layer_surface->surface->events.commit, - &layersurface->surface_commit, commitlayersurfacenotify); + &layersurface->surface_commit, commitlayersurfacenotify); LISTEN(&wlr_layer_surface->events.destroy, &layersurface->destroy, destroylayersurfacenotify); LISTEN(&wlr_layer_surface->events.map, &layersurface->map, @@ -884,8 +881,8 @@ createlayersurface(struct wl_listener *listener, void *data) unmaplayersurfacenotify); layersurface->layer_surface = wlr_layer_surface; - wlr_layer_surface->data = layersurface; layersurface->mon = wlr_layer_surface->output->data; + wlr_layer_surface->data = layersurface; layersurface->scene = wlr_layer_surface->surface->data = wlr_scene_subsurface_tree_create(layers[wlr_layer_surface->pending.layer], @@ -1076,11 +1073,8 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data) wl_list_remove(&layersurface->unmap.link); wl_list_remove(&layersurface->surface_commit.link); wlr_scene_node_destroy(layersurface->scene); - if (layersurface->layer_surface->output) { - if ((layersurface->mon = layersurface->layer_surface->output->data)) - arrangelayers(layersurface->mon); - layersurface->layer_surface->output = NULL; - } + if (layersurface->mon) + arrangelayers(layersurface->mon); free(layersurface); } @@ -1380,10 +1374,8 @@ killclient(const Arg *arg) void maplayersurfacenotify(struct wl_listener *listener, void *data) { - LayerSurface *layersurface = wl_container_of(listener, layersurface, map); - layersurface->mon = layersurface->layer_surface->output->data; - wlr_surface_send_enter(layersurface->layer_surface->surface, - layersurface->mon->wlr_output); + LayerSurface *l = wl_container_of(listener, l, map); + wlr_surface_send_enter(l->layer_surface->surface, l->mon->wlr_output); motionnotify(0); } -- cgit v1.2.3 From 1f59b76d7726c83e8131609d806d5c78abb89356 Mon Sep 17 00:00:00 2001 From: Leonardo Hernández Hernández Date: Fri, 2 Sep 2022 17:29:41 -0500 Subject: prevent segfault when destroying monitors also don't count unmapped surfaces for exclusive zone and exclusive_focus is now of type `void *` --- dwl.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dwl.c b/dwl.c index 8556cba..85db889 100644 --- a/dwl.c +++ b/dwl.c @@ -300,7 +300,7 @@ static void zoom(const Arg *arg); /* variables */ static const char broken[] = "broken"; static pid_t child_pid = -1; -static struct wlr_surface *exclusive_focus; +static void *exclusive_focus; static struct wl_display *dpy; static struct wlr_backend *backend; static struct wlr_scene *scene; @@ -522,7 +522,7 @@ arrangelayer(Monitor *m, struct wl_list *list, struct wlr_box *usable_area, int const uint32_t both_vert = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; - if (exclusive != (state->exclusive_zone > 0)) + if (wlr_layer_surface->mapped && exclusive != (state->exclusive_zone > 0)) continue; bounds = state->exclusive_zone == -1 ? full_area : *usable_area; @@ -613,8 +613,8 @@ arrangelayers(Monitor *m) layersurface->layer_surface->mapped) { /* Deactivate the focused client. */ focusclient(NULL, 0); - exclusive_focus = layersurface->layer_surface->surface; - client_notify_enter(exclusive_focus, wlr_seat_get_keyboard(seat)); + exclusive_focus = layersurface; + client_notify_enter(layersurface->layer_surface->surface, wlr_seat_get_keyboard(seat)); return; } } @@ -749,6 +749,7 @@ cleanupmon(struct wl_listener *listener, void *data) wl_list_remove(&m->destroy.link); wl_list_remove(&m->frame.link); wl_list_remove(&m->link); + wlr_output->data = NULL; wlr_output_layout_remove(output_layout, m->wlr_output); wlr_scene_output_destroy(m->scene_output); @@ -783,8 +784,9 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data) { LayerSurface *layersurface = wl_container_of(listener, layersurface, surface_commit); struct wlr_layer_surface_v1 *wlr_layer_surface = layersurface->layer_surface; + struct wlr_output *wlr_output = wlr_layer_surface->output; - if (!layersurface->mon) + if (!wlr_output || !(layersurface->mon = wlr_output->data)) return; if (layers[wlr_layer_surface->current.layer] != layersurface->scene) { @@ -1073,8 +1075,6 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data) wl_list_remove(&layersurface->unmap.link); wl_list_remove(&layersurface->surface_commit.link); wlr_scene_node_destroy(layersurface->scene); - if (layersurface->mon) - arrangelayers(layersurface->mon); free(layersurface); } @@ -2317,7 +2317,10 @@ unmaplayersurfacenotify(struct wl_listener *listener, void *data) layersurface->layer_surface->mapped = (layersurface->mapped = 0); wlr_scene_node_set_enabled(layersurface->scene, 0); - if (layersurface->layer_surface->surface == exclusive_focus) + if (layersurface->layer_surface->output + && (layersurface->mon = layersurface->layer_surface->output->data)) + arrangelayers(layersurface->mon); + if (layersurface == exclusive_focus) exclusive_focus = NULL; if (layersurface->layer_surface->surface == seat->keyboard_state.focused_surface) -- cgit v1.2.3 From 19a8a095ebe782065903b9a03670560371302206 Mon Sep 17 00:00:00 2001 From: Leonardo Hernández Hernández Date: Fri, 2 Sep 2022 18:22:15 -0500 Subject: call setfullscreen() in setmon() this will help when sending to another monitor a fullscreen client and also will prevent a crash when a client request fullscreen when it has no monitor --- dwl.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dwl.c b/dwl.c index 85db889..f6db3c1 100644 --- a/dwl.c +++ b/dwl.c @@ -1438,9 +1438,6 @@ mapnotify(struct wl_listener *listener, void *data) } printstatus(); - if (c->isfullscreen) - setfullscreen(c, 1); - c->mon->un_map = 1; } @@ -1889,6 +1886,8 @@ void setfullscreen(Client *c, int fullscreen) { c->isfullscreen = fullscreen; + if (!c->mon) + return; c->bw = fullscreen ? 0 : borderpx; client_set_fullscreen(c, fullscreen); @@ -1968,7 +1967,7 @@ setmon(Client *c, Monitor *m, unsigned int newtags) resize(c, c->geom, 0); wlr_surface_send_enter(client_surface(c), m->wlr_output); c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */ - arrange(m); + setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ } focusclient(focustop(selmon), 1); } -- cgit v1.2.3 From 68576799b96950dd36ed7c71ba0c4b1607a13cc8 Mon Sep 17 00:00:00 2001 From: Leonardo Hernández Hernández Date: Fri, 2 Sep 2022 18:49:20 -0500 Subject: don't arrange layers on disabled monitors --- dwl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dwl.c b/dwl.c index f6db3c1..669580a 100644 --- a/dwl.c +++ b/dwl.c @@ -591,6 +591,8 @@ arrangelayers(Monitor *m) ZWLR_LAYER_SHELL_V1_LAYER_TOP, }; LayerSurface *layersurface; + if (!m || !m->wlr_output->enabled) + return; /* Arrange exclusive surfaces from top->bottom */ for (i = 3; i >= 0; i--) -- cgit v1.2.3 From e91f71e8d6b6b29da69ec0cd8ad8f7dec2878df3 Mon Sep 17 00:00:00 2001 From: Dmitry Zakharchenko Date: Fri, 2 Sep 2022 19:57:35 +0300 Subject: Add direct irc link Also, move IRC section to the top so that it's more accessible. --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 887bf29..6b12ab0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # dwl - dwm for Wayland -Join us on our [Discord server](https://discord.gg/jJxZnrGPWN)! +Join us on our [Discord server](https://discord.gg/jJxZnrGPWN) and at [#dwl](https://web.libera.chat/?channels=#dwl) on irc.libera.chat. dwl is a compact, hackable compositor for Wayland based on [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots/). It is intended to fill the same space in the Wayland world that dwm does in X11, primarily in terms of philosophy, and secondarily in terms of functionality. Like dwm, dwl is: @@ -85,10 +85,6 @@ Existing dwl-specific status bars and dwl-specific scripts for other status bars You can find a [list of Wayland applications on the sway wiki](https://github.com/swaywm/sway/wiki/i3-Migration-Guide). -## IRC channel - -dwl's IRC channel is #dwl on irc.libera.chat. - ## Acknowledgements dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots developers. This was made possible in many cases by looking at how sway accomplished something, then trying to do the same in as suckless a way as possible. -- cgit v1.2.3