Fix bug #11513 with raise-frame on MS-Windows.

src/w32term.c (my_bring_window_to_top): New function.
 (x_raise_frame): Use handle returned by DeferWindowPos, which
 could be different from the original one.  Call
 my_bring_window_to_top instead of my_set_foreground_window.
 src/w32fns.c (w32_wnd_proc): Accept and process WM_EMACS_BRINGTOTOP
 by calling BringWindowToTop.
 src/w32term.h (WM_EMACS_BRINGTOTOP): New message.
 (WM_EMACS_END): Increase by one.
This commit is contained in:
Eli Zaretskii 2012-05-28 20:22:40 +03:00
parent c00ea352d8
commit 85d0efd175
4 changed files with 42 additions and 15 deletions

View file

@ -1,3 +1,17 @@
2012-05-28 Eli Zaretskii <eliz@gnu.org>
* w32term.c (my_bring_window_to_top): New function.
(x_raise_frame): Use handle returned by DeferWindowPos, which
could be different from the original one. Call
my_bring_window_to_top instead of my_set_foreground_window.
(Bug#11513)
* w32fns.c (w32_wnd_proc): Accept and process WM_EMACS_BRINGTOTOP
by calling BringWindowToTop.
* w32term.h (WM_EMACS_BRINGTOTOP): New message.
(WM_EMACS_END): Increase by one.
2012-05-28 Paul Eggert <eggert@cs.ucla.edu>
* bidi.c (bidi_mirror_char): Put eassert before conversion to int.

View file

@ -3663,6 +3663,7 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_EMACS_SHOWWINDOW:
return ShowWindow ((HWND) wParam, (WPARAM) lParam);
case WM_EMACS_BRINGTOTOP:
case WM_EMACS_SETFOREGROUND:
{
HWND foreground_window;
@ -3680,6 +3681,8 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
foreground_thread = 0;
retval = SetForegroundWindow ((HWND) wParam);
if (msg == WM_EMACS_BRINGTOTOP)
retval = BringWindowToTop ((HWND) wParam);
/* Detach from the previous foreground thread. */
if (foreground_thread)

View file

@ -3492,6 +3492,12 @@ my_destroy_window (struct frame * f, HWND hwnd)
(WPARAM) hwnd, 0);
}
static void
my_bring_window_to_top (HWND hwnd)
{
SendMessage (hwnd, WM_EMACS_BRINGTOTOP, (WPARAM) hwnd, 0);
}
/* Create a scroll bar and return the scroll bar vector for it. W is
the Emacs window on which to create the scroll bar. TOP, LEFT,
WIDTH and HEIGHT are the pixel coordinates and dimensions of the
@ -5600,24 +5606,27 @@ x_raise_frame (struct frame *f)
HDWP handle = BeginDeferWindowPos (2);
if (handle)
{
DeferWindowPos (handle,
FRAME_W32_WINDOW (f),
HWND_TOP,
0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
DeferWindowPos (handle,
GetForegroundWindow (),
FRAME_W32_WINDOW (f),
0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
EndDeferWindowPos (handle);
handle = DeferWindowPos (handle,
FRAME_W32_WINDOW (f),
HWND_TOP,
0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
if (handle)
{
handle = DeferWindowPos (handle,
GetForegroundWindow (),
FRAME_W32_WINDOW (f),
0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE);
if (handle)
EndDeferWindowPos (handle);
}
}
}
else
{
my_set_foreground_window (FRAME_W32_WINDOW (f));
my_bring_window_to_top (FRAME_W32_WINDOW (f));
}
UNBLOCK_INPUT;

View file

@ -576,7 +576,8 @@ do { \
#define WM_EMACS_HIDE_CARET (WM_EMACS_START + 18)
#define WM_EMACS_SETCURSOR (WM_EMACS_START + 19)
#define WM_EMACS_PAINT (WM_EMACS_START + 20)
#define WM_EMACS_END (WM_EMACS_START + 21)
#define WM_EMACS_BRINGTOTOP (WM_EMACS_START + 21)
#define WM_EMACS_END (WM_EMACS_START + 22)
#define WND_FONTWIDTH_INDEX (0)
#define WND_LINEHEIGHT_INDEX (4)