[gnome-control-center/wip/benzea/display: 5/5] display: Move output utility functions into CcDisplayMonitor



commit 5de3a2104dac71a0a896f9517888ce7665c304e3
Author: Benjamin Berg <bberg redhat com>
Date:   Fri Dec 22 14:41:25 2017 +0100

    display: Move output utility functions into CcDisplayMonitor
    
    This adds the following API:
     * cc_display_config_get_ui_sorted_monitors
       Returns the monitors in UI order
     * cc_display_config_count_useful_monitors
       Counts the useful monitors (active and usable)
     * cc_display_monitor_is_useful
       Checks if a monitor is active and usable
     * cc_display_monitor_is_useable
       Check if a monitor is marked as useable
     * cc_display_monitor_set_usable
       Used to mark builtin monitors as unusable if the lid is closed
     * cc_display_monitor_get_ui_*
       Get the UI number and strings for display
    
    https://bugzilla.gnome.org/show_bug.cgi?id=786971

 panels/display/cc-display-arrangement.c |   41 +-----
 panels/display/cc-display-config.c      |  218 ++++++++++++++++++++++++++++++-
 panels/display/cc-display-config.h      |    9 ++
 panels/display/cc-display-panel.c       |  169 ++++--------------------
 4 files changed, 253 insertions(+), 184 deletions(-)
---
diff --git a/panels/display/cc-display-arrangement.c b/panels/display/cc-display-arrangement.c
index 3805474..1227063 100644
--- a/panels/display/cc-display-arrangement.c
+++ b/panels/display/cc-display-arrangement.c
@@ -76,31 +76,6 @@ G_DEFINE_TYPE (CcDisplayArrangement, cc_display_arrangement, GTK_TYPE_DRAWING_AR
 
 static GParamSpec *props[PROP_LAST];
 
-static gboolean
-is_output_useful (CcDisplayMonitor *output)
-{
-  return (cc_display_monitor_is_active (output) &&
-          !g_object_get_data (G_OBJECT (output), "lid-is-closed"));
-}
-
-static guint
-count_useful_outputs (CcDisplayConfig *config)
-{
-  GList *outputs, *l;
-  guint active = 0;
-
-  outputs = cc_display_config_get_monitors (config);
-  for (l = outputs; l != NULL; l = l->next)
-    {
-      CcDisplayMonitor *output = l->data;
-      if (!is_output_useful (output))
-        continue;
-      else
-        active++;
-    }
-  return active;
-}
-
 static void
 apply_rotation_to_geometry (CcDisplayMonitor *output,
                            int *w,
@@ -167,7 +142,7 @@ get_bounding_box (CcDisplayConfig *config,
       CcDisplayMonitor *output = l->data;
       int x, y, w, h;
 
-      if (!is_output_useful (output))
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
       get_scaled_geometry (config, output, &x, &y, &w, &h);
@@ -317,7 +292,7 @@ find_best_snapping (CcDisplayArrangement *arr,
       if (output == snap_output)
         continue;
 
-      if (!is_output_useful (output))
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
       get_scaled_geometry (config, output, &_x1, &_y1, &_w, &_h);
@@ -424,7 +399,7 @@ cc_display_arrangement_find_monitor_at (CcDisplayArrangement *arr,
       CcDisplayMonitor *output = l->data;
       gint x1, y1, x2, y2;
 
-      if (!is_output_useful (output))
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
       monitor_get_drawing_rect (arr, output, &x1, &y1, &x2, &y2);
@@ -467,7 +442,7 @@ static void
 cc_display_arrangement_set_config (CcDisplayArrangement *arr,
                                   CcDisplayConfig      *config)
 {
-  const gchar *signals[] = { "rotation", "mode", "primary", "active", "scale", "position-changed" };
+  const gchar *signals[] = { "rotation", "mode", "primary", "active", "scale", "position-changed", 
"is-usable" };
   GList *outputs, *l;
   guint i;
 
@@ -526,7 +501,7 @@ cc_display_arrangement_draw (GtkWidget *widget,
       gint w, h;
       gint num;
 
-      if (!is_output_useful (output))
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
       gtk_style_context_save (context);
@@ -544,7 +519,7 @@ cc_display_arrangement_draw (GtkWidget *widget,
         gtk_style_context_add_class (context, "primary");
 
       /* Set in cc-display-panel.c */
-      num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (output), "ui-number"));
+      num = cc_display_monitor_get_ui_number (output);
 
       monitor_get_drawing_rect (arr, output, &x1, &y1, &x2, &y2);
       w = x2 - x1;
@@ -653,7 +628,7 @@ cc_display_arrangement_button_press_event (GtkWidget      *widget,
 
   cc_display_arrangement_set_selected_output (arr, output);
 
-  if (count_useful_outputs (arr->config) > 1)
+  if (cc_display_config_count_useful_monitors (arr->config) > 1)
     {
       arr->drag_active = TRUE;
       arr->drag_anchor_x = event_x - mon_x;
@@ -701,7 +676,7 @@ cc_display_arrangement_motion_notify_event (GtkWidget      *widget,
 
   g_return_val_if_fail (arr->config, FALSE);
 
-  if (count_useful_outputs (arr->config) <= 1)
+  if (cc_display_config_count_useful_monitors (arr->config) <= 1)
     return FALSE;
 
   if (!arr->drag_active)
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
index 616711e..352241c 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
@@ -17,8 +17,67 @@
  *
  */
 
+#include <math.h>
 #include "cc-display-config.h"
 
+static const double known_diagonals[] = {
+    12.1,
+    13.3,
+    15.6
+};
+
+static char *
+diagonal_to_str (double d)
+{
+    int i;
+
+    for (i = 0; i < G_N_ELEMENTS (known_diagonals); i++)
+    {
+        double delta;
+
+        delta = fabs(known_diagonals[i] - d);
+        if (delta < 0.1)
+            return g_strdup_printf ("%0.1lf\"", known_diagonals[i]);
+    }
+
+    return g_strdup_printf ("%d\"", (int) (d + 0.5));
+}
+
+static char *
+make_display_size_string (int width_mm,
+                          int height_mm)
+{
+  char *inches = NULL;
+
+  if (width_mm > 0 && height_mm > 0)
+    {
+      double d = sqrt (width_mm * width_mm + height_mm * height_mm);
+
+      inches = diagonal_to_str (d / 25.4);
+    }
+
+  return inches;
+}
+
+static char *
+make_output_ui_name (CcDisplayMonitor *output)
+{
+  int width_mm, height_mm;
+  char *size, *name;
+
+  cc_display_monitor_get_physical_size (output, &width_mm, &height_mm);
+  size = make_display_size_string (width_mm, height_mm);
+  if (size)
+    name = g_strdup_printf ("%s (%s)", cc_display_monitor_get_display_name (output), size);
+  else
+    name = g_strdup_printf ("%s", cc_display_monitor_get_display_name (output));
+
+  g_free (size);
+  return name;
+}
+
+
+
 G_DEFINE_TYPE (CcDisplayMode,
                cc_display_mode,
                G_TYPE_OBJECT)
@@ -70,13 +129,28 @@ cc_display_mode_get_freq_f (CcDisplayMode *self)
 }
 
 
-G_DEFINE_TYPE (CcDisplayMonitor,
-               cc_display_monitor,
-               G_TYPE_OBJECT)
+struct _CcDisplayMonitorPrivate {
+  int ui_number;
+  gchar *ui_name;
+  gchar *ui_number_name;
+  gboolean is_usable;
+};
+typedef struct _CcDisplayMonitorPrivate CcDisplayMonitorPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayMonitor,
+                            cc_display_monitor,
+                            G_TYPE_OBJECT)
+#define CC_DISPLAY_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_DISPLAY_MONITOR, 
CcDisplayMonitorPrivate))
 
 static void
 cc_display_monitor_init (CcDisplayMonitor *self)
 {
+  CcDisplayMonitorPrivate *priv = CC_DISPLAY_MONITOR_GET_PRIVATE (self);
+
+  priv->ui_number = 0;
+  priv->ui_name = NULL;
+  priv->ui_number_name = NULL;
+  priv->is_usable = TRUE;
 }
 
 static void
@@ -112,6 +186,11 @@ cc_display_monitor_class_init (CcDisplayMonitorClass *klass)
                 G_SIGNAL_RUN_LAST,
                 0, NULL, NULL, NULL,
                 G_TYPE_NONE, 0);
+  g_signal_new ("is-usable",
+                CC_TYPE_DISPLAY_MONITOR,
+                G_SIGNAL_RUN_LAST,
+                0, NULL, NULL, NULL,
+                G_TYPE_NONE, 0);
 }
 
 const char *
@@ -254,24 +333,125 @@ cc_display_monitor_set_scale (CcDisplayMonitor *self, double s)
   return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_scale (self, s);
 }
 
+gboolean
+cc_display_monitor_is_useful (CcDisplayMonitor *self)
+{
+  return CC_DISPLAY_MONITOR_GET_PRIVATE (self)->is_usable &&
+         cc_display_monitor_is_active (self);
+}
 
-G_DEFINE_TYPE (CcDisplayConfig,
-               cc_display_config,
-               G_TYPE_OBJECT)
+gboolean
+cc_display_monitor_is_usable (CcDisplayMonitor *self)
+{
+  return CC_DISPLAY_MONITOR_GET_PRIVATE (self)->is_usable;
+}
+
+void
+cc_display_monitor_set_usable (CcDisplayMonitor *self, gboolean is_usable)
+{
+  CC_DISPLAY_MONITOR_GET_PRIVATE (self)->is_usable = is_usable;
+
+  g_signal_emit_by_name (self, "is-usable");
+}
+
+gint
+cc_display_monitor_get_ui_number (CcDisplayMonitor *self)
+{
+  return CC_DISPLAY_MONITOR_GET_PRIVATE (self)->ui_number;
+}
+
+const char *
+cc_display_monitor_get_ui_name (CcDisplayMonitor *self)
+{
+  return CC_DISPLAY_MONITOR_GET_PRIVATE (self)->ui_name;
+}
+
+const char *
+cc_display_monitor_get_ui_number_name (CcDisplayMonitor *self)
+{
+  return CC_DISPLAY_MONITOR_GET_PRIVATE (self)->ui_number_name;
+}
+
+static void
+cc_display_monitor_set_ui_info (CcDisplayMonitor *self, gint ui_number, gchar *ui_name)
+{
+  CcDisplayMonitorPrivate *priv = CC_DISPLAY_MONITOR_GET_PRIVATE (self);
+
+  priv->ui_number = ui_number;
+  g_free (priv->ui_name);
+  priv->ui_name = ui_name;
+  priv->ui_number_name = g_strdup_printf ("%d\u2003%s", ui_number, ui_name);
+}
+
+struct _CcDisplayConfigPrivate {
+  GList *ui_sorted_monitors;
+};
+typedef struct _CcDisplayConfigPrivate CcDisplayConfigPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayConfig,
+                            cc_display_config,
+                            G_TYPE_OBJECT)
+#define CC_DISPLAY_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_DISPLAY_CONFIG, 
CcDisplayConfigPrivate))
 
 static void
 cc_display_config_init (CcDisplayConfig *self)
 {
+  CcDisplayConfigPrivate *priv = CC_DISPLAY_CONFIG_GET_PRIVATE (self);
+
+  priv->ui_sorted_monitors = NULL;
+}
+
+static void
+cc_display_config_constructed (GObject *object)
+{
+  CcDisplayConfig *self = CC_DISPLAY_CONFIG (object);
+  CcDisplayConfigPrivate *priv = CC_DISPLAY_CONFIG_GET_PRIVATE (self);
+  GList *monitors = cc_display_config_get_monitors (self);
+  GList *item;
+  gint ui_number = 1;
+
+  for (item = monitors; item != NULL; item = item->next) {
+    CcDisplayMonitor *monitor = item->data;
+
+    if (cc_display_monitor_is_builtin (monitor))
+      priv->ui_sorted_monitors = g_list_prepend (priv->ui_sorted_monitors, monitor);
+    else
+      priv->ui_sorted_monitors = g_list_append (priv->ui_sorted_monitors, monitor);
+  }
+
+  for (item = priv->ui_sorted_monitors; item != NULL; item = item->next) {
+    CcDisplayMonitor *monitor = item->data;
+    char *ui_name;
+    ui_name = make_output_ui_name (monitor);
+
+    cc_display_monitor_set_ui_info (monitor, ui_number, ui_name);
+
+    ui_number += 1;
+  }
+}
+
+static void
+cc_display_config_finalize (GObject *object)
+{
+  CcDisplayConfig *self = CC_DISPLAY_CONFIG (object);
+  CcDisplayConfigPrivate *priv = CC_DISPLAY_CONFIG_GET_PRIVATE (self);
+
+  g_list_free (priv->ui_sorted_monitors);
 }
 
 static void
 cc_display_config_class_init (CcDisplayConfigClass *klass)
 {
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
   g_signal_new ("primary",
                 CC_TYPE_DISPLAY_CONFIG,
                 G_SIGNAL_RUN_LAST,
                 0, NULL, NULL, NULL,
                 G_TYPE_NONE, 0);
+
+  gobject_class->constructed = cc_display_config_constructed;
+  gobject_class->finalize = cc_display_config_finalize;
 }
 
 GList *
@@ -280,6 +460,32 @@ cc_display_config_get_monitors (CcDisplayConfig *self)
   return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_monitors (self);
 }
 
+GList *
+cc_display_config_get_ui_sorted_monitors (CcDisplayConfig *self)
+{
+  return CC_DISPLAY_CONFIG_GET_PRIVATE (self)->ui_sorted_monitors;
+}
+
+int
+cc_display_config_count_useful_monitors (CcDisplayConfig *self)
+{
+  CcDisplayConfigPrivate *priv = CC_DISPLAY_CONFIG_GET_PRIVATE (self);
+  GList *outputs, *l;
+  guint count = 0;
+
+  outputs = priv->ui_sorted_monitors;
+  for (l = outputs; l != NULL; l = l->next)
+    {
+      CcDisplayMonitor *output = l->data;
+      if (!cc_display_monitor_is_useful (output))
+        continue;
+      else
+        count++;
+    }
+  return count;
+
+}
+
 gboolean
 cc_display_config_is_applicable (CcDisplayConfig *self)
 {
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
index 3a9a5b0..51928d9 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -141,6 +141,8 @@ struct _CcDisplayConfigClass
 
 
 GList *cc_display_config_get_monitors (CcDisplayConfig *config);
+GList *cc_display_config_get_ui_sorted_monitors (CcDisplayConfig *config);
+int cc_display_config_count_useful_monitors (CcDisplayConfig *config);
 gboolean cc_display_config_is_applicable (CcDisplayConfig *config);
 gboolean cc_display_config_equal (CcDisplayConfig *config,
                                   CcDisplayConfig *other);
@@ -185,6 +187,13 @@ void cc_display_monitor_set_mode (CcDisplayMonitor *monitor,
 void cc_display_monitor_set_position (CcDisplayMonitor *monitor,
                                       int x, int y);
 
+gboolean cc_display_monitor_is_useful (CcDisplayMonitor *monitor);
+gboolean cc_display_monitor_is_usable (CcDisplayMonitor *monitor);
+void cc_display_monitor_set_usable (CcDisplayMonitor *monitor, gboolean is_usable);
+int cc_display_monitor_get_ui_number (CcDisplayMonitor *monitor);
+const char * cc_display_monitor_get_ui_name (CcDisplayMonitor *monitor);
+const char * cc_display_monitor_get_ui_number_name (CcDisplayMonitor *monitor);
+
 void cc_display_mode_get_resolution (CcDisplayMode *mode,
                                      int *width,
                                      int *height);
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index a2ae3b4..4010c0c 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -114,67 +114,9 @@ static void
 update_apply_button (CcDisplayPanel *panel);
 static void
 apply_current_configuration (CcDisplayPanel *self);
-static char *
-make_display_size_string (int width_mm,
-                          int height_mm);
 static void
 reset_current_config (CcDisplayPanel *panel);
 
-static char *
-make_output_ui_name (CcDisplayMonitor *output)
-{
-  int width_mm, height_mm;
-  char *size, *name;
-
-  cc_display_monitor_get_physical_size (output, &width_mm, &height_mm);
-  size = make_display_size_string (width_mm, height_mm);
-  if (size)
-    name = g_strdup_printf ("%s (%s)", cc_display_monitor_get_display_name (output), size);
-  else
-    name = g_strdup_printf ("%s", cc_display_monitor_get_display_name (output));
-
-  g_free (size);
-  return name;
-}
-
-static void
-ensure_output_numbers (CcDisplayPanel *self)
-{
-  GList *outputs, *l;
-  GList *sorted = NULL;
-  gint n = 0;
-
-  outputs = cc_display_config_get_monitors (self->priv->current_config);
-
-  for (l = outputs; l != NULL; l = l->next)
-    {
-      CcDisplayMonitor *output = l->data;
-      if (cc_display_monitor_is_builtin (output))
-        sorted = g_list_prepend (sorted, output);
-      else
-        sorted = g_list_append (sorted, output);
-    }
-
-  for (l = sorted; l != NULL; l = l->next)
-    {
-      CcDisplayMonitor *output = l->data;
-      gchar *ui_name = make_output_ui_name (output);
-      gboolean lid_is_closed = (cc_display_monitor_is_builtin (output) &&
-                                self->priv->lid_is_closed);
-
-      g_object_set_data (G_OBJECT (output), "ui-number", GINT_TO_POINTER (++n));
-      g_object_set_data_full (G_OBJECT (output), "ui-number-name",
-                              g_strdup_printf ("%d\u2003%s", n, ui_name),
-                              g_free);
-      g_object_set_data_full (G_OBJECT (output), "ui-name", ui_name, g_free);
-
-      g_object_set_data (G_OBJECT (output), "lid-is-closed", GINT_TO_POINTER (lid_is_closed));
-    }
-
-  g_object_set_data_full (G_OBJECT (self->priv->current_config), "ui-sorted-outputs",
-                          sorted, (GDestroyNotify) g_list_free);
-}
-
 static void
 monitor_labeler_hide (CcDisplayPanel *self)
 {
@@ -206,12 +148,12 @@ monitor_labeler_show (CcDisplayPanel *self)
   g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
   g_variant_builder_open (&builder, G_VARIANT_TYPE_ARRAY);
 
-  outputs = g_object_get_data (G_OBJECT (priv->current_config), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
   for (l = outputs; l != NULL; l = l->next)
     {
       CcDisplayMonitor *output = l->data;
 
-      number = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (output), "ui-number"));
+      number = cc_display_monitor_get_ui_number (output);
       if (number == 0)
         continue;
 
@@ -1101,7 +1043,7 @@ make_single_output_ui (CcDisplayPanel *panel)
 
   vbox = make_main_vbox (priv->main_size_group);
 
-  frame = make_frame (g_object_get_data (G_OBJECT (priv->current_output), "ui-name"), NULL);
+  frame = make_frame (cc_display_monitor_get_ui_name (priv->current_output), NULL);
   gtk_container_add (GTK_CONTAINER (vbox), frame);
 
   gtk_container_add (GTK_CONTAINER (frame), make_output_ui (panel));
@@ -1158,32 +1100,6 @@ make_arrangement_row (CcDisplayPanel *panel)
   return row;
 }
 
-static gboolean
-is_output_useful (CcDisplayMonitor *output)
-{
-  return (cc_display_monitor_is_active (output) &&
-          !g_object_get_data (G_OBJECT (output), "lid-is-closed"));
-}
-
-static guint
-count_useful_outputs (CcDisplayPanel *panel)
-{
-  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 (!is_output_useful (output))
-        continue;
-      else
-        active++;
-    }
-  return active;
-}
-
 static void
 primary_chooser_sync (GtkPopover      *popover,
                       CcDisplayConfig *config)
@@ -1198,7 +1114,7 @@ primary_chooser_sync (GtkPopover      *popover,
       CcDisplayMonitor *output = l->data;
       if (cc_display_monitor_is_primary (output))
         {
-          gchar *text = g_object_get_data (G_OBJECT (output), "ui-number-name");
+          const gchar *text = cc_display_monitor_get_ui_number_name (output);
           gtk_label_set_text (GTK_LABEL (label), text);
           return;
         }
@@ -1222,7 +1138,7 @@ make_primary_chooser_popover (CcDisplayPanel *panel)
   GtkWidget *listbox;
   GList *outputs, *l;
 
-  outputs = g_object_get_data (G_OBJECT (priv->current_config), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
 
   listbox = make_list_box ();
 
@@ -1230,12 +1146,12 @@ make_primary_chooser_popover (CcDisplayPanel *panel)
     {
       CcDisplayMonitor *output = l->data;
       GtkWidget *row;
-      gchar *text;
+      const gchar *text;
 
-      if (!is_output_useful (output))
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
-      text = g_object_get_data (G_OBJECT (output), "ui-number-name");
+      text = cc_display_monitor_get_ui_number_name (output);
       row = g_object_new (CC_TYPE_LIST_BOX_ROW,
                           "child", make_popover_label (text),
                           NULL);
@@ -1337,7 +1253,7 @@ make_two_output_chooser (CcDisplayPanel *panel)
   GtkRadioButton *group;
   GList *outputs, *l;
 
-  outputs = g_object_get_data (G_OBJECT (priv->current_config), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
 
   box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
   gtk_button_box_set_layout (GTK_BUTTON_BOX (box), GTK_BUTTONBOX_EXPAND);
@@ -1349,7 +1265,7 @@ make_two_output_chooser (CcDisplayPanel *panel)
       CcDisplayMonitor *output = l->data;
       GtkWidget *button = gtk_radio_button_new_from_widget (group);
 
-      gtk_button_set_label (GTK_BUTTON (button), g_object_get_data (G_OBJECT (output), "ui-name"));
+      gtk_button_set_label (GTK_BUTTON (button), cc_display_monitor_get_ui_name (output));
       gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
 
       g_object_set_data (G_OBJECT (button), "output", output);
@@ -1745,7 +1661,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_useful_outputs (panel) > 1)
+  else if (cc_display_config_count_useful_monitors (priv->current_config) > 1)
     gtk_stack_set_visible_child_name (GTK_STACK (stack), "join");
   else
     gtk_stack_set_visible_child_name (GTK_STACK (stack), "single");
@@ -1782,8 +1698,8 @@ make_output_switch (CcDisplayPanel *panel)
                            button, G_CONNECT_SWAPPED);
   output_switch_sync (button, priv->current_output);
 
-  if ((count_useful_outputs (panel) < 2 && cc_display_monitor_is_active (priv->current_output)) ||
-      (cc_display_monitor_is_builtin (priv->current_output) && priv->lid_is_closed))
+  if ((cc_display_config_count_useful_monitors (priv->current_config) < 2 && cc_display_monitor_is_active 
(priv->current_output)) ||
+      !cc_display_monitor_is_usable (priv->current_output))
     gtk_widget_set_sensitive (button, FALSE);
 
   return button;
@@ -1810,7 +1726,7 @@ static void
 output_chooser_sync (GtkWidget      *button,
                      CcDisplayPanel *panel)
 {
-  gchar *text = g_object_get_data (G_OBJECT (panel->priv->current_output), "ui-number-name");
+  const gchar *text = cc_display_monitor_get_ui_number_name (panel->priv->current_output);
   GtkWidget *label = gtk_bin_get_child (GTK_BIN (button));
 
   gtk_label_set_text (GTK_LABEL (label), text);
@@ -1823,7 +1739,7 @@ make_output_chooser_button (CcDisplayPanel *panel)
   GtkWidget *listbox, *button, *popover;
   GList *outputs, *l;
 
-  outputs = g_object_get_data (G_OBJECT (priv->current_config), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
 
   listbox = make_list_box ();
 
@@ -1831,9 +1747,9 @@ make_output_chooser_button (CcDisplayPanel *panel)
     {
       CcDisplayMonitor *output = l->data;
       GtkWidget *row;
-      gchar *text;
+      const gchar *text;
 
-      text = g_object_get_data (G_OBJECT (output), "ui-number-name");
+      text = cc_display_monitor_get_ui_number_name (output);
       row = g_object_new (CC_TYPE_LIST_BOX_ROW,
                           "child", make_popover_label (text),
                           NULL);
@@ -1909,14 +1825,16 @@ reset_current_config (CcDisplayPanel *panel)
 
   priv->current_config = current;
 
-  ensure_output_numbers (panel);
-
-  outputs = g_object_get_data (G_OBJECT (current), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
   for (l = outputs; l; l = l->next)
     {
       CcDisplayMonitor *output = l->data;
 
-      if (!is_output_useful (output))
+      /* Mark any builtin monitor as unusable if the lid is closed. */
+      if (cc_display_monitor_is_builtin (output) && priv->lid_is_closed)
+        cc_display_monitor_set_usable (output, FALSE);
+
+      if (!cc_display_monitor_is_useful (output))
         continue;
 
       priv->current_output = output;
@@ -1951,7 +1869,7 @@ on_screen_changed (CcDisplayPanel *panel)
   if (!priv->current_output)
     goto show_error;
 
-  outputs = g_object_get_data (G_OBJECT (priv->current_config), "ui-sorted-outputs");
+  outputs = cc_display_config_get_ui_sorted_monitors (priv->current_config);
   n_outputs = g_list_length (outputs);
   if (priv->lid_is_closed)
     {
@@ -2182,45 +2100,6 @@ get_frequency_string (CcDisplayMode *mode)
   return frequency;
 }
 
-static const double known_diagonals[] = {
-    12.1,
-    13.3,
-    15.6
-};
-
-static char *
-diagonal_to_str (double d)
-{
-    int i;
-
-    for (i = 0; i < G_N_ELEMENTS (known_diagonals); i++)
-    {
-        double delta;
-
-        delta = fabs(known_diagonals[i] - d);
-        if (delta < 0.1)
-            return g_strdup_printf ("%0.1lf\"", known_diagonals[i]);
-    }
-
-    return g_strdup_printf ("%d\"", (int) (d + 0.5));
-}
-
-static char *
-make_display_size_string (int width_mm,
-                          int height_mm)
-{
-  char *inches = NULL;
-
-  if (width_mm > 0 && height_mm > 0)
-    {
-      double d = sqrt (width_mm * width_mm + height_mm * height_mm);
-
-      inches = diagonal_to_str (d / 25.4);
-    }
-
-  return inches;
-}
-
 static gboolean
 should_show_rotation (CcDisplayPanel *panel,
                       CcDisplayMonitor  *output)


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