From: Eli Zaretskii Date: Mon, 28 May 2012 17:22:40 +0000 (+0300) Subject: Fix bug #11513 with raise-frame on MS-Windows. X-Git-Tag: emacs-24.2.90~471^2~6^2~67 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=85d0efd175d95b4aa23d6eb22b8f8d18ed03ba75;p=emacs.git 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. --- diff --git a/src/ChangeLog b/src/ChangeLog index f4447da7010..374da469203 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,17 @@ +2012-05-28 Eli Zaretskii + + * 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 * bidi.c (bidi_mirror_char): Put eassert before conversion to int. diff --git a/src/w32fns.c b/src/w32fns.c index d7114f19b90..b8dc62f5250 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -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) diff --git a/src/w32term.c b/src/w32term.c index 2ccd7574332..a90e067a3fd 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -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; diff --git a/src/w32term.h b/src/w32term.h index 4528bbd5c0a..68e62b24144 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -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)