diff --git a/lib/platform/CMSWindowsSecondaryScreen.cpp b/lib/platform/CMSWindowsSecondaryScreen.cpp index e7bd4e48..f4be6dea 100644 --- a/lib/platform/CMSWindowsSecondaryScreen.cpp +++ b/lib/platform/CMSWindowsSecondaryScreen.cpp @@ -367,7 +367,9 @@ CMSWindowsSecondaryScreen::postCreateWindow(HWND window) // hide cursor if this screen isn't active if (!isActive()) { - showWindow(); + SInt32 x, y; + getScreen()->getCursorCenter(x, y); + showWindow(x, y); } } @@ -423,16 +425,16 @@ CMSWindowsSecondaryScreen::destroyWindow() } void -CMSWindowsSecondaryScreen::showWindow() +CMSWindowsSecondaryScreen::showWindow(SInt32 x, SInt32 y) { - // move hider window under the mouse (rather than moving the mouse - // somewhere else on the screen) - SInt32 x, y; - getCursorPos(x, y); + // move hider window under the given position MoveWindow(m_window, x, y, 1, 1, FALSE); - // raise and show the hider window. take activation. - ShowWindow(m_window, SW_SHOWNORMAL); + // raise and show the hider window + ShowWindow(m_window, SW_SHOWNA); + + // now warp the mouse + warpCursor(x, y); } void diff --git a/lib/platform/CMSWindowsSecondaryScreen.h b/lib/platform/CMSWindowsSecondaryScreen.h index 3bb9140b..3acff252 100644 --- a/lib/platform/CMSWindowsSecondaryScreen.h +++ b/lib/platform/CMSWindowsSecondaryScreen.h @@ -68,7 +68,7 @@ protected: virtual void onPreLeave(); virtual void createWindow(); virtual void destroyWindow(); - virtual void showWindow(); + virtual void showWindow(SInt32 x, SInt32 y); virtual void hideWindow(); virtual void warpCursor(SInt32 x, SInt32 y); virtual void updateKeys(); diff --git a/lib/platform/CXWindowsSecondaryScreen.cpp b/lib/platform/CXWindowsSecondaryScreen.cpp index 598cc4ed..3f7ed996 100644 --- a/lib/platform/CXWindowsSecondaryScreen.cpp +++ b/lib/platform/CXWindowsSecondaryScreen.cpp @@ -488,18 +488,23 @@ CXWindowsSecondaryScreen::destroyWindow() } void -CXWindowsSecondaryScreen::showWindow() +CXWindowsSecondaryScreen::showWindow(SInt32 x, SInt32 y) { - // move hider window under the mouse (rather than moving the mouse - // somewhere else on the screen) - SInt32 x, y; - getCursorPos(x, y); - CDisplayLock display(m_screen); - XMoveWindow(display, m_window, x, y); + { + CDisplayLock display(m_screen); - // raise and show the hider window. take activation. - // FIXME -- take focus? - XMapRaised(display, m_window); + // move hider window under the given position + XMoveWindow(display, m_window, x, y); + + // raise and show the hider window. take activation. + // FIXME -- take focus? + XMapRaised(display, m_window); + } + + // now warp the mouse. we warp after showing the window so we're + // guaranteed to get the mouse leave event and to prevent the + // keyboard focus from changing under point-to-focus policies. + warpCursor(x, y); } void diff --git a/lib/platform/CXWindowsSecondaryScreen.h b/lib/platform/CXWindowsSecondaryScreen.h index ae0655d7..fd535c8c 100644 --- a/lib/platform/CXWindowsSecondaryScreen.h +++ b/lib/platform/CXWindowsSecondaryScreen.h @@ -66,7 +66,7 @@ protected: virtual void onPreLeave(); virtual void createWindow(); virtual void destroyWindow(); - virtual void showWindow(); + virtual void showWindow(SInt32 x, SInt32 y); virtual void hideWindow(); virtual void warpCursor(SInt32 x, SInt32 y); virtual void updateKeys(); diff --git a/lib/synergy/CSecondaryScreen.cpp b/lib/synergy/CSecondaryScreen.cpp index 0f8bdbc2..24a9146f 100644 --- a/lib/synergy/CSecondaryScreen.cpp +++ b/lib/synergy/CSecondaryScreen.cpp @@ -173,8 +173,10 @@ CSecondaryScreen::leave() // restore toggle key state setToggleState(m_toggleKeys); - // hide mouse - showWindow(); + // warp and hide mouse + SInt32 x, y; + getScreen()->getCursorCenter(x, y); + showWindow(x, y); // subclass hook onPostLeave(); diff --git a/lib/synergy/CSecondaryScreen.h b/lib/synergy/CSecondaryScreen.h index 239caf34..e4dd8a9f 100644 --- a/lib/synergy/CSecondaryScreen.h +++ b/lib/synergy/CSecondaryScreen.h @@ -323,10 +323,10 @@ protected: //! Show window /*! Called when the user navigates off this secondary screen. It needn't - actually show the window created by createWindow() but it must hide - the cursor and clean up event synthesis. + actually show the window created by createWindow() but it must move + the cursor to x,y, hide it, and clean up event synthesis. */ - virtual void showWindow() = 0; + virtual void showWindow(SInt32 x, SInt32 y) = 0; //! Hide window /*!