backend: Add pause/resume vfuncs to MetaBackend

For now we only pause/resume the rendering in the base class but in the
next few commits, we'll move udev from native to generic and need to
pause/resume it as well.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4130>
This commit is contained in:
Sebastian Wick
2024-11-12 17:23:04 +01:00
parent 30c6104620
commit 10cbda69e6
3 changed files with 87 additions and 41 deletions

View File

@ -137,6 +137,10 @@ struct _MetaBackendClass
MetaPointerConstraint *constraint); MetaPointerConstraint *constraint);
gboolean (* is_headless) (MetaBackend *backend); gboolean (* is_headless) (MetaBackend *backend);
void (* pause) (MetaBackend *backend);
void (* resume) (MetaBackend *backend);
}; };
void meta_backend_destroy (MetaBackend *backend); void meta_backend_destroy (MetaBackend *backend);

View File

@ -630,6 +630,24 @@ meta_backend_real_is_headless (MetaBackend *backend)
return FALSE; return FALSE;
} }
static void
meta_backend_real_pause (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
meta_renderer_pause (priv->renderer);
}
static void
meta_backend_real_resume (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
meta_renderer_resume (priv->renderer);
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
}
void void
meta_backend_freeze_keyboard (MetaBackend *backend, meta_backend_freeze_keyboard (MetaBackend *backend,
uint32_t timestamp) uint32_t timestamp)
@ -863,6 +881,8 @@ meta_backend_class_init (MetaBackendClass *klass)
klass->is_lid_closed = meta_backend_real_is_lid_closed; klass->is_lid_closed = meta_backend_real_is_lid_closed;
klass->create_cursor_tracker = meta_backend_real_create_cursor_tracker; klass->create_cursor_tracker = meta_backend_real_create_cursor_tracker;
klass->is_headless = meta_backend_real_is_headless; klass->is_headless = meta_backend_real_is_headless;
klass->pause = meta_backend_real_pause;
klass->resume = meta_backend_real_resume;
obj_props[PROP_CONTEXT] = obj_props[PROP_CONTEXT] =
g_param_spec_object ("context", NULL, NULL, g_param_spec_object ("context", NULL, NULL,
@ -927,14 +947,59 @@ meta_backend_class_init (MetaBackendClass *klass)
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }
static void
meta_backend_pause (MetaBackend *backend)
{
COGL_TRACE_BEGIN_SCOPED (MetaBackendPause,
"Meta::Backend::pause()");
META_BACKEND_GET_CLASS (backend)->pause (backend);
}
static void
meta_backend_resume (MetaBackend *backend)
{
COGL_TRACE_BEGIN_SCOPED (MetaBackendResume,
"Meta::Backend::resume()");
META_BACKEND_GET_CLASS (backend)->resume (backend);
}
static void
on_session_active_changed (MetaLauncher *launcher,
GParamSpec *pspec,
MetaBackend *backend)
{
gboolean active = meta_launcher_is_session_active (launcher);
if (active)
meta_backend_resume (backend);
else
meta_backend_pause (backend);
}
static gboolean static gboolean
meta_backend_create_launcher (MetaBackend *backend, meta_backend_create_launcher (MetaBackend *backend,
MetaLauncher **launcher_out, MetaLauncher **launcher_out,
GError **error) GError **error)
{ {
return META_BACKEND_GET_CLASS (backend)->create_launcher (backend, g_autoptr (MetaLauncher) launcher = NULL;
launcher_out, gboolean ret;
error);
ret = META_BACKEND_GET_CLASS (backend)->create_launcher (backend,
&launcher,
error);
if (launcher)
{
g_signal_connect_object (launcher, "notify::session-active",
G_CALLBACK (on_session_active_changed),
backend,
G_CONNECT_DEFAULT);
}
*launcher_out = g_steal_pointer (&launcher);
return ret;
} }
static MetaMonitorManager * static MetaMonitorManager *

View File

@ -100,9 +100,9 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative,
meta_backend_native, meta_backend_native,
META_TYPE_BACKEND) META_TYPE_BACKEND)
static void meta_backend_native_resume (MetaBackendNative *native); static void meta_backend_native_resume (MetaBackend *backend);
static void meta_backend_native_pause (MetaBackendNative *native); static void meta_backend_native_pause (MetaBackend *backend);
static void static void
meta_backend_native_dispose (GObject *object) meta_backend_native_dispose (GObject *object)
@ -737,17 +737,6 @@ on_started (MetaContext *context,
meta_seat_native_start (META_SEAT_NATIVE (seat)); meta_seat_native_start (META_SEAT_NATIVE (seat));
} }
static void
on_session_active_changed (MetaLauncher *launcher,
GParamSpec *pspec,
MetaBackendNative *native)
{
if (meta_launcher_is_session_active (launcher))
meta_backend_native_resume (native);
else
meta_backend_native_pause (native);
}
static gboolean static gboolean
meta_backend_native_create_launcher (MetaBackend *backend, meta_backend_native_create_launcher (MetaBackend *backend,
MetaLauncher **launcher_out, MetaLauncher **launcher_out,
@ -795,10 +784,6 @@ meta_backend_native_create_launcher (MetaBackend *backend,
return FALSE; return FALSE;
} }
g_signal_connect (launcher, "notify::session-active",
G_CALLBACK (on_session_active_changed),
native);
*launcher_out = g_steal_pointer (&launcher); *launcher_out = g_steal_pointer (&launcher);
return TRUE; return TRUE;
} }
@ -895,6 +880,9 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->is_headless = meta_backend_native_is_headless; backend_class->is_headless = meta_backend_native_is_headless;
backend_class->pause = meta_backend_native_pause;
backend_class->resume = meta_backend_native_resume;
obj_props[PROP_MODE] = obj_props[PROP_MODE] =
g_param_spec_enum ("mode", NULL, NULL, g_param_spec_enum ("mode", NULL, NULL,
META_TYPE_BACKEND_NATIVE_MODE, META_TYPE_BACKEND_NATIVE_MODE,
@ -969,11 +957,11 @@ meta_backend_native_activate_vt (MetaBackendNative *backend_native,
} }
static void static void
meta_backend_native_pause (MetaBackendNative *backend_native) meta_backend_native_pause (MetaBackend *backend)
{ {
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
MetaBackendNativePrivate *priv = MetaBackendNativePrivate *priv =
meta_backend_native_get_instance_private (backend_native); meta_backend_native_get_instance_private (native);
MetaBackend *backend = META_BACKEND (backend_native);
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
MetaMonitorManagerNative *monitor_manager_native = MetaMonitorManagerNative *monitor_manager_native =
@ -981,25 +969,20 @@ meta_backend_native_pause (MetaBackendNative *backend_native)
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatNative *seat = MetaSeatNative *seat =
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend)); META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
MetaRenderer *renderer = meta_backend_get_renderer (backend);
COGL_TRACE_BEGIN_SCOPED (MetaBackendNativePause,
"Meta::BackendNative::pause()");
meta_seat_native_release_devices (seat); meta_seat_native_release_devices (seat);
meta_renderer_pause (renderer);
meta_udev_pause (priv->udev); meta_udev_pause (priv->udev);
meta_monitor_manager_native_pause (monitor_manager_native); meta_monitor_manager_native_pause (monitor_manager_native);
META_BACKEND_CLASS (meta_backend_native_parent_class)->pause (backend);
} }
static void static void
meta_backend_native_resume (MetaBackendNative *native) meta_backend_native_resume (MetaBackend *backend)
{ {
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
MetaBackendNativePrivate *priv = MetaBackendNativePrivate *priv =
meta_backend_native_get_instance_private (native); meta_backend_native_get_instance_private (native);
MetaBackend *backend = META_BACKEND (native);
ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
MetaMonitorManagerNative *monitor_manager_native = MetaMonitorManagerNative *monitor_manager_native =
@ -1007,26 +990,20 @@ meta_backend_native_resume (MetaBackendNative *native)
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatNative *seat = MetaSeatNative *seat =
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend)); META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
MetaRenderer *renderer = meta_backend_get_renderer (backend); MetaIdleManager *idle_manager = meta_backend_get_idle_manager (backend);
MetaIdleManager *idle_manager; MetaInputSettings *input_settings = meta_backend_get_input_settings (backend);
MetaInputSettings *input_settings;
COGL_TRACE_BEGIN_SCOPED (MetaBackendNativeResume, META_BACKEND_CLASS (meta_backend_native_parent_class)->resume (backend);
"Meta::BackendNative::resume()");
meta_monitor_manager_native_resume (monitor_manager_native); meta_monitor_manager_native_resume (monitor_manager_native);
meta_udev_resume (priv->udev); meta_udev_resume (priv->udev);
meta_kms_resume (priv->kms); meta_kms_resume (priv->kms);
meta_seat_native_reclaim_devices (seat); meta_seat_native_reclaim_devices (seat);
meta_renderer_resume (renderer);
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
idle_manager = meta_backend_get_idle_manager (backend); idle_manager = meta_backend_get_idle_manager (backend);
meta_idle_manager_reset_idle_time (idle_manager); meta_idle_manager_reset_idle_time (idle_manager);
input_settings = meta_backend_get_input_settings (backend);
meta_input_settings_maybe_restore_numlock_state (input_settings); meta_input_settings_maybe_restore_numlock_state (input_settings);
clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat)); clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat));