]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #14032 with restoring frame dimensions on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Sat, 23 Mar 2013 09:01:14 +0000 (11:01 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 23 Mar 2013 09:01:14 +0000 (11:01 +0200)
 src/w32term.c (w32fullscreen_hook): Record last value of the frame's
 'fullscreen' parameter.  Always record previous width and height
 of the frame, except when switching out of maximized modes, so
 that they could be restored correctly, instead of resetting to the
 default frame dimensions.  Send SC_RESTORE command to the frame,
 unless we are going to send SC_MAXIMIZE, to restore the frame
 resize hints in the mouse pointer shown by the window manager.
 src/frame.c (get_frame_param): Now extern for WINDOWSNT as well.
 src/lisp.h (get_frame_param): Adjust conditions for prototype
 declaration.

src/ChangeLog
src/frame.c
src/lisp.h
src/w32term.c

index a118678dba9ec6143590e3abc3154d235344f8a5..c60ff058e9d01dcb04e963eb7bd34b676d38eb37 100644 (file)
@@ -1,3 +1,19 @@
+2013-03-23  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32term.c (w32fullscreen_hook): Record last value of the frame's
+       'fullscreen' parameter.  Always record previous width and height
+       of the frame, except when switching out of maximized modes, so
+       that they could be restored correctly, instead of resetting to the
+       default frame dimensions.  Send SC_RESTORE command to the frame,
+       unless we are going to send SC_MAXIMIZE, to restore the frame
+       resize hints in the mouse pointer shown by the window manager.
+       (Bug#14032)
+
+       * frame.c (get_frame_param): Now extern for WINDOWSNT as well.
+
+       * lisp.h (get_frame_param): Adjust conditions for prototype
+       declaration.
+
 2013-03-22  Ken Brown  <kbrown@cornell.edu>
 
        * unexcw.c: Drop unneeded inclusion of w32common.h.
index 2ed2c5a277128a064ec12c97ff5e6111381e9693..615b31c978da4e7c1bf61f3f6ad9f4e916501764 100644 (file)
@@ -1819,7 +1819,7 @@ See `redirect-frame-focus'.  */)
 /* Return the value of frame parameter PROP in frame FRAME.  */
 
 #ifdef HAVE_WINDOW_SYSTEM
-#if !HAVE_NS
+#if !HAVE_NS && !defined(WINDOWSNT)
 static
 #endif
 Lisp_Object
index 6838d4a93cbbccee396107fb5a38a8569af65f46..467710f52f49ec864e9859f4ee25bfa9901189d5 100644 (file)
@@ -3511,7 +3511,7 @@ extern Lisp_Object Qvisible;
 extern void store_frame_param (struct frame *, Lisp_Object, Lisp_Object);
 extern void store_in_alist (Lisp_Object *, Lisp_Object, Lisp_Object);
 extern Lisp_Object do_switch_frame (Lisp_Object, int, int, Lisp_Object);
-#if HAVE_NS
+#if HAVE_NS || defined(WINDOWSNT)
 extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
 #endif
 extern void frames_discard_buffer (Lisp_Object);
index 989ceb0f84770c12c9711e6f21f6411fda28e3ba..3fe16b956bdee6e212d3f2ad52853182858b0b35 100644 (file)
@@ -5661,6 +5661,7 @@ static void
 w32fullscreen_hook (FRAME_PTR f)
 {
   static int normal_width, normal_height;
+  static Lisp_Object prev_full;
 
   if (FRAME_VISIBLE_P (f))
     {
@@ -5669,23 +5670,39 @@ w32fullscreen_hook (FRAME_PTR f)
       RECT workarea_rect;
 
       block_input ();
-      if (normal_height <= 0)
-       normal_height = cur_h;
-      if (normal_width <= 0)
-       normal_width = cur_w;
+      if (!(   EQ (prev_full, Qfullscreen)
+           || EQ (prev_full, Qfullboth)
+           || EQ (prev_full, Qmaximized)))
+       {
+         if (!EQ (prev_full, Qfullheight))
+           normal_height = cur_h;
+         if (!EQ (prev_full, Qfullwidth))
+           normal_width  = cur_w;
+       }
+      eassert (normal_height > 0);
+      eassert (normal_width > 0);
       x_real_positions (f, &f->left_pos, &f->top_pos);
       x_fullscreen_adjust (f, &width, &height, &top_pos, &left_pos);
 
       SystemParametersInfo (SPI_GETWORKAREA, 0, &workarea_rect, 0);
       pixel_height = workarea_rect.bottom - workarea_rect.top;
       pixel_width  = workarea_rect.right  - workarea_rect.left;
+      /* Need to send SC_RESTORE to the window, in case we are
+        resizing from FULLSCREEN_MAXIMIZED.  Otherwise, the mouse
+        resize hints will not be shown by the window manager when the
+        mouse pointer hovers over the window edges, becaise the WM
+        will still think the window is maximized.  */
+      if (f->want_fullscreen != FULLSCREEN_BOTH)
+       PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_RESTORE, 0);
 
       switch (f->want_fullscreen)
        {
        case FULLSCREEN_BOTH:
+         prev_full = Qfullboth;
          PostMessage (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MAXIMIZE, 0);
          break;
        case FULLSCREEN_MAXIMIZED:
+         prev_full = Qmaximized;
          height =
            FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixel_height)
            - XINT (Ftool_bar_lines_needed (selected_frame))
@@ -5697,31 +5714,26 @@ w32fullscreen_hook (FRAME_PTR f)
          top_pos = workarea_rect.top;
          break;
        case FULLSCREEN_WIDTH:
+         prev_full = Qfullwidth;
          width  =
            FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixel_width)
            - FRAME_SCROLL_BAR_COLS (f);
-         if (normal_height > 0)
-           height = normal_height;
+         height = normal_height;
          left_pos = workarea_rect.left;
          break;
        case FULLSCREEN_HEIGHT:
+         prev_full = Qfullheight;
          height =
            FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, pixel_height)
            - XINT (Ftool_bar_lines_needed (selected_frame))
            + (NILP (Vmenu_bar_mode) ? 1 : 0);
-         if (normal_width > 0)
-           width = normal_width;
+         width = normal_width;
          top_pos = workarea_rect.top;
          break;
        case FULLSCREEN_NONE:
-         if (normal_height > 0)
-           height = normal_height;
-         else
-           normal_height = height;
-         if (normal_width > 0)
-           width = normal_width;
-         else
-           normal_width = width;
+         prev_full = Qnil;
+         height = normal_height;
+         width = normal_width;
          /* FIXME: Should restore the original position of the frame.  */
          top_pos = left_pos = 0;
          break;