Alexandre Julliard : winex11: Allow changing the pixel format of a window from a different thread.
Alexandre Julliard
julliard at winehq.org
Wed Oct 3 13:20:34 CDT 2012
Module: wine
Branch: master
Commit: 4ac1a5ac608bad7111f7cb99170a3be99b5059f0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4ac1a5ac608bad7111f7cb99170a3be99b5059f0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Oct 3 11:19:10 2012 +0200
winex11: Allow changing the pixel format of a window from a different thread.
---
dlls/winex11.drv/opengl.c | 47 ++++++--------------------------------------
dlls/winex11.drv/window.c | 2 -
dlls/winex11.drv/x11drv.h | 2 -
3 files changed, 7 insertions(+), 44 deletions(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c
index 3e68131..20591e2 100644
--- a/dlls/winex11.drv/opengl.c
+++ b/dlls/winex11.drv/opengl.c
@@ -1062,20 +1062,6 @@ static const struct wgl_pixel_format *get_pixel_format(Display *display, int iPi
return NULL;
}
-static int pixelformat_from_fbconfig_id(XID fbconfig_id)
-{
- int i;
-
- if (!fbconfig_id) return 0;
-
- for (i = 0; i < nb_pixel_formats; i++)
- if (pixel_formats[i].fmt_id == fbconfig_id) return i + 1;
-
- /* This will happen on hwnds without a pixel format set; it's ok */
- return 0;
-}
-
-
/* Mark any allocated context using the glx drawable 'old' to use 'new' */
static void mark_drawable_dirty(Drawable old, Drawable new)
{
@@ -1182,18 +1168,15 @@ static void free_gl_drawable( struct gl_drawable *gl )
/***********************************************************************
* set_win_format
*/
-BOOL set_win_format( HWND hwnd, XID fbconfig_id )
+static BOOL set_win_format( HWND hwnd, const struct wgl_pixel_format *format )
{
HWND parent = GetAncestor( hwnd, GA_PARENT );
XSetWindowAttributes attrib;
struct gl_drawable *gl, *prev;
- int format;
-
- if (!(format = pixelformat_from_fbconfig_id( fbconfig_id ))) return FALSE;
gl = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*gl) );
- gl->format = &pixel_formats[format - 1];
- gl->visual = pglXGetVisualFromFBConfig( gdi_display, gl->format->fbconfig );
+ gl->format = format;
+ gl->visual = pglXGetVisualFromFBConfig( gdi_display, format->fbconfig );
if (!gl->visual)
{
HeapFree( GetProcessHeap(), 0, gl );
@@ -1289,7 +1272,7 @@ BOOL set_win_format( HWND hwnd, XID fbconfig_id )
return FALSE;
}
- TRACE("Created GL drawable 0x%lx, using FBConfigID 0x%lx\n", gl->drawable, fbconfig_id);
+ TRACE("created GL drawable %lx for win %p format %x\n", gl->drawable, hwnd, format->fmt_id );
XFlush( gdi_display );
@@ -1298,11 +1281,6 @@ BOOL set_win_format( HWND hwnd, XID fbconfig_id )
free_gl_drawable( prev );
XSaveContext( gdi_display, (XID)hwnd, gl_hwnd_context, (char *)gl );
LeaveCriticalSection( &context_section );
-
- /* force DCE invalidation */
- SetWindowPos( hwnd, 0, 0, 0, 0, 0,
- SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
- SWP_NOREDRAW | SWP_DEFERERASE | SWP_NOSENDCHANGING | SWP_STATECHANGED);
return TRUE;
}
@@ -1577,12 +1555,6 @@ static BOOL glxdrv_wglSetPixelFormat( HDC hdc, int iPixelFormat, const PIXELFORM
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;
- }
- /* physDev->current_pf will be set by the DCE update */
-
if (TRACE_ON(wgl)) {
int gl_test = 0;
@@ -1598,7 +1570,8 @@ static BOOL glxdrv_wglSetPixelFormat( HDC hdc, int iPixelFormat, const PIXELFORM
TRACE(" - DRAWABLE_TYPE 0x%x\n", value);
}
}
- return TRUE;
+
+ return set_win_format( hwnd, fmt );
}
/***********************************************************************
@@ -2879,8 +2852,7 @@ static BOOL X11DRV_wglSetPixelFormatWINE(HDC hdc, int format)
return FALSE;
}
- return SendMessageW(hwnd, WM_X11DRV_SET_WIN_FORMAT, fmt->fmt_id, 0);
- /* DC pixel format will be set by the DCE update */
+ return set_win_format( hwnd, fmt );
}
/**
@@ -3102,11 +3074,6 @@ struct opengl_funcs *get_glx_driver( UINT version )
return NULL;
}
-BOOL set_win_format( HWND hwnd, XID fbconfig_id )
-{
- return FALSE;
-}
-
BOOL has_gl_drawable( HWND hwnd )
{
return FALSE;
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index ea9adae..5d7e315 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2430,8 +2430,6 @@ LRESULT CDECL X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
case WM_X11DRV_ACQUIRE_SELECTION:
return X11DRV_AcquireClipboard( hwnd );
- case WM_X11DRV_SET_WIN_FORMAT:
- return set_win_format( hwnd, (XID)wp );
case WM_X11DRV_SET_WIN_REGION:
if ((data = get_win_data( hwnd )))
{
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index a13d25c..8e114a2 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -517,7 +517,6 @@ extern DWORD EVENT_x11_time_to_win32_time(Time time) DECLSPEC_HIDDEN;
enum x11drv_window_messages
{
WM_X11DRV_ACQUIRE_SELECTION = 0x80001000,
- WM_X11DRV_SET_WIN_FORMAT,
WM_X11DRV_SET_WIN_REGION,
WM_X11DRV_RESIZE_DESKTOP,
WM_X11DRV_SET_CURSOR,
@@ -568,7 +567,6 @@ extern void release_win_data( struct x11drv_win_data *data ) DECLSPEC_HIDDEN;
extern Window X11DRV_get_whole_window( HWND hwnd ) DECLSPEC_HIDDEN;
extern XIC X11DRV_get_ic( HWND hwnd ) DECLSPEC_HIDDEN;
-extern BOOL set_win_format( HWND hwnd, XID fbconfig_id ) DECLSPEC_HIDDEN;
extern BOOL has_gl_drawable( HWND hwnd ) DECLSPEC_HIDDEN;
extern void sync_gl_drawable( HWND hwnd, const RECT *visible_rect, const RECT *client_rect ) DECLSPEC_HIDDEN;
extern void destroy_gl_drawable( HWND hwnd ) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list