PATCH: XRandR part 2
Alex Pasadyn
ajp at mail.utexas.edu
Sat Oct 11 14:02:44 CDT 2003
This is the second part of this patch, containing the modifications to
existing files.
-ajp
-------------- next part --------------
? dlls/x11drv/settings.c
? dlls/x11drv/xrandr.c
? dlls/x11drv/xrandr.h
Index: dlls/x11drv/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/Makefile.in,v
retrieving revision 1.31
diff -u -r1.31 Makefile.in
--- dlls/x11drv/Makefile.in 13 Jun 2003 23:26:02 -0000 1.31
+++ dlls/x11drv/Makefile.in 11 Oct 2003 17:55:31 -0000
@@ -32,11 +32,13 @@
keyboard.c \
mouse.c \
scroll.c \
+ settings.c \
ts_xlib.c \
window.c \
winpos.c \
x11ddraw.c \
x11drv_main.c \
+ xrandr.c \
xrender.c \
xvidmode.c
Index: dlls/x11drv/desktop.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/desktop.c,v
retrieving revision 1.15
diff -u -r1.15 desktop.c
--- dlls/x11drv/desktop.c 30 Sep 2003 00:31:42 -0000 1.15
+++ dlls/x11drv/desktop.c 11 Oct 2003 17:55:31 -0000
@@ -115,43 +115,22 @@
/* data for resolution changing */
static LPDDHALMODEINFO dd_modes;
-static int nmodes;
+static unsigned int dd_mode_count;
static unsigned int max_width;
static unsigned int max_height;
static const unsigned int widths[] = {320, 512, 640, 800, 1024, 1152, 1280, 1600};
static const unsigned int heights[] = {200, 384, 480, 600, 768, 864, 1024, 1200};
-static const unsigned int depths[] = {8, 16, 32};
-
-/* fill in DD mode info for one mode*/
-static void make_one_mode (LPDDHALMODEINFO info, unsigned int width, unsigned int height, unsigned int bpp)
-{
- info->dwWidth = width;
- info->dwHeight = height;
- info->wRefreshRate = 0;
- info->lPitch = 0;
- info->dwBPP = bpp;
- info->wFlags = 0;
- info->dwRBitMask = 0;
- info->dwGBitMask = 0;
- info->dwBBitMask = 0;
- info->dwAlphaBitMask = 0;
- TRACE("initialized mode %d: %dx%dx%d\n", nmodes, width, height, bpp);
-}
+#define NUM_DESKTOP_MODES (8)
/* create the mode structures */
static void make_modes(void)
{
- int i,j;
- int max_modes = (3+1)*(8+2);
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- nmodes = 0;
- dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * max_modes);
+ int i;
/* original specified desktop size */
- make_one_mode(&dd_modes[nmodes++], screen_width, screen_height, dwBpp);
- for (i=0; i<8; i++)
+ X11DRV_Settings_AddOneMode(screen_width, screen_height, 0, 0);
+ for (i=0; i<NUM_DESKTOP_MODES; i++)
{
if ( (widths[i] <= max_width) && (heights[i] <= max_height) )
{
@@ -159,25 +138,14 @@
( (widths[i] != screen_width) || (heights[i] != screen_height) ) )
{
/* only add them if they are smaller than the root window and unique */
- make_one_mode(&dd_modes[nmodes++], widths[i], heights[i], dwBpp);
+ X11DRV_Settings_AddOneMode(widths[i], heights[i], 0, 0);
}
}
}
if ((max_width != screen_width) && (max_height != screen_height))
{
/* root window size (if different from desktop window) */
- make_one_mode(&dd_modes[nmodes++], max_width, max_height, dwBpp);
- }
- max_modes = nmodes;
- for (j=0; j<3; j++)
- {
- if (depths[j] != dwBpp)
- {
- for (i=0; i < max_modes; i++)
- {
- make_one_mode(&dd_modes[nmodes++], dd_modes[i].dwWidth, dd_modes[i].dwHeight, depths[j]);
- }
- }
+ X11DRV_Settings_AddOneMode(max_width, max_height, 0, 0);
}
}
@@ -224,6 +192,33 @@
return 1;
}
+int X11DRV_desktop_GetCurrentMode(void)
+{
+ int i;
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
+ for (i=0; i<dd_mode_count; i++)
+ {
+ if ( (screen_width == dd_modes[i].dwWidth) &&
+ (screen_height == dd_modes[i].dwHeight) &&
+ (dwBpp == dd_modes[i].dwBPP))
+ return i;
+ }
+ ERR("In unknown mode, returning default\n");
+ return 0;
+}
+
+void X11DRV_desktop_SetCurrentMode(int mode)
+{
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
+ TRACE("Resizing Wine desktop window to %ldx%ld\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+ X11DRV_resize_desktop(dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+ if (dwBpp != dd_modes[mode].dwBPP)
+ {
+ FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[mode].dwBPP);
+ }
+}
/***********************************************************************
* X11DRV_create_desktop
@@ -297,145 +292,14 @@
XFlush( display );
wine_tsx11_unlock();
/* initialize the available resolutions */
+ dd_modes = X11DRV_Settings_SetHandlers("desktop",
+ X11DRV_desktop_GetCurrentMode,
+ X11DRV_desktop_SetCurrentMode,
+ NUM_DESKTOP_MODES+2, 1);
make_modes();
+ X11DRV_Settings_AddDepthModes();
+ dd_mode_count = X11DRV_Settings_GetModeCount();
+ X11DRV_Settings_SetDefaultMode(0);
return win;
}
-void X11DRV_desktop_SetCurrentMode(int mode)
-{
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- if (mode < nmodes)
- {
- TRACE("Resizing Wine desktop window to %ldx%ld\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
- X11DRV_resize_desktop(dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
- if (dwBpp != dd_modes[mode].dwBPP)
- {
- FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[mode].dwBPP);
- }
- }
-}
-
-int X11DRV_desktop_GetCurrentMode(void)
-{
- int i;
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- for (i=0; i<nmodes; i++)
- {
- if ( (screen_width == dd_modes[i].dwWidth) &&
- (screen_height == dd_modes[i].dwHeight) &&
- (dwBpp == dd_modes[i].dwBPP))
- return i;
- }
- ERR("In unknown mode, returning default\n");
- return 0;
-}
-
-/* ChangeDisplaySettings and related functions */
-
-/* implementation of EnumDisplaySettings for desktop */
-BOOL X11DRV_desktop_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
-{
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- devmode->dmDisplayFlags = 0;
- devmode->dmDisplayFrequency = 85;
- devmode->dmSize = sizeof(DEVMODEW);
- if (n==(DWORD)-1)
- {
- devmode->dmBitsPerPel = dwBpp;
- devmode->dmPelsHeight = screen_height;
- devmode->dmPelsWidth = screen_width;
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld (current) -- returning current %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
- return TRUE;
- }
- else if (n==(DWORD)-2)
- {
- devmode->dmBitsPerPel = dwBpp;
- devmode->dmPelsHeight = dd_modes[0].dwHeight;
- devmode->dmPelsWidth = dd_modes[0].dwWidth;
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld (registry) -- returning default %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
- return TRUE;
- }
- else if (n < nmodes)
- {
- devmode->dmPelsWidth = dd_modes[n].dwWidth;
- devmode->dmPelsHeight = dd_modes[n].dwHeight;
- devmode->dmBitsPerPel = dd_modes[n].dwBPP;
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld -- %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
- return TRUE;
- }
- TRACE("mode %ld -- not present\n", n);
- return FALSE;
-}
-
-/* implementation of ChangeDisplaySettings for desktop */
-LONG X11DRV_desktop_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
- HWND hwnd, DWORD flags, LPVOID lpvoid )
-{
- DWORD i;
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- if (devmode==NULL)
- {
- X11DRV_desktop_SetCurrentMode(0);
- return DISP_CHANGE_SUCCESSFUL;
- }
-
- for (i = 0; i < nmodes; i++)
- {
- if (devmode->dmFields & DM_BITSPERPEL)
- {
- if (devmode->dmBitsPerPel != dd_modes[i].dwBPP)
- continue;
- }
- if (devmode->dmFields & DM_PELSWIDTH)
- {
- if (devmode->dmPelsWidth != dd_modes[i].dwWidth)
- continue;
- }
- if (devmode->dmFields & DM_PELSHEIGHT)
- {
- if (devmode->dmPelsHeight != dd_modes[i].dwHeight)
- continue;
- }
- /* we have a valid mode */
- TRACE("Requested display settings match mode %ld\n", i);
- X11DRV_desktop_SetCurrentMode(i);
- return DISP_CHANGE_SUCCESSFUL;
- }
-
- /* no valid modes found */
- ERR("No matching mode found!\n");
- return DISP_CHANGE_BADMODE;
-}
-
-/* DirectDraw HAL stuff */
-
-static DWORD PASCAL X11DRV_desktop_SetMode(LPDDHAL_SETMODEDATA data)
-{
- TRACE("Mode %ld requested by DDHAL\n", data->dwModeIndex);
- X11DRV_desktop_SetCurrentMode(data->dwModeIndex);
- X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
- data->ddRVal = DD_OK;
- return DDHAL_DRIVER_HANDLED;
-}
-
-int X11DRV_desktop_CreateDriver(LPDDHALINFO info)
-{
- if (!nmodes) return 0; /* no desktop */
-
- TRACE("Setting up Desktop mode for DDRAW\n");
- info->dwNumModes = nmodes;
- info->lpModeInfo = dd_modes;
- X11DRV_DDHAL_SwitchMode(X11DRV_desktop_GetCurrentMode(), NULL, NULL);
- info->lpDDCallbacks->SetMode = X11DRV_desktop_SetMode;
- return TRUE;
-}
Index: dlls/x11drv/x11ddraw.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/x11ddraw.c,v
retrieving revision 1.20
diff -u -r1.20 x11ddraw.c
--- dlls/x11drv/x11ddraw.c 16 Sep 2003 20:24:29 -0000 1.20
+++ dlls/x11drv/x11ddraw.c 11 Oct 2003 17:55:31 -0000
@@ -28,6 +28,7 @@
#include "x11drv.h"
#include "x11ddraw.h"
#include "xvidmode.h"
+#include "xrandr.h"
#include "dga2.h"
#include "windef.h"
@@ -382,12 +383,7 @@
if (!X11DRV_XF86DGA2_CreateDriver(&hal_info))
#endif
{
-#ifdef HAVE_LIBXXF86VM
- if (!X11DRV_XF86VM_CreateDriver(&hal_info))
-#endif
- {
- X11DRV_desktop_CreateDriver(&hal_info);
- }
+ X11DRV_Settings_CreateDriver(&hal_info);
}
#ifdef HAVE_OPENGL
/*X11DRV_GLX_CreateDriver(&hal_info);*/
Index: dlls/x11drv/x11drv.h
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/x11drv.h,v
retrieving revision 1.5
diff -u -r1.5 x11drv.h
--- dlls/x11drv/x11drv.h 16 Sep 2003 20:24:29 -0000 1.5
+++ dlls/x11drv/x11drv.h 11 Oct 2003 17:55:32 -0000
@@ -491,13 +491,22 @@
extern void X11DRV_X_to_window_rect( WND *win, RECT *rect );
extern void X11DRV_create_desktop_thread(void);
extern Window X11DRV_create_desktop( XVisualInfo *desktop_vi, const char *geometry );
-extern int X11DRV_desktop_CreateDriver(LPDDHALINFO info);
-extern BOOL X11DRV_desktop_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags);
-extern LONG X11DRV_desktop_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
- HWND hwnd, DWORD flags, LPVOID lpvoid );
extern void X11DRV_sync_window_style( Display *display, WND *win );
extern int X11DRV_sync_whole_window_position( Display *display, WND *win, int zorder );
extern int X11DRV_sync_client_window_position( Display *display, WND *win );
extern void X11DRV_set_wm_hints( Display *display, WND *win );
+
+extern void X11DRV_Settings_AddDepthModes(void);
+extern void X11DRV_Settings_AddOneMode(unsigned int width, unsigned int height, unsigned int bpp, unsigned int freq);
+extern int X11DRV_Settings_CreateDriver(LPDDHALINFO info);
+extern LPDDHALMODEINFO X11DRV_Settings_CreateModes(unsigned int max_modes, int reserve_depths);
+unsigned int X11DRV_Settings_GetModeCount(void);
+void X11DRV_Settings_Init(void);
+extern void X11DRV_Settings_SetDefaultMode(int mode);
+LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name,
+ int (*pNewGCM)(void),
+ void (*pNewSCM)(int),
+ unsigned int nmodes,
+ int reserve_depths);
#endif /* __WINE_X11DRV_H */
Index: dlls/x11drv/x11drv_main.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/x11drv_main.c,v
retrieving revision 1.74
diff -u -r1.74 x11drv_main.c
--- dlls/x11drv/x11drv_main.c 27 Sep 2003 02:34:07 -0000 1.74
+++ dlls/x11drv/x11drv_main.c 11 Oct 2003 17:55:32 -0000
@@ -48,6 +48,7 @@
#include "win.h"
#include "x11drv.h"
#include "xvidmode.h"
+#include "xrandr.h"
#include "dga2.h"
#include "wine/server.h"
#include "wine/debug.h"
@@ -70,7 +71,7 @@
unsigned int screen_depth;
Window root_window;
DWORD desktop_tid = 0;
-int dxgrab, usedga, usexvidmode;
+int dxgrab, usedga, usexvidmode, usexrandr;
int use_xkb = 1;
int use_take_focus = 1;
int managed_mode = 1;
@@ -261,6 +262,9 @@
if (!get_config_key( hkey, appkey, "UseXVidMode", buffer, sizeof(buffer) ))
usexvidmode = IS_OPTION_TRUE( buffer[0] );
+ if (!get_config_key( hkey, appkey, "UseXRandR", buffer, sizeof(buffer) ))
+ usexrandr = IS_OPTION_TRUE( buffer[0] );
+
if (!get_config_key( hkey, appkey, "UseTakeFocus", buffer, sizeof(buffer) ))
use_take_focus = IS_OPTION_TRUE( buffer[0] );
@@ -361,6 +365,8 @@
screen_width = WidthOfScreen( screen );
screen_height = HeightOfScreen( screen );
+ X11DRV_Settings_Init();
+
if (desktop_geometry)
root_window = X11DRV_create_desktop( desktop_vi, desktop_geometry );
@@ -381,6 +387,10 @@
#ifdef HAVE_LIBXXF86VM
/* initialize XVidMode */
X11DRV_XF86VM_Init();
+#endif
+#ifdef HAVE_LIBXRANDR
+ /* initialize XRandR */
+ X11DRV_XRandR_Init();
#endif
#ifdef HAVE_LIBXXF86DGA2
/* initialize DGA2 */
Index: dlls/x11drv/xvidmode.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/xvidmode.c,v
retrieving revision 1.23
diff -u -r1.23 xvidmode.c
--- dlls/x11drv/xvidmode.c 30 Sep 2003 00:31:42 -0000 1.23
+++ dlls/x11drv/xvidmode.c 11 Oct 2003 17:55:32 -0000
@@ -28,7 +28,6 @@
#define XMD_H
#include "basetsd.h"
#include <X11/extensions/xf86vmode.h>
-#endif /* HAVE_LIBXXF86VM */
#include "x11drv.h"
#include "x11ddraw.h"
@@ -39,9 +38,7 @@
#include "ddrawi.h"
#include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
-
-#ifdef HAVE_LIBXXF86VM
+WINE_DEFAULT_DEBUG_CHANNEL(xvidmode);
extern int usexvidmode;
@@ -50,31 +47,22 @@
#ifdef X_XF86VidModeSetGammaRamp
static int xf86vm_gammaramp_size;
static BOOL xf86vm_use_gammaramp;
-#endif
+#endif /* X_XF86VidModeSetGammaRamp */
static LPDDHALMODEINFO dd_modes;
static unsigned int dd_mode_count;
static XF86VidModeModeInfo** real_xf86vm_modes;
static unsigned int real_xf86vm_mode_count;
-static unsigned int xf86vm_initial_mode;
+static unsigned int xf86vm_initial_mode = 0;
-static void convert_modeinfo( const XF86VidModeModeInfo *mode, LPDDHALMODEINFO info, unsigned int bpp)
+static void convert_modeinfo( const XF86VidModeModeInfo *mode)
{
- info->dwWidth = mode->hdisplay;
- info->dwHeight = mode->vdisplay;
+ int rate;
if (mode->htotal!=0 && mode->vtotal!=0)
- info->wRefreshRate = mode->dotclock * 1000 / (mode->htotal * mode->vtotal);
+ rate = mode->dotclock * 1000 / (mode->htotal * mode->vtotal);
else
- info->wRefreshRate = 0;
- TRACE(" width=%ld, height=%ld, refresh=%d\n",
- info->dwWidth, info->dwHeight, info->wRefreshRate);
- info->lPitch = 0;
- info->dwBPP = bpp;
- info->wFlags = 0;
- info->dwRBitMask = 0;
- info->dwGBitMask = 0;
- info->dwBBitMask = 0;
- info->dwAlphaBitMask = 0;
+ rate = 0;
+ X11DRV_Settings_AddOneMode(mode->hdisplay, mode->vdisplay, 0, rate);
}
static void convert_modeline(int dotclock, const XF86VidModeModeLine *mode, LPDDHALMODEINFO info, unsigned int bpp)
@@ -102,13 +90,64 @@
}
static Bool in_desktop_mode;
-static const unsigned int depths[] = {8, 16, 32};
+
+int X11DRV_XF86VM_GetCurrentMode(void)
+{
+ XF86VidModeModeLine line;
+ int dotclock, i;
+ DDHALMODEINFO cmode;
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
+
+ TRACE("Querying XVidMode current mode\n");
+ wine_tsx11_lock();
+ XF86VidModeGetModeLine(gdi_display, DefaultScreen(gdi_display), &dotclock, &line);
+ wine_tsx11_unlock();
+ convert_modeline(dotclock, &line, &cmode, dwBpp);
+ for (i=0; i<dd_mode_count; i++)
+ if (memcmp(&dd_modes[i], &cmode, sizeof(cmode)) == 0) {
+ TRACE("mode=%d\n", i);
+ return i;
+ }
+ ERR("In unknown mode, returning default\n");
+ return xf86vm_initial_mode;
+}
+
+void X11DRV_XF86VM_SetCurrentMode(int mode)
+{
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
+ /* only set modes from the original color depth */
+ if (dwBpp != dd_modes[mode].dwBPP)
+ {
+ FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[mode].dwBPP);
+ }
+ mode = mode % real_xf86vm_mode_count;
+
+ wine_tsx11_lock();
+ TRACE("Resizing X display to %dx%d\n",
+ real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
+ XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]);
+#if 0 /* FIXME */
+ SYSMETRICS_Set( SM_CXSCREEN, real_xf86vm_modes[mode]->hdisplay );
+ SYSMETRICS_Set( SM_CYSCREEN, real_xf86vm_modes[mode]->vdisplay );
+#else
+ FIXME("Need to update SYSMETRICS after resizing display (now %dx%d)\n",
+ real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
+#endif
+#if 0 /* it is said that SetViewPort causes problems with some X servers */
+ XF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0);
+#else
+ XWarpPointer(gdi_display, None, DefaultRootWindow(gdi_display), 0, 0, 0, 0, 0, 0);
+#endif
+ XSync(gdi_display, False);
+ wine_tsx11_unlock();
+}
void X11DRV_XF86VM_Init(void)
{
Bool ok;
- int nmodes, i, j;
- int max_modes;
+ int nmodes, i;
DWORD dwBpp = screen_depth;
if (dwBpp == 24) dwBpp = 32;
@@ -137,7 +176,7 @@
if (xf86vm_gammaramp_size == 256)
xf86vm_use_gammaramp = TRUE;
}
-#endif
+#endif /* X_XF86VidModeSetGammaRamp */
/* retrieve modes */
if (!in_desktop_mode) ok = XF86VidModeGetAllModeLines(gdi_display, DefaultScreen(gdi_display), &nmodes, &real_xf86vm_modes);
@@ -151,32 +190,27 @@
TRACE("XVidMode modes: count=%d\n", nmodes);
real_xf86vm_mode_count = nmodes;
- max_modes = (3+1)*(nmodes);
- dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * max_modes);
+ dd_modes = X11DRV_Settings_SetHandlers("XF86VidMode",
+ X11DRV_XF86VM_GetCurrentMode,
+ X11DRV_XF86VM_SetCurrentMode,
+ nmodes, 1);
/* convert modes to DDHALMODEINFO format */
for (i=0; i<real_xf86vm_mode_count; i++)
{
- convert_modeinfo(real_xf86vm_modes[i], &dd_modes[dd_mode_count++], dwBpp);
+ convert_modeinfo(real_xf86vm_modes[i]);
}
/* add modes for different color depths */
- for (j=0; j<3; j++)
- {
- if (depths[j] != dwBpp)
- {
- for (i=0; i < real_xf86vm_mode_count; i++)
- {
- convert_modeinfo(real_xf86vm_modes[i], &dd_modes[dd_mode_count++], depths[j]);
- }
- }
- }
+ X11DRV_Settings_AddDepthModes();
+ dd_mode_count = X11DRV_Settings_GetModeCount();
TRACE("Available DD modes: count=%d\n", dd_mode_count);
/* store the current mode at the time we started */
xf86vm_initial_mode = X11DRV_XF86VM_GetCurrentMode();
-
+ X11DRV_Settings_SetDefaultMode(xf86vm_initial_mode);
+
TRACE("Enabling XVidMode\n");
}
@@ -185,57 +219,6 @@
if (real_xf86vm_modes) TSXFree(real_xf86vm_modes);
}
-int X11DRV_XF86VM_GetCurrentMode(void)
-{
- XF86VidModeModeLine line;
- int dotclock, i;
- DDHALMODEINFO cmode;
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
-
- if (!dd_modes) return 0; /* no XVidMode */
-
- TRACE("Querying XVidMode current mode\n");
- wine_tsx11_lock();
- XF86VidModeGetModeLine(gdi_display, DefaultScreen(gdi_display), &dotclock, &line);
- wine_tsx11_unlock();
- convert_modeline(dotclock, &line, &cmode, dwBpp);
- for (i=0; i<dd_mode_count; i++)
- if (memcmp(&dd_modes[i], &cmode, sizeof(cmode)) == 0) {
- TRACE("mode=%d\n", i);
- return i;
- }
- ERR("unknown mode, shouldn't happen\n");
- return 0; /* return first mode */
-}
-
-void X11DRV_XF86VM_SetCurrentMode(int mode)
-{
- if (!dd_modes) return; /* no XVidMode */
-
- /* only set modes from the original color depth */
- mode = mode % real_xf86vm_mode_count;
-
- wine_tsx11_lock();
- TRACE("Resizing X display to %dx%d\n",
- real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
- XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]);
-#if 0 /* FIXME */
- SYSMETRICS_Set( SM_CXSCREEN, real_xf86vm_modes[mode]->hdisplay );
- SYSMETRICS_Set( SM_CYSCREEN, real_xf86vm_modes[mode]->vdisplay );
-#else
- FIXME("Need to update SYSMETRICS after resizing display (now %dx%d)\n",
- real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
-#endif
-#if 0 /* it is said that SetViewPort causes problems with some X servers */
- XF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0);
-#else
- XWarpPointer(gdi_display, None, DefaultRootWindow(gdi_display), 0, 0, 0, 0, 0, 0);
-#endif
- XSync(gdi_display, False);
- wine_tsx11_unlock();
-}
-
void X11DRV_XF86VM_SetExclusiveMode(int lock)
{
if (!dd_modes) return; /* no XVidMode */
@@ -245,30 +228,6 @@
wine_tsx11_unlock();
}
-/* actual DirectDraw HAL stuff */
-
-static DWORD PASCAL X11DRV_XF86VM_SetMode(LPDDHAL_SETMODEDATA data)
-{
- TRACE("Mode %ld requested by DDHAL\n", data->dwModeIndex);
- X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex);
- X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
- data->ddRVal = DD_OK;
- return DDHAL_DRIVER_HANDLED;
-}
-
-int X11DRV_XF86VM_CreateDriver(LPDDHALINFO info)
-{
- if (!dd_mode_count) return 0; /* no XVidMode */
-
- TRACE("Setting up XF86VM mode for DDRAW\n");
- info->dwNumModes = dd_mode_count;
- info->lpModeInfo = dd_modes;
- X11DRV_DDHAL_SwitchMode(X11DRV_XF86VM_GetCurrentMode(), NULL, NULL);
- info->lpDDCallbacks->SetMode = X11DRV_XF86VM_SetMode;
- return TRUE;
-}
-
-
/***** GAMMA CONTROL *****/
/* (only available in XF86VidMode 2.x) */
@@ -452,244 +411,4 @@
#else
return FALSE;
#endif
-}
-
-/* implementation of EnumDisplaySettings for XF86VM */
-BOOL X11DRV_XF86VM_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
-{
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- devmode->dmDisplayFlags = 0;
- devmode->dmDisplayFrequency = 85;
- devmode->dmSize = sizeof(DEVMODEW);
- if (n == (DWORD)-1)
- {
- TRACE("mode %ld (current) -- getting current mode\n", n);
- n = X11DRV_XF86VM_GetCurrentMode();
- }
- if (n == (DWORD)-2)
- {
- devmode->dmBitsPerPel = dwBpp;
- devmode->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
- devmode->dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld (registry) -- returning default %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
- return TRUE;
- }
- if (n < dd_mode_count)
- {
- devmode->dmPelsWidth = dd_modes[n].dwWidth;
- devmode->dmPelsHeight = dd_modes[n].dwHeight;
- devmode->dmBitsPerPel = dd_modes[n].dwBPP;
- devmode->dmDisplayFrequency = dd_modes[n].wRefreshRate;
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL|DM_DISPLAYFREQUENCY);
- TRACE("mode %ld -- %ldx%ldx%ldbpp %ld Hz\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel,
- devmode->dmDisplayFrequency);
- return TRUE;
- }
- TRACE("mode %ld -- not present\n", n);
- return FALSE;
-}
-
-/* implementation of ChangeDisplaySettings for XF86VM */
-LONG X11DRV_XF86VM_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
- HWND hwnd, DWORD flags, LPVOID lpvoid )
-{
- DWORD i;
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- if (devmode==NULL)
- {
-#ifdef HAVE_LIBXXF86VM
- X11DRV_XF86VM_SetCurrentMode(xf86vm_initial_mode);
-#endif
- return DISP_CHANGE_SUCCESSFUL;
- }
-
-#if 0 /* FIXME: only works if we update SYSMETRICS */
- if ((!(devmode->dmFields & DM_BITSPERPEL) || devmode->dmBitsPerPel == dwBpp) &&
- (!(devmode->dmFields & DM_PELSWIDTH) || devmode->dmPelsWidth == GetSystemMetrics(SM_CXSCREEN)) &&
- (!(devmode->dmFields & DM_PELSHEIGHT) || devmode->dmPelsHeight == GetSystemMetrics(SM_CYSCREEN)))
- {
- /* we have a valid mode */
- TRACE("Requested mode matches current mode -- no change!\n");
- return DISP_CHANGE_SUCCESSFUL;
- }
-#endif
-
-#ifdef HAVE_LIBXXF86VM
- for (i = 0; i < dd_mode_count; i++)
- {
- if (devmode->dmFields & DM_BITSPERPEL)
- {
- if (devmode->dmBitsPerPel != dd_modes[i].dwBPP)
- continue;
- }
- if (devmode->dmFields & DM_PELSWIDTH)
- {
- if (devmode->dmPelsWidth != dd_modes[i].dwWidth)
- continue;
- }
- if (devmode->dmFields & DM_PELSHEIGHT)
- {
- if (devmode->dmPelsHeight != dd_modes[i].dwHeight)
- continue;
- }
- if (devmode->dmFields & DM_DISPLAYFREQUENCY)
- {
- if (devmode->dmDisplayFrequency != dd_modes[i].wRefreshRate)
- continue;
- }
- /* we have a valid mode */
- TRACE("Requested display settings match mode %ld\n", i);
- X11DRV_XF86VM_SetCurrentMode(i);
- if (dwBpp != dd_modes[i].dwBPP)
- {
- FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[i].dwBPP);
- }
- return DISP_CHANGE_SUCCESSFUL;
- }
-#endif
-
- /* no valid modes found */
- ERR("No matching mode found!\n");
- return DISP_CHANGE_BADMODE;
-}
-
-/* implementation of EnumDisplaySettings for nores */
-BOOL X11DRV_nores_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
-{
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- devmode->dmDisplayFlags = 0;
- devmode->dmDisplayFrequency = 85;
- devmode->dmSize = sizeof(DEVMODEW);
- if (n==0 || n == (DWORD)-1 || n == (DWORD)-2)
- {
- devmode->dmBitsPerPel = dwBpp;
- devmode->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
- devmode->dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
- devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld -- returning default %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
- return TRUE;
- }
- TRACE("mode %ld -- not present\n", n);
- return FALSE;
-}
-
-/* implementation of ChangeDisplaySettings for nores */
-LONG X11DRV_nores_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
- HWND hwnd, DWORD flags, LPVOID lpvoid )
-{
- DWORD dwBpp = screen_depth;
- if (dwBpp == 24) dwBpp = 32;
- if (devmode==NULL)
- {
- return DISP_CHANGE_SUCCESSFUL;
- }
-
- if ((!(devmode->dmFields & DM_BITSPERPEL) || devmode->dmBitsPerPel == dwBpp) &&
- (!(devmode->dmFields & DM_PELSWIDTH) || devmode->dmPelsWidth == GetSystemMetrics(SM_CXSCREEN)) &&
- (!(devmode->dmFields & DM_PELSHEIGHT) || devmode->dmPelsHeight == GetSystemMetrics(SM_CYSCREEN)))
- {
- /* we are in the desired mode */
- TRACE("Requested mode matches current mode -- no change!\n");
- return DISP_CHANGE_SUCCESSFUL;
- }
-
- /* no valid modes found */
- ERR("No matching mode found!\n");
- return DISP_CHANGE_BADMODE;
-}
-
-/***********************************************************************
- * EnumDisplaySettingsExW (X11DRV.@)
- *
- * FIXME: should move to somewhere appropriate
- */
-BOOL X11DRV_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
-{
- if (dd_modes)
- {
- /* XVidMode */
- return X11DRV_XF86VM_EnumDisplaySettingsExW(name, n, devmode, flags);
- }
- else if (in_desktop_mode)
- {
- /* desktop */
- return X11DRV_desktop_EnumDisplaySettingsExW(name, n, devmode, flags);
- }
- else
- {
- /* no resolution changing */
- return X11DRV_nores_EnumDisplaySettingsExW(name, n, devmode, flags);
- }
-}
-
-#define _X_FIELD(prefix, bits) if ((fields) & prefix##_##bits) {p+=sprintf(p, "%s%s", first ? "" : ",", #bits); first=FALSE;}
-static const char * _CDS_flags(DWORD fields)
-{
- BOOL first = TRUE;
- char buf[128];
- char *p = buf;
- _X_FIELD(CDS,UPDATEREGISTRY);_X_FIELD(CDS,TEST);_X_FIELD(CDS,FULLSCREEN);
- _X_FIELD(CDS,GLOBAL);_X_FIELD(CDS,SET_PRIMARY);_X_FIELD(CDS,RESET);
- _X_FIELD(CDS,SETRECT);_X_FIELD(CDS,NORESET);
- *p = 0;
- return wine_dbg_sprintf("%s", buf);
-}
-static const char * _DM_fields(DWORD fields)
-{
- BOOL first = TRUE;
- char buf[128];
- char *p = buf;
- _X_FIELD(DM,BITSPERPEL);_X_FIELD(DM,PELSWIDTH);_X_FIELD(DM,PELSHEIGHT);
- _X_FIELD(DM,DISPLAYFLAGS);_X_FIELD(DM,DISPLAYFREQUENCY);_X_FIELD(DM,POSITION);
- *p = 0;
- return wine_dbg_sprintf("%s", buf);
-}
-#undef _X_FIELD
-
-/***********************************************************************
- * ChangeDisplaySettingsExW (X11DRV.@)
- *
- * FIXME: should move to somewhere appropriate
- */
-LONG X11DRV_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
- HWND hwnd, DWORD flags, LPVOID lpvoid )
-{
- TRACE("(%s,%p,%p,0x%08lx,%p\n",debugstr_w(devname),devmode,hwnd,flags,lpvoid);
- TRACE("flags=%s\n",_CDS_flags(flags));
- if (devmode)
- {
- TRACE("DM_fields=%s\n",_DM_fields(devmode->dmFields));
- TRACE("width=%ld height=%ld bpp=%ld freq=%ld\n",
- devmode->dmPelsWidth,devmode->dmPelsHeight,
- devmode->dmBitsPerPel,devmode->dmDisplayFrequency);
- }
- else
- {
- TRACE("Return to original display mode\n");
- }
- if (dd_modes)
- {
- /* XVidMode */
- return X11DRV_XF86VM_ChangeDisplaySettingsExW( devname, devmode,
- hwnd, flags, lpvoid );
- }
- else if (in_desktop_mode)
- {
- /* no XVidMode */
- return X11DRV_desktop_ChangeDisplaySettingsExW( devname, devmode,
- hwnd, flags, lpvoid );
- }
- else
- {
- /* no resolution changing */
- return X11DRV_nores_ChangeDisplaySettingsExW( devname, devmode,
- hwnd, flags, lpvoid );
- }
}
Index: dlls/x11drv/xvidmode.h
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/xvidmode.h,v
retrieving revision 1.6
diff -u -r1.6 xvidmode.h
--- dlls/x11drv/xvidmode.h 5 Sep 2003 23:08:26 -0000 1.6
+++ dlls/x11drv/xvidmode.h 11 Oct 2003 17:55:32 -0000
@@ -31,15 +31,9 @@
#include "wingdi.h"
#include "ddrawi.h"
-extern LPDDHALMODEINFO xf86vm_modes;
-extern unsigned xf86vm_mode_count;
-
void X11DRV_XF86VM_Init(void);
void X11DRV_XF86VM_Cleanup(void);
-int X11DRV_XF86VM_GetCurrentMode(void);
-void X11DRV_XF86VM_SetCurrentMode(int mode);
void X11DRV_XF86VM_SetExclusiveMode(int lock);
-int X11DRV_XF86VM_CreateDriver(LPDDHALINFO info);
BOOL X11DRV_XF86VM_GetGammaRamp(LPDDGAMMARAMP ramp);
BOOL X11DRV_XF86VM_SetGammaRamp(LPDDGAMMARAMP ramp);
More information about the wine-patches
mailing list