|
|
275da5 |
From 22c43422f83a69d7654953db368585f168952aab Mon Sep 17 00:00:00 2001
|
|
|
275da5 |
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
|
|
275da5 |
Date: Fri, 4 Feb 2022 11:45:53 +0100
|
|
|
275da5 |
Subject: [PATCH] display: Only display configuration options if apply is
|
|
|
275da5 |
allowed
|
|
|
275da5 |
|
|
|
275da5 |
org.gnome.Mutter.DisplayConfig contains a new property that tells
|
|
|
275da5 |
whether apply will be allowed to be called or not. Whether it is true or
|
|
|
275da5 |
not depends on policy stored in any of its monitors.xml configuration
|
|
|
275da5 |
files.
|
|
|
275da5 |
|
|
|
275da5 |
In order to make it clearer that configuration is not possible, except
|
|
|
275da5 |
for night light, make sure to hide the unconfigurable parts, leaving
|
|
|
275da5 |
only night light.
|
|
|
275da5 |
---
|
|
|
275da5 |
.../display/cc-display-config-manager-dbus.c | 36 +++++++++++++++++++
|
|
|
275da5 |
panels/display/cc-display-config-manager.c | 6 ++++
|
|
|
275da5 |
panels/display/cc-display-config-manager.h | 3 ++
|
|
|
275da5 |
panels/display/cc-display-panel.c | 23 ++++++++++++
|
|
|
275da5 |
4 files changed, 68 insertions(+)
|
|
|
275da5 |
|
|
|
275da5 |
diff --git a/panels/display/cc-display-config-manager-dbus.c b/panels/display/cc-display-config-manager-dbus.c
|
|
|
275da5 |
index 8912faaa8..7f85c3a01 100644
|
|
|
275da5 |
--- a/panels/display/cc-display-config-manager-dbus.c
|
|
|
275da5 |
+++ b/panels/display/cc-display-config-manager-dbus.c
|
|
|
275da5 |
@@ -31,6 +31,8 @@ struct _CcDisplayConfigManagerDBus
|
|
|
275da5 |
guint monitors_changed_id;
|
|
|
275da5 |
|
|
|
275da5 |
GVariant *current_state;
|
|
|
275da5 |
+
|
|
|
275da5 |
+ gboolean apply_allowed;
|
|
|
275da5 |
};
|
|
|
275da5 |
|
|
|
275da5 |
G_DEFINE_TYPE (CcDisplayConfigManagerDBus,
|
|
|
275da5 |
@@ -119,6 +121,8 @@ bus_gotten (GObject *object,
|
|
|
275da5 |
CcDisplayConfigManagerDBus *self;
|
|
|
275da5 |
GDBusConnection *connection;
|
|
|
275da5 |
GError *error = NULL;
|
|
|
275da5 |
+ g_autoptr(GDBusProxy) proxy = NULL;
|
|
|
275da5 |
+ g_autoptr(GVariant) variant = NULL;
|
|
|
275da5 |
|
|
|
275da5 |
connection = g_bus_get_finish (result, &error);
|
|
|
275da5 |
if (!connection)
|
|
|
275da5 |
@@ -145,12 +149,35 @@ bus_gotten (GObject *object,
|
|
|
275da5 |
monitors_changed,
|
|
|
275da5 |
self,
|
|
|
275da5 |
NULL);
|
|
|
275da5 |
+
|
|
|
275da5 |
+ proxy = g_dbus_proxy_new_sync (self->connection,
|
|
|
275da5 |
+ G_DBUS_PROXY_FLAGS_NONE,
|
|
|
275da5 |
+ NULL,
|
|
|
275da5 |
+ "org.gnome.Mutter.DisplayConfig",
|
|
|
275da5 |
+ "/org/gnome/Mutter/DisplayConfig",
|
|
|
275da5 |
+ "org.gnome.Mutter.DisplayConfig",
|
|
|
275da5 |
+ NULL,
|
|
|
275da5 |
+ &error);
|
|
|
275da5 |
+ if (!proxy)
|
|
|
275da5 |
+ {
|
|
|
275da5 |
+ g_warning ("Failed to create D-Bus proxy to \"org.gnome.Mutter.DisplayConfig\": %s",
|
|
|
275da5 |
+ error->message);
|
|
|
275da5 |
+ return;
|
|
|
275da5 |
+ }
|
|
|
275da5 |
+
|
|
|
275da5 |
+ variant = g_dbus_proxy_get_cached_property (proxy, "ApplyMonitorsConfigAllowed");
|
|
|
275da5 |
+ if (variant)
|
|
|
275da5 |
+ self->apply_allowed = g_variant_get_boolean (variant);
|
|
|
275da5 |
+ else
|
|
|
275da5 |
+ g_warning ("Missing property 'ApplyMonitorsConfigAllowed' on DisplayConfig API");
|
|
|
275da5 |
+
|
|
|
275da5 |
get_current_state (self);
|
|
|
275da5 |
}
|
|
|
275da5 |
|
|
|
275da5 |
static void
|
|
|
275da5 |
cc_display_config_manager_dbus_init (CcDisplayConfigManagerDBus *self)
|
|
|
275da5 |
{
|
|
|
275da5 |
+ self->apply_allowed = TRUE;
|
|
|
275da5 |
self->cancellable = g_cancellable_new ();
|
|
|
275da5 |
g_bus_get (G_BUS_TYPE_SESSION, self->cancellable, bus_gotten, self);
|
|
|
275da5 |
}
|
|
|
275da5 |
@@ -172,6 +199,14 @@ cc_display_config_manager_dbus_finalize (GObject *object)
|
|
|
275da5 |
G_OBJECT_CLASS (cc_display_config_manager_dbus_parent_class)->finalize (object);
|
|
|
275da5 |
}
|
|
|
275da5 |
|
|
|
275da5 |
+static gboolean
|
|
|
275da5 |
+cc_display_config_manager_dbus_get_apply_allowed (CcDisplayConfigManager *pself)
|
|
|
275da5 |
+{
|
|
|
275da5 |
+ CcDisplayConfigManagerDBus *self = CC_DISPLAY_CONFIG_MANAGER_DBUS (pself);
|
|
|
275da5 |
+
|
|
|
275da5 |
+ return self->apply_allowed;
|
|
|
275da5 |
+}
|
|
|
275da5 |
+
|
|
|
275da5 |
static void
|
|
|
275da5 |
cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klass)
|
|
|
275da5 |
{
|
|
|
275da5 |
@@ -181,6 +216,7 @@ cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klas
|
|
|
275da5 |
gobject_class->finalize = cc_display_config_manager_dbus_finalize;
|
|
|
275da5 |
|
|
|
275da5 |
parent_class->get_current = cc_display_config_manager_dbus_get_current;
|
|
|
275da5 |
+ parent_class->get_apply_allowed = cc_display_config_manager_dbus_get_apply_allowed;
|
|
|
275da5 |
}
|
|
|
275da5 |
|
|
|
275da5 |
CcDisplayConfigManager *
|
|
|
275da5 |
diff --git a/panels/display/cc-display-config-manager.c b/panels/display/cc-display-config-manager.c
|
|
|
275da5 |
index 0da298a29..3d683c53d 100644
|
|
|
275da5 |
--- a/panels/display/cc-display-config-manager.c
|
|
|
275da5 |
+++ b/panels/display/cc-display-config-manager.c
|
|
|
275da5 |
@@ -59,3 +59,9 @@ cc_display_config_manager_get_current (CcDisplayConfigManager *self)
|
|
|
275da5 |
{
|
|
|
275da5 |
return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_current (self);
|
|
|
275da5 |
}
|
|
|
275da5 |
+
|
|
|
275da5 |
+gboolean
|
|
|
275da5 |
+cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self)
|
|
|
275da5 |
+{
|
|
|
275da5 |
+ return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_apply_allowed (self);
|
|
|
275da5 |
+}
|
|
|
275da5 |
diff --git a/panels/display/cc-display-config-manager.h b/panels/display/cc-display-config-manager.h
|
|
|
275da5 |
index 134cea0a1..22c16758c 100644
|
|
|
275da5 |
--- a/panels/display/cc-display-config-manager.h
|
|
|
275da5 |
+++ b/panels/display/cc-display-config-manager.h
|
|
|
275da5 |
@@ -35,10 +35,13 @@ struct _CcDisplayConfigManagerClass
|
|
|
275da5 |
GObjectClass parent_class;
|
|
|
275da5 |
|
|
|
275da5 |
CcDisplayConfig * (*get_current) (CcDisplayConfigManager *self);
|
|
|
275da5 |
+ gboolean (* get_apply_allowed) (CcDisplayConfigManager *self);
|
|
|
275da5 |
};
|
|
|
275da5 |
|
|
|
275da5 |
CcDisplayConfig * cc_display_config_manager_get_current (CcDisplayConfigManager *self);
|
|
|
275da5 |
|
|
|
275da5 |
+gboolean cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self);
|
|
|
275da5 |
+
|
|
|
275da5 |
void _cc_display_config_manager_emit_changed (CcDisplayConfigManager *self);
|
|
|
275da5 |
|
|
|
275da5 |
G_END_DECLS
|
|
|
275da5 |
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
|
|
|
275da5 |
index 0b4fa193d..1b0db8321 100644
|
|
|
275da5 |
--- a/panels/display/cc-display-panel.c
|
|
|
275da5 |
+++ b/panels/display/cc-display-panel.c
|
|
|
275da5 |
@@ -1245,6 +1245,22 @@ make_output_ui (CcDisplayPanel *panel)
|
|
|
275da5 |
return listbox;
|
|
|
275da5 |
}
|
|
|
275da5 |
|
|
|
275da5 |
+static GtkWidget *
|
|
|
275da5 |
+make_night_light_only_ui (CcDisplayPanel *panel)
|
|
|
275da5 |
+{
|
|
|
275da5 |
+ CcDisplayPanelPrivate *priv = panel->priv;
|
|
|
275da5 |
+ GtkWidget *vbox;
|
|
|
275da5 |
+
|
|
|
275da5 |
+ priv->rows_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
|
|
|
275da5 |
+
|
|
|
275da5 |
+ vbox = make_main_vbox (priv->main_size_group);
|
|
|
275da5 |
+
|
|
|
275da5 |
+ gtk_container_add (GTK_CONTAINER (vbox), make_night_light_widget (panel));
|
|
|
275da5 |
+
|
|
|
275da5 |
+ g_clear_object (&priv->rows_size_group);
|
|
|
275da5 |
+ return make_scrollable (vbox);
|
|
|
275da5 |
+}
|
|
|
275da5 |
+
|
|
|
275da5 |
static GtkWidget *
|
|
|
275da5 |
make_single_output_ui (CcDisplayPanel *panel)
|
|
|
275da5 |
{
|
|
|
275da5 |
@@ -2097,6 +2113,12 @@ on_screen_changed (CcDisplayPanel *panel)
|
|
|
275da5 |
if (!priv->current_config)
|
|
|
275da5 |
goto show_error;
|
|
|
275da5 |
|
|
|
275da5 |
+ if (!cc_display_config_manager_get_apply_allowed (priv->manager))
|
|
|
275da5 |
+ {
|
|
|
275da5 |
+ main_widget = make_night_light_only_ui (panel);
|
|
|
275da5 |
+ goto show_main_widget;
|
|
|
275da5 |
+ }
|
|
|
275da5 |
+
|
|
|
275da5 |
ensure_monitor_labels (panel);
|
|
|
275da5 |
|
|
|
275da5 |
if (!priv->current_output)
|
|
|
275da5 |
@@ -2121,6 +2143,7 @@ on_screen_changed (CcDisplayPanel *panel)
|
|
|
275da5 |
main_widget = make_multi_output_ui (panel);
|
|
|
275da5 |
}
|
|
|
275da5 |
|
|
|
275da5 |
+ show_main_widget:
|
|
|
275da5 |
gtk_widget_show_all (main_widget);
|
|
|
275da5 |
gtk_stack_add_named (GTK_STACK (priv->stack), main_widget, "main");
|
|
|
275da5 |
gtk_stack_set_visible_child (GTK_STACK (priv->stack), main_widget);
|
|
|
275da5 |
--
|
|
|
275da5 |
2.33.1
|
|
|
275da5 |
|