John Lindgren [Sat, 20 Jul 2024 15:25:10 +0000 (11:25 -0400)]
xwayland: use wlr_xwayland_surface_offer_focus()
Offer focus by sending WM_TAKE_FOCUS to a client window supporting it.
The client may accept or ignore the offer. If it accepts, the surface will
emit a focus_in signal notifying the compositor that it has received focus.
The compositor should then call wlr_xwayland_surface_activate(surface, true).
This is a more compatible method of giving focus to windows using the
Globally Active input model (see wlr_xwayland_icccm_input_model()) than
calling wlr_xwayland_surface_activate() unconditionally, since there is no
reliable way to know in advance whether these windows want to be focused.
v2: add caution not to use view_offer_focus() directly
v3: remove obsolete comment
Note:
MR 4819 is immediately followed by MR 4845.
MR 4819 removes return value of wlr_damage_ring_add().
MR 4845 applies applies buffer-local coordinates for
scene_output->damage_ring instead of transformed coordinates.
tokyo4j [Sun, 4 May 2025 13:33:12 +0000 (22:33 +0900)]
ssd: guard against negative sizes
We always create a SSD for 0x0 window since decorations are usually
requested before a window is mapped. Thus the sizes of some buffers/rects
like edge shadows could be negative, which is asserted in wlroots 0.19.
The view->impl functions do not directly support mapping a view while
minimized. Instead, mark it as not minimized, map it, and then minimize
it again.
rcxml: fix broken titlebar layout with multiple <layout> entries
Before this commit, when we have multiple <theme><titlebar><layout>
entries like below, duplicated button types can be inserted to
rc.title_buttons_{left,right} and the button could go outside of the
window:
<theme>
<titlebar><layout>icon:iconify,max,close</layout></titlebar>
<titlebar><layout>icon:iconify,max,close</layout></titlebar>
</theme>
This commit fixes by clearing those lists when the parser encounters
<theme><titlebar><layout>.
cursor: let followMouse update focus only when cursor enters a surface
Before this patch, when followMouse and followMouseRequiresMovement are
both yes, we set the keyboard focus when the cursor moves within an
unfocused surface. However, kwin, xfwm4 and openbox all set keyboard focus
only when the cursor enters a surface.
tokyo4j [Tue, 25 Mar 2025 07:01:54 +0000 (16:01 +0900)]
xwayland: notify correct window stacking order to xwayland
Before this commit, when a normal window is raised, xwayland thought it's
above always-on-top (AOT) windows even though it's actually below AOT
windows in the scene. This means mouse scroll events may be unexpectedly
sent to normal windows below AOT windows even when the cursor is hovering
over a AOT window.
So this commit fixes it by notifying the correct stacking order (where AOT
windows are placed above normal windows) to xwayland every time the
stacking order is updated.
Other benefits of this commit are:
- It makes the code more readable and predictable by aggregating logic
about stacking order management in xwayland (e.g. shaded windows or
windows in other workspaces should be notified to xwayland as being
placed at the bottom).
- As server->last_raised_view is removed in the previous commit, we were
notifying the stacking order to xwayland every time a window with dialog
windows is clicked (not when clicking a topmost window without dialogs,
due to some optimization in wlroots). This commit fixes this by caching
the window stacking order in xwayland_view->stacking_order and notifying
it to xwayland only when it's updated.
tokyo4j [Wed, 19 Mar 2025 00:54:20 +0000 (09:54 +0900)]
view: remove server->last_raised_view
We were skipping in view_move_to_front() if the raised view is already
cached as server->last_raised_view. But this was prone to bugs that
windows cannot be raised even though they are actually not placed at the
top in the scene.
This happened when a window is mapped but view_move_to_front() is not
called in view_impl_map() for some reason. Example cases were:
- a window is minimized before being mapped (#2627)
- a window is mapped while window switcher is active (#2629)
Also, this problem was the root cause of #1640 and #2582, though they are
already fixed.
Therefore, this commit removes server->last_raised_view. In order to
eliminate unnecessary communications between labwc and xwayland (ref: db591d1), I'll introduce another caching mechanism in the next commit.
tokyo4j [Sun, 30 Mar 2025 07:09:39 +0000 (16:09 +0900)]
magnifier: show magnifier only in one output
This may slightly degrade UX, but this prevents the temporary buffer from
being reallocated for every frame when the magnifier spans multiple
outputs with different scales/transforms.
Consolatis [Sun, 30 Mar 2025 02:12:55 +0000 (04:12 +0200)]
src/magnifier: fix compile on ancient GCC versions
Fixes
```
../src/magnifier.c:153:3: error: missing initializer for field ‘clip’ of ‘struct wlr_render_rect_options’ [-Werror=missing-field-initializers]
153 | };
| ^
In file included from ../subprojects/wlroots/include/wlr/render/wlr_renderer.h:14,
from ../subprojects/wlroots/include/wlr/types/wlr_output.h:17,
from ../src/magnifier.c:5:
../subprojects/wlroots/include/wlr/render/pass.h:115:27: note: ‘clip’ declared here
115 | const pixman_region32_t *clip
```
Consolatis [Sat, 8 Feb 2025 14:48:50 +0000 (15:48 +0100)]
project wide: clean up event listeners on shutdown
This ensures all event listeners are removed before the emitting
wlroots object is being destroyed. This will be enforced with asserts
in wlroots 0.19 but there is no reason to not do it right now either.
This change in wlroots 0.19 is implemented via commit 8f56f7ca43257cc05c7c4eb57a0f541e05cf9a79
"Assert (almost all) signals have no attached listeners on destroy"
tokyo4j [Sun, 9 Mar 2025 15:00:39 +0000 (00:00 +0900)]
menu: lazily generate menu scenes
This removes the need to call update_client_list_combined_menu()
and update_client_send_to_menu() every time a root menu is opened.
This commit also fixed the incorrect menu position with following
configuration:
<menu id="foo" label="foo">
<item label="aaaaaa"/>
<item label="bbbbbb"/>
</menu>
<menu id="root-menu">
<menu id="foo" />
<menu id="foo" />
</menu>