mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 17:04:55 +00:00
winex11: Only request display modes driver data when needed.
This commit is contained in:
parent
6b4ab3be97
commit
f74900ad1a
|
@ -71,7 +71,7 @@ static BOOL nores_get_id(const WCHAR *device_name, BOOL is_primary, x11drv_setti
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL nores_get_modes(x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count)
|
||||
static BOOL nores_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full )
|
||||
{
|
||||
RECT primary = get_host_primary_monitor_rect();
|
||||
DEVMODEW *modes;
|
||||
|
@ -261,8 +261,7 @@ static DEVMODEW *get_full_mode(x11drv_settings_id id, DEVMODEW *dev_mode)
|
|||
if (is_detached_mode(dev_mode))
|
||||
return dev_mode;
|
||||
|
||||
if (!settings_handler.get_modes(id, EDS_ROTATEDMODE, &modes, &mode_count))
|
||||
return NULL;
|
||||
if (!settings_handler.get_modes( id, EDS_ROTATEDMODE, &modes, &mode_count, TRUE )) return NULL;
|
||||
|
||||
for (mode_idx = 0; mode_idx < mode_count; ++mode_idx)
|
||||
{
|
||||
|
@ -547,7 +546,7 @@ BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manage
|
|||
if (!settings_handler.get_id( devname, is_primary, &settings_id )) break;
|
||||
|
||||
settings_handler.get_current_mode( settings_id, ¤t_mode );
|
||||
if (settings_handler.get_modes( settings_id, EDS_ROTATEDMODE, &modes, &mode_count ))
|
||||
if (settings_handler.get_modes( settings_id, EDS_ROTATEDMODE, &modes, &mode_count, FALSE ))
|
||||
{
|
||||
device_manager->add_modes( ¤t_mode, mode_count, modes, param );
|
||||
settings_handler.free_modes( modes );
|
||||
|
|
|
@ -726,7 +726,7 @@ struct x11drv_settings_handler
|
|||
* dmDisplayFlags and dmDisplayFrequency
|
||||
*
|
||||
* Return FALSE on failure with parameters unchanged and error code set. Return TRUE on success */
|
||||
BOOL (*get_modes)(x11drv_settings_id id, DWORD flags, DEVMODEW **modes, UINT *mode_count);
|
||||
BOOL (*get_modes)(x11drv_settings_id id, DWORD flags, DEVMODEW **modes, UINT *mode_count, BOOL full);
|
||||
|
||||
/* free_modes() will be called to free the mode list returned from get_modes() */
|
||||
void (*free_modes)(DEVMODEW *modes);
|
||||
|
@ -747,6 +747,8 @@ struct x11drv_settings_handler
|
|||
LONG (*set_current_mode)(x11drv_settings_id id, const DEVMODEW *mode);
|
||||
};
|
||||
|
||||
#define NEXT_DEVMODEW(mode) ((DEVMODEW *)((char *)((mode) + 1) + (mode)->dmDriverExtra))
|
||||
|
||||
extern void X11DRV_Settings_SetHandler(const struct x11drv_settings_handler *handler);
|
||||
|
||||
extern void X11DRV_init_desktop( Window win, unsigned int width, unsigned int height );
|
||||
|
|
|
@ -152,10 +152,10 @@ static BOOL xrandr10_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s
|
|||
}
|
||||
|
||||
static void add_xrandr10_mode( DEVMODEW *mode, DWORD depth, DWORD width, DWORD height,
|
||||
DWORD frequency, SizeID size_id )
|
||||
DWORD frequency, SizeID size_id, BOOL full )
|
||||
{
|
||||
mode->dmSize = sizeof(*mode);
|
||||
mode->dmDriverExtra = sizeof(SizeID);
|
||||
mode->dmDriverExtra = full ? sizeof(SizeID) : 0;
|
||||
mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH |
|
||||
DM_PELSHEIGHT | DM_DISPLAYFLAGS;
|
||||
if (frequency)
|
||||
|
@ -168,10 +168,10 @@ static void add_xrandr10_mode( DEVMODEW *mode, DWORD depth, DWORD width, DWORD h
|
|||
mode->dmPelsWidth = width;
|
||||
mode->dmPelsHeight = height;
|
||||
mode->dmDisplayFlags = 0;
|
||||
memcpy( (BYTE *)mode + sizeof(*mode), &size_id, sizeof(size_id) );
|
||||
if (full) memcpy( mode + 1, &size_id, sizeof(size_id) );
|
||||
}
|
||||
|
||||
static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *new_mode_count )
|
||||
static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *new_mode_count, BOOL full )
|
||||
{
|
||||
INT size_idx, depth_idx, rate_idx, mode_idx = 0;
|
||||
INT size_count, rate_count, mode_count = 0;
|
||||
|
@ -201,24 +201,24 @@ static BOOL xrandr10_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
for (size_idx = 0; size_idx < size_count; ++size_idx)
|
||||
for (size_idx = 0, mode = modes; size_idx < size_count; ++size_idx)
|
||||
{
|
||||
for (depth_idx = 0; depth_idx < DEPTH_COUNT; ++depth_idx)
|
||||
{
|
||||
rates = pXRRRates( gdi_display, DefaultScreen( gdi_display ), size_idx, &rate_count );
|
||||
if (!rate_count)
|
||||
{
|
||||
mode = (DEVMODEW *)((BYTE *)modes + (sizeof(*mode) + sizeof(SizeID)) * mode_idx++);
|
||||
add_xrandr10_mode( mode, depths[depth_idx], sizes[size_idx].width,
|
||||
sizes[size_idx].height, 0, size_idx );
|
||||
sizes[size_idx].height, 0, size_idx, full );
|
||||
mode = NEXT_DEVMODEW( mode );
|
||||
continue;
|
||||
}
|
||||
|
||||
for (rate_idx = 0; rate_idx < rate_count; ++rate_idx)
|
||||
{
|
||||
mode = (DEVMODEW *)((BYTE *)modes + (sizeof(*mode) + sizeof(SizeID)) * mode_idx++);
|
||||
add_xrandr10_mode( mode, depths[depth_idx], sizes[size_idx].width,
|
||||
sizes[size_idx].height, rates[rate_idx], size_idx );
|
||||
sizes[size_idx].height, rates[rate_idx], size_idx, full );
|
||||
mode = NEXT_DEVMODEW( mode );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1316,10 +1316,10 @@ static BOOL xrandr14_get_id( const WCHAR *device_name, BOOL is_primary, x11drv_s
|
|||
}
|
||||
|
||||
static void add_xrandr14_mode( DEVMODEW *mode, XRRModeInfo *info, DWORD depth, DWORD frequency,
|
||||
DWORD orientation )
|
||||
DWORD orientation, BOOL full )
|
||||
{
|
||||
mode->dmSize = sizeof(*mode);
|
||||
mode->dmDriverExtra = sizeof(RRMode);
|
||||
mode->dmDriverExtra = full ? sizeof(RRMode) : 0;
|
||||
mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH |
|
||||
DM_PELSHEIGHT | DM_DISPLAYFLAGS;
|
||||
if (frequency)
|
||||
|
@ -1340,10 +1340,10 @@ static void add_xrandr14_mode( DEVMODEW *mode, XRRModeInfo *info, DWORD depth, D
|
|||
mode->dmDisplayOrientation = orientation;
|
||||
mode->dmBitsPerPel = depth;
|
||||
mode->dmDisplayFlags = 0;
|
||||
memcpy( (BYTE *)mode + sizeof(*mode), &info->id, sizeof(info->id) );
|
||||
if (full) memcpy( mode + 1, &info->id, sizeof(info->id) );
|
||||
}
|
||||
|
||||
static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count )
|
||||
static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full )
|
||||
{
|
||||
DWORD frequency, orientation, orientation_count;
|
||||
XRRScreenResources *screen_resources;
|
||||
|
@ -1415,7 +1415,7 @@ static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n
|
|||
if (!modes)
|
||||
goto done;
|
||||
|
||||
for (i = 0; i < output_info->nmode; ++i)
|
||||
for (i = 0, mode = modes; i < output_info->nmode; ++i)
|
||||
{
|
||||
for (j = 0; j < screen_resources->nmode; ++j)
|
||||
{
|
||||
|
@ -1432,8 +1432,8 @@ static BOOL xrandr14_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **n
|
|||
if (!((1 << orientation) & rotations))
|
||||
continue;
|
||||
|
||||
mode = (DEVMODEW *)((BYTE *)modes + (sizeof(*modes) + sizeof(RRMode)) * mode_idx);
|
||||
add_xrandr14_mode( mode, mode_info, depths[depth_idx], frequency, orientation );
|
||||
add_xrandr14_mode( mode, mode_info, depths[depth_idx], frequency, orientation, full );
|
||||
mode = NEXT_DEVMODEW( mode );
|
||||
++mode_idx;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,10 +91,10 @@ static BOOL xf86vm_get_id(const WCHAR *device_name, BOOL is_primary, x11drv_sett
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static void add_xf86vm_mode(DEVMODEW *mode, DWORD depth, const XF86VidModeModeInfo *mode_info)
|
||||
static void add_xf86vm_mode( DEVMODEW *mode, DWORD depth, const XF86VidModeModeInfo *mode_info, BOOL full )
|
||||
{
|
||||
mode->dmSize = sizeof(*mode);
|
||||
mode->dmDriverExtra = sizeof(mode_info);
|
||||
mode->dmDriverExtra = full ? sizeof(mode_info) : 0;
|
||||
mode->dmFields = DM_DISPLAYORIENTATION | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS;
|
||||
if (mode_info->htotal && mode_info->vtotal)
|
||||
{
|
||||
|
@ -106,10 +106,10 @@ static void add_xf86vm_mode(DEVMODEW *mode, DWORD depth, const XF86VidModeModeIn
|
|||
mode->dmPelsWidth = mode_info->hdisplay;
|
||||
mode->dmPelsHeight = mode_info->vdisplay;
|
||||
mode->dmDisplayFlags = 0;
|
||||
memcpy((BYTE *)mode + sizeof(*mode), &mode_info, sizeof(mode_info));
|
||||
if (full) memcpy( mode + 1, &mode_info, sizeof(mode_info) );
|
||||
}
|
||||
|
||||
static BOOL xf86vm_get_modes(x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count)
|
||||
static BOOL xf86vm_get_modes( x11drv_settings_id id, DWORD flags, DEVMODEW **new_modes, UINT *mode_count, BOOL full )
|
||||
{
|
||||
INT xf86vm_mode_idx, xf86vm_mode_count;
|
||||
XF86VidModeModeInfo **xf86vm_modes;
|
||||
|
@ -139,12 +139,12 @@ static BOOL xf86vm_get_modes(x11drv_settings_id id, DWORD flags, DEVMODEW **new_
|
|||
memcpy(ptr, &xf86vm_modes, sizeof(xf86vm_modes));
|
||||
modes = (DEVMODEW *)(ptr + sizeof(xf86vm_modes));
|
||||
|
||||
for (depth_idx = 0; depth_idx < DEPTH_COUNT; ++depth_idx)
|
||||
for (depth_idx = 0, mode = modes; depth_idx < DEPTH_COUNT; ++depth_idx)
|
||||
{
|
||||
for (xf86vm_mode_idx = 0; xf86vm_mode_idx < xf86vm_mode_count; ++xf86vm_mode_idx)
|
||||
{
|
||||
mode = (DEVMODEW *)((BYTE *)modes + (sizeof(DEVMODEW) + sizeof(XF86VidModeModeInfo *)) * mode_idx++);
|
||||
add_xf86vm_mode(mode, depths[depth_idx], xf86vm_modes[xf86vm_mode_idx]);
|
||||
add_xf86vm_mode( mode, depths[depth_idx], xf86vm_modes[xf86vm_mode_idx], full );
|
||||
mode = NEXT_DEVMODEW( mode );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue