diff -dupr a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
--- a/dlls/winex11.drv/event.c	2020-06-19 21:47:21.000000000 +0200
+++ b/dlls/winex11.drv/event.c	2020-07-02 14:24:51.597731692 +0200
@@ -1296,6 +1296,13 @@ static void handle_wm_state_notify( HWND
 
     if (data->iconic && data->wm_state == NormalState)  /* restore window */
     {
+        if (data->on_desktop) {
+             LONG exstyle = GetWindowLongW( hwnd, GWL_EXSTYLE );
+             SetWindowLongW( data->hwnd, GWL_EXSTYLE, exstyle & ~WS_EX_NOACTIVATE );
+             data->on_desktop = FALSE;
+             return;
+        }
+
         data->iconic = FALSE;
         read_net_wm_states( event->display, data );
         if ((style & WS_CAPTION) == WS_CAPTION && (data->net_wm_state & (1 << NET_WM_STATE_MAXIMIZED)))
@@ -1325,6 +1331,19 @@ static void handle_wm_state_notify( HWND
     }
     else if (!data->iconic && data->wm_state == IconicState)
     {
+        read_net_wm_states( event->display, data );
+        if (!(data->net_wm_state & (1 << NET_WM_STATE_HIDDEN)))
+        {
+             if (!data->on_desktop) {
+                 LONG exstyle = GetWindowLongW( hwnd, GWL_EXSTYLE );
+                 if (!(exstyle & WS_EX_NOACTIVATE)) {
+                     SetWindowLongW( data->hwnd, GWL_EXSTYLE, exstyle | WS_EX_NOACTIVATE );
+                     data->on_desktop = TRUE;
+                 }
+             }
+             goto done;
+        }
+
         data->iconic = TRUE;
         if ((style & WS_MINIMIZEBOX) && !(style & WS_DISABLED))
         {
         {
diff -dupr a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
--- a/dlls/winex11.drv/x11drv.h	2020-06-19 21:47:21.000000000 +0200
+++ b/dlls/winex11.drv/x11drv.h	2020-07-02 14:17:01.328287460 +0200
@@ -441,6 +441,7 @@ enum x11drv_atoms
     XATOM__NET_WM_STATE_ABOVE,
     XATOM__NET_WM_STATE_DEMANDS_ATTENTION,
     XATOM__NET_WM_STATE_FULLSCREEN,
+    XATOM__NET_WM_STATE_HIDDEN,
     XATOM__NET_WM_STATE_MAXIMIZED_HORZ,
     XATOM__NET_WM_STATE_MAXIMIZED_VERT,
     XATOM__NET_WM_STATE_SKIP_PAGER,
@@ -534,6 +535,7 @@ enum x11drv_net_wm_state
 {
     NET_WM_STATE_FULLSCREEN,
     NET_WM_STATE_ABOVE,
+    NET_WM_STATE_HIDDEN,
     NET_WM_STATE_MAXIMIZED,
     NET_WM_STATE_SKIP_PAGER,
     NET_WM_STATE_SKIP_TASKBAR,
@@ -568,6 +568,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        on_desktop : 1; /* is window on desktop? */
     BOOL        embedded : 1;   /* is window an XEMBED client? */
     BOOL        shaped : 1;     /* is window using a custom region shape? */
     BOOL        layered : 1;    /* is window layered and with valid attributes? */
diff -dupr a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
--- a/dlls/winex11.drv/x11drv_main.c	2017-09-01 19:20:52.000000000 +0200
+++ b/dlls/winex11.drv/x11drv_main.c	2017-09-15 22:55:48.064662483 +0200
@@ -143,6 +143,7 @@ static const char * const atom_names[NB_
     "_NET_WM_STATE_ABOVE",
     "_NET_WM_STATE_DEMANDS_ATTENTION",
     "_NET_WM_STATE_FULLSCREEN",
+    "_NET_WM_STATE_HIDDEN",
     "_NET_WM_STATE_MAXIMIZED_HORZ",
     "_NET_WM_STATE_MAXIMIZED_VERT",
     "_NET_WM_STATE_SKIP_PAGER",
--- a/dlls/winex11.drv/window.c	2017-09-01 19:20:52.000000000 +0200
+++ b/dlls/winex11.drv/window.c	2018-02-03 02:56:33.005720389 +0100
@@ -69,6 +69,7 @@ static const unsigned int net_wm_state_a
 {
     XATOM__NET_WM_STATE_FULLSCREEN,
     XATOM__NET_WM_STATE_ABOVE,
+    XATOM__NET_WM_STATE_HIDDEN,
     XATOM__NET_WM_STATE_MAXIMIZED_VERT,
     XATOM__NET_WM_STATE_SKIP_PAGER,
     XATOM__NET_WM_STATE_SKIP_TASKBAR
