[PATCH v3] user32:Fix z order error when child window want to be topmost windows
Zebediah Figura
z.figura12 at gmail.com
Wed Jun 3 00:13:44 CDT 2020
Hello, thanks for the patch. I have some comments inlined:
> === debiant (32 bit report) ===
>
> user32:
> combo.c:698: Test failed: 00000002: got 00000080
> combo.c:704: Test failed: 00000002: got 00000080
> combo.c:698: Test failed: 00000003: got 00000080
> combo.c:704: Test failed: 00000003: got 00000080
Unfortunately I expect you'll need to debug and fix this. Fortunately,
the other errors are probably spurious...
> win.c:3042: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3042: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3042: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3048: Test succeeded inside todo block: 001000D4: expected next 000E00DE, got 000E00DE
> win.c:3048: Test succeeded inside todo block: 001000D4: expected prev 00000000, got 00000000
> win.c:3048: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3054: Test succeeded inside todo block: 001000D4: expected next 000E00DE, got 000E00DE
> win.c:3054: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3054: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3060: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3060: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3060: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3066: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3066: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3066: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3072: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3072: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3072: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3078: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3078: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3078: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3084: Test succeeded inside todo block: 001000D4: expected next 000E00DE, got 000E00DE
> win.c:3084: Test succeeded inside todo block: 001000D4: expected prev 00000000, got 00000000
> win.c:3084: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3090: Test succeeded inside todo block: 001000D4: expected next 000E00DE, got 000E00DE
> win.c:3090: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3090: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
> win.c:3096: Test succeeded inside todo block: 001000D4: expected next 00000000, got 00000000
> win.c:3096: Test succeeded inside todo block: 001000D4: expected prev 000D00D6, got 000D00D6
> win.c:3096: Test succeeded inside todo block: 001000D4: expected owner 00000000, got 00000000
If you're introducing the fix at the same time as the tests, you don't
want to use todo_wine.
That said, it's often better to split patches up, sending the tests
first and the fix second, so that you can show exactly what gets fixed.
> diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
> index b92a20df18..9c8576e07b 100644
> --- a/dlls/user32/winpos.c
> +++ b/dlls/user32/winpos.c
> @@ -1983,6 +1983,12 @@ static BOOL fixup_flags( WINDOWPOS *winpos, const RECT *old_window_rect, int par
> }
> }
>
> + if ((wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD
> + && winpos->hwndInsertAfter == HWND_TOPMOST )
> + {
> + winpos->flags |= SWP_NOZORDER;
> + }
> +
> /* Check hwndInsertAfter */
> if (winpos->flags & SWP_NOZORDER) goto done;
>
This solution seems suspicious, and is possibly even demonstrably
(in)correct:
* If SetWindowPos() seems to do nothing, does it even succeed in this
case? (I.e. what is the return value, and last error if applicable?)
* The fixed up flags are passed to WM_WINDOWPOSCHANGED. Is SWP_NOZORDER
really set?
Finally, should we add similar treatment for HWND_NOTOPMOST?
>
> --
> 2.20.1
>
More information about the wine-devel
mailing list