Alexandre Julliard : winex11: Explicitly request creation of the per-thread data where necessary.
Alexandre Julliard
julliard at winehq.org
Thu Jun 26 14:50:11 CDT 2008
Module: wine
Branch: master
Commit: 06a1407c13aabd577ef2b1a8a4387aa92b5ddd58
URL: http://source.winehq.org/git/wine.git/?a=commit;h=06a1407c13aabd577ef2b1a8a4387aa92b5ddd58
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jun 26 15:08:08 2008 +0200
winex11: Explicitly request creation of the per-thread data where necessary.
---
dlls/winex11.drv/clipboard.c | 7 ++++---
dlls/winex11.drv/mouse.c | 2 +-
dlls/winex11.drv/window.c | 17 ++++++++++-------
dlls/winex11.drv/wintab.c | 4 ++--
dlls/winex11.drv/x11ddraw.c | 2 ++
dlls/winex11.drv/x11drv.h | 6 ++----
dlls/winex11.drv/x11drv_main.c | 4 +++-
7 files changed, 24 insertions(+), 18 deletions(-)
diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index af5ff9d..3675527 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -317,7 +317,8 @@ static UINT wSeqNo = 0;
static Window thread_selection_wnd(void)
{
- Window w = x11drv_thread_data()->selection_wnd;
+ struct x11drv_thread_data *thread_data = x11drv_init_thread_data();
+ Window w = thread_data->selection_wnd;
if (!w)
{
@@ -327,12 +328,12 @@ static Window thread_selection_wnd(void)
ButtonPressMask | ButtonReleaseMask | EnterWindowMask);
wine_tsx11_lock();
- w = XCreateWindow(thread_display(), root_window, 0, 0, 1, 1, 0, screen_depth,
+ w = XCreateWindow(thread_data->display, root_window, 0, 0, 1, 1, 0, screen_depth,
InputOutput, CopyFromParent, CWEventMask, &attr);
wine_tsx11_unlock();
if (w)
- x11drv_thread_data()->selection_wnd = w;
+ thread_data->selection_wnd = w;
else
FIXME("Failed to create window. Fetching selection data will fail.\n");
}
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 354f74c..0d4aa5f 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -918,7 +918,7 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
*/
void X11DRV_SetCursor( CURSORICONINFO *lpCursor )
{
- struct x11drv_thread_data *data = x11drv_thread_data();
+ struct x11drv_thread_data *data = x11drv_init_thread_data();
Cursor cursor;
if (lpCursor)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 26f037a..22de5ca 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1487,7 +1487,6 @@ void X11DRV_SetWindowStyle( HWND hwnd, DWORD old_style )
void X11DRV_DestroyWindow( HWND hwnd )
{
struct x11drv_thread_data *thread_data = x11drv_thread_data();
- Display *display = thread_data->display;
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data( hwnd ))) return;
@@ -1506,13 +1505,13 @@ void X11DRV_DestroyWindow( HWND hwnd )
wine_tsx11_unlock();
}
- destroy_whole_window( display, data, FALSE );
- destroy_icon_window( display, data );
+ destroy_whole_window( thread_data->display, data, FALSE );
+ destroy_icon_window( thread_data->display, data );
if (data->colormap)
{
wine_tsx11_lock();
- XFreeColormap( display, data->colormap );
+ XFreeColormap( thread_data->display, data->colormap );
wine_tsx11_unlock();
}
@@ -1520,7 +1519,7 @@ void X11DRV_DestroyWindow( HWND hwnd )
if (data->hWMIconBitmap) DeleteObject( data->hWMIconBitmap );
if (data->hWMIconMask) DeleteObject( data->hWMIconMask);
wine_tsx11_lock();
- XDeleteContext( display, (XID)hwnd, win_data_context );
+ XDeleteContext( thread_data->display, (XID)hwnd, win_data_context );
wine_tsx11_unlock();
HeapFree( GetProcessHeap(), 0, data );
}
@@ -1638,9 +1637,12 @@ BOOL X11DRV_CreateWindow( HWND hwnd )
*/
struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd )
{
+ struct x11drv_thread_data *thread_data = x11drv_thread_data();
char *data;
- if (!hwnd || XFindContext( thread_display(), (XID)hwnd, win_data_context, &data )) data = NULL;
+ if (!thread_data) return NULL;
+ if (!hwnd) return NULL;
+ if (XFindContext( thread_data->display, (XID)hwnd, win_data_context, &data )) data = NULL;
return (struct x11drv_win_data *)data;
}
@@ -1813,6 +1815,7 @@ void X11DRV_SetCapture( HWND hwnd, UINT flags )
{
struct x11drv_thread_data *thread_data = x11drv_thread_data();
+ if (!thread_data) return;
if (!(flags & (GUI_INMOVESIZE | GUI_INMENUMODE))) return;
if (hwnd)
@@ -1924,7 +1927,7 @@ void X11DRV_SetWindowPos( HWND hwnd, HWND insert_after, UINT swp_flags,
const RECT *rectWindow, const RECT *rectClient,
const RECT *visible_rect, const RECT *valid_rects )
{
- struct x11drv_thread_data *thread_data = x11drv_thread_data();
+ struct x11drv_thread_data *thread_data = x11drv_init_thread_data();
Display *display = thread_data->display;
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
DWORD new_style = GetWindowLongW( hwnd, GWL_STYLE );
diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index ed04ad5..e73f000 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -490,7 +490,7 @@ void X11DRV_LoadTabletInfo(HWND hwnddefault)
const WCHAR SZ_DEVICE_NAME[] = {'W','i','n','e',' ','T','a','b','l','e','t',' ','D','e','v','i','c','e',0};
const WCHAR SZ_NON_PLUGINPLAY[] = {'n','o','n','-','p','l','u','g','i','n','p','l','a','y',0};
- struct x11drv_thread_data *data = x11drv_thread_data();
+ struct x11drv_thread_data *data = x11drv_init_thread_data();
int num_devices;
int loop;
XDeviceInfo *devices;
@@ -961,7 +961,7 @@ static void proximity_event( HWND hwnd, XEvent *event )
*/
int X11DRV_AttachEventQueueToTablet(HWND hOwner)
{
- struct x11drv_thread_data *data = x11drv_thread_data();
+ struct x11drv_thread_data *data = x11drv_init_thread_data();
int num_devices;
int loop;
int cur_loop;
diff --git a/dlls/winex11.drv/x11ddraw.c b/dlls/winex11.drv/x11ddraw.c
index e0bda0a..e618618 100644
--- a/dlls/winex11.drv/x11ddraw.c
+++ b/dlls/winex11.drv/x11ddraw.c
@@ -77,6 +77,8 @@ static LRESULT WINAPI GrabWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
TRACE("hwnd=%p, grab=%ld\n", hWnd, wParam);
+ if (!data) return 0;
+
if (wParam)
{
/* find the X11 window that ddraw uses */
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 3bfe118..cfcfba4 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -522,12 +522,10 @@ extern DWORD thread_data_tls_index;
static inline struct x11drv_thread_data *x11drv_thread_data(void)
{
- struct x11drv_thread_data *data = TlsGetValue( thread_data_tls_index );
- if (!data) data = x11drv_init_thread_data();
- return data;
+ return TlsGetValue( thread_data_tls_index );
}
-static inline Display *thread_display(void) { return x11drv_thread_data()->display; }
+static inline Display *thread_display(void) { return x11drv_init_thread_data()->display; }
static inline size_t get_property_size( int format, unsigned long count )
{
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 4ca1bb6..75b9bd9 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -616,7 +616,9 @@ static void set_queue_display_fd( Display *display )
*/
struct x11drv_thread_data *x11drv_init_thread_data(void)
{
- struct x11drv_thread_data *data;
+ struct x11drv_thread_data *data = x11drv_thread_data();
+
+ if (data) return data;
if (!(data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) )))
{
More information about the wine-cvs
mailing list