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;