diff options
Diffstat (limited to 'libmate-desktop/display-name.c')
-rw-r--r-- | libmate-desktop/display-name.c | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/libmate-desktop/display-name.c b/libmate-desktop/display-name.c new file mode 100644 index 0000000..cbd59d9 --- /dev/null +++ b/libmate-desktop/display-name.c @@ -0,0 +1,302 @@ +/* + * Copyright 2007 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* Author: Soren Sandmann <[email protected]> */ + +#include <config.h> +#include <glib/gi18n-lib.h> +#include <stdlib.h> +#include <math.h> +#include <stdio.h> +#include <string.h> +#include <glib.h> +#include "edid.h" + +typedef struct Vendor Vendor; + +struct Vendor { + const char vendor_id[4]; + const char vendor_name[28]; +}; + +/* This list of vendor codes derived from lshw + * + * http://ezix.org/project/wiki/HardwareLiSter + * + * Note: we now prefer to use data coming from hwdata (and shipped with + * mate-desktop). See + * http://git.fedorahosted.org/git/?p=hwdata.git;a=blob_plain;f=pnp.ids;hb=HEAD + * All contributions to the list of vendors should go there. + */ +static const struct Vendor vendors[] = { + {"AIC", "AG Neovo"}, + {"ACR", "Acer"}, + {"DEL", "DELL"}, + {"SAM", "SAMSUNG"}, + {"SNY", "SONY"}, + {"SEC", "Epson"}, + {"WAC", "Wacom"}, + {"NEC", "NEC"}, + {"CMO", "CMO"}, /* Chi Mei */ + {"BNQ", "BenQ"}, + + {"ABP", "Advansys"}, + {"ACC", "Accton"}, + {"ACE", "Accton"}, + {"ADP", "Adaptec"}, + {"ADV", "AMD"}, + {"AIR", "AIR"}, + {"AMI", "AMI"}, + {"ASU", "ASUS"}, + {"ATI", "ATI"}, + {"ATK", "Allied Telesyn"}, + {"AZT", "Aztech"}, + {"BAN", "Banya"}, + {"BRI", "Boca Research"}, + {"BUS", "Buslogic"}, + {"CCI", "Cache Computers Inc."}, + {"CHA", "Chase"}, + {"CMD", "CMD Technology, Inc."}, + {"COG", "Cogent"}, + {"CPQ", "Compaq"}, + {"CRS", "Crescendo"}, + {"CSC", "Crystal"}, + {"CSI", "CSI"}, + {"CTL", "Creative Labs"}, + {"DBI", "Digi"}, + {"DEC", "Digital Equipment"}, + {"DBK", "Databook"}, + {"EGL", "Eagle Technology"}, + {"ELS", "ELSA"}, + {"ESS", "ESS"}, + {"FAR", "Farallon"}, + {"FDC", "Future Domain"}, + {"HWP", "Hewlett-Packard"}, + {"IBM", "IBM"}, + {"INT", "Intel"}, + {"ISA", "Iomega"}, + {"LEN", "Lenovo"}, + {"MDG", "Madge"}, + {"MDY", "Microdyne"}, + {"MET", "Metheus"}, + {"MIC", "Micronics"}, + {"MLX", "Mylex"}, + {"NVL", "Novell"}, + {"OLC", "Olicom"}, + {"PRO", "Proteon"}, + {"RII", "Racal"}, + {"RTL", "Realtek"}, + {"SCM", "SCM"}, + {"SKD", "SysKonnect"}, + {"SGI", "SGI"}, + {"SMC", "SMC"}, + {"SNI", "Siemens Nixdorf"}, + {"STL", "Stallion Technologies"}, + {"SUN", "Sun"}, + {"SUP", "SupraExpress"}, + {"SVE", "SVEC"}, + {"TCC", "Thomas-Conrad"}, + {"TCI", "Tulip"}, + {"TCM", "3Com"}, + {"TCO", "Thomas-Conrad"}, + {"TEC", "Tecmar"}, + {"TRU", "Truevision"}, + {"TOS", "Toshiba"}, + {"TYN", "Tyan"}, + {"UBI", "Ungermann-Bass"}, + {"USC", "UltraStor"}, + {"VDM", "Vadem"}, + {"VMI", "Vermont"}, + {"WDC", "Western Digital"}, + {"ZDS", "Zeos"}, + + /* From http://faydoc.tripod.com/structures/01/0136.htm */ + {"ACT", "Targa"}, + {"ADI", "ADI"}, + {"AOC", "AOC Intl"}, + {"API", "Acer America"}, + {"APP", "Apple Computer"}, + {"ART", "ArtMedia"}, + {"AST", "AST Research"}, + {"CPL", "Compal"}, + {"CTX", "Chuntex Electronic Co."}, + {"DPC", "Delta Electronics"}, + {"DWE", "Daewoo"}, + {"ECS", "ELITEGROUP"}, + {"EIZ", "EIZO"}, + {"FCM", "Funai"}, + {"GSM", "LG Electronics"}, + {"GWY", "Gateway 2000"}, + {"HEI", "Hyundai"}, + {"HIT", "Hitachi"}, + {"HSL", "Hansol"}, + {"HTC", "Hitachi"}, + {"ICL", "Fujitsu ICL"}, + {"IVM", "Idek Iiyama"}, + {"KFC", "KFC Computek"}, + {"LKM", "ADLAS"}, + {"LNK", "LINK Tech"}, + {"LTN", "Lite-On"}, + {"MAG", "MAG InnoVision"}, + {"MAX", "Maxdata"}, + {"MEI", "Panasonic"}, + {"MEL", "Mitsubishi"}, + {"MIR", "miro"}, + {"MTC", "MITAC"}, + {"NAN", "NANAO"}, + {"NEC", "NEC Tech"}, + {"NOK", "Nokia"}, + {"OQI", "OPTIQUEST"}, + {"PBN", "Packard Bell"}, + {"PGS", "Princeton"}, + {"PHL", "Philips"}, + {"REL", "Relisys"}, + {"SDI", "Samtron"}, + {"SMI", "Smile"}, + {"SPT", "Sceptre"}, + {"SRC", "Shamrock Technology"}, + {"STP", "Sceptre"}, + {"TAT", "Tatung"}, + {"TRL", "Royal Information Company"}, + {"TSB", "Toshiba, Inc."}, + {"UNM", "Unisys"}, + {"VSC", "ViewSonic"}, + {"WTC", "Wen Tech"}, + {"ZCM", "Zenith Data Systems"}, + + {"???", "Unknown"}, +}; + +static GHashTable* pnp_ids = NULL; + +static void read_pnp_ids(void) +{ + gchar* contents; + gchar** lines; + gchar* line; + gchar* code, *name; + gint i; + + if (pnp_ids) + return; + + pnp_ids = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); + + if (g_file_get_contents(PNP_IDS, &contents, NULL, NULL)) + { + lines = g_strsplit(contents, "\n", -1); + + for (i = 0; lines[i]; i++) + { + line = lines[i]; + + if (line[3] == '\t') + { + code = line; + line[3] = '\0'; + name = line + 4; + g_hash_table_insert(pnp_ids, code, name); + } + } + + g_free(lines); + g_free(contents); + } +} + + +static const char* find_vendor(const char* code) +{ + const char* vendor_name; + int i; + + read_pnp_ids(); + + vendor_name = g_hash_table_lookup(pnp_ids, code); + + if (vendor_name) + return vendor_name; + + for (i = 0; i < sizeof(vendors) / sizeof(vendors[0]); ++i) + { + const Vendor* v = &(vendors[i]); + + if (strcmp(v->vendor_id, code) == 0) + return v->vendor_name; + } + + return code; +} + +char* make_display_name(const MonitorInfo* info) +{ + const char* vendor; + int width_mm, height_mm, inches; + + if (info) + { + vendor = find_vendor(info->manufacturer_code); + } + else + { + /* Translators: "Unknown" here is used to identify a monitor for which + * we don't know the vendor. When a vendor is known, the name of the + * vendor is used. */ + vendor = C_("Monitor vendor", "Unknown"); + } + + if (info && info->width_mm != -1 && info->height_mm) + { + width_mm = info->width_mm; + height_mm = info->height_mm; + } + else if (info && info->n_detailed_timings) + { + width_mm = info->detailed_timings[0].width_mm; + height_mm = info->detailed_timings[0].height_mm; + } + else + { + width_mm = -1; + height_mm = -1; + } + + if (width_mm != -1 && height_mm != -1) + { + double d = sqrt (width_mm * width_mm + height_mm * height_mm); + + inches = (int) (d / 25.4 + 0.5); + } + else + { + inches = -1; + } + + if (inches > 0) + { + return g_strdup_printf("%s %d\"", vendor, inches); + } + else + { + return g_strdup(vendor); + } +} |