Alexandre Julliard : winex11: Get the current pixel format from the drawable structure for wglSetPixelFormat .

Alexandre Julliard julliard at winehq.org
Fri Sep 7 13:26:21 CDT 2012


Module: wine
Branch: master
Commit: ecc8559fe800df985b37afd6b1f2347c246e4039
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ecc8559fe800df985b37afd6b1f2347c246e4039

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Sep  7 15:06:19 2012 +0200

winex11: Get the current pixel format from the drawable structure for wglSetPixelFormat.

---

 dlls/winex11.drv/opengl.c |   46 +++++++++++++++++++-------------------------
 1 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 84651c0..00642ce 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1533,25 +1533,16 @@ static int glxdrv_wglGetPixelFormat( HDC hdc )
  */
 static BOOL glxdrv_wglSetPixelFormat( HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR *ppfd )
 {
-    struct x11drv_escape_get_drawable escape;
     const struct wgl_pixel_format *fmt;
-    int value;
-    HWND hwnd;
+    int value, prev = 0;
+    struct gl_drawable *gl;
+    HWND hwnd = WindowFromDC( hdc );
 
     TRACE("(%p,%d,%p)\n", hdc, iPixelFormat, ppfd);
 
-    escape.code = X11DRV_GET_DRAWABLE;
-    if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape.code), (LPCSTR)&escape.code,
-                    sizeof(escape), (LPSTR)&escape ))
-        return 0;
-
-    if (escape.pixel_format)  /* cannot change it if already set */
-        return (escape.pixel_format == iPixelFormat);
-
-    /* SetPixelFormat is not allowed on the X root_window e.g. GetDC(0) */
-    if (escape.drawable == root_window)
+    if (!hwnd || hwnd == GetDesktopWindow())
     {
-        ERR("Invalid operation on root_window\n");
+        WARN( "not a proper window DC %p/%p\n", hdc, hwnd );
         return FALSE;
     }
 
@@ -1563,21 +1554,24 @@ static BOOL glxdrv_wglSetPixelFormat( HDC hdc, int iPixelFormat, const PIXELFORM
     }
 
     pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &value);
+    if (!(value & GLX_WINDOW_BIT))
+    {
+        WARN("Pixel format %d is not compatible for window rendering\n", iPixelFormat);
+        return FALSE;
+    }
 
-    hwnd = WindowFromDC( hdc );
-    if(hwnd) {
-        if(!(value&GLX_WINDOW_BIT)) {
-            WARN("Pixel format %d is not compatible for window rendering\n", iPixelFormat);
-            return FALSE;
-        }
+    EnterCriticalSection( &context_section );
+    if (!XFindContext( gdi_display, (XID)hwnd, gl_drawable_context, (char **)&gl ))
+        prev = gl->pixel_format;
+    LeaveCriticalSection( &context_section );
 
-        if(!SendMessageW(hwnd, WM_X11DRV_SET_WIN_FORMAT, fmt->fmt_id, 0)) {
-            ERR("Couldn't set format of the window, returning failure\n");
-            return FALSE;
-        }
-        /* physDev->current_pf will be set by the DCE update */
+    if (prev) return prev == iPixelFormat;  /* cannot change it if already set */
+
+    if(!SendMessageW(hwnd, WM_X11DRV_SET_WIN_FORMAT, fmt->fmt_id, 0)) {
+        ERR("Couldn't set format of the window, returning failure\n");
+        return FALSE;
     }
-    else FIXME("called on a non-window object?\n");
+    /* physDev->current_pf will be set by the DCE update */
 
     if (TRACE_ON(wgl)) {
         int gl_test = 0;




More information about the wine-cvs mailing list