From: Paul Gofman pgofman@codeweavers.com
--- dlls/win32u/sysparams.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 283d40e2e29..c98c288e72c 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1314,7 +1314,8 @@ static void add_adapter( const struct gdi_adapter *adapter, void *param ) sizeof(adapter->state_flags) ); }
-static BOOL get_monitor_id_from_edid( char monitor_id_string[16], const unsigned char *edid, unsigned int edid_len ) +static BOOL get_monitor_id_from_edid( char monitor_id_string[16], unsigned short *man_id, unsigned short *prod_code, + const unsigned char *edid, unsigned int edid_len ) { unsigned short w; unsigned char d; @@ -1327,11 +1328,17 @@ static BOOL get_monitor_id_from_edid( char monitor_id_string[16], const unsigned { d = w & 0x1f; if (!d || d - 1 > 'Z' - 'A') return FALSE; - monitor_id_string[2 - i] = 'A' + d - 1; + if (monitor_id_string) monitor_id_string[2 - i] = 'A' + d - 1; w >>= 5; } if (w) return FALSE; w = edid[10] | (edid[11] << 8); /* Product code, little endian. */ + if (man_id) + { + *man_id = *(unsigned short *)(edid + 8); + *prod_code = w; + return TRUE; + } sprintf( monitor_id_string + 3, "%04X", w ); TRACE( "Monitor id %s.\n", monitor_id_string ); return TRUE; @@ -1352,7 +1359,7 @@ static void add_monitor( const struct gdi_monitor *monitor, void *param ) monitor_index = ctx->monitor_count++; output_index = ctx->output_count++;
- if (!get_monitor_id_from_edid( monitor_id_string, monitor->edid, monitor->edid_len )) + if (!get_monitor_id_from_edid( monitor_id_string, NULL, NULL, monitor->edid, monitor->edid_len )) strcpy( monitor_id_string, "Default_Monitor" );
sprintf( buffer, "MonitorID%u", monitor_index ); @@ -5724,6 +5731,9 @@ NTSTATUS WINAPI NtUserDisplayConfigGetDeviceInfo( DISPLAYCONFIG_DEVICE_INFO_HEAD snprintf( buffer, ARRAY_SIZE(buffer), "Display%u", monitor->output_id + 1 ); asciiz_to_unicode( target_name->monitorFriendlyDeviceName, buffer ); lstrcpyW( target_name->monitorDevicePath, monitor->dev.interface_name ); + if (get_monitor_id_from_edid( NULL, &target_name->edidManufactureId, &target_name->edidProductCodeId, + monitor->edid, monitor->edid_len )) + target_name->flags.edidIdsValid = 1; ret = STATUS_SUCCESS; break; }