Module: wine Branch: master Commit: a8124f97e6560b87935a2a4f85ae6a827214f757 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8124f97e6560b87935a2a4f85...
Author: Chris Robinson chris.kcat@gmail.com Date: Tue Sep 25 10:20:58 2007 -0700
winex11: Store a GL-specific drawable with the window.
---
dlls/winex11.drv/dce.c | 3 +++ dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/opengl.c | 2 ++ dlls/winex11.drv/window.c | 15 +++++++++++++++ dlls/winex11.drv/x11drv.h | 4 ++++ 5 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/dlls/winex11.drv/dce.c b/dlls/winex11.drv/dce.c index aa37a4a..222a4d6 100644 --- a/dlls/winex11.drv/dce.c +++ b/dlls/winex11.drv/dce.c @@ -151,11 +151,13 @@ static void update_visible_region( struct dce *dce ) { escape.drawable = data->icon_window; escape.fbconfig_id = 0; + escape.gl_drawable = 0; } else { escape.drawable = X11DRV_get_whole_window( top ); escape.fbconfig_id = X11DRV_get_fbconfig_id( dce->hwnd ); + escape.gl_drawable = X11DRV_get_gl_drawable( dce->hwnd ); }
escape.code = X11DRV_SET_DRAWABLE; @@ -192,6 +194,7 @@ static void release_dce( struct dce *dce ) SetRect( &escape.dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left, virtual_screen_rect.bottom - virtual_screen_rect.top ); escape.fbconfig_id = 0; + escape.gl_drawable = 0; ExtEscape( dce->hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); }
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 9000d0a..d6c538a 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -341,6 +341,7 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID physDev->drawable = data->drawable; physDev->drawable_rect = data->drawable_rect; physDev->current_pf = pixelformat_from_fbconfig_id( data->fbconfig_id ); + physDev->gl_drawable = data->gl_drawable; wine_tsx11_lock(); XSetSubwindowMode( gdi_display, physDev->gc, data->mode ); wine_tsx11_unlock(); diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index e3d3285..14b5a81 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -3308,6 +3308,8 @@ Drawable get_glxdrawable(X11DRV_PDEVICE *physDev) ret = physDev->bitmap->glxpixmap; } } + else if(physDev->gl_drawable) + ret = physDev->gl_drawable; else ret = physDev->drawable; return ret; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 122370f..f4be4a5 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -56,6 +56,7 @@ static XContext win_data_context; static const char whole_window_prop[] = "__wine_x11_whole_window"; static const char icon_window_prop[] = "__wine_x11_icon_window"; static const char fbconfig_id_prop[] = "__wine_x11_fbconfig_id"; +static const char gl_drawable_prop[] = "__wine_x11_gl_drawable"; static const char managed_prop[] = "__wine_x11_managed"; static const char visual_id_prop[] = "__wine_x11_visual_id";
@@ -955,6 +956,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd ) data->whole_window = 0; data->icon_window = 0; data->fbconfig_id = 0; + data->gl_drawable = 0; data->xic = 0; data->managed = FALSE; data->dce = NULL; @@ -1260,6 +1262,19 @@ XID X11DRV_get_fbconfig_id( HWND hwnd ) return data->fbconfig_id; }
+/*********************************************************************** + * X11DRV_get_gl_drawable + * + * Return the GL drawable for this window. + */ +Drawable X11DRV_get_gl_drawable( HWND hwnd ) +{ + struct x11drv_win_data *data = X11DRV_get_win_data( hwnd ); + + if (!data) return (Drawable)GetPropA( hwnd, gl_drawable_prop ); + return data->gl_drawable; +} +
/*********************************************************************** * X11DRV_get_ic diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index f61dc98..e26835d 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -139,6 +139,7 @@ typedef struct int exposures; /* count of graphics exposures operations */ struct dce *dce; /* opaque pointer to DCE */ int current_pf; + Drawable gl_drawable; XRENDERINFO xrender; } X11DRV_PDEVICE;
@@ -486,6 +487,7 @@ struct x11drv_escape_set_drawable RECT dc_rect; /* DC rectangle relative to drawable */ RECT drawable_rect;/* Drawable rectangle relative to screen */ XID fbconfig_id; /* fbconfig id used by the GL drawable */ + Drawable gl_drawable; /* GL drawable */ };
struct x11drv_escape_set_dce @@ -645,6 +647,7 @@ struct x11drv_win_data Window whole_window; /* X window for the complete window */ Window icon_window; /* X window for the icon */ XID fbconfig_id; /* fbconfig id for the GL drawable this hwnd uses */ + Drawable gl_drawable; /* Optional GL drawable for rendering the client area */ RECT window_rect; /* USER window rectangle relative to parent */ RECT whole_rect; /* X window rectangle for the whole window relative to parent */ RECT client_rect; /* client area relative to whole window */ @@ -660,6 +663,7 @@ struct x11drv_win_data extern struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd ); extern Window X11DRV_get_whole_window( HWND hwnd ); extern XID X11DRV_get_fbconfig_id( HWND hwnd ); +extern Drawable X11DRV_get_gl_drawable( HWND hwnd ); extern BOOL X11DRV_is_window_rect_mapped( const RECT *rect ); extern XIC X11DRV_get_ic( HWND hwnd ); extern BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig );