[gnome-control-center] display: Handle lid being closed a bit better



commit 0a0ac31b5187dcd65eb73ca80b541eeff0467afc
Author: Rui Matos <tiagomatos gmail com>
Date:   Wed Aug 23 17:06:57 2017 +0200

    display: Handle lid being closed a bit better
    
    If the lid is closed we shouldn't allow the builtin display to be
    configured.

 panels/display/cc-display-panel.c |   73 ++++++++++++++++++++++---------------
 1 files changed, 44 insertions(+), 29 deletions(-)
---
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index ab0900a..0aaeb65 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -437,6 +437,7 @@ paint_output (CcDisplayPanel    *panel,
               gint               allocated_width,
               gint               allocated_height)
 {
+  CcDisplayPanelPrivate *priv = panel->priv;
   GdkPixbuf *pixbuf;
   gint x, y, width, height;
 
@@ -462,14 +463,13 @@ paint_output (CcDisplayPanel    *panel,
   cairo_rectangle (cr, x, y, width, height);
   cairo_fill (cr);
 
-  if (cc_display_monitor_is_active (output))
-    {
-      pixbuf = gnome_bg_create_thumbnail (panel->priv->background,
-                                          panel->priv->thumbnail_factory,
-                                          gdk_screen_get_default (), width, height);
-    }
-  else
+  if (!cc_display_monitor_is_active (output) ||
+      (cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
     pixbuf = NULL;
+  else
+    pixbuf = gnome_bg_create_thumbnail (priv->background,
+                                        priv->thumbnail_factory,
+                                        gdk_screen_get_default (), width, height);
 
   if (cc_display_monitor_is_primary (output)
       || cc_display_config_is_cloning (configuration))
@@ -1536,14 +1536,20 @@ replace_current_output_ui (GtkWidget      *frame,
 }
 
 static guint
-count_active_outputs (GList *outputs)
+count_active_outputs (CcDisplayPanel *panel)
 {
-  GList *l;
+  CcDisplayPanelPrivate *priv = panel->priv;
+  GList *outputs, *l;
   guint active = 0;
+
+  outputs = cc_display_config_get_monitors (priv->current_config);
   for (l = outputs; l != NULL; l = l->next)
     {
       CcDisplayMonitor *output = l->data;
-      if (cc_display_monitor_is_active (output))
+      if (!cc_display_monitor_is_active (output) ||
+          (cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
+        continue;
+      else
         active++;
     }
   return active;
@@ -2021,7 +2027,7 @@ make_two_output_ui (CcDisplayPanel *panel)
 
   if (cc_display_config_is_cloning (priv->current_config) && show_mirror)
     gtk_stack_set_visible_child_name (GTK_STACK (stack), "mirror");
-  else if (count_active_outputs (cc_display_config_get_monitors (priv->current_config)) > 1)
+  else if (count_active_outputs (panel) > 1)
     gtk_stack_set_visible_child_name (GTK_STACK (stack), "join");
   else
     gtk_stack_set_visible_child_name (GTK_STACK (stack), "single");
@@ -2058,8 +2064,8 @@ make_output_switch (CcDisplayPanel *panel)
                            button, G_CONNECT_SWAPPED);
   output_switch_sync (button, priv->current_output);
 
-  if (count_active_outputs (cc_display_config_get_monitors (priv->current_config)) < 2 &&
-      cc_display_monitor_is_active (priv->current_output))
+  if ((count_active_outputs (panel) < 2 && cc_display_monitor_is_active (priv->current_output)) ||
+      (cc_display_monitor_is_builtin (priv->current_output) && priv->lid_is_closed))
     gtk_widget_set_sensitive (button, FALSE);
 
   return button;
@@ -2181,6 +2187,7 @@ on_screen_changed (CcDisplayPanel *panel)
   CcDisplayConfig *current;
   GList *outputs, *l;
   GtkWidget *main_widget;
+  guint n_outputs;
 
   if (!priv->manager)
     return;
@@ -2206,30 +2213,38 @@ on_screen_changed (CcDisplayPanel *panel)
   ensure_monitor_labels (panel);
 
   priv->current_output = NULL;
-  l = outputs = g_object_get_data (G_OBJECT (current), "ui-sorted-outputs");
-  while (!priv->current_output && l != NULL)
+  outputs = g_object_get_data (G_OBJECT (current), "ui-sorted-outputs");
+  for (l = outputs; l; l = l->next)
     {
       CcDisplayMonitor *output = l->data;
-      if (cc_display_monitor_is_active (output))
-        priv->current_output = output;
-      else
-        l = l->next;
+
+      if (!cc_display_monitor_is_active (output) ||
+          (cc_display_monitor_is_builtin (output) && priv->lid_is_closed))
+        continue;
+
+      priv->current_output = output;
+      break;
     }
 
   if (!priv->current_output)
     goto show_error;
 
-  switch (g_list_length (outputs))
+  n_outputs = g_list_length (outputs);
+  if (priv->lid_is_closed)
     {
-    case 1:
-      main_widget = make_single_output_ui (panel);
-      break;
-    case 2:
-      main_widget = make_two_output_ui (panel);
-      break;
-    default:
-      main_widget = make_multi_output_ui (panel);
-      break;
+      if (n_outputs <= 2)
+        main_widget = make_single_output_ui (panel);
+      else
+        main_widget = make_multi_output_ui (panel);
+    }
+  else
+    {
+      if (n_outputs == 1)
+        main_widget = make_single_output_ui (panel);
+      else if (n_outputs == 2)
+        main_widget = make_two_output_ui (panel);
+      else
+        main_widget = make_multi_output_ui (panel);
     }
 
   gtk_widget_show_all (main_widget);


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