Subject: bug#25542: 25.1; Restoring the frame from fullscreen to maximized

From: martin rudalics <[email-masked]>
Date: Fri, 27 Jan 2017 14:47:40 +0100

> ** Before step 2 (i.e. just after maximizing the frame with the mouse):
 >
 > ((outer-position 54 . -8) (outer-size 1554 . 916)

54 because the frame's left outer edge is by external-border-size
pixels left of the taskbar's right end which according to

 > LEFT:
 > (((geometry 0 0 1600 900) (workarea 62 0 1538 900) (mm-size 443 249)
 > (name . "\\\\.\\DISPLAY1") (frames #<frame emacs@CPX-L6Q03C31DOX
 > 0x10100bc30>)))

is at 62.  -8 because the frame's top edge is by external-border-size
pixels above the display.

 > (external-border-size 8 . 8) (title-bar-size 1516 . 23)
 > (menu-bar-external . t) (menu-bar-size 1538 . 20) (tool-bar-external)
 > (tool-bar-position . top) (tool-bar-size 1554 . 36)
 > (internal-border-width . 0))
 >
 > ** After step 3 (i.e. just after pressing F11 a second time)
 >
 > ((outer-position 192 . 130) (outer-size 689 . 671)
 > (external-border-size 8 . 8) (title-bar-size 651 . 23)
 > (menu-bar-external . t) (menu-bar-size 673 . 20) (tool-bar-external)
 > (tool-bar-position . top) (tool-bar-size 689 . 36)
 > (internal-border-width . 0))

All these values are consistent now and indicate that the frame has
returned to its normal state after step 3.

 > These values (after final step) are the same I get at the very
 > beginning (just after "emacs -Q").

Everything seems clear - the bug is all mine.  Windows just told us that
the frame was maximized but the simple hack in w32.term.c

		case SIZE_MAXIMIZED:
		  ...
		  /* Windows can send us a SIZE_MAXIMIZED message even
		     when fullscreen is fullboth.  The following is a
		     simple hack to check that based on the fact that
		     only a maximized fullscreen frame should have both
		     top/left outside the screen.  */
		  if (EQ (fullscreen, Qfullwidth) || EQ (fullscreen, Qfullheight)
		      || NILP (fullscreen))
		      {
			int x, y;

			x_real_positions (f, &x, &y);
			if (x < 0 && y < 0)
			  store_frame_param (f, Qfullscreen, Qmaximized);
		      }

fails becaue either x (in your case) or y (in the taskbar at top case)
are greater zero.  (I boldly assume that NILP (fullscreen) held, maybe
Noam can verify - I never move my taskbar.)  I could replace

			if (x < 0 && y < 0)
			
with

			if (x < 0 || y < 0)

to handle the two cases but that check appears downright silly and will
fail anyway for border-less, maximized frames.  I must devise something
better.

Thanks for all the information you sent, martin