Backport a couple of MRs to fix blocker issues
This commit is contained in:
parent
275ef5ebf0
commit
f60389e323
247
2901.patch
Normal file
247
2901.patch
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
From 74b3c9c09cc9389fffd8fae7c5af781f548e3cbc Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||||
|
Date: Mon, 6 Mar 2023 23:47:02 +0100
|
||||||
|
Subject: [PATCH 1/4] clutter/frame-clock: Warn if frame clock is disposed
|
||||||
|
while dispatching
|
||||||
|
|
||||||
|
This shouldn't happen, but warn anyway to be a bit more helpful if
|
||||||
|
things go bad.
|
||||||
|
---
|
||||||
|
clutter/clutter/clutter-frame-clock.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
|
||||||
|
index e5d1a44e2e..eeba108e15 100644
|
||||||
|
--- a/clutter/clutter/clutter-frame-clock.c
|
||||||
|
+++ b/clutter/clutter/clutter-frame-clock.c
|
||||||
|
@@ -957,6 +957,8 @@ clutter_frame_clock_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
ClutterFrameClock *frame_clock = CLUTTER_FRAME_CLOCK (object);
|
||||||
|
|
||||||
|
+ g_warn_if_fail (frame_clock->state != CLUTTER_FRAME_CLOCK_STATE_DISPATCHING);
|
||||||
|
+
|
||||||
|
if (frame_clock->source)
|
||||||
|
{
|
||||||
|
g_signal_emit (frame_clock, signals[DESTROY], 0);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
|
From 607d45d24fe672efc7cae755da4ec643b9a377ad Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||||
|
Date: Mon, 6 Mar 2023 23:48:36 +0100
|
||||||
|
Subject: [PATCH 2/4] monitor-manager: Use guint for handle IDs
|
||||||
|
|
||||||
|
To follow convention.
|
||||||
|
---
|
||||||
|
src/backends/meta-monitor-manager-private.h | 5 ++---
|
||||||
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
|
||||||
|
index d6a92bf2ac..56431ba600 100644
|
||||||
|
--- a/src/backends/meta-monitor-manager-private.h
|
||||||
|
+++ b/src/backends/meta-monitor-manager-private.h
|
||||||
|
@@ -153,9 +153,8 @@ struct _MetaMonitorManager
|
||||||
|
GList *logical_monitors;
|
||||||
|
MetaLogicalMonitor *primary_logical_monitor;
|
||||||
|
|
||||||
|
- int dbus_name_id;
|
||||||
|
-
|
||||||
|
- int persistent_timeout_id;
|
||||||
|
+ guint dbus_name_id;
|
||||||
|
+ guint persistent_timeout_id;
|
||||||
|
|
||||||
|
guint panel_orientation_managed : 1;
|
||||||
|
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
|
From f8dc4809322da31a68643fdf698d877703589e23 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||||
|
Date: Mon, 6 Mar 2023 23:49:39 +0100
|
||||||
|
Subject: [PATCH 3/4] monitor-manager: Use g_clear_handle() to clean up D-Bus
|
||||||
|
name owning
|
||||||
|
|
||||||
|
---
|
||||||
|
src/backends/meta-monitor-manager.c | 6 +-----
|
||||||
|
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
|
||||||
|
index 19cbb263d2..d3a794ea6c 100644
|
||||||
|
--- a/src/backends/meta-monitor-manager.c
|
||||||
|
+++ b/src/backends/meta-monitor-manager.c
|
||||||
|
@@ -1357,11 +1357,7 @@ meta_monitor_manager_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||||
|
|
||||||
|
- if (manager->dbus_name_id != 0)
|
||||||
|
- {
|
||||||
|
- g_bus_unown_name (manager->dbus_name_id);
|
||||||
|
- manager->dbus_name_id = 0;
|
||||||
|
- }
|
||||||
|
+ g_clear_handle_id (&manager->dbus_name_id, g_bus_unown_name);
|
||||||
|
|
||||||
|
g_clear_object (&manager->display_config);
|
||||||
|
g_clear_object (&manager->config_manager);
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
|
From 45ba864f2d5489225a6a1b5e915061c2aad289ab Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||||
|
Date: Tue, 7 Mar 2023 00:06:30 +0100
|
||||||
|
Subject: [PATCH 4/4] monitor-manager: Restore old config in idle callback when
|
||||||
|
unconfirmed
|
||||||
|
|
||||||
|
We might get told to restore the old monitor configuration by the
|
||||||
|
monitor configuration prompt, in case the user pressed "revert" or
|
||||||
|
equivalent. This might be in response to a button press, and those
|
||||||
|
happen during frame clock dispatch. If we would restore an old
|
||||||
|
configuration during dispatch, it means we would reconfigure the
|
||||||
|
monitors including their stage views while dispatching, which means we'd
|
||||||
|
destroy the frame clock while it's dispatching.
|
||||||
|
|
||||||
|
Doing that causes problems, as the frame clock isn't expecting to be
|
||||||
|
destroyed mid-function. Specifically,
|
||||||
|
|
||||||
|
We'd enter
|
||||||
|
|
||||||
|
clutter_frame_clock_dispatch (clutter-frame-clock.c:811)
|
||||||
|
frame_clock_source_dispatch (clutter-frame-clock.c:839)
|
||||||
|
g_main_dispatch (gmain.c:3454)
|
||||||
|
g_main_context_dispatch (gmain.c:4172)
|
||||||
|
g_main_context_iterate.constprop.0 (gmain.c:4248)
|
||||||
|
g_main_loop_run (gmain.c:4448)
|
||||||
|
meta_context_run_main_loop (meta-context.c:482)
|
||||||
|
main (main.c:663)
|
||||||
|
|
||||||
|
which would first call
|
||||||
|
|
||||||
|
_clutter_process_event (clutter-main.c:920)
|
||||||
|
_clutter_stage_process_queued_events (clutter-stage.c:757)
|
||||||
|
handle_frame_clock_before_frame (clutter-stage-view.c:1150)
|
||||||
|
|
||||||
|
which would emit e.g. a button event all the way to a button press
|
||||||
|
handler, which would e.g. deny the new configuration:
|
||||||
|
|
||||||
|
restore_previous_config (meta-monitor-manager.c:1931)
|
||||||
|
confirm_configuration (meta-monitor-manager.c:2866)
|
||||||
|
meta_monitor_manager_confirm_configuration (meta-monitor-manager.c:2880)
|
||||||
|
meta_plugin_complete_display_change (meta-plugin.c:172)
|
||||||
|
|
||||||
|
That would then regenerate the monitor configuration and stage view
|
||||||
|
layout, which would destroy the old stage view and frame clock.
|
||||||
|
|
||||||
|
meta_stage_native_rebuild_views (meta-stage-native.c:68)
|
||||||
|
meta_backend_native_update_screen_size (meta-backend-native.c:457)
|
||||||
|
meta_backend_sync_screen_size (meta-backend.c:266)
|
||||||
|
meta_backend_monitors_changed (meta-backend.c:337)
|
||||||
|
meta_monitor_manager_notify_monitors_changed (meta-monitor-manager.c:3595)
|
||||||
|
meta_monitor_manager_rebuild (meta-monitor-manager.c:3683)
|
||||||
|
meta_monitor_manager_native_apply_monitors_config (meta-monitor-manager-native.c:343)
|
||||||
|
meta_monitor_manager_apply_monitors_config (meta-monitor-manager.c:704)
|
||||||
|
|
||||||
|
After returning back to the original clutter_frame_clock_dispatch()
|
||||||
|
frame, various state in the frame clock will be gone and we'd crash.
|
||||||
|
---
|
||||||
|
src/backends/meta-monitor-manager-private.h | 1 +
|
||||||
|
src/backends/meta-monitor-manager.c | 42 +++++++++------------
|
||||||
|
2 files changed, 19 insertions(+), 24 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
|
||||||
|
index 56431ba600..f9cd9ae312 100644
|
||||||
|
--- a/src/backends/meta-monitor-manager-private.h
|
||||||
|
+++ b/src/backends/meta-monitor-manager-private.h
|
||||||
|
@@ -154,6 +154,7 @@ struct _MetaMonitorManager
|
||||||
|
MetaLogicalMonitor *primary_logical_monitor;
|
||||||
|
|
||||||
|
guint dbus_name_id;
|
||||||
|
+ guint restore_config_id;
|
||||||
|
guint persistent_timeout_id;
|
||||||
|
|
||||||
|
guint panel_orientation_managed : 1;
|
||||||
|
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
|
||||||
|
index d3a794ea6c..e6df876307 100644
|
||||||
|
--- a/src/backends/meta-monitor-manager.c
|
||||||
|
+++ b/src/backends/meta-monitor-manager.c
|
||||||
|
@@ -1363,6 +1363,7 @@ meta_monitor_manager_dispose (GObject *object)
|
||||||
|
g_clear_object (&manager->config_manager);
|
||||||
|
|
||||||
|
g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove);
|
||||||
|
+ g_clear_handle_id (&manager->restore_config_id, g_source_remove);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
@@ -1961,12 +1962,6 @@ save_config_timeout (gpointer user_data)
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-cancel_persistent_confirmation (MetaMonitorManager *manager)
|
||||||
|
-{
|
||||||
|
- g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void
|
||||||
|
request_persistent_confirmation (MetaMonitorManager *manager)
|
||||||
|
{
|
||||||
|
@@ -2822,9 +2817,11 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (manager->persistent_timeout_id &&
|
||||||
|
- method != META_MONITORS_CONFIG_METHOD_VERIFY)
|
||||||
|
- cancel_persistent_confirmation (manager);
|
||||||
|
+ if (method != META_MONITORS_CONFIG_METHOD_VERIFY)
|
||||||
|
+ {
|
||||||
|
+ g_clear_handle_id (&manager->restore_config_id, g_source_remove);
|
||||||
|
+ g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (!meta_monitor_manager_apply_monitors_config (manager,
|
||||||
|
config,
|
||||||
|
@@ -2852,28 +2849,25 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet
|
||||||
|
#undef MONITOR_CONFIGS_FORMAT
|
||||||
|
#undef LOGICAL_MONITOR_CONFIG_FORMAT
|
||||||
|
|
||||||
|
-static void
|
||||||
|
-confirm_configuration (MetaMonitorManager *manager,
|
||||||
|
- gboolean confirmed)
|
||||||
|
-{
|
||||||
|
- if (confirmed)
|
||||||
|
- meta_monitor_config_manager_save_current (manager->config_manager);
|
||||||
|
- else
|
||||||
|
- restore_previous_config (manager);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void
|
||||||
|
meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
||||||
|
gboolean ok)
|
||||||
|
{
|
||||||
|
if (!manager->persistent_timeout_id)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ g_clear_handle_id (&manager->restore_config_id, g_source_remove);
|
||||||
|
+ g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove);
|
||||||
|
+
|
||||||
|
+ if (ok)
|
||||||
|
{
|
||||||
|
- /* too late */
|
||||||
|
- return;
|
||||||
|
+ meta_monitor_config_manager_save_current (manager->config_manager);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ manager->restore_config_id =
|
||||||
|
+ g_idle_add_once ((GSourceOnceFunc) restore_previous_config, manager);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- cancel_persistent_confirmation (manager);
|
||||||
|
- confirm_configuration (manager, ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
277
2912-rebased.patch
Normal file
277
2912-rebased.patch
Normal file
@ -0,0 +1,277 @@
|
|||||||
|
From 670c7cf4ccb1bd1ffa6e44507a8ffd734b0f72e4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||||
|
Date: Tue, 14 Mar 2023 17:28:24 +0100
|
||||||
|
Subject: [PATCH] monitor-manager: Apply switch-config in idle callback
|
||||||
|
|
||||||
|
Just as with restoring the previous monitor configuration in case the
|
||||||
|
user clicked "revert" in GNOME Shell's monitor configuration
|
||||||
|
confirmation dialog, we need to do switch configs in an idle callback as
|
||||||
|
well.
|
||||||
|
|
||||||
|
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2694
|
||||||
|
---
|
||||||
|
src/backends/meta-monitor-manager.c | 61 +++++++++++---
|
||||||
|
src/tests/native-kms-hotplug.c | 119 ++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 167 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
|
||||||
|
index 19cbb263d2..9b24294e89 100644
|
||||||
|
--- a/src/backends/meta-monitor-manager.c
|
||||||
|
+++ b/src/backends/meta-monitor-manager.c
|
||||||
|
@@ -116,6 +116,8 @@ typedef struct _MetaMonitorManagerPrivate
|
||||||
|
gboolean has_builtin_panel;
|
||||||
|
gboolean night_light_supported;
|
||||||
|
const char *experimental_hdr;
|
||||||
|
+
|
||||||
|
+ guint switch_config_handle_id;
|
||||||
|
} MetaMonitorManagerPrivate;
|
||||||
|
|
||||||
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitorManager, meta_monitor_manager,
|
||||||
|
@@ -1356,6 +1358,8 @@ static void
|
||||||
|
meta_monitor_manager_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||||
|
+ MetaMonitorManagerPrivate *priv =
|
||||||
|
+ meta_monitor_manager_get_instance_private (manager);
|
||||||
|
|
||||||
|
g_clear_handle_id (&manager->dbus_name_id, g_bus_unown_name);
|
||||||
|
|
||||||
|
@@ -1367,6 +1371,7 @@ meta_monitor_manager_dispose (GObject *object)
|
||||||
|
|
||||||
|
g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove);
|
||||||
|
g_clear_handle_id (&manager->restore_config_id, g_source_remove);
|
||||||
|
+ g_clear_handle_id (&priv->switch_config_handle_id, g_source_remove);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
@@ -3873,35 +3878,65 @@ meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager)
|
||||||
|
g_object_unref (config);
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-meta_monitor_manager_switch_config (MetaMonitorManager *manager,
|
||||||
|
- MetaMonitorSwitchConfigType config_type)
|
||||||
|
+typedef struct
|
||||||
|
{
|
||||||
|
- GError *error = NULL;
|
||||||
|
- MetaMonitorsConfig *config;
|
||||||
|
+ MetaMonitorManager *monitor_manager;
|
||||||
|
+ MetaMonitorSwitchConfigType config_type;
|
||||||
|
+} SwitchConfigData;
|
||||||
|
|
||||||
|
- g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN);
|
||||||
|
+static gboolean
|
||||||
|
+switch_config_idle_cb (gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ SwitchConfigData *data = user_data;
|
||||||
|
+ MetaMonitorManager *monitor_manager = data->monitor_manager;
|
||||||
|
+ MetaMonitorManagerPrivate *priv =
|
||||||
|
+ meta_monitor_manager_get_instance_private (monitor_manager);
|
||||||
|
+ MetaMonitorConfigManager *config_manager = monitor_manager->config_manager;
|
||||||
|
+ MetaMonitorsConfig *config;
|
||||||
|
+ g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
|
config =
|
||||||
|
- meta_monitor_config_manager_create_for_switch_config (manager->config_manager,
|
||||||
|
- config_type);
|
||||||
|
+ meta_monitor_config_manager_create_for_switch_config (config_manager,
|
||||||
|
+ data->config_type);
|
||||||
|
if (!config)
|
||||||
|
- return;
|
||||||
|
+ return G_SOURCE_REMOVE;
|
||||||
|
|
||||||
|
- if (!meta_monitor_manager_apply_monitors_config (manager,
|
||||||
|
+ if (!meta_monitor_manager_apply_monitors_config (monitor_manager,
|
||||||
|
config,
|
||||||
|
META_MONITORS_CONFIG_METHOD_TEMPORARY,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to use switch monitor configuration: %s",
|
||||||
|
error->message);
|
||||||
|
- g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- manager->current_switch_config = config_type;
|
||||||
|
+ monitor_manager->current_switch_config = data->config_type;
|
||||||
|
}
|
||||||
|
- g_object_unref (config);
|
||||||
|
+
|
||||||
|
+ priv->switch_config_handle_id = 0;
|
||||||
|
+ return G_SOURCE_REMOVE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+meta_monitor_manager_switch_config (MetaMonitorManager *manager,
|
||||||
|
+ MetaMonitorSwitchConfigType config_type)
|
||||||
|
+{
|
||||||
|
+ MetaMonitorManagerPrivate *priv =
|
||||||
|
+ meta_monitor_manager_get_instance_private (manager);
|
||||||
|
+ SwitchConfigData *data;
|
||||||
|
+
|
||||||
|
+ g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN);
|
||||||
|
+
|
||||||
|
+ data = g_new0 (SwitchConfigData, 1);
|
||||||
|
+ data->monitor_manager = manager;
|
||||||
|
+ data->config_type = config_type;
|
||||||
|
+
|
||||||
|
+ g_clear_handle_id (&priv->switch_config_handle_id, g_source_remove);
|
||||||
|
+ priv->switch_config_handle_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
|
||||||
|
+ switch_config_idle_cb,
|
||||||
|
+ data,
|
||||||
|
+ g_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
diff --git a/src/tests/native-kms-hotplug.c b/src/tests/native-kms-hotplug.c
|
||||||
|
index 4a6f2e0aac..3c60aa10a5 100644
|
||||||
|
--- a/src/tests/native-kms-hotplug.c
|
||||||
|
+++ b/src/tests/native-kms-hotplug.c
|
||||||
|
@@ -17,11 +17,16 @@
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
+#include <linux/input-event-codes.h>
|
||||||
|
+
|
||||||
|
+#include "backends/meta-logical-monitor.h"
|
||||||
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
+#include "backends/meta-virtual-monitor.h"
|
||||||
|
#include "backends/native/meta-backend-native.h"
|
||||||
|
#include "backends/native/meta-udev.h"
|
||||||
|
#include "meta-test/meta-context-test.h"
|
||||||
|
#include "tests/drm-mock/drm-mock.h"
|
||||||
|
+#include "tests/meta-test-utils.h"
|
||||||
|
|
||||||
|
typedef enum _State
|
||||||
|
{
|
||||||
|
@@ -207,6 +212,118 @@ meta_test_disconnect_connect (void)
|
||||||
|
g_signal_handler_disconnect (stage, presented_handler_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+on_key_release (ClutterActor *actor,
|
||||||
|
+ const ClutterEvent *event,
|
||||||
|
+ MetaMonitorManager *monitor_manager)
|
||||||
|
+{
|
||||||
|
+ if (clutter_event_get_key_symbol (event) == CLUTTER_KEY_a)
|
||||||
|
+ {
|
||||||
|
+ g_debug ("Switching config");
|
||||||
|
+ meta_monitor_manager_switch_config (monitor_manager,
|
||||||
|
+ META_MONITOR_SWITCH_CONFIG_ALL_MIRROR);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+on_monitors_changed (MetaMonitorManager *monitor_manager,
|
||||||
|
+ gboolean *monitors_changed)
|
||||||
|
+{
|
||||||
|
+ *monitors_changed = TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+meta_test_switch_config (void)
|
||||||
|
+{
|
||||||
|
+ MetaBackend *backend = meta_context_get_backend (test_context);
|
||||||
|
+ MetaMonitorManager *monitor_manager =
|
||||||
|
+ meta_backend_get_monitor_manager (backend);
|
||||||
|
+ ClutterActor *stage = meta_backend_get_stage (backend);
|
||||||
|
+ ClutterSeat *seat = meta_backend_get_default_seat (backend);
|
||||||
|
+ g_autoptr (ClutterVirtualInputDevice) virtual_keyboard = NULL;
|
||||||
|
+ g_autoptr (MetaVirtualMonitor) virtual_monitor = NULL;
|
||||||
|
+ GList *logical_monitors;
|
||||||
|
+ MetaRectangle logical_monitor_layout;
|
||||||
|
+ gulong after_paint_handler_id;
|
||||||
|
+ gulong presented_handler_id;
|
||||||
|
+ gboolean monitors_changed;
|
||||||
|
+ g_autoptr (GError) error = NULL;
|
||||||
|
+ ClutterActor *actor;
|
||||||
|
+ State state;
|
||||||
|
+
|
||||||
|
+ after_paint_handler_id = g_signal_connect (stage, "after-paint",
|
||||||
|
+ G_CALLBACK (on_after_paint),
|
||||||
|
+ &state);
|
||||||
|
+ presented_handler_id = g_signal_connect (stage, "presented",
|
||||||
|
+ G_CALLBACK (on_presented),
|
||||||
|
+ &state);
|
||||||
|
+ g_signal_connect (monitor_manager, "monitors-changed",
|
||||||
|
+ G_CALLBACK (on_monitors_changed),
|
||||||
|
+ &monitors_changed);
|
||||||
|
+
|
||||||
|
+ logical_monitors =
|
||||||
|
+ meta_monitor_manager_get_logical_monitors (monitor_manager);
|
||||||
|
+ g_assert_cmpuint (g_list_length (logical_monitors), ==, 1);
|
||||||
|
+ logical_monitor_layout =
|
||||||
|
+ meta_logical_monitor_get_layout (logical_monitors->data);
|
||||||
|
+
|
||||||
|
+ virtual_monitor = meta_create_test_monitor (test_context,
|
||||||
|
+ logical_monitor_layout.width,
|
||||||
|
+ logical_monitor_layout.height,
|
||||||
|
+ 60.0);
|
||||||
|
+
|
||||||
|
+ actor = clutter_actor_new ();
|
||||||
|
+ g_object_add_weak_pointer (G_OBJECT (actor), (gpointer *) &actor);
|
||||||
|
+ clutter_actor_insert_child_above (stage,
|
||||||
|
+ actor,
|
||||||
|
+ clutter_actor_get_first_child (stage));
|
||||||
|
+ clutter_actor_set_size (actor,
|
||||||
|
+ logical_monitor_layout.width,
|
||||||
|
+ logical_monitor_layout.height);
|
||||||
|
+ clutter_actor_set_position (actor, 0, 0);
|
||||||
|
+ clutter_actor_set_reactive (actor, TRUE);
|
||||||
|
+ clutter_actor_show (actor);
|
||||||
|
+ clutter_actor_grab_key_focus (actor);
|
||||||
|
+ g_signal_connect (actor, "key-press-event",
|
||||||
|
+ G_CALLBACK (on_key_release),
|
||||||
|
+ monitor_manager);
|
||||||
|
+
|
||||||
|
+ monitors_changed = FALSE;
|
||||||
|
+ g_signal_connect (monitor_manager, "monitors-changed",
|
||||||
|
+ G_CALLBACK (on_monitors_changed),
|
||||||
|
+ &monitors_changed);
|
||||||
|
+
|
||||||
|
+ g_debug ("Sending virtual keyboard event");
|
||||||
|
+ virtual_keyboard =
|
||||||
|
+ clutter_seat_create_virtual_device (seat, CLUTTER_KEYBOARD_DEVICE);
|
||||||
|
+ clutter_virtual_input_device_notify_key (virtual_keyboard,
|
||||||
|
+ CLUTTER_CURRENT_TIME,
|
||||||
|
+ KEY_A,
|
||||||
|
+ CLUTTER_KEY_STATE_PRESSED);
|
||||||
|
+ clutter_virtual_input_device_notify_key (virtual_keyboard,
|
||||||
|
+ CLUTTER_CURRENT_TIME,
|
||||||
|
+ KEY_A,
|
||||||
|
+ CLUTTER_KEY_STATE_RELEASED);
|
||||||
|
+
|
||||||
|
+ g_debug ("Waiting for monitors changed");
|
||||||
|
+ while (!monitors_changed)
|
||||||
|
+ g_main_context_iteration (NULL, TRUE);
|
||||||
|
+
|
||||||
|
+ g_debug ("Waiting for being repainted");
|
||||||
|
+ state = INIT;
|
||||||
|
+ clutter_actor_queue_redraw (stage);
|
||||||
|
+ while (state != PRESENTED)
|
||||||
|
+ g_main_context_iteration (NULL, TRUE);
|
||||||
|
+
|
||||||
|
+ clutter_actor_destroy (actor);
|
||||||
|
+ g_assert_null (actor);
|
||||||
|
+
|
||||||
|
+ g_signal_handler_disconnect (stage, after_paint_handler_id);
|
||||||
|
+ g_signal_handler_disconnect (stage, presented_handler_id);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
init_tests (void)
|
||||||
|
{
|
||||||
|
@@ -214,6 +331,8 @@ init_tests (void)
|
||||||
|
meta_test_reload);
|
||||||
|
g_test_add_func ("/hotplug/disconnect-connect",
|
||||||
|
meta_test_disconnect_connect);
|
||||||
|
+ g_test_add_func ("/hotplug/switch-config",
|
||||||
|
+ meta_test_switch_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
18
mutter.spec
18
mutter.spec
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
Name: mutter
|
Name: mutter
|
||||||
Version: 44~rc
|
Version: 44~rc
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
Summary: Window and compositing manager based on Clutter
|
Summary: Window and compositing manager based on Clutter
|
||||||
|
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -36,6 +36,18 @@ Patch3: 0001-place-Always-center-initial-setup-fedora-welcome.patch
|
|||||||
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2906
|
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2906
|
||||||
Patch4: 2906.patch
|
Patch4: 2906.patch
|
||||||
|
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=2175809
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2901
|
||||||
|
# Fix a crash when reverting Display settings
|
||||||
|
Patch5: 2901.patch
|
||||||
|
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=2177982
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/issues/2694
|
||||||
|
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2912
|
||||||
|
# Fix a crash when using win+P to change display configuration
|
||||||
|
# Rebased on 2901.patch
|
||||||
|
Patch6: 2912-rebased.patch
|
||||||
|
|
||||||
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0
|
BuildRequires: pkgconfig(gobject-introspection-1.0) >= 1.41.0
|
||||||
BuildRequires: pkgconfig(sm)
|
BuildRequires: pkgconfig(sm)
|
||||||
BuildRequires: pkgconfig(libwacom)
|
BuildRequires: pkgconfig(libwacom)
|
||||||
@ -179,6 +191,10 @@ the functionality of the installed %{name} package.
|
|||||||
%{_datadir}/mutter-%{mutter_api_version}/tests
|
%{_datadir}/mutter-%{mutter_api_version}/tests
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Mar 16 2023 Adam Williamson <awilliam@redhat.com> - 44~rc-5
|
||||||
|
- Backport MR #2901 to fix crash when reverting Display settings
|
||||||
|
- Backport MR #2912 to fix crash when using win+P shortcut
|
||||||
|
|
||||||
* Fri Mar 10 2023 Florian Müllner <fmuellner@redhat.com> - 44~rc-4
|
* Fri Mar 10 2023 Florian Müllner <fmuellner@redhat.com> - 44~rc-4
|
||||||
- Fix typo in centering patch
|
- Fix typo in centering patch
|
||||||
- Also check for possible future fedora-welcome ID
|
- Also check for possible future fedora-welcome ID
|
||||||
|
Loading…
Reference in New Issue
Block a user