emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Improved patch to fix frame positioning bug on Windows


From: Francis Litterio
Subject: Re: Improved patch to fix frame positioning bug on Windows
Date: Thu, 13 Jan 2005 12:59:04 -0500
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/21.3.50 (windows-nt)

Francis Litterio wrote:

> -      real_w = min (real_w, s->gc->clip_rectangle.right
> +      real_w = min (real_w, s->gc->clip_rectangle.r ght

Ugh.  How did _that_ get in there?  Here's a correct version of the
patch.  Sorry for the confusion.
--
Francis Litterio
franl <at> world . std . com


--- src/ChangeLog       10 Jan 2005 08:29:50 -0500      1.4147
+++ src/ChangeLog       13 Jan 2005 12:39:35 -0500      
@@ -1,3 +1,10 @@
+2005-01-13  Francis Litterio  <address@hidden>
+
+       * w32term.c (x_calc_absolute_position): Changed function
+       x_calc_absolute_position() to account for the Windows-drawn
+       borders around a frame when converting a negative 'top or 'left
+       parameter into the equivalent positive value.
+
 2005-01-10  Kim F. Storm  <address@hidden>
 
        * dispextern.h (merge_faces): Rename from merge_into_realized_face.


--- src/w32term.c       03 Jan 2005 17:52:51 -0500      1.221
+++ src/w32term.c       13 Jan 2005 12:55:19 -0500      
@@ -5376,17 +5376,58 @@
 {
   int flags = f->size_hint_flags;
 
-  /* Treat negative positions as relative to the leftmost bottommost
+  /* left_right_borders_width holds the sum of the widths of the frame's left
+     and right borders (in pixels) drawn by Windows. */
+
+  unsigned int left_right_borders_width = 8;   /* A sensible default value. */
+
+  /* top_bottom_borders_height holds the sum of the heights of the frame's top 
and
+     bottom borders (in pixels) drawn by Windows. */
+
+  unsigned int top_bottom_borders_height = 32;  /* A sensible default value. */
+
+  /* Now obtain the actual values of the above two variables.  If we fail to
+     obtain the actual values, we will use the defaults assigned above.  We 
compute
+     the border width (height) by subtracting the width (height) of the frame's
+     client area from the width (height) of the frame's entire window.
+  */
+
+  WINDOWPLACEMENT wp = { 0 };
+
+  BOOL status = GetWindowPlacement (FRAME_W32_WINDOW (f), &wp);
+
+  if (status != FALSE)
+  {
+      RECT client_rect = { 0 };
+
+      status = GetClientRect (FRAME_W32_WINDOW (f), &client_rect);
+
+      if (status != FALSE)
+      {
+         left_right_borders_width =
+             (wp.rcNormalPosition.right - wp.rcNormalPosition.left) -
+             (client_rect.right - client_rect.left);
+
+         top_bottom_borders_height =
+             (wp.rcNormalPosition.bottom - wp.rcNormalPosition.top) -
+             (client_rect.bottom - client_rect.top);
+      }
+  }
+
+  /* Treat negative positions as relative to the rightmost bottommost
      position that fits on the screen.  */
   if (flags & XNegative)
     f->left_pos = (FRAME_W32_DISPLAY_INFO (f)->width
                   - FRAME_PIXEL_WIDTH (f)
-                  + f->left_pos);
+                  + f->left_pos
+                  - (left_right_borders_width - 1));
 
   if (flags & YNegative)
     f->top_pos = (FRAME_W32_DISPLAY_INFO (f)->height
                  - FRAME_PIXEL_HEIGHT (f)
-                 + f->top_pos);
+                 + f->top_pos
+                  - (top_bottom_borders_height - 1));
+
   /* The left_pos and top_pos
      are now relative to the top and left screen edges,
      so the flags should correspond.  */





reply via email to

[Prev in Thread] Current Thread [Next in Thread]