diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 5b97f624f..3e6207f10 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -35,6 +35,7 @@ #include #include "util-private.h" #include +#include "edid.h" #include "meta-monitor-config.h" #include "backends/x11/meta-monitor-manager-xrandr.h" #include "meta-backend-private.h" @@ -1210,6 +1211,38 @@ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager) g_free (old_monitor_infos); } +void +meta_output_parse_edid (MetaOutput *meta_output, + GBytes *edid) +{ + MonitorInfo *parsed_edid; + gsize len; + + parsed_edid = decode_edid (g_bytes_get_data (edid, &len)); + + if (parsed_edid) + { + meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4); + if (parsed_edid->dsc_product_name[0]) + meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14); + else + meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code); + if (parsed_edid->dsc_serial_number[0]) + meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); + else + meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number); + + g_free (parsed_edid); + } + + if (!meta_output->vendor) + { + meta_output->vendor = g_strdup ("unknown"); + meta_output->product = g_strdup ("unknown"); + meta_output->serial = g_strdup ("unknown"); + } +} + void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager) { diff --git a/src/backends/meta-monitor-manager.h b/src/backends/meta-monitor-manager.h index 8ba3b46a1..b4a0eeb89 100644 --- a/src/backends/meta-monitor-manager.h +++ b/src/backends/meta-monitor-manager.h @@ -361,6 +361,9 @@ void meta_monitor_manager_apply_configuration (MetaMonitorManager void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager, gboolean ok); +void meta_output_parse_edid (MetaOutput *output, + GBytes *edid); + void meta_crtc_info_free (MetaCRTCInfo *info); void meta_output_info_free (MetaOutputInfo *info); diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c index 564bc5088..13709f165 100644 --- a/src/backends/native/meta-monitor-manager-kms.c +++ b/src/backends/native/meta-monitor-manager-kms.c @@ -39,7 +39,6 @@ #include #include -#include "edid.h" #include @@ -515,27 +514,9 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager) edid = read_output_edid (manager_kms, meta_output); if (edid) { - MonitorInfo *parsed_edid; - gsize len; - - parsed_edid = decode_edid (g_bytes_get_data (edid, &len)); - if (parsed_edid) - { - meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4); - meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14); - meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); - - g_free (parsed_edid); - } - + meta_output_parse_edid (meta_output, edid); g_bytes_unref (edid); } - if (!meta_output->vendor) - { - meta_output->vendor = g_strdup ("unknown"); - meta_output->product = g_strdup ("unknown"); - meta_output->serial = g_strdup ("unknown"); - } /* MetaConnectorType matches DRM's connector types */ meta_output->connector_type = (MetaConnectorType) connector->connector_type; diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c index b047acacc..03b4152fc 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c @@ -41,7 +41,6 @@ #include "meta-backend-x11.h" #include #include -#include "edid.h" #include "meta-monitor-config.h" #define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1) @@ -689,7 +688,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) if (output->connection != RR_Disconnected) { GBytes *edid; - MonitorInfo *parsed_edid; meta_output->winsys_id = resources->outputs[i]; meta_output->name = g_strdup (output->name); @@ -697,33 +695,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) edid = read_output_edid (manager_xrandr, meta_output->winsys_id); if (edid) { - gsize len; - - parsed_edid = decode_edid (g_bytes_get_data (edid, &len)); - if (parsed_edid) - { - meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4); - if (parsed_edid->dsc_product_name[0]) - meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14); - else - meta_output->product = g_strdup_printf ("0x%04x", (unsigned)parsed_edid->product_code); - if (parsed_edid->dsc_serial_number[0]) - meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14); - else - meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number); - - g_free (parsed_edid); - } - + meta_output_parse_edid (meta_output, edid); g_bytes_unref (edid); } - if (!meta_output->vendor) - { - meta_output->vendor = g_strdup ("unknown"); - meta_output->product = g_strdup ("unknown"); - meta_output->serial = g_strdup ("unknown"); - } meta_output->width_mm = output->mm_width; meta_output->height_mm = output->mm_height; meta_output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;