emacs-devel
[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 12:14:54 -0400

> 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).

I will install it if you send me a ChangeLog entry for it.

Kim,

Thanks.  Here's the full patch, including the src/Changelog patch.
Let me know if you need anything else.  This patch fixes the problem
where

   (set-frame-position (selected-frame) -1 -1)

fails to position the selected frame exactly in the lower right corner
of the display.
--
Fran Litterio


Index: src/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/src/ChangeLog,v
retrieving revision 1.5194
diff -w -u -r1.5194 ChangeLog
--- src/ChangeLog       18 Jul 2006 13:25:28 -0000      1.5194
+++ src/ChangeLog       18 Jul 2006 16:11:19 -0000
@@ -1,3 +1,8 @@
+2006-07-18  Francis Litterio  <address@hidden>
+
+       * w32term.c (x_calc_absolute_position): Fix frame positioning on
+       Windows with negative X/Y coordinates.
+
2006-07-18  Kim F. Storm  <address@hidden>

        Cleanup Fsignal calls that never returns; now only use it for Qquit.
Index: src/w32term.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/w32term.c,v
retrieving revision 1.247
diff -w -u -r1.247 w32term.c
--- src/w32term.c       30 Jun 2006 13:41:15 -0000      1.247
+++ src/w32term.c       18 Jul 2006 16:11:28 -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]