x11drv patch

Ove Kaaven ovehk at ping.uio.no
Thu Apr 26 16:42:58 CDT 2001


Because of heavy demand (1 interfering patch submitted already), here are
x11drv ddraw improvements.

Log:
Ove Kaaven <ovek at transgaming.com>
Reimplemented DXGrab with improvements; it no longer depends on XVidMode,
and it releases the grab if the app exits full-screen DirectDraw.
Also made the UseDGA option available for AppDefaults configuration.

Index: dlls/x11drv/dga2.c
===================================================================
RCS file: /cvsroot/winex/wine/dlls/x11drv/dga2.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 dga2.c
--- dlls/x11drv/dga2.c	2001/04/16 21:32:34	1.1.1.1
+++ dlls/x11drv/dga2.c	2001/04/26 21:30:26
@@ -18,10 +18,11 @@
 #include "wingdi.h"
 #include "ddrawi.h"
 #include "debugtools.h"
-#include "options.h"
 
 DEFAULT_DEBUG_CHANNEL(x11drv);
 
+extern int usedga;
+
 LPDDHALMODEINFO xf86dga2_modes;
 unsigned xf86dga2_mode_count;
 static XDGAMode* modes;
@@ -52,7 +53,7 @@
   /* if in desktop mode, don't use DGA */
   if (X11DRV_GetXRootWindow() != DefaultRootWindow(display)) return;
 
-  if (!PROFILE_GetWineIniBool("x11drv", "UseDGA", 1)) return;
+  if (!usedga) return;
 
   if (!TSXDGAQueryExtension(display, &dga_event, &dga_error)) return;
 
Index: dlls/x11drv/x11ddraw.c
===================================================================
RCS file: /cvsroot/winex/wine/dlls/x11drv/x11ddraw.c,v
retrieving revision 1.1.1.4
retrieving revision 1.12
diff -u -r1.1.1.4 -r1.12
--- dlls/x11drv/x11ddraw.c	2001/04/16 21:32:33	1.1.1.4
+++ dlls/x11drv/x11ddraw.c	2001/04/19 19:28:57	1.12
@@ -16,10 +16,13 @@
 #include "wingdi.h"
 #include "ddrawi.h"
 #include "bitmap.h"
+#include "win.h"
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(x11drv);
 
+extern int dxgrab;
+
 LPDDRAWI_DDRAWSURFACE_LCL X11DRV_DD_Primary;
 LPDDRAWI_DDRAWSURFACE_GBL X11DRV_DD_PrimaryGbl;
 HWND X11DRV_DD_PrimaryWnd;
@@ -41,6 +44,28 @@
   }
 }
 
+static void GrabPointer(HWND hWnd)
+{
+  if (hWnd) {
+    WND *tmpWnd;
+    Window win;
+    /* find the X11 window that ddraw uses */
+    tmpWnd = WIN_FindWndPtr(hWnd);
+    win = X11DRV_WND_GetXWindow(tmpWnd);
+    TRACE("WND: %p win: %ld\n", tmpWnd, win);
+    WIN_ReleaseWndPtr(tmpWnd);
+    if (!win) {
+      TRACE("host off desktop\n");
+      tmpWnd = WIN_FindWndPtr(GetDesktopWindow());
+      win = X11DRV_WND_GetXWindow(tmpWnd);
+      TRACE("Owner WND: %p win: %ld\n", tmpWnd, win);
+      WIN_ReleaseWndPtr(tmpWnd);
+    }
+    TSXGrabPointer(display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime);
+  }
+  else TSXUngrabPointer(display, CurrentTime);
+}
+
 static DWORD PASCAL X11DRV_DDHAL_DestroyDriver(LPDDHAL_DESTROYDRIVERDATA data)
 {
   data->ddRVal = DD_OK;
@@ -55,6 +80,7 @@
     X11DRV_DD_PrimaryGbl = X11DRV_DD_Primary->lpGbl;
     SetPrimaryDIB(GET_LPDDRAWSURFACE_GBL_MORE(X11DRV_DD_PrimaryGbl)->hKernelSurface);
     X11DRV_DD_UserClass = GlobalFindAtomA("WINE_DDRAW");
+    if (dxgrab) GrabPointer(X11DRV_DD_PrimaryWnd);
   }
   data->ddRVal = DD_OK;
   return DDHAL_DRIVER_NOTHANDLED;
@@ -92,6 +118,7 @@
     X11DRV_DD_PrimaryGbl = NULL;
     SetPrimaryDIB(0);
     X11DRV_DD_UserClass = 0;
+    if (dxgrab) GrabPointer(0);
   }
   data->ddRVal = DD_OK;
   return DDHAL_DRIVER_HANDLED;
Index: dlls/x11drv/x11drv_main.c
===================================================================
RCS file: /cvsroot/winex/wine/dlls/x11drv/x11drv_main.c,v
retrieving revision 1.1.1.9
diff -u -r1.1.1.9 x11drv_main.c
--- dlls/x11drv/x11drv_main.c	2001/04/16 21:32:34	1.1.1.9
+++ dlls/x11drv/x11drv_main.c	2001/04/26 21:30:26
@@ -56,6 +57,7 @@
 unsigned int screen_height;
 unsigned int screen_depth;
 Window root_window;
+int dxgrab, usedga;
 
 unsigned int X11DRV_server_startticks;
 
@@ -207,6 +209,12 @@
         if (!IS_OPTION_FALSE(buffer[0])) desktop_geometry = strdup(buffer);
     }
 
+    if (!get_config_key( hkey, appkey, "DXGrab", buffer, sizeof(buffer) ))
+        dxgrab = IS_OPTION_TRUE( buffer[0] );
+
+    if (!get_config_key( hkey, appkey, "UseDGA", buffer, sizeof(buffer) ))
+        usedga = IS_OPTION_TRUE( buffer[0] );
+
     screen_depth = 0;
     if (!get_config_key( hkey, appkey, "ScreenDepth", buffer, sizeof(buffer) ))
         screen_depth = atoi(buffer);
Index: dlls/x11drv/xvidmode.c
===================================================================
RCS file: /cvsroot/winex/wine/dlls/x11drv/xvidmode.c,v
retrieving revision 1.1.1.4
retrieving revision 1.11
diff -u -r1.1.1.4 -r1.11
--- dlls/x11drv/xvidmode.c	2001/04/16 21:32:34	1.1.1.4
+++ dlls/x11drv/xvidmode.c	2001/04/26 21:18:06	1.11
@@ -116,7 +116,11 @@
   if (!xf86vm_modes) return; /* no XVidMode */
 
   TSXF86VidModeSwitchToMode(display, DefaultScreen(display), modes[mode]);
+#if 0 /* it is said that SetViewPort causes problems with some X servers */
   TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0);
+#else
+  TSXWarpPointer(display, None, DefaultRootWindow(display), 0, 0, 0, 0, 0, 0);
+#endif
   TSXSync(display, False);
 }
 





More information about the wine-patches mailing list