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