winex11: Ignore the specified owner if it's a zero-size window.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 1 May 2008 15:44:56 +0000 (17:44 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 1 May 2008 16:11:26 +0000 (18:11 +0200)
Go back to not mapping zero-size windows.

dlls/winex11.drv/window.c

index ad56a7046104b9d00106ff3f144bb23a8b4498d0..81aa989e9bca1fefeef9cfa5816a6b973bfd6e3e 100644 (file)
@@ -127,6 +127,9 @@ static BOOL is_window_managed( HWND hwnd, UINT swp_flags, const RECT *window_rec
  */
 static BOOL is_window_rect_mapped( const RECT *rect )
 {
+    /* don't map if rect is empty */
+    if (IsRectEmpty( rect )) return FALSE;
+
     /* don't map if rect is off-screen */
     if (rect->left >= virtual_screen_rect.right ||
         rect->top >= virtual_screen_rect.bottom ||
@@ -152,6 +155,19 @@ static inline BOOL is_window_resizable( struct x11drv_win_data *data, DWORD styl
 }
 
 
+/***********************************************************************
+ *              get_window_owner
+ */
+static HWND get_window_owner( HWND hwnd )
+{
+    RECT rect;
+    HWND owner = GetWindow( hwnd, GW_OWNER );
+    /* ignore the zero-size owners used by Delphi apps */
+    if (owner && GetWindowRect( owner, &rect ) && IsRectEmpty( &rect )) owner = 0;
+    return owner;
+}
+
+
 /***********************************************************************
  *              get_mwm_decorations
  */
@@ -869,7 +885,7 @@ static void set_wm_hints( Display *display, struct x11drv_win_data *data )
     {
         style = GetWindowLongW( data->hwnd, GWL_STYLE );
         ex_style = GetWindowLongW( data->hwnd, GWL_EXSTYLE );
-        owner = GetWindow( data->hwnd, GW_OWNER );
+        owner = get_window_owner( data->hwnd );
     }
 
     /* transient for hint */
@@ -964,7 +980,7 @@ void update_net_wm_states( Display *display, struct x11drv_win_data *data )
         new_state |= (1 << NET_WM_STATE_ABOVE);
     if (ex_style & WS_EX_TOOLWINDOW)
         new_state |= (1 << NET_WM_STATE_SKIP_TASKBAR) | (1 << NET_WM_STATE_SKIP_PAGER);
-    if (!(ex_style & WS_EX_APPWINDOW) && GetWindow( data->hwnd, GW_OWNER ))
+    if (!(ex_style & WS_EX_APPWINDOW) && get_window_owner( data->hwnd ))
         new_state |= (1 << NET_WM_STATE_SKIP_TASKBAR);
 
     if (!data->mapped)  /* set the _NET_WM_STATE atom directly */