[PATCH 2/5] wined3d: Merge swapchain_gdi.c into swapchain.c.

Henri Verbeet hverbeet at codeweavers.com
Thu Apr 7 11:45:58 CDT 2011


---
 dlls/wined3d/Makefile.in       |    1 -
 dlls/wined3d/swapchain.c       |  270 +++++++++++++++++++++++++++++++++++++---
 dlls/wined3d/swapchain_gdi.c   |  273 ----------------------------------------
 dlls/wined3d/wined3d_private.h |    1 -
 4 files changed, 253 insertions(+), 292 deletions(-)
 delete mode 100644 dlls/wined3d/swapchain_gdi.c

diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in
index 3e1c728..e3015af 100644
--- a/dlls/wined3d/Makefile.in
+++ b/dlls/wined3d/Makefile.in
@@ -27,7 +27,6 @@ C_SRCS = \
 	surface_gdi.c \
 	swapchain.c \
 	swapchain_base.c \
-	swapchain_gdi.c \
 	texture.c \
 	utils.c \
 	vertexdeclaration.c \
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index db42ff8..feb0471 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1,24 +1,22 @@
 /*
- *IDirect3DSwapChain9 implementation
+ * Copyright 2002-2003 Jason Edmeades
+ * Copyright 2002-2003 Raphael Junqueira
+ * Copyright 2005 Oliver Stieber
+ * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
  *
- *Copyright 2002-2003 Jason Edmeades
- *Copyright 2002-2003 Raphael Junqueira
- *Copyright 2005 Oliver Stieber
- *Copyright 2007-2008 Stefan Dösinger for CodeWeavers
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
  *
- *This library is free software; you can redistribute it and/or
- *modify it under the terms of the GNU Lesser General Public
- *License as published by the Free Software Foundation; either
- *version 2.1 of the License, or (at your option) any later version.
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- *This library is distributed in the hope that it will be useful,
- *but WITHOUT ANY WARRANTY; without even the implied warranty of
- *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *Lesser General Public License for more details.
- *
- *You should have received a copy of the GNU Lesser General Public
- *License along with this library; if not, write to the Free Software
- *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #include "config.h"
@@ -491,6 +489,244 @@ static const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
     IWineD3DBaseSwapChainImpl_GetGammaRamp
 };
 
+static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
+{
+    IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
+    WINED3DDISPLAYMODE mode;
+
+    TRACE("Destroying swapchain %p.\n", iface);
+
+    IWineD3DSwapChain_SetGammaRamp(iface, 0, &swapchain->orig_gamma);
+
+    /* release the ref to the front and back buffer parents */
+    if (swapchain->front_buffer)
+    {
+        surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL);
+        if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->front_buffer))
+            WARN("Something's still holding the front buffer.\n");
+    }
+
+    if (swapchain->back_buffers)
+    {
+        UINT i;
+
+        for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
+        {
+            surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
+            if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]))
+                WARN("Something's still holding the back buffer.\n");
+        }
+        HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
+    }
+
+    /* Restore the screen resolution if we rendered in fullscreen.
+     * This will restore the screen resolution to what it was before creating
+     * the swapchain. In case of d3d8 and d3d9 this will be the original
+     * desktop resolution. In case of d3d7 this will be a NOP because ddraw
+     * sets the resolution before starting up Direct3D, thus orig_width and
+     * orig_height will be equal to the modes in the presentation params. */
+    if (!swapchain->presentParms.Windowed && swapchain->presentParms.AutoRestoreDisplayMode)
+    {
+        mode.Width = swapchain->orig_width;
+        mode.Height = swapchain->orig_height;
+        mode.RefreshRate = 0;
+        mode.Format = swapchain->orig_fmt;
+        IWineD3DDevice_SetDisplayMode((IWineD3DDevice *)swapchain->device, 0, &mode);
+    }
+
+    HeapFree(GetProcessHeap(), 0, swapchain->context);
+    HeapFree(GetProcessHeap(), 0, swapchain);
+}
+
+/* Helper function that blits the front buffer contents to the target window. */
+void x11_copy_to_screen(IWineD3DSwapChainImpl *swapchain, const RECT *rect)
+{
+    IWineD3DSurfaceImpl *front;
+    POINT offset = {0, 0};
+    HDC src_dc, dst_dc;
+    RECT draw_rect;
+    HWND window;
+
+    TRACE("swapchain %p, rect %s.\n", swapchain, wine_dbgstr_rect(rect));
+
+    front = swapchain->front_buffer;
+    if (!(front->resource.usage & WINED3DUSAGE_RENDERTARGET))
+        return;
+
+    TRACE("Copying surface %p to screen.\n", front);
+
+    src_dc = front->hDC;
+    window = swapchain->win_handle;
+    dst_dc = GetDCEx(window, 0, DCX_CLIPSIBLINGS | DCX_CACHE);
+
+    /* Front buffer coordinates are screen coordinates. Map them to the
+     * destination window if not fullscreened. */
+    if (swapchain->presentParms.Windowed)
+        ClientToScreen(window, &offset);
+
+    TRACE("offset %s.\n", wine_dbgstr_point(&offset));
+
+#if 0
+    /* FIXME: This doesn't work... if users really want to run
+     * X in 8bpp, then we need to call directly into display.drv
+     * (or Wine's equivalent), and force a private colormap
+     * without default entries. */
+    if (front->palette)
+    {
+        SelectPalette(dst_dc, front->palette->hpal, FALSE);
+        RealizePalette(dst_dc); /* sends messages => deadlocks */
+    }
+#endif
+
+    draw_rect.left = 0;
+    draw_rect.right = front->resource.width;
+    draw_rect.top = 0;
+    draw_rect.bottom = front->resource.height;
+
+#if 0
+    /* TODO: Support clippers. */
+    if (front->clipper)
+    {
+        RECT xrc;
+        HWND hwnd = ((IWineD3DClipperImpl *)front->clipper)->hWnd;
+        if (hwnd && GetClientRect(hwnd,&xrc))
+        {
+            OffsetRect(&xrc, offset.x, offset.y);
+            IntersectRect(&draw_rect, &draw_rect, &xrc);
+        }
+    }
+#endif
+
+    if (!rect)
+    {
+        /* Only use this if the caller did not pass a rectangle, since
+         * due to double locking this could be the wrong one... */
+        if (front->lockedRect.left != front->lockedRect.right)
+            IntersectRect(&draw_rect, &draw_rect, &front->lockedRect);
+    }
+    else
+    {
+        IntersectRect(&draw_rect, &draw_rect, rect);
+    }
+
+    BitBlt(dst_dc, draw_rect.left - offset.x, draw_rect.top - offset.y,
+            draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top,
+            src_dc, draw_rect.left, draw_rect.top, SRCCOPY);
+    ReleaseDC(window, dst_dc);
+}
+
+static HRESULT WINAPI IWineGDISwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window)
+{
+    IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
+
+    TRACE("iface %p, window %p.\n", iface, window);
+
+    swapchain->win_handle = window;
+
+    return WINED3D_OK;
+}
+
+static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface,
+        const RECT *pSourceRect, const RECT *pDestRect, HWND hDestWindowOverride,
+        const RGNDATA *pDirtyRegion, DWORD flags)
+{
+    IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
+    IWineD3DSurfaceImpl *front, *back;
+
+    if (!swapchain->back_buffers)
+    {
+        WARN("Swapchain doesn't have a backbuffer, returning WINED3DERR_INVALIDCALL\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+    front = swapchain->front_buffer;
+    back = swapchain->back_buffers[0];
+
+    /* Flip the DC. */
+    {
+        HDC tmp;
+        tmp = front->hDC;
+        front->hDC = back->hDC;
+        back->hDC = tmp;
+    }
+
+    /* Flip the DIBsection. */
+    {
+        HBITMAP tmp;
+        tmp = front->dib.DIBsection;
+        front->dib.DIBsection = back->dib.DIBsection;
+        back->dib.DIBsection = tmp;
+    }
+
+    /* Flip the surface data. */
+    {
+        void *tmp;
+
+        tmp = front->dib.bitmap_data;
+        front->dib.bitmap_data = back->dib.bitmap_data;
+        back->dib.bitmap_data = tmp;
+
+        tmp = front->resource.allocatedMemory;
+        front->resource.allocatedMemory = back->resource.allocatedMemory;
+        back->resource.allocatedMemory = tmp;
+
+        if (front->resource.heapMemory)
+            ERR("GDI Surface %p has heap memory allocated.\n", front);
+
+        if (back->resource.heapMemory)
+            ERR("GDI Surface %p has heap memory allocated.\n", back);
+    }
+
+    /* Client_memory should not be different, but just in case. */
+    {
+        BOOL tmp;
+        tmp = front->dib.client_memory;
+        front->dib.client_memory = back->dib.client_memory;
+        back->dib.client_memory = tmp;
+    }
+
+    /* FPS support */
+    if (TRACE_ON(fps))
+    {
+        static LONG prev_time, frames;
+        DWORD time = GetTickCount();
+
+        ++frames;
+
+        /* every 1.5 seconds */
+        if (time - prev_time > 1500)
+        {
+            TRACE_(fps)("@ approx %.2ffps\n", 1000.0 * frames / (time - prev_time));
+            prev_time = time;
+            frames = 0;
+        }
+    }
+
+    x11_copy_to_screen(swapchain, NULL);
+
+    return WINED3D_OK;
+}
+
+static const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl =
+{
+    /* IUnknown */
+    IWineD3DBaseSwapChainImpl_QueryInterface,
+    IWineD3DBaseSwapChainImpl_AddRef,
+    IWineD3DBaseSwapChainImpl_Release,
+    /* IWineD3DSwapChain */
+    IWineD3DBaseSwapChainImpl_GetParent,
+    IWineGDISwapChainImpl_Destroy,
+    IWineD3DBaseSwapChainImpl_GetDevice,
+    IWineGDISwapChainImpl_Present,
+    IWineGDISwapChainImpl_SetDestWindowOverride,
+    IWineD3DBaseSwapChainImpl_GetFrontBufferData,
+    IWineD3DBaseSwapChainImpl_GetBackBuffer,
+    IWineD3DBaseSwapChainImpl_GetRasterStatus,
+    IWineD3DBaseSwapChainImpl_GetDisplayMode,
+    IWineD3DBaseSwapChainImpl_GetPresentParameters,
+    IWineD3DBaseSwapChainImpl_SetGammaRamp,
+    IWineD3DBaseSwapChainImpl_GetGammaRamp,
+};
+
 /* Do not call while under the GL lock. */
 HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface_type,
         IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, void *parent)
diff --git a/dlls/wined3d/swapchain_gdi.c b/dlls/wined3d/swapchain_gdi.c
deleted file mode 100644
index 0184ccd..0000000
--- a/dlls/wined3d/swapchain_gdi.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- *IDirect3DSwapChain9 implementation
- *
- *Copyright 2002-2003 Jason Edmeades
- *Copyright 2002-2003 Raphael Junqueira
- *Copyright 2005 Oliver Stieber
- *Copyright 2007-2008 Stefan Dösinger for CodeWeavers
- *
- *This library is free software; you can redistribute it and/or
- *modify it under the terms of the GNU Lesser General Public
- *License as published by the Free Software Foundation; either
- *version 2.1 of the License, or (at your option) any later version.
- *
- *This library is distributed in the hope that it will be useful,
- *but WITHOUT ANY WARRANTY; without even the implied warranty of
- *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *Lesser General Public License for more details.
- *
- *You should have received a copy of the GNU Lesser General Public
- *License along with this library; if not, write to the Free Software
- *Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include "wined3d_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-WINE_DECLARE_DEBUG_CHANNEL(fps);
-
-static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
-{
-    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
-    WINED3DDISPLAYMODE mode;
-
-    TRACE("Destroying swapchain %p\n", iface);
-
-    IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
-
-    /* release the ref to the front and back buffer parents */
-    if (This->front_buffer)
-    {
-        surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL);
-        if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer) > 0)
-        {
-            WARN("(%p) Something's still holding the front buffer\n",This);
-        }
-    }
-
-    if (This->back_buffers)
-    {
-        UINT i;
-        for (i = 0; i < This->presentParms.BackBufferCount; ++i)
-        {
-            surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
-            if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
-            {
-                WARN("(%p) Something's still holding the back buffer\n",This);
-            }
-        }
-        HeapFree(GetProcessHeap(), 0, This->back_buffers);
-    }
-
-    /* Restore the screen resolution if we rendered in fullscreen
-     * This will restore the screen resolution to what it was before creating the swapchain. In case of d3d8 and d3d9
-     * this will be the original desktop resolution. In case of d3d7 this will be a NOP because ddraw sets the resolution
-     * before starting up Direct3D, thus orig_width and orig_height will be equal to the modes in the presentation params
-     */
-    if (!This->presentParms.Windowed && This->presentParms.AutoRestoreDisplayMode)
-    {
-        mode.Width = This->orig_width;
-        mode.Height = This->orig_height;
-        mode.RefreshRate = 0;
-        mode.Format = This->orig_fmt;
-        IWineD3DDevice_SetDisplayMode((IWineD3DDevice *)This->device, 0, &mode);
-    }
-
-    HeapFree(GetProcessHeap(), 0, This->context);
-    HeapFree(GetProcessHeap(), 0, This);
-}
-
-/*****************************************************************************
- * x11_copy_to_screen
- *
- * Helper function that blts the front buffer contents to the target window
- *
- * Params:
- *  This: Surface to copy from
- *  rc: Rectangle to copy
- *
- *****************************************************************************/
-void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc)
-{
-    IWineD3DSurfaceImpl *front = This->front_buffer;
-
-    if(front->resource.usage & WINED3DUSAGE_RENDERTARGET) {
-        POINT offset = {0,0};
-        HWND hDisplayWnd;
-        HDC hDisplayDC;
-        HDC hSurfaceDC = 0;
-        RECT drawrect;
-        TRACE("(%p)->(%p): Copying to screen\n", front, rc);
-
-        hSurfaceDC = front->hDC;
-
-        hDisplayWnd = This->win_handle;
-        hDisplayDC = GetDCEx(hDisplayWnd, 0, DCX_CLIPSIBLINGS|DCX_CACHE);
-        if(rc) {
-            TRACE(" copying rect (%d,%d)->(%d,%d), offset (%d,%d)\n",
-                  rc->left, rc->top, rc->right, rc->bottom, offset.x, offset.y);
-        }
-
-        /* Front buffer coordinates are screen coordinates. Map them to the destination
-         * window if not fullscreened
-         */
-        if(This->presentParms.Windowed) {
-            ClientToScreen(hDisplayWnd, &offset);
-        }
-#if 0
-        /* FIXME: This doesn't work... if users really want to run
-        * X in 8bpp, then we need to call directly into display.drv
-        * (or Wine's equivalent), and force a private colormap
-        * without default entries. */
-        if (front->palette) {
-        SelectPalette(hDisplayDC, front->palette->hpal, FALSE);
-        RealizePalette(hDisplayDC); /* sends messages => deadlocks */
-    }
-#endif
-        drawrect.left   = 0;
-        drawrect.right  = front->resource.width;
-        drawrect.top    = 0;
-        drawrect.bottom = front->resource.height;
-
-#if 0
-        /* TODO: Support clippers */
-        if (front->clipper)
-        {
-        RECT xrc;
-        HWND hwnd = ((IWineD3DClipperImpl *) front->clipper)->hWnd;
-        if (hwnd && GetClientRect(hwnd,&xrc))
-        {
-        OffsetRect(&xrc,offset.x,offset.y);
-        IntersectRect(&drawrect,&drawrect,&xrc);
-    }
-    }
-#endif
-        if (rc) {
-            IntersectRect(&drawrect,&drawrect,rc);
-        }
-        else {
-            /* Only use this if the caller did not pass a rectangle, since
-            * due to double locking this could be the wrong one ...
-            */
-            if (front->lockedRect.left != front->lockedRect.right) {
-                IntersectRect(&drawrect,&drawrect,&front->lockedRect);
-            }
-        }
-
-        BitBlt(hDisplayDC,
-               drawrect.left-offset.x, drawrect.top-offset.y,
-               drawrect.right-drawrect.left, drawrect.bottom-drawrect.top,
-               hSurfaceDC,
-               drawrect.left, drawrect.top,
-               SRCCOPY);
-        ReleaseDC(hDisplayWnd, hDisplayDC);
-    }
-}
-
-static HRESULT WINAPI IWineGDISwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window) {
-    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
-
-    This->win_handle = window;
-    return WINED3D_OK;
-}
-
-static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface,
-        const RECT *pSourceRect, const RECT *pDestRect, HWND hDestWindowOverride,
-        const RGNDATA *pDirtyRegion, DWORD flags)
-{
-    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
-    IWineD3DSurfaceImpl *front, *back;
-
-    if (!This->back_buffers)
-    {
-        WARN("Swapchain doesn't have a backbuffer, returning WINED3DERR_INVALIDCALL\n");
-        return WINED3DERR_INVALIDCALL;
-    }
-    front = This->front_buffer;
-    back = This->back_buffers[0];
-
-    /* Flip the DC */
-    {
-        HDC tmp;
-        tmp = front->hDC;
-        front->hDC = back->hDC;
-        back->hDC = tmp;
-    }
-
-    /* Flip the DIBsection */
-    {
-        HBITMAP tmp;
-        tmp = front->dib.DIBsection;
-        front->dib.DIBsection = back->dib.DIBsection;
-        back->dib.DIBsection = tmp;
-    }
-
-    /* Flip the surface data */
-    {
-        void* tmp;
-
-        tmp = front->dib.bitmap_data;
-        front->dib.bitmap_data = back->dib.bitmap_data;
-        back->dib.bitmap_data = tmp;
-
-        tmp = front->resource.allocatedMemory;
-        front->resource.allocatedMemory = back->resource.allocatedMemory;
-        back->resource.allocatedMemory = tmp;
-
-        if(front->resource.heapMemory) {
-            ERR("GDI Surface %p has heap memory allocated\n", front);
-        }
-        if(back->resource.heapMemory) {
-            ERR("GDI Surface %p has heap memory allocated\n", back);
-        }
-    }
-
-    /* client_memory should not be different, but just in case */
-    {
-        BOOL tmp;
-        tmp = front->dib.client_memory;
-        front->dib.client_memory = back->dib.client_memory;
-        back->dib.client_memory = tmp;
-    }
-
-    /* FPS support */
-    if (TRACE_ON(fps))
-    {
-        static LONG prev_time, frames;
-
-        DWORD time = GetTickCount();
-        frames++;
-        /* every 1.5 seconds */
-        if (time - prev_time > 1500) {
-            TRACE_(fps)("@ approx %.2ffps\n", 1000.0*frames/(time - prev_time));
-            prev_time = time;
-            frames = 0;
-        }
-    }
-
-    x11_copy_to_screen(This, NULL);
-
-    return WINED3D_OK;
-}
-
-const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl =
-{
-    /* IUnknown */
-    IWineD3DBaseSwapChainImpl_QueryInterface,
-    IWineD3DBaseSwapChainImpl_AddRef,
-    IWineD3DBaseSwapChainImpl_Release,
-    /* IWineD3DSwapChain */
-    IWineD3DBaseSwapChainImpl_GetParent,
-    IWineGDISwapChainImpl_Destroy,
-    IWineD3DBaseSwapChainImpl_GetDevice,
-    IWineGDISwapChainImpl_Present,
-    IWineGDISwapChainImpl_SetDestWindowOverride,
-    IWineD3DBaseSwapChainImpl_GetFrontBufferData,
-    IWineD3DBaseSwapChainImpl_GetBackBuffer,
-    IWineD3DBaseSwapChainImpl_GetRasterStatus,
-    IWineD3DBaseSwapChainImpl_GetDisplayMode,
-    IWineD3DBaseSwapChainImpl_GetPresentParameters,
-    IWineD3DBaseSwapChainImpl_SetGammaRamp,
-    IWineD3DBaseSwapChainImpl_GetGammaRamp
-};
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 47d8631..cb56ce4 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2552,7 +2552,6 @@ struct IWineD3DSwapChainImpl
     HWND device_window;
 };
 
-extern const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN;
 void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc) DECLSPEC_HIDDEN;
 
 HRESULT WINAPI IWineD3DBaseSwapChainImpl_QueryInterface(IWineD3DSwapChain *iface,
-- 
1.7.3.4




More information about the wine-patches mailing list