/*
* Copyright 2025 UBports Foundation
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*
* Authors:
* Lorenzo Torracchi
*/
#include "keep-screen-on.h"
#include
#include
#define UNITY_SCREEN_BUS_NAME "com.canonical.Unity.Screen"
#define UNITY_SCREEN_OBJECT_PATH "/com/canonical/Unity/Screen"
#define UNITY_SCREEN_INTERFACE "com.canonical.Unity.Screen"
static guint request_id = 0;
void
toggle_keep_screen_on_action (GAction *action,
GVariant *parameter G_GNUC_UNUSED,
gpointer data G_GNUC_UNUSED)
{
GVariant *state = g_action_get_state (action);
gboolean enabled = g_variant_get_boolean (state);
GError *error = NULL;
GDBusProxy *proxy = g_dbus_proxy_new_for_bus_sync (
G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL, UNITY_SCREEN_BUS_NAME,
UNITY_SCREEN_OBJECT_PATH, UNITY_SCREEN_INTERFACE, NULL, &error);
if (!proxy)
{
g_warning ("Failed to create D-Bus proxy: %s", error->message);
g_clear_error (&error);
return;
}
if (!enabled)
{
GVariant *result
= g_dbus_proxy_call_sync (proxy, "keepDisplayOn", NULL,
G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
if (result)
{
g_variant_get (result, "(i)", &request_id);
g_variant_unref (result);
g_simple_action_set_state (G_SIMPLE_ACTION (action),
g_variant_new_boolean (!enabled));
}
else
{
g_warning ("D-Bus call keepDisplayOn failed: %s", error->message);
g_clear_error (&error);
}
}
else if (request_id != 0)
{
GVariant *params = g_variant_new ("(i)", request_id);
g_dbus_proxy_call_sync (proxy, "removeDisplayOnRequest", params,
G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
if (error)
{
g_warning ("D-Bus call removeDisplayOnRequest failed: %s",
error->message);
g_clear_error (&error);
}
else
{
g_simple_action_set_state (G_SIMPLE_ACTION (action),
g_variant_new_boolean (!enabled));
request_id = 0;
}
}
g_object_unref (proxy);
}
int
keep_screen_on_supported ()
{
return ayatana_common_utils_is_lomiri ();
}