Module: wine Branch: master Commit: 9c99d9bceba34559a32f1e5906a6fcbcf91b0004 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9c99d9bceba34559a32f1e590...
Author: Zhiyi Zhang zzhang@codeweavers.com Date: Mon Jul 27 16:01:55 2020 +0800
winex11.drv: Migrate NoRes display settings handler to a new interface.
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winex11.drv/settings.c | 93 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 12 deletions(-)
diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c index 7c7d950718..57b7faba8e 100644 --- a/dlls/winex11.drv/settings.c +++ b/dlls/winex11.drv/settings.c @@ -169,30 +169,99 @@ void X11DRV_Settings_SetHandler(const struct x11drv_settings_handler *new_handle * Default handlers if resolution switching is not enabled * */ -static int X11DRV_nores_GetCurrentMode(void) +static BOOL nores_get_id(const WCHAR *device_name, ULONG_PTR *id) { - return 0; + WCHAR primary_adapter[CCHDEVICENAME]; + + if (!get_primary_adapter( primary_adapter )) + return FALSE; + + *id = !lstrcmpiW( device_name, primary_adapter ) ? 1 : 0; + return TRUE; +} + +static BOOL nores_get_modes(ULONG_PTR id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count) +{ + RECT primary = get_host_primary_monitor_rect(); + DEVMODEW *modes; + + modes = heap_calloc(1, sizeof(*modes)); + if (!modes) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + modes[0].dmSize = sizeof(*modes); + modes[0].dmDriverExtra = 0; + modes[0].dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | + DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY; + modes[0].u1.s2.dmDisplayOrientation = DMDO_DEFAULT; + modes[0].dmBitsPerPel = screen_bpp; + modes[0].dmPelsWidth = primary.right; + modes[0].dmPelsHeight = primary.bottom; + modes[0].u2.dmDisplayFlags = 0; + modes[0].dmDisplayFrequency = 60; + + *new_modes = modes; + *mode_count = 1; + return TRUE; }
-static LONG X11DRV_nores_SetCurrentMode(int mode) +static void nores_free_modes(DEVMODEW *modes) { - if (mode == 0) return DISP_CHANGE_SUCCESSFUL; - TRACE("Ignoring mode change request mode=%d\n", mode); - return DISP_CHANGE_FAILED; + heap_free(modes); +} + +static BOOL nores_get_current_mode(ULONG_PTR id, DEVMODEW *mode) +{ + RECT primary = get_host_primary_monitor_rect(); + + mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | + DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY | DM_POSITION; + mode->u1.s2.dmDisplayOrientation = DMDO_DEFAULT; + mode->u2.dmDisplayFlags = 0; + mode->u1.s2.dmPosition.x = 0; + mode->u1.s2.dmPosition.y = 0; + + if (id != 1) + { + FIXME("Non-primary adapters are unsupported.\n"); + mode->dmBitsPerPel = 0; + mode->dmPelsWidth = 0; + mode->dmPelsHeight = 0; + mode->dmDisplayFrequency = 0; + return TRUE; + } + + mode->dmBitsPerPel = screen_bpp; + mode->dmPelsWidth = primary.right; + mode->dmPelsHeight = primary.bottom; + mode->dmDisplayFrequency = 60; + return TRUE; +} + +static LONG nores_set_current_mode(ULONG_PTR id, DEVMODEW *mode) +{ + WARN("NoRes settings handler, ignoring mode change request.\n"); + return DISP_CHANGE_SUCCESSFUL; }
/* default handler only gets the current X desktop resolution */ void X11DRV_Settings_Init(void) { - RECT primary = get_host_primary_monitor_rect(); + struct x11drv_settings_handler nores_handler;
depths = screen_bpp == 32 ? depths_32 : depths_24;
- X11DRV_Settings_SetHandlers("NoRes", - X11DRV_nores_GetCurrentMode, - X11DRV_nores_SetCurrentMode, - 1, 0); - X11DRV_Settings_AddOneMode( primary.right - primary.left, primary.bottom - primary.top, 0, 60); + nores_handler.name = "NoRes"; + nores_handler.priority = 0; + nores_handler.get_id = nores_get_id; + nores_handler.get_modes = nores_get_modes; + nores_handler.free_modes = nores_free_modes; + nores_handler.get_current_mode = nores_get_current_mode; + nores_handler.set_current_mode = nores_set_current_mode; + X11DRV_Settings_SetHandler(&nores_handler); }
static BOOL get_display_device_reg_key(const WCHAR *device_name, WCHAR *key, unsigned len)