Merge branch 'main' into wlroots-next

This commit is contained in:
Leonardo Hernández Hernández 2023-06-02 22:01:39 -06:00
commit a8ccbe63f3
No known key found for this signature in database
GPG key ID: E538897EE11B9624
2 changed files with 25 additions and 18 deletions

View file

@ -14,9 +14,4 @@ wlroots version:
<!-- <!--
Only report bugs that can be reproduced on the main line Only report bugs that can be reproduced on the main line
Report patch issues to their respective authors Report patch issues to their respective authors
If the patch author doesn't respond within a reasonable time, email me:
Leonardo Hernández Hernández <leohdz172@protonmail.com>
but note that I'm NOT making any promises
--> -->

38
dwl.c
View file

@ -843,8 +843,10 @@ createlayersurface(struct wl_listener *listener, void *data)
if (!wlr_layer_surface->output) if (!wlr_layer_surface->output)
wlr_layer_surface->output = selmon ? selmon->wlr_output : NULL; wlr_layer_surface->output = selmon ? selmon->wlr_output : NULL;
if (!wlr_layer_surface->output) if (!wlr_layer_surface->output) {
wlr_layer_surface_v1_destroy(wlr_layer_surface); wlr_layer_surface_v1_destroy(wlr_layer_surface);
return;
}
layersurface = ecalloc(1, sizeof(LayerSurface)); layersurface = ecalloc(1, sizeof(LayerSurface));
layersurface->type = LayerShell; layersurface->type = LayerShell;
@ -1207,7 +1209,9 @@ void
focusclient(Client *c, int lift) focusclient(Client *c, int lift)
{ {
struct wlr_surface *old = seat->keyboard_state.focused_surface; struct wlr_surface *old = seat->keyboard_state.focused_surface;
int i, unused_lx, unused_ly; int i, unused_lx, unused_ly, old_client_type;
Client *old_c = NULL;
LayerSurface *old_l = NULL;
if (locked) if (locked)
return; return;
@ -1219,6 +1223,12 @@ focusclient(Client *c, int lift)
if (c && client_surface(c) == old) if (c && client_surface(c) == old)
return; return;
if ((old_client_type = toplevel_from_wlr_surface(old, &old_c, &old_l)) == XDGShell) {
struct wlr_xdg_popup *popup, *tmp;
wl_list_for_each_safe(popup, tmp, &old_c->surface.xdg->popups, link)
wlr_xdg_popup_destroy(popup);
}
/* Put the new client atop the focus stack and select its monitor */ /* Put the new client atop the focus stack and select its monitor */
if (c && !client_is_unmanaged(c)) { if (c && !client_is_unmanaged(c)) {
wl_list_remove(&c->flink); wl_list_remove(&c->flink);
@ -1239,19 +1249,17 @@ focusclient(Client *c, int lift)
/* If an overlay is focused, don't focus or activate the client, /* If an overlay is focused, don't focus or activate the client,
* but only update its position in fstack to render its border with focuscolor * but only update its position in fstack to render its border with focuscolor
* and focus it after the overlay is closed. */ * and focus it after the overlay is closed. */
Client *w = NULL; if (old_client_type == LayerShell && wlr_scene_node_coords(
LayerSurface *l = NULL; &old_l->scene->node, &unused_lx, &unused_ly)
int type = toplevel_from_wlr_surface(old, &w, &l); && old_l->layer_surface->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) {
if (type == LayerShell && wlr_scene_node_coords(&l->scene->node, &unused_lx, &unused_ly)
&& l->layer_surface->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) {
return; return;
} else if (w && w == exclusive_focus && client_wants_focus(w)) { } else if (old_c && old_c == exclusive_focus && client_wants_focus(old_c)) {
return; return;
/* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg
* and probably other clients */ * and probably other clients */
} else if (w && !client_is_unmanaged(w) && (!c || !client_wants_focus(c))) { } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
wlr_scene_rect_set_color(w->border[i], bordercolor); wlr_scene_rect_set_color(old_c->border[i], bordercolor);
client_activate_surface(old, 0); client_activate_surface(old, 0);
} }
@ -1893,8 +1901,8 @@ rendermon(struct wl_listener *listener, void *data)
wl_list_for_each(c, &clients, link) wl_list_for_each(c, &clients, link)
if (c->resize && !c->isfloating && client_is_rendered_on_mon(c, m) && !client_is_stopped(c)) if (c->resize && !c->isfloating && client_is_rendered_on_mon(c, m) && !client_is_stopped(c))
goto skip; goto skip;
if (!wlr_scene_output_commit(m->scene_output)) wlr_scene_output_commit(m->scene_output);
return;
skip: skip:
/* Let clients know a frame has been rendered */ /* Let clients know a frame has been rendered */
clock_gettime(CLOCK_MONOTONIC, &now); clock_gettime(CLOCK_MONOTONIC, &now);
@ -2279,6 +2287,7 @@ setup(void)
* images are available at all scale factors on the screen (necessary for * images are available at all scale factors on the screen (necessary for
* HiDPI support). Scaled cursors will be loaded with each output. */ * HiDPI support). Scaled cursors will be loaded with each output. */
cursor_mgr = wlr_xcursor_manager_create(NULL, 24); cursor_mgr = wlr_xcursor_manager_create(NULL, 24);
setenv("XCURSOR_SIZE", "24", 1);
/* /*
* wlr_cursor *only* displays an image on screen. It does not move around * wlr_cursor *only* displays an image on screen. It does not move around
@ -2590,9 +2599,12 @@ updatemons(struct wl_listener *listener, void *data)
wl_list_for_each(c, &clients, link) wl_list_for_each(c, &clients, link)
if (!c->mon && client_is_mapped(c)) if (!c->mon && client_is_mapped(c))
setmon(c, selmon, c->tags); setmon(c, selmon, c->tags);
if (selmon->lock_surface) focusclient(focustop(selmon), 1);
if (selmon->lock_surface) {
client_notify_enter(selmon->lock_surface->surface, client_notify_enter(selmon->lock_surface->surface,
wlr_seat_get_keyboard(seat)); wlr_seat_get_keyboard(seat));
client_activate_surface(selmon->lock_surface->surface, 1);
}
} }
wlr_output_manager_v1_set_configuration(output_mgr, config); wlr_output_manager_v1_set_configuration(output_mgr, config);