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

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

Re: Same frame-positioning bug as before: negative top/left values on Wi


From: Fran Litterio
Subject: Re: Same frame-positioning bug as before: negative top/left values on Windows
Date: Tue, 18 Jul 2006 09:09:42 -0400

Drew,

You are seeing this bug because my patch to fix frame positioning with
negative X/Y values on Windows has not been applied. Now that the FSF
has my copyright assignment papers, they should be able to apply my
patch (below).
--
Fran Litterio

On 7/18/06, Drew Adams <address@hidden> wrote:
This is an old bug. I thought this was going to be fixed by Fran's bug
fix, but I see that it is not. See my bug report of May 3, 2005, below.

emacs -q

In scratch buffer evaluate: (make-frame '((top . -1) (left . -1)))

The new frame does not have its bottom at the display bottom. The
frame bottom is below the frame bottom.

I've been waiting for this fix for a year and a half. I use a
standalone minibuffer frame, and I have code that positions it at the
display bottom, no matter the size of the display. The code works
perfectly in Emacs 20, but this bug causes the frame to be too low on
the display in Emacs 22(and since the frame is only two rows high,
it is essentially off the bottom of the display).

Can someone please fix this bug? Emacs should be able to correctly handle
negative `top' frame parameter values.

Thanks.


--- w32term.c   5 Jun 2006 21:20:59 -0000       1.246
+++ w32term.c   18 Jul 2006 13:03:33 -0000
@@ -5312,17 +5312,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]