Commit d56ccaa7 authored by Alexandre Julliard's avatar Alexandre Julliard

Use an X context to associated the x11drv private window data to a

window handle instead of accessing the WND structure directly.
parent 6db71654
...@@ -76,11 +76,11 @@ static DWORD CALLBACK desktop_thread( LPVOID driver_data ) ...@@ -76,11 +76,11 @@ static DWORD CALLBACK desktop_thread( LPVOID driver_data )
/* patch the desktop window queue to point to our queue */ /* patch the desktop window queue to point to our queue */
win = WIN_GetPtr( hwnd ); win = WIN_GetPtr( hwnd );
win->tid = GetCurrentThreadId(); win->tid = GetCurrentThreadId();
X11DRV_register_window( display, hwnd, win->pDriverData );
WIN_ReleasePtr( win ); WIN_ReleasePtr( win );
SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_winproc ); SetWindowLongPtrW( hwnd, GWLP_WNDPROC, (LONG_PTR)desktop_winproc );
wine_tsx11_lock(); wine_tsx11_lock();
XSaveContext( display, root_window, winContext, (char *)hwnd );
XChangeProperty ( display, root_window, x11drv_atom(WM_PROTOCOLS), XChangeProperty ( display, root_window, x11drv_atom(WM_PROTOCOLS),
XA_ATOM, 32, PropModeReplace, (char *)&atom, 1 ); XA_ATOM, 32, PropModeReplace, (char *)&atom, 1 );
XMapWindow( display, root_window ); XMapWindow( display, root_window );
......
...@@ -50,9 +50,6 @@ ...@@ -50,9 +50,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(event); WINE_DEFAULT_DEBUG_CHANNEL(event);
WINE_DECLARE_DEBUG_CHANNEL(clipboard); WINE_DECLARE_DEBUG_CHANNEL(clipboard);
/* X context to associate a hwnd to an X window */
extern XContext winContext;
extern BOOL ximInComposeMode; extern BOOL ximInComposeMode;
#define DndNotDnd -1 /* OffiX drag&drop */ #define DndNotDnd -1 /* OffiX drag&drop */
......
...@@ -50,6 +50,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv); ...@@ -50,6 +50,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
/* X context to associate a hwnd to an X window */ /* X context to associate a hwnd to an X window */
XContext winContext = 0; XContext winContext = 0;
/* X context to associate a struct x11drv_win_data to an hwnd */
static XContext win_data_context;
Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM]; Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM];
static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
...@@ -743,20 +746,6 @@ int X11DRV_sync_client_window_position( Display *display, struct x11drv_win_data ...@@ -743,20 +746,6 @@ int X11DRV_sync_client_window_position( Display *display, struct x11drv_win_data
} }
/***********************************************************************
* X11DRV_register_window
*
* Associate an X window to a HWND.
*/
void X11DRV_register_window( Display *display, HWND hwnd, struct x11drv_win_data *data )
{
wine_tsx11_lock();
XSaveContext( display, data->whole_window, winContext, (char *)hwnd );
XSaveContext( display, data->client_window, winContext, (char *)hwnd );
wine_tsx11_unlock();
}
/********************************************************************** /**********************************************************************
* create_desktop * create_desktop
*/ */
...@@ -828,6 +817,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat ...@@ -828,6 +817,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
wine_tsx11_unlock(); wine_tsx11_unlock();
return 0; return 0;
} }
XSaveContext( display, data->whole_window, winContext, (char *)data->hwnd );
/* non-maximized child must be at bottom of Z order */ /* non-maximized child must be at bottom of Z order */
if ((style & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) if ((style & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)
...@@ -878,6 +868,7 @@ static Window create_client_window( Display *display, struct x11drv_win_data *da ...@@ -878,6 +868,7 @@ static Window create_client_window( Display *display, struct x11drv_win_data *da
0, screen_depth, 0, screen_depth,
InputOutput, visual, InputOutput, visual,
CWEventMask | CWBitGravity | CWBackingStore, &attr ); CWEventMask | CWBitGravity | CWBackingStore, &attr );
XSaveContext( display, data->client_window, winContext, (char *)data->hwnd );
if (data->client_window && is_mapped) XMapWindow( display, data->client_window ); if (data->client_window && is_mapped) XMapWindow( display, data->client_window );
wine_tsx11_unlock(); wine_tsx11_unlock();
return data->client_window; return data->client_window;
...@@ -947,9 +938,9 @@ BOOL X11DRV_DestroyWindow( HWND hwnd ) ...@@ -947,9 +938,9 @@ BOOL X11DRV_DestroyWindow( HWND hwnd )
struct x11drv_thread_data *thread_data = x11drv_thread_data(); struct x11drv_thread_data *thread_data = x11drv_thread_data();
Display *display = thread_data->display; Display *display = thread_data->display;
WND *wndPtr = WIN_GetPtr( hwnd ); WND *wndPtr = WIN_GetPtr( hwnd );
struct x11drv_win_data *data = wndPtr->pDriverData; struct x11drv_win_data *data;
if (!data) goto done; if (!(data = X11DRV_get_win_data( hwnd ))) goto done;
if (data->whole_window) if (data->whole_window)
{ {
...@@ -972,8 +963,11 @@ BOOL X11DRV_DestroyWindow( HWND hwnd ) ...@@ -972,8 +963,11 @@ BOOL X11DRV_DestroyWindow( HWND hwnd )
if (data->hWMIconBitmap) DeleteObject( data->hWMIconBitmap ); if (data->hWMIconBitmap) DeleteObject( data->hWMIconBitmap );
if (data->hWMIconMask) DeleteObject( data->hWMIconMask); if (data->hWMIconMask) DeleteObject( data->hWMIconMask);
wine_tsx11_lock();
XDeleteContext( gdi_display, (XID)hwnd, win_data_context );
wine_tsx11_unlock();
HeapFree( GetProcessHeap(), 0, data ); HeapFree( GetProcessHeap(), 0, data );
wndPtr->pDriverData = NULL;
done: done:
WIN_ReleasePtr( wndPtr ); WIN_ReleasePtr( wndPtr );
return TRUE; return TRUE;
...@@ -988,7 +982,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -988,7 +982,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
Display *display = thread_display(); Display *display = thread_display();
WND *wndPtr; WND *wndPtr;
struct x11drv_win_data *data; struct x11drv_win_data *data;
HWND insert_after; HWND parent, insert_after;
RECT rect; RECT rect;
DWORD style; DWORD style;
CBT_CREATEWNDA cbtc; CBT_CREATEWNDA cbtc;
...@@ -1024,20 +1018,22 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -1024,20 +1018,22 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
data->hWMIconBitmap = 0; data->hWMIconBitmap = 0;
data->hWMIconMask = 0; data->hWMIconMask = 0;
wndPtr = WIN_GetPtr( hwnd ); /* use gdi_display so that it's available from all threads (FIXME) */
wndPtr->pDriverData = data; wine_tsx11_lock();
if (!win_data_context) win_data_context = XUniqueContext();
XSaveContext( gdi_display, (XID)hwnd, win_data_context, (char *)data );
wine_tsx11_unlock();
/* initialize the dimensions before sending WM_GETMINMAXINFO */ /* initialize the dimensions before sending WM_GETMINMAXINFO */
SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy ); SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy );
X11DRV_set_window_pos( hwnd, 0, &rect, &rect, SWP_NOZORDER, 0 ); X11DRV_set_window_pos( hwnd, 0, &rect, &rect, SWP_NOZORDER, 0 );
if (!wndPtr->parent) parent = GetAncestor( hwnd, GA_PARENT );
if (!parent)
{ {
create_desktop( display, data ); create_desktop( display, data );
WIN_ReleasePtr( wndPtr );
return TRUE; return TRUE;
} }
WIN_ReleasePtr( wndPtr );
if (!create_whole_window( display, data, cs->style )) goto failed; if (!create_whole_window( display, data, cs->style )) goto failed;
if (!create_client_window( display, data )) goto failed; if (!create_client_window( display, data )) goto failed;
...@@ -1103,7 +1099,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -1103,7 +1099,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
insert_after = ((wndPtr->dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) ? HWND_BOTTOM : HWND_TOP; insert_after = ((wndPtr->dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
X11DRV_set_window_pos( hwnd, insert_after, &wndPtr->rectWindow, &rect, 0, 0 ); X11DRV_set_window_pos( hwnd, insert_after, &wndPtr->rectWindow, &rect, 0, 0 );
X11DRV_register_window( display, hwnd, data );
TRACE( "win %p window %ld,%ld,%ld,%ld client %ld,%ld,%ld,%ld whole %ld,%ld,%ld,%ld X client %ld,%ld,%ld,%ld xwin %x/%x\n", TRACE( "win %p window %ld,%ld,%ld,%ld client %ld,%ld,%ld,%ld whole %ld,%ld,%ld,%ld X client %ld,%ld,%ld,%ld xwin %x/%x\n",
hwnd, wndPtr->rectWindow.left, wndPtr->rectWindow.top, hwnd, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
...@@ -1179,15 +1174,9 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode ) ...@@ -1179,15 +1174,9 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
*/ */
struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd ) struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd )
{ {
struct x11drv_win_data *ret = NULL; char *data;
WND *win = WIN_GetPtr( hwnd ); if (XFindContext( gdi_display, (XID)hwnd, win_data_context, &data )) data = NULL;
return (struct x11drv_win_data *)data;
if (win && win != WND_OTHER_PROCESS)
{
ret = win->pDriverData;
WIN_ReleasePtr( win );
}
return ret;
} }
...@@ -1239,27 +1228,27 @@ XIC X11DRV_get_ic( HWND hwnd ) ...@@ -1239,27 +1228,27 @@ XIC X11DRV_get_ic( HWND hwnd )
HWND X11DRV_SetParent( HWND hwnd, HWND parent ) HWND X11DRV_SetParent( HWND hwnd, HWND parent )
{ {
Display *display = thread_display(); Display *display = thread_display();
WND *wndPtr; HWND old_parent;
HWND retvalue;
/* Windows hides the window first, then shows it again /* Windows hides the window first, then shows it again
* including the WM_SHOWWINDOW messages and all */ * including the WM_SHOWWINDOW messages and all */
BOOL was_visible = ShowWindow( hwnd, SW_HIDE ); BOOL was_visible = ShowWindow( hwnd, SW_HIDE );
if (!IsWindow( parent )) return 0; if (!IsWindow( parent )) return 0;
if (!(wndPtr = WIN_GetPtr(hwnd)) || wndPtr == WND_OTHER_PROCESS) return 0;
retvalue = wndPtr->parent; /* old parent */ old_parent = GetAncestor( hwnd, GA_PARENT );
if (parent != retvalue) if (parent != old_parent)
{ {
struct x11drv_win_data *data = wndPtr->pDriverData; struct x11drv_win_data *data;
Window new_parent = X11DRV_get_client_window( parent ); Window new_parent = X11DRV_get_client_window( parent );
if (!(data = X11DRV_get_win_data( hwnd ))) return 0;
WIN_LinkWindow( hwnd, parent, HWND_TOP ); WIN_LinkWindow( hwnd, parent, HWND_TOP );
if (parent != GetDesktopWindow()) /* a child window */ if (parent != GetDesktopWindow()) /* a child window */
{ {
if (!(wndPtr->dwStyle & WS_CHILD)) if (!(GetWindowLongW( hwnd, GWL_STYLE ) & WS_CHILD))
{ {
HMENU menu = (HMENU)SetWindowLongPtrW( hwnd, GWLP_ID, 0 ); HMENU menu = (HMENU)SetWindowLongPtrW( hwnd, GWLP_ID, 0 );
if (menu) DestroyMenu( menu ); if (menu) DestroyMenu( menu );
...@@ -1273,7 +1262,6 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent ) ...@@ -1273,7 +1262,6 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent )
data->whole_rect.left, data->whole_rect.top ); data->whole_rect.left, data->whole_rect.top );
wine_tsx11_unlock(); wine_tsx11_unlock();
} }
WIN_ReleasePtr( wndPtr );
/* SetParent additionally needs to make hwnd the topmost window /* SetParent additionally needs to make hwnd the topmost window
in the x-order and send the expected WM_WINDOWPOSCHANGING and in the x-order and send the expected WM_WINDOWPOSCHANGING and
...@@ -1284,7 +1272,7 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent ) ...@@ -1284,7 +1272,7 @@ HWND X11DRV_SetParent( HWND hwnd, HWND parent )
/* FIXME: a WM_MOVE is also generated (in the DefWindowProc handler /* FIXME: a WM_MOVE is also generated (in the DefWindowProc handler
* for WM_WINDOWPOSCHANGED) in Windows, should probably remove SWP_NOMOVE */ * for WM_WINDOWPOSCHANGED) in Windows, should probably remove SWP_NOMOVE */
return retvalue; return old_parent;
} }
......
...@@ -240,7 +240,6 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags ) ...@@ -240,7 +240,6 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
{ {
HWND top = get_top_clipping_window( hwnd ); HWND top = get_top_clipping_window( hwnd );
WND *win = WIN_GetPtr( hwnd ); WND *win = WIN_GetPtr( hwnd );
struct x11drv_win_data *data = win->pDriverData;
struct x11drv_escape_set_drawable escape; struct x11drv_escape_set_drawable escape;
escape.mode = IncludeInferiors; escape.mode = IncludeInferiors;
...@@ -282,6 +281,14 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags ) ...@@ -282,6 +281,14 @@ BOOL X11DRV_GetDC( HWND hwnd, HDC hdc, HRGN hrgn, DWORD flags )
} }
else else
{ {
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data( hwnd )))
{
WIN_ReleasePtr( win );
return FALSE;
}
if (IsIconic( hwnd )) if (IsIconic( hwnd ))
{ {
escape.drawable = data->icon_window ? data->icon_window : data->whole_window; escape.drawable = data->icon_window ? data->icon_window : data->whole_window;
...@@ -683,12 +690,14 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style ) ...@@ -683,12 +690,14 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style )
BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow, BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow,
const RECT *rectClient, UINT swp_flags, UINT wvr_flags ) const RECT *rectClient, UINT swp_flags, UINT wvr_flags )
{ {
struct x11drv_win_data *data;
HWND top = get_top_clipping_window( hwnd ); HWND top = get_top_clipping_window( hwnd );
WND *win = WIN_GetPtr( hwnd ); WND *win;
DWORD old_style, new_style; DWORD old_style, new_style;
BOOL ret; BOOL ret;
if (!win) return FALSE; if (!(data = X11DRV_get_win_data( hwnd ))) return FALSE;
if (!(win = WIN_GetPtr( hwnd ))) return FALSE;
if (win == WND_OTHER_PROCESS) if (win == WND_OTHER_PROCESS)
{ {
if (IsWindow( hwnd )) ERR( "cannot set rectangles of other process window %p\n", hwnd ); if (IsWindow( hwnd )) ERR( "cannot set rectangles of other process window %p\n", hwnd );
...@@ -717,7 +726,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow ...@@ -717,7 +726,6 @@ BOOL X11DRV_set_window_pos( HWND hwnd, HWND insert_after, const RECT *rectWindow
if (ret) if (ret)
{ {
struct x11drv_win_data *data = win->pDriverData;
Display *display = thread_display(); Display *display = thread_display();
/* invalidate DCEs */ /* invalidate DCEs */
...@@ -1188,16 +1196,18 @@ END: ...@@ -1188,16 +1196,18 @@ END:
*/ */
void X11DRV_MapNotify( HWND hwnd, XMapEvent *event ) void X11DRV_MapNotify( HWND hwnd, XMapEvent *event )
{ {
struct x11drv_win_data *data;
HWND hwndFocus = GetFocus(); HWND hwndFocus = GetFocus();
WND *win; WND *win;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
if (!(win = WIN_GetPtr( hwnd ))) return; if (!(win = WIN_GetPtr( hwnd ))) return;
if ((win->dwStyle & WS_VISIBLE) && if ((win->dwStyle & WS_VISIBLE) &&
(win->dwStyle & WS_MINIMIZE) && (win->dwStyle & WS_MINIMIZE) &&
(win->dwExStyle & WS_EX_MANAGED)) (win->dwExStyle & WS_EX_MANAGED))
{ {
struct x11drv_win_data *data = win->pDriverData;
int x, y; int x, y;
unsigned int width, height, border, depth; unsigned int width, height, border, depth;
Window root, top; Window root, top;
......
...@@ -553,6 +553,9 @@ inline static BOOL is_window_top_level( HWND hwnd ) ...@@ -553,6 +553,9 @@ inline static BOOL is_window_top_level( HWND hwnd )
GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow()); GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow());
} }
/* X context to associate a hwnd to an X window */
extern XContext winContext;
extern void X11DRV_SetFocus( HWND hwnd ); extern void X11DRV_SetFocus( HWND hwnd );
extern Cursor X11DRV_GetCursor( Display *display, struct tagCURSORICONINFO *ptr ); extern Cursor X11DRV_GetCursor( Display *display, struct tagCURSORICONINFO *ptr );
...@@ -560,7 +563,6 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void ...@@ -560,7 +563,6 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void
extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg ); extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg );
extern int X11DRV_check_error(void); extern int X11DRV_check_error(void);
extern void X11DRV_register_window( Display *display, HWND hwnd, struct x11drv_win_data *data );
extern void X11DRV_set_iconic_state( HWND hwnd ); extern void X11DRV_set_iconic_state( HWND hwnd );
extern void X11DRV_window_to_X_rect( HWND hwnd, RECT *rect ); extern void X11DRV_window_to_X_rect( HWND hwnd, RECT *rect );
extern void X11DRV_X_to_window_rect( HWND hwnd, RECT *rect ); extern void X11DRV_X_to_window_rect( HWND hwnd, RECT *rect );
......
...@@ -62,7 +62,6 @@ typedef struct tagWND ...@@ -62,7 +62,6 @@ typedef struct tagWND
int cbWndExtra; /* class cbWndExtra at window creation */ int cbWndExtra; /* class cbWndExtra at window creation */
int irefCount; /* window's reference count*/ int irefCount; /* window's reference count*/
DWORD userdata; /* User private data */ DWORD userdata; /* User private data */
void *pDriverData; /* Window driver data */
DWORD wExtra[1]; /* Window extra bytes */ DWORD wExtra[1]; /* Window extra bytes */
} WND; } WND;
......
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