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