[gnome-control-center] display: Only display configuration options if apply is allowed



commit 21862c3e4814b30b64179dd0b0dc6e54f8cfa172
Author: Jonas Ådahl <jadahl gmail com>
Date:   Thu Jan 20 10:58:23 2022 +0100

    display: Only display configuration options if apply is allowed
    
    org.gnome.Mutter.DisplayConfig contains a new property that tells
    whether apply will be allowed to be called or not. Whether it is true or
    not depends on policy stored in any of its monitors.xml configuration
    files.
    
    In order to make it clearer that configuration is not possible, except
    for night light, make sure to hide the unconfigurable parts, leaving
    only night light.

 panels/display/cc-display-config-manager-dbus.c | 36 +++++++++++++++++++++++++
 panels/display/cc-display-config-manager.c      |  6 +++++
 panels/display/cc-display-config-manager.h      |  3 +++
 panels/display/cc-display-panel.c               | 13 +++++++++
 panels/display/cc-display-panel.ui              | 13 +++++++++
 5 files changed, 71 insertions(+)
---
diff --git a/panels/display/cc-display-config-manager-dbus.c b/panels/display/cc-display-config-manager-dbus.c
index 653bea0b5..392140101 100644
--- a/panels/display/cc-display-config-manager-dbus.c
+++ b/panels/display/cc-display-config-manager-dbus.c
@@ -31,6 +31,8 @@ struct _CcDisplayConfigManagerDBus
   guint monitors_changed_id;
 
   GVariant *current_state;
+
+  gboolean apply_allowed;
 };
 
 G_DEFINE_TYPE (CcDisplayConfigManagerDBus,
@@ -118,6 +120,8 @@ bus_gotten (GObject      *object,
   CcDisplayConfigManagerDBus *self;
   GDBusConnection *connection;
   g_autoptr(GError) error = NULL;
+  g_autoptr(GDBusProxy) proxy = NULL;
+  g_autoptr(GVariant) variant = NULL;
 
   connection = g_bus_get_finish (result, &error);
   if (!connection)
@@ -143,12 +147,35 @@ bus_gotten (GObject      *object,
                                         monitors_changed,
                                         self,
                                         NULL);
+
+  proxy = g_dbus_proxy_new_sync (self->connection,
+                                 G_DBUS_PROXY_FLAGS_NONE,
+                                 NULL,
+                                 "org.gnome.Mutter.DisplayConfig",
+                                 "/org/gnome/Mutter/DisplayConfig",
+                                 "org.gnome.Mutter.DisplayConfig",
+                                 NULL,
+                                 &error);
+  if (!proxy)
+    {
+      g_warning ("Failed to create D-Bus proxy to \"org.gnome.Mutter.DisplayConfig\": %s",
+                 error->message);
+      return;
+    }
+
+  variant = g_dbus_proxy_get_cached_property (proxy, "ApplyMonitorsConfigAllowed");
+  if (variant)
+    self->apply_allowed = g_variant_get_boolean (variant);
+  else
+    g_warning ("Missing property 'ApplyMonitorsConfigAllowed' on DisplayConfig API");
+
   get_current_state (self);
 }
 
 static void
 cc_display_config_manager_dbus_init (CcDisplayConfigManagerDBus *self)
 {
+  self->apply_allowed = TRUE;
   self->cancellable = g_cancellable_new ();
   g_bus_get (G_BUS_TYPE_SESSION, self->cancellable, bus_gotten, self);
 }
@@ -170,6 +197,14 @@ cc_display_config_manager_dbus_finalize (GObject *object)
   G_OBJECT_CLASS (cc_display_config_manager_dbus_parent_class)->finalize (object);
 }
 
+static gboolean
+cc_display_config_manager_dbus_get_apply_allowed (CcDisplayConfigManager *pself)
+{
+  CcDisplayConfigManagerDBus *self = CC_DISPLAY_CONFIG_MANAGER_DBUS (pself);
+
+  return self->apply_allowed;
+}
+
 static void
 cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klass)
 {
@@ -179,6 +214,7 @@ cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klas
   gobject_class->finalize = cc_display_config_manager_dbus_finalize;
 
   parent_class->get_current = cc_display_config_manager_dbus_get_current;
+  parent_class->get_apply_allowed = cc_display_config_manager_dbus_get_apply_allowed;
 }
 
 CcDisplayConfigManager *
diff --git a/panels/display/cc-display-config-manager.c b/panels/display/cc-display-config-manager.c
index 0da298a29..3d683c53d 100644
--- a/panels/display/cc-display-config-manager.c
+++ b/panels/display/cc-display-config-manager.c
@@ -59,3 +59,9 @@ cc_display_config_manager_get_current (CcDisplayConfigManager *self)
 {
   return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_current (self);
 }
+
+gboolean
+cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self)
+{
+  return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_apply_allowed (self);
+}
diff --git a/panels/display/cc-display-config-manager.h b/panels/display/cc-display-config-manager.h
index 1e1b36373..64f0775e9 100644
--- a/panels/display/cc-display-config-manager.h
+++ b/panels/display/cc-display-config-manager.h
@@ -34,10 +34,13 @@ struct _CcDisplayConfigManagerClass
   GObjectClass parent_class;
 
   CcDisplayConfig * (*get_current) (CcDisplayConfigManager *self);
+  gboolean (* get_apply_allowed) (CcDisplayConfigManager *self);
 };
 
 CcDisplayConfig * cc_display_config_manager_get_current (CcDisplayConfigManager *self);
 
+gboolean cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self);
+
 void _cc_display_config_manager_emit_changed (CcDisplayConfigManager *self);
 
 G_END_DECLS
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index 79605cd76..622603c54 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -90,6 +90,8 @@ struct _CcDisplayPanel
   GListStore     *primary_display_list;
   GList          *monitor_rows;
 
+  GtkWidget      *display_settings_disabled_group;
+
   GtkWidget      *arrangement_group;
   AdwBin         *arrangement_bin;
   GtkToggleButton *config_type_join;
@@ -600,6 +602,7 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_button);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_titlebar);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, apply_titlebar_title_widget);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_disabled_group);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_group);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_bin);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, cancel_button);
@@ -741,6 +744,14 @@ rebuild_ui (CcDisplayPanel *panel)
   GList *outputs, *l;
   CcDisplayConfigType type;
 
+  if (!cc_display_config_manager_get_apply_allowed (panel->manager))
+    {
+      gtk_widget_set_visible (panel->display_settings_disabled_group, TRUE);
+      gtk_widget_set_visible (panel->display_settings_group, FALSE);
+      gtk_widget_set_visible (panel->arrangement_group, FALSE);
+      return;
+    }
+
   panel->rebuilding_counter++;
 
   g_list_store_remove_all (panel->primary_display_list);
@@ -759,6 +770,8 @@ rebuild_ui (CcDisplayPanel *panel)
       return;
     }
 
+  gtk_widget_set_visible (panel->display_settings_disabled_group, FALSE);
+
   n_active_outputs = 0;
   n_usable_outputs = 0;
   outputs = cc_display_config_get_ui_sorted_monitors (panel->current_config);
diff --git a/panels/display/cc-display-panel.ui b/panels/display/cc-display-panel.ui
index 30c062b45..437da04d3 100644
--- a/panels/display/cc-display-panel.ui
+++ b/panels/display/cc-display-panel.ui
@@ -87,6 +87,19 @@
                     <child>
                       <object class="AdwPreferencesPage">
 
+                        <child>
+                          <object class="AdwPreferencesGroup" id="display_settings_disabled_group">
+                            <property name="visible">False</property>
+                            <child>
+                              <object class="AdwStatusPage">
+                                <property name="vexpand">True</property>
+                                <property name="icon-name">computer-symbolic</property>
+                                <property name="title" translatable="yes">Display Settings 
Disabled</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+
                         <child>
                           <object class="AdwPreferencesGroup" id="arrangement_group">
                             <child>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]