diff options
-rw-r--r-- | doc/ScintillaHistory.html | 3 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 26 |
2 files changed, 17 insertions, 12 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 59373c8e2..7c8e77510 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -606,6 +606,9 @@ created on different threads. There may be more problems with this scenario so it should be avoided. <a href="https://sourceforge.net/p/scintilla/bugs/2420/">Bug #2420</a>. </li> + <li> + For Win32, ensure keyboard-initiated context menu appears in multi-screen situations. + </li> </ul> <h3> <a href="https://www.scintilla.org/scintilla541.zip">Release 5.4.1</a> diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index de1bf2fb7..f27cd59ed 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -1520,19 +1520,21 @@ Window::Cursor ScintillaWin::ContextCursor(Point pt) { } sptr_t ScintillaWin::ShowContextMenu(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { - Point pt = PointFromLParam(lParam); - POINT rpt = POINTFromPoint(pt); - ::ScreenToClient(MainHWND(), &rpt); - const Point ptClient = PointFromPOINT(rpt); + Point ptScreen = PointFromLParam(lParam); + Point ptClient; + POINT point = POINTFromLParam(lParam); + if ((point.x == -1) && (point.y == -1)) { + // Caused by keyboard so display menu near caret + ptClient = PointMainCaret(); + point = POINTFromPoint(ptClient); + ::ClientToScreen(MainHWND(), &point); + ptScreen = PointFromPOINT(point); + } else { + ::ScreenToClient(MainHWND(), &point); + ptClient = PointFromPOINT(point); + } if (ShouldDisplayPopup(ptClient)) { - if ((pt.x == -1) && (pt.y == -1)) { - // Caused by keyboard so display menu near caret - pt = PointMainCaret(); - POINT spt = POINTFromPoint(pt); - ::ClientToScreen(MainHWND(), &spt); - pt = PointFromPOINT(spt); - } - ContextMenu(pt); + ContextMenu(ptScreen); return 0; } return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam); |