[mutter/wayland] monitor: improve heuristic to determine display output name



commit 7b597b8c622e93f7c45b97c69373f90bdf896525
Author: Cosimo Cecchi <cosimo endlessm com>
Date:   Mon Jan 6 18:26:03 2014 -0800

    monitor: improve heuristic to determine display output name
    
    Under some circumstances, for example when the display controller driver
    doesn't report back the correct EDID, or under VirtualBox, Mutter
    returns suboptimal strings for an output display name, leading to funny
    labels like 'Unknown 0"', or '(null) 0"' in the Settings panel.
    
    This commit improves our heuristic in three ways:
    - we now avoid putting inches in the display name if either dimension is
      zero
    - we use the vendor name in case we're not able to lookup its PnP id
      from the database. Previously we would have passed over '(null)'
    - as a special edge-case, when neither inches nor vendor are known, we
      use the string 'Unknown Display'
    
    Finally, we make the combined vendor + inches string translatable, as
    different languages might want to move the size part of the string to a
    position different than the end.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=721674

 src/core/monitor.c |   65 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 40 insertions(+), 25 deletions(-)
---
diff --git a/src/core/monitor.c b/src/core/monitor.c
index 999b23e..75462e7 100644
--- a/src/core/monitor.c
+++ b/src/core/monitor.c
@@ -614,46 +614,61 @@ static char *
 make_display_name (MetaMonitorManager *manager,
                    MetaOutput         *output)
 {
+  char *inches = NULL;
+  char *vendor_name = NULL;
+  char *ret;
+  gboolean is_unknown = FALSE;
+
   if (g_str_has_prefix (output->name, "LVDS") ||
       g_str_has_prefix (output->name, "eDP"))
-    return g_strdup (_("Built-in display"));
+    {
+      ret = g_strdup (_("Built-in display"));
+      goto out;
+    }
 
-  if (output->width_mm != -1 && output->height_mm != -1)
+  if (output->width_mm > 0 && output->height_mm > 0)
     {
       double d = sqrt (output->width_mm * output->width_mm +
                        output->height_mm * output->height_mm);
-      char *inches = diagonal_to_str (d / 25.4);
-      char *vendor_name;
-      char *ret;
-
-      if (g_strcmp0 (output->vendor, "unknown") != 0)
-        {
-          if (!manager->pnp_ids)
-            manager->pnp_ids = gnome_pnp_ids_new ();
+      inches = diagonal_to_str (d / 25.4);
+    }
 
-          vendor_name = gnome_pnp_ids_get_pnp_id (manager->pnp_ids,
-                                                  output->vendor);
+  if (g_strcmp0 (output->vendor, "unknown") != 0)
+    {
+      if (!manager->pnp_ids)
+        manager->pnp_ids = gnome_pnp_ids_new ();
 
-          ret = g_strdup_printf ("%s %s", vendor_name, inches);
+      vendor_name = gnome_pnp_ids_get_pnp_id (manager->pnp_ids,
+                                              output->vendor);
 
-          g_free (vendor_name);
-        }
+      if (!vendor_name)
+        vendor_name = g_strdup (output->vendor);
+    }
+  else
+    {
+      if (inches != NULL)
+        vendor_name = g_strdup (_("Unknown"));
       else
-        {
-          /* TRANSLATORS: this is a monitor name (in case we don't know
-             the vendor), it's Unknown followed by a size in inches,
-             like 'Unknown 15"'
-          */
-          ret = g_strdup_printf (_("Unknown %s"), inches);
-        }
+        vendor_name = g_strdup (_("Unknown Display"));
+    }
 
-      g_free (inches);
-      return ret;
+  if (inches != NULL)
+    {
+      /* TRANSLATORS: this is a monitor vendor name, followed by a
+       * size in inches, like 'Dell 15"'
+       */
+      ret = g_strdup_printf (_("%s %s"), vendor_name, inches);
     }
   else
     {
-      return g_strdup (output->vendor);
+      ret = g_strdup (vendor_name);
     }
+
+ out:
+  g_free (inches);
+  g_free (vendor_name);
+
+  return ret;
 }
 
 static gboolean


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