Blame SOURCES/0001-display-Only-display-configuration-options-if-apply-.patch

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