Commit a8124f97 authored by Chris Robinson's avatar Chris Robinson Committed by Alexandre Julliard

winex11: Store a GL-specific drawable with the window.

parent 00bc3d9e
...@@ -151,11 +151,13 @@ static void update_visible_region( struct dce *dce ) ...@@ -151,11 +151,13 @@ static void update_visible_region( struct dce *dce )
{ {
escape.drawable = data->icon_window; escape.drawable = data->icon_window;
escape.fbconfig_id = 0; escape.fbconfig_id = 0;
escape.gl_drawable = 0;
} }
else else
{ {
escape.drawable = X11DRV_get_whole_window( top ); escape.drawable = X11DRV_get_whole_window( top );
escape.fbconfig_id = X11DRV_get_fbconfig_id( dce->hwnd ); escape.fbconfig_id = X11DRV_get_fbconfig_id( dce->hwnd );
escape.gl_drawable = X11DRV_get_gl_drawable( dce->hwnd );
} }
escape.code = X11DRV_SET_DRAWABLE; escape.code = X11DRV_SET_DRAWABLE;
...@@ -192,6 +194,7 @@ static void release_dce( struct dce *dce ) ...@@ -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, SetRect( &escape.dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left,
virtual_screen_rect.bottom - virtual_screen_rect.top ); virtual_screen_rect.bottom - virtual_screen_rect.top );
escape.fbconfig_id = 0; escape.fbconfig_id = 0;
escape.gl_drawable = 0;
ExtEscape( dce->hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); ExtEscape( dce->hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
} }
......
...@@ -341,6 +341,7 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID ...@@ -341,6 +341,7 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID
physDev->drawable = data->drawable; physDev->drawable = data->drawable;
physDev->drawable_rect = data->drawable_rect; physDev->drawable_rect = data->drawable_rect;
physDev->current_pf = pixelformat_from_fbconfig_id( data->fbconfig_id ); physDev->current_pf = pixelformat_from_fbconfig_id( data->fbconfig_id );
physDev->gl_drawable = data->gl_drawable;
wine_tsx11_lock(); wine_tsx11_lock();
XSetSubwindowMode( gdi_display, physDev->gc, data->mode ); XSetSubwindowMode( gdi_display, physDev->gc, data->mode );
wine_tsx11_unlock(); wine_tsx11_unlock();
......
...@@ -3308,6 +3308,8 @@ Drawable get_glxdrawable(X11DRV_PDEVICE *physDev) ...@@ -3308,6 +3308,8 @@ Drawable get_glxdrawable(X11DRV_PDEVICE *physDev)
ret = physDev->bitmap->glxpixmap; ret = physDev->bitmap->glxpixmap;
} }
} }
else if(physDev->gl_drawable)
ret = physDev->gl_drawable;
else else
ret = physDev->drawable; ret = physDev->drawable;
return ret; return ret;
......
...@@ -56,6 +56,7 @@ static XContext win_data_context; ...@@ -56,6 +56,7 @@ static XContext win_data_context;
static const char whole_window_prop[] = "__wine_x11_whole_window"; static const char whole_window_prop[] = "__wine_x11_whole_window";
static const char icon_window_prop[] = "__wine_x11_icon_window"; static const char icon_window_prop[] = "__wine_x11_icon_window";
static const char fbconfig_id_prop[] = "__wine_x11_fbconfig_id"; 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 managed_prop[] = "__wine_x11_managed";
static const char visual_id_prop[] = "__wine_x11_visual_id"; 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 ) ...@@ -955,6 +956,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd )
data->whole_window = 0; data->whole_window = 0;
data->icon_window = 0; data->icon_window = 0;
data->fbconfig_id = 0; data->fbconfig_id = 0;
data->gl_drawable = 0;
data->xic = 0; data->xic = 0;
data->managed = FALSE; data->managed = FALSE;
data->dce = NULL; data->dce = NULL;
...@@ -1260,6 +1262,19 @@ XID X11DRV_get_fbconfig_id( HWND hwnd ) ...@@ -1260,6 +1262,19 @@ XID X11DRV_get_fbconfig_id( HWND hwnd )
return data->fbconfig_id; 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 * X11DRV_get_ic
......
...@@ -139,6 +139,7 @@ typedef struct ...@@ -139,6 +139,7 @@ typedef struct
int exposures; /* count of graphics exposures operations */ int exposures; /* count of graphics exposures operations */
struct dce *dce; /* opaque pointer to DCE */ struct dce *dce; /* opaque pointer to DCE */
int current_pf; int current_pf;
Drawable gl_drawable;
XRENDERINFO xrender; XRENDERINFO xrender;
} X11DRV_PDEVICE; } X11DRV_PDEVICE;
...@@ -486,6 +487,7 @@ struct x11drv_escape_set_drawable ...@@ -486,6 +487,7 @@ struct x11drv_escape_set_drawable
RECT dc_rect; /* DC rectangle relative to drawable */ RECT dc_rect; /* DC rectangle relative to drawable */
RECT drawable_rect;/* Drawable rectangle relative to screen */ RECT drawable_rect;/* Drawable rectangle relative to screen */
XID fbconfig_id; /* fbconfig id used by the GL drawable */ XID fbconfig_id; /* fbconfig id used by the GL drawable */
Drawable gl_drawable; /* GL drawable */
}; };
struct x11drv_escape_set_dce struct x11drv_escape_set_dce
...@@ -645,6 +647,7 @@ struct x11drv_win_data ...@@ -645,6 +647,7 @@ struct x11drv_win_data
Window whole_window; /* X window for the complete window */ Window whole_window; /* X window for the complete window */
Window icon_window; /* X window for the icon */ Window icon_window; /* X window for the icon */
XID fbconfig_id; /* fbconfig id for the GL drawable this hwnd uses */ 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 window_rect; /* USER window rectangle relative to parent */
RECT whole_rect; /* X window rectangle for the whole window 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 */ RECT client_rect; /* client area relative to whole window */
...@@ -660,6 +663,7 @@ struct x11drv_win_data ...@@ -660,6 +663,7 @@ struct x11drv_win_data
extern struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd ); extern struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd );
extern Window X11DRV_get_whole_window( HWND hwnd ); extern Window X11DRV_get_whole_window( HWND hwnd );
extern XID X11DRV_get_fbconfig_id( 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 BOOL X11DRV_is_window_rect_mapped( const RECT *rect );
extern XIC X11DRV_get_ic( HWND hwnd ); extern XIC X11DRV_get_ic( HWND hwnd );
extern BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig ); extern BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment