[Top][All Lists]
[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. */