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);
|
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);
|
||||||
|
@ -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 *
|
||||||
|
@ -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));
|
||||||
|
Reference in New Issue
Block a user