Problem with Multiwindow Mode and Maximizing

Harold L Hunt II huntharo@msu.edu
Mon May 12 01:27:00 GMT 2003


Earle,

Excellent.  This is certainly an improvement over the current lack of 
maximization functionality.

I am going to think about the restore functionality for a while.  Let me 
know if you come up with anything.

I will probably post a new test release sometime this week, perhaps as 
early as later tonight.

Harold

Earle F. Philhower III wrote:
> Howdy again,
> 
> At 05:42 PM 5/11/2003 -0400, you wrote:
> 
>> I looked at this and was unable to figure out what the problem is.
>> You are correct that it is a problem.
>> The window flashing is something that Windows does to help you 
>> visualize that the window is being maximized.  It occurs even when we 
>> don't do anything in our handling of the maximize message.
>> It appears that we must resize our own window when the maximize 
>> message arrives, but I can't seem to get this to work correctly.  
>> Perhaps I will look at it another day.
> 
> 
> What's going on is that Windoze sends a WM_MOVE prior to the WM_SIZE 
> when you
> maximize a window.  That WM_MOVE invoked the x-move-window function 
> which then
> merrily overrides the new window size because the drawable hasn't been 
> updated.
> Windows then sends the WM_SIZE/SIZE_MAXIMIZED but it sends the LPARAM 
> with the
> size that the WM_MOVE set, not the maximized sire.
> 
> An easy solution that I was able to get into about 10 lines is to just 
> defer
> the WM_MOVE when you see the window is maximized, and handle it in the 
> WM_SIZE
> routine.  A patch (against my earlier multiscreen file) is attached below
> that does just that.  The only problem is that when you restore the window
> the position is set to the same as where it was maximized to (0,0 on single
> monitor systems).  Any ideas appreciated, but we don't get a 
> SIZE_UNMINIMIZING
> indication so it's not just a simple matter of caching and restoring the 
> X/Y
> at some later time...
> 
> The first part just bails out of the WM_SIZE handler if it's maximized,
> and the 2nd one in WM_SIZE takes care of moving the X backing window to
> the real X/Y that the Windows window has already moved to.  That 
> Client2Screen()
> is needed to handle the case where you have >1 monitor, maximized windows
> then can be at any X/Y.
> 
> -----------8<------------
> --- winmultiwindowwindow.c      2003-05-11 17:34:28.000000000 -0700
> +++ /tmp/winmultiwindowwindow.c 2003-05-11 17:37:05.000000000 -0700
> @@ -1088,14 +1088,6 @@
>        if (pWinPriv->iX == (short) LOWORD(lParam)
>           && pWinPriv->iY == (short) HIWORD(lParam))
>         break;
> -      /* Also bail if we're maximizing, we'll do the whole thing in 
> WM_SIZE */
> -      {
> -       WINDOWPLACEMENT windPlace;
> -       windPlace.length = sizeof(WINDOWPLACEMENT);
> -       GetWindowPlacement(hwnd, &windPlace);
> -       if (windPlace.showCmd==SW_MAXIMIZE || 
> windPlace.showCmd==SW_SHOWMAXIMIZED)
> -         break;
> -      }
> 
>        /* Get new position */
>        pWinPriv->iX = (short) LOWORD(lParam);
> @@ -1233,19 +1225,6 @@
>           ErrorF ("\t(%d, %d)\n", pWinPriv->iWidth, pWinPriv->iHeight);
>  #endif
> 
> -         /* If we're maximizing the window has been moved to upper left */
> -         /* of current screen.  Now it is safe for X to know about 
> this. */
> -         if (wParam==SIZE_MAXIMIZED) {
> -           POINT home;
> -           home.x = 0;
> -           home.y = 0;
> -           ClientToScreen(hwnd, &home);
> -           /* Map from screen (-X,-Y) to (0,0) root coords */
> -           winMoveXWindow (pWin,
> -                           home.x - wBorderWidth (pWin) - 
> GetSystemMetrics(SM_XVIRTUALSCREEN),
> -                           home.y  - wBorderWidth (pWin) - 
> GetSystemMetrics(SM_YVIRTUALSCREEN));
> -         }
> -
>           winResizeXWindow (pWin,
>                            LOWORD(lParam),
>                            HIWORD(lParam));
> --------------8<-----------------------
> 
> 
> -Earle F. Philhower, III
>  earle@ziplabel.com
>  cdrlabel - ZipLabel - FlpLabel
>  http://www.cdrlabel.com



More information about the Cygwin-xfree mailing list