summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimo@endlessm.com>2014-01-06 18:26:03 -0800
committerCosimo Cecchi <cosimo@endlessm.com>2014-01-07 09:47:23 -0800
commit477acddf642d735ef036a95fda6f4d7f6b522fd1 (patch)
treea236f12d9efc4baa96487ff127c4340c13883bdf
parent1d04ea62ba0dc11d6b1b88f410608094bb8e57e0 (diff)
downloadmutter-477acddf642d735ef036a95fda6f4d7f6b522fd1.tar.gz
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
-rw-r--r--src/core/monitor.c65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/core/monitor.c b/src/core/monitor.c
index 6d65f9e47..ba8c61755 100644
--- a/src/core/monitor.c
+++ b/src/core/monitor.c
@@ -691,46 +691,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