commit
819d15c816
@ -0,0 +1 @@
|
||||
SOURCES/mutter-40.9.tar.xz
|
@ -0,0 +1 @@
|
||||
f9b20f8330ecdb76fc887c4a99c03b406e26fd66 SOURCES/mutter-40.9.tar.xz
|
@ -0,0 +1,26 @@
|
||||
From 3899a01cd6cb00ca686946d3065d58f59f5c2099 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 17 Nov 2020 14:00:02 +0100
|
||||
Subject: [PATCH] Revert "build: Do not provide built sources as libmutter_dep
|
||||
sources"
|
||||
|
||||
This reverts commit 4e9a2e479969973bf3063c740ceff149036b3af4.
|
||||
---
|
||||
src/meson.build | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/meson.build b/src/meson.build
|
||||
index e7c99caee..8fe484ec2 100644
|
||||
--- a/src/meson.build
|
||||
+++ b/src/meson.build
|
||||
@@ -955,6 +955,7 @@ libmutter = shared_library(libmutter_name,
|
||||
libmutter_dep = declare_dependency(
|
||||
link_with: libmutter,
|
||||
include_directories: mutter_includes,
|
||||
+ sources: mutter_built_sources,
|
||||
dependencies: [
|
||||
libmutter_cogl_dep,
|
||||
libmutter_clutter_dep,
|
||||
--
|
||||
2.28.0
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 9d0ded3178777cd6afcdd5fff7b6f0f39a0d5236 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Williamson <awilliam@redhat.com>
|
||||
Date: Tue, 9 Mar 2021 17:21:59 -0800
|
||||
Subject: [PATCH] Test: deny atomic KMS for "tegra" (RHBZ #1936991)
|
||||
|
||||
Signed-off-by: Adam Williamson <awilliam@redhat.com>
|
||||
---
|
||||
data/61-mutter.rules | 1 +
|
||||
src/backends/native/meta-kms-device.c | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/data/61-mutter.rules b/data/61-mutter.rules
|
||||
index edc03e6c1..d8e3c5f00 100644
|
||||
--- a/data/61-mutter.rules
|
||||
+++ b/data/61-mutter.rules
|
||||
@@ -3,3 +3,4 @@ DRIVERS=="nouveau", SUBSYSTEM=="drm", TAG+="mutter-device-disable-kms-modifiers"
|
||||
DRIVERS=="amdgpu", SUBSYSTEM=="drm", TAG+="mutter-device-disable-kms-modifiers"
|
||||
DRIVERS=="radeon", SUBSYSTEM=="drm", TAG+="mutter-device-disable-kms-modifiers"
|
||||
ENV{ID_PATH}=="platform-vkms", TAG+="mutter-device-ignore"
|
||||
+DRIVER=="tegra", SUBSYSTEM=="platform", TAG+="mutter-device-disable-atomic-kms"
|
||||
diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c
|
||||
index 85aded9a6..e749ab6b9 100644
|
||||
--- a/src/backends/native/meta-kms-device.c
|
||||
+++ b/src/backends/native/meta-kms-device.c
|
||||
@@ -253,6 +253,7 @@ is_atomic_allowed (const char *driver_name)
|
||||
"vboxvideo",
|
||||
"nvidia-drm",
|
||||
"virtio_gpu",
|
||||
+ "tegra",
|
||||
NULL,
|
||||
};
|
||||
|
||||
--
|
||||
2.32.0
|
||||
|
@ -0,0 +1,92 @@
|
||||
From ff4dc8cc8274dc5f6ed11515e05a341e4e2cec28 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Thu, 12 Aug 2021 14:13:23 -0400
|
||||
Subject: [PATCH] backend: Clean up renderer after clutter backendm
|
||||
|
||||
commit c4a73e795020722eda3e2bec0c16d96f9f37333b added
|
||||
code to cleanup the renderer when the meta backend is
|
||||
disposed. Unfortunately, this introduced a crash when
|
||||
the window manager is replaced.
|
||||
|
||||
This is because cleaning up the renderer involves talking
|
||||
to the X server over a display connection that's closed
|
||||
two lines higher as part of the clutter_backend_destroy
|
||||
call.
|
||||
|
||||
This commit fixes the crash by swapping their order.
|
||||
---
|
||||
src/backends/meta-backend.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
|
||||
index ff84bfe6a..7e8b4ee95 100644
|
||||
--- a/src/backends/meta-backend.c
|
||||
+++ b/src/backends/meta-backend.c
|
||||
@@ -216,63 +216,63 @@ meta_backend_dispose (GObject *object)
|
||||
|
||||
if (priv->sleep_signal_id)
|
||||
{
|
||||
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
|
||||
priv->sleep_signal_id = 0;
|
||||
}
|
||||
|
||||
if (priv->upower_watch_id)
|
||||
{
|
||||
g_bus_unwatch_name (priv->upower_watch_id);
|
||||
priv->upower_watch_id = 0;
|
||||
}
|
||||
|
||||
g_cancellable_cancel (priv->cancellable);
|
||||
g_clear_object (&priv->cancellable);
|
||||
g_clear_object (&priv->system_bus);
|
||||
g_clear_object (&priv->upower_proxy);
|
||||
|
||||
g_clear_handle_id (&priv->device_update_idle_id, g_source_remove);
|
||||
|
||||
g_clear_pointer (&priv->device_monitors, g_hash_table_destroy);
|
||||
|
||||
g_clear_object (&priv->settings);
|
||||
|
||||
#ifdef HAVE_PROFILER
|
||||
g_clear_object (&priv->profiler);
|
||||
#endif
|
||||
|
||||
g_clear_pointer (&priv->default_seat, clutter_seat_destroy);
|
||||
g_clear_pointer (&priv->stage, clutter_actor_destroy);
|
||||
- g_clear_pointer (&priv->clutter_backend, clutter_backend_destroy);
|
||||
g_clear_object (&priv->renderer);
|
||||
g_clear_list (&priv->gpus, g_object_unref);
|
||||
+ g_clear_pointer (&priv->clutter_backend, clutter_backend_destroy);
|
||||
|
||||
G_OBJECT_CLASS (meta_backend_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_destroy (MetaBackend *backend)
|
||||
{
|
||||
g_object_run_dispose (G_OBJECT (backend));
|
||||
g_object_unref (backend);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_sync_screen_size (MetaBackend *backend)
|
||||
{
|
||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
int width, height;
|
||||
|
||||
meta_monitor_manager_get_screen_size (priv->monitor_manager, &width, &height);
|
||||
|
||||
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
reset_pointer_position (MetaBackend *backend)
|
||||
{
|
||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
MetaMonitorManager *monitor_manager = priv->monitor_manager;
|
||||
ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
|
||||
MetaLogicalMonitor *primary;
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,144 @@
|
||||
From 651f5e0c6a33d9ac32c2a16735a026153a2ddf38 Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Tue, 14 Jun 2022 16:31:43 +0200
|
||||
Subject: [PATCH] backends: Move MetaKeyboardA11yFlags to a public header
|
||||
|
||||
The MetaKeyboardA11yFlags are used by gnome-shell to show a dialog
|
||||
whenever a keyboard accessibility feature is switched using the
|
||||
keyboard.
|
||||
|
||||
Unfortunately, commit c3acaeb25 renamed the Clutter flag to Meta and
|
||||
moved them to a private header. As a result, gnome-shell do not show any
|
||||
dialog anymore when a keyboard accessibility feature is activated.
|
||||
|
||||
Move the MetaKeyboardA11yFlags definition to a public header so that
|
||||
gnome-shell can use it.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2306
|
||||
Fixes: c3acaeb25 - backends: Move keyboard a11y into backends
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2463>
|
||||
---
|
||||
src/backends/meta-input-settings-private.h | 19 +------
|
||||
src/meta/meson.build | 1 +
|
||||
src/meta/meta-enums.h | 62 ++++++++++++++++++++++
|
||||
3 files changed, 64 insertions(+), 18 deletions(-)
|
||||
create mode 100644 src/meta/meta-enums.h
|
||||
|
||||
diff --git a/src/backends/meta-input-settings-private.h b/src/backends/meta-input-settings-private.h
|
||||
index 42ee0e0e6..5ef54ee84 100644
|
||||
--- a/src/backends/meta-input-settings-private.h
|
||||
+++ b/src/backends/meta-input-settings-private.h
|
||||
@@ -31,29 +31,12 @@
|
||||
#include "backends/meta-backend-types.h"
|
||||
#include "clutter/clutter.h"
|
||||
#include "meta/display.h"
|
||||
+#include "meta/meta-enums.h"
|
||||
|
||||
#define META_TYPE_INPUT_SETTINGS (meta_input_settings_get_type ())
|
||||
G_DECLARE_DERIVABLE_TYPE (MetaInputSettings, meta_input_settings,
|
||||
META, INPUT_SETTINGS, GObject)
|
||||
|
||||
-typedef enum
|
||||
-{
|
||||
- META_A11Y_KEYBOARD_ENABLED = 1 << 0,
|
||||
- META_A11Y_TIMEOUT_ENABLED = 1 << 1,
|
||||
- META_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
|
||||
- META_A11Y_SLOW_KEYS_ENABLED = 1 << 3,
|
||||
- META_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4,
|
||||
- META_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5,
|
||||
- META_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6,
|
||||
- META_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7,
|
||||
- META_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8,
|
||||
- META_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9,
|
||||
- META_A11Y_STICKY_KEYS_ENABLED = 1 << 10,
|
||||
- META_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11,
|
||||
- META_A11Y_STICKY_KEYS_BEEP = 1 << 12,
|
||||
- META_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
|
||||
-} MetaKeyboardA11yFlags;
|
||||
-
|
||||
/**
|
||||
* MetaKbdA11ySettings:
|
||||
*
|
||||
diff --git a/src/meta/meson.build b/src/meta/meson.build
|
||||
index a096ee4dd..4a67abb25 100644
|
||||
--- a/src/meta/meson.build
|
||||
+++ b/src/meta/meson.build
|
||||
@@ -17,6 +17,7 @@ mutter_public_headers = [
|
||||
'meta-close-dialog.h',
|
||||
'meta-cursor-tracker.h',
|
||||
'meta-dnd.h',
|
||||
+ 'meta-enums.h',
|
||||
'meta-idle-monitor.h',
|
||||
'meta-inhibit-shortcuts-dialog.h',
|
||||
'meta-launch-context.h',
|
||||
diff --git a/src/meta/meta-enums.h b/src/meta/meta-enums.h
|
||||
new file mode 100644
|
||||
index 000000000..e59ebaf72
|
||||
--- /dev/null
|
||||
+++ b/src/meta/meta-enums.h
|
||||
@@ -0,0 +1,62 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2016-2021 Red Hat Inc.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifndef META_ENUMS_H
|
||||
+#define META_ENUMS_H
|
||||
+
|
||||
+/**
|
||||
+ * MetaKeyboardA11yFlags:
|
||||
+ * @META_A11Y_KEYBOARD_ENABLED:
|
||||
+ * @META_A11Y_TIMEOUT_ENABLED:
|
||||
+ * @META_A11Y_MOUSE_KEYS_ENABLED:
|
||||
+ * @META_A11Y_SLOW_KEYS_ENABLED:
|
||||
+ * @META_A11Y_SLOW_KEYS_BEEP_PRESS:
|
||||
+ * @META_A11Y_SLOW_KEYS_BEEP_ACCEPT:
|
||||
+ * @META_A11Y_SLOW_KEYS_BEEP_REJECT:
|
||||
+ * @META_A11Y_BOUNCE_KEYS_ENABLED:
|
||||
+ * @META_A11Y_BOUNCE_KEYS_BEEP_REJECT:
|
||||
+ * @META_A11Y_TOGGLE_KEYS_ENABLED:
|
||||
+ * @META_A11Y_STICKY_KEYS_ENABLED:
|
||||
+ * @META_A11Y_STICKY_KEYS_TWO_KEY_OFF:
|
||||
+ * @META_A11Y_STICKY_KEYS_BEEP:
|
||||
+ * @META_A11Y_FEATURE_STATE_CHANGE_BEEP:
|
||||
+ *
|
||||
+ * Keyboard accessibility features.
|
||||
+ *
|
||||
+ */
|
||||
+typedef enum
|
||||
+{
|
||||
+ META_A11Y_KEYBOARD_ENABLED = 1 << 0,
|
||||
+ META_A11Y_TIMEOUT_ENABLED = 1 << 1,
|
||||
+ META_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
|
||||
+ META_A11Y_SLOW_KEYS_ENABLED = 1 << 3,
|
||||
+ META_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4,
|
||||
+ META_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5,
|
||||
+ META_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6,
|
||||
+ META_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7,
|
||||
+ META_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8,
|
||||
+ META_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9,
|
||||
+ META_A11Y_STICKY_KEYS_ENABLED = 1 << 10,
|
||||
+ META_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11,
|
||||
+ META_A11Y_STICKY_KEYS_BEEP = 1 << 12,
|
||||
+ META_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
|
||||
+} MetaKeyboardA11yFlags;
|
||||
+
|
||||
+#endif /* META_ENUMS_H */
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,34 @@
|
||||
From ba25271408a32a2a73a82acc6e094a611001c9f0 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Fri, 16 Dec 2022 23:06:33 +0100
|
||||
Subject: [PATCH] backends: Only apply EDID-based tablet mapping heuristic on
|
||||
integrated devices
|
||||
|
||||
These are the ones attached to a display, thus they are the ones that may need
|
||||
help from this heuristic. Non-integrated tablets (e.g. Intuos) will default to
|
||||
the span of all monitors.
|
||||
|
||||
Fixes mapping of opaque tablets if a display-integrated tablet of the same
|
||||
brand is also plugged in.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2767>
|
||||
---
|
||||
src/backends/meta-input-mapper.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/meta-input-mapper.c b/src/backends/meta-input-mapper.c
|
||||
index cc75f14e8..71d193e5f 100644
|
||||
--- a/src/backends/meta-input-mapper.c
|
||||
+++ b/src/backends/meta-input-mapper.c
|
||||
@@ -455,7 +455,7 @@ guess_candidates (MetaInputMapper *mapper,
|
||||
|
||||
g_assert (META_IS_MONITOR (l->data));
|
||||
|
||||
- if (match_edid (input, l->data, &edid_match))
|
||||
+ if (integrated && match_edid (input, l->data, &edid_match))
|
||||
match.score |= 1 << edid_match;
|
||||
|
||||
if (integrated && match_size (input, l->data))
|
||||
--
|
||||
2.38.1
|
||||
|
@ -0,0 +1,260 @@
|
||||
From a1f33bdac95ba4fd0599f164ef893c05d8be123b Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Wed, 6 Oct 2021 15:31:30 -0400
|
||||
Subject: [PATCH] backends/x11: Fix key repeat of on-screen keyboard for second
|
||||
level keysyms
|
||||
|
||||
Certains keys (such as ~ and |) are in the keyboard map behind the
|
||||
second shift level. This means in order for them to be input, the
|
||||
shift key needs to be held down by the user.
|
||||
|
||||
The GNOME Shell on-screen keyboard presents these keys separately on
|
||||
a page of keys that has no shift key. Instead, it relies on mutter
|
||||
to set a shift latch before the key event is emitted. A shift latch
|
||||
is a virtual press of the shift key that automatically gets released
|
||||
after the next key press (in our case the ~ or | key).
|
||||
|
||||
The problem is using a shift latch doesn't work very well in the face
|
||||
of key repeat. The latch is automatically released after the first
|
||||
press, and subsequent repeats of that press no longer have shift
|
||||
latched to them.
|
||||
|
||||
This commit fixes the problem by using a shift lock instead of a shift
|
||||
latch. A shift lock is never implicitly released, so it remains
|
||||
in place for the duration of key repeat.
|
||||
---
|
||||
src/backends/x11/meta-keymap-x11.c | 12 ++++++------
|
||||
src/backends/x11/meta-keymap-x11.h | 6 +++---
|
||||
src/backends/x11/meta-virtual-input-device-x11.c | 4 ++--
|
||||
3 files changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/backends/x11/meta-keymap-x11.c b/src/backends/x11/meta-keymap-x11.c
|
||||
index da5d064e7..1192cc387 100644
|
||||
--- a/src/backends/x11/meta-keymap-x11.c
|
||||
+++ b/src/backends/x11/meta-keymap-x11.c
|
||||
@@ -829,85 +829,85 @@ meta_keymap_x11_reserve_keycode (MetaKeymapX11 *keymap_x11,
|
||||
g_warning ("Cannot reserve a keycode for keyval %d: no available keycode", keyval);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!meta_keymap_x11_replace_keycode (keymap_x11, *keycode_out, keyval))
|
||||
{
|
||||
g_warning ("Failed to remap keycode %d to keyval %d", *keycode_out, keyval);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_hash_table_insert (keymap_x11->reserved_keycodes, GUINT_TO_POINTER (*keycode_out), GUINT_TO_POINTER (keyval));
|
||||
g_queue_remove (keymap_x11->available_keycodes, GUINT_TO_POINTER (*keycode_out));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_keymap_x11_release_keycode_if_needed (MetaKeymapX11 *keymap_x11,
|
||||
uint32_t keycode)
|
||||
{
|
||||
g_return_if_fail (META_IS_KEYMAP_X11 (keymap_x11));
|
||||
|
||||
if (!g_hash_table_contains (keymap_x11->reserved_keycodes, GUINT_TO_POINTER (keycode)) ||
|
||||
g_queue_index (keymap_x11->available_keycodes, GUINT_TO_POINTER (keycode)) != -1)
|
||||
return;
|
||||
|
||||
g_queue_push_tail (keymap_x11->available_keycodes, GUINT_TO_POINTER (keycode));
|
||||
}
|
||||
|
||||
void
|
||||
-meta_keymap_x11_latch_modifiers (MetaKeymapX11 *keymap_x11,
|
||||
- uint32_t level,
|
||||
- gboolean enable)
|
||||
+meta_keymap_x11_lock_modifiers (MetaKeymapX11 *keymap_x11,
|
||||
+ uint32_t level,
|
||||
+ gboolean enable)
|
||||
{
|
||||
uint32_t modifiers[] = {
|
||||
0,
|
||||
ShiftMask,
|
||||
keymap_x11->level3_shift_mask,
|
||||
keymap_x11->level3_shift_mask | ShiftMask,
|
||||
};
|
||||
uint32_t value = 0;
|
||||
|
||||
if (!keymap_x11->use_xkb)
|
||||
return;
|
||||
|
||||
level = CLAMP (level, 0, G_N_ELEMENTS (modifiers) - 1);
|
||||
|
||||
if (enable)
|
||||
value = modifiers[level];
|
||||
else
|
||||
value = 0;
|
||||
|
||||
- XkbLatchModifiers (clutter_x11_get_default_display (),
|
||||
- XkbUseCoreKbd, modifiers[level],
|
||||
- value);
|
||||
+ XkbLockModifiers (clutter_x11_get_default_display (),
|
||||
+ XkbUseCoreKbd, modifiers[level],
|
||||
+ value);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
meta_keymap_x11_get_current_group (MetaKeymapX11 *keymap_x11)
|
||||
{
|
||||
XkbStateRec state_rec;
|
||||
|
||||
if (keymap_x11->current_group >= 0)
|
||||
return keymap_x11->current_group;
|
||||
|
||||
XkbGetState (clutter_x11_get_default_display (),
|
||||
XkbUseCoreKbd, &state_rec);
|
||||
return XkbStateGroup (&state_rec);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_keymap_x11_keycode_for_keyval (MetaKeymapX11 *keymap_x11,
|
||||
uint32_t keyval,
|
||||
uint32_t *keycode_out,
|
||||
uint32_t *level_out)
|
||||
{
|
||||
ClutterKeymapKey *keys;
|
||||
int i, n_keys, group;
|
||||
gboolean found = FALSE;
|
||||
|
||||
g_return_val_if_fail (keycode_out != NULL, FALSE);
|
||||
g_return_val_if_fail (level_out != NULL, FALSE);
|
||||
|
||||
group = meta_keymap_x11_get_current_group (keymap_x11);
|
||||
|
||||
diff --git a/src/backends/x11/meta-keymap-x11.h b/src/backends/x11/meta-keymap-x11.h
|
||||
index 67a5f8eb9..2f93acdbc 100644
|
||||
--- a/src/backends/x11/meta-keymap-x11.h
|
||||
+++ b/src/backends/x11/meta-keymap-x11.h
|
||||
@@ -17,45 +17,45 @@
|
||||
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
|
||||
*/
|
||||
|
||||
#ifndef META_KEYMAP_X11_H
|
||||
#define META_KEYMAP_X11_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <pango/pango.h>
|
||||
|
||||
#include "clutter/clutter.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define META_TYPE_KEYMAP_X11 (meta_keymap_x11_get_type ())
|
||||
G_DECLARE_FINAL_TYPE (MetaKeymapX11, meta_keymap_x11,
|
||||
META, KEYMAP_X11, ClutterKeymap)
|
||||
|
||||
int meta_keymap_x11_get_key_group (MetaKeymapX11 *keymap,
|
||||
ClutterModifierType state);
|
||||
int meta_keymap_x11_translate_key_state (MetaKeymapX11 *keymap,
|
||||
guint hardware_keycode,
|
||||
ClutterModifierType *modifier_state_p,
|
||||
ClutterModifierType *mods_p);
|
||||
gboolean meta_keymap_x11_get_is_modifier (MetaKeymapX11 *keymap,
|
||||
int keycode);
|
||||
|
||||
gboolean meta_keymap_x11_keycode_for_keyval (MetaKeymapX11 *keymap_x11,
|
||||
guint keyval,
|
||||
guint *keycode_out,
|
||||
guint *level_out);
|
||||
-void meta_keymap_x11_latch_modifiers (MetaKeymapX11 *keymap_x11,
|
||||
- uint32_t level,
|
||||
- gboolean enable);
|
||||
+void meta_keymap_x11_lock_modifiers (MetaKeymapX11 *keymap_x11,
|
||||
+ uint32_t level,
|
||||
+ gboolean enable);
|
||||
gboolean meta_keymap_x11_reserve_keycode (MetaKeymapX11 *keymap_x11,
|
||||
guint keyval,
|
||||
guint *keycode_out);
|
||||
void meta_keymap_x11_release_keycode_if_needed (MetaKeymapX11 *keymap_x11,
|
||||
guint keycode);
|
||||
|
||||
gboolean meta_keymap_x11_handle_event (MetaKeymapX11 *keymap_x11,
|
||||
XEvent *xevent);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* META_KEYMAP_X11_H */
|
||||
diff --git a/src/backends/x11/meta-virtual-input-device-x11.c b/src/backends/x11/meta-virtual-input-device-x11.c
|
||||
index fe6040859..1a5cdfc2e 100644
|
||||
--- a/src/backends/x11/meta-virtual-input-device-x11.c
|
||||
+++ b/src/backends/x11/meta-virtual-input-device-x11.c
|
||||
@@ -159,71 +159,71 @@ meta_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_dev
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||
key + 8, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
uint32_t keyval,
|
||||
ClutterKeyState key_state)
|
||||
{
|
||||
ClutterBackend *backend = clutter_get_default_backend ();
|
||||
ClutterSeat *seat = clutter_backend_get_default_seat (backend);
|
||||
MetaKeymapX11 *keymap = META_KEYMAP_X11 (clutter_seat_get_keymap (seat));
|
||||
uint32_t keycode, level;
|
||||
|
||||
if (!meta_keymap_x11_keycode_for_keyval (keymap, keyval, &keycode, &level))
|
||||
{
|
||||
level = 0;
|
||||
|
||||
if (!meta_keymap_x11_reserve_keycode (keymap, keyval, &keycode))
|
||||
{
|
||||
g_warning ("No keycode found for keyval %x in current group", keyval);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!meta_keymap_x11_get_is_modifier (keymap, keycode) &&
|
||||
key_state == CLUTTER_KEY_STATE_PRESSED)
|
||||
- meta_keymap_x11_latch_modifiers (keymap, level, TRUE);
|
||||
+ meta_keymap_x11_lock_modifiers (keymap, level, TRUE);
|
||||
|
||||
XTestFakeKeyEvent (clutter_x11_get_default_display (),
|
||||
(KeyCode) keycode,
|
||||
key_state == CLUTTER_KEY_STATE_PRESSED, 0);
|
||||
|
||||
|
||||
if (key_state == CLUTTER_KEY_STATE_RELEASED)
|
||||
{
|
||||
if (!meta_keymap_x11_get_is_modifier (keymap, keycode))
|
||||
- meta_keymap_x11_latch_modifiers (keymap, level, FALSE);
|
||||
+ meta_keymap_x11_lock_modifiers (keymap, level, FALSE);
|
||||
meta_keymap_x11_release_keycode_if_needed (keymap, keycode);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_virtual_input_device_x11_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
int device_slot,
|
||||
double x,
|
||||
double y)
|
||||
{
|
||||
g_warning ("Virtual touch motion not implemented under X11");
|
||||
}
|
||||
|
||||
static void
|
||||
meta_virtual_input_device_x11_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
int device_slot,
|
||||
double x,
|
||||
double y)
|
||||
{
|
||||
g_warning ("Virtual touch motion not implemented under X11");
|
||||
}
|
||||
|
||||
static void
|
||||
meta_virtual_input_device_x11_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
|
||||
uint64_t time_us,
|
||||
int device_slot)
|
||||
{
|
||||
g_warning ("Virtual touch motion not implemented under X11");
|
||||
--
|
||||
2.33.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 28030178d7682ce5be03cb7273365ab628065871 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Mon, 27 Sep 2021 20:37:30 +0200
|
||||
Subject: [PATCH] clutter: Make ClutterClickAction independent of click count
|
||||
|
||||
This will trigger for every button press/release that is obtained,
|
||||
regardless of the click count.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2024>
|
||||
---
|
||||
clutter/clutter/clutter-click-action.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
diff --git a/clutter/clutter/clutter-click-action.c b/clutter/clutter/clutter-click-action.c
|
||||
index 45d87e809..266b6da92 100644
|
||||
--- a/clutter/clutter/clutter-click-action.c
|
||||
+++ b/clutter/clutter/clutter-click-action.c
|
||||
@@ -306,9 +306,6 @@ on_event (ClutterActor *actor,
|
||||
case CLUTTER_TOUCH_BEGIN:
|
||||
has_button = FALSE;
|
||||
case CLUTTER_BUTTON_PRESS:
|
||||
- if (has_button && clutter_event_get_click_count (event) != 1)
|
||||
- return CLUTTER_EVENT_PROPAGATE;
|
||||
-
|
||||
if (priv->is_held)
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
@@ -386,7 +383,6 @@ on_captured_event (ClutterActor *stage,
|
||||
return CLUTTER_EVENT_STOP;
|
||||
|
||||
if ((has_button && clutter_event_get_button (event) != priv->press_button) ||
|
||||
- (has_button && clutter_event_get_click_count (event) != 1) ||
|
||||
clutter_event_get_device (event) != priv->press_device ||
|
||||
clutter_event_get_event_sequence (event) != priv->press_sequence)
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 5cd66485cdd99068dab0f57d7f64d3ef294b0037 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 4 Aug 2021 19:30:10 +0200
|
||||
Subject: [PATCH] clutter/text: Don't query preferred size without allocation
|
||||
|
||||
The size request functions query the resource scale, which hits
|
||||
an assert if headless. The returned sizes are already only used
|
||||
when clutter_actor_has_allocation() is true, so this doesn't
|
||||
change the condition for calling either redraw or relayout.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4522
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1956>
|
||||
---
|
||||
clutter/clutter/clutter-text.c | 17 +++++++++++------
|
||||
1 file changed, 11 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c
|
||||
index 45c7eac56b..80e53ea32f 100644
|
||||
--- a/clutter/clutter/clutter-text.c
|
||||
+++ b/clutter/clutter/clutter-text.c
|
||||
@@ -4797,16 +4797,21 @@ static void
|
||||
clutter_text_queue_redraw_or_relayout (ClutterText *self)
|
||||
{
|
||||
ClutterActor *actor = CLUTTER_ACTOR (self);
|
||||
- gfloat preferred_width;
|
||||
- gfloat preferred_height;
|
||||
+ float preferred_width = -1.;
|
||||
+ float preferred_height = -1.;
|
||||
|
||||
clutter_text_dirty_cache (self);
|
||||
|
||||
- /* we're using our private implementations here to avoid the caching done by ClutterActor */
|
||||
- clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width);
|
||||
- clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height);
|
||||
+ if (clutter_actor_has_allocation (actor))
|
||||
+ {
|
||||
+ /* we're using our private implementations here to avoid the caching done by ClutterActor */
|
||||
+ clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width);
|
||||
+ clutter_text_get_preferred_height (actor, preferred_width, NULL,
|
||||
+ &preferred_height);
|
||||
+ }
|
||||
|
||||
- if (clutter_actor_has_allocation (actor) &&
|
||||
+ if (preferred_width > 0 &&
|
||||
+ preferred_height > 0 &&
|
||||
fabsf (preferred_width - clutter_actor_get_width (actor)) <= 0.001 &&
|
||||
fabsf (preferred_height - clutter_actor_get_height (actor)) <= 0.001)
|
||||
clutter_text_queue_redraw (actor);
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,85 @@
|
||||
From 1ab51efc968d7d3c6244d9b7efcdf4bae4fc0a9d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 12 Mar 2014 02:04:13 +0100
|
||||
Subject: [PATCH] constraints: Enforce X11 size limits
|
||||
|
||||
X11 limits windows to a maximum of 32767x32767, enforce that restriction
|
||||
to keep insanely huge windows from crashing the WM.
|
||||
---
|
||||
src/core/constraints.c | 42 ++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 42 insertions(+)
|
||||
|
||||
diff --git a/src/core/constraints.c b/src/core/constraints.c
|
||||
index 4b1d95338a..eee16dc48f 100644
|
||||
--- a/src/core/constraints.c
|
||||
+++ b/src/core/constraints.c
|
||||
@@ -109,6 +109,7 @@ typedef enum
|
||||
PRIORITY_TITLEBAR_VISIBLE = 4,
|
||||
PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
|
||||
PRIORITY_CUSTOM_RULE = 4,
|
||||
+ PRIORITY_XLIMITS = 4,
|
||||
PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
|
||||
} ConstraintPriority;
|
||||
|
||||
@@ -204,6 +205,10 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only);
|
||||
+static gboolean constrain_xlimits (MetaWindow *window,
|
||||
+ ConstraintInfo *info,
|
||||
+ ConstraintPriority priority,
|
||||
+ gboolean check_only);
|
||||
|
||||
static void setup_constraint_info (ConstraintInfo *info,
|
||||
MetaWindow *window,
|
||||
@@ -239,6 +244,7 @@ static const Constraint all_constraints[] = {
|
||||
{constrain_fully_onscreen, "constrain_fully_onscreen"},
|
||||
{constrain_titlebar_visible, "constrain_titlebar_visible"},
|
||||
{constrain_partially_onscreen, "constrain_partially_onscreen"},
|
||||
+ {constrain_xlimits, "constrain_xlimits"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
@@ -1876,3 +1882,39 @@ constrain_partially_onscreen (MetaWindow *window,
|
||||
|
||||
return retval;
|
||||
}
|
||||
+
|
||||
+
|
||||
+#define MAX_WINDOW_SIZE 32767
|
||||
+
|
||||
+static gboolean
|
||||
+constrain_xlimits (MetaWindow *window,
|
||||
+ ConstraintInfo *info,
|
||||
+ ConstraintPriority priority,
|
||||
+ gboolean check_only)
|
||||
+{
|
||||
+ int max_w, max_h;
|
||||
+ gboolean constraint_already_satisfied;
|
||||
+
|
||||
+ if (priority > PRIORITY_XLIMITS)
|
||||
+ return TRUE;
|
||||
+
|
||||
+ max_w = max_h = MAX_WINDOW_SIZE;
|
||||
+
|
||||
+ if (window->frame)
|
||||
+ {
|
||||
+ MetaFrameBorders borders;
|
||||
+ meta_frame_calc_borders (window->frame, &borders);
|
||||
+
|
||||
+ max_w -= (borders.total.left + borders.total.right);
|
||||
+ max_h -= (borders.total.top + borders.total.bottom);
|
||||
+ }
|
||||
+
|
||||
+ constraint_already_satisfied = info->current.width < max_w && info->current.height < max_h;
|
||||
+ if (check_only || constraint_already_satisfied)
|
||||
+ return constraint_already_satisfied;
|
||||
+
|
||||
+ info->current.width = MIN (info->current.width, max_w);
|
||||
+ info->current.height = MIN (info->current.height, max_h);
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 7ac5b7bad8f2d0e61700610f68282f6687cc9d2e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 21 Jul 2016 15:43:12 +0200
|
||||
Subject: [PATCH] events: Don't move (sloppy) focus while buttons are pressed
|
||||
|
||||
(https://bugzilla.redhat.com/show_bug.cgi?id=1358535)
|
||||
---
|
||||
src/x11/events.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/x11/events.c b/src/x11/events.c
|
||||
index efa8f9856b..388eff0ac7 100644
|
||||
--- a/src/x11/events.c
|
||||
+++ b/src/x11/events.c
|
||||
@@ -839,6 +839,16 @@ crossing_serial_is_ignored (MetaX11Display *x11_display,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+event_has_button_mask (XIEnterEvent *enter_event)
|
||||
+{
|
||||
+ int i;
|
||||
+ for (i = 0; i < enter_event->buttons.mask_len; i++)
|
||||
+ if (enter_event->buttons.mask[i] != '\0')
|
||||
+ return TRUE;
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
handle_input_xevent (MetaX11Display *x11_display,
|
||||
XIEvent *input_event,
|
||||
@@ -883,6 +893,7 @@ handle_input_xevent (MetaX11Display *x11_display,
|
||||
* avoid races.
|
||||
*/
|
||||
if (window && !crossing_serial_is_ignored (x11_display, serial) &&
|
||||
+ !event_has_button_mask (enter_event) &&
|
||||
enter_event->mode != XINotifyGrab &&
|
||||
enter_event->mode != XINotifyUngrab &&
|
||||
enter_event->detail != XINotifyInferior &&
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 65ffd7e4df42cd62633f93107644f87208881578 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Thu, 14 Apr 2022 18:07:41 +0200
|
||||
Subject: [PATCH] events: Pass CurrentTime to XIAllowEvents() when unfreezing
|
||||
pointer
|
||||
|
||||
---
|
||||
src/core/events.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/core/events.c b/src/core/events.c
|
||||
index 0dc3a73222..dd9b4ec981 100644
|
||||
--- a/src/core/events.c
|
||||
+++ b/src/core/events.c
|
||||
@@ -205,7 +205,7 @@ maybe_unfreeze_pointer_events (MetaBackend *backend,
|
||||
}
|
||||
|
||||
xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
- XIAllowEvents (xdisplay, device_id, event_mode, event->button.time);
|
||||
+ XIAllowEvents (xdisplay, device_id, event_mode, CurrentTime);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From 168a47c9ebefaeca6cc25fcbc0d41ac50c16f400 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Wed, 1 Feb 2023 10:07:53 +0100
|
||||
Subject: [PATCH] gpu/kms: Report that we can have outputs if we have
|
||||
connectors
|
||||
|
||||
As part of https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/525
|
||||
(introduction of transactional KMS API), the logic determining whether a
|
||||
GPU can have outputs was changed from whether any connectors existed to
|
||||
whether any connected connectors existed. That effectively meant that we
|
||||
wouldn't attempt to start at all if there were no monitors connected
|
||||
while starting up.
|
||||
|
||||
This was unintentional, so lets revert back the expected behavior.
|
||||
---
|
||||
src/backends/native/meta-gpu-kms.c | 13 +------------
|
||||
1 file changed, 1 insertion(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
|
||||
index e81c90a022..2756bddb26 100644
|
||||
--- a/src/backends/native/meta-gpu-kms.c
|
||||
+++ b/src/backends/native/meta-gpu-kms.c
|
||||
@@ -399,18 +399,7 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
|
||||
gboolean
|
||||
meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms)
|
||||
{
|
||||
- GList *l;
|
||||
- int n_connected_connectors = 0;
|
||||
-
|
||||
- for (l = meta_kms_device_get_connectors (gpu_kms->kms_device); l; l = l->next)
|
||||
- {
|
||||
- MetaKmsConnector *kms_connector = l->data;
|
||||
-
|
||||
- if (meta_kms_connector_get_current_state (kms_connector))
|
||||
- n_connected_connectors++;
|
||||
- }
|
||||
-
|
||||
- return n_connected_connectors > 0;
|
||||
+ return !!meta_kms_device_get_connectors (gpu_kms->kms_device);
|
||||
}
|
||||
|
||||
MetaGpuKms *
|
||||
--
|
||||
2.39.1
|
||||
|
@ -0,0 +1,193 @@
|
||||
From af0460d0cedd5a66b2110ab2a99e67c647e7b6fb Mon Sep 17 00:00:00 2001
|
||||
From: Piotr Lopatka <piotr.lopatka@gmail.com>
|
||||
Date: Fri, 3 Sep 2021 19:39:12 +0100
|
||||
Subject: [PATCH 1/2] kms: Allow passing framebuffer damage metadata
|
||||
|
||||
This commit adds support to atomic KMS backend for optional plane property
|
||||
prop_fb_damage_clips. Some drivers (e.g. EVDI) take advantage of this
|
||||
property and process only updated regions of the screen instead of
|
||||
processing the full frame. This can save system resources.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1879>
|
||||
---
|
||||
.../native/meta-kms-impl-device-atomic.c | 28 +++++++++++++++
|
||||
src/backends/native/meta-kms-plane-private.h | 1 +
|
||||
src/backends/native/meta-kms-plane.c | 5 +++
|
||||
src/backends/native/meta-kms-update-private.h | 7 ++++
|
||||
src/backends/native/meta-kms-update.c | 35 +++++++++++++++++++
|
||||
src/backends/native/meta-kms-update.h | 4 +++
|
||||
6 files changed, 80 insertions(+)
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-impl-device-atomic.c b/src/backends/native/meta-kms-impl-device-atomic.c
|
||||
index 8e41207ee14..674a24902bd 100644
|
||||
--- a/src/backends/native/meta-kms-impl-device-atomic.c
|
||||
+++ b/src/backends/native/meta-kms-impl-device-atomic.c
|
||||
@@ -416,6 +416,8 @@ process_plane_assignment (MetaKmsImplDevice *impl_device,
|
||||
MetaKmsPlaneAssignment *plane_assignment = update_entry;
|
||||
MetaKmsPlane *plane = plane_assignment->plane;
|
||||
MetaDrmBuffer *buffer;
|
||||
+ MetaKmsFbDamage *fb_damage;
|
||||
+ uint32_t prop_id;
|
||||
|
||||
buffer = plane_assignment->buffer;
|
||||
|
||||
@@ -539,6 +541,32 @@ process_plane_assignment (MetaKmsImplDevice *impl_device,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
+ fb_damage = plane_assignment->fb_damage;
|
||||
+ if (fb_damage &&
|
||||
+ meta_kms_plane_get_prop_id (plane,
|
||||
+ META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID))
|
||||
+ {
|
||||
+ meta_topic (META_DEBUG_KMS,
|
||||
+ "[atomic] Setting %d damage clips on %u",
|
||||
+ fb_damage->n_rects,
|
||||
+ meta_kms_plane_get_id (plane));
|
||||
+
|
||||
+ prop_id = store_new_blob (impl_device,
|
||||
+ blob_ids,
|
||||
+ fb_damage->rects,
|
||||
+ fb_damage->n_rects *
|
||||
+ sizeof (struct drm_mode_rect),
|
||||
+ error);
|
||||
+ if (!prop_id)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (!add_plane_property (impl_device,
|
||||
+ plane, req,
|
||||
+ META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID,
|
||||
+ prop_id,
|
||||
+ error))
|
||||
+ return FALSE;
|
||||
+ }
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-plane-private.h b/src/backends/native/meta-kms-plane-private.h
|
||||
index 92f9cfcc9aa..f735c8da8f6 100644
|
||||
--- a/src/backends/native/meta-kms-plane-private.h
|
||||
+++ b/src/backends/native/meta-kms-plane-private.h
|
||||
@@ -41,6 +41,7 @@ typedef enum _MetaKmsPlaneProp
|
||||
META_KMS_PLANE_PROP_CRTC_H,
|
||||
META_KMS_PLANE_PROP_FB_ID,
|
||||
META_KMS_PLANE_PROP_CRTC_ID,
|
||||
+ META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID,
|
||||
META_KMS_PLANE_N_PROPS
|
||||
} MetaKmsPlaneProp;
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-plane.c b/src/backends/native/meta-kms-plane.c
|
||||
index 73fab7d8f80..3cb58764ff3 100644
|
||||
--- a/src/backends/native/meta-kms-plane.c
|
||||
+++ b/src/backends/native/meta-kms-plane.c
|
||||
@@ -446,6 +446,11 @@ init_properties (MetaKmsPlane *plane,
|
||||
.name = "CRTC_ID",
|
||||
.type = DRM_MODE_PROP_OBJECT,
|
||||
},
|
||||
+ [META_KMS_PLANE_PROP_FB_DAMAGE_CLIPS_ID] =
|
||||
+ {
|
||||
+ .name = "FB_DAMAGE_CLIPS",
|
||||
+ .type = DRM_MODE_PROP_BLOB,
|
||||
+ },
|
||||
}
|
||||
};
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-update-private.h b/src/backends/native/meta-kms-update-private.h
|
||||
index 22491ece2d5..c89622d09a5 100644
|
||||
--- a/src/backends/native/meta-kms-update-private.h
|
||||
+++ b/src/backends/native/meta-kms-update-private.h
|
||||
@@ -34,6 +34,12 @@ typedef struct _MetaKmsFeedback
|
||||
GError *error;
|
||||
} MetaKmsFeedback;
|
||||
|
||||
+typedef struct _MetaKmsFbDamage
|
||||
+{
|
||||
+ struct drm_mode_rect *rects;
|
||||
+ int n_rects;
|
||||
+} MetaKmsFbDamage;
|
||||
+
|
||||
typedef struct _MetaKmsPlaneAssignment
|
||||
{
|
||||
MetaKmsUpdate *update;
|
||||
@@ -43,6 +49,7 @@ typedef struct _MetaKmsPlaneAssignment
|
||||
MetaFixed16Rectangle src_rect;
|
||||
MetaRectangle dst_rect;
|
||||
MetaKmsAssignPlaneFlag flags;
|
||||
+ MetaKmsFbDamage *fb_damage;
|
||||
|
||||
uint64_t rotation;
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-update.c b/src/backends/native/meta-kms-update.c
|
||||
index be6eaefcc2c..71e5b423fb7 100644
|
||||
--- a/src/backends/native/meta-kms-update.c
|
||||
+++ b/src/backends/native/meta-kms-update.c
|
||||
@@ -129,9 +129,17 @@ meta_kms_feedback_get_error (const MetaKmsFeedback *feedback)
|
||||
return feedback->error;
|
||||
}
|
||||
|
||||
+static void
|
||||
+meta_kms_fb_damage_free (MetaKmsFbDamage *fb_damage)
|
||||
+{
|
||||
+ g_free (fb_damage->rects);
|
||||
+ g_free (fb_damage);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_kms_plane_assignment_free (MetaKmsPlaneAssignment *plane_assignment)
|
||||
{
|
||||
+ g_clear_pointer (&plane_assignment->fb_damage, meta_kms_fb_damage_free);
|
||||
g_free (plane_assignment);
|
||||
}
|
||||
|
||||
@@ -456,6 +464,33 @@ meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update,
|
||||
update->custom_page_flip = custom_page_flip;
|
||||
}
|
||||
|
||||
+void
|
||||
+meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||
+ const int *rectangles,
|
||||
+ int n_rectangles)
|
||||
+{
|
||||
+ MetaKmsFbDamage *fb_damage;
|
||||
+ struct drm_mode_rect *mode_rects;
|
||||
+ int i;
|
||||
+
|
||||
+ mode_rects = g_new0 (struct drm_mode_rect, n_rectangles);
|
||||
+ for (i = 0; i < n_rectangles; ++i)
|
||||
+ {
|
||||
+ mode_rects[i].x1 = rectangles[i * 4];
|
||||
+ mode_rects[i].y1 = rectangles[i * 4 + 1];
|
||||
+ mode_rects[i].x2 = mode_rects[i].x1 + rectangles[i * 4 + 2];
|
||||
+ mode_rects[i].y2 = mode_rects[i].y1 + rectangles[i * 4 + 3];
|
||||
+ }
|
||||
+
|
||||
+ fb_damage = g_new0 (MetaKmsFbDamage, 1);
|
||||
+ *fb_damage = (MetaKmsFbDamage) {
|
||||
+ .rects = mode_rects,
|
||||
+ .n_rects = n_rectangles,
|
||||
+ };
|
||||
+
|
||||
+ plane_assignment->fb_damage = fb_damage;
|
||||
+}
|
||||
+
|
||||
void
|
||||
meta_kms_plane_assignment_set_rotation (MetaKmsPlaneAssignment *plane_assignment,
|
||||
uint64_t rotation)
|
||||
diff --git a/src/backends/native/meta-kms-update.h b/src/backends/native/meta-kms-update.h
|
||||
index 4a6a8bb4373..e63b6d8711d 100644
|
||||
--- a/src/backends/native/meta-kms-update.h
|
||||
+++ b/src/backends/native/meta-kms-update.h
|
||||
@@ -115,6 +115,10 @@ void meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
|
||||
const uint16_t *green,
|
||||
const uint16_t *blue);
|
||||
|
||||
+void meta_kms_plane_assignment_set_fb_damage (MetaKmsPlaneAssignment *plane_assignment,
|
||||
+ const int *rectangles,
|
||||
+ int n_rectangles);
|
||||
+
|
||||
MetaKmsPlaneAssignment * meta_kms_update_assign_plane (MetaKmsUpdate *update,
|
||||
MetaKmsCrtc *crtc,
|
||||
MetaKmsPlane *plane,
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From de3188fcc6863b8a6e3d2443a00cf3b00f6f26ff Mon Sep 17 00:00:00 2001
|
||||
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
Date: Tue, 12 Apr 2022 18:34:58 +0800
|
||||
Subject: [PATCH 1/2] kms/crtc: Add function meta_kms_crtc_has_gamma
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2360>
|
||||
---
|
||||
src/backends/native/meta-kms-crtc.c | 7 +++++++
|
||||
src/backends/native/meta-kms-crtc.h | 3 +++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
|
||||
index 51d040b44..24f5a2d74 100644
|
||||
--- a/src/backends/native/meta-kms-crtc.c
|
||||
+++ b/src/backends/native/meta-kms-crtc.c
|
||||
@@ -92,6 +92,13 @@ meta_kms_crtc_is_active (MetaKmsCrtc *crtc)
|
||||
return crtc->current_state.is_active;
|
||||
}
|
||||
|
||||
+
|
||||
+gboolean
|
||||
+meta_kms_crtc_has_gamma (MetaKmsCrtc *crtc)
|
||||
+{
|
||||
+ return !!meta_kms_crtc_get_prop_id (crtc, META_KMS_CRTC_PROP_GAMMA_LUT);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
read_gamma_state (MetaKmsCrtc *crtc,
|
||||
MetaKmsImplDevice *impl_device,
|
||||
diff --git a/src/backends/native/meta-kms-crtc.h b/src/backends/native/meta-kms-crtc.h
|
||||
index 406ca3ac1..cbaeaa280 100644
|
||||
--- a/src/backends/native/meta-kms-crtc.h
|
||||
+++ b/src/backends/native/meta-kms-crtc.h
|
||||
@@ -66,6 +66,9 @@ uint32_t meta_kms_crtc_get_id (MetaKmsCrtc *crtc);
|
||||
|
||||
int meta_kms_crtc_get_idx (MetaKmsCrtc *crtc);
|
||||
|
||||
+
|
||||
+gboolean meta_kms_crtc_has_gamma (MetaKmsCrtc *crtc);
|
||||
+
|
||||
gboolean meta_kms_crtc_is_active (MetaKmsCrtc *crtc);
|
||||
|
||||
void meta_kms_crtc_gamma_free (MetaKmsCrtcGamma *gamma);
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,49 @@
|
||||
From 99c74360451a85fca9dacad531ed22adbc1b0805 Mon Sep 17 00:00:00 2001
|
||||
From: Ray Strode <rstrode@redhat.com>
|
||||
Date: Tue, 13 Feb 2018 09:44:50 -0500
|
||||
Subject: [PATCH] main: be more aggressive in assuming X11 backend
|
||||
|
||||
If the session is started by vncserver right now, the
|
||||
XDG_SESSION_TYPE won't be X11. Ideally that would be
|
||||
fixed, but for backward compatibility we should default
|
||||
to X11 if the session type isn't set to wayland explicitly.
|
||||
---
|
||||
src/core/main.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/core/main.c b/src/core/main.c
|
||||
index a07dda9ecc..0d241f952b 100644
|
||||
--- a/src/core/main.c
|
||||
+++ b/src/core/main.c
|
||||
@@ -407,7 +407,6 @@ find_session_type (void)
|
||||
char *session_id;
|
||||
char *session_type;
|
||||
const char *session_type_env;
|
||||
- gboolean is_tty = FALSE;
|
||||
int ret, i;
|
||||
|
||||
ret = sd_pid_get_session (0, &session_id);
|
||||
@@ -420,8 +419,7 @@ find_session_type (void)
|
||||
{
|
||||
if (session_type_is_supported (session_type))
|
||||
goto out;
|
||||
- else
|
||||
- is_tty = g_strcmp0 (session_type, "tty") == 0;
|
||||
+
|
||||
free (session_type);
|
||||
}
|
||||
}
|
||||
@@ -453,8 +451,8 @@ find_session_type (void)
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /* Legacy support for starting through xinit */
|
||||
- if (is_tty && (g_getenv ("MUTTER_DISPLAY") || g_getenv ("DISPLAY")))
|
||||
+ /* Legacy support for starting through xinit or vncserver */
|
||||
+ if (g_getenv ("MUTTER_DISPLAY") || g_getenv ("DISPLAY"))
|
||||
{
|
||||
session_type = strdup ("x11");
|
||||
goto out;
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,218 @@
|
||||
From f21c8614daeb70a021c128b97c000a92652cf6f8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Thu, 24 Feb 2022 12:32:27 +0100
|
||||
Subject: [PATCH] monitor-manager: Add NightLightSupported property to
|
||||
DisplayConfig
|
||||
|
||||
This checks whether it's possible to set a CRTC GAMMA_LUT, which is what
|
||||
is necessary to implement night light.
|
||||
---
|
||||
src/backends/meta-monitor-manager.c | 76 ++++++++++++++++---
|
||||
.../native/meta-monitor-manager-native.c | 25 ++++--
|
||||
.../x11/meta-monitor-manager-xrandr.c | 9 ++-
|
||||
src/org.gnome.Mutter.DisplayConfig.xml | 7 ++
|
||||
4 files changed, 99 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
|
||||
index 75146950c3..0f30b3de25 100644
|
||||
--- a/src/backends/meta-monitor-manager.c
|
||||
+++ b/src/backends/meta-monitor-manager.c
|
||||
@@ -952,6 +952,59 @@ update_panel_orientation_managed (MetaMonitorManager *manager)
|
||||
handle_orientation_change (orientation_manager, manager);
|
||||
}
|
||||
|
||||
+static void
|
||||
+meta_monitor_manager_get_crtc_gamma (MetaMonitorManager *manager,
|
||||
+ MetaCrtc *crtc,
|
||||
+ size_t *size,
|
||||
+ unsigned short **red,
|
||||
+ unsigned short **green,
|
||||
+ unsigned short **blue)
|
||||
+{
|
||||
+ MetaMonitorManagerClass *klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||
+
|
||||
+ if (klass->get_crtc_gamma)
|
||||
+ {
|
||||
+ klass->get_crtc_gamma (manager, crtc, size, red, green, blue);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (size)
|
||||
+ *size = 0;
|
||||
+ if (red)
|
||||
+ *red = NULL;
|
||||
+ if (green)
|
||||
+ *green = NULL;
|
||||
+ if (blue)
|
||||
+ *blue = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+is_night_light_supported (MetaMonitorManager *manager)
|
||||
+{
|
||||
+ GList *l;
|
||||
+
|
||||
+ for (l = meta_backend_get_gpus (manager->backend); l; l = l->next)
|
||||
+ {
|
||||
+ MetaGpu *gpu = l->data;
|
||||
+ GList *l_crtc;
|
||||
+
|
||||
+ for (l_crtc = meta_gpu_get_crtcs (gpu); l_crtc; l_crtc = l_crtc->next)
|
||||
+ {
|
||||
+ MetaCrtc *crtc = l_crtc->data;
|
||||
+ size_t gamma_lut_size;
|
||||
+
|
||||
+ meta_monitor_manager_get_crtc_gamma (manager, crtc,
|
||||
+ &gamma_lut_size,
|
||||
+ NULL, NULL, NULL);
|
||||
+ if (gamma_lut_size > 0)
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
void
|
||||
meta_monitor_manager_setup (MetaMonitorManager *manager)
|
||||
{
|
||||
@@ -967,7 +1020,6 @@ meta_monitor_manager_setup (MetaMonitorManager *manager)
|
||||
meta_dbus_display_config_set_apply_monitors_config_allowed (manager->display_config,
|
||||
policy->enable_dbus);
|
||||
|
||||
-
|
||||
meta_monitor_manager_read_current_state (manager);
|
||||
|
||||
meta_monitor_manager_ensure_initial_config (manager);
|
||||
@@ -2445,7 +2497,6 @@ meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
guint crtc_id,
|
||||
MetaMonitorManager *manager)
|
||||
{
|
||||
- MetaMonitorManagerClass *klass;
|
||||
GList *combined_crtcs;
|
||||
MetaCrtc *crtc;
|
||||
gsize size;
|
||||
@@ -2476,14 +2527,8 @@ meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||
crtc = g_list_nth_data (combined_crtcs, crtc_id);
|
||||
g_list_free (combined_crtcs);
|
||||
|
||||
- klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||
- if (klass->get_crtc_gamma)
|
||||
- klass->get_crtc_gamma (manager, crtc, &size, &red, &green, &blue);
|
||||
- else
|
||||
- {
|
||||
- size = 0;
|
||||
- red = green = blue = NULL;
|
||||
- }
|
||||
+ meta_monitor_manager_get_crtc_gamma (manager, crtc,
|
||||
+ &size, &red, &green, &blue);
|
||||
|
||||
red_bytes = g_bytes_new_take (red, size * sizeof (unsigned short));
|
||||
green_bytes = g_bytes_new_take (green, size * sizeof (unsigned short));
|
||||
@@ -3078,6 +3123,16 @@ meta_monitor_manager_is_transform_handled (MetaMonitorManager *manager,
|
||||
return manager_class->is_transform_handled (manager, crtc, transform);
|
||||
}
|
||||
|
||||
+static void
|
||||
+update_night_light_supported (MetaMonitorManager *manager)
|
||||
+{
|
||||
+ gboolean night_light_supported;
|
||||
+
|
||||
+ night_light_supported = is_night_light_supported (manager);
|
||||
+ meta_dbus_display_config_set_night_light_supported (manager->display_config,
|
||||
+ night_light_supported);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
@@ -3098,6 +3153,7 @@ meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager)
|
||||
}
|
||||
|
||||
rebuild_monitors (manager);
|
||||
+ update_night_light_supported (manager);
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/src/backends/native/meta-monitor-manager-native.c b/src/backends/native/meta-monitor-manager-native.c
|
||||
index fd5e7784ff..37a50f1d6f 100644
|
||||
--- a/src/backends/native/meta-monitor-manager-native.c
|
||||
+++ b/src/backends/native/meta-monitor-manager-native.c
|
||||
@@ -381,15 +381,30 @@ meta_monitor_manager_native_get_crtc_gamma (MetaMonitorManager *manager,
|
||||
MetaKmsCrtc *kms_crtc;
|
||||
const MetaKmsCrtcState *crtc_state;
|
||||
|
||||
- g_return_if_fail (META_IS_CRTC_KMS (crtc));
|
||||
+ if (!META_IS_CRTC_KMS (crtc))
|
||||
+ {
|
||||
+ if (size)
|
||||
+ *size = 0;
|
||||
+ if (red)
|
||||
+ *red = NULL;
|
||||
+ if (green)
|
||||
+ *green = NULL;
|
||||
+ if (blue)
|
||||
+ *blue = NULL;
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (crtc));
|
||||
crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
|
||||
|
||||
- *size = crtc_state->gamma.size;
|
||||
- *red = g_memdup2 (crtc_state->gamma.red, *size * sizeof **red);
|
||||
- *green = g_memdup2 (crtc_state->gamma.green, *size * sizeof **green);
|
||||
- *blue = g_memdup2 (crtc_state->gamma.blue, *size * sizeof **blue);
|
||||
+ if (size)
|
||||
+ *size = crtc_state->gamma.size;
|
||||
+ if (red)
|
||||
+ *red = g_memdup2 (crtc_state->gamma.red, *size * sizeof **red);
|
||||
+ if (green)
|
||||
+ *green = g_memdup2 (crtc_state->gamma.green, *size * sizeof **green);
|
||||
+ if (blue)
|
||||
+ *blue = g_memdup2 (crtc_state->gamma.blue, *size * sizeof **blue);
|
||||
}
|
||||
|
||||
static char *
|
||||
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
|
||||
index 98eb080b6b..865f4e5800 100644
|
||||
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
|
||||
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
|
||||
@@ -707,9 +707,12 @@ meta_monitor_manager_xrandr_get_crtc_gamma (MetaMonitorManager *manager,
|
||||
(XID) meta_crtc_get_id (crtc));
|
||||
|
||||
*size = gamma->size;
|
||||
- *red = g_memdup2 (gamma->red, sizeof (unsigned short) * gamma->size);
|
||||
- *green = g_memdup2 (gamma->green, sizeof (unsigned short) * gamma->size);
|
||||
- *blue = g_memdup2 (gamma->blue, sizeof (unsigned short) * gamma->size);
|
||||
+ if (red)
|
||||
+ *red = g_memdup2 (gamma->red, sizeof (unsigned short) * gamma->size);
|
||||
+ if (green)
|
||||
+ *green = g_memdup2 (gamma->green, sizeof (unsigned short) * gamma->size);
|
||||
+ if (blue)
|
||||
+ *blue = g_memdup2 (gamma->blue, sizeof (unsigned short) * gamma->size);
|
||||
|
||||
XRRFreeGamma (gamma);
|
||||
}
|
||||
diff --git a/src/org.gnome.Mutter.DisplayConfig.xml b/src/org.gnome.Mutter.DisplayConfig.xml
|
||||
index c6859c2c09..5f85c5e271 100644
|
||||
--- a/src/org.gnome.Mutter.DisplayConfig.xml
|
||||
+++ b/src/org.gnome.Mutter.DisplayConfig.xml
|
||||
@@ -297,6 +297,13 @@
|
||||
-->
|
||||
<property name="ApplyMonitorsConfigAllowed" type="b" access="read" />
|
||||
|
||||
+ <!--
|
||||
+ NightLightSupported:
|
||||
+
|
||||
+ Whether night light is supported by this system.
|
||||
+ -->
|
||||
+ <property name="NightLightSupported" type="b" access="read" />
|
||||
+
|
||||
<!--
|
||||
MonitorsChanged:
|
||||
|
||||
--
|
||||
2.37.1
|
||||
|
@ -0,0 +1,107 @@
|
||||
From 86000c32d64cea7be2e6ed911cb9ea5df1306c0e Mon Sep 17 00:00:00 2001
|
||||
From: Mario Limonciello <mario.limonciello@amd.com>
|
||||
Date: Thu, 18 Aug 2022 13:36:20 -0500
|
||||
Subject: [PATCH 1/2] output/kms: Add more heuristics to decide when to offer
|
||||
fallback modes
|
||||
|
||||
If the panel is connected via eDP and supports more than one mode
|
||||
at different resolutions don't try to add more.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2586>
|
||||
(cherry picked from commit 96aa0fb8536eca579ceb1b17d83e19cf9e3e9e81)
|
||||
(cherry picked from commit 877cc3eb7d44e2886395151f763ec09bea350444)
|
||||
---
|
||||
src/backends/native/meta-output-kms.c | 56 +++++++++++++++++++++------
|
||||
1 file changed, 44 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
|
||||
index f35cdf04e1..9adc20bfd9 100644
|
||||
--- a/src/backends/native/meta-output-kms.c
|
||||
+++ b/src/backends/native/meta-output-kms.c
|
||||
@@ -224,6 +224,45 @@ compare_modes (const void *one,
|
||||
meta_crtc_mode_get_name (crtc_mode_two));
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+are_all_modes_equally_sized (MetaOutputInfo *output_info)
|
||||
+{
|
||||
+ const MetaCrtcModeInfo *base =
|
||||
+ meta_crtc_mode_get_info (output_info->modes[0]);
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 1; i < output_info->n_modes; i++)
|
||||
+ {
|
||||
+ const MetaCrtcModeInfo *mode_info =
|
||||
+ meta_crtc_mode_get_info (output_info->modes[i]);
|
||||
+
|
||||
+ if (base->width != mode_info->width ||
|
||||
+ base->height != mode_info->height)
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+maybe_add_fallback_modes (const MetaKmsConnectorState *connector_state,
|
||||
+ MetaOutputInfo *output_info,
|
||||
+ MetaGpuKms *gpu_kms,
|
||||
+ MetaKmsConnector *kms_connector)
|
||||
+{
|
||||
+ if (!connector_state->has_scaling)
|
||||
+ return;
|
||||
+
|
||||
+ if (output_info->connector_type == DRM_MODE_CONNECTOR_eDP &&
|
||||
+ !are_all_modes_equally_sized (output_info))
|
||||
+ return;
|
||||
+
|
||||
+ meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
|
||||
+ meta_kms_connector_get_id (kms_connector),
|
||||
+ meta_gpu_kms_get_file_path (gpu_kms));
|
||||
+ add_common_modes (output_info, gpu_kms);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
init_output_modes (MetaOutputInfo *output_info,
|
||||
MetaGpuKms *gpu_kms,
|
||||
@@ -252,14 +291,7 @@ init_output_modes (MetaOutputInfo *output_info,
|
||||
output_info->preferred_mode = output_info->modes[i];
|
||||
}
|
||||
|
||||
- if (connector_state->has_scaling)
|
||||
- {
|
||||
- meta_topic (META_DEBUG_KMS, "Adding common modes to connector %u on %s",
|
||||
- meta_kms_connector_get_id (kms_connector),
|
||||
- meta_gpu_kms_get_file_path (gpu_kms));
|
||||
- add_common_modes (output_info, gpu_kms);
|
||||
- }
|
||||
-
|
||||
+ maybe_add_fallback_modes (connector_state, output_info, gpu_kms, kms_connector);
|
||||
if (!output_info->modes)
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
@@ -322,6 +354,10 @@ meta_output_kms_new (MetaGpuKms *gpu_kms,
|
||||
output_info->height_mm = connector_state->height_mm;
|
||||
}
|
||||
|
||||
+ drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
|
||||
+ output_info->connector_type =
|
||||
+ meta_kms_connector_type_from_drm (drm_connector_type);
|
||||
+
|
||||
if (!init_output_modes (output_info, gpu_kms, kms_connector, error))
|
||||
return NULL;
|
||||
|
||||
@@ -349,10 +385,6 @@ meta_output_kms_new (MetaGpuKms *gpu_kms,
|
||||
|
||||
meta_output_info_parse_edid (output_info, connector_state->edid_data);
|
||||
|
||||
- drm_connector_type = meta_kms_connector_get_connector_type (kms_connector);
|
||||
- output_info->connector_type =
|
||||
- meta_kms_connector_type_from_drm (drm_connector_type);
|
||||
-
|
||||
output_info->tile_info = connector_state->tile_info;
|
||||
|
||||
output = g_object_new (META_TYPE_OUTPUT_KMS,
|
||||
--
|
||||
2.37.1
|
||||
|
@ -0,0 +1,63 @@
|
||||
From fa70ee1cd78e2b161545bc47a1c1083063030f77 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Mon, 11 Oct 2021 10:52:43 +0200
|
||||
Subject: [PATCH 1/5] renderer/native: Log render mode per device
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2051>
|
||||
(cherry picked from commit e8249a572d669c4c0a8464d6bce556b2cbaca4ef)
|
||||
(cherry picked from commit fe0ea79b83256d80f1dee1e4a49c94a5d6fd18a6)
|
||||
---
|
||||
src/backends/native/meta-renderer-native.c | 30 ++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index 735c37202..f92f648e5 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -1808,6 +1808,24 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+static const char *
|
||||
+renderer_data_mode_to_string (MetaRendererNativeMode mode)
|
||||
+{
|
||||
+ switch (mode)
|
||||
+ {
|
||||
+ case META_RENDERER_NATIVE_MODE_GBM:
|
||||
+ return "gbm";
|
||||
+ case META_RENDERER_NATIVE_MODE_SURFACELESS:
|
||||
+ return "surfaceless";
|
||||
+#ifdef HAVE_EGL_DEVICE
|
||||
+ case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
|
||||
+ return "egldevice";
|
||||
+#endif
|
||||
+ }
|
||||
+
|
||||
+ g_assert_not_reached ();
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
create_renderer_gpu_data (MetaRendererNative *renderer_native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
@@ -1822,6 +1840,18 @@ create_renderer_gpu_data (MetaRendererNative *renderer_native,
|
||||
if (!renderer_gpu_data)
|
||||
return FALSE;
|
||||
|
||||
+ if (gpu_kms)
|
||||
+ {
|
||||
+ g_message ("Created %s renderer for '%s'",
|
||||
+ renderer_data_mode_to_string (renderer_gpu_data->mode),
|
||||
+ meta_gpu_kms_get_file_path (gpu_kms));
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ g_message ("Created %s renderer without GPU",
|
||||
+ renderer_data_mode_to_string (renderer_gpu_data->mode));
|
||||
+ }
|
||||
+
|
||||
g_hash_table_insert (renderer_native->gpu_datas,
|
||||
gpu_kms,
|
||||
renderer_gpu_data);
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 6e2ef652cd58136aa668d0c1bd843fe83f11a0ab Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Fri, 26 Oct 2018 08:49:39 +0200
|
||||
Subject: [PATCH] wayland: Allow Xwayland grabs on selected apps
|
||||
|
||||
Allow Xwayland grabs on a selected set of X11 applications.
|
||||
---
|
||||
data/org.gnome.mutter.wayland.gschema.xml.in | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/data/org.gnome.mutter.wayland.gschema.xml.in b/data/org.gnome.mutter.wayland.gschema.xml.in
|
||||
index 8a1878e105..5527a46bc6 100644
|
||||
--- a/data/org.gnome.mutter.wayland.gschema.xml.in
|
||||
+++ b/data/org.gnome.mutter.wayland.gschema.xml.in
|
||||
@@ -66,7 +66,7 @@
|
||||
gettext-domain="@GETTEXT_DOMAIN@">
|
||||
|
||||
<key name="xwayland-allow-grabs" type="b">
|
||||
- <default>false</default>
|
||||
+ <default>true</default>
|
||||
<summary>Allow X11 grabs to lock keyboard focus with Xwayland</summary>
|
||||
<description>
|
||||
Allow all keyboard events to be routed to X11 “override redirect”
|
||||
@@ -86,7 +86,7 @@
|
||||
</key>
|
||||
|
||||
<key name="xwayland-grab-access-rules" type="as">
|
||||
- <default>[]</default>
|
||||
+ <default>['@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@']</default>
|
||||
<summary>Xwayland applications allowed to issue keyboard grabs</summary>
|
||||
<description>
|
||||
List the resource names or resource class of X11 windows either
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,192 @@
|
||||
From 5e4a1290ce75ed94e3f0f457d35a225f2ef3878c Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Tue, 28 Nov 2017 10:54:08 +0100
|
||||
Subject: [PATCH] wayland: Avoid a race in wl_seat capabilities
|
||||
|
||||
The way wl_seat capabilities work, by notifying clients of capabilities
|
||||
changes, and clients consequently requesting the relevant interface
|
||||
objects (pointer, keyboard, touch) is inherently racy.
|
||||
|
||||
On quick VT changes for example, capabilities on the seat will be added
|
||||
and removed, and by the time the client receives the capability change
|
||||
notification and requests the relevant keyboard, pointer or touch,
|
||||
another VT switch might have occurred and the wl_pointer, wl_keyboard or
|
||||
wl_touch already destroyed, leading to a protocol error which kills the
|
||||
client.
|
||||
|
||||
To avoid this, create the objects when requested regardless of the
|
||||
capabilities.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1797
|
||||
Related: https://bugzilla.gnome.org/show_bug.cgi?id=790932
|
||||
---
|
||||
src/wayland/meta-wayland-pointer.c | 45 ++++++++++++++++++++++++------
|
||||
src/wayland/meta-wayland-seat.c | 9 ++----
|
||||
src/wayland/meta-wayland-touch.c | 8 ------
|
||||
3 files changed, 40 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
|
||||
index 3132abfd2..abd779ad7 100644
|
||||
--- a/src/wayland/meta-wayland-pointer.c
|
||||
+++ b/src/wayland/meta-wayland-pointer.c
|
||||
@@ -109,7 +109,7 @@ meta_wayland_pointer_client_new (void)
|
||||
}
|
||||
|
||||
static void
|
||||
-meta_wayland_pointer_client_free (MetaWaylandPointerClient *pointer_client)
|
||||
+meta_wayland_pointer_make_resources_inert (MetaWaylandPointerClient *pointer_client)
|
||||
{
|
||||
struct wl_resource *resource, *next;
|
||||
|
||||
@@ -141,10 +141,25 @@ meta_wayland_pointer_client_free (MetaWaylandPointerClient *pointer_client)
|
||||
wl_list_init (wl_resource_get_link (resource));
|
||||
wl_resource_set_user_data (resource, NULL);
|
||||
}
|
||||
+}
|
||||
|
||||
+static void
|
||||
+meta_wayland_pointer_client_free (MetaWaylandPointerClient *pointer_client)
|
||||
+{
|
||||
+ meta_wayland_pointer_make_resources_inert (pointer_client);
|
||||
g_free (pointer_client);
|
||||
}
|
||||
|
||||
+static void
|
||||
+make_resources_inert_foreach (gpointer key,
|
||||
+ gpointer value,
|
||||
+ gpointer data)
|
||||
+{
|
||||
+ MetaWaylandPointerClient *pointer_client = value;
|
||||
+
|
||||
+ meta_wayland_pointer_make_resources_inert (pointer_client);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
meta_wayland_pointer_client_is_empty (MetaWaylandPointerClient *pointer_client)
|
||||
{
|
||||
@@ -158,8 +173,6 @@ MetaWaylandPointerClient *
|
||||
meta_wayland_pointer_get_pointer_client (MetaWaylandPointer *pointer,
|
||||
struct wl_client *client)
|
||||
{
|
||||
- if (!pointer->pointer_clients)
|
||||
- return NULL;
|
||||
return g_hash_table_lookup (pointer->pointer_clients, client);
|
||||
}
|
||||
|
||||
@@ -475,10 +488,6 @@ meta_wayland_pointer_enable (MetaWaylandPointer *pointer)
|
||||
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
|
||||
ClutterSeat *clutter_seat;
|
||||
|
||||
- pointer->pointer_clients =
|
||||
- g_hash_table_new_full (NULL, NULL, NULL,
|
||||
- (GDestroyNotify) meta_wayland_pointer_client_free);
|
||||
-
|
||||
pointer->cursor_surface = NULL;
|
||||
|
||||
clutter_seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
|
||||
@@ -508,6 +517,10 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
|
||||
ClutterBackend *clutter_backend = clutter_get_default_backend ();
|
||||
ClutterSeat *clutter_seat = clutter_backend_get_default_seat (clutter_backend);
|
||||
|
||||
+ g_hash_table_foreach (pointer->pointer_clients,
|
||||
+ make_resources_inert_foreach,
|
||||
+ NULL);
|
||||
+
|
||||
g_signal_handlers_disconnect_by_func (cursor_tracker,
|
||||
(gpointer) meta_wayland_pointer_on_cursor_changed,
|
||||
pointer);
|
||||
@@ -531,7 +544,6 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
|
||||
meta_wayland_pointer_set_focus (pointer, NULL);
|
||||
meta_wayland_pointer_set_current (pointer, NULL);
|
||||
|
||||
- g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
|
||||
pointer->cursor_surface = NULL;
|
||||
}
|
||||
|
||||
@@ -1356,11 +1368,28 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer)
|
||||
pointer->default_grab.interface = &default_pointer_grab_interface;
|
||||
pointer->default_grab.pointer = pointer;
|
||||
pointer->grab = &pointer->default_grab;
|
||||
+ pointer->pointer_clients =
|
||||
+ g_hash_table_new_full (NULL, NULL, NULL,
|
||||
+ (GDestroyNotify) meta_wayland_pointer_client_free);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+meta_wayland_pointer_finalize (GObject *object)
|
||||
+{
|
||||
+ MetaWaylandPointer *pointer = META_WAYLAND_POINTER (object);
|
||||
+
|
||||
+ g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
|
||||
+
|
||||
+ G_OBJECT_CLASS (meta_wayland_pointer_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_class_init (MetaWaylandPointerClass *klass)
|
||||
{
|
||||
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
+
|
||||
+ object_class->finalize = meta_wayland_pointer_finalize;
|
||||
+
|
||||
signals[FOCUS_SURFACE_CHANGED] = g_signal_new ("focus-surface-changed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c
|
||||
index c6390dde7..efce6d6d6 100644
|
||||
--- a/src/wayland/meta-wayland-seat.c
|
||||
+++ b/src/wayland/meta-wayland-seat.c
|
||||
@@ -46,8 +46,7 @@ seat_get_pointer (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandPointer *pointer = seat->pointer;
|
||||
|
||||
- if (meta_wayland_seat_has_pointer (seat))
|
||||
- meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
|
||||
+ meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -58,8 +57,7 @@ seat_get_keyboard (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandKeyboard *keyboard = seat->keyboard;
|
||||
|
||||
- if (meta_wayland_seat_has_keyboard (seat))
|
||||
- meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
|
||||
+ meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -70,8 +68,7 @@ seat_get_touch (struct wl_client *client,
|
||||
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
|
||||
MetaWaylandTouch *touch = seat->touch;
|
||||
|
||||
- if (meta_wayland_seat_has_touch (seat))
|
||||
- meta_wayland_touch_create_new_resource (touch, client, resource, id);
|
||||
+ meta_wayland_touch_create_new_resource (touch, client, resource, id);
|
||||
}
|
||||
|
||||
static void
|
||||
diff --git a/src/wayland/meta-wayland-touch.c b/src/wayland/meta-wayland-touch.c
|
||||
index 002ff16f7..15f0312eb 100644
|
||||
--- a/src/wayland/meta-wayland-touch.c
|
||||
+++ b/src/wayland/meta-wayland-touch.c
|
||||
@@ -521,16 +521,8 @@ meta_wayland_touch_create_new_resource (MetaWaylandTouch *touch,
|
||||
struct wl_resource *seat_resource,
|
||||
uint32_t id)
|
||||
{
|
||||
- MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||
struct wl_resource *cr;
|
||||
|
||||
- if (!meta_wayland_seat_has_touch (seat))
|
||||
- {
|
||||
- wl_resource_post_error (seat_resource, WL_DISPLAY_ERROR_INVALID_METHOD,
|
||||
- "Cannot retrieve touch interface without touch capability");
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
cr = wl_resource_create (client, &wl_touch_interface, wl_resource_get_version (seat_resource), id);
|
||||
wl_resource_set_implementation (cr, &touch_interface, touch, unbind_resource);
|
||||
wl_list_insert (&touch->resource_list, wl_resource_get_link (cr));
|
||||
--
|
||||
2.31.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 9efcc35102b4c41265e93461b35a1193b3d5822d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Fri, 12 May 2017 13:40:31 +0200
|
||||
Subject: [PATCH] window-actor: Special-case shaped Java windows
|
||||
|
||||
OpenJDK wrongly assumes that shaping a window implies no shadows.
|
||||
They got lucky until commit b975676c changed the fallback case,
|
||||
but now their compliance tests are broken. Make them happy again
|
||||
by special-casing shaped Java windows.
|
||||
---
|
||||
src/compositor/meta-window-actor-x11.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
|
||||
index b7032e0ba..b05d5e158 100644
|
||||
--- a/src/compositor/meta-window-actor-x11.c
|
||||
+++ b/src/compositor/meta-window-actor-x11.c
|
||||
@@ -528,6 +528,14 @@ has_shadow (MetaWindowActorX11 *actor_x11)
|
||||
*/
|
||||
if (window->has_custom_frame_extents)
|
||||
return FALSE;
|
||||
+
|
||||
+ /*
|
||||
+ * OpenJDK wrongly assumes that shaping a window implies no compositor
|
||||
+ * shadows; make its compliance tests happy to give it what it wants ...
|
||||
+ */
|
||||
+ if (g_strcmp0 (window->res_name, "sun-awt-X11-XWindowPeer") == 0 &&
|
||||
+ window->shape_region != NULL)
|
||||
+ return FALSE;
|
||||
|
||||
/*
|
||||
* Generate shadows for all other windows.
|
||||
--
|
||||
2.23.0
|
||||
|
@ -0,0 +1,43 @@
|
||||
From 69c40c6d126a5c804db54ce0afe581362e4fd33b Mon Sep 17 00:00:00 2001
|
||||
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
||||
Date: Tue, 12 Apr 2022 18:37:29 +0800
|
||||
Subject: [PATCH 2/2] crtc/kms: Don't add gamma to the update if unsupported by
|
||||
the CRTC
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2197
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2360>
|
||||
---
|
||||
src/backends/native/meta-crtc-kms.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c
|
||||
index f1bc79146..953f023ce 100644
|
||||
--- a/src/backends/native/meta-crtc-kms.c
|
||||
+++ b/src/backends/native/meta-crtc-kms.c
|
||||
@@ -201,10 +201,14 @@ meta_crtc_kms_maybe_set_gamma (MetaCrtcKms *crtc_kms,
|
||||
MetaKms *kms = meta_kms_device_get_kms (kms_device);
|
||||
MetaKmsUpdate *kms_update;
|
||||
MetaKmsCrtcGamma *gamma;
|
||||
+ MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
|
||||
|
||||
if (crtc_kms->is_gamma_valid)
|
||||
return;
|
||||
|
||||
+ if (!meta_kms_crtc_has_gamma (kms_crtc))
|
||||
+ return;
|
||||
+
|
||||
gamma = meta_monitor_manager_native_get_cached_crtc_gamma (monitor_manager_native,
|
||||
crtc_kms);
|
||||
if (!gamma)
|
||||
@@ -212,7 +216,7 @@ meta_crtc_kms_maybe_set_gamma (MetaCrtcKms *crtc_kms,
|
||||
|
||||
kms_update = meta_kms_ensure_pending_update (kms, kms_device);
|
||||
meta_kms_update_set_crtc_gamma (kms_update,
|
||||
- meta_crtc_kms_get_kms_crtc (crtc_kms),
|
||||
+ kms_crtc,
|
||||
gamma->size,
|
||||
gamma->red,
|
||||
gamma->green,
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,120 @@
|
||||
From b328c8cc8b0b31a4afe2bfc857c6ea5a2b837ef2 Mon Sep 17 00:00:00 2001
|
||||
From: Piotr Lopatka <piotr.lopatka@gmail.com>
|
||||
Date: Fri, 3 Sep 2021 20:01:59 +0100
|
||||
Subject: [PATCH 2/2] onscreen/native: Pass damage rectangles when page
|
||||
flipping
|
||||
|
||||
This commit passes damage rectangles metadata to the (KMS) primary
|
||||
plane.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1879>
|
||||
---
|
||||
src/backends/native/meta-crtc-kms.c | 4 +++-
|
||||
src/backends/native/meta-crtc-kms.h | 6 +++---
|
||||
src/backends/native/meta-onscreen-native.c | 22 ++++++++++++++++++----
|
||||
3 files changed, 24 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c
|
||||
index f1bc79146af..fde64817532 100644
|
||||
--- a/src/backends/native/meta-crtc-kms.c
|
||||
+++ b/src/backends/native/meta-crtc-kms.c
|
||||
@@ -115,7 +115,7 @@ meta_crtc_kms_apply_transform (MetaCrtcKms *crtc_kms,
|
||||
hw_transform);
|
||||
}
|
||||
|
||||
-void
|
||||
+MetaKmsPlaneAssignment *
|
||||
meta_crtc_kms_assign_primary_plane (MetaCrtcKms *crtc_kms,
|
||||
MetaDrmBuffer *buffer,
|
||||
MetaKmsUpdate *kms_update)
|
||||
@@ -161,6 +161,8 @@ meta_crtc_kms_assign_primary_plane (MetaCrtcKms *crtc_kms,
|
||||
dst_rect,
|
||||
flags);
|
||||
meta_crtc_kms_apply_transform (crtc_kms, plane_assignment);
|
||||
+
|
||||
+ return plane_assignment;
|
||||
}
|
||||
|
||||
static GList *
|
||||
diff --git a/src/backends/native/meta-crtc-kms.h b/src/backends/native/meta-crtc-kms.h
|
||||
index f8d241bbb51..bd80835f986 100644
|
||||
--- a/src/backends/native/meta-crtc-kms.h
|
||||
+++ b/src/backends/native/meta-crtc-kms.h
|
||||
@@ -48,9 +48,9 @@ void meta_crtc_kms_set_cursor_renderer_private (MetaCrtcKms *crtc_kms,
|
||||
void meta_crtc_kms_apply_transform (MetaCrtcKms *crtc_kms,
|
||||
MetaKmsPlaneAssignment *kms_plane_assignment);
|
||||
|
||||
-void meta_crtc_kms_assign_primary_plane (MetaCrtcKms *crtc_kms,
|
||||
- MetaDrmBuffer *buffer,
|
||||
- MetaKmsUpdate *kms_update);
|
||||
+MetaKmsPlaneAssignment * meta_crtc_kms_assign_primary_plane (MetaCrtcKms *crtc_kms,
|
||||
+ MetaDrmBuffer *buffer,
|
||||
+ MetaKmsUpdate *kms_update);
|
||||
|
||||
void meta_crtc_kms_set_mode (MetaCrtcKms *crtc_kms,
|
||||
MetaKmsUpdate *kms_update);
|
||||
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
|
||||
index 112bd0d438b..00b2d9f89cc 100644
|
||||
--- a/src/backends/native/meta-onscreen-native.c
|
||||
+++ b/src/backends/native/meta-onscreen-native.c
|
||||
@@ -416,7 +416,9 @@ static void
|
||||
meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
MetaRendererView *view,
|
||||
MetaCrtc *crtc,
|
||||
- MetaKmsPageFlipListenerFlag flags)
|
||||
+ MetaKmsPageFlipListenerFlag flags,
|
||||
+ const int *rectangles,
|
||||
+ int n_rectangles)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
@@ -430,6 +432,7 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
MetaKmsUpdate *kms_update;
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state = NULL;
|
||||
MetaDrmBuffer *buffer;
|
||||
+ MetaKmsPlaneAssignment *plane_assignment;
|
||||
|
||||
COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs,
|
||||
"Onscreen (flip CRTCs)");
|
||||
@@ -456,8 +459,15 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
buffer = secondary_gpu_state->gbm.next_fb;
|
||||
}
|
||||
|
||||
- meta_crtc_kms_assign_primary_plane (crtc_kms, buffer, kms_update);
|
||||
+ plane_assignment = meta_crtc_kms_assign_primary_plane (crtc_kms,
|
||||
+ buffer,
|
||||
+ kms_update);
|
||||
|
||||
+ if (rectangles != NULL && n_rectangles != 0)
|
||||
+ {
|
||||
+ meta_kms_plane_assignment_set_fb_damage (plane_assignment,
|
||||
+ rectangles, n_rectangles);
|
||||
+ }
|
||||
break;
|
||||
case META_RENDERER_NATIVE_MODE_SURFACELESS:
|
||||
g_assert_not_reached ();
|
||||
@@ -1081,7 +1091,9 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
meta_onscreen_native_flip_crtc (onscreen,
|
||||
onscreen_native->view,
|
||||
onscreen_native->crtc,
|
||||
- META_KMS_PAGE_FLIP_LISTENER_FLAG_NONE);
|
||||
+ META_KMS_PAGE_FLIP_LISTENER_FLAG_NONE,
|
||||
+ rectangles,
|
||||
+ n_rectangles);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1299,7 +1311,9 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
|
||||
meta_onscreen_native_flip_crtc (onscreen,
|
||||
onscreen_native->view,
|
||||
onscreen_native->crtc,
|
||||
- META_KMS_PAGE_FLIP_LISTENER_FLAG_DROP_ON_ERROR);
|
||||
+ META_KMS_PAGE_FLIP_LISTENER_FLAG_DROP_ON_ERROR,
|
||||
+ NULL,
|
||||
+ 0);
|
||||
|
||||
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc));
|
||||
kms_device = meta_kms_crtc_get_device (kms_crtc);
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,47 @@
|
||||
From cd8b90a7a7185c3f177469d1a37654a9e8539cd1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Thu, 29 Sep 2022 14:23:55 +0200
|
||||
Subject: [PATCH 2/2] output/kms: Don't attemp to add common modes on
|
||||
connectors without modes
|
||||
|
||||
We have no way to sanely add safe modes if there are no modes we can
|
||||
compare with, thus don't try.
|
||||
|
||||
Fixes the following crash:
|
||||
|
||||
#0 are_all_modes_equally_sized at ../src/backends/native/meta-output-kms.c:284
|
||||
#1 maybe_add_fallback_modes at ../src/backends/native/meta-output-kms.c:310
|
||||
#2 init_output_modes at ../src/backends/native/meta-output-kms.c:347
|
||||
#3 meta_output_kms_new at ../src/backends/native/meta-output-kms.c:414
|
||||
#4 init_outputs at ../src/backends/native/meta-gpu-kms.c:332
|
||||
#5 meta_gpu_kms_read_current at ../src/backends/native/meta-gpu-kms.c:368
|
||||
#6 meta_gpu_kms_new at ../src/backends/native/meta-gpu-kms.c:403
|
||||
#7 create_gpu_from_udev_device at ../src/backends/native/meta-backend-native.c:461
|
||||
#8 init_gpus at ../src/backends/native/meta-backend-native.c:551
|
||||
#9 meta_backend_native_initable_init at ../src/backends/native/meta-backend-native.c:632
|
||||
|
||||
Fixes: 877cc3eb7d44e2886395151f763ec09bea350444
|
||||
Related: https://bugzilla.redhat.com/show_bug.cgi?id=2127801
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2646>
|
||||
(cherry picked from commit 2c8adb19660cb2cd53381372833e088962437d3b)
|
||||
---
|
||||
src/backends/native/meta-output-kms.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c
|
||||
index 9adc20bfd9..058ab7c053 100644
|
||||
--- a/src/backends/native/meta-output-kms.c
|
||||
+++ b/src/backends/native/meta-output-kms.c
|
||||
@@ -250,6 +250,9 @@ maybe_add_fallback_modes (const MetaKmsConnectorState *connector_state,
|
||||
MetaGpuKms *gpu_kms,
|
||||
MetaKmsConnector *kms_connector)
|
||||
{
|
||||
+ if (!connector_state->modes)
|
||||
+ return;
|
||||
+
|
||||
if (!connector_state->has_scaling)
|
||||
return;
|
||||
|
||||
--
|
||||
2.37.1
|
||||
|
@ -0,0 +1,94 @@
|
||||
From 425710866438a62843b96272a6cbc6c22174f10c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Mon, 11 Oct 2021 10:39:43 +0200
|
||||
Subject: [PATCH 2/5] renderer/native: Try the gbm renderer before the
|
||||
EGLDevice renderer
|
||||
|
||||
This switches the order of what renderer mode is tried first, so that
|
||||
the gbm renderer mode is preferred on an NVIDIA driver where it is
|
||||
supported.
|
||||
|
||||
We fall back to still try the EGLDevice renderer mode if the created gbm
|
||||
renderer is not hardware accelerated.
|
||||
|
||||
The last fallback is still to use the gbm renderer, even if it is not
|
||||
hardware accelerated, as this is needed when hardware acceleration isn't
|
||||
available at all. The original reason for the old order was due to the
|
||||
fact that a gbm renderer without hardware acceleration would succeed
|
||||
even on NVIDIA driver that didn't support gbm.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2051>
|
||||
(cherry picked from commit 8fc1325e8e713dfa05a12c47e6e981e50d3cda61)
|
||||
---
|
||||
src/backends/native/meta-renderer-native.c | 44 +++++++++++-----------
|
||||
1 file changed, 23 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index f92f648e5..c851619a1 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -1754,38 +1754,40 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
- MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
+ MetaRendererNativeGpuData *gbm_renderer_gpu_data;
|
||||
GError *gbm_error = NULL;
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
+ MetaRendererNativeGpuData *egl_stream_renderer_gpu_data;
|
||||
GError *egl_device_error = NULL;
|
||||
#endif
|
||||
|
||||
if (!gpu_kms)
|
||||
return create_renderer_gpu_data_surfaceless (renderer_native, error);
|
||||
|
||||
-#ifdef HAVE_EGL_DEVICE
|
||||
- /* Try to initialize the EGLDevice backend first. Whenever we use a
|
||||
- * non-NVIDIA GPU, the EGLDevice enumeration function won't find a match, and
|
||||
- * we'll fall back to GBM (which will always succeed as it has a software
|
||||
- * rendering fallback)
|
||||
- */
|
||||
- renderer_gpu_data = create_renderer_gpu_data_egl_device (renderer_native,
|
||||
- gpu_kms,
|
||||
- &egl_device_error);
|
||||
- if (renderer_gpu_data)
|
||||
- return renderer_gpu_data;
|
||||
-#endif
|
||||
-
|
||||
- renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
|
||||
- gpu_kms,
|
||||
- &gbm_error);
|
||||
- if (renderer_gpu_data)
|
||||
+ gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
|
||||
+ gpu_kms,
|
||||
+ &gbm_error);
|
||||
+ if (gbm_renderer_gpu_data)
|
||||
{
|
||||
+ if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
|
||||
+ return gbm_renderer_gpu_data;
|
||||
+ }
|
||||
+
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
- g_error_free (egl_device_error);
|
||||
-#endif
|
||||
- return renderer_gpu_data;
|
||||
+ egl_stream_renderer_gpu_data =
|
||||
+ create_renderer_gpu_data_egl_device (renderer_native,
|
||||
+ gpu_kms,
|
||||
+ &egl_device_error);
|
||||
+ if (egl_stream_renderer_gpu_data)
|
||||
+ {
|
||||
+ g_clear_pointer (&gbm_renderer_gpu_data,
|
||||
+ meta_renderer_native_gpu_data_free);
|
||||
+ return egl_stream_renderer_gpu_data;
|
||||
}
|
||||
+#endif
|
||||
+
|
||||
+ if (gbm_renderer_gpu_data)
|
||||
+ return gbm_renderer_gpu_data;
|
||||
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,37 @@
|
||||
From 8d6e41fc9b5194fb24523c939de54a2af46b5d07 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Fri, 27 May 2022 18:19:27 +0200
|
||||
Subject: [PATCH] kms/crtc: Determine gamma support given the gamma length
|
||||
|
||||
The property doesn't necessarily exist when using drivers that doesn't
|
||||
support atomic mode setting, and the way it worked will break night
|
||||
light and other gamma related features. This makes things use the gamma
|
||||
length; if it is higher than 0, it definitely supports it one way or the
|
||||
other, i.e. GAMMA_LUT with the atomic backend, and drmModeCrtcSetGamma()
|
||||
with the legacy/simple backend.
|
||||
|
||||
Fixes: 364572b95c8354ac66674064a8058aa98bc0bbef
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2287
|
||||
(cherry picked from commit a2ebd10f049d888e451938e23a035ed97e0c8eff)
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2452>
|
||||
---
|
||||
src/backends/native/meta-kms-crtc.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-crtc.c b/src/backends/native/meta-kms-crtc.c
|
||||
index 24f5a2d7400..0513af947c9 100644
|
||||
--- a/src/backends/native/meta-kms-crtc.c
|
||||
+++ b/src/backends/native/meta-kms-crtc.c
|
||||
@@ -96,7 +96,7 @@ meta_kms_crtc_is_active (MetaKmsCrtc *crtc)
|
||||
gboolean
|
||||
meta_kms_crtc_has_gamma (MetaKmsCrtc *crtc)
|
||||
{
|
||||
- return !!meta_kms_crtc_get_prop_id (crtc, META_KMS_CRTC_PROP_GAMMA_LUT);
|
||||
+ return crtc->current_state.gamma.size > 0;
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
2.36.1
|
||||
|
@ -0,0 +1,100 @@
|
||||
From 07f63ad466b66cc02b49a326789686bce9325201 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Thu, 14 Oct 2021 18:36:43 +0200
|
||||
Subject: [PATCH 3/5] wayland: Only init EGLStream controller if we didn't end
|
||||
up with gbm
|
||||
|
||||
When we use gbm together with the NVIDIA driver, we want the EGL/Vulkan
|
||||
clients to do the same, instead of using the EGLStream paths. To achieve
|
||||
that, make sure to only initialize the EGLStream controller when we
|
||||
didn't end up using gbm as the renderer backend.
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2052>
|
||||
(cherry picked from commit ac907119ae0f415c099976635c3b1dff4d2d7201)
|
||||
(cherry picked from commit e3931f7b8cbd44072137c5dc9de9041486daeade)
|
||||
---
|
||||
src/backends/native/meta-renderer-native.c | 11 +++++++++
|
||||
src/backends/native/meta-renderer-native.h | 2 ++
|
||||
src/wayland/meta-wayland.c | 26 ++++++++++++++++++++--
|
||||
3 files changed, 37 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index c851619a1..e7460fbf1 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -201,6 +201,17 @@ meta_renderer_native_has_pending_mode_set (MetaRendererNative *renderer_native)
|
||||
return renderer_native->pending_mode_set;
|
||||
}
|
||||
|
||||
+MetaRendererNativeMode
|
||||
+meta_renderer_native_get_mode (MetaRendererNative *renderer_native)
|
||||
+{
|
||||
+ MetaGpuKms *primary_gpu = renderer_native->primary_gpu_kms;
|
||||
+ MetaRendererNativeGpuData *primary_gpu_data;
|
||||
+
|
||||
+ primary_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
+ primary_gpu);
|
||||
+ return primary_gpu_data->mode;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_renderer_native_disconnect (CoglRenderer *cogl_renderer)
|
||||
{
|
||||
diff --git a/src/backends/native/meta-renderer-native.h b/src/backends/native/meta-renderer-native.h
|
||||
index 9475e1857..8c06c2473 100644
|
||||
--- a/src/backends/native/meta-renderer-native.h
|
||||
+++ b/src/backends/native/meta-renderer-native.h
|
||||
@@ -66,4 +66,6 @@ void meta_renderer_native_reset_modes (MetaRendererNative *renderer_native);
|
||||
|
||||
gboolean meta_renderer_native_use_modifiers (MetaRendererNative *renderer_native);
|
||||
|
||||
+MetaRendererNativeMode meta_renderer_native_get_mode (MetaRendererNative *renderer_native);
|
||||
+
|
||||
#endif /* META_RENDERER_NATIVE_H */
|
||||
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
|
||||
index 8f16aa429..a3f098410 100644
|
||||
--- a/src/wayland/meta-wayland.c
|
||||
+++ b/src/wayland/meta-wayland.c
|
||||
@@ -50,6 +50,10 @@
|
||||
#include "wayland/meta-xwayland-private.h"
|
||||
#include "wayland/meta-xwayland.h"
|
||||
|
||||
+#ifdef HAVE_NATIVE_BACKEND
|
||||
+#include "backends/native/meta-renderer-native.h"
|
||||
+#endif
|
||||
+
|
||||
static char *_display_name_override;
|
||||
|
||||
G_DEFINE_TYPE (MetaWaylandCompositor, meta_wayland_compositor, G_TYPE_OBJECT)
|
||||
@@ -521,8 +525,26 @@ meta_wayland_compositor_setup (MetaWaylandCompositor *compositor)
|
||||
compositor);
|
||||
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
- meta_wayland_eglstream_controller_init (compositor);
|
||||
-#endif
|
||||
+ {
|
||||
+ gboolean should_enable_eglstream_controller = TRUE;
|
||||
+#if defined(HAVE_EGL_DEVICE) && defined(HAVE_NATIVE_BACKEND)
|
||||
+ MetaBackend *backend = meta_get_backend ();
|
||||
+ MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
+
|
||||
+ if (META_IS_RENDERER_NATIVE (renderer))
|
||||
+ {
|
||||
+ MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
|
||||
+
|
||||
+ if (meta_renderer_native_get_mode (renderer_native) ==
|
||||
+ META_RENDERER_NATIVE_MODE_GBM)
|
||||
+ should_enable_eglstream_controller = FALSE;
|
||||
+ }
|
||||
+#endif /* defined(HAVE_EGL_DEVICE) && defined(HAVE_NATIVE_BACKEND) */
|
||||
+
|
||||
+ if (should_enable_eglstream_controller)
|
||||
+ meta_wayland_eglstream_controller_init (compositor);
|
||||
+ }
|
||||
+#endif /* HAVE_WAYLAND_EGLSTREAM */
|
||||
|
||||
if (meta_get_x11_display_policy () != META_DISPLAY_POLICY_DISABLED)
|
||||
{
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,70 @@
|
||||
From 4c23158f81c3c4b91353150fd4c28246ce1e692f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Fri, 3 Dec 2021 11:07:00 +0100
|
||||
Subject: [PATCH 4/5] renderer/native: Allow forcing EGLStream backend
|
||||
|
||||
The GBM support in the NVIDIA driver is fairly new, and to make it
|
||||
easier to identify whether a problem encountered is related to using GBM
|
||||
instead of EGLStreams, add a debug environment variable to force using
|
||||
EGLStream instead of GBM.
|
||||
|
||||
To force using EGLStream instead of GBM, use
|
||||
|
||||
MUTTER_DEBUG_FORCE_EGL_STREAM=1
|
||||
|
||||
Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/2045
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2132>
|
||||
(cherry picked from commit d43cc776ef733251fc02e8e62669ea4ba7e68e2c)
|
||||
---
|
||||
src/backends/native/meta-renderer-native.c | 26 ++++++++++++++++------
|
||||
1 file changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
|
||||
index e7460fbf1..0cd7a27d6 100644
|
||||
--- a/src/backends/native/meta-renderer-native.c
|
||||
+++ b/src/backends/native/meta-renderer-native.c
|
||||
@@ -1765,7 +1765,7 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
- MetaRendererNativeGpuData *gbm_renderer_gpu_data;
|
||||
+ MetaRendererNativeGpuData *gbm_renderer_gpu_data = NULL;
|
||||
GError *gbm_error = NULL;
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
MetaRendererNativeGpuData *egl_stream_renderer_gpu_data;
|
||||
@@ -1775,14 +1775,26 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
if (!gpu_kms)
|
||||
return create_renderer_gpu_data_surfaceless (renderer_native, error);
|
||||
|
||||
- gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
|
||||
- gpu_kms,
|
||||
- &gbm_error);
|
||||
- if (gbm_renderer_gpu_data)
|
||||
+#ifdef HAVE_EGL_DEVICE
|
||||
+ if (g_strcmp0 (getenv ("MUTTER_DEBUG_FORCE_EGL_STREAM"), "1") != 0)
|
||||
+#endif
|
||||
+ {
|
||||
+ gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
|
||||
+ gpu_kms,
|
||||
+ &gbm_error);
|
||||
+ if (gbm_renderer_gpu_data)
|
||||
+ {
|
||||
+ if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
|
||||
+ return gbm_renderer_gpu_data;
|
||||
+ }
|
||||
+ }
|
||||
+#ifdef HAVE_EGL_DEVICE
|
||||
+ else
|
||||
{
|
||||
- if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
|
||||
- return gbm_renderer_gpu_data;
|
||||
+ g_set_error (&gbm_error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
+ "GBM backend was disabled using env var");
|
||||
}
|
||||
+#endif
|
||||
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
egl_stream_renderer_gpu_data =
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,37 @@
|
||||
From f5ae26bb44c42369cbcf0a9b7da049222b5ecbf8 Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Fri, 10 Dec 2021 10:57:29 +0100
|
||||
Subject: [PATCH 5/5] cursor-renderer/native: Add a means to disable HW cursors
|
||||
|
||||
When dealing with a faulty hardware or bugs in the driver, it might be
|
||||
interesting to force the use of software cursors for debugging purposes.
|
||||
|
||||
Add a debug environment variable MUTTER_DEBUG_DISABLE_HW_CURSORS to
|
||||
disable hardware cursors and force using software cursors.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2046
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2150>
|
||||
(cherry picked from commit 56939abd2f1691eea9edf85cb715ebf275944e7e)
|
||||
---
|
||||
src/backends/native/meta-cursor-renderer-native.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
|
||||
index fcfe8eb98..237f9a3d5 100644
|
||||
--- a/src/backends/native/meta-cursor-renderer-native.c
|
||||
+++ b/src/backends/native/meta-cursor-renderer-native.c
|
||||
@@ -1828,7 +1828,10 @@ meta_cursor_renderer_native_new (MetaBackend *backend,
|
||||
|
||||
priv->backend = backend;
|
||||
|
||||
- init_hw_cursor_support (cursor_renderer_native);
|
||||
+ if (g_strcmp0 (getenv ("MUTTER_DEBUG_DISABLE_HW_CURSORS"), "1"))
|
||||
+ init_hw_cursor_support (cursor_renderer_native);
|
||||
+ else
|
||||
+ g_message ("Disabling hardware cursors because MUTTER_DEBUG_DISABLE_HW_CURSORS is set");
|
||||
|
||||
return cursor_renderer_native;
|
||||
}
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,213 @@
|
||||
From d89c71ed2bdb18e9b01891d6b999c44f955778dc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Wed, 1 Sep 2021 21:12:03 +0200
|
||||
Subject: [PATCH 1/2] context: Add :unsafe-mode property
|
||||
|
||||
We are going to restrict several sensitive D-Bus APIs to a set
|
||||
of allowed callers (like Settings or portal implementations).
|
||||
|
||||
Add an :unsafe-mode property to the context to allow turning off
|
||||
those restrictions temporarily, in order to not get in the way
|
||||
of development/debugging.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1983>
|
||||
---
|
||||
src/backends/meta-backend-private.h | 4 ++
|
||||
src/backends/meta-backend.c | 83 +++++++++++++++++++++++++++++
|
||||
2 files changed, 87 insertions(+)
|
||||
|
||||
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
|
||||
index b930462b2..583d4e151 100644
|
||||
--- a/src/backends/meta-backend-private.h
|
||||
+++ b/src/backends/meta-backend-private.h
|
||||
@@ -133,6 +133,10 @@ void meta_backend_foreach_device_monitor (MetaBackend *backend,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
+gboolean meta_backend_get_unsafe_mode (MetaBackend *backend);
|
||||
+void meta_backend_set_unsafe_mode (MetaBackend *backend,
|
||||
+ gboolean enable);
|
||||
+
|
||||
META_EXPORT_TEST
|
||||
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
|
||||
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);
|
||||
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
|
||||
index ff84bfe6a..18bee2484 100644
|
||||
--- a/src/backends/meta-backend.c
|
||||
+++ b/src/backends/meta-backend.c
|
||||
@@ -88,6 +88,17 @@
|
||||
#include "wayland/meta-wayland.h"
|
||||
#endif
|
||||
|
||||
+enum
|
||||
+{
|
||||
+ PROP_0,
|
||||
+
|
||||
+ PROP_UNSAFE_MODE,
|
||||
+
|
||||
+ N_PROPS
|
||||
+};
|
||||
+
|
||||
+static GParamSpec *obj_props[N_PROPS];
|
||||
+
|
||||
enum
|
||||
{
|
||||
KEYMAP_CHANGED,
|
||||
@@ -158,6 +169,8 @@ struct _MetaBackendPrivate
|
||||
|
||||
gboolean is_pointer_position_initialized;
|
||||
|
||||
+ gboolean unsafe_mode;
|
||||
+
|
||||
guint device_update_idle_id;
|
||||
|
||||
GHashTable *device_monitors;
|
||||
@@ -814,6 +827,64 @@ upower_vanished (GDBusConnection *connection,
|
||||
g_clear_object (&priv->upower_proxy);
|
||||
}
|
||||
|
||||
+gboolean
|
||||
+meta_backend_get_unsafe_mode (MetaBackend *backend)
|
||||
+{
|
||||
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
+
|
||||
+ return priv->unsafe_mode;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+meta_backend_set_unsafe_mode (MetaBackend *backend,
|
||||
+ gboolean enable)
|
||||
+{
|
||||
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
+
|
||||
+ if (priv->unsafe_mode == enable)
|
||||
+ return;
|
||||
+
|
||||
+ priv->unsafe_mode = enable;
|
||||
+ g_object_notify_by_pspec (G_OBJECT (backend), obj_props[PROP_UNSAFE_MODE]);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+meta_backend_get_property (GObject *object,
|
||||
+ guint prop_id,
|
||||
+ GValue *value,
|
||||
+ GParamSpec *pspec)
|
||||
+{
|
||||
+ MetaBackend *backend = META_BACKEND (object);
|
||||
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
+
|
||||
+ switch (prop_id)
|
||||
+ {
|
||||
+ case PROP_UNSAFE_MODE:
|
||||
+ g_value_set_boolean (value, priv->unsafe_mode);
|
||||
+ break;
|
||||
+ default:
|
||||
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+meta_backend_set_property (GObject *object,
|
||||
+ guint prop_id,
|
||||
+ const GValue *value,
|
||||
+ GParamSpec *pspec)
|
||||
+{
|
||||
+ MetaBackend *backend = META_BACKEND (object);
|
||||
+
|
||||
+ switch (prop_id)
|
||||
+ {
|
||||
+ case PROP_UNSAFE_MODE:
|
||||
+ meta_backend_set_unsafe_mode (backend, g_value_get_boolean (value));
|
||||
+ break;
|
||||
+ default:
|
||||
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_backend_constructed (GObject *object)
|
||||
{
|
||||
@@ -851,6 +922,8 @@ meta_backend_class_init (MetaBackendClass *klass)
|
||||
|
||||
object_class->dispose = meta_backend_dispose;
|
||||
object_class->constructed = meta_backend_constructed;
|
||||
+ object_class->get_property = meta_backend_get_property;
|
||||
+ object_class->set_property = meta_backend_set_property;
|
||||
|
||||
klass->post_init = meta_backend_real_post_init;
|
||||
klass->grab_device = meta_backend_real_grab_device;
|
||||
@@ -907,6 +980,16 @@ meta_backend_class_init (MetaBackendClass *klass)
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
+ obj_props[PROP_UNSAFE_MODE] =
|
||||
+ g_param_spec_boolean ("unsafe-mode",
|
||||
+ "unsafe mode",
|
||||
+ "Unsafe mode",
|
||||
+ FALSE,
|
||||
+ G_PARAM_READWRITE |
|
||||
+ G_PARAM_EXPLICIT_NOTIFY |
|
||||
+ G_PARAM_STATIC_STRINGS);
|
||||
+ g_object_class_install_properties (object_class, N_PROPS, obj_props);
|
||||
+
|
||||
mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS");
|
||||
stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
|
||||
}
|
||||
--
|
||||
2.35.1
|
||||
|
||||
|
||||
From dc69aa57be79fa7f371788c852f6e23cf0d261cb Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
|
||||
Date: Thu, 2 Sep 2021 18:41:16 +0200
|
||||
Subject: [PATCH 2/2] context: Add (hidden) --unsafe-mode option
|
||||
|
||||
When running gnome-shell, it is possible to toggle unsafe-mode in
|
||||
looking glass. We'll eventually start using the property in mutter
|
||||
as well, so to make stand-alone debugging easier, also expose it
|
||||
as a hidden command line option.
|
||||
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3943
|
||||
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1983>
|
||||
---
|
||||
src/core/main.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/src/core/main.c b/src/core/main.c
|
||||
index 0d241f952..991d583a0 100644
|
||||
--- a/src/core/main.c
|
||||
+++ b/src/core/main.c
|
||||
@@ -218,6 +218,7 @@ static char *opt_wayland_display;
|
||||
static gboolean opt_display_server;
|
||||
static gboolean opt_headless;
|
||||
#endif
|
||||
+static gboolean opt_unsafe_mode;
|
||||
static gboolean opt_x11;
|
||||
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
@@ -306,6 +307,11 @@ static GOptionEntry meta_options[] = {
|
||||
N_("Add persistent virtual monitor (WxH or WxH@R)")
|
||||
},
|
||||
#endif
|
||||
+ {
|
||||
+ "unsafe-mode", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE,
|
||||
+ &opt_unsafe_mode,
|
||||
+ "Run in unsafe mode"
|
||||
+ },
|
||||
{
|
||||
"x11", 0, 0, G_OPTION_ARG_NONE,
|
||||
&opt_x11,
|
||||
@@ -865,6 +871,7 @@ meta_init (void)
|
||||
add_persistent_virtual_monitors ();
|
||||
#endif
|
||||
|
||||
+ meta_backend_set_unsafe_mode (meta_get_backend(), opt_unsafe_mode);
|
||||
meta_set_syncing (opt_sync || (g_getenv ("MUTTER_SYNC") != NULL));
|
||||
|
||||
if (opt_replace_wm)
|
||||
--
|
||||
2.35.1
|
||||
|
@ -0,0 +1,324 @@
|
||||
From d3d8ab8eabc3178f3c31ee71dcc926297ff1c1b0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 8 Feb 2022 17:14:06 +0100
|
||||
Subject: [PATCH 1/2] shaped-texture: Pass along the snippet to the texture
|
||||
tower
|
||||
|
||||
The snippet is used make sure the right source is sampled in the shader.
|
||||
This wasn't done in the texture tower, meaning the textures from the
|
||||
tower were not correct.
|
||||
|
||||
Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/528
|
||||
---
|
||||
src/compositor/meta-shaped-texture.c | 2 ++
|
||||
src/compositor/meta-texture-tower.c | 27 +++++++++++++++++++++++++++
|
||||
src/compositor/meta-texture-tower.h | 3 +++
|
||||
3 files changed, 32 insertions(+)
|
||||
|
||||
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
|
||||
index 095dd246f0c0..68919c5f1c5c 100644
|
||||
--- a/src/compositor/meta-shaped-texture.c
|
||||
+++ b/src/compositor/meta-shaped-texture.c
|
||||
@@ -1242,6 +1242,8 @@ meta_shaped_texture_set_snippet (MetaShapedTexture *stex,
|
||||
g_clear_pointer (&stex->snippet, cogl_object_unref);
|
||||
if (snippet)
|
||||
stex->snippet = cogl_object_ref (snippet);
|
||||
+
|
||||
+ meta_texture_tower_set_snippet (stex->paint_tower, snippet);
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/src/compositor/meta-texture-tower.c b/src/compositor/meta-texture-tower.c
|
||||
index 1fc4623e5e54..0ae717abe4d4 100644
|
||||
--- a/src/compositor/meta-texture-tower.c
|
||||
+++ b/src/compositor/meta-texture-tower.c
|
||||
@@ -62,6 +62,7 @@ struct _MetaTextureTower
|
||||
CoglOffscreen *fbos[MAX_TEXTURE_LEVELS];
|
||||
Box invalid[MAX_TEXTURE_LEVELS];
|
||||
CoglPipeline *pipeline_template;
|
||||
+ CoglSnippet *snippet;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -97,6 +98,7 @@ meta_texture_tower_free (MetaTextureTower *tower)
|
||||
cogl_object_unref (tower->pipeline_template);
|
||||
|
||||
meta_texture_tower_set_base_texture (tower, NULL);
|
||||
+ cogl_clear_object (&tower->snippet);
|
||||
|
||||
g_free (tower);
|
||||
}
|
||||
@@ -216,6 +218,28 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+meta_texture_tower_set_snippet (MetaTextureTower *tower,
|
||||
+ CoglSnippet *snippet)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (tower->snippet == snippet)
|
||||
+ return;
|
||||
+
|
||||
+ g_clear_pointer (&tower->snippet, cogl_object_unref);
|
||||
+
|
||||
+ if (snippet)
|
||||
+ tower->snippet = cogl_object_ref (snippet);
|
||||
+
|
||||
+ for (i = 1; i < tower->n_levels; i++)
|
||||
+ {
|
||||
+ cogl_clear_object (&tower->textures[i]);
|
||||
+ g_clear_object (&tower->fbos[i]);
|
||||
+ }
|
||||
+ cogl_clear_object (&tower->pipeline_template);
|
||||
+}
|
||||
+
|
||||
/* It generally looks worse if we scale up a window texture by even a
|
||||
* small amount than if we scale it down using bilinear filtering, so
|
||||
* we always pick the *larger* adjacent level. */
|
||||
@@ -408,6 +432,9 @@ texture_tower_revalidate (MetaTextureTower *tower,
|
||||
pipeline = cogl_pipeline_copy (tower->pipeline_template);
|
||||
cogl_pipeline_set_layer_texture (pipeline, 0, tower->textures[level - 1]);
|
||||
|
||||
+ if (tower->snippet && level == 1)
|
||||
+ cogl_pipeline_add_layer_snippet (pipeline, 0, tower->snippet);
|
||||
+
|
||||
cogl_framebuffer_draw_textured_rectangle (fb, pipeline,
|
||||
invalid->x1, invalid->y1,
|
||||
invalid->x2, invalid->y2,
|
||||
diff --git a/src/compositor/meta-texture-tower.h b/src/compositor/meta-texture-tower.h
|
||||
index 1f5b371467c9..5522dfbb16ac 100644
|
||||
--- a/src/compositor/meta-texture-tower.h
|
||||
+++ b/src/compositor/meta-texture-tower.h
|
||||
@@ -63,6 +63,9 @@ void meta_texture_tower_update_area (MetaTextureTower *tower,
|
||||
CoglTexture *meta_texture_tower_get_paint_texture (MetaTextureTower *tower,
|
||||
ClutterPaintContext *paint_context);
|
||||
|
||||
+void meta_texture_tower_set_snippet (MetaTextureTower *tower,
|
||||
+ CoglSnippet *snippet);
|
||||
+
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __META_TEXTURE_TOWER_H__ */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From b78a24dfebf56b04538058ff731890ee997d0d10 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Wed, 9 Feb 2022 12:41:14 +0100
|
||||
Subject: [PATCH 2/2] shaped-texture: Paint with the right layer snippet
|
||||
|
||||
When we get passed a "snippet" to the shaped texture, it's added as a
|
||||
pipeline layer snippet to change how the source texture is sampled. When
|
||||
we draw from a texture tower however we have allocated regular textures
|
||||
which doesn't need any special layer snippet, so create separate
|
||||
pipelines for those that doesn't use that snippet.
|
||||
|
||||
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/528
|
||||
---
|
||||
src/compositor/meta-shaped-texture.c | 126 +++++++++++++++++++++------
|
||||
1 file changed, 98 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
|
||||
index 68919c5f1c5c..0d09f2f4e164 100644
|
||||
--- a/src/compositor/meta-shaped-texture.c
|
||||
+++ b/src/compositor/meta-shaped-texture.c
|
||||
@@ -91,8 +91,12 @@ struct _MetaShapedTexture
|
||||
CoglSnippet *snippet;
|
||||
|
||||
CoglPipeline *base_pipeline;
|
||||
+ CoglPipeline *unmasked_pipeline;
|
||||
+ CoglPipeline *unmasked_tower_pipeline;
|
||||
CoglPipeline *masked_pipeline;
|
||||
+ CoglPipeline *masked_tower_pipeline;
|
||||
CoglPipeline *unblended_pipeline;
|
||||
+ CoglPipeline *unblended_tower_pipeline;
|
||||
|
||||
gboolean is_y_inverted;
|
||||
|
||||
@@ -243,8 +247,12 @@ static void
|
||||
meta_shaped_texture_reset_pipelines (MetaShapedTexture *stex)
|
||||
{
|
||||
g_clear_pointer (&stex->base_pipeline, cogl_object_unref);
|
||||
+ g_clear_pointer (&stex->unmasked_pipeline, cogl_object_unref);
|
||||
+ g_clear_pointer (&stex->unmasked_tower_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->masked_pipeline, cogl_object_unref);
|
||||
+ g_clear_pointer (&stex->masked_tower_pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&stex->unblended_pipeline, cogl_object_unref);
|
||||
+ g_clear_pointer (&stex->unblended_tower_pipeline, cogl_object_unref);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -381,9 +389,6 @@ get_base_pipeline (MetaShapedTexture *stex,
|
||||
|
||||
cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
|
||||
|
||||
- if (stex->snippet)
|
||||
- cogl_pipeline_add_layer_snippet (pipeline, 0, stex->snippet);
|
||||
-
|
||||
stex->base_pipeline = pipeline;
|
||||
|
||||
return stex->base_pipeline;
|
||||
@@ -391,47 +396,112 @@ get_base_pipeline (MetaShapedTexture *stex,
|
||||
|
||||
static CoglPipeline *
|
||||
get_unmasked_pipeline (MetaShapedTexture *stex,
|
||||
- CoglContext *ctx)
|
||||
+ CoglContext *ctx,
|
||||
+ CoglTexture *tex)
|
||||
{
|
||||
- return get_base_pipeline (stex, ctx);
|
||||
+ if (stex->texture == tex)
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
+
|
||||
+ if (stex->unmasked_pipeline)
|
||||
+ return stex->unmasked_pipeline;
|
||||
+
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ if (stex->snippet)
|
||||
+ cogl_pipeline_add_layer_snippet (pipeline, 0, stex->snippet);
|
||||
+
|
||||
+ stex->unmasked_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
+
|
||||
+ if (stex->unmasked_tower_pipeline)
|
||||
+ return stex->unmasked_tower_pipeline;
|
||||
+
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ stex->unmasked_tower_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
}
|
||||
|
||||
static CoglPipeline *
|
||||
get_masked_pipeline (MetaShapedTexture *stex,
|
||||
- CoglContext *ctx)
|
||||
+ CoglContext *ctx,
|
||||
+ CoglTexture *tex)
|
||||
{
|
||||
- CoglPipeline *pipeline;
|
||||
+ if (stex->texture == tex)
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
|
||||
- if (stex->masked_pipeline)
|
||||
- return stex->masked_pipeline;
|
||||
+ if (stex->masked_pipeline)
|
||||
+ return stex->masked_pipeline;
|
||||
|
||||
- pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
- cogl_pipeline_set_layer_combine (pipeline, 1,
|
||||
- "RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||
- NULL);
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ cogl_pipeline_set_layer_combine (pipeline, 1,
|
||||
+ "RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||
+ NULL);
|
||||
+ if (stex->snippet)
|
||||
+ cogl_pipeline_add_layer_snippet (pipeline, 0, stex->snippet);
|
||||
|
||||
- stex->masked_pipeline = pipeline;
|
||||
+ stex->masked_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
|
||||
- return pipeline;
|
||||
+ if (stex->masked_tower_pipeline)
|
||||
+ return stex->masked_tower_pipeline;
|
||||
+
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ cogl_pipeline_set_layer_combine (pipeline, 1,
|
||||
+ "RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||
+ NULL);
|
||||
+
|
||||
+ stex->masked_tower_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
}
|
||||
|
||||
static CoglPipeline *
|
||||
get_unblended_pipeline (MetaShapedTexture *stex,
|
||||
- CoglContext *ctx)
|
||||
+ CoglContext *ctx,
|
||||
+ CoglTexture *tex)
|
||||
{
|
||||
- CoglPipeline *pipeline;
|
||||
+ if (stex->texture == tex)
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
|
||||
- if (stex->unblended_pipeline)
|
||||
- return stex->unblended_pipeline;
|
||||
+ if (stex->unblended_pipeline)
|
||||
+ return stex->unblended_pipeline;
|
||||
|
||||
- pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
- cogl_pipeline_set_layer_combine (pipeline, 0,
|
||||
- "RGBA = REPLACE (TEXTURE)",
|
||||
- NULL);
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ cogl_pipeline_set_layer_combine (pipeline, 0,
|
||||
+ "RGBA = REPLACE (TEXTURE)",
|
||||
+ NULL);
|
||||
+ if (stex->snippet)
|
||||
+ cogl_pipeline_add_layer_snippet (pipeline, 0, stex->snippet);
|
||||
|
||||
- stex->unblended_pipeline = pipeline;
|
||||
+ stex->unblended_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ CoglPipeline *pipeline;
|
||||
|
||||
- return pipeline;
|
||||
+ if (stex->unblended_tower_pipeline)
|
||||
+ return stex->unblended_tower_pipeline;
|
||||
+
|
||||
+ pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
|
||||
+ cogl_pipeline_set_layer_combine (pipeline, 0,
|
||||
+ "RGBA = REPLACE (TEXTURE)",
|
||||
+ NULL);
|
||||
+
|
||||
+ stex->unblended_tower_pipeline = pipeline;
|
||||
+ return pipeline;
|
||||
+ }
|
||||
}
|
||||
|
||||
static CoglPipeline *
|
||||
@@ -742,7 +812,7 @@ do_paint_content (MetaShapedTexture *stex,
|
||||
{
|
||||
CoglPipeline *opaque_pipeline;
|
||||
|
||||
- opaque_pipeline = get_unblended_pipeline (stex, ctx);
|
||||
+ opaque_pipeline = get_unblended_pipeline (stex, ctx, paint_tex);
|
||||
cogl_pipeline_set_layer_texture (opaque_pipeline, 0, paint_tex);
|
||||
cogl_pipeline_set_layer_filters (opaque_pipeline, 0, filter, filter);
|
||||
|
||||
@@ -786,11 +856,11 @@ do_paint_content (MetaShapedTexture *stex,
|
||||
|
||||
if (stex->mask_texture == NULL)
|
||||
{
|
||||
- blended_pipeline = get_unmasked_pipeline (stex, ctx);
|
||||
+ blended_pipeline = get_unmasked_pipeline (stex, ctx, paint_tex);
|
||||
}
|
||||
else
|
||||
{
|
||||
- blended_pipeline = get_masked_pipeline (stex, ctx);
|
||||
+ blended_pipeline = get_masked_pipeline (stex, ctx, paint_tex);
|
||||
cogl_pipeline_set_layer_texture (blended_pipeline, 1, stex->mask_texture);
|
||||
cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,490 @@
|
||||
From acb3e966b26ea55019a148d6482f5aa4c05275a9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 8 Feb 2022 15:58:33 +0100
|
||||
Subject: [PATCH 1/4] drm-buffer: Keep track of handle as well
|
||||
|
||||
This handle is used by the legacy KMS API; lets avoid having to have GBM
|
||||
specific code where this is done by letting the MetaDrmBuffer API, that
|
||||
already has this information, expose it.
|
||||
---
|
||||
src/backends/native/meta-drm-buffer-dumb.c | 1 +
|
||||
src/backends/native/meta-drm-buffer-gbm.c | 1 +
|
||||
src/backends/native/meta-drm-buffer-import.c | 1 +
|
||||
src/backends/native/meta-drm-buffer-private.h | 1 +
|
||||
src/backends/native/meta-drm-buffer.c | 10 ++++++++++
|
||||
src/backends/native/meta-drm-buffer.h | 2 ++
|
||||
6 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/src/backends/native/meta-drm-buffer-dumb.c b/src/backends/native/meta-drm-buffer-dumb.c
|
||||
index 373eb5c73581..b5e15528a1c6 100644
|
||||
--- a/src/backends/native/meta-drm-buffer-dumb.c
|
||||
+++ b/src/backends/native/meta-drm-buffer-dumb.c
|
||||
@@ -194,6 +194,7 @@ init_dumb_buffer_in_impl (MetaKmsImpl *impl,
|
||||
.width = data->width,
|
||||
.height = data->height,
|
||||
.format = data->format,
|
||||
+ .handle = create_arg.handle,
|
||||
.handles = { create_arg.handle },
|
||||
.strides = { create_arg.pitch },
|
||||
};
|
||||
diff --git a/src/backends/native/meta-drm-buffer-gbm.c b/src/backends/native/meta-drm-buffer-gbm.c
|
||||
index 48ee9eb048ba..fa45dd98b91e 100644
|
||||
--- a/src/backends/native/meta-drm-buffer-gbm.c
|
||||
+++ b/src/backends/native/meta-drm-buffer-gbm.c
|
||||
@@ -119,6 +119,7 @@ init_fb_id (MetaDrmBufferGbm *buffer_gbm,
|
||||
fb_args.width = gbm_bo_get_width (bo);
|
||||
fb_args.height = gbm_bo_get_height (bo);
|
||||
fb_args.format = gbm_bo_get_format (bo);
|
||||
+ fb_args.handle = gbm_bo_get_handle (bo).u32;
|
||||
|
||||
if (!meta_drm_buffer_ensure_fb_id (META_DRM_BUFFER (buffer_gbm),
|
||||
use_modifiers, &fb_args, error))
|
||||
diff --git a/src/backends/native/meta-drm-buffer-import.c b/src/backends/native/meta-drm-buffer-import.c
|
||||
index 1e5a38246172..ea744953cb9b 100644
|
||||
--- a/src/backends/native/meta-drm-buffer-import.c
|
||||
+++ b/src/backends/native/meta-drm-buffer-import.c
|
||||
@@ -125,6 +125,7 @@ import_gbm_buffer (MetaDrmBufferImport *buffer_import,
|
||||
fb_args.width = gbm_bo_get_width (primary_bo);
|
||||
fb_args.height = gbm_bo_get_height (primary_bo);
|
||||
fb_args.format = gbm_bo_get_format (primary_bo);
|
||||
+ fb_args.handle = gbm_bo_get_handle (primary_bo).u32;
|
||||
|
||||
imported_bo = dmabuf_to_gbm_bo (importer,
|
||||
dmabuf_fd,
|
||||
diff --git a/src/backends/native/meta-drm-buffer-private.h b/src/backends/native/meta-drm-buffer-private.h
|
||||
index 2c77eb957948..f660d3a7f363 100644
|
||||
--- a/src/backends/native/meta-drm-buffer-private.h
|
||||
+++ b/src/backends/native/meta-drm-buffer-private.h
|
||||
@@ -33,6 +33,7 @@ typedef struct _MetaDrmFbArgs
|
||||
uint32_t offsets[4];
|
||||
uint32_t strides[4];
|
||||
uint64_t modifiers[4];
|
||||
+ uint32_t handle;
|
||||
} MetaDrmFbArgs;
|
||||
|
||||
struct _MetaDrmBufferClass
|
||||
diff --git a/src/backends/native/meta-drm-buffer.c b/src/backends/native/meta-drm-buffer.c
|
||||
index 81a36196e528..a0f8055b3107 100644
|
||||
--- a/src/backends/native/meta-drm-buffer.c
|
||||
+++ b/src/backends/native/meta-drm-buffer.c
|
||||
@@ -50,6 +50,7 @@ typedef struct _MetaDrmBufferPrivate
|
||||
{
|
||||
MetaKmsDevice *device;
|
||||
uint32_t fb_id;
|
||||
+ uint32_t handle;
|
||||
} MetaDrmBufferPrivate;
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaDrmBuffer, meta_drm_buffer,
|
||||
@@ -139,6 +140,7 @@ meta_drm_buffer_ensure_fb_in_impl (MetaDrmBuffer *buffer,
|
||||
}
|
||||
|
||||
priv->fb_id = fb_id;
|
||||
+ priv->handle = fb_args->handle;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -242,6 +244,14 @@ meta_drm_buffer_get_fb_id (MetaDrmBuffer *buffer)
|
||||
return priv->fb_id;
|
||||
}
|
||||
|
||||
+uint32_t
|
||||
+meta_drm_buffer_get_handle (MetaDrmBuffer *buffer)
|
||||
+{
|
||||
+ MetaDrmBufferPrivate *priv = meta_drm_buffer_get_instance_private (buffer);
|
||||
+
|
||||
+ return priv->handle;
|
||||
+}
|
||||
+
|
||||
int
|
||||
meta_drm_buffer_get_width (MetaDrmBuffer *buffer)
|
||||
{
|
||||
diff --git a/src/backends/native/meta-drm-buffer.h b/src/backends/native/meta-drm-buffer.h
|
||||
index 1647d399e7f2..476264ce753e 100644
|
||||
--- a/src/backends/native/meta-drm-buffer.h
|
||||
+++ b/src/backends/native/meta-drm-buffer.h
|
||||
@@ -34,6 +34,8 @@ G_DECLARE_DERIVABLE_TYPE (MetaDrmBuffer,
|
||||
|
||||
uint32_t meta_drm_buffer_get_fb_id (MetaDrmBuffer *buffer);
|
||||
|
||||
+uint32_t meta_drm_buffer_get_handle (MetaDrmBuffer *buffer);
|
||||
+
|
||||
int meta_drm_buffer_get_width (MetaDrmBuffer *buffer);
|
||||
|
||||
int meta_drm_buffer_get_height (MetaDrmBuffer *buffer);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From bdd2f1dd0a67743085c84f6e060160fbd28122df Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 8 Feb 2022 16:00:17 +0100
|
||||
Subject: [PATCH 2/4] kms/impl-device/simple: Get the buffer handle from
|
||||
MetaDrmBuffer
|
||||
|
||||
This avoids buffer implementation specific code where it shouldn't
|
||||
matter.
|
||||
---
|
||||
src/backends/native/meta-kms-impl-device-simple.c | 15 ++-------------
|
||||
1 file changed, 2 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-kms-impl-device-simple.c b/src/backends/native/meta-kms-impl-device-simple.c
|
||||
index 1519962b8ed7..1663a2e9cacd 100644
|
||||
--- a/src/backends/native/meta-kms-impl-device-simple.c
|
||||
+++ b/src/backends/native/meta-kms-impl-device-simple.c
|
||||
@@ -1182,20 +1182,9 @@ process_cursor_plane_assignment (MetaKmsImplDevice *impl_device,
|
||||
height = plane_assignment->dst_rect.height;
|
||||
|
||||
if (plane_assignment->buffer)
|
||||
- {
|
||||
- MetaDrmBufferGbm *buffer_gbm =
|
||||
- META_DRM_BUFFER_GBM (plane_assignment->buffer);
|
||||
- struct gbm_bo *bo;
|
||||
- union gbm_bo_handle handle;
|
||||
-
|
||||
- bo = meta_drm_buffer_gbm_get_bo (buffer_gbm);
|
||||
- handle = gbm_bo_get_handle (bo);
|
||||
- handle_u32 = handle.u32;
|
||||
- }
|
||||
+ handle_u32 = meta_drm_buffer_get_handle (plane_assignment->buffer);
|
||||
else
|
||||
- {
|
||||
- handle_u32 = 0;
|
||||
- }
|
||||
+ handle_u32 = 0;
|
||||
|
||||
meta_topic (META_DEBUG_KMS,
|
||||
"[simple] Setting HW cursor of CRTC %u (%s) to %u "
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From d781f140b7197d3c9cd67f8fded4e2b58a4eda92 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 8 Feb 2022 15:05:32 +0100
|
||||
Subject: [PATCH 3/4] cursor-renderer/native: Move buffer creation to helper
|
||||
|
||||
---
|
||||
.../native/meta-cursor-renderer-native.c | 134 ++++++++++++------
|
||||
1 file changed, 89 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
|
||||
index 098ef24bdf2e..2bcbe6b2c8b0 100644
|
||||
--- a/src/backends/native/meta-cursor-renderer-native.c
|
||||
+++ b/src/backends/native/meta-cursor-renderer-native.c
|
||||
@@ -1215,6 +1215,81 @@ ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
|
||||
return cursor_priv;
|
||||
}
|
||||
|
||||
+static MetaDrmBuffer *
|
||||
+create_cursor_drm_buffer_gbm (MetaGpuKms *gpu_kms,
|
||||
+ uint8_t *pixels,
|
||||
+ int width,
|
||||
+ int height,
|
||||
+ int stride,
|
||||
+ int cursor_width,
|
||||
+ int cursor_height,
|
||||
+ uint32_t format,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
|
||||
+ struct gbm_device *gbm_device;
|
||||
+ struct gbm_bo *bo;
|
||||
+ uint8_t buf[4 * cursor_width * cursor_height];
|
||||
+ int i;
|
||||
+ MetaDrmBufferGbm *buffer_gbm;
|
||||
+
|
||||
+ gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
+ if (!gbm_device_is_format_supported (gbm_device, format,
|
||||
+ GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
||||
+ {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
+ "Buffer format not supported");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ bo = gbm_bo_create (gbm_device, cursor_width, cursor_height,
|
||||
+ format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
|
||||
+ if (!bo)
|
||||
+ {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
+ "Failed to allocate gbm_bo: %s", g_strerror (errno));
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ memset (buf, 0, sizeof (buf));
|
||||
+ for (i = 0; i < height; i++)
|
||||
+ memcpy (buf + i * 4 * cursor_width, pixels + i * stride, width * 4);
|
||||
+ if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
|
||||
+ {
|
||||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||
+ "Failed write to gbm_bo: %s", g_strerror (errno));
|
||||
+ gbm_bo_destroy (bo);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ buffer_gbm = meta_drm_buffer_gbm_new_take (kms_device, bo, FALSE, error);
|
||||
+ if (!buffer_gbm)
|
||||
+ {
|
||||
+ gbm_bo_destroy (bo);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return META_DRM_BUFFER (buffer_gbm);
|
||||
+}
|
||||
+
|
||||
+static MetaDrmBuffer *
|
||||
+create_cursor_drm_buffer (MetaGpuKms *gpu_kms,
|
||||
+ uint8_t *pixels,
|
||||
+ int width,
|
||||
+ int height,
|
||||
+ int stride,
|
||||
+ int cursor_width,
|
||||
+ int cursor_height,
|
||||
+ uint32_t format,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ return create_cursor_drm_buffer_gbm (gpu_kms, pixels,
|
||||
+ width, height, stride,
|
||||
+ cursor_width, cursor_height,
|
||||
+ format,
|
||||
+ error);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
@@ -1226,8 +1301,9 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
|
||||
uint32_t gbm_format)
|
||||
{
|
||||
uint64_t cursor_width, cursor_height;
|
||||
+ MetaDrmBuffer *buffer;
|
||||
MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
|
||||
- struct gbm_device *gbm_device;
|
||||
+ g_autoptr (GError) error = NULL;
|
||||
|
||||
cursor_renderer_gpu_data =
|
||||
meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
|
||||
@@ -1244,52 +1320,20 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
|
||||
return;
|
||||
}
|
||||
|
||||
- gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
- if (gbm_device_is_format_supported (gbm_device, gbm_format,
|
||||
- GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
||||
- {
|
||||
- MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
|
||||
- struct gbm_bo *bo;
|
||||
- uint8_t buf[4 * cursor_width * cursor_height];
|
||||
- uint i;
|
||||
- g_autoptr (GError) error = NULL;
|
||||
- MetaDrmBufferGbm *buffer_gbm;
|
||||
-
|
||||
- bo = gbm_bo_create (gbm_device, cursor_width, cursor_height,
|
||||
- gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
|
||||
- if (!bo)
|
||||
- {
|
||||
- meta_warning ("Failed to allocate HW cursor buffer");
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- memset (buf, 0, sizeof(buf));
|
||||
- for (i = 0; i < height; i++)
|
||||
- memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
|
||||
- if (gbm_bo_write (bo, buf, cursor_width * cursor_height * 4) != 0)
|
||||
- {
|
||||
- meta_warning ("Failed to write cursors buffer data: %s",
|
||||
- g_strerror (errno));
|
||||
- gbm_bo_destroy (bo);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- buffer_gbm = meta_drm_buffer_gbm_new_take (kms_device, bo, FALSE, &error);
|
||||
- if (!buffer_gbm)
|
||||
- {
|
||||
- meta_warning ("Failed to create DRM buffer wrapper: %s",
|
||||
- error->message);
|
||||
- gbm_bo_destroy (bo);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- set_pending_cursor_sprite_buffer (cursor_sprite, gpu_kms,
|
||||
- META_DRM_BUFFER (buffer_gbm));
|
||||
- }
|
||||
- else
|
||||
+ buffer = create_cursor_drm_buffer (gpu_kms,
|
||||
+ pixels,
|
||||
+ width, height, rowstride,
|
||||
+ cursor_width,
|
||||
+ cursor_height,
|
||||
+ gbm_format,
|
||||
+ &error);
|
||||
+ if (!buffer)
|
||||
{
|
||||
- meta_warning ("HW cursor for format %d not supported", gbm_format);
|
||||
+ g_warning ("Realizing HW cursor failed: %s", error->message);
|
||||
+ return;
|
||||
}
|
||||
+
|
||||
+ set_pending_cursor_sprite_buffer (cursor_sprite, gpu_kms, buffer);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From 717baf8dc1dd2f043350dd354bc4905285ba3337 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
Date: Tue, 8 Feb 2022 15:38:37 +0100
|
||||
Subject: [PATCH 4/4] cursor-renderer/native: Support allocating dumb buffers
|
||||
|
||||
---
|
||||
.../native/meta-cursor-renderer-native.c | 88 ++++++++++++++-----
|
||||
1 file changed, 67 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
|
||||
index 2bcbe6b2c8b0..18ffdf37dac4 100644
|
||||
--- a/src/backends/native/meta-cursor-renderer-native.c
|
||||
+++ b/src/backends/native/meta-cursor-renderer-native.c
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "backends/meta-monitor-manager-private.h"
|
||||
#include "backends/meta-output.h"
|
||||
#include "backends/native/meta-crtc-kms.h"
|
||||
+#include "backends/native/meta-drm-buffer-dumb.h"
|
||||
#include "backends/native/meta-drm-buffer-gbm.h"
|
||||
#include "backends/native/meta-kms-device.h"
|
||||
#include "backends/native/meta-kms-plane.h"
|
||||
@@ -1216,24 +1217,23 @@ ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
|
||||
}
|
||||
|
||||
static MetaDrmBuffer *
|
||||
-create_cursor_drm_buffer_gbm (MetaGpuKms *gpu_kms,
|
||||
- uint8_t *pixels,
|
||||
- int width,
|
||||
- int height,
|
||||
- int stride,
|
||||
- int cursor_width,
|
||||
- int cursor_height,
|
||||
- uint32_t format,
|
||||
- GError **error)
|
||||
+create_cursor_drm_buffer_gbm (MetaGpuKms *gpu_kms,
|
||||
+ struct gbm_device *gbm_device,
|
||||
+ uint8_t *pixels,
|
||||
+ int width,
|
||||
+ int height,
|
||||
+ int stride,
|
||||
+ int cursor_width,
|
||||
+ int cursor_height,
|
||||
+ uint32_t format,
|
||||
+ GError **error)
|
||||
{
|
||||
MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
|
||||
- struct gbm_device *gbm_device;
|
||||
struct gbm_bo *bo;
|
||||
uint8_t buf[4 * cursor_width * cursor_height];
|
||||
int i;
|
||||
MetaDrmBufferGbm *buffer_gbm;
|
||||
|
||||
- gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
if (!gbm_device_is_format_supported (gbm_device, format,
|
||||
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
||||
{
|
||||
@@ -1272,6 +1272,38 @@ create_cursor_drm_buffer_gbm (MetaGpuKms *gpu_kms,
|
||||
return META_DRM_BUFFER (buffer_gbm);
|
||||
}
|
||||
|
||||
+static MetaDrmBuffer *
|
||||
+create_cursor_drm_buffer_dumb (MetaGpuKms *gpu_kms,
|
||||
+ uint8_t *pixels,
|
||||
+ int width,
|
||||
+ int height,
|
||||
+ int stride,
|
||||
+ int cursor_width,
|
||||
+ int cursor_height,
|
||||
+ uint32_t format,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
|
||||
+ MetaDrmBufferDumb *buffer_dumb;
|
||||
+ int i;
|
||||
+ uint8_t *data;
|
||||
+
|
||||
+ buffer_dumb = meta_drm_buffer_dumb_new (kms_device,
|
||||
+ cursor_width, cursor_height,
|
||||
+ format,
|
||||
+ error);
|
||||
+ if (!buffer_dumb)
|
||||
+ return NULL;
|
||||
+
|
||||
+ data = meta_drm_buffer_dumb_get_data (buffer_dumb);
|
||||
+
|
||||
+ memset (data, 0, cursor_width * cursor_height * 4);
|
||||
+ for (i = 0; i < height; i++)
|
||||
+ memcpy (data + i * 4 * cursor_width, pixels + i * stride, width * 4);
|
||||
+
|
||||
+ return META_DRM_BUFFER (buffer_dumb);
|
||||
+}
|
||||
+
|
||||
static MetaDrmBuffer *
|
||||
create_cursor_drm_buffer (MetaGpuKms *gpu_kms,
|
||||
uint8_t *pixels,
|
||||
@@ -1283,11 +1315,27 @@ create_cursor_drm_buffer (MetaGpuKms *gpu_kms,
|
||||
uint32_t format,
|
||||
GError **error)
|
||||
{
|
||||
- return create_cursor_drm_buffer_gbm (gpu_kms, pixels,
|
||||
- width, height, stride,
|
||||
- cursor_width, cursor_height,
|
||||
- format,
|
||||
- error);
|
||||
+ struct gbm_device *gbm_device;
|
||||
+
|
||||
+ gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
+ if (gbm_device)
|
||||
+ {
|
||||
+ return create_cursor_drm_buffer_gbm (gpu_kms, gbm_device,
|
||||
+ pixels,
|
||||
+ width, height, stride,
|
||||
+ cursor_width, cursor_height,
|
||||
+ format,
|
||||
+ error);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ return create_cursor_drm_buffer_dumb (gpu_kms,
|
||||
+ pixels,
|
||||
+ width, height, stride,
|
||||
+ cursor_width, cursor_height,
|
||||
+ format,
|
||||
+ error);
|
||||
+ }
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1629,6 +1677,9 @@ realize_cursor_sprite_from_wl_buffer_for_gpu (MetaCursorRenderer *renderer,
|
||||
}
|
||||
|
||||
gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
+ if (!gbm_device)
|
||||
+ return;
|
||||
+
|
||||
bo = gbm_bo_import (gbm_device,
|
||||
GBM_BO_IMPORT_WL_BUFFER,
|
||||
buffer,
|
||||
@@ -1807,13 +1858,8 @@ init_hw_cursor_support_for_gpu (MetaGpuKms *gpu_kms)
|
||||
{
|
||||
MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
|
||||
MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
|
||||
- struct gbm_device *gbm_device;
|
||||
uint64_t width, height;
|
||||
|
||||
- gbm_device = meta_gbm_device_from_gpu (gpu_kms);
|
||||
- if (!gbm_device)
|
||||
- return;
|
||||
-
|
||||
cursor_renderer_gpu_data =
|
||||
meta_create_cursor_renderer_native_gpu_data (gpu_kms);
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
@ -0,0 +1,817 @@
|
||||
From 22fe64732e11199901d4a35f9d3c63d5d6deb3a3 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Tue, 1 Jun 2021 11:44:20 +0200
|
||||
Subject: [PATCH 1/6] backends/x11: Support synaptics configuration
|
||||
|
||||
The code is taken mostly as-is from g-s-d, so we can drag the
|
||||
dead horse a bit longer.
|
||||
---
|
||||
src/backends/x11/meta-input-settings-x11.c | 274 +++++++++++++++++++++
|
||||
1 file changed, 274 insertions(+)
|
||||
|
||||
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
||||
index 371e2f60e..426056390 100644
|
||||
--- a/src/backends/x11/meta-input-settings-x11.c
|
||||
+++ b/src/backends/x11/meta-input-settings-x11.c
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "backends/x11/meta-input-settings-x11.h"
|
||||
|
||||
#include <gdk/gdkx.h>
|
||||
+#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/extensions/XInput2.h>
|
||||
@@ -165,6 +166,183 @@ change_property (ClutterInputDevice *device,
|
||||
meta_XFree (data_ret);
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+is_device_synaptics (ClutterInputDevice *device)
|
||||
+{
|
||||
+ guchar *has_setting;
|
||||
+
|
||||
+ /* We just need looking for a synaptics-specific property */
|
||||
+ has_setting = get_property (device, "Synaptics Off", XA_INTEGER, 8, 1);
|
||||
+ if (!has_setting)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ meta_XFree (has_setting);
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
||||
+ gboolean tap_enabled,
|
||||
+ gboolean left_handed)
|
||||
+{
|
||||
+ MetaDisplay *display = meta_get_display ();
|
||||
+ MetaBackend *backend = meta_get_backend ();
|
||||
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
+ int device_id;
|
||||
+ XDevice *xdevice;
|
||||
+ guchar *tap_action, *buttons;
|
||||
+ guint buttons_capacity = 16, n_buttons;
|
||||
+
|
||||
+ device_id = meta_input_device_x11_get_device_id (device);
|
||||
+ xdevice = XOpenDevice (xdisplay, device_id);
|
||||
+ if (!xdevice)
|
||||
+ return;
|
||||
+
|
||||
+ tap_action = get_property (device, "Synaptics Tap Action",
|
||||
+ XA_INTEGER, 8, 7);
|
||||
+ if (!tap_action)
|
||||
+ goto out;
|
||||
+
|
||||
+ tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0;
|
||||
+ tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0;
|
||||
+ tap_action[6] = tap_enabled ? 2 : 0;
|
||||
+
|
||||
+ change_property (device, "Synaptics Tap Action",
|
||||
+ XA_INTEGER, 8, tap_action, 7);
|
||||
+ meta_XFree (tap_action);
|
||||
+
|
||||
+ clutter_x11_trap_x_errors();
|
||||
+ buttons = g_new (guchar, buttons_capacity);
|
||||
+ n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice,
|
||||
+ buttons, buttons_capacity);
|
||||
+
|
||||
+ while (n_buttons > buttons_capacity)
|
||||
+ {
|
||||
+ buttons_capacity = n_buttons;
|
||||
+ buttons = (guchar *) g_realloc (buttons,
|
||||
+ buttons_capacity * sizeof (guchar));
|
||||
+
|
||||
+ n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice,
|
||||
+ buttons, buttons_capacity);
|
||||
+ }
|
||||
+
|
||||
+ buttons[0] = left_handed ? 3 : 1;
|
||||
+ buttons[2] = left_handed ? 1 : 3;
|
||||
+ XSetDeviceButtonMapping (xdisplay, xdevice, buttons, n_buttons);
|
||||
+ g_free (buttons);
|
||||
+
|
||||
+ if (clutter_x11_untrap_x_errors())
|
||||
+ {
|
||||
+ g_warning ("Could not set synaptics touchpad left-handed for %s",
|
||||
+ clutter_input_device_get_device_name (device));
|
||||
+ }
|
||||
+
|
||||
+ out:
|
||||
+ XCloseDevice (xdisplay, xdevice);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+change_synaptics_speed (ClutterInputDevice *device,
|
||||
+ gdouble speed)
|
||||
+{
|
||||
+ MetaDisplay *display = meta_get_display ();
|
||||
+ MetaBackend *backend = meta_get_backend ();
|
||||
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
+ int device_id;
|
||||
+ XDevice *xdevice;
|
||||
+ XPtrFeedbackControl feedback;
|
||||
+ XFeedbackState *states, *state;
|
||||
+ int i, num_feedbacks, motion_threshold, numerator, denominator;
|
||||
+ gfloat motion_acceleration;
|
||||
+
|
||||
+ device_id = meta_input_device_x11_get_device_id (device);
|
||||
+ xdevice = XOpenDevice (xdisplay, device_id);
|
||||
+ if (!xdevice)
|
||||
+ return;
|
||||
+ /* Get the list of feedbacks for the device */
|
||||
+ clutter_x11_trap_x_errors();
|
||||
+ states = XGetFeedbackControl (xdisplay, xdevice, &num_feedbacks);
|
||||
+ if (clutter_x11_untrap_x_errors())
|
||||
+ return;
|
||||
+ if (!states)
|
||||
+ return;
|
||||
+
|
||||
+ /* Calculate acceleration and threshold */
|
||||
+ motion_acceleration = (speed + 1) * 5; /* speed is [-1..1], map to [0..10] */
|
||||
+ motion_threshold = CLAMP (10 - floor (motion_acceleration), 1, 10);
|
||||
+
|
||||
+ if (motion_acceleration >= 1.0)
|
||||
+ {
|
||||
+ /* we want to get the acceleration, with a resolution of 0.5
|
||||
+ */
|
||||
+ if ((motion_acceleration - floor (motion_acceleration)) < 0.25)
|
||||
+ {
|
||||
+ numerator = floor (motion_acceleration);
|
||||
+ denominator = 1;
|
||||
+ }
|
||||
+ else if ((motion_acceleration - floor (motion_acceleration)) < 0.5)
|
||||
+ {
|
||||
+ numerator = ceil (2.0 * motion_acceleration);
|
||||
+ denominator = 2;
|
||||
+ }
|
||||
+ else if ((motion_acceleration - floor (motion_acceleration)) < 0.75)
|
||||
+ {
|
||||
+ numerator = floor (2.0 *motion_acceleration);
|
||||
+ denominator = 2;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ numerator = ceil (motion_acceleration);
|
||||
+ denominator = 1;
|
||||
+ }
|
||||
+ }
|
||||
+ else if (motion_acceleration < 1.0 && motion_acceleration > 0)
|
||||
+ {
|
||||
+ /* This we do to 1/10ths */
|
||||
+ numerator = floor (motion_acceleration * 10) + 1;
|
||||
+ denominator= 10;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ numerator = -1;
|
||||
+ denominator = -1;
|
||||
+ }
|
||||
+
|
||||
+ clutter_x11_trap_x_errors();
|
||||
+
|
||||
+ state = (XFeedbackState *) states;
|
||||
+
|
||||
+ for (i = 0; i < num_feedbacks; i++)
|
||||
+ {
|
||||
+ if (state->class == PtrFeedbackClass)
|
||||
+ {
|
||||
+ /* And tell the device */
|
||||
+ feedback.class = PtrFeedbackClass;
|
||||
+ feedback.length = sizeof (XPtrFeedbackControl);
|
||||
+ feedback.id = state->id;
|
||||
+ feedback.threshold = motion_threshold;
|
||||
+ feedback.accelNum = numerator;
|
||||
+ feedback.accelDenom = denominator;
|
||||
+
|
||||
+ XChangeFeedbackControl (xdisplay, xdevice,
|
||||
+ DvAccelNum | DvAccelDenom | DvThreshold,
|
||||
+ (XFeedbackControl *) &feedback);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ state = (XFeedbackState *) ((char *) state + state->length);
|
||||
+ }
|
||||
+
|
||||
+ if (clutter_x11_untrap_x_errors())
|
||||
+ {
|
||||
+ g_warning ("Could not set synaptics touchpad acceleration for %s",
|
||||
+ clutter_input_device_get_device_name (device));
|
||||
+ }
|
||||
+
|
||||
+ XFreeFeedbackList (states);
|
||||
+ XCloseDevice (xdisplay, xdevice);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
@@ -173,6 +351,13 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
||||
guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
|
||||
guchar *available;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ values[0] = mode != G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED;
|
||||
+ change_property (device, "Synaptics Off", XA_INTEGER, 8, &values, 1);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
available = get_property (device, "libinput Send Events Modes Available",
|
||||
XA_INTEGER, 8, 2);
|
||||
if (!available)
|
||||
@@ -225,6 +410,12 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings,
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
gfloat value = speed;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ change_synaptics_speed (device, speed);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_property (device, "libinput Accel Speed",
|
||||
XInternAtom (xdisplay, "FLOAT", False),
|
||||
32, &value, 1);
|
||||
@@ -251,6 +442,19 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
||||
else
|
||||
{
|
||||
value = enabled ? 1 : 0;
|
||||
+
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ GSettings *settings;
|
||||
+
|
||||
+ settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad");
|
||||
+ change_synaptics_tap_left_handed (device,
|
||||
+ g_settings_get_boolean (settings, "tap-to-click"),
|
||||
+ enabled);
|
||||
+ g_object_unref (settings);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_property (device, "libinput Left Handed Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
@@ -274,6 +478,20 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
|
||||
{
|
||||
guchar value = (enabled) ? 1 : 0;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ GDesktopTouchpadHandedness handedness;
|
||||
+ GSettings *settings;
|
||||
+
|
||||
+ settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad");
|
||||
+ handedness = g_settings_get_enum (settings, "left-handed");
|
||||
+ g_object_unref (settings);
|
||||
+
|
||||
+ change_synaptics_tap_left_handed (device, enabled,
|
||||
+ handedness == G_DESKTOP_TOUCHPAD_HANDEDNESS_LEFT);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_property (device, "libinput Tapping Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
@@ -307,6 +525,27 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
|
||||
{
|
||||
guchar value = (inverted) ? 1 : 0;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ gint32 *scrolling_distance;
|
||||
+
|
||||
+ scrolling_distance = get_property (device, "Synaptics Scrolling Distance",
|
||||
+ XA_INTEGER, 32, 2);
|
||||
+ if (scrolling_distance)
|
||||
+ {
|
||||
+ scrolling_distance[0] = inverted ?
|
||||
+ -abs (scrolling_distance[0]) : abs (scrolling_distance[0]);
|
||||
+ scrolling_distance[1] = inverted ?
|
||||
+ -abs (scrolling_distance[1]) : abs (scrolling_distance[1]);
|
||||
+
|
||||
+ change_property (device, "Synaptics Scrolling Distance",
|
||||
+ XA_INTEGER, 32, scrolling_distance, 2);
|
||||
+ meta_XFree (scrolling_distance);
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_property (device, "libinput Natural Scrolling Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
@@ -320,6 +559,41 @@ change_scroll_method (ClutterInputDevice *device,
|
||||
guchar *current = NULL;
|
||||
guchar *available = NULL;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ switch (method)
|
||||
+ {
|
||||
+ case SCROLL_METHOD_FIELD_EDGE:
|
||||
+ current = get_property (device, "Synaptics Edge Scrolling",
|
||||
+ XA_INTEGER, 8, 3);
|
||||
+ if (current)
|
||||
+ {
|
||||
+ current[0] = enabled;
|
||||
+ current[1] = enabled;
|
||||
+ change_property (device, "Synaptics Edge Scrolling",
|
||||
+ XA_INTEGER, 8, current, 3);
|
||||
+ meta_XFree (current);
|
||||
+ }
|
||||
+ break;
|
||||
+ case SCROLL_METHOD_FIELD_2FG:
|
||||
+ current = get_property (device, "Synaptics Two-Finger Scrolling",
|
||||
+ XA_INTEGER, 8, 2);
|
||||
+ if (current)
|
||||
+ {
|
||||
+ current[0] = enabled;
|
||||
+ current[1] = enabled;
|
||||
+ change_property (device, "Synaptics Two-Finger Scrolling",
|
||||
+ XA_INTEGER, 8, current, 2);
|
||||
+ meta_XFree (current);
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !available[method])
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
||||
From 963ff120898e7e42d80d5761753e76adcf16c132 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Tue, 13 Feb 2018 11:44:40 +0100
|
||||
Subject: [PATCH 2/6] clutter: Extend touchpad device property check for
|
||||
Synaptics
|
||||
|
||||
So we reliably get CLUTTER_TOUCHPAD_DEVICE for those. The other heuristics
|
||||
to get the device type may fall short.
|
||||
---
|
||||
src/backends/x11/meta-seat-x11.c | 17 +++++++++++++++--
|
||||
1 file changed, 15 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c
|
||||
index d43834bd7..73938e22e 100644
|
||||
--- a/src/backends/x11/meta-seat-x11.c
|
||||
+++ b/src/backends/x11/meta-seat-x11.c
|
||||
@@ -246,7 +246,8 @@ is_touch_device (XIAnyClassInfo **classes,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-is_touchpad_device (XIDeviceInfo *info)
|
||||
+query_exists_device_property (XIDeviceInfo *info,
|
||||
+ const char *property)
|
||||
{
|
||||
gulong nitems, bytes_after;
|
||||
uint32_t *data = NULL;
|
||||
@@ -254,7 +255,7 @@ is_touchpad_device (XIDeviceInfo *info)
|
||||
Atom type;
|
||||
Atom prop;
|
||||
|
||||
- prop = XInternAtom (clutter_x11_get_default_display (), "libinput Tapping Enabled", True);
|
||||
+ prop = XInternAtom (clutter_x11_get_default_display (), property, True);
|
||||
if (prop == None)
|
||||
return FALSE;
|
||||
|
||||
@@ -275,6 +276,18 @@ is_touchpad_device (XIDeviceInfo *info)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+is_touchpad_device (XIDeviceInfo *info)
|
||||
+{
|
||||
+ if (query_exists_device_property (info, "libinput Tapping Enabled"))
|
||||
+ return TRUE;
|
||||
+
|
||||
+ if (query_exists_device_property (info, "Synaptics Off"))
|
||||
+ return TRUE;
|
||||
+
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
get_device_ids (XIDeviceInfo *info,
|
||||
char **vendor_id,
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
||||
From 86cc1b46dae01da619980af826eb9bf81cf31143 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Matos <tiagomatos@gmail.com>
|
||||
Date: Mon, 9 Oct 2017 18:39:52 +0200
|
||||
Subject: [PATCH 3/6] backends/x11: Add a synaptics check for two finger scroll
|
||||
availability
|
||||
|
||||
Commit "backends/x11: Support synaptics configuration" added support
|
||||
for synaptics two finger scrolling but didn't add the code to check
|
||||
that it is available resulting in the upper layer always assuming it
|
||||
isn't.
|
||||
---
|
||||
src/backends/x11/meta-input-settings-x11.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
||||
index 426056390..db2b2a4fb 100644
|
||||
--- a/src/backends/x11/meta-input-settings-x11.c
|
||||
+++ b/src/backends/x11/meta-input-settings-x11.c
|
||||
@@ -637,6 +637,17 @@ meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings *settings,
|
||||
guchar *available = NULL;
|
||||
gboolean has_two_finger = TRUE;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ available = get_property (device, "Synaptics Capabilities",
|
||||
+ XA_INTEGER, 8, 4);
|
||||
+ if (!available || !available[3])
|
||||
+ has_two_finger = FALSE;
|
||||
+
|
||||
+ meta_XFree (available);
|
||||
+ return has_two_finger;
|
||||
+ }
|
||||
+
|
||||
available = get_property (device, "libinput Scroll Methods Available",
|
||||
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
||||
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
||||
From 32e2da07eeb1f9edcf03751285a756ab1acca6a8 Mon Sep 17 00:00:00 2001
|
||||
From: Rui Matos <tiagomatos@gmail.com>
|
||||
Date: Mon, 9 Oct 2017 18:55:56 +0200
|
||||
Subject: [PATCH 4/6] backends/x11: Add disable while typing support for
|
||||
synaptics
|
||||
|
||||
This is basically a copy of the old g-s-d mouse plugin code to manage
|
||||
syndaemon when the synaptics driver is being used.
|
||||
---
|
||||
src/backends/x11/meta-input-settings-x11.c | 112 +++++++++++++++++++++
|
||||
1 file changed, 112 insertions(+)
|
||||
|
||||
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
||||
index db2b2a4fb..bf9d769e9 100644
|
||||
--- a/src/backends/x11/meta-input-settings-x11.c
|
||||
+++ b/src/backends/x11/meta-input-settings-x11.c
|
||||
@@ -35,6 +35,9 @@
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
#include <gudev/gudev.h>
|
||||
#endif
|
||||
+#ifdef __linux
|
||||
+#include <sys/prctl.h>
|
||||
+#endif
|
||||
|
||||
#include "backends/x11/meta-backend-x11.h"
|
||||
#include "backends/x11/meta-input-device-x11.h"
|
||||
@@ -46,6 +49,8 @@ typedef struct _MetaInputSettingsX11Private
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
GUdevClient *udev_client;
|
||||
#endif
|
||||
+ gboolean syndaemon_spawned;
|
||||
+ GPid syndaemon_pid;
|
||||
} MetaInputSettingsX11Private;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
|
||||
@@ -343,6 +348,107 @@ change_synaptics_speed (ClutterInputDevice *device,
|
||||
XCloseDevice (xdisplay, xdevice);
|
||||
}
|
||||
|
||||
+/* Ensure that syndaemon dies together with us, to avoid running several of
|
||||
+ * them */
|
||||
+static void
|
||||
+setup_syndaemon (gpointer user_data)
|
||||
+{
|
||||
+#ifdef __linux
|
||||
+ prctl (PR_SET_PDEATHSIG, SIGHUP);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+have_program_in_path (const char *name)
|
||||
+{
|
||||
+ gchar *path;
|
||||
+ gboolean result;
|
||||
+
|
||||
+ path = g_find_program_in_path (name);
|
||||
+ result = (path != NULL);
|
||||
+ g_free (path);
|
||||
+ return result;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+syndaemon_died (GPid pid,
|
||||
+ gint status,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (user_data);
|
||||
+ MetaInputSettingsX11Private *priv =
|
||||
+ meta_input_settings_x11_get_instance_private (settings_x11);
|
||||
+ GError *error = NULL;
|
||||
+
|
||||
+ if (!g_spawn_check_exit_status (status, &error))
|
||||
+ {
|
||||
+ if ((WIFSIGNALED (status) && WTERMSIG (status) != SIGHUP) ||
|
||||
+ error->domain == G_SPAWN_EXIT_ERROR)
|
||||
+ g_warning ("Syndaemon exited unexpectedly: %s", error->message);
|
||||
+ g_error_free (error);
|
||||
+ }
|
||||
+
|
||||
+ g_spawn_close_pid (pid);
|
||||
+ priv->syndaemon_spawned = FALSE;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+set_synaptics_disable_w_typing (MetaInputSettings *settings,
|
||||
+ gboolean state)
|
||||
+{
|
||||
+ MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (settings);
|
||||
+ MetaInputSettingsX11Private *priv =
|
||||
+ meta_input_settings_x11_get_instance_private (settings_x11);
|
||||
+
|
||||
+ if (state)
|
||||
+ {
|
||||
+ GError *error = NULL;
|
||||
+ GPtrArray *args;
|
||||
+
|
||||
+ if (priv->syndaemon_spawned)
|
||||
+ return;
|
||||
+
|
||||
+ if (!have_program_in_path ("syndaemon"))
|
||||
+ return;
|
||||
+
|
||||
+ args = g_ptr_array_new ();
|
||||
+
|
||||
+ g_ptr_array_add (args, (gpointer)"syndaemon");
|
||||
+ g_ptr_array_add (args, (gpointer)"-i");
|
||||
+ g_ptr_array_add (args, (gpointer)"1.0");
|
||||
+ g_ptr_array_add (args, (gpointer)"-t");
|
||||
+ g_ptr_array_add (args, (gpointer)"-K");
|
||||
+ g_ptr_array_add (args, (gpointer)"-R");
|
||||
+ g_ptr_array_add (args, NULL);
|
||||
+
|
||||
+ /* we must use G_SPAWN_DO_NOT_REAP_CHILD to avoid
|
||||
+ * double-forking, otherwise syndaemon will immediately get
|
||||
+ * killed again through (PR_SET_PDEATHSIG when the intermediate
|
||||
+ * process dies */
|
||||
+ g_spawn_async (g_get_home_dir (), (char **) args->pdata, NULL,
|
||||
+ G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD, setup_syndaemon, NULL,
|
||||
+ &priv->syndaemon_pid, &error);
|
||||
+
|
||||
+ priv->syndaemon_spawned = (error == NULL);
|
||||
+ g_ptr_array_free (args, TRUE);
|
||||
+
|
||||
+ if (error)
|
||||
+ {
|
||||
+ g_warning ("Failed to launch syndaemon: %s", error->message);
|
||||
+ g_error_free (error);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ g_child_watch_add (priv->syndaemon_pid, syndaemon_died, settings);
|
||||
+ }
|
||||
+ }
|
||||
+ else if (priv->syndaemon_spawned)
|
||||
+ {
|
||||
+ kill (priv->syndaemon_pid, SIGHUP);
|
||||
+ priv->syndaemon_spawned = FALSE;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
@@ -467,6 +573,12 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
|
||||
{
|
||||
guchar value = (enabled) ? 1 : 0;
|
||||
|
||||
+ if (is_device_synaptics (device))
|
||||
+ {
|
||||
+ set_synaptics_disable_w_typing (settings, enabled);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_property (device, "libinput Disable While Typing Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
||||
From 6da0bfe86f416d3cfc5cc6993e8e2f6ca255e85a Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Wed, 13 Jun 2018 13:48:24 +0200
|
||||
Subject: [PATCH 5/6] clutter: Only reset scroll axes on slave devices
|
||||
|
||||
As a plus, unknown source device IDs will just warn instead of crash.
|
||||
---
|
||||
src/backends/x11/meta-seat-x11.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/backends/x11/meta-seat-x11.c b/src/backends/x11/meta-seat-x11.c
|
||||
index 73938e22e..6d2c7d374 100644
|
||||
--- a/src/backends/x11/meta-seat-x11.c
|
||||
+++ b/src/backends/x11/meta-seat-x11.c
|
||||
@@ -2362,7 +2362,9 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat,
|
||||
seat->has_pointer_focus = FALSE;
|
||||
}
|
||||
|
||||
- meta_input_device_x11_reset_scroll_info (source_device);
|
||||
+ if (clutter_input_device_get_device_mode (source_device) ==
|
||||
+ CLUTTER_INPUT_MODE_PHYSICAL)
|
||||
+ meta_input_device_x11_reset_scroll_info (source_device);
|
||||
|
||||
clutter_event_set_device (event, device);
|
||||
clutter_event_set_source_device (event, source_device);
|
||||
--
|
||||
2.36.1
|
||||
|
||||
|
||||
From da60cf38c7fcec68f8e79a8a3a174e551c07a64a Mon Sep 17 00:00:00 2001
|
||||
From: Rui Matos <tiagomatos@gmail.com>
|
||||
Date: Tue, 10 Oct 2017 19:07:27 +0200
|
||||
Subject: [PATCH 6/6] backends/x11: Support plain old X device configuration
|
||||
|
||||
We re-use part of the code added to support synaptics and add a few
|
||||
bits specific for xorg-x11-drv-evdev devices.
|
||||
---
|
||||
src/backends/x11/meta-input-settings-x11.c | 98 +++++++++++++++++-----
|
||||
1 file changed, 75 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
||||
index bf9d769e9..49dcb74f1 100644
|
||||
--- a/src/backends/x11/meta-input-settings-x11.c
|
||||
+++ b/src/backends/x11/meta-input-settings-x11.c
|
||||
@@ -185,17 +185,30 @@ is_device_synaptics (ClutterInputDevice *device)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+is_device_libinput (ClutterInputDevice *device)
|
||||
+{
|
||||
+ guchar *has_setting;
|
||||
+
|
||||
+ /* We just need looking for a synaptics-specific property */
|
||||
+ has_setting = get_property (device, "libinput Send Events Modes Available", XA_INTEGER, 8, 2);
|
||||
+ if (!has_setting)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ meta_XFree (has_setting);
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
-change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
||||
- gboolean tap_enabled,
|
||||
- gboolean left_handed)
|
||||
+change_x_device_left_handed (ClutterInputDevice *device,
|
||||
+ gboolean left_handed)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
int device_id;
|
||||
XDevice *xdevice;
|
||||
- guchar *tap_action, *buttons;
|
||||
+ guchar *buttons;
|
||||
guint buttons_capacity = 16, n_buttons;
|
||||
|
||||
device_id = meta_input_device_x11_get_device_id (device);
|
||||
@@ -203,19 +216,6 @@ change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
||||
if (!xdevice)
|
||||
return;
|
||||
|
||||
- tap_action = get_property (device, "Synaptics Tap Action",
|
||||
- XA_INTEGER, 8, 7);
|
||||
- if (!tap_action)
|
||||
- goto out;
|
||||
-
|
||||
- tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0;
|
||||
- tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0;
|
||||
- tap_action[6] = tap_enabled ? 2 : 0;
|
||||
-
|
||||
- change_property (device, "Synaptics Tap Action",
|
||||
- XA_INTEGER, 8, tap_action, 7);
|
||||
- meta_XFree (tap_action);
|
||||
-
|
||||
clutter_x11_trap_x_errors();
|
||||
buttons = g_new (guchar, buttons_capacity);
|
||||
n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice,
|
||||
@@ -238,17 +238,39 @@ change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
||||
|
||||
if (clutter_x11_untrap_x_errors())
|
||||
{
|
||||
- g_warning ("Could not set synaptics touchpad left-handed for %s",
|
||||
+ g_warning ("Could not set left-handed for %s",
|
||||
clutter_input_device_get_device_name (device));
|
||||
}
|
||||
|
||||
- out:
|
||||
XCloseDevice (xdisplay, xdevice);
|
||||
}
|
||||
|
||||
static void
|
||||
-change_synaptics_speed (ClutterInputDevice *device,
|
||||
- gdouble speed)
|
||||
+change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
||||
+ gboolean tap_enabled,
|
||||
+ gboolean left_handed)
|
||||
+{
|
||||
+ guchar *tap_action;
|
||||
+
|
||||
+ tap_action = get_property (device, "Synaptics Tap Action",
|
||||
+ XA_INTEGER, 8, 7);
|
||||
+ if (!tap_action)
|
||||
+ return;
|
||||
+
|
||||
+ tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0;
|
||||
+ tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0;
|
||||
+ tap_action[6] = tap_enabled ? 2 : 0;
|
||||
+
|
||||
+ change_property (device, "Synaptics Tap Action",
|
||||
+ XA_INTEGER, 8, tap_action, 7);
|
||||
+ meta_XFree (tap_action);
|
||||
+
|
||||
+ change_x_device_left_handed (device, left_handed);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+change_x_device_speed (ClutterInputDevice *device,
|
||||
+ gdouble speed)
|
||||
{
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
@@ -348,6 +370,23 @@ change_synaptics_speed (ClutterInputDevice *device,
|
||||
XCloseDevice (xdisplay, xdevice);
|
||||
}
|
||||
|
||||
+static void
|
||||
+change_x_device_scroll_button (ClutterInputDevice *device,
|
||||
+ guint button)
|
||||
+{
|
||||
+ guchar value;
|
||||
+
|
||||
+ value = button > 0 ? 1 : 0;
|
||||
+ change_property (device, "Evdev Wheel Emulation",
|
||||
+ XA_INTEGER, 8, &value, 1);
|
||||
+ if (button > 0)
|
||||
+ {
|
||||
+ value = button;
|
||||
+ change_property (device, "Evdev Wheel Emulation Button",
|
||||
+ XA_INTEGER, 8, &value, 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/* Ensure that syndaemon dies together with us, to avoid running several of
|
||||
* them */
|
||||
static void
|
||||
@@ -516,9 +555,10 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings,
|
||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||||
gfloat value = speed;
|
||||
|
||||
- if (is_device_synaptics (device))
|
||||
+ if (is_device_synaptics (device) ||
|
||||
+ !is_device_libinput (device))
|
||||
{
|
||||
- change_synaptics_speed (device, speed);
|
||||
+ change_x_device_speed (device, speed);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -560,6 +600,11 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
||||
g_object_unref (settings);
|
||||
return;
|
||||
}
|
||||
+ else if (!is_device_libinput (device) && device_type != CLUTTER_PAD_DEVICE)
|
||||
+ {
|
||||
+ change_x_device_left_handed (device, enabled);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
change_property (device, "libinput Left Handed Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
@@ -777,7 +822,14 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
|
||||
{
|
||||
gchar lock = button_lock;
|
||||
|
||||
+ if (!is_device_libinput (device))
|
||||
+ {
|
||||
+ change_x_device_scroll_button (device, button);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
change_scroll_method (device, SCROLL_METHOD_FIELD_BUTTON, button != 0);
|
||||
+
|
||||
change_property (device, "libinput Button Scrolling Button",
|
||||
XA_CARDINAL, 32, &button, 1);
|
||||
change_property (device, "libinput Button Scrolling Button Lock Enabled",
|
||||
--
|
||||
2.36.1
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue