From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 17 +++++++++++++---- dlls/wineandroid.drv/init.c | 3 ++- dlls/winemac.drv/display.c | 3 ++- dlls/winewayland.drv/display.c | 3 ++- dlls/winex11.drv/display.c | 3 ++- include/wine/gdi_driver.h | 4 ++-- 6 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index f07f0d53628..ced9c61db06 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -70,6 +70,7 @@ static const WCHAR yesW[] = {'Y','e','s',0}; static const WCHAR noW[] = {'N','o',0}; static const WCHAR modesW[] = {'M','o','d','e','s',0}; static const WCHAR mode_countW[] = {'M','o','d','e','C','o','u','n','t',0}; +static const WCHAR dpiW[] = {'D','p','i',0};
static const char guid_devclass_displayA[] = "{4D36E968-E325-11CE-BFC1-08002BE10318}"; static const WCHAR guid_devclass_displayW[] = @@ -106,6 +107,7 @@ struct source char path[MAX_PATH]; unsigned int id; struct gpu *gpu; + UINT dpi; UINT state_flags; UINT monitor_count; UINT mode_count; @@ -643,6 +645,10 @@ static BOOL read_source_from_registry( unsigned int index, struct source *source if (query_reg_ascii_value( hkey, "StateFlags", value, sizeof(buffer) ) && value->Type == REG_DWORD) source->state_flags = *(const DWORD *)value->Data;
+ /* Dpi */ + if (query_reg_ascii_value( hkey, "Dpi", value, sizeof(buffer) ) && value->Type == REG_DWORD) + source->dpi = *(DWORD *)value->Data; + /* ModeCount */ if (query_reg_ascii_value( hkey, "ModeCount", value, sizeof(buffer) ) && value->Type == REG_DWORD) source->mode_count = *(const DWORD *)value->Data; @@ -1344,6 +1350,7 @@ static BOOL write_source_to_registry( const struct source *source, HKEY *source_ set_reg_ascii_value( *source_key, "GPUID", gpu->path ); set_reg_value( *source_key, state_flagsW, REG_DWORD, &source->state_flags, sizeof(source->state_flags) ); + set_reg_value( *source_key, dpiW, REG_DWORD, &source->dpi, sizeof(source->dpi) );
snprintf( buffer, sizeof(buffer), "System\CurrentControlSet\Control\Video\%s\%04x", gpu->guid, source_index ); hkey = reg_create_ascii_key( config_key, buffer, REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK, NULL ); @@ -1356,7 +1363,7 @@ static BOOL write_source_to_registry( const struct source *source, HKEY *source_ return TRUE; }
-static void add_source( const char *name, UINT state_flags, void *param ) +static void add_source( const char *name, UINT state_flags, UINT dpi, void *param ) { struct device_manager_ctx *ctx = param;
@@ -1375,6 +1382,7 @@ static void add_source( const char *name, UINT state_flags, void *param ) ctx->source.id = 0; ctx->has_primary = TRUE; } + ctx->source.dpi = dpi;
/* Wine specific config key where source settings will be held, symlinked with the logically indexed config key */ snprintf( ctx->source.path, sizeof(ctx->source.path), "%s\%s\Video\%s\Sources\%s", config_keyA, @@ -1811,7 +1819,7 @@ static NTSTATUS default_update_display_devices( struct device_manager_ctx *ctx ) DEVMODEW mode = {.dmSize = sizeof(mode)};
add_gpu( "Wine GPU", &pci_id, NULL, ctx ); - add_source( "Default", source_flags, ctx ); + add_source( "Default", source_flags, system_dpi, ctx );
if (!read_source_mode( ctx->source_key, ENUM_CURRENT_SETTINGS, &mode )) { @@ -2130,8 +2138,9 @@ static void release_display_dc( HDC hdc ) /* display_lock must be held */ static UINT monitor_get_dpi( struct monitor *monitor ) { - /* FIXME: use the monitor DPI instead */ - return system_dpi; + UINT dpi; + if (!monitor->source || !(dpi = monitor->source->dpi)) dpi = system_dpi; + return dpi; }
/* display_lock must be held */ diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index d5488388e0d..a7dbce7a4dd 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -280,10 +280,11 @@ UINT ANDROID_UpdateDisplayDevices( const struct gdi_device_manager *device_manag DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY, .dmBitsPerPel = screen_bpp, .dmPelsWidth = screen_width, .dmPelsHeight = screen_height, .dmDisplayFrequency = 60, }; + UINT dpi = NtUserGetSystemDpiForProcess( NULL ); DEVMODEW current = mode;
device_manager->add_gpu( "Wine GPU", &pci_id, NULL, param ); - device_manager->add_source( "Default", source_flags, param ); + device_manager->add_source( "Default", source_flags, dpi, param ); device_manager->add_monitor( &gdi_monitor, param );
current.dmFields |= DM_POSITION; diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 4a9e9ab721e..c160c286d21 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -1156,10 +1156,11 @@ UINT macdrv_UpdateDisplayDevices(const struct gdi_device_manager *device_manager for (adapter = adapters; adapter < adapters + adapter_count; adapter++) { DEVMODEW current_mode = { .dmSize = sizeof(current_mode) }; + UINT dpi = NtUserGetSystemDpiForProcess( NULL ); char buffer[32];
sprintf( buffer, "%04x", adapter->id ); - device_manager->add_source( buffer, adapter->state_flags, param ); + device_manager->add_source( buffer, adapter->state_flags, dpi, param );
if (macdrv_get_monitors(adapter->id, &monitors, &monitor_count)) break; TRACE("adapter: %#x, monitor count: %d\n", adapter->id, monitor_count); diff --git a/dlls/winewayland.drv/display.c b/dlls/winewayland.drv/display.c index 9b4ebe7cdc1..5d65fd01c54 100644 --- a/dlls/winewayland.drv/display.c +++ b/dlls/winewayland.drv/display.c @@ -199,9 +199,10 @@ static void wayland_add_device_gpu(const struct gdi_device_manager *device_manag static void wayland_add_device_source(const struct gdi_device_manager *device_manager, void *param, UINT state_flags, struct output_info *output_info) { + UINT dpi = NtUserGetSystemDpiForProcess( NULL ); TRACE("name=%s state_flags=0x%x\n", output_info->output->name, state_flags); - device_manager->add_source(output_info->output->name, state_flags, param); + device_manager->add_source(output_info->output->name, state_flags, dpi, param); }
static void wayland_add_device_monitor(const struct gdi_device_manager *device_manager, diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 6b92e046fb8..3ce21d203d2 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -525,9 +525,10 @@ UINT X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage char buffer[32]; x11drv_settings_id settings_id; BOOL is_primary = adapters[adapter].state_flags & DISPLAY_DEVICE_PRIMARY_DEVICE; + UINT dpi = NtUserGetSystemDpiForProcess( NULL );
sprintf( buffer, "%04lx", adapters[adapter].id ); - device_manager->add_source( buffer, adapters[adapter].state_flags, param ); + device_manager->add_source( buffer, adapters[adapter].state_flags, dpi, param );
if (!host_handler.get_monitors( adapters[adapter].id, &monitors, &monitor_count )) break; TRACE("adapter: %#lx, monitor count: %d\n", adapters[adapter].id, monitor_count); diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index a5ceae87022..6e051cfdaa3 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -219,7 +219,7 @@ struct gdi_dc_funcs };
/* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 96 +#define WINE_GDI_DRIVER_VERSION 97
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ @@ -312,7 +312,7 @@ struct gdi_monitor struct gdi_device_manager { void (*add_gpu)( const char *name, const struct pci_id *pci_id, const GUID *vulkan_uuid, void *param ); - void (*add_source)( const char *name, UINT state_flags, void *param ); + void (*add_source)( const char *name, UINT state_flags, UINT dpi, void *param ); void (*add_monitor)( const struct gdi_monitor *monitor, void *param ); void (*add_modes)( const DEVMODEW *current, UINT modes_count, const DEVMODEW *modes, void *param ); };