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:
@ -137,6 +137,10 @@ struct _MetaBackendClass
|
||||
MetaPointerConstraint *constraint);
|
||||
|
||||
gboolean (* is_headless) (MetaBackend *backend);
|
||||
|
||||
void (* pause) (MetaBackend *backend);
|
||||
|
||||
void (* resume) (MetaBackend *backend);
|
||||
};
|
||||
|
||||
void meta_backend_destroy (MetaBackend *backend);
|
||||
|
@ -630,6 +630,24 @@ meta_backend_real_is_headless (MetaBackend *backend)
|
||||
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
|
||||
meta_backend_freeze_keyboard (MetaBackend *backend,
|
||||
uint32_t timestamp)
|
||||
@ -863,6 +881,8 @@ meta_backend_class_init (MetaBackendClass *klass)
|
||||
klass->is_lid_closed = meta_backend_real_is_lid_closed;
|
||||
klass->create_cursor_tracker = meta_backend_real_create_cursor_tracker;
|
||||
klass->is_headless = meta_backend_real_is_headless;
|
||||
klass->pause = meta_backend_real_pause;
|
||||
klass->resume = meta_backend_real_resume;
|
||||
|
||||
obj_props[PROP_CONTEXT] =
|
||||
g_param_spec_object ("context", NULL, NULL,
|
||||
@ -927,14 +947,59 @@ meta_backend_class_init (MetaBackendClass *klass)
|
||||
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
|
||||
meta_backend_create_launcher (MetaBackend *backend,
|
||||
MetaLauncher **launcher_out,
|
||||
GError **error)
|
||||
{
|
||||
return META_BACKEND_GET_CLASS (backend)->create_launcher (backend,
|
||||
launcher_out,
|
||||
error);
|
||||
g_autoptr (MetaLauncher) launcher = NULL;
|
||||
gboolean ret;
|
||||
|
||||
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 *
|
||||
|
@ -100,9 +100,9 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative,
|
||||
meta_backend_native,
|
||||
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
|
||||
meta_backend_native_dispose (GObject *object)
|
||||
@ -737,17 +737,6 @@ on_started (MetaContext *context,
|
||||
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
|
||||
meta_backend_native_create_launcher (MetaBackend *backend,
|
||||
MetaLauncher **launcher_out,
|
||||
@ -795,10 +784,6 @@ meta_backend_native_create_launcher (MetaBackend *backend,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_signal_connect (launcher, "notify::session-active",
|
||||
G_CALLBACK (on_session_active_changed),
|
||||
native);
|
||||
|
||||
*launcher_out = g_steal_pointer (&launcher);
|
||||
return TRUE;
|
||||
}
|
||||
@ -895,6 +880,9 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
||||
|
||||
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] =
|
||||
g_param_spec_enum ("mode", NULL, NULL,
|
||||
META_TYPE_BACKEND_NATIVE_MODE,
|
||||
@ -969,11 +957,11 @@ meta_backend_native_activate_vt (MetaBackendNative *backend_native,
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_native_pause (MetaBackendNative *backend_native)
|
||||
meta_backend_native_pause (MetaBackend *backend)
|
||||
{
|
||||
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||
MetaBackendNativePrivate *priv =
|
||||
meta_backend_native_get_instance_private (backend_native);
|
||||
MetaBackend *backend = META_BACKEND (backend_native);
|
||||
meta_backend_native_get_instance_private (native);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerNative *monitor_manager_native =
|
||||
@ -981,25 +969,20 @@ meta_backend_native_pause (MetaBackendNative *backend_native)
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
MetaSeatNative *seat =
|
||||
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_renderer_pause (renderer);
|
||||
meta_udev_pause (priv->udev);
|
||||
|
||||
meta_monitor_manager_native_pause (monitor_manager_native);
|
||||
|
||||
META_BACKEND_CLASS (meta_backend_native_parent_class)->pause (backend);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_backend_native_resume (MetaBackendNative *native)
|
||||
meta_backend_native_resume (MetaBackend *backend)
|
||||
{
|
||||
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
|
||||
MetaBackendNativePrivate *priv =
|
||||
meta_backend_native_get_instance_private (native);
|
||||
MetaBackend *backend = META_BACKEND (native);
|
||||
ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitorManagerNative *monitor_manager_native =
|
||||
@ -1007,26 +990,20 @@ meta_backend_native_resume (MetaBackendNative *native)
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
MetaSeatNative *seat =
|
||||
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
|
||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||
MetaIdleManager *idle_manager;
|
||||
MetaInputSettings *input_settings;
|
||||
MetaIdleManager *idle_manager = meta_backend_get_idle_manager (backend);
|
||||
MetaInputSettings *input_settings = meta_backend_get_input_settings (backend);
|
||||
|
||||
COGL_TRACE_BEGIN_SCOPED (MetaBackendNativeResume,
|
||||
"Meta::BackendNative::resume()");
|
||||
META_BACKEND_CLASS (meta_backend_native_parent_class)->resume (backend);
|
||||
|
||||
meta_monitor_manager_native_resume (monitor_manager_native);
|
||||
meta_udev_resume (priv->udev);
|
||||
meta_kms_resume (priv->kms);
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat));
|
||||
|
Reference in New Issue
Block a user