Problem with Multiwindow Mode and Maximizing

Earle F. Philhower III earle@ziplabel.com
Mon May 12 00:45:00 GMT 2003


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