Alexandre Julliard : winex11: Move the support for making the owner window managed to a separate function .

Alexandre Julliard julliard at winehq.org
Fri Sep 21 14:22:39 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Sep 21 11:31:28 2012 +0200

winex11: Move the support for making the owner window managed to a separate function.

---

 dlls/winex11.drv/window.c |  111 +++++++++++++++++++++++++-------------------
 1 files changed, 63 insertions(+), 48 deletions(-)

diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 94edb81..d4f3f9b 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -160,15 +160,21 @@ struct has_popup_result
     BOOL found;
 };
 
+static BOOL is_managed( HWND hwnd )
+{
+    struct x11drv_win_data *data = get_win_data( hwnd );
+    BOOL ret = data && data->managed;
+    release_win_data( data );
+    return ret;
+}
+
 static BOOL CALLBACK has_managed_popup( HWND hwnd, LPARAM lparam )
 {
     struct has_popup_result *result = (struct has_popup_result *)lparam;
-    struct x11drv_win_data *data;
 
     if (hwnd == result->hwnd) return FALSE;  /* popups are always above owner */
-    if (!(data = X11DRV_get_win_data( hwnd ))) return TRUE;
     if (GetWindow( hwnd, GW_OWNER ) != result->hwnd) return TRUE;
-    result->found = data->managed;
+    result->found = is_managed( hwnd );
     return !result->found;
 }
 
@@ -733,6 +739,46 @@ static void set_mwm_hints( Display *display, struct x11drv_win_data *data, DWORD
 
 
 /***********************************************************************
+ *              set_style_hints
+ */
+static void set_style_hints( Display *display, struct x11drv_win_data *data, DWORD style, DWORD ex_style )
+{
+    Window group_leader = data->whole_window;
+    HWND owner = GetWindow( data->hwnd, GW_OWNER );
+    Window owner_win = X11DRV_get_whole_window( owner );
+    Atom window_type;
+
+    if (owner_win)
+    {
+        XSetTransientForHint( display, data->whole_window, owner_win );
+        group_leader = owner_win;
+    }
+
+    /* Only use dialog type for owned popups. Metacity allows making fullscreen
+     * only normal windows, and doesn't handle correctly TRANSIENT_FOR hint for
+     * dialogs owned by fullscreen windows.
+     */
+    if (((style & WS_POPUP) || (ex_style & WS_EX_DLGMODALFRAME)) && owner)
+        window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_DIALOG);
+    else
+        window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_NORMAL);
+
+    XChangeProperty(display, data->whole_window, x11drv_atom(_NET_WM_WINDOW_TYPE),
+		    XA_ATOM, 32, PropModeReplace, (unsigned char*)&window_type, 1);
+
+    /* wm hints */
+    if (data->wm_hints)
+    {
+        data->wm_hints->flags |= InputHint | StateHint | WindowGroupHint;
+        data->wm_hints->input = !use_take_focus && !(style & WS_DISABLED);
+        data->wm_hints->initial_state = (style & WS_MINIMIZE) ? IconicState : NormalState;
+        data->wm_hints->window_group = group_leader;
+        XSetWMHints( display, data->whole_window, data->wm_hints );
+    }
+}
+
+
+/***********************************************************************
  *              get_process_name
  *
  * get the name of the current process for setting class hints
@@ -823,83 +869,50 @@ static void set_initial_wm_hints( HWND hwnd )
 
 
 /***********************************************************************
- *              get_owner_whole_window
+ *              make_owner_managed
  *
- * Retrieve an owner's window, creating it if necessary.
+ * If the window is managed, make sure its owner window is too.
  */
-static Window get_owner_whole_window( HWND owner, BOOL force_managed )
+static void make_owner_managed( HWND hwnd )
 {
-    struct x11drv_win_data *data;
-
-    if (!owner) return 0;
+    HWND owner;
 
-    if (!(data = X11DRV_get_win_data( owner ))) return (Window)GetPropA( owner, whole_window_prop );
+    if (!(owner = GetWindow( hwnd, GW_OWNER ))) return;
+    if (is_managed( owner )) return;
+    if (!is_managed( hwnd )) return;
 
-    if (!data->managed && force_managed)  /* make it managed */
-    {
-        SetWindowPos( owner, 0, 0, 0, 0, 0,
-                      SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
-                      SWP_NOREDRAW | SWP_DEFERERASE | SWP_NOSENDCHANGING | SWP_STATECHANGED );
-    }
-    return data->whole_window;
+    SetWindowPos( owner, 0, 0, 0, 0, 0,
+                  SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
+                  SWP_NOREDRAW | SWP_DEFERERASE | SWP_NOSENDCHANGING | SWP_STATECHANGED );
 }
 
 
 /***********************************************************************
  *              set_wm_hints
  *
- * Set the window manager hints for a newly-created window
+ * Set all the window manager hints for a window.
  */
 static void set_wm_hints( HWND hwnd )
 {
     Display *display = thread_display();
     struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
-    Window group_leader = data->whole_window;
-    Window owner_win = 0;
-    Atom window_type;
     DWORD style, ex_style;
-    HWND owner;
 
     if (hwnd == GetDesktopWindow())
     {
         /* force some styles for the desktop to get the correct decorations */
         style = WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
         ex_style = WS_EX_APPWINDOW;
-        owner = 0;
     }
     else
     {
         style = GetWindowLongW( hwnd, GWL_STYLE );
         ex_style = GetWindowLongW( hwnd, GWL_EXSTYLE );
-        owner = GetWindow( hwnd, GW_OWNER );
-        if ((owner_win = get_owner_whole_window( owner, data->managed ))) group_leader = owner_win;
     }
 
-    if (owner_win) XSetTransientForHint( display, data->whole_window, owner_win );
-
-    /* size hints */
     set_size_hints( display, data, style );
     set_mwm_hints( display, data, style, ex_style );
-
-    /* Only use dialog type for owned popups. Metacity allows making fullscreen
-     * only normal windows, and doesn't handle correctly TRANSIENT_FOR hint for
-     * dialogs owned by fullscreen windows.
-     */
-    if (((style & WS_POPUP) || (ex_style & WS_EX_DLGMODALFRAME)) && owner) window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_DIALOG);
-    else window_type = x11drv_atom(_NET_WM_WINDOW_TYPE_NORMAL);
-
-    XChangeProperty(display, data->whole_window, x11drv_atom(_NET_WM_WINDOW_TYPE),
-		    XA_ATOM, 32, PropModeReplace, (unsigned char*)&window_type, 1);
-
-    /* wm hints */
-    if (data->wm_hints)
-    {
-        data->wm_hints->flags |= InputHint | StateHint | WindowGroupHint;
-        data->wm_hints->input = !use_take_focus && !(style & WS_DISABLED);
-        data->wm_hints->initial_state = (style & WS_MINIMIZE) ? IconicState : NormalState;
-        data->wm_hints->window_group = group_leader;
-        XSetWMHints( display, data->whole_window, data->wm_hints );
-    }
+    set_style_hints( display, data, style, ex_style );
 }
 
 
@@ -2157,6 +2170,8 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags
     if ((new_style & WS_VISIBLE) &&
         ((new_style & WS_MINIMIZE) || is_window_rect_mapped( rectWindow )))
     {
+        if (!data->mapped) make_owner_managed( hwnd );
+
         if (!data->mapped || (swp_flags & (SWP_FRAMECHANGED|SWP_STATECHANGED))) set_wm_hints( hwnd );
 
         if (!data->mapped)




More information about the wine-cvs mailing list