Returning to xvidmode features removed by ddraw HAL changes
Jukka Heinonen
jhei at iki.fi
Sat Apr 21 07:47:29 CDT 2001
DirectDraw HAL changes had a bad impact on xvidmode support.
You can no longer use "DXGrab=Y" to enable pointer grabbing
(very useful on many full-screen games) and XWarpPointer was
replaced by XF86VidModeSetViewPort, which apparently
causes some xservers to mess up the display when exiting
full-screen applications.
Log:
Added back support for "DXGrab=Y" and made xvidmode use
XWarpPointer instead of XF86VidModeSetViewPort.
This prevents problems with some badly behaving xservers.
diff -u -r1.4 xvidmode.c
--- dlls/x11drv/xvidmode.c 2001/04/16 19:54:07 1.4
+++ dlls/x11drv/xvidmode.c 2001/04/21 13:26:02
@@ -22,6 +22,9 @@
#include "ddrawi.h"
#include "debugtools.h"
+#include "win.h"
+#include "options.h"
+
DEFAULT_DEBUG_CHANNEL(x11drv);
static int xf86vm_event, xf86vm_error, xf86vm_major, xf86vm_minor;
@@ -116,7 +119,16 @@
if (!xf86vm_modes) return; /* no XVidMode */
TSXF86VidModeSwitchToMode(display, DefaultScreen(display), modes[mode]);
- TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0);
+
+ /* XF86VidModeSetViewPort does not work on some xservers. */
+ TSXWarpPointer(display, None,
+ RootWindow(display, DefaultScreen(display)),
+ 0, 0, 0, 0, 0, 0);
+ /* TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0); */
+
TSXSync(display, False);
}
@@ -131,10 +143,30 @@
static DWORD PASCAL X11DRV_XF86VM_SetMode(LPDDHAL_SETMODEDATA data)
{
- X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex);
- X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
- data->ddRVal = DD_OK;
- return DDHAL_DRIVER_HANDLED;
+ X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex);
+ X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
+ data->ddRVal = DD_OK;
+
+ /*
+ * Grab mouse. This might cause problems if the program crashes.
+ * Should this grab be made only when entering full-screen mode?
+ */
+ if (PROFILE_GetWineIniBool( "x11drv", "DXGrab", 0)) {
+ if (data->lpDD &&
+ data->lpDD->lpExclusiveOwner &&
+ data->lpDD->lpExclusiveOwner->hWnd) {
+ WND *tmpWnd = WIN_FindWndPtr((HWND)data->lpDD->lpExclusiveOwner->hWnd);
+ if (tmpWnd) {
+ Window x11Wnd = X11DRV_WND_GetXWindow(tmpWnd);
+ TSXGrabPointer(display, x11Wnd, True, 0,
+ GrabModeAsync, GrabModeAsync,
+ x11Wnd, None, CurrentTime);
+ WIN_ReleaseWndPtr(tmpWnd);
+ }
+ }
+ }
+
+ return DDHAL_DRIVER_HANDLED;
}
int X11DRV_XF86VM_CreateDriver(LPDDHALINFO info)
--
Jukka Heinonen <http://www.iki.fi/jhei/>
More information about the wine-patches
mailing list