mirror of
https://github.com/labwc/labwc.git
synced 2025-11-01 22:58:47 -04:00
cursor: process layer subsurfaces in cursor_button_press()
...to give keyboard focus to layer-shell clients if exclusive or on-demand interactivity is set, so that menu popups can be navigated with the keyboard. This still only works if the client is in top (or overlay) layers. Support for bottom and background to be done as a separate patch set. Revert06b19f0to process layer-shell subsurfaces in `cursor_button_press()`, but only when their parent layer-shell surface has keyboard interactivity. Fix bug in `get_cursor_context()` which resulted in layer-surfaces not being detected correctly. Background: Commit06b19f0(issue #1131) disabled processing of layer-shell subsurfaces in cursor_button_press() because when pressing a task in Waybar (Gtk panel using layer-shell subsurfaces) the foreign-toplevel minimize-raise action did not work correctly as the action logic relied on the recipient window being activated and by clicking on the panel, the panel itself was both surface-focusd and activated (and thus the window de-activated). The un-intended consequence was that by not responding to layer-subsurface cursor buttons presses, layer-shell clients (such as panels) were not given keyboard focus if they indeed wanted it by setting exclusive or on-demand keyboard interactivity. The good news is that that following @jlindgren90's refactoring (various) the only place where we call `view_set_actived()` is in `focus_change_notify()` in `seat.c` and we now only do it for views (bb8f0bc). Another side-effect (positive) of06b19f0was that a Waybar dnd bug was fixed (pointer-serial-number validation failure). Have tested with sfwbar, waybar and tint (test-panel) the following results: - Minimize-raise works even when on-demand keyboard interactivity is set - Keyboard interactivity is given popup-menus (sfwbar and tint) when the panels are in the top layer (support for bottom will be as a separate patch set) - Waybar dnd still works (even when hard-coding keyboard-interactivity) References: -bb8f0bc960-40ce95a68c/src/seat.c (L481-L483)-40ce95a68c/src/dnd.c (L24)- https://github.com/johanmalm/tint Fixes: #1572
This commit is contained in:
parent
be37f9a564
commit
a5fcbfaf72
5 changed files with 72 additions and 39 deletions
|
|
@ -11,6 +11,7 @@
|
|||
#include "common/macros.h"
|
||||
#include "common/mem.h"
|
||||
#include "common/scene-helpers.h"
|
||||
#include "common/surface-helpers.h"
|
||||
#include "config/mousebind.h"
|
||||
#include "dnd.h"
|
||||
#include "idle.h"
|
||||
|
|
@ -965,11 +966,19 @@ cursor_button_press(struct seat *seat, uint32_t button,
|
|||
* the Focus action (used for normal views) does not work.
|
||||
*/
|
||||
if (ctx.type == LAB_SSD_LAYER_SURFACE) {
|
||||
wlr_log(WLR_DEBUG, "press on layer-surface");
|
||||
struct wlr_layer_surface_v1 *layer =
|
||||
wlr_layer_surface_v1_try_from_wlr_surface(ctx.surface);
|
||||
if (layer && layer->current.keyboard_interactive) {
|
||||
seat_set_focus_layer(seat, layer);
|
||||
}
|
||||
} else if (ctx.type == LAB_SSD_LAYER_SUBSURFACE) {
|
||||
wlr_log(WLR_DEBUG, "press on layer-subsurface");
|
||||
struct wlr_layer_surface_v1 *layer =
|
||||
subsurface_parent_layer(ctx.surface);
|
||||
if (layer && layer->current.keyboard_interactive) {
|
||||
seat_set_focus_layer(seat, layer);
|
||||
}
|
||||
#ifdef HAVE_XWAYLAND
|
||||
} else if (ctx.type == LAB_SSD_UNMANAGED) {
|
||||
desktop_focus_view_or_surface(seat, NULL, ctx.surface,
|
||||
|
|
@ -977,12 +986,6 @@ cursor_button_press(struct seat *seat, uint32_t button,
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: We may need to handle press on layer-shell subsurfaces here,
|
||||
* but need to check keyboard interactivity before focusing them
|
||||
* otherwise we break waybar. See issue #1131
|
||||
*/
|
||||
|
||||
if (ctx.type != LAB_SSD_CLIENT && ctx.type != LAB_SSD_LAYER_SUBSURFACE
|
||||
&& wlr_seat_pointer_has_grab(seat->seat)) {
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue