Create an X connection for each thread, and process X events in the
thread that created the corresponding X window.
Spawn a separate thread to run the desktop message loop in desktop
mode.

diff --git a/include/x11drv.h b/include/x11drv.h
index 0006cef..ea8c479 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -19,12 +19,11 @@
 #include "winbase.h"
 #include "gdi.h"
 #include "user.h"
+#include "thread.h"
 
 #define MAX_PIXELFORMATS 8
 
 struct tagBITMAPOBJ;
-struct tagCLASS;
-struct tagCREATESTRUCTA;
 struct tagCURSORICONINFO;
 struct tagDC;
 struct tagDeviceCaps;
@@ -304,18 +303,32 @@
  * X11 USER driver
  */
 
-extern Display *display;
-extern Screen *screen;
+struct x11drv_thread_data
+{
+    Display *display;
+    HANDLE   display_fd;
+    int      process_event_count;
+};
+
+extern struct x11drv_thread_data *x11drv_init_thread_data(void);
+
+inline static struct x11drv_thread_data *x11drv_thread_data(void)
+{
+    struct x11drv_thread_data *data = NtCurrentTeb()->driver_data;
+    if (!data) data = x11drv_init_thread_data();
+    return data;
+}
+
+inline static Display *thread_display(void) { return x11drv_thread_data()->display; }
+
 extern Visual *visual;
 extern Window root_window;
 extern unsigned int screen_width;
 extern unsigned int screen_height;
 extern unsigned int screen_depth;
 
-static inline Screen *X11DRV_GetXScreen(void)    { return screen; }
 static inline Visual *X11DRV_GetVisual(void)     { return visual; }
 static inline Window X11DRV_GetXRootWindow(void) { return root_window; }
-static inline unsigned int X11DRV_GetDepth(void) { return screen_depth; }
 
 /* X11 clipboard driver */
 
@@ -332,8 +345,6 @@
 
 extern WORD X11DRV_EVENT_XStateToKeyState( int state ) ;
 
-extern void X11DRV_EVENT_Init(void);
-extern void X11DRV_EVENT_Cleanup(void);
 extern void X11DRV_Synchronize( void );
 
 typedef enum {
@@ -388,5 +399,10 @@
 extern BOOL X11DRV_WND_SetHostAttr(struct tagWND *wndPtr, INT haKey, INT value);
 
 extern void X11DRV_SetFocus( HWND hwnd );
+extern Cursor X11DRV_GetCursor( Display *display, struct tagCURSORICONINFO *ptr );
+
+extern void X11DRV_register_window( Display *display, HWND hwnd, Window win );
+extern void X11DRV_create_desktop_thread(void);
+extern Window X11DRV_create_desktop( XVisualInfo *desktop_vi, const char *geometry );
 
 #endif  /* __WINE_X11DRV_H */