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