mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 11:00:54 -05:00
backend: add signals for reporting suspend and resume
This commit adds "suspending" and "resuming" signals to MetaBackend. It's preliminary work needed for tracking when to purge and recreate all textures (needed by nvidia).
This commit is contained in:
parent
f6e8e867b4
commit
53d63ea72b
@ -60,7 +60,8 @@ enum
|
|||||||
KEYMAP_CHANGED,
|
KEYMAP_CHANGED,
|
||||||
KEYMAP_LAYOUT_GROUP_CHANGED,
|
KEYMAP_LAYOUT_GROUP_CHANGED,
|
||||||
LAST_DEVICE_CHANGED,
|
LAST_DEVICE_CHANGED,
|
||||||
|
SUSPENDING,
|
||||||
|
RESUMING,
|
||||||
N_SIGNALS
|
N_SIGNALS
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -550,6 +551,20 @@ meta_backend_class_init (MetaBackendClass *klass)
|
|||||||
0,
|
0,
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 1, G_TYPE_INT);
|
G_TYPE_NONE, 1, G_TYPE_INT);
|
||||||
|
signals[SUSPENDING] =
|
||||||
|
g_signal_new ("suspending",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
signals[RESUMING] =
|
||||||
|
g_signal_new ("resuming",
|
||||||
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL,
|
||||||
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS");
|
mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS");
|
||||||
stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
|
stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
|
||||||
@ -584,15 +599,53 @@ lid_is_closed_changed_cb (UpClient *client,
|
|||||||
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
inhibit_sleep (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
g_autoptr (GVariant) fd_variant = NULL;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
|
if (priv->inhibit_sleep_fd >= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!login1_manager_call_inhibit_sync (priv->logind_proxy,
|
||||||
|
"sleep",
|
||||||
|
"Display Server",
|
||||||
|
"Prepare for suspend",
|
||||||
|
"delay",
|
||||||
|
&fd_variant,
|
||||||
|
priv->cancellable,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_warning ("Failed to inhibit sleep: %s", error->message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->inhibit_sleep_fd = g_variant_get_handle (fd_variant);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
uninhibit_sleep (MetaBackend *backend)
|
||||||
|
{
|
||||||
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
|
||||||
|
close (priv->inhibit_sleep_fd);
|
||||||
|
priv->inhibit_sleep_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
prepare_for_sleep_cb (MetaBackend *backend,
|
prepare_for_sleep_cb (MetaBackend *backend,
|
||||||
gboolean suspending)
|
gboolean suspending)
|
||||||
{
|
{
|
||||||
gboolean suspending;
|
if (suspending) {
|
||||||
|
g_signal_emit (backend, signals[SUSPENDING], 0);
|
||||||
g_variant_get (parameters, "(b)", &suspending);
|
uninhibit_sleep (backend);
|
||||||
if (suspending)
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
inhibit_sleep (backend);
|
||||||
|
g_signal_emit (backend, signals[RESUMING], 0);
|
||||||
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,6 +672,7 @@ system_bus_gotten_cb (GObject *object,
|
|||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
|
MetaBackend *backend = META_BACKEND (user_data);
|
||||||
MetaBackendPrivate *priv;
|
MetaBackendPrivate *priv;
|
||||||
g_autoptr (GError) error = NULL;
|
g_autoptr (GError) error = NULL;
|
||||||
GDBusConnection *bus;
|
GDBusConnection *bus;
|
||||||
@ -630,16 +684,22 @@ system_bus_gotten_cb (GObject *object,
|
|||||||
priv = meta_backend_get_instance_private (user_data);
|
priv = meta_backend_get_instance_private (user_data);
|
||||||
priv->system_bus = bus;
|
priv->system_bus = bus;
|
||||||
priv->logind_proxy = get_logind_proxy (priv->cancellable, &error);
|
priv->logind_proxy = get_logind_proxy (priv->cancellable, &error);
|
||||||
|
priv->inhibit_sleep_fd = -1;
|
||||||
|
|
||||||
if (!priv->logind_proxy)
|
if (!priv->logind_proxy)
|
||||||
|
{
|
||||||
g_warning ("Failed to get logind proxy: %s", error->message);
|
g_warning ("Failed to get logind proxy: %s", error->message);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inhibit_sleep (backend);
|
||||||
g_signal_connect_object (priv->logind_proxy,
|
g_signal_connect_object (priv->logind_proxy,
|
||||||
"prepare-for-sleep",
|
"prepare-for-sleep",
|
||||||
G_CALLBACK (prepare_for_sleep_cb),
|
G_CALLBACK (prepare_for_sleep_cb),
|
||||||
user_data,
|
user_data,
|
||||||
G_CONNECT_SWAPPED);
|
G_CONNECT_SWAPPED);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_backend_initable_init (GInitable *initable,
|
meta_backend_initable_init (GInitable *initable,
|
||||||
|
Loading…
Reference in New Issue
Block a user