emacs-pretest-bug
[Top][All Lists]
Advanced

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

Re: frame position is too low with negative `top'


From: Francis Litterio
Subject: Re: frame position is too low with negative `top'
Date: Wed, 18 May 2005 13:26:04 -0400
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (windows-nt)

Drew Adams wrote:

> I don't mean to pester folks about this bug, but I'd like to know whether
> someone intends to fix this. If not, I'll just hack my local code to raise
> the frame 44 pixels or so, for now.

Drew,

I've been running with the below patch for some time with no ill
effects (under Windows XP).  Does this help your situation?

I submitted this patch some time ago, but RMS was reluctant to take it
until after I've signed my copyright assigment form (which I have now
down).
--
Francis Litterio
franl <at> world . std . com


diff -u -w -r1.224 w32term.c
--- w32term.c   26 Mar 2005 00:19:53 -0000      1.224
+++ w32term.c   18 May 2005 17:25:19 -0000
@@ -5413,17 +5413,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]