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