From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/window.c | 25 +++++++++++++++++-------- dlls/winex11.drv/x11drv.h | 2 ++ dlls/winex11.drv/x11drv_main.c | 4 ++-- 3 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 99580d47623..0694611d806 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1052,6 +1052,21 @@ static void set_mwm_hints( struct x11drv_win_data *data, UINT style, UINT ex_sty }
+static void window_set_net_wm_window_type( struct x11drv_win_data *data, enum x11drv_atoms atom ) +{ + Atom old_type = data->pending_state.net_wm_window_type, new_type = X11DRV_Atoms[atom - FIRST_XATOM]; + + data->desired_state.net_wm_window_type = new_type; + if (!data->whole_window) return; /* no window or not managed, nothing to update */ + if (old_type == new_type) return; /* hints are the same, nothing to update */ + + data->pending_state.net_wm_window_type = new_type; + TRACE( "window %p/%lx, requesting _NET_WM_WINDOW_TYPE %lx (%s) serial %lu\n", data->hwnd, data->whole_window, + new_type, X11DRV_atom_names[atom - FIRST_XATOM], NextRequest( data->display ) ); + XChangeProperty( data->display, data->whole_window, x11drv_atom(_NET_WM_WINDOW_TYPE), XA_ATOM, + 32, PropModeReplace, (unsigned char *)&new_type, 1 ); +} + static void window_set_wm_hints( struct x11drv_win_data *data, const XWMHints *new_hints ) { const XWMHints *old_hints = &data->pending_state.wm_hints; @@ -1076,7 +1091,6 @@ static void set_style_hints( struct x11drv_win_data *data, DWORD style, DWORD ex HWND owner = NtUserGetWindowRelative( data->hwnd, GW_OWNER ); Window owner_win = 0; XWMHints wm_hints = {0}; - Atom window_type;
if (owner) { @@ -1095,14 +1109,9 @@ static void set_style_hints( struct x11drv_win_data *data, DWORD style, DWORD ex * dialogs owned by fullscreen windows. */ if (((style & WS_POPUP) || (ex_style & WS_EX_DLGMODALFRAME)) && owner) - window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_DIALOG); + window_set_net_wm_window_type( data, XATOM__NET_WM_WINDOW_TYPE_DIALOG ); else - window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_NORMAL); - - TRACE( "window %p/%lx requesting _NET_WM_WINDOW_TYPE %#lx, serial %lu\n", data->hwnd, - data->whole_window, window_type, NextRequest( data->display ) ); - XChangeProperty(data->display, data->whole_window, x11drv_atom(_NET_WM_WINDOW_TYPE), - XA_ATOM, 32, PropModeReplace, (unsigned char*)&window_type, 1); + window_set_net_wm_window_type( data, XATOM__NET_WM_WINDOW_TYPE_NORMAL );
wm_hints.flags = InputHint | StateHint | WindowGroupHint; wm_hints.input = !use_take_focus && !(style & WS_DISABLED); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 1a68a17119c..e7a2f679b1e 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -578,6 +578,7 @@ enum x11drv_atoms };
extern Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM]; +extern const char * const X11DRV_atom_names[]; extern Atom systray_atom; extern HWND systray_hwnd;
@@ -644,6 +645,7 @@ struct window_state UINT wm_state; BOOL activate; UINT net_wm_state; + Atom net_wm_window_type; XWMHints wm_hints; MwmHints mwm_hints; XSizeHints wm_normal_hints; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 1cbf7451c4d..33440382f45 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -102,7 +102,7 @@ static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER;
Atom X11DRV_Atoms[NB_XATOMS - FIRST_XATOM];
-static const char * const atom_names[NB_XATOMS - FIRST_XATOM] = +const char * const X11DRV_atom_names[NB_XATOMS - FIRST_XATOM] = { "CLIPBOARD", "COMPOUND_TEXT", @@ -655,7 +655,7 @@ static NTSTATUS x11drv_init( void *arg ) init_visuals( display, DefaultScreen( display )); screen_bpp = pixmap_formats[default_visual.depth]->bits_per_pixel;
- XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms ); + XInternAtoms( display, (char **)X11DRV_atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
init_win_context();