Commit Graph

13502 Commits

Author SHA1 Message Date
cddfd875bc core: Port to meta_window_stack_position_compare
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4183>
2025-02-26 10:03:18 +00:00
11d0a4b5b3 core/stack: Introduce meta_window_stack_position_compare
This moves the implementation to window.c for a more general comparison
function to be used throughout the code base.
It will be used in the successive commits.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4183>
2025-02-26 10:03:18 +00:00
a34b9276b4 core/stack: Export meta_stack_ensure_sorted
We export stack_ensure_sorted as meta_stack_ensure_sorted; it will be
needed in the next commit since the general comparison function will move
to window.c

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4183>
2025-02-26 10:03:18 +00:00
e1cf5352a6 core/stack: Get workspace_manager from display whenever possible
Simplifies meta_stack_update_layer and meta_stack_update_transient

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4183>
2025-02-26 10:03:18 +00:00
e591850206 core/stack: Reformat stack.c
This commit only reformats stack.c, mostly following uncrustify's output.
No functional change intended.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4183>
2025-02-26 10:03:18 +00:00
57698c2689 wayland/text-input: Reset focus state when destroying text_input
When closing some wayland apps using text-input-v3, text_input_destructor
could remove resource in focus_resource_list without resetting focus.

This could be an issue if, the focus is on a wayland app not using text-
input-v3 after closing those. Text committing would fail, and the
candidate window would always show on previous entry.

This commit adds check in text_input_destructor, resetting focus if
necessary.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4776
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4164>
2025-02-26 09:44:50 +00:00
54c606ed8e gdctl: Allow to lease monitors
Add a new option (--for-lease-monitor) to allow to set a monitor that is
not part of any logical monitor as available for lease.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4300>
2025-02-26 08:34:56 +00:00
5a984292a5 tests/clutter: Add color-state-transform test
The steps for this test:
  * For each testing color create an actor and assign the color to it.
  * Create a src_color_state and set it to all actors.
  * Create a target_color_state and set it to the stage_view.
  * Wait for paint.
  * Read the color for each actor which will be different after the
    color-state transformation.
  * Do the same transformation on CPU for each test color.
  * Validate that the resulting colors match.

In the future this test will be extended to compare transformations
between color_state_params and color_state_icc.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4230>
2025-02-25 18:28:49 +00:00
edb91a3cc6 udev: Don't ignore drm devices with mismatching seat when headless
The seat we'll have is not a real seat, so lets not filter out drm
devices when running headlessly.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3912
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4281>
2025-02-25 08:21:17 +00:00
d8512767ea color-device: Update the color device on force-hdr debug-control changes
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4298>
2025-02-25 03:27:27 +00:00
74f8e83154 wayland/color-management: Enable support for EXT_LINEAR tf
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4291>
2025-02-25 02:40:17 +00:00
8fb2a8a4b8 wayland/color-management: Expose the protocol by default
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4291>
2025-02-25 02:40:17 +00:00
4fe1e41ab3 wayland/color-management: Update to upstream wp_color_management_v1
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4291>
2025-02-25 02:40:17 +00:00
b1ef99bf23 build: Reorder wayland protocol alphabetically
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4291>
2025-02-25 02:40:17 +00:00
5eaed6e3f3 core: Let the MetaA11yManager handle keyboard events
Plumb the MetaA11yManager into key event handling. This manager
is partly in control of keyboard event propagation, depending on
the screen readers connected.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
a817d7c137 core: Add a debug control override to disable the a11y manager ACL
This commit adds another way how to disable the a11y manager ACL in development.
Setting the unsafe mode might not be as straightforward as setting an
environment variable for the session, and you can control it invidually too.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
1c34794b13 backends: Add D-Bus access control helper
Track unique DBus senders and allow only thse which own a (at least so far)
pre-defined set of well known DBus names.

Carlos Garnacho: Renamed to a more generic helper, use g_bus_watch_name().

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
20c9b8cf0c backends: Add a11y interface methods to subscribe to key event input
This adds a pair of methods to signal an interest in receiving
all key events without grabbing them, e. g. the previously expected behavior
by screen readers.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
800981c40c backends: Add method to pass key events to screen readers
Accessibility shortcuts and keyboard grabs need to be consumed,
and key events propagated to screen readers. Add a function that
does it all at once.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
45f6bed780 backends/native: Propagate a11y modifiers from MetaA11yManager
Listen to changes in MetaA11yManager configured modifiers, and propagate
these along to the MetaSeatNative. This lets the backend keep track of
configuration changes in a11y modifiers.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
1498724774 backends: Add MetaA11yManager method to get configured a11y modifiers
The ::a11y-modifiers-change method allows tracking for changes in the
configured modifiers, add this method to allow backends to get the
modifiers so that they can be passed along the lower layers.

Carlos Garnacho: Turn into a method instead of a signal argument, turn
into an array+length instead of a hashtable.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
0bcda4ecf4 backends: Implement A11y monitor interface
Implement the org.freedesktop.a11y.KeyboardMonitor interface,
allowing screen readers to interact with Mutter and grab
shortcuts or full keyboard interaction.

Carlos Garnacho: Move setup to ::constructed.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
f4ce1e8a46 backends: Manage MetaA11yManager in MetaBackend
The MetaBackend will own the MetaA11yManager, being actually
put to use in backend implementations.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
c0c4524452 backends: Add MetaA11yManager
This a11y manager will handle key event emission to screen
readers and other ATs. This initial commit only introduces
the object.

Carlos Garnacho: Make the object take a ::backend property

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
8c52e243c0 backends/native: Plumb a11y modifiers through MetaSeatNative
These modifiers will be set by the backend from the main thread, and
need to be handled specially for them to be usable as both modifier
buttons, and their own regular action.

Carlos Garnacho: pass modifiers as array+lenght instead of hashtable.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
d867964139 backends/native: Handle a11y modifier presses in MetaSeatImpl
The state handling about whether the a11y modifier is a first press (so
could be consumed for other actions), or results in the modifier action
(e.g. caps lock) is performed in the input thread. This information will
be propagated through the CLUTTER_EVENT_FLAG_A11Y_MODIFIER_FIRST_CLICK
flag in the related key events.

Carlos Garnacho: Drop synchronous wait for configuration changes

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
84fc62a280 data: Introduce the DBus interface description for the a11y manager
This object will for now only provide a way for assistive technologies
to receive keyboard events, however it is expected that it will be used for
the new a11y communication protocol in the future.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4217>
2025-02-25 02:14:46 +00:00
ef43bec374 tests/kms: Ignore real GPUs when only VKMS is wanted
This prevents spurious test failures on machines with a real GPU as
well as VKMS.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4274>
2025-02-24 07:47:48 +00:00
aaf6c88226 input-settings/native: Default to sticky drag lock
libinput 1.27 added a new "sticky" mode to the tap-and-drag drag lock -
the previous mode is now called the "timeout" mode.

In sticky mode the drag lock is explicitly terminated with an extra tap,
i.e. a full sequence is:
        tap, down, [:move, up, wait, down:], up, tap
where the middle part can repeat and/or wait as long as required.

In the previous "timeout" mode the drag lock would automatically release
after a timeout - for users with low dexterity this timeout may be too
short.

The sticky mode is also how macos does drag lock.

Related: https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/2798
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4292>
2025-02-20 10:48:19 +00:00
045342eb5a onscreen/native: Prefer gbm_surface_create_with_modifiers even for linear
The Nvidia driver doesn't implement `gbm_surface_create` properly,
which was first mentioned in 9fee3a9ec1. So using `gbm_surface_create`
as a fallback for the linear case was failing with ENOSYS (Function not
implemented).

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3918

Fixes: 163520c177 ("onscreen/native: Do not use modifiers if surface should be sharable")

See also: https://forums.developer.nvidia.com/t/gbm-surface-create-fails-if-flags-0/279951

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4284>
2025-02-19 19:33:01 +00:00
db955eccc7 tests/stacking: Account for cascading in always-on-top-map-new-partial
Since we now cascade when center-new-windows is true, we need to update the
always-above window positions to account for where the new windows will end
up being placed.
Assertions are also added for the two test windows' positions.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
4d280086fe core/place: Fix and enable centered find_next_cascade
We use place_centered to start the cascade from the center of the
usable work_area; sorting now takes either the top left or top right window
corner as a reference using window_distance_cmp.

Helps: https://gitlab.gnome.org/GNOME/mutter/-/issues/2123
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
c606d1e670 core/place: Introduce window_distance_cmp
This commit introduces a new comparator, window_distance_cmp,
which uses either the top left or top right corner of a given window, based
on LTR, as reference for the squared distance.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
45052aeafd core/place: Normalize comparator functions to work_area coordinates
Both northwest_cmp and northeast_cmp didn't account for the work_area's
relative x and y coordinates which would lead to improper sorting on
multi-monitor setups.
To fix this, we pass the work_area when necessary and use it to offset the
absolute coordinates.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
14b90daa5a core/place: Remove unnecessary sqrt in comparator functions
Remove unnecessary sqrt() calls in northwest_cmp and northeast_cmp.
The square root would have been necessary if we needed the actual distance,
but we only care about the relative order, so it isn't.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
970ac8ff50 core/place: Simplify meta_window_place
This is a preparatory commit, it refactors away of the
done_check_denied_focus label, simplifying the control flow.

The only functional difference is that now the auto-maximization when
windows don't fit the work_area is always applied.

The next commits will adapt find_next_cascade to properly handle this.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
b3fd815bed core/place: Drop unused arguments in find_next_cascade
We drop the x and y arguments from find_next_cascade
since they're unused.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
61a7b21d08 core/place: Drop unused arguments in find_first_fit
We drop the x and y arguments from find_first_fit since they're unused.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
7c5005b9b0 core/place: Reformat place.c
This commit only reformats place.c, starting off uncrustify's output, no
functional change is intended.
It mostly aligns comments, as well as properly space out math,
follow current formatter enforced guidelines and fix alignment on a rogue
bracket.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4202>
2025-02-19 19:20:38 +00:00
5d07e69461 onscreen/native: Allow to force copy mode
Create an environment variable to allow to set the copy mode.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4251>
2025-02-19 19:10:02 +00:00
8245f9f790 onscreen/native: Allow to force CPU copy on copy mode primary
By default, copy mode primary tries to use the GPU to perform the copy
and, in case of error, it fallbacks to CPU.

Add a flag (unused for the moment) to allow to use the CPU to perform
the copy.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4251>
2025-02-19 19:10:01 +00:00
005b969227 wayland: Implement the cursor_shape_v1 protocol
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3668>
2025-02-19 18:06:45 +00:00
25bb319ec2 debug-control: Add property for toggling the cursor shape protocol
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3668>
2025-02-19 18:06:45 +00:00
92c6452753 cursor: Support css and wayland cursor-shape cursors
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3668>
2025-02-19 18:06:45 +00:00
4009bfe006 wayland: Move pointer and tablet tool focus serial check to function
This will be used by the cursor_shape protocol in the next commit.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3668>
2025-02-19 18:06:45 +00:00
ba4cb3e021 kms: Add debug logging about full resource change triggers
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4209>
2025-02-19 16:53:58 +00:00
3fde2f7100 kms/connector: Fix kms_modes_equal
It would return FALSE if any pair of one mode from each list didn't
match, which is always the case if either list has at least two modes.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3831
Fixes: a8d11161b6 ("kms: Only emit resources-changed signal if we recorded a change")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4209>
2025-02-19 16:53:58 +00:00
6fe8993e35 kms/connector: Return TRUE from edid_equal if both EDID pointers are NULL
Fixes: a8d11161b6 ("kms: Only emit resources-changed signal if we recorded a change")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4209>
2025-02-19 16:53:58 +00:00
71603c22fb kms/connector: Refactor edid_equal helper out of _state_changes
No functional change intended.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4209>
2025-02-19 16:53:58 +00:00
313860e2fa kms: Wait for 2 seconds before handling udev hotplug events
More precisely, wait until no further udev hotplug events have arrived
in 2 seconds.

Keep a list of unique UpdateStatesData structs which have received
hotplug events, and call handle_hotplug_event for all of them once the
timeout expires.

This avoids problems due to some monitors generating hotplug events
when power saving is enabled on locking the session, and then
temporarily appearing disconnected.

v2:
* Make meta_test_disconnect_connect wait and run main context dispatch
  before checking the number of logical monitors.
v3:
* Call g_source_unref immediately after g_source_attach, simplifies
  source cleanup. (Sebastian Wick)
* Free hotplug devices list in meta_kms_finalize. (Sebastian Wick)
* Add KMS debug logging in on_udev_hotplug & hotplug_timeout.
* Bump timeout to 2 seconds. With my affected monitor, the second udev
  hotplug event normally arrives almost a second after the first one,
  occasionally more than 1.5 seconds though.
* Use UpdateStatesData with custom compare function for hotplug_devices
  list data, since the GUdevDevice / device path string pointer values
  are always different.
* Don't wait for timeout if meta_is_udev_test_device returns TRUE, to
  hopefully fix VKMS CI tests. Drop meta_test_disconnect_connect changes
  again.
v4:
* Use hash table instead of list for hotplug_events set. (Sebastian Wick)
* Add comment describing the keys & values in the hash table. (Sebastian Wick)
* Add KMS debug logging in handle_hotplug_event as well.
* Dropped Closes:, this might not suffice to fully address
  https://gitlab.gnome.org/GNOME/mutter/-/issues/3831 after all.
v5:
* Simplify hash table annotation comment. (Sebastian Wick)
v6:
* Rename hotplug_timeout local string pointer to hotplug_event.
* Drop g_clear_pointer in favour of g_autofree in on_udev_hotplug.
  (Sebastian Wick)

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4209>
2025-02-19 16:53:58 +00:00