Alexandre Julliard : winex11: Add some generic support for XEMBED client windows.

Alexandre Julliard julliard at winehq.org
Wed Apr 9 14:31:20 CDT 2008


Module: wine
Branch: master
Commit: a0ac99c5360a0d65400f974a3143cddf517db014
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a0ac99c5360a0d65400f974a3143cddf517db014

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr  9 15:46:33 2008 +0200

winex11: Add some generic support for XEMBED client windows.

---

 dlls/winex11.drv/systray.c |   18 +----------
 dlls/winex11.drv/winpos.c  |   71 +++++++++++++++++++++++++++++++++++++-------
 dlls/winex11.drv/x11drv.h  |    4 ++
 3 files changed, 66 insertions(+), 27 deletions(-)

diff --git a/dlls/winex11.drv/systray.c b/dlls/winex11.drv/systray.c
index 347e5a7..25d0e60 100644
--- a/dlls/winex11.drv/systray.c
+++ b/dlls/winex11.drv/systray.c
@@ -69,8 +69,6 @@ static BOOL delete_icon( struct tray_icon *icon );
 #define SYSTEM_TRAY_BEGIN_MESSAGE   1
 #define SYSTEM_TRAY_CANCEL_MESSAGE  2
 
-#define XEMBED_MAPPED  (1 << 0)
-
 #define ICON_BORDER 2
 
 /* retrieves icon record by owner window and ID */
@@ -228,23 +226,13 @@ static void dock_systray_window( HWND hwnd, Window systray_window )
     struct x11drv_win_data *data;
     XEvent ev;
     XSetWindowAttributes attr;
-    unsigned long info[2];
 
     if (!(data = X11DRV_get_win_data( hwnd )) &&
         !(data = X11DRV_create_win_data( hwnd ))) return;
 
     TRACE( "icon window %p/%lx managed %u\n", data->hwnd, data->whole_window, data->managed );
 
-    /* the window _cannot_ be mapped if we intend to dock with an XEMBED tray */
-    assert( !data->mapped );
-
-    /* set XEMBED protocol data on the window */
-    info[0] = 0; /* protocol version */
-    info[1] = XEMBED_MAPPED;  /* flags */
-
-    wine_tsx11_lock();
-    XChangeProperty( display, data->whole_window, x11drv_atom(_XEMBED_INFO),
-                     x11drv_atom(_XEMBED_INFO), 32, PropModeReplace, (unsigned char*)info, 2 );
+    make_window_embedded( display, data );
 
     /* send the docking request message */
     ev.xclient.type = ClientMessage;
@@ -256,15 +244,13 @@ static void dock_systray_window( HWND hwnd, Window systray_window )
     ev.xclient.data.l[2] = data->whole_window;
     ev.xclient.data.l[3] = 0;
     ev.xclient.data.l[4] = 0;
+    wine_tsx11_lock();
     XSendEvent( display, systray_window, False, NoEventMask, &ev );
     attr.background_pixmap = ParentRelative;
     attr.bit_gravity = ForgetGravity;
     XChangeWindowAttributes( display, data->whole_window, CWBackPixmap | CWBitGravity, &attr );
     XChangeWindowAttributes( display, data->client_window, CWBackPixmap | CWBitGravity, &attr );
     wine_tsx11_unlock();
-
-    data->mapped = TRUE;
-    data->wm_state = NormalState;
 }
 
 
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index 9314027..2ae0aba 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -205,18 +205,41 @@ static void update_net_wm_states( Display *display, struct x11drv_win_data *data
 
 
 /***********************************************************************
+ *     set_xembed_flags
+ */
+static void set_xembed_flags( Display *display, struct x11drv_win_data *data, unsigned long flags )
+{
+    unsigned long info[2];
+
+    info[0] = 0; /* protocol version */
+    info[1] = flags;
+    wine_tsx11_lock();
+    XChangeProperty( display, data->whole_window, x11drv_atom(_XEMBED_INFO),
+                     x11drv_atom(_XEMBED_INFO), 32, PropModeReplace, (unsigned char*)info, 2 );
+    wine_tsx11_unlock();
+}
+
+
+/***********************************************************************
  *     map_window
  */
 static void map_window( Display *display, struct x11drv_win_data *data, DWORD new_style )
 {
     TRACE( "win %p/%lx\n", data->hwnd, data->whole_window );
+
     wait_for_withdrawn_state( display, data, TRUE );
-    update_net_wm_states( display, data );
-    X11DRV_sync_window_style( display, data );
-    wine_tsx11_lock();
-    XMapWindow( display, data->whole_window );
-    XFlush( display );
-    wine_tsx11_unlock();
+
+    if (!data->embedded)
+    {
+        update_net_wm_states( display, data );
+        X11DRV_sync_window_style( display, data );
+        wine_tsx11_lock();
+        XMapWindow( display, data->whole_window );
+        XFlush( display );
+        wine_tsx11_unlock();
+    }
+    else set_xembed_flags( display, data, XEMBED_MAPPED );
+
     data->mapped = TRUE;
     data->iconic = (new_style & WS_MINIMIZE) != 0;
 }
@@ -228,17 +251,43 @@ static void map_window( Display *display, struct x11drv_win_data *data, DWORD ne
 static void unmap_window( Display *display, struct x11drv_win_data *data )
 {
     TRACE( "win %p/%lx\n", data->hwnd, data->whole_window );
-    wait_for_withdrawn_state( display, data, FALSE );
-    wine_tsx11_lock();
-    if (data->managed) XWithdrawWindow( display, data->whole_window, DefaultScreen(display) );
-    else XUnmapWindow( display, data->whole_window );
-    wine_tsx11_unlock();
+
+    if (!data->embedded)
+    {
+        wait_for_withdrawn_state( display, data, FALSE );
+        wine_tsx11_lock();
+        if (data->managed) XWithdrawWindow( display, data->whole_window, DefaultScreen(display) );
+        else XUnmapWindow( display, data->whole_window );
+        wine_tsx11_unlock();
+    }
+    else set_xembed_flags( display, data, 0 );
+
     data->mapped = FALSE;
     data->net_wm_state = 0;
 }
 
 
 /***********************************************************************
+ *     make_window_embedded
+ */
+void make_window_embedded( Display *display, struct x11drv_win_data *data )
+{
+    if (data->mapped)
+    {
+        /* the window cannot be mapped before being embedded */
+        unmap_window( display, data );
+        data->embedded = TRUE;
+        map_window( display, data, 0 );
+    }
+    else
+    {
+        data->embedded = TRUE;
+        set_xembed_flags( display, data, 0 );
+    }
+}
+
+
+/***********************************************************************
  *		SetWindowStyle   (X11DRV.@)
  *
  * Update the X state of a window to reflect a style change
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 14cb889..20dd91c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -695,6 +695,7 @@ struct x11drv_win_data
     BOOL        managed : 1;    /* is window managed? */
     BOOL        mapped : 1;     /* is window mapped? (in either normal or iconic state) */
     BOOL        iconic : 1;     /* is window in iconic state? */
+    BOOL        embedded : 1;   /* is window an XEMBED client? */
     int         wm_state;       /* current value of the WM_STATE property */
     DWORD       net_wm_state;   /* bit mask of active x11drv_net_wm_state values */
     HBITMAP     hWMIconBitmap;
@@ -717,6 +718,7 @@ extern void flush_gl_drawable( X11DRV_PDEVICE *physDev );
 
 extern int get_window_wm_state( Display *display, struct x11drv_win_data *data );
 extern void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data, BOOL set );
+extern void make_window_embedded( Display *display, struct x11drv_win_data *data );
 
 /* X context to associate a hwnd to an X window */
 extern XContext winContext;
@@ -773,4 +775,6 @@ extern void X11DRV_DDHAL_SwitchMode(DWORD dwModeIndex, LPVOID fb_addr, LPVIDMEM
 extern LRESULT HOOK_CallHooks( INT id, INT code, WPARAM wparam, LPARAM lparam, BOOL unicode );
 extern void WIN_invalidate_dce( HWND hwnd, const RECT *rect );
 
+#define XEMBED_MAPPED  (1 << 0)
+
 #endif  /* __WINE_X11DRV_H */




More information about the wine-cvs mailing list