Skip to content
Commits on Source (10)
mutter (3.38.3-3ubuntu1) hirsute; urgency=medium
* debian/patches: Backport wayland input thread support (LP: #1690719)
* debian/libmutter-7-0.symbols: Sync as per private symbols changes
* debian/control: Set breaks on previous gnome-shell versions
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Thu, 25 Feb 2021 23:17:10 +0100
mutter (3.38.3-3) unstable; urgency=medium
* Team upload
* d/patches: Update to commit 3.38.3-20-g2818cfda8 from gnome-3-38 branch
- Wayland geometry scale fixes
- Fix a crash that can occur on resume from suspend
- Fix drag-and-drop from X11 source to Wayland destination
-- Simon McVittie <smcv@debian.org> Tue, 23 Feb 2021 09:27:54 +0000
mutter (3.38.3-2ubuntu1) hirsute; urgency=medium
* Merge with debian, containing new upstream release (LP: #1915025)
......
......@@ -144,7 +144,7 @@ Depends: adwaita-icon-theme,
Breaks: apparmor (<< 2.13.3-5~),
gnome-control-center (<< 1:3.25.2),
gnome-settings-daemon (<< 3.31.91),
gnome-shell (<< 3.36)
gnome-shell (<< 3.38.3-3ubuntu1)
Description: window manager library from the Mutter window manager
Mutter is a Wayland display server and X11 window manager and
compositor library. It contains functionality related to, among other
......
......@@ -140,7 +140,7 @@ Depends: adwaita-icon-theme,
Breaks: apparmor (<< 2.13.3-5~),
gnome-control-center (<< 1:3.25.2),
gnome-settings-daemon (<< 3.31.91),
gnome-shell (<< 3.36)
gnome-shell (<< 3.38.3-3ubuntu1)
Description: window manager library from the Mutter window manager
Mutter is a Wayland display server and X11 window manager and
compositor library. It contains functionality related to, among other
......
......@@ -21,7 +21,6 @@ libmutter-7.so.0 libmutter-7-0 #MINVER#
meta_backend_is_rendering_hardware_accelerated@Base 3.35.92
meta_backend_lock_layout_group@Base 3.28.2
meta_backend_set_keymap@Base 3.28.2
meta_backend_set_numlock@Base 3.28.2
meta_backend_x11_nested_get_type@Base 3.28.2
meta_background_actor_get_type@Base 3.28.2
meta_background_actor_new@Base 3.28.2
......@@ -747,23 +746,6 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
_clutter_event_set_platform_data@Base 3.33.92
_clutter_event_set_pointer_emulated@Base 3.33.92
_clutter_event_set_state_full@Base 3.33.92
_clutter_input_device_add_axis@Base 3.33.92
_clutter_input_device_add_event_sequence@Base 3.33.92
_clutter_input_device_add_physical_device@Base 3.37.92
_clutter_input_device_add_scroll_info@Base 3.33.92
_clutter_input_device_get_scroll_delta@Base 3.33.92
_clutter_input_device_get_stage@Base 3.33.92
_clutter_input_device_remove_event_sequence@Base 3.33.92
_clutter_input_device_remove_physical_device@Base 3.37.92
_clutter_input_device_reset_axes@Base 3.33.92
_clutter_input_device_reset_scroll_info@Base 3.33.92
_clutter_input_device_set_associated_device@Base 3.33.92
_clutter_input_device_set_coords@Base 3.33.92
_clutter_input_device_set_n_keys@Base 3.33.92
_clutter_input_device_set_stage@Base 3.33.92
_clutter_input_device_set_state@Base 3.33.92
_clutter_input_device_set_time@Base 3.33.92
_clutter_input_device_translate_axis@Base 3.33.92
_clutter_input_pointer_a11y_add_device@Base 3.33.92
_clutter_input_pointer_a11y_on_button_event@Base 3.33.92
_clutter_input_pointer_a11y_on_motion_event@Base 3.33.92
......@@ -773,12 +755,9 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
_clutter_process_event@Base 3.33.92
_clutter_set_sync_to_vblank@Base 3.33.92
_clutter_stage_cogl_get_type@Base 3.29.4
_clutter_stage_get_state@Base 3.33.92
_clutter_stage_get_window@Base 3.33.92
_clutter_stage_is_activated@Base 3.33.92
_clutter_stage_queue_event@Base 3.33.92
_clutter_stage_set_window@Base 3.33.92
_clutter_stage_update_state@Base 3.33.92
_clutter_stage_window_get_geometry@Base 3.33.92
cally_accessibility_init@Base 3.29.4
cally_actor_add_action@Base 3.29.4
......@@ -1237,10 +1216,10 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_event_get_click_count@Base 3.29.4
clutter_event_get_coords@Base 3.29.4
clutter_event_get_device@Base 3.29.4
clutter_event_get_device_id@Base 3.29.4
clutter_event_get_device_tool@Base 3.29.4
clutter_event_get_device_type@Base 3.29.4
clutter_event_get_distance@Base 3.29.4
clutter_event_get_event_code@Base 3.38.3-3ubuntu1
clutter_event_get_event_sequence@Base 3.29.4
clutter_event_get_flags@Base 3.29.4
clutter_event_get_gesture_motion_delta@Base 3.29.4
......@@ -1254,6 +1233,7 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_event_get_pad_event_details@Base 3.29.4
clutter_event_get_position@Base 3.29.4
clutter_event_get_related@Base 3.29.4
clutter_event_get_relative_motion@Base 3.38.3-3ubuntu1
clutter_event_get_scroll_delta@Base 3.29.4
clutter_event_get_scroll_direction@Base 3.29.4
clutter_event_get_scroll_finish_flags@Base 3.31.90
......@@ -1264,15 +1244,16 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_event_get_state@Base 3.29.4
clutter_event_get_state_full@Base 3.29.4
clutter_event_get_time@Base 3.29.4
clutter_event_get_time_us@Base 3.38.3-3ubuntu1
clutter_event_get_touchpad_gesture_finger_count@Base 3.29.4
clutter_event_get_type@Base 3.29.4
clutter_event_has_control_modifier@Base 3.29.4
clutter_event_has_shift_modifier@Base 3.29.4
clutter_event_is_pointer_emulated@Base 3.29.4
clutter_event_new@Base 3.29.4
clutter_event_peek@Base 3.29.4
clutter_event_put@Base 3.29.4
clutter_event_remove_filter@Base 3.29.4
clutter_event_sequence_get_slot@Base 3.38.3-3ubuntu1
clutter_event_sequence_get_type@Base 3.29.4
clutter_event_set_button@Base 3.29.4
clutter_event_set_coords@Base 3.29.4
......@@ -1387,35 +1368,23 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_init_error_get_type@Base 3.29.4
clutter_init_error_quark@Base 3.29.4
clutter_init_with_args@Base 3.29.4
clutter_input_axis_flags_get_type@Base 3.38.3-3ubuntu1
clutter_input_axis_get_type@Base 3.29.4
clutter_input_content_hint_flags_get_type@Base 3.29.4
clutter_input_content_purpose_get_type@Base 3.29.4
clutter_input_device_add_tool@Base 3.33.92
clutter_input_device_get_actor@Base 3.37.91
clutter_input_device_get_associated_device@Base 3.29.4
clutter_input_device_get_axis@Base 3.29.4
clutter_input_device_get_axis_value@Base 3.29.4
clutter_input_device_get_coords@Base 3.29.4
clutter_input_device_get_device_id@Base 3.29.4
clutter_input_device_get_device_mode@Base 3.29.4
clutter_input_device_get_device_name@Base 3.29.4
clutter_input_device_get_device_node@Base 3.29.4
clutter_input_device_get_device_type@Base 3.29.4
clutter_input_device_get_enabled@Base 3.29.4
clutter_input_device_get_grabbed_actor@Base 3.29.4
clutter_input_device_get_group_n_modes@Base 3.29.4
clutter_input_device_get_has_cursor@Base 3.29.4
clutter_input_device_get_key@Base 3.29.4
clutter_input_device_get_mapping_mode@Base 3.29.4
clutter_input_device_get_mode_switch_button_group@Base 3.29.4
clutter_input_device_get_modifier_state@Base 3.29.4
clutter_input_device_get_n_axes@Base 3.29.4
clutter_input_device_get_n_keys@Base 3.29.4
clutter_input_device_get_n_buttons@Base 3.38.3-3ubuntu1
clutter_input_device_get_n_mode_groups@Base 3.29.4
clutter_input_device_get_n_rings@Base 3.29.4
clutter_input_device_get_n_strips@Base 3.29.4
clutter_input_device_get_physical_devices@Base 3.37.92
clutter_input_device_get_pointer_stage@Base 3.29.4
clutter_input_device_get_pad_feature_group@Base 3.38.3-3ubuntu1
clutter_input_device_get_product_id@Base 3.29.4
clutter_input_device_get_seat@Base 3.35.90
clutter_input_device_get_type@Base 3.29.4
......@@ -1423,16 +1392,12 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_input_device_grab@Base 3.29.4
clutter_input_device_is_grouped@Base 3.29.4
clutter_input_device_is_mode_switch_button@Base 3.29.4
clutter_input_device_keycode_to_evdev@Base 3.29.4
clutter_input_device_lookup_tool@Base 3.33.92
clutter_input_device_mapping_get_type@Base 3.29.4
clutter_input_device_pad_feature_get_type@Base 3.38.3-3ubuntu1
clutter_input_device_pad_source_get_type@Base 3.29.4
clutter_input_device_sequence_get_grabbed_actor@Base 3.29.4
clutter_input_device_sequence_grab@Base 3.29.4
clutter_input_device_sequence_ungrab@Base 3.29.4
clutter_input_device_set_enabled@Base 3.29.4
clutter_input_device_set_key@Base 3.29.4
clutter_input_device_set_mapping_mode@Base 3.29.4
clutter_input_device_tool_get_axes@Base 3.38.3-3ubuntu1
clutter_input_device_tool_get_id@Base 3.29.4
clutter_input_device_tool_get_serial@Base 3.29.4
clutter_input_device_tool_get_tool_type@Base 3.29.4
......@@ -1440,9 +1405,6 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_input_device_tool_type_get_type@Base 3.29.4
clutter_input_device_type_get_type@Base 3.29.4
clutter_input_device_ungrab@Base 3.29.4
clutter_input_device_update@Base 3.35.90
clutter_input_device_update_from_event@Base 3.29.4
clutter_input_device_update_from_tool@Base 3.33.92
clutter_input_focus_filter_event@Base 3.37.92
clutter_input_focus_get_type@Base 3.29.4
clutter_input_focus_is_focused@Base 3.29.4
......@@ -1487,7 +1449,6 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_interval_set_interval@Base 3.29.4
clutter_interval_validate@Base 3.29.4
clutter_key_state_get_type@Base 3.29.4
clutter_keyboard_a11y_flags_get_type@Base 3.29.4
clutter_keyframe_transition_clear@Base 3.29.4
clutter_keyframe_transition_get_key_frame@Base 3.29.4
clutter_keyframe_transition_get_n_key_frames@Base 3.29.4
......@@ -1714,7 +1675,6 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_seat_bell_notify@Base 3.35.90
clutter_seat_create_virtual_device@Base 3.35.90
clutter_seat_ensure_a11y_state@Base 3.35.90
clutter_seat_get_kbd_a11y_settings@Base 3.35.90
clutter_seat_get_keyboard@Base 3.35.90
clutter_seat_get_keymap@Base 3.35.90
clutter_seat_get_pointer@Base 3.35.90
......@@ -1722,10 +1682,11 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_seat_get_supported_virtual_device_types@Base 3.35.90
clutter_seat_get_touch_mode@Base 3.35.91
clutter_seat_get_type@Base 3.35.90
clutter_seat_handle_event_post@Base 3.38.3-3ubuntu1
clutter_seat_inhibit_unfocus@Base 3.35.92
clutter_seat_is_unfocus_inhibited@Base 3.35.92
clutter_seat_list_devices@Base 3.35.90
clutter_seat_set_kbd_a11y_settings@Base 3.35.90
clutter_seat_query_state@Base 3.38.3-3ubuntu1
clutter_seat_set_pointer_a11y_dwell_click_type@Base 3.35.90
clutter_seat_set_pointer_a11y_settings@Base 3.35.90
clutter_seat_uninhibit_unfocus@Base 3.35.92
......@@ -1756,9 +1717,10 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_stage_capture_into@Base 3.29.4
clutter_stage_clear_stage_views@Base 3.37.91
clutter_stage_ensure_viewport@Base 3.29.4
clutter_stage_event@Base 3.29.4
clutter_stage_get_actor_at_pos@Base 3.29.4
clutter_stage_get_capture_final_size@Base 3.31.92
clutter_stage_get_device_actor@Base 3.38.3-3ubuntu1
clutter_stage_get_device_coords@Base 3.38.3-3ubuntu1
clutter_stage_get_frame_counter@Base 3.29.4
clutter_stage_get_key_focus@Base 3.29.4
clutter_stage_get_minimum_size@Base 3.29.4
......@@ -1778,6 +1740,7 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_stage_paint_to_framebuffer@Base 3.36.2
clutter_stage_peek_stage_views@Base 3.37.91
clutter_stage_read_pixels@Base 3.29.4
clutter_stage_repick_device@Base 3.38.3-3ubuntu1
clutter_stage_schedule_update@Base 3.37.91
clutter_stage_set_key_focus@Base 3.29.4
clutter_stage_set_minimum_size@Base 3.29.4
......@@ -1785,7 +1748,7 @@ libmutter-clutter-7.so.0 libmutter-7-0 #MINVER#
clutter_stage_set_sync_delay@Base 3.29.4
clutter_stage_set_throttle_motion_events@Base 3.29.4
clutter_stage_set_title@Base 3.29.4
clutter_stage_state_get_type@Base 3.29.4
clutter_stage_update_device@Base 3.38.3-3ubuntu1
clutter_stage_view_assign_next_scanout@Base 3.37.91
clutter_stage_view_cogl_get_type@Base 3.29.4
clutter_stage_view_destroy@Base 3.37.91
......
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 10 Feb 2021 09:39:18 +0100
Subject: clutter/stage-view: Disable double buffered shadow buffering
To make the double buffered shadow buffer damaged tiles detection
feasable, a new EGL extension is needed for creating FBO's backed by
a custom CPU memory buffer, instead of DMA buffers, as DMA buffers can
be very slow to read, much slower than just painting the shadow buffer
directly.
Leave the code there, since such an EGL extension is intended to be
added, but hide it behind an env var so that it isn't enabled by
accident.
(cherry picked from commit ad5b5f2c57dd0dcb9e586ea09486eebff89fb94d)
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1724
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1743>
Origin: https://gitlab.gnome.org/GNOME/mutter/-/commit/95b683ae
---
clutter/clutter/clutter-stage-view.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c
index 00a4d5a..ccc07cd 100644
--- a/clutter/clutter/clutter-stage-view.c
+++ b/clutter/clutter/clutter-stage-view.c
@@ -415,15 +415,19 @@ init_shadowfb (ClutterStageView *view)
height = cogl_framebuffer_get_height (priv->framebuffer);
cogl_context = cogl_framebuffer_get_context (priv->framebuffer);
- if (init_dma_buf_shadowfbs (view, cogl_context, width, height, &error))
+ if (g_strcmp0 (g_getenv ("MUTTER_DEBUG_ENABLE_DOUBLE_SHADOWFB"), "1") == 0)
{
- g_message ("Initialized double buffered shadow fb for %s", priv->name);
- return;
- }
+ if (init_dma_buf_shadowfbs (view, cogl_context, width, height, &error))
+ {
+ g_message ("Initialized double buffered shadow fb for %s",
+ priv->name);
+ return;
+ }
- g_warning ("Failed to initialize double buffered shadow fb for %s: %s",
- priv->name, error->message);
- g_clear_error (&error);
+ g_warning ("Failed to initialize double buffered shadow fb for %s: %s",
+ priv->name, error->message);
+ g_clear_error (&error);
+ }
if (!init_fallback_shadowfb (view, cogl_context, width, height, &error))
{
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 8 Feb 2021 17:34:00 +0000
Subject: clutter/timeline: Clear stage view listener when actor destroyed
We might have a stage view listener attached to the stage itself if the
actor didn't have a suitable frame clock when the actor was associated
with the timeline. We'd then listen to stage-views-changed signals on
the stage itself to be able to attach to a frame clock when one
appeared.
What went wrong is that if an actor that didn't have a frameclock was
associated with a timeline, but then destroyed, the timeline would
disassociate itself from the actor, but it'd still listen on the
stage-views-changed signal on the stage. This would be in itself
harmless, until the timeline itself is destroyed, as at this point, it
wouldn't clean up the stage-views-changed listener on the stage, as it's
assumed to only be valid when there is an actor attached.
Fix this issue by cleaning up the stage's stage-views-changed listener
when the actor is destroyed, as we wouldn't be able to make use of it by
then anyway.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1719>
(cherry picked from commit 4145fbbae4deb2de830c00a386324929b2ae0d5e)
Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3323
Origin: upstream, 3.38.4, commit:78c61f557f7c3ff6b604bcb6142d9fed143b50cf
---
clutter/clutter/clutter-timeline.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/clutter/clutter/clutter-timeline.c b/clutter/clutter/clutter-timeline.c
index 23392fc..f7b9b98 100644
--- a/clutter/clutter/clutter-timeline.c
+++ b/clutter/clutter/clutter-timeline.c
@@ -311,6 +311,7 @@ on_actor_destroyed (ClutterActor *actor,
{
ClutterTimelinePrivate *priv = timeline->priv;
+ g_clear_signal_handler (&priv->stage_stage_views_handler_id, priv->stage);
priv->actor = NULL;
}
From: Robert Mader <robert.mader@posteo.de>
Date: Sun, 31 Jan 2021 17:33:21 +0100
Subject: compositor/dnd-actor: Take geometry scale into account on DnD-cancel
Technically this is still wrong if the source actor or dnd actor are
transformed in other ways. However geometry scale is the by far most
common case and we currently lack convenience API in Clutter to
easily compute the right values.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1683>
(cherry picked from commit 7da34f154b315131d06e6ccb6728600238e1e236)
Origin: upstream, 3.38.4, commit:22ab643c568932b8877a12053fe56ba71658785d
---
src/compositor/meta-dnd-actor.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/compositor/meta-dnd-actor.c b/src/compositor/meta-dnd-actor.c
index 31a01db..80bffde 100644
--- a/src/compositor/meta-dnd-actor.c
+++ b/src/compositor/meta-dnd-actor.c
@@ -28,6 +28,7 @@
#include "config.h"
#include "compositor/meta-dnd-actor-private.h"
+#include "compositor/meta-window-actor-private.h"
#include "clutter/clutter.h"
@@ -206,16 +207,29 @@ meta_dnd_actor_drag_finish (MetaDnDActor *self,
if (CLUTTER_ACTOR_IS_VISIBLE (self->drag_origin))
{
+ MetaWindowActor *origin_actor;
float anchor_x, anchor_y;
graphene_point_t dest;
+ int origin_geometry_scale;
+ int feedback_geometry_scale;
clutter_actor_get_transformed_position (self->drag_origin,
&dest.x, &dest.y);
+
+ origin_actor = meta_window_actor_from_actor (self->drag_origin);
+ g_return_if_fail (origin_actor);
+ origin_geometry_scale =
+ meta_window_actor_get_geometry_scale (origin_actor);
+
meta_feedback_actor_get_anchor (META_FEEDBACK_ACTOR (self),
&anchor_x, &anchor_y);
+ feedback_geometry_scale =
+ meta_feedback_actor_get_geometry_scale (META_FEEDBACK_ACTOR (self));
- dest.x += self->drag_start_x - anchor_x;
- dest.y += self->drag_start_y - anchor_y;
+ dest.x += ((self->drag_start_x * origin_geometry_scale) -
+ (anchor_x * feedback_geometry_scale));
+ dest.y += ((self->drag_start_y * origin_geometry_scale) -
+ (anchor_y * feedback_geometry_scale));
clutter_actor_set_position (actor, dest.x, dest.y);
}
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 8 Feb 2021 09:54:43 +0100
Subject: core: Account for the globally active input case
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
Commit afa43154 tried to make sure the focus was properly changed when
calling focus_default_window() by checking the focused window just after
trying to set the focus.
However, the X11 “Inter-Client Communication Conventions Manual” version
2.0 (ICCCM 2 for short) states that some X11 client may want to use a so
called “globally active input” model in which case the client expects
keyboard input and set input focus even when it's not one of its own
window.
To comply with this, when dealing with such clients, mutter will not
change the focus and send a WM_TAKE_FOCUS message instead.
That mechanism will defeat the logic introduced by commit afa43154
because the focused window is not changed in this case. As a result, the
input focus will fallback to the no-focus window.
To avoid this, only check that the focus change occurred for windows
using a synchronous focus model.
v2: Split specific test for "globally active input" model (Florian).
v3: Remove the check for window->unmanaging which is useless (Jonas).
Fixes: afa43154 - "core: Make sure focus_default_window() worked"
Close: https://gitlab.gnome.org/GNOME/mutter/-/issues/1620
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1716>
(cherry picked from commit 2432508db78a235abc5cee198fb94043625db65f)
Origin: https://gitlab.gnome.org/GNOME/mutter/-/commit/2d34ee08
---
src/core/workspace.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/core/workspace.c b/src/core/workspace.c
index a80560b..a6edb5f 100644
--- a/src/core/workspace.c
+++ b/src/core/workspace.c
@@ -1367,6 +1367,14 @@ try_to_set_focus_and_check (MetaWindow *window,
{
meta_window_focus (window, timestamp);
+ /* meta_focus_window() will not change focus for clients using the
+ * "globally active input" model of input handling, hence defeating
+ * the assumption that focus should be changed for such windows.
+ * See https://tronche.com/gui/x/icccm/sec-4.html#s-4.1.7
+ */
+ if (meta_window_is_focus_async (window))
+ return TRUE;
+
/* meta_window_focus() does not guarantee that focus will end up
* where we expect, it can fail for various reasons, better check
* it did not actually changed or even left focus to the window we
From: Robert Mader <robert.mader@posteo.de>
Date: Fri, 22 Jan 2021 14:14:50 +0100
Subject: feedback-actor: Add API to set and get geometry scale
Analogous to MetaWindowActor. Also take it into account for positioning
when an anchor is set.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1683>
(cherry picked from commit dfa659b5b55538652cb13abea1ce10978c98904e)
Origin: upstream, 3.38.4, commit:989ef121f6a24b9b5b532610dac3b96fab34bbd3
---
src/compositor/meta-feedback-actor-private.h | 5 ++++
src/compositor/meta-feedback-actor.c | 36 ++++++++++++++++++++++++++--
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/src/compositor/meta-feedback-actor-private.h b/src/compositor/meta-feedback-actor-private.h
index 530bb2d..86cacb3 100644
--- a/src/compositor/meta-feedback-actor-private.h
+++ b/src/compositor/meta-feedback-actor-private.h
@@ -62,4 +62,9 @@ void meta_feedback_actor_set_position (MetaFeedbackActor *self,
void meta_feedback_actor_update (MetaFeedbackActor *self,
const ClutterEvent *event);
+void meta_feedback_actor_set_geometry_scale (MetaFeedbackActor *self,
+ int geometry_scale);
+
+int meta_feedback_actor_get_geometry_scale (MetaFeedbackActor *self);
+
#endif /* META_FEEDBACK_ACTOR_PRIVATE_H */
diff --git a/src/compositor/meta-feedback-actor.c b/src/compositor/meta-feedback-actor.c
index c8eb0fc..d3277ec 100644
--- a/src/compositor/meta-feedback-actor.c
+++ b/src/compositor/meta-feedback-actor.c
@@ -44,6 +44,8 @@ struct _MetaFeedbackActorPrivate
float anchor_y;
float pos_x;
float pos_y;
+
+ int geometry_scale;
};
G_DEFINE_TYPE_WITH_PRIVATE (MetaFeedbackActor, meta_feedback_actor, CLUTTER_TYPE_ACTOR)
@@ -65,8 +67,10 @@ meta_feedback_actor_update_position (MetaFeedbackActor *self)
MetaFeedbackActorPrivate *priv = meta_feedback_actor_get_instance_private (self);
clutter_actor_set_position (CLUTTER_ACTOR (self),
- priv->pos_x - priv->anchor_x,
- priv->pos_y - priv->anchor_y);
+ priv->pos_x -
+ (priv->anchor_x * priv->geometry_scale),
+ priv->pos_y -
+ (priv->anchor_y * priv->geometry_scale));
}
static void
@@ -249,3 +253,31 @@ meta_feedback_actor_update (MetaFeedbackActor *self,
clutter_event_get_position (event, &point);
meta_feedback_actor_set_position (self, point.x, point.y);
}
+
+void
+meta_feedback_actor_set_geometry_scale (MetaFeedbackActor *self,
+ int geometry_scale)
+{
+ MetaFeedbackActorPrivate *priv =
+ meta_feedback_actor_get_instance_private (self);
+ CoglMatrix child_transform;
+
+ if (priv->geometry_scale == geometry_scale)
+ return;
+
+ priv->geometry_scale = geometry_scale;
+
+ cogl_matrix_init_identity (&child_transform);
+ cogl_matrix_scale (&child_transform, geometry_scale, geometry_scale, 1);
+ clutter_actor_set_child_transform (CLUTTER_ACTOR (self),
+ &child_transform);
+}
+
+int
+meta_feedback_actor_get_geometry_scale (MetaFeedbackActor *self)
+{
+ MetaFeedbackActorPrivate *priv =
+ meta_feedback_actor_get_instance_private (self);
+
+ return priv->geometry_scale;
+}
From: Carlos Garnacho <carlosg@gnome.org>
Date: Wed, 16 Dec 2020 19:14:54 +0100
Subject: backend/native: Check libinput_device in async call
Power saving changes in laptop panels enable/disable the attached
touchscreen input device, this is an asynchronous operation that
may be happening while the device is disappearing.
In fact, closing the lid is such perfect storm where both things
happen around the same time.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1644>
---
src/backends/native/meta-input-settings-native.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/backends/native/meta-input-settings-native.c b/src/backends/native/meta-input-settings-native.c
index 39cd5f6..d0c3188 100644
--- a/src/backends/native/meta-input-settings-native.c
+++ b/src/backends/native/meta-input-settings-native.c
@@ -108,7 +108,8 @@ set_send_events (GTask *task)
}
libinput_device = meta_input_device_native_get_libinput_device (device);
- libinput_device_config_send_events_set_mode (libinput_device, libinput_mode);
+ if (libinput_device)
+ libinput_device_config_send_events_set_mode (libinput_device, libinput_mode);
return G_SOURCE_REMOVE;
}
From: Carlos Garnacho <carlosg@gnome.org>
Date: Sat, 21 Nov 2020 18:03:27 +0100
Subject: backend/native: Let cursor renderer/tracker be updated by events
after warp
We will generate a motion event, which will end up with the same result, at
a time we can ensure it did happen.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/native/meta-seat-native.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index e9c8392..fa86b77 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -333,14 +333,8 @@ meta_seat_native_warp_pointer (ClutterSeat *seat,
int y)
{
MetaSeatNative *seat_native = META_SEAT_NATIVE (seat);
- MetaBackend *backend = meta_get_backend ();
- MetaCursorRenderer *cursor_renderer =
- meta_backend_get_cursor_renderer (backend);
- MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
meta_seat_impl_warp_pointer (seat_native->impl, x, y);
- meta_cursor_renderer_update_position (cursor_renderer);
- meta_cursor_tracker_invalidate_position (cursor_tracker);
}
static gboolean
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 5 Jun 2020 12:21:58 +0200
Subject: backend/native: Move barrier manager to MetaSeatNative
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1486
---
src/backends/native/meta-backend-native.c | 26 --------------------------
src/backends/native/meta-barrier-native.c | 9 ++++-----
src/backends/native/meta-seat-native.c | 29 ++++++++++++++++++++++++++++-
src/backends/native/meta-seat-native.h | 5 +++++
4 files changed, 37 insertions(+), 32 deletions(-)
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 732f3f6..466a27d 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -48,7 +48,6 @@
#include "backends/meta-pointer-constraint.h"
#include "backends/meta-settings-private.h"
#include "backends/meta-stage-private.h"
-#include "backends/native/meta-barrier-native.h"
#include "backends/native/meta-clutter-backend-native.h"
#include "backends/native/meta-cursor-renderer-native.h"
#include "backends/native/meta-event-native.h"
@@ -75,7 +74,6 @@ struct _MetaBackendNative
MetaLauncher *launcher;
MetaUdev *udev;
MetaKms *kms;
- MetaBarrierManagerNative *barrier_manager;
gulong udev_device_added_handler_id;
};
@@ -107,20 +105,6 @@ meta_backend_native_finalize (GObject *object)
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
}
-static void
-constrain_to_barriers (ClutterInputDevice *device,
- guint32 time,
- float *new_x,
- float *new_y)
-{
- MetaBackendNative *native = META_BACKEND_NATIVE (meta_get_backend ());
-
- meta_barrier_manager_native_process (native->barrier_manager,
- device,
- time,
- new_x, new_y);
-}
-
static void
constrain_to_client_constraint (ClutterInputDevice *device,
guint32 time,
@@ -207,9 +191,6 @@ pointer_constrain_callback (ClutterInputDevice *device,
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
- /* Constrain to barriers */
- constrain_to_barriers (device, time, new_x, new_y);
-
/* Constrain to pointer lock */
constrain_to_client_constraint (device, time, prev_x, prev_y, new_x, new_y);
@@ -720,7 +701,6 @@ meta_backend_native_initable_init (GInitable *initable,
#endif
native->udev = meta_udev_new (native);
- native->barrier_manager = meta_barrier_manager_native_new ();
native->kms = meta_kms_new (META_BACKEND (native), error);
if (!native->kms)
@@ -800,12 +780,6 @@ meta_activate_vt (int vt, GError **error)
return meta_launcher_activate_vt (launcher, vt, error);
}
-MetaBarrierManagerNative *
-meta_backend_native_get_barrier_manager (MetaBackendNative *native)
-{
- return native->barrier_manager;
-}
-
/**
* meta_activate_session:
*
diff --git a/src/backends/native/meta-barrier-native.c b/src/backends/native/meta-barrier-native.c
index 260febe..bdb006f 100644
--- a/src/backends/native/meta-barrier-native.c
+++ b/src/backends/native/meta-barrier-native.c
@@ -36,8 +36,7 @@
#include "backends/meta-backend-private.h"
#include "backends/meta-barrier-private.h"
-#include "backends/native/meta-backend-native.h"
-#include "backends/native/meta-backend-native-private.h"
+#include "backends/native/meta-seat-native.h"
#include "meta/barrier.h"
#include "meta/util.h"
@@ -558,16 +557,16 @@ MetaBarrierImpl *
meta_barrier_impl_native_new (MetaBarrier *barrier)
{
MetaBarrierImplNative *self;
- MetaBackendNative *native;
MetaBarrierManagerNative *manager;
+ ClutterBackend *backend = clutter_get_default_backend ();
+ ClutterSeat *seat = clutter_backend_get_default_seat (backend);
self = g_object_new (META_TYPE_BARRIER_IMPL_NATIVE, NULL);
self->barrier = barrier;
self->is_active = TRUE;
- native = META_BACKEND_NATIVE (meta_get_backend ());
- manager = meta_backend_native_get_barrier_manager (native);
+ manager = meta_seat_native_get_barrier_manager (META_SEAT_NATIVE (seat));
self->manager = manager;
g_hash_table_add (manager->barriers, self);
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index bc5e621..52d6985 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -26,6 +26,8 @@
#include "config.h"
+#include "backends/native/meta-seat-native.h"
+
#include <errno.h>
#include <fcntl.h>
#include <libinput.h>
@@ -33,7 +35,7 @@
#include <math.h>
#include "backends/meta-cursor-tracker-private.h"
-#include "backends/native/meta-seat-native.h"
+#include "backends/native/meta-barrier-native.h"
#include "backends/native/meta-event-native.h"
#include "backends/native/meta-input-device-native.h"
#include "backends/native/meta-input-device-tool-native.h"
@@ -889,6 +891,19 @@ meta_event_check (GSource *source)
return retval;
}
+static void
+constrain_to_barriers (MetaSeatNative *seat,
+ ClutterInputDevice *device,
+ uint32_t time,
+ float *new_x,
+ float *new_y)
+{
+ meta_barrier_manager_native_process (seat->barrier_manager,
+ device,
+ time,
+ new_x, new_y);
+}
+
void
meta_seat_native_constrain_pointer (MetaSeatNative *seat,
ClutterInputDevice *core_pointer,
@@ -898,6 +913,10 @@ meta_seat_native_constrain_pointer (MetaSeatNative *seat,
float *new_x,
float *new_y)
{
+ constrain_to_barriers (seat, core_pointer,
+ us2ms (time_us),
+ new_x, new_y);
+
if (seat->constrain_callback)
{
seat->constrain_callback (core_pointer,
@@ -2856,6 +2875,8 @@ meta_seat_native_init (MetaSeatNative *seat)
seat->repeat_delay = 250; /* ms */
seat->repeat_interval = 33; /* ms */
+ seat->barrier_manager = meta_barrier_manager_native_new ();
+
seat->reserved_virtual_slots = g_hash_table_new (NULL, NULL);
}
@@ -3244,3 +3265,9 @@ meta_seat_native_get_xkb_state (MetaSeatNative *seat)
{
return seat->xkb;
}
+
+MetaBarrierManagerNative *
+meta_seat_native_get_barrier_manager (MetaSeatNative *seat)
+{
+ return seat->barrier_manager;
+}
diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h
index 1b7846a..dbb9933 100644
--- a/src/backends/native/meta-seat-native.h
+++ b/src/backends/native/meta-seat-native.h
@@ -27,6 +27,7 @@
#include <libinput.h>
#include <linux/input-event-codes.h>
+#include "backends/native/meta-barrier-native.h"
#include "backends/native/meta-keymap-native.h"
#include "backends/native/meta-xkb-utils.h"
#include "clutter/clutter.h"
@@ -108,6 +109,8 @@ struct _MetaSeatNative
int device_id_next;
GList *free_device_ids;
+ MetaBarrierManagerNative *barrier_manager;
+
MetaPointerConstrainCallback constrain_callback;
gpointer constrain_data;
GDestroyNotify constrain_data_notify;
@@ -294,4 +297,6 @@ void meta_seat_native_set_keyboard_repeat (MetaSeatNative *seat,
void meta_seat_native_release_touch_slots (MetaSeatNative *seat,
guint base_slot);
+MetaBarrierManagerNative * meta_seat_native_get_barrier_manager (MetaSeatNative *seat);
+
#endif /* META_SEAT_NATIVE_H */
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 10 Jul 2020 12:25:12 +0200
Subject: backends: Add argument for best scale on
MetaCursorSprite::prepare-at
Instead of letting implementations poke backend internals from various
places, give that information right away.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-cursor-renderer.c | 48 +++++++++++++++++++++++++++++--
src/backends/meta-cursor.c | 12 ++++----
src/backends/meta-cursor.h | 1 +
src/core/display.c | 44 ++--------------------------
src/wayland/meta-wayland-cursor-surface.c | 1 +
src/wayland/meta-wayland-tablet-tool.c | 1 +
6 files changed, 58 insertions(+), 49 deletions(-)
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index ac81def..53b1a10 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -28,6 +28,8 @@
#include <math.h>
+#include "backends/meta-backend-private.h"
+#include "backends/meta-logical-monitor.h"
#include "backends/meta-stage-private.h"
#include "clutter/clutter.h"
#include "clutter/clutter-mutter.h"
@@ -332,6 +334,41 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
};
}
+static float
+find_highest_logical_monitor_scale (MetaBackend *backend,
+ MetaCursorSprite *cursor_sprite)
+{
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+ MetaCursorRenderer *cursor_renderer =
+ meta_backend_get_cursor_renderer (backend);
+ graphene_rect_t cursor_rect;
+ GList *logical_monitors;
+ GList *l;
+ float highest_scale = 0.0f;
+
+ cursor_rect = meta_cursor_renderer_calculate_rect (cursor_renderer,
+ cursor_sprite);
+
+ logical_monitors =
+ meta_monitor_manager_get_logical_monitors (monitor_manager);
+ for (l = logical_monitors; l; l = l->next)
+ {
+ MetaLogicalMonitor *logical_monitor = l->data;
+ graphene_rect_t logical_monitor_rect =
+ meta_rectangle_to_graphene_rect (&logical_monitor->rect);
+
+ if (!graphene_rect_intersection (&cursor_rect,
+ &logical_monitor_rect,
+ NULL))
+ continue;
+
+ highest_scale = MAX (highest_scale, logical_monitor->scale);
+ }
+
+ return highest_scale;
+}
+
static void
meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite)
@@ -340,9 +377,14 @@ meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
gboolean handled_by_backend;
if (cursor_sprite)
- meta_cursor_sprite_prepare_at (cursor_sprite,
- (int) priv->current_x,
- (int) priv->current_y);
+ {
+ float scale = find_highest_logical_monitor_scale (priv->backend,
+ cursor_sprite);
+ meta_cursor_sprite_prepare_at (cursor_sprite,
+ MAX (1, scale),
+ (int) priv->current_x,
+ (int) priv->current_y);
+ }
handled_by_backend =
META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer,
diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
index 874593d..d0fb2ba 100644
--- a/src/backends/meta-cursor.c
+++ b/src/backends/meta-cursor.c
@@ -179,11 +179,12 @@ meta_cursor_sprite_get_texture_transform (MetaCursorSprite *sprite)
}
void
-meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
- int x,
- int y)
+meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
+ float best_scale,
+ int x,
+ int y)
{
- g_signal_emit (sprite, signals[PREPARE_AT], 0, x, y);
+ g_signal_emit (sprite, signals[PREPARE_AT], 0, best_scale, x, y);
}
void
@@ -226,7 +227,8 @@ meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
- G_TYPE_NONE, 2,
+ G_TYPE_NONE, 3,
+ G_TYPE_FLOAT,
G_TYPE_INT,
G_TYPE_INT);
signals[TEXTURE_CHANGED] = g_signal_new ("texture-changed",
diff --git a/src/backends/meta-cursor.h b/src/backends/meta-cursor.h
index 80eaa31..a65e128 100644
--- a/src/backends/meta-cursor.h
+++ b/src/backends/meta-cursor.h
@@ -43,6 +43,7 @@ struct _MetaCursorSpriteClass
};
void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
+ float best_scale,
int x,
int y);
diff --git a/src/core/display.c b/src/core/display.c
index 521e5d0..81410b1 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -46,7 +46,6 @@
#include "backends/meta-idle-monitor-dbus.h"
#include "backends/meta-input-device-private.h"
#include "backends/meta-input-settings-private.h"
-#include "backends/meta-logical-monitor.h"
#include "backends/meta-stage-private.h"
#include "backends/x11/meta-backend-x11.h"
#include "backends/x11/meta-event-x11.h"
@@ -1629,43 +1628,9 @@ meta_cursor_for_grab_op (MetaGrabOp op)
return META_CURSOR_DEFAULT;
}
-static float
-find_highest_logical_monitor_scale (MetaBackend *backend,
- MetaCursorSprite *cursor_sprite)
-{
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
- MetaCursorRenderer *cursor_renderer =
- meta_backend_get_cursor_renderer (backend);
- graphene_rect_t cursor_rect;
- GList *logical_monitors;
- GList *l;
- float highest_scale = 0.0;
-
- cursor_rect = meta_cursor_renderer_calculate_rect (cursor_renderer,
- cursor_sprite);
-
- logical_monitors =
- meta_monitor_manager_get_logical_monitors (monitor_manager);
- for (l = logical_monitors; l; l = l->next)
- {
- MetaLogicalMonitor *logical_monitor = l->data;
- graphene_rect_t logical_monitor_rect =
- meta_rectangle_to_graphene_rect (&logical_monitor->rect);
-
- if (!graphene_rect_intersection (&cursor_rect,
- &logical_monitor_rect,
- NULL))
- continue;
-
- highest_scale = MAX (highest_scale, logical_monitor->scale);
- }
-
- return highest_scale;
-}
-
static void
root_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
+ float best_scale,
int x,
int y,
MetaDisplay *display)
@@ -1675,14 +1640,11 @@ root_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
if (meta_is_stage_views_scaled ())
{
- float scale;
-
- scale = find_highest_logical_monitor_scale (backend, cursor_sprite);
- if (scale != 0.0)
+ if (best_scale != 0.0f)
{
float ceiled_scale;
- ceiled_scale = ceilf (scale);
+ ceiled_scale = ceilf (best_scale);
meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
(int) ceiled_scale);
meta_cursor_sprite_set_texture_scale (cursor_sprite,
diff --git a/src/wayland/meta-wayland-cursor-surface.c b/src/wayland/meta-wayland-cursor-surface.c
index 95f8186..af1bc17 100644
--- a/src/wayland/meta-wayland-cursor-surface.c
+++ b/src/wayland/meta-wayland-cursor-surface.c
@@ -81,6 +81,7 @@ update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
static void
cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
+ float best_scale,
int x,
int y,
MetaWaylandCursorSurface *cursor_surface)
diff --git a/src/wayland/meta-wayland-tablet-tool.c b/src/wayland/meta-wayland-tablet-tool.c
index 677ccdd..e88d724 100644
--- a/src/wayland/meta-wayland-tablet-tool.c
+++ b/src/wayland/meta-wayland-tablet-tool.c
@@ -395,6 +395,7 @@ tablet_tool_handle_cursor_surface_destroy (struct wl_listener *listener,
static void
tool_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
+ float best_scale,
int x,
int y,
MetaWaylandTabletTool *tool)
From: Carlos Garnacho <carlosg@gnome.org>
Date: Mon, 13 Jul 2020 13:32:48 +0200
Subject: backends: Add ::device property to MetaCursorRenderer
A cursor renderer is made to invariably follow a pointer device, make
it a construct-time property, and update all creators of cursor renderers
to specify it.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-cursor-renderer.c | 29 ++++++++++++++++++++++-
src/backends/meta-cursor-renderer.h | 4 +++-
src/backends/native/meta-cursor-renderer-native.c | 4 +++-
src/backends/native/meta-cursor-renderer-native.h | 3 ++-
src/backends/native/meta-seat-native.c | 5 ++--
src/backends/x11/cm/meta-backend-x11-cm.c | 1 +
src/backends/x11/nested/meta-backend-x11-nested.c | 1 +
7 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index 53b1a10..095cdbe 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -46,6 +46,7 @@ enum
PROP_0,
PROP_BACKEND,
+ PROP_DEVICE,
N_PROPS
};
@@ -59,6 +60,7 @@ struct _MetaCursorRendererPrivate
float current_x;
float current_y;
+ ClutterInputDevice *device;
MetaCursorSprite *displayed_cursor;
MetaCursorSprite *overlay_cursor;
@@ -205,6 +207,9 @@ meta_cursor_renderer_get_property (GObject *object,
case PROP_BACKEND:
g_value_set_object (value, priv->backend);
break;
+ case PROP_DEVICE:
+ g_value_set_object (value, priv->device);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -226,6 +231,9 @@ meta_cursor_renderer_set_property (GObject *object,
case PROP_BACKEND:
priv->backend = g_value_get_object (value);
break;
+ case PROP_DEVICE:
+ priv->device = g_value_get_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -286,6 +294,14 @@ meta_cursor_renderer_class_init (MetaCursorRendererClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ obj_props[PROP_DEVICE] =
+ g_param_spec_object ("device",
+ "device",
+ "Input device",
+ CLUTTER_TYPE_INPUT_DEVICE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props);
signals[CURSOR_PAINTED] = g_signal_new ("cursor-painted",
@@ -396,10 +412,12 @@ meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
}
MetaCursorRenderer *
-meta_cursor_renderer_new (MetaBackend *backend)
+meta_cursor_renderer_new (MetaBackend *backend,
+ ClutterInputDevice *device)
{
return g_object_new (META_TYPE_CURSOR_RENDERER,
"backend", backend,
+ "device", device,
NULL);
}
@@ -511,3 +529,12 @@ meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
return FALSE;
}
+
+ClutterInputDevice *
+meta_cursor_renderer_get_input_device (MetaCursorRenderer *renderer)
+{
+ MetaCursorRendererPrivate *priv =
+ meta_cursor_renderer_get_instance_private (renderer);
+
+ return priv->device;
+}
diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h
index 7d89af4..3862102 100644
--- a/src/backends/meta-cursor-renderer.h
+++ b/src/backends/meta-cursor-renderer.h
@@ -54,7 +54,8 @@ struct _MetaCursorRendererClass
MetaCursorSprite *cursor_sprite);
};
-MetaCursorRenderer * meta_cursor_renderer_new (MetaBackend *backend);
+MetaCursorRenderer * meta_cursor_renderer_new (MetaBackend *backend,
+ ClutterInputDevice *device);
void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite);
@@ -83,6 +84,7 @@ graphene_rect_t meta_cursor_renderer_calculate_rect (MetaCursorRenderer *rendere
void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite);
+ClutterInputDevice * meta_cursor_renderer_get_input_device (MetaCursorRenderer *renderer);
void meta_cursor_renderer_update_stage_overlay (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite);
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index 02bb2aa..84aa32b 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -1724,7 +1724,8 @@ init_hw_cursor_support (MetaCursorRendererNative *cursor_renderer_native)
}
MetaCursorRendererNative *
-meta_cursor_renderer_native_new (MetaBackend *backend)
+meta_cursor_renderer_native_new (MetaBackend *backend,
+ ClutterInputDevice *device)
{
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
@@ -1733,6 +1734,7 @@ meta_cursor_renderer_native_new (MetaBackend *backend)
cursor_renderer_native = g_object_new (META_TYPE_CURSOR_RENDERER_NATIVE,
"backend", backend,
+ "device", device,
NULL);
priv =
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
diff --git a/src/backends/native/meta-cursor-renderer-native.h b/src/backends/native/meta-cursor-renderer-native.h
index d3560e4..26c698c 100644
--- a/src/backends/native/meta-cursor-renderer-native.h
+++ b/src/backends/native/meta-cursor-renderer-native.h
@@ -33,6 +33,7 @@ G_DECLARE_FINAL_TYPE (MetaCursorRendererNative, meta_cursor_renderer_native,
META, CURSOR_RENDERER_NATIVE,
MetaCursorRenderer)
-MetaCursorRendererNative * meta_cursor_renderer_native_new (MetaBackend *backend);
+MetaCursorRendererNative * meta_cursor_renderer_native_new (MetaBackend *backend,
+ ClutterInputDevice *device);
#endif /* META_CURSOR_RENDERER_NATIVE_H */
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 90e14d0..5b15bce 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -1844,7 +1844,7 @@ update_tablet_cursor_state (MetaSeatNative *seat_native,
g_object_unref);
}
- cursor_renderer = meta_cursor_renderer_new (meta_get_backend ());
+ cursor_renderer = meta_cursor_renderer_new (meta_get_backend (), device);
g_hash_table_insert (seat_native->tablet_cursors,
device, cursor_renderer);
}
@@ -3310,7 +3310,8 @@ meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
MetaCursorRendererNative *cursor_renderer_native;
cursor_renderer_native =
- meta_cursor_renderer_native_new (meta_get_backend ());
+ meta_cursor_renderer_native_new (meta_get_backend (),
+ seat_native->core_pointer);
seat_native->cursor_renderer =
META_CURSOR_RENDERER (cursor_renderer_native);
}
diff --git a/src/backends/x11/cm/meta-backend-x11-cm.c b/src/backends/x11/cm/meta-backend-x11-cm.c
index b00f1ca..35e1acf 100644
--- a/src/backends/x11/cm/meta-backend-x11-cm.c
+++ b/src/backends/x11/cm/meta-backend-x11-cm.c
@@ -127,6 +127,7 @@ meta_backend_x11_cm_get_cursor_renderer (MetaBackend *backend,
x11_cm->cursor_renderer =
g_object_new (META_TYPE_CURSOR_RENDERER_X11,
"backend", backend,
+ "device", device,
NULL);
}
diff --git a/src/backends/x11/nested/meta-backend-x11-nested.c b/src/backends/x11/nested/meta-backend-x11-nested.c
index 27143ce..041f4b8 100644
--- a/src/backends/x11/nested/meta-backend-x11-nested.c
+++ b/src/backends/x11/nested/meta-backend-x11-nested.c
@@ -76,6 +76,7 @@ meta_backend_x11_nested_get_cursor_renderer (MetaBackend *backend,
priv->cursor_renderer =
g_object_new (META_TYPE_CURSOR_RENDERER_X11_NESTED,
"backend", backend,
+ "device", device,
NULL);
}
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 10 Jul 2020 23:28:50 +0200
Subject: backends: Add meta_backend_get_cursor_renderer_for_device()
Different devices may get standalone cursor renderers, add this API
to adapt slowly to this. The meta_backend_get_cursor_renderer() call
still exists, but shortcuts to the mouse pointer's renderer (as it
actually did before).
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-backend-private.h | 5 +-
src/backends/meta-backend.c | 72 +++++++++++++++++++++--
src/backends/native/meta-backend-native.c | 12 ++--
src/backends/native/meta-seat-native.c | 23 ++++++++
src/backends/native/meta-seat-native.h | 5 ++
src/backends/x11/cm/meta-backend-x11-cm.c | 20 +++++--
src/backends/x11/nested/meta-backend-x11-nested.c | 22 +++++--
7 files changed, 139 insertions(+), 20 deletions(-)
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 85d403a..954328c 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -63,7 +63,8 @@ struct _MetaBackendClass
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
GError **error);
- MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
+ MetaCursorRenderer * (* get_cursor_renderer) (MetaBackend *backend,
+ ClutterInputDevice *device);
MetaCursorTracker * (* create_cursor_tracker) (MetaBackend *backend);
MetaRenderer * (* create_renderer) (MetaBackend *backend,
GError **error);
@@ -127,6 +128,8 @@ META_EXPORT_TEST
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);
MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend);
+MetaCursorRenderer * meta_backend_get_cursor_renderer_for_device (MetaBackend *backend,
+ ClutterInputDevice *device);
MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend);
META_EXPORT_TEST
MetaRenderer * meta_backend_get_renderer (MetaBackend *backend);
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 4553e19..0853aeb 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -120,7 +120,6 @@ struct _MetaBackendPrivate
MetaMonitorManager *monitor_manager;
MetaOrientationManager *orientation_manager;
MetaCursorTracker *cursor_tracker;
- MetaCursorRenderer *cursor_renderer;
MetaInputSettings *input_settings;
MetaRenderer *renderer;
#ifdef HAVE_EGL
@@ -265,6 +264,53 @@ reset_pointer_position (MetaBackend *backend)
primary->rect.y + primary->rect.height * 0.9);
}
+static gboolean
+should_have_cursor_renderer (ClutterInputDevice *device)
+{
+ switch (clutter_input_device_get_device_type (device))
+ {
+ case CLUTTER_POINTER_DEVICE:
+ if (clutter_input_device_get_device_mode (device) ==
+ CLUTTER_INPUT_MODE_LOGICAL)
+ return TRUE;
+
+ return FALSE;
+ case CLUTTER_TABLET_DEVICE:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static void
+update_cursors (MetaBackend *backend)
+{
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+ ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
+ MetaCursorRenderer *cursor_renderer;
+ ClutterInputDevice *pointer, *device;
+ GList *devices, *l;
+
+ pointer = clutter_seat_get_pointer (seat);
+ devices = clutter_seat_list_devices (seat);
+ devices = g_list_prepend (devices, pointer);
+
+ for (l = devices; l; l = l->next)
+ {
+ device = l->data;
+
+ if (!should_have_cursor_renderer (device))
+ continue;
+
+ cursor_renderer = meta_backend_get_cursor_renderer_for_device (backend,
+ device);
+ if (cursor_renderer)
+ meta_cursor_renderer_force_update (cursor_renderer);
+ }
+
+ g_list_free (devices);
+}
+
void
meta_backend_monitors_changed (MetaBackend *backend)
{
@@ -290,7 +336,7 @@ meta_backend_monitors_changed (MetaBackend *backend)
}
}
- meta_cursor_renderer_force_update (priv->cursor_renderer);
+ update_cursors (backend);
}
void
@@ -507,8 +553,6 @@ meta_backend_real_post_init (MetaBackend *backend)
meta_backend_sync_screen_size (backend);
- priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
-
priv->device_monitors =
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref);
@@ -1070,8 +1114,26 @@ MetaCursorRenderer *
meta_backend_get_cursor_renderer (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+ ClutterInputDevice *pointer;
+ ClutterSeat *seat;
+
+ seat = clutter_backend_get_default_seat (priv->clutter_backend);
+ pointer = clutter_seat_get_pointer (seat);
+
+ return meta_backend_get_cursor_renderer_for_device (backend, pointer);
+}
+
+MetaCursorRenderer *
+meta_backend_get_cursor_renderer_for_device (MetaBackend *backend,
+ ClutterInputDevice *device)
+{
+ g_return_val_if_fail (META_IS_BACKEND (backend), NULL);
+ g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
+ g_return_val_if_fail (clutter_input_device_get_device_type (device) !=
+ CLUTTER_KEYBOARD_DEVICE, NULL);
- return priv->cursor_renderer;
+ return META_BACKEND_GET_CLASS (backend)->get_cursor_renderer (backend,
+ device);
}
/**
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 6e140cf..406ca7a 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -49,7 +49,6 @@
#include "backends/meta-settings-private.h"
#include "backends/meta-stage-private.h"
#include "backends/native/meta-clutter-backend-native.h"
-#include "backends/native/meta-cursor-renderer-native.h"
#include "backends/native/meta-event-native.h"
#include "backends/native/meta-input-settings-native.h"
#include "backends/native/meta-kms.h"
@@ -186,9 +185,14 @@ meta_backend_native_create_monitor_manager (MetaBackend *backend,
}
static MetaCursorRenderer *
-meta_backend_native_create_cursor_renderer (MetaBackend *backend)
+meta_backend_native_get_cursor_renderer (MetaBackend *backend,
+ ClutterInputDevice *device)
{
- return META_CURSOR_RENDERER (meta_cursor_renderer_native_new (backend));
+ ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
+ MetaSeatNative *seat_native =
+ META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
+
+ return meta_seat_native_maybe_ensure_cursor_renderer (seat_native, device);
}
static MetaRenderer *
@@ -532,7 +536,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->post_init = meta_backend_native_post_init;
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
- backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
+ backend_class->get_cursor_renderer = meta_backend_native_get_cursor_renderer;
backend_class->create_renderer = meta_backend_native_create_renderer;
backend_class->create_input_settings = meta_backend_native_create_input_settings;
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 9fe322b..6413571 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -2608,6 +2608,7 @@ meta_seat_native_finalize (GObject *object)
g_hash_table_destroy (seat->reserved_virtual_slots);
+ g_object_unref (seat->cursor_renderer);
g_object_unref (seat->udev_client);
meta_event_source_free (seat->event_source);
@@ -3266,3 +3267,25 @@ meta_seat_native_set_pointer_constraint (MetaSeatNative *seat,
seat->core_pointer);
}
}
+
+MetaCursorRenderer *
+meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat_native,
+ ClutterInputDevice *device)
+{
+ if (device == seat_native->core_pointer)
+ {
+ if (!seat_native->cursor_renderer)
+ {
+ MetaCursorRendererNative *cursor_renderer_native;
+
+ cursor_renderer_native =
+ meta_cursor_renderer_native_new (meta_get_backend ());
+ seat_native->cursor_renderer =
+ META_CURSOR_RENDERER (cursor_renderer_native);
+ }
+
+ return seat_native->cursor_renderer;
+ }
+
+ return NULL;
+}
diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h
index 2a1faae..9f7f2d3 100644
--- a/src/backends/native/meta-seat-native.h
+++ b/src/backends/native/meta-seat-native.h
@@ -28,6 +28,7 @@
#include <linux/input-event-codes.h>
#include "backends/native/meta-barrier-native.h"
+#include "backends/native/meta-cursor-renderer-native.h"
#include "backends/native/meta-keymap-native.h"
#include "backends/native/meta-pointer-constraint-native.h"
#include "backends/native/meta-xkb-utils.h"
@@ -63,6 +64,7 @@ struct _MetaSeatNative
GHashTable *touch_states;
guint virtual_touch_slot_base;
GHashTable *reserved_virtual_slots;
+ GHashTable *cursor_renderers;
struct xkb_state *xkb;
xkb_led_index_t caps_lock_led;
@@ -84,6 +86,7 @@ struct _MetaSeatNative
MetaPointerConstraintImpl *pointer_constraint;
MetaKeymapNative *keymap;
+ MetaCursorRenderer *cursor_renderer;
GUdevClient *udev_client;
guint tablet_mode_switch_state : 1;
@@ -257,5 +260,7 @@ MetaBarrierManagerNative * meta_seat_native_get_barrier_manager (MetaSeatNative
void meta_seat_native_set_pointer_constraint (MetaSeatNative *seat,
MetaPointerConstraintImpl *constraint_impl);
+MetaCursorRenderer * meta_seat_native_maybe_ensure_cursor_renderer (MetaSeatNative *seat,
+ ClutterInputDevice *device);
#endif /* META_SEAT_NATIVE_H */
diff --git a/src/backends/x11/cm/meta-backend-x11-cm.c b/src/backends/x11/cm/meta-backend-x11-cm.c
index 28726f7..b00f1ca 100644
--- a/src/backends/x11/cm/meta-backend-x11-cm.c
+++ b/src/backends/x11/cm/meta-backend-x11-cm.c
@@ -41,6 +41,7 @@ struct _MetaBackendX11Cm
{
MetaBackendX11 parent;
+ MetaCursorRenderer *cursor_renderer;
char *keymap_layouts;
char *keymap_variants;
char *keymap_options;
@@ -116,11 +117,20 @@ meta_backend_x11_cm_create_monitor_manager (MetaBackend *backend,
}
static MetaCursorRenderer *
-meta_backend_x11_cm_create_cursor_renderer (MetaBackend *backend)
+meta_backend_x11_cm_get_cursor_renderer (MetaBackend *backend,
+ ClutterInputDevice *device)
{
- return g_object_new (META_TYPE_CURSOR_RENDERER_X11,
- "backend", backend,
- NULL);
+ MetaBackendX11Cm *x11_cm = META_BACKEND_X11_CM (backend);
+
+ if (!x11_cm->cursor_renderer)
+ {
+ x11_cm->cursor_renderer =
+ g_object_new (META_TYPE_CURSOR_RENDERER_X11,
+ "backend", backend,
+ NULL);
+ }
+
+ return x11_cm->cursor_renderer;
}
static MetaCursorTracker *
@@ -444,7 +454,7 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass)
backend_class->post_init = meta_backend_x11_cm_post_init;
backend_class->create_renderer = meta_backend_x11_cm_create_renderer;
backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager;
- backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer;
+ backend_class->get_cursor_renderer = meta_backend_x11_cm_get_cursor_renderer;
backend_class->create_cursor_tracker = meta_backend_x11_cm_create_cursor_tracker;
backend_class->create_input_settings = meta_backend_x11_cm_create_input_settings;
backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size;
diff --git a/src/backends/x11/nested/meta-backend-x11-nested.c b/src/backends/x11/nested/meta-backend-x11-nested.c
index 009a809..27143ce 100644
--- a/src/backends/x11/nested/meta-backend-x11-nested.c
+++ b/src/backends/x11/nested/meta-backend-x11-nested.c
@@ -31,6 +31,7 @@
typedef struct _MetaBackendX11NestedPrivate
{
MetaGpu *gpu;
+ MetaCursorRenderer *cursor_renderer;
} MetaBackendX11NestedPrivate;
static GInitableIface *initable_parent_iface;
@@ -63,11 +64,22 @@ meta_backend_x11_nested_create_monitor_manager (MetaBackend *backend,
}
static MetaCursorRenderer *
-meta_backend_x11_nested_create_cursor_renderer (MetaBackend *backend)
+meta_backend_x11_nested_get_cursor_renderer (MetaBackend *backend,
+ ClutterInputDevice *device)
{
- return g_object_new (META_TYPE_CURSOR_RENDERER_X11_NESTED,
- "backend", backend,
- NULL);
+ MetaBackendX11Nested *backend_x11_nested = META_BACKEND_X11_NESTED (backend);
+ MetaBackendX11NestedPrivate *priv =
+ meta_backend_x11_nested_get_instance_private (backend_x11_nested);
+
+ if (!priv->cursor_renderer)
+ {
+ priv->cursor_renderer =
+ g_object_new (META_TYPE_CURSOR_RENDERER_X11_NESTED,
+ "backend", backend,
+ NULL);
+ }
+
+ return priv->cursor_renderer;
}
static MetaInputSettings *
@@ -275,7 +287,7 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass)
backend_class->post_init = meta_backend_x11_nested_post_init;
backend_class->create_renderer = meta_backend_x11_nested_create_renderer;
backend_class->create_monitor_manager = meta_backend_x11_nested_create_monitor_manager;
- backend_class->create_cursor_renderer = meta_backend_x11_nested_create_cursor_renderer;
+ backend_class->get_cursor_renderer = meta_backend_x11_nested_get_cursor_renderer;
backend_class->create_input_settings = meta_backend_x11_nested_create_input_settings;
backend_class->update_screen_size = meta_backend_x11_nested_update_screen_size;
backend_class->select_stage_events = meta_backend_x11_nested_select_stage_events;
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 31 Jul 2020 19:10:53 +0200
Subject: backends: Add method to get extents from viewport info
This way we know the stage extents without poking the stage.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-viewport-info.c | 25 +++++++++++++++++++++++++
src/backends/meta-viewport-info.h | 4 ++++
2 files changed, 29 insertions(+)
diff --git a/src/backends/meta-viewport-info.c b/src/backends/meta-viewport-info.c
index 922475c..c8474f3 100644
--- a/src/backends/meta-viewport-info.c
+++ b/src/backends/meta-viewport-info.c
@@ -187,3 +187,28 @@ meta_viewport_info_get_num_views (MetaViewportInfo *info)
{
return info->views->len;
}
+
+void
+meta_viewport_info_get_extents (MetaViewportInfo *viewport_info,
+ float *width,
+ float *height)
+{
+ int min_x = G_MAXINT, min_y = G_MAXINT, max_x = G_MININT, max_y = G_MININT, i;
+
+ g_return_if_fail (viewport_info != NULL);
+
+ for (i = 0; i < viewport_info->views->len; i++)
+ {
+ ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
+
+ min_x = MIN (min_x, info->rect.x);
+ max_x = MAX (max_x, info->rect.x + info->rect.width);
+ min_y = MIN (min_y, info->rect.y);
+ max_y = MAX (max_y, info->rect.y + info->rect.height);
+ }
+
+ if (width)
+ *width = (float) max_x - min_x;
+ if (height)
+ *height = (float) max_y - min_y;
+}
diff --git a/src/backends/meta-viewport-info.h b/src/backends/meta-viewport-info.h
index 0701c43..ea9b8af 100644
--- a/src/backends/meta-viewport-info.h
+++ b/src/backends/meta-viewport-info.h
@@ -51,4 +51,8 @@ int meta_viewport_info_get_neighbor (MetaViewportInfo *info,
int meta_viewport_info_get_num_views (MetaViewportInfo *info);
+void meta_viewport_info_get_extents (MetaViewportInfo *info,
+ float *width,
+ float *height);
+
#endif /* META_VIEWPORT_INFO_H */
From: Carlos Garnacho <carlosg@gnome.org>
Date: Thu, 16 Jul 2020 13:52:39 +0200
Subject: backends: Add simple object to delegate logical monitor layout
queries
This object can be passed to random places, and be trusted to remain unchanged
till replaced. Makes it an ideal replacement for MetaMonitorManager across
threads.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-monitor-manager-private.h | 3 +
src/backends/meta-monitor-manager.c | 34 +++++
src/backends/meta-viewport-info.c | 189 ++++++++++++++++++++++++++++
src/backends/meta-viewport-info.h | 54 ++++++++
src/meson.build | 2 +
5 files changed, 282 insertions(+)
create mode 100644 src/backends/meta-viewport-info.c
create mode 100644 src/backends/meta-viewport-info.h
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index 2cde1ef..f7187c9 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -31,6 +31,7 @@
#include "backends/meta-cursor.h"
#include "backends/meta-display-config-shared.h"
#include "backends/meta-monitor-transform.h"
+#include "backends/meta-viewport-info.h"
#include "core/util-private.h"
#include "meta/display.h"
#include "meta/meta-monitor-manager.h"
@@ -427,4 +428,6 @@ meta_find_output_assignment (MetaOutputAssignment **outputs,
void meta_monitor_manager_post_init (MetaMonitorManager *manager);
+MetaViewportInfo * meta_monitor_manager_get_viewports (MetaMonitorManager *manager);
+
#endif /* META_MONITOR_MANAGER_PRIVATE_H */
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 34575f4..daf5932 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -3672,3 +3672,37 @@ meta_monitor_manager_post_init (MetaMonitorManager *manager)
G_CALLBACK (update_panel_orientation_managed), manager,
G_CONNECT_SWAPPED);
}
+
+MetaViewportInfo *
+meta_monitor_manager_get_viewports (MetaMonitorManager *manager)
+{
+ MetaViewportInfo *info;
+ GArray *views, *scales;
+ GList *logical_monitors, *l;
+
+ views = g_array_new (FALSE, FALSE, sizeof (cairo_rectangle_int_t));
+ scales = g_array_new (FALSE, FALSE, sizeof (float));
+
+ logical_monitors = meta_monitor_manager_get_logical_monitors (manager);
+
+ for (l = logical_monitors; l; l = l->next)
+ {
+ MetaLogicalMonitor *logical_monitor = l->data;
+ cairo_rectangle_int_t rect;
+ float scale;
+
+ rect = logical_monitor->rect;
+ g_array_append_val (views, rect);
+
+ scale = logical_monitor->scale;
+ g_array_append_val (scales, scale);
+ }
+
+ info = meta_viewport_info_new ((cairo_rectangle_int_t *) views->data,
+ (float *) scales->data,
+ views->len);
+ g_array_unref (views);
+ g_array_unref (scales);
+
+ return info;
+}
diff --git a/src/backends/meta-viewport-info.c b/src/backends/meta-viewport-info.c
new file mode 100644
index 0000000..922475c
--- /dev/null
+++ b/src/backends/meta-viewport-info.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2020 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Carlos Garnacho <carlosg@gnome.org>
+ */
+
+#include "config.h"
+
+#include "backends/meta-viewport-info.h"
+#include "core/main-private.h"
+#include "core/boxes-private.h"
+
+typedef struct _ViewInfo ViewInfo;
+
+struct _ViewInfo
+{
+ MetaRectangle rect;
+ float scale;
+};
+
+struct _MetaViewportInfo
+{
+ GObject parent;
+ GArray *views;
+};
+
+G_DEFINE_TYPE (MetaViewportInfo, meta_viewport_info, G_TYPE_OBJECT)
+
+static void
+meta_viewport_info_finalize (GObject *object)
+{
+ MetaViewportInfo *info = META_VIEWPORT_INFO (object);
+
+ g_array_unref (info->views);
+
+ G_OBJECT_CLASS (meta_viewport_info_parent_class)->finalize (object);
+}
+
+static void
+meta_viewport_info_class_init (MetaViewportInfoClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = meta_viewport_info_finalize;
+}
+
+static void
+meta_viewport_info_init (MetaViewportInfo *info)
+{
+ info->views = g_array_new (FALSE, FALSE, sizeof (ViewInfo));
+}
+
+MetaViewportInfo *
+meta_viewport_info_new (cairo_rectangle_int_t *views,
+ float *scales,
+ int n_views)
+{
+ MetaViewportInfo *viewport_info;
+ int i;
+
+ viewport_info = g_object_new (META_TYPE_VIEWPORT_INFO, NULL);
+
+ for (i = 0; i < n_views; i++)
+ {
+ ViewInfo info;
+
+ info.rect = views[i];
+ info.scale = scales[i];
+ g_array_append_val (viewport_info->views, info);
+ }
+
+ return viewport_info;
+}
+
+int
+meta_viewport_info_get_view_at (MetaViewportInfo *viewport_info,
+ float x,
+ float y)
+{
+ int i;
+
+ for (i = 0; i < viewport_info->views->len; i++)
+ {
+ ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
+
+ if (META_POINT_IN_RECT (x, y, info->rect))
+ return i;
+ }
+
+ return -1;
+}
+
+gboolean
+meta_viewport_info_get_view_info (MetaViewportInfo *viewport_info,
+ int idx,
+ cairo_rectangle_int_t *rect,
+ float *scale)
+{
+ ViewInfo *info;
+
+ if (idx < 0 || idx >= viewport_info->views->len)
+ return FALSE;
+
+ info = &g_array_index (viewport_info->views, ViewInfo, idx);
+ if (rect)
+ *rect = info->rect;
+ if (scale)
+ *scale = info->scale;
+
+ return TRUE;
+}
+
+static gboolean
+view_has_neighbor (cairo_rectangle_int_t *view,
+ cairo_rectangle_int_t *neighbor,
+ MetaDisplayDirection neighbor_direction)
+{
+ switch (neighbor_direction)
+ {
+ case META_DISPLAY_RIGHT:
+ if (neighbor->x == (view->x + view->width) &&
+ meta_rectangle_vert_overlap (neighbor, view))
+ return TRUE;
+ break;
+ case META_DISPLAY_LEFT:
+ if (view->x == (neighbor->x + neighbor->width) &&
+ meta_rectangle_vert_overlap (neighbor, view))
+ return TRUE;
+ break;
+ case META_DISPLAY_UP:
+ if (view->y == (neighbor->y + neighbor->height) &&
+ meta_rectangle_horiz_overlap (neighbor, view))
+ return TRUE;
+ break;
+ case META_DISPLAY_DOWN:
+ if (neighbor->y == (view->y + view->height) &&
+ meta_rectangle_horiz_overlap (neighbor, view))
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+int
+meta_viewport_info_get_neighbor (MetaViewportInfo *viewport_info,
+ int idx,
+ MetaDisplayDirection direction)
+{
+ cairo_rectangle_int_t rect;
+ int i;
+
+ if (!meta_viewport_info_get_view_info (viewport_info, idx, &rect, NULL))
+ return -1;
+
+ for (i = 0; i < viewport_info->views->len; i++)
+ {
+ ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
+
+ if (idx == i)
+ continue;
+ if (view_has_neighbor (&rect, &info->rect, direction))
+ return i;
+ }
+
+ return -1;
+}
+
+int
+meta_viewport_info_get_num_views (MetaViewportInfo *info)
+{
+ return info->views->len;
+}
diff --git a/src/backends/meta-viewport-info.h b/src/backends/meta-viewport-info.h
new file mode 100644
index 0000000..0701c43
--- /dev/null
+++ b/src/backends/meta-viewport-info.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Carlos Garnacho <carlosg@gnome.org>
+ */
+
+#ifndef META_VIEWPORT_INFO_H
+#define META_VIEWPORT_INFO_H
+
+#include <cairo.h>
+#include <glib-object.h>
+
+#include "meta/display.h"
+
+#define META_TYPE_VIEWPORT_INFO (meta_viewport_info_get_type ())
+G_DECLARE_FINAL_TYPE (MetaViewportInfo, meta_viewport_info,
+ META, VIEWPORT_INFO, GObject)
+
+MetaViewportInfo * meta_viewport_info_new (cairo_rectangle_int_t *views,
+ float *scales,
+ int n_views);
+
+int meta_viewport_info_get_view_at (MetaViewportInfo *info,
+ float x,
+ float y);
+
+gboolean meta_viewport_info_get_view_info (MetaViewportInfo *viewport_info,
+ int idx,
+ cairo_rectangle_int_t *rect,
+ float *scale);
+
+int meta_viewport_info_get_neighbor (MetaViewportInfo *info,
+ int idx,
+ MetaDisplayDirection direction);
+
+int meta_viewport_info_get_num_views (MetaViewportInfo *info);
+
+#endif /* META_VIEWPORT_INFO_H */
diff --git a/src/meson.build b/src/meson.build
index 107d33c..30e7fb8 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -233,6 +233,8 @@ mutter_sources = [
'backends/meta-settings-private.h',
'backends/meta-stage.c',
'backends/meta-stage-private.h',
+ 'backends/meta-viewport-info.c',
+ 'backends/meta-viewport-info.h',
'backends/x11/cm/meta-backend-x11-cm.c',
'backends/x11/cm/meta-backend-x11-cm.h',
'backends/x11/cm/meta-cursor-sprite-xfixes.c',
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 31 Jul 2020 20:17:31 +0200
Subject: backends: Assign stage to events in MetaBackend
Don't do this in the MetaSeatNative, this should be detached from
the stage.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
---
src/backends/meta-backend.c | 16 +++++++++++++++-
src/backends/native/meta-seat-native.c | 11 -----------
2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 6115be9..b2a52c9 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -174,6 +174,14 @@ struct _MetaBackendPrivate
};
typedef struct _MetaBackendPrivate MetaBackendPrivate;
+typedef struct _MetaBackendSource MetaBackendSource;
+
+struct _MetaBackendSource
+{
+ GSource parent;
+ MetaBackend *backend;
+};
+
static void
initable_iface_init (GInitableIface *initable_iface);
@@ -951,10 +959,13 @@ clutter_source_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
{
+ MetaBackendSource *backend_source = (MetaBackendSource *) source;
ClutterEvent *event = clutter_event_get ();
if (event)
{
+ event->any.stage =
+ CLUTTER_STAGE (meta_backend_get_stage (backend_source->backend));
clutter_do_event (event);
clutter_event_free (event);
}
@@ -980,6 +991,7 @@ static gboolean
init_clutter (MetaBackend *backend,
GError **error)
{
+ MetaBackendSource *backend_source;
GSource *source;
clutter_set_custom_backend_func (meta_get_clutter_backend);
@@ -991,7 +1003,9 @@ init_clutter (MetaBackend *backend,
return FALSE;
}
- source = g_source_new (&clutter_source_funcs, sizeof (GSource));
+ source = g_source_new (&clutter_source_funcs, sizeof (MetaBackendSource));
+ backend_source = (MetaBackendSource *) source;
+ backend_source->backend = backend;
g_source_attach (source, NULL);
g_source_unref (source);
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 0c6b0a3..3d11892 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -248,16 +248,6 @@ static void
queue_event (MetaSeatNative *seat,
ClutterEvent *event)
{
- ClutterStage *stage = meta_seat_native_get_stage (seat);
-
- if (!stage)
- {
- /* No stage yet, drop this event on the floor */
- clutter_event_free (event);
- return;
- }
-
- event->any.stage = stage;
_clutter_event_push (event, FALSE);
}
@@ -1335,7 +1325,6 @@ meta_event_dispatch (GSource *g_source,
{
MetaEventSource *source = (MetaEventSource *) g_source;
MetaSeatNative *seat;
- ClutterEvent *event;
seat = source->seat;
From: Carlos Garnacho <carlosg@gnome.org>
Date: Mon, 28 Dec 2020 17:00:46 +0100
Subject: backends: Disconnect MetaInputMapper signal connection on device
dispose
This signal may be left dangling when disconnecting a device, and be executed
later on if the device is connected again, and mapped to other output. Make it
sure the signal handler is disconnected when unplugging the device.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1657>
---
src/backends/meta-input-mapper.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/backends/meta-input-mapper.c b/src/backends/meta-input-mapper.c
index 756cd11..df21ff7 100644
--- a/src/backends/meta-input-mapper.c
+++ b/src/backends/meta-input-mapper.c
@@ -189,6 +189,7 @@ mapper_input_info_new (ClutterInputDevice *device,
static void
mapper_input_info_free (MetaMapperInputInfo *info)
{
+ g_signal_handlers_disconnect_by_func (info->settings, settings_output_changed_cb, info);
g_object_unref (info->settings);
g_free (info);
}