Commit Graph

8239 Commits

Author SHA1 Message Date
Robert Mader
aaae07f9dd onscreen/native: Mark GPU rendering duration as valid if supported
Since commit e30eb78891 `ClutterFrameClock` assumes that a valid CPU time
implies timestamp query support, which is also checked in
`cogl_onscreen_egl_swap_buffers_with_damage()`.

Unconditionally setting the CPU time on direct scanout meant that the
compositing path would be stuck on the last (direct scanout optimized)
result on GL implementations without timestamp query support since.

be0aa2976e (clutter/frame-clock: Avoid rapidly toggling dynamic max render time)

Fix that by explicitly marking the gpu rendering duration as valid when
querying the GPU timestamps is supported and check for it ClutterFrameClock.

Fixes: 56580ea7c9 ("backends/native: Assume zero rendering time for direct scanout buffers")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3655>
2024-03-13 16:37:16 +01:00
Zander Brown
6a445d2eef build: Make exported package in gir consistent
Additionally Cogl was missing xlib as an include

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1918>
2024-03-13 12:52:41 +00:00
Peter Hutterer
46ca7fbe00 clutter: Indentation and whitespace fix
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3647>
2024-03-07 14:34:36 +10:00
Christian Hergert
0810238d22 clutter/frame-clock: Use timerfd for clock timing
Currently, ClutterFrameClock uses g_source_set_ready_time() to determine
the usec timing of the next frame. That translates into a poll() with a
millisecond timeout if no trigger occurs to break the poll() out early.

To avoid spinning the CPU, GLib always rounds *up* to the next millisecond
value unless a timeout of 0 was provided by a GSource.

This means that timeouts for the ClutterFrameClock can easily skew beyond
their expected time as the precision is too coarse.

This applies the same concept as GNOME/glib!3949 but just for the
ClutterFrameClock. That may be more ideal than adding a timerfd for every
GMainContext, but we'll see if that lands upstream. I wanted to provide
this here because it could easily be cherry-picked in the mean time if
this is found to be useful.

From a timer stability perspective, this improves things from erratically
jumping between 100s and 1000s off of the expected awake time to single
or low double digits.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3636>
2024-03-06 23:10:13 +00:00
Carlos Garnacho
7aebc9e63d clutter: Pass scroll source to discrete events
This piece of information was lost, always returning
"unknown". We can do better on the native backend.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3642>
2024-03-05 21:47:43 +00:00
Carlos Garnacho
3c217d2902 cally: Use text length if caret is at the end of ClutterText
ClutterText uses -1 to express the caret being at the end of the
text content. A11y expects this position to be equivalent to the
number of characters in the text, fetch that if the position is
at the end.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7459
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3643>
2024-03-05 17:53:30 +00:00
Dor Askayo
d5f68c8140 clutter/frame-clock: Add a mode for variable scheduling
A new variable scheduling mode is introduced which allows lower
priority updates to be scheduled on a timeout which represents a lower
refresh rate, while allowing high priority updates to be scheduled to
occur as soon as possible.

This mode will be used by following commits to implement
synchronization of page flips to the update rate of specifc surface
actors.

High priorty updates are either scheduled to occur "now" if they
arrive at a rate which is lower than the maximum refresh rate, or
according to the measured maximum render time if they arrive at a
rate which meets or exceeds the maximum refresh rate. This approach
allows achieving low input latency in both scenarios.

Seperate handling for low priority updates is needed to avoid visible
stutter in the content of the surface that drives the refresh rate. An
example for a low priority update is cursor movement when the KMS
deadline timer is disabled.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1154>
2024-03-02 12:08:21 +00:00
Carlos Garnacho
6cee9410f5 clutter: Bypass priv->has_key_focus when unsetting focus from self
This is conditionally toggled by grabs on the current key focus depending
on whether the current key focus actor would receive events according
to the grab or not. Which means it's no longer a reliable method for an
actor to know it does have focus, without asking the stage about it.

Avoid this check and ask the stage for the key focus, in order to make
key focus actors able to unset themselves despite the presence of grabs.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3629>
2024-03-02 09:27:39 +00:00
Julian Sparber
a26fca0117 clutter/text: Use the PangoLayout y offset for min height calculation
The min height reported by ClutterText when ellipsize and line-wrapping are
enabled was too small to fit the text.

The coordinates from `pango_layout_get_line_extents()` are baseline relative,
so the `y` coordinate means that the highest ascent would be `-y` above the
baseline and height gives the span between the ascent above the baseline and
the descent below it, so `logical_line_rect.y + logical_line_rect.height`
gives us the size of the descent. This is the wrong height to use for the
height of the actor.
The coordinates of the layout extents don't seems to be related to the baseline
and are just for offsets when rendering, that's probably how this bug got
initially introduced.
Therefore, the `y` coordinate from the layout is the correct offset to use,
even though, when looking at `pango_layout_get_extends_internal()`, it appears
that `y` is always set to 0.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3610>
2024-02-28 14:35:51 +01:00
Florian Müllner
100dc6d2b1 cally/text: Fix emission of text_caret_moved signal
CallyText was still listening to changes to the deprecated
`ClutterText:position` property to emit the signal, but the
property was removed in commit 3184986897.

Switch to the proper `cursor-position` property to fix the
issue.

Close: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7442
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3621>
2024-02-27 16:07:43 +01:00
Marco Trevisan (Treviño)
52901320f0 clutter: Add missing dependency on Gio-2.0 gir
Without this we'd get:
  ../../mutter/clutter/clutter/clutter-actor.c:18241: Warning:
    Clutter: clutter_actor_bind_model_with_properties: argument model:
      Unresolved type: 'GListModel*'

And missing bindings

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3620>
2024-02-27 10:30:19 +01:00
Bilal Elmoussaoui
60e10511ae cogl: Remove Color.init_from_4ub
Slowly switching to using floats only in CoglColor
Helps https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3544

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3594>
2024-02-22 12:34:58 +00:00
Bilal Elmoussaoui
cf0803ab71 cogl: Remove Color.get_*_byte
Helps with https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3544

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3594>
2024-02-22 12:34:58 +00:00
Corentin Noël
e7de5c36f3 build: Remove the config.h inclusion from all public headers
Do not include it at header side as it is not part of the installed headers.

Only keep it in cogl-gl-headers.h as it is a private header.

Add it to all the source files that depend on it.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3593>
2024-02-17 11:58:55 +00:00
Bilal Elmoussaoui
2c613df4eb cogl: Drop Pipeline.set_color_*
Those setters variants makes it very hard to do across project changes
to the
color type. As part of
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3544
I would like to switch from using integers to floats inside CoglColor
which this PR would simplify

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3553>
2024-02-16 12:13:23 +01:00
Bilal Elmoussaoui
b00fcbf948 clutter: Remove unused Color APIs
Nothing uses them in GNOME Shell, so let us simplify the API
a little bit

Helps https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3544

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3588>
2024-02-16 10:24:24 +00:00
Bilal Elmoussaoui
72c2d8913e clutter: Drop static colors
There is literally zero reasons nowadays to still provide the tango color
palette as part of the Clutter API. End users of Mutter can define the
colors on their side if they want to.

The change simplifies https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3544

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3588>
2024-02-16 10:24:24 +00:00
Carlos Garnacho
9c5bd9f847 clutter: Add "revoked" property to ClutterGrab
Users of Clutter grabs may listen for notify::revoked changes in
order to know that their grab is no longer in charge of event
propagation, without the use of crossing events.

Since a ClutterGrab may stay in the stack and regain effects,
this notification also happens the other way around.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3420>
2024-02-13 12:36:26 +01:00
Carlos Garnacho
b154fddd0f clutter: Make ClutterGrab a GObject
We'll want to add notifications on it, make it a GObject
to allow that.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3420>
2024-02-13 12:36:26 +01:00
Carlos Garnacho
09101e36f8 wayland: Handle pointer focus inhibition at the Clutter level
The MetaWaylandPointer used to put this together through
MetaCursorTracker cursor visibility, and ClutterSeat-level
inhibition API, applying the pointer focus changes due to
visibility logically to Wayland clients.

In order to make this work over all Clutter widgetry
instead of just Wayland clients, make the ClutterSeat-level
inhibition API control this feature at the ClutterStage picking
level, and leave/enter the seat pointer as appropriate.

By default, the seat pointer has (un)focus inhibited. The
MetaCursorTracker has been made another player in unfocus
inhibition, simply asking for the pointer to get its focus
while the cursor is visible.

This in practice means that picking code may return a NULL
actor, some asserts and preconditions had to be changed to
handle this, plus some test code slightly.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3420>
2024-02-13 01:01:48 +01:00
Dor Askayo
82cdf90a71 clutter/frame-clock: Add a state for when scheduled "now"
The new CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_NOW state is almost
identical to CLUTTER_FRAME_CLOCK_STATE_SCHEDULED, with one important
difference being that it avoids updates from being repeatedly
rescheduled "now" when multiple calls to
clutter_frame_clock_schedule_update_now() are done before the source
is actually dispatched.

Such repeated calls to schedule an update "now" may actually postpone
the dispatch if the CPU is very busy and the source dispatch is
delayed, defeating the purpose of scheduling a frame "now".

It also allows rescheduling "now" when the frame clock is uninhibited
after being inhibited while an update was scheduled "now". This may
be important in cases where the frame clock is inhibited for very
short periods in which it would otherwise lose the state of being
scheduled "now".

Scenarios such as this would become more common with the introduction
of variable refresh rate since it makes scheduling "now" a commonplace
occurrence.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3561>
2024-02-10 16:16:19 +00:00
Bilal Elmoussaoui
cc1957a4ba clutter/flow-layout: Use Orientation enum
Instead of having a custom FlowOrientation one

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3573>
2024-02-09 18:03:09 +01:00
Bilal Elmoussaoui
40ba60b52b clutter/main: Move struct where it is used
The struct & functions are no longer used elsewhere, so move them from
the header file

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3573>
2024-02-09 18:03:05 +01:00
Bilal Elmoussaoui
4fab773e12 clutter: Don't display actor names on paint volumes
Currently, the paint-volumes/redraws debug flags displays the actor
debug
names on top of the paint volume making it very unusable. Especially
that you can easily get the relevant actor from looking glass.

The motivation is to reduce the usage of pango (through the text node)
in order to possibly move all the fonts bits to gnome shell

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3571>
2024-02-09 10:37:52 +00:00
Dor Askayo
aedb0f200d clutter/frame-clock: Set the last "next presentation time" on feedback
This removes an incorrect implicit assumption in
calculate_next_update_time_us() that a frame may only be scheduled
once in the duration of a refresh cycle. It accomplishes this by
setting last_next_presentation_time_us on presentation feedback
instead of calculating it every time an update is scheduled.

Specifically, it corrects the intended scheduling logic in scenarios
like the following, when all of the below occur in the context of a
single refresh cycle:
  1. Frame update (1) is scheduled normally, and
     "is_next_presentation_time_valid" is set to TRUE
  2. Frame update (1) is dispatched but ends up being "empty" (no
     presentation necessary)
  3. Frame update (2) is scheduled "now" and
     "is_next_presentation_time_valid" is set to FALSE
  4. Frame update (2) is dispatched but ends up being "empty" (no
     presentation necessary)
  5. Frame update (3) is scheduled normally, and since
     "is_next_presentation_time_valid" is set to FALSE, the
     "early presented event" logic is unintentionally skipped in
     calculate_next_update_time_us().
  6. Frame update (3) is dispatched and ends up being a "non-empty"
     update, but its update time was calculated incorrectly because
     some logic was skipped.

Scenarios such as this would become more common with the introduction
of variable refresh rate since it makes scheduling "now" a commonplace
occurrence.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3560>
2024-02-08 22:57:55 +00:00
Bilal Elmoussaoui
467120d5aa cleanup: Remove unused callbacks
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3570>
2024-02-08 13:32:51 +00:00
Bilal Elmoussaoui
73651b553e clutter: Explicitly depend on cairo
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3530>
2024-01-27 10:03:15 +00:00
Bilal Elmoussaoui
bbd06f26e0 clutter: Drop cairo-gobject dependency
It is no longer used since the switch to MtkRegion
and the removal of ClutterCanvas

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3530>
2024-01-27 10:03:15 +00:00
Jonas Dreßler
265f6ef64e clutter/actor: Use g_signal_connect for connecting to pango context
In commit ba8f5a1178 it might have been overseen
to switch to g_signal_connect from g_signal_connect_object, so do that now to
make things a bit more clear.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3543>
2024-01-27 09:42:05 +00:00
Dor Askayo
c9cd9cef6a clutter/frame: Export clutter_frame_get_result()
This makes the function available to Wayland.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3549>
2024-01-26 19:03:02 +00:00
Dor Askayo
3e4a330ae7 clutter/frame-clock,wayland: Calculate frame deadline during scheduling
Calculate the frame deadline in ClutterFrameClock's
calculate_next_update_time_us() rather than in MetaWaylandCompositor's
on_after_update().

The specifics of the deadline calculation for a given frame should be
implementation detail of the frame clock and and remain internal to
allow extensibility.

This extensibility is specifically useful for scenarios where a
different deadline calculation is needed due to alternative frame
scheduling logic, such as for VRR.

No change in behavior.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3521>
2024-01-22 15:39:48 +00:00
Bilal Elmoussaoui
a2397e6b80 clutter: Prefer using ClutterTextDirection
In various public APIs, Clutter used to return a PangoDirection
while we have a text direction enum defined in Clutter.

This allows us to drop pango dependency from meta making it specific
to cogl-pango & clutter

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3531>
2024-01-22 15:02:33 +00:00
Shmuel Melamud
237e505cc7 clutter: Move ClutterCanvas to gnome-shell
Since StDrawingArea in gnome-shell is the only user of ClutterCanvas,
it is possible to move ClutterCanvas completely out of Mutter to
gnome-shell. This allows to remove another Cairo dependency from
Mutter.

This patch removes ClutterCanvas code from Mutter.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3470>
2024-01-17 11:58:47 +01:00
Sebastian Wick
41a7e8e3e0 build: Make g-ir-scanner warnings fatal when -werror is set
This should help catching problems with introspection in CI.

This also pulls out some common arguments to the gnome.generate_gir
call.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3528>
2024-01-17 09:26:00 +00:00
Daniel van Vugt
e8116ba4f0 clutter/actor: Double asterisk is required for GObject Introspection
Like GtkDoc and Doxygen before it.

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

Fixes: f4c6fa949d
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3527>
2024-01-17 15:04:48 +08:00
Daniel van Vugt
7551ffa81e clutter/actor: Remove whitespace at end of line
It's upsetting check-code-style

Fixes: 00b4d4c4bc
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3527>
2024-01-17 15:04:48 +08:00
Shmuel Melamud
f4c6fa949d clutter: Make clutter_actor_create_texture_paint_node public
Since StDrawingArea in gnome-shell is the only user of ClutterCanvas,
it is possible to move ClutterCanvas completely out of Mutter to
gnome-shell. This allows to remove another Cairo dependency from
Mutter.

This patch makes clutter_actor_create_texture_paint_node() function
public to be used by StDrawingArea in gnome-shell that replaces
ClutterCanvas.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3507>
2024-01-15 17:02:55 +00:00
Carlos Garnacho
bd387a6308 clutter: Drop clutter_event_new() from public headers
This is a leftover of the port to immutable events, and should
not be used.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3511>
2024-01-12 14:39:17 +00:00
Bilal Elmoussaoui
692e1f2759 docs/clutter: Drop no longer applicable examples links
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3515>
2024-01-12 11:40:20 +00:00
Carlos Garnacho
9108f2eeec clutter: Update picked actor on scroll events
On one hand this avoids crashes early after startup if the very first
pointer event is a scroll event, since the stage did not pick an actor
for the pointer device yet.

On the other hand, scroll events have some likelihood to change the
actor under the pointer even though it doesn't move. We still want to
cross towards the new actor under the pointer ASAP, without waiting
for later events.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3112
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3517>
2024-01-11 14:23:25 +00:00
Bilal Elmoussaoui
8ae87ce041 clutter: Mark FixedLayout as derivable
As GNOME Shell derives this type

Fixes: 5b527ac89 ("fixed-layout: Use macros for subclassing
boilerplate")

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3509>
2024-01-10 12:55:02 +01:00
Bilal Elmoussaoui
38fd27b528 clutter: Mark BoxLayout as derivable
As it is subclassed in GNOME Shell

Fixes: 23d921080 ("box-layout: Use macros for subclassing boilerplate")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3509>
2024-01-10 11:52:51 +01:00
Bilal Elmoussaoui
8e04168fb2 Revert "clutter: Mark BinLayout as final"
This reverts commit 2dca60bd1c.

As GNOME Shell subclass that layout manager 3 times in the JS code part

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3509>
2024-01-10 11:31:13 +01:00
Bilal Elmoussaoui
2dca60bd1c clutter: Mark BinLayout as final
It doesn't make sense to subclass a layout manager

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:38 +01:00
Bilal Elmoussaoui
56023e3110 cally/text: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:38 +01:00
Bilal Elmoussaoui
cdcf32620a cally/stage: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:38 +01:00
Bilal Elmoussaoui
22d77c9ba4 cally/root: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:37 +01:00
Bilal Elmoussaoui
befb21cbb2 cally/clone: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:37 +01:00
Bilal Elmoussaoui
4483d3ee96 cally/actor: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:36 +01:00
Bilal Elmoussaoui
105c8583ee cally/util: Use macros for subclassing boilerplate
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3387>
2024-01-10 09:37:19 +01:00