user32: Some changes in minimizing MDI windows (bug #1719)

Dmitry Timoshkov dmitry at codeweavers.com
Wed Aug 27 08:40:09 CDT 2008


"Ilya Shpigor" <shpigor at etersoft.ru> wrote:

These all changes need separate patches with test cases along with explanations
why each of them is needed.

> --- a/dlls/user32/icontitle.c
> +++ b/dlls/user32/icontitle.c
> @@ -217,6 +217,7 @@ LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg,
>   case WM_NCHITTEST:
>        return HTCAPTION;
>   case WM_NCMOUSEMOVE:
> + case WM_NCLBUTTONDOWN:
>   case WM_NCLBUTTONDBLCLK:
>        return SendMessageW( owner, msg, wParam, lParam );

This one looks like an obvious one, but needs an explanation.

> diff --git a/dlls/user32/mdi.c b/dlls/user32/mdi.c
> index 8bffeb0..1967f0c 100644
> --- a/dlls/user32/mdi.c
> +++ b/dlls/user32/mdi.c
> @@ -1499,6 +1499,7 @@ LRESULT WINAPI DefMDIChildProcA( HWND hwnd, UINT message,
>      case WM_NEXTMENU:
>      case WM_SYSCHAR:
>      case WM_DESTROY:
> +    case WM_ICONERASEBKGND:
>          return DefMDIChildProcW( hwnd, message, wParam, lParam );
>      }
>      return DefWindowProcA(hwnd, message, wParam, lParam);
> @@ -1656,6 +1657,16 @@ LRESULT WINAPI DefMDIChildProcW( HWND hwnd, UINT message,
>          }
>          break;
>  
> +    case WM_ICONERASEBKGND:
> + {
> +     RECT rect;
> +     HDC hdc = (HDC)wParam;
> +     HBRUSH hbr = CreateSolidBrush( GetSysColor(COLOR_BTNFACE) );
> +     GetClipBox( hdc, &rect );
> +     FillRect( hdc, &rect, hbr );
> +     return 1;
> + }

Why the job done by DefWindowProc is not enough?

> --- a/dlls/user32/winpos.c
> +++ b/dlls/user32/winpos.c
> @@ -823,7 +823,7 @@ static POINT WINPOS_FindIconPos( HWND hwnd, POINT pt )
>  
>      hrgn = CreateRectRgn( 0, 0, 0, 0 );
>      tmp = CreateRectRgn( 0, 0, 0, 0 );
> -    for (child = GetWindow( parent, GW_HWNDFIRST ); child; child = GetWindow( child, GW_HWNDNEXT ))
> +    for (child = GetWindow( parent, GW_CHILD ); child; child = GetWindow( child, GW_HWNDNEXT ))
>      {
>          WND *childPtr;
>          if (child == hwnd) continue;

This change looks wrong.

> @@ -2033,6 +2033,15 @@ BOOL USER_SetWindowPos( WINDOWPOS * winpos )
>              SetForegroundWindow( winpos->hwnd );
>      }
>  
> +    /* If the window is iconic don't any 
> +     * sizing are needed. bug #1719
> +     */
> +    if( IsIconic(winpos->hwnd) )
> +    {
> + winpos->flags |= SWP_NOCLIENTSIZE;
> + winpos->flags &= ~SWP_STATECHANGED;
> +    }
> +

This requires a test case and an explanation why it's needed.

-- 
Dmitry.



More information about the wine-devel mailing list