aboutsummaryrefslogtreecommitdiff
path: root/src/scintilla_backports/6314_af83baede430.patch
diff options
context:
space:
mode:
Diffstat (limited to 'src/scintilla_backports/6314_af83baede430.patch')
-rw-r--r--src/scintilla_backports/6314_af83baede430.patch535
1 files changed, 535 insertions, 0 deletions
diff --git a/src/scintilla_backports/6314_af83baede430.patch b/src/scintilla_backports/6314_af83baede430.patch
new file mode 100644
index 00000000..ef028826
--- /dev/null
+++ b/src/scintilla_backports/6314_af83baede430.patch
@@ -0,0 +1,535 @@
+# HG changeset patch
+# User Neil <nyamatongwe@gmail.com>
+# Date 1497239386 -36000
+# Node ID af83baede4309993b2ef0aa4f30968148855bc11
+# Parent 2d4cb83e92975d4b8d578f29807031fcf532605a
+Simplify mouse and keyboard handling by only retaining the 'WithModifiers" form.
+All events include a set of keyboard modifier flags.
+Older calls that passed individual parameters for each key were removed.
+
+diff -r 2d4cb83e9297 -r af83baede430 cocoa/ScintillaCocoa.mm
+--- a/cocoa/ScintillaCocoa.mm Mon Jun 12 12:49:30 2017 +1000
++++ b/cocoa/ScintillaCocoa.mm Mon Jun 12 13:49:46 2017 +1000
+@@ -2262,7 +2262,9 @@
+
+ // Mouse location is given in screen coordinates and might also be outside of our bounds.
+ Point location = ConvertPoint(event.locationInWindow);
+- ButtonMove(location);
++ ButtonMoveWithModifiers(location,
++ (int)(event.timestamp * 1000),
++ TranslateModifierFlags(event.modifierFlags));
+ }
+ }
+
+@@ -2276,22 +2278,16 @@
+
+ void ScintillaCocoa::MouseDown(NSEvent *event) {
+ Point location = ConvertPoint(event.locationInWindow);
+- NSTimeInterval time = event.timestamp;
+- bool command = (event.modifierFlags & NSCommandKeyMask) != 0;
+- bool shift = (event.modifierFlags & NSShiftKeyMask) != 0;
+- bool alt = (event.modifierFlags & NSAlternateKeyMask) != 0;
+-
+- ButtonDown(Point(location.x, location.y), (int)(time * 1000), shift, command, alt);
++ ButtonDownWithModifiers(location,
++ (int)(event.timestamp * 1000),
++ TranslateModifierFlags(event.modifierFlags));
+ }
+
+ void ScintillaCocoa::RightMouseDown(NSEvent *event) {
+ Point location = ConvertPoint(event.locationInWindow);
+- NSTimeInterval time = event.timestamp;
+- bool command = (event.modifierFlags & NSCommandKeyMask) != 0;
+- bool shift = (event.modifierFlags & NSShiftKeyMask) != 0;
+- bool alt = (event.modifierFlags & NSAlternateKeyMask) != 0;
+-
+- RightButtonDownWithModifiers(Point(location.x, location.y), (int)(time * 1000), ModifierFlags(shift, command, alt));
++ RightButtonDownWithModifiers(location,
++ (int)(event.timestamp * 1000),
++ TranslateModifierFlags(event.modifierFlags));
+ }
+
+ //--------------------------------------------------------------------------------------------------
+@@ -2299,16 +2295,17 @@
+ void ScintillaCocoa::MouseMove(NSEvent *event) {
+ lastMouseEvent = event;
+
+- ButtonMoveWithModifiers(ConvertPoint(event.locationInWindow), TranslateModifierFlags(event.modifierFlags));
++ ButtonMoveWithModifiers(ConvertPoint(event.locationInWindow),
++ (int)(event.timestamp * 1000),
++ TranslateModifierFlags(event.modifierFlags));
+ }
+
+ //--------------------------------------------------------------------------------------------------
+
+ void ScintillaCocoa::MouseUp(NSEvent *event) {
+- NSTimeInterval time = event.timestamp;
+- bool control = (event.modifierFlags & NSControlKeyMask) != 0;
+-
+- ButtonUp(ConvertPoint(event.locationInWindow), (int)(time * 1000), control);
++ ButtonUpWithModifiers(ConvertPoint(event.locationInWindow),
++ (int)(event.timestamp * 1000),
++ TranslateModifierFlags(event.modifierFlags));
+ }
+
+ //--------------------------------------------------------------------------------------------------
+@@ -2344,7 +2341,7 @@
+ }
+
+ void ScintillaCocoa::DeleteBackward() {
+- KeyDown(SCK_BACK, false, false, false, nil);
++ KeyDownWithModifiers(SCK_BACK, 0, nil);
+ }
+
+ void ScintillaCocoa::Cut() {
+diff -r 2d4cb83e9297 -r af83baede430 gtk/ScintillaGTK.cxx
+--- a/gtk/ScintillaGTK.cxx Mon Jun 12 12:49:30 2017 +1000
++++ b/gtk/ScintillaGTK.cxx Mon Jun 12 13:49:46 2017 +1000
+@@ -1775,7 +1775,11 @@
+ // If mouse released on scroll bar then the position is relative to the
+ // scrollbar, not the drawing window so just repeat the most recent point.
+ pt = sciThis->ptMouseLast;
+- sciThis->ButtonUp(pt, event->time, (event->state & GDK_CONTROL_MASK) != 0);
++ const int modifiers = ModifierFlags(
++ (event->state & GDK_SHIFT_MASK) != 0,
++ (event->state & GDK_CONTROL_MASK) != 0,
++ (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
++ sciThis->ButtonUpWithModifiers(pt, event->time, modifiers);
+ }
+ } catch (...) {
+ sciThis->errorStatus = SC_STATUS_FAILURE;
+@@ -1912,10 +1916,11 @@
+ //Platform::DebugPrintf("Move %x %x %d %c %d %d\n",
+ // sciThis,event->window,event->time,event->is_hint? 'h' :'.', x, y);
+ Point pt(x, y);
+- int modifiers = ((event->state & GDK_SHIFT_MASK) != 0 ? SCI_SHIFT : 0) |
+- ((event->state & GDK_CONTROL_MASK) != 0 ? SCI_CTRL : 0) |
+- ((event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0 ? SCI_ALT : 0);
+- sciThis->ButtonMoveWithModifiers(pt, modifiers);
++ const int modifiers = ModifierFlags(
++ (event->state & GDK_SHIFT_MASK) != 0,
++ (event->state & GDK_CONTROL_MASK) != 0,
++ (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
++ sciThis->ButtonMoveWithModifiers(pt, event->time, modifiers);
+ } catch (...) {
+ sciThis->errorStatus = SC_STATUS_FAILURE;
+ }
+diff -r 2d4cb83e9297 -r af83baede430 qt/ScintillaEditBase/ScintillaEditBase.cpp
+--- a/qt/ScintillaEditBase/ScintillaEditBase.cpp Mon Jun 12 12:49:30 2017 +1000
++++ b/qt/ScintillaEditBase/ScintillaEditBase.cpp Mon Jun 12 13:49:46 2017 +1000
+@@ -241,7 +241,9 @@
+ bool alt = QApplication::keyboardModifiers() & Qt::AltModifier;
+
+ bool consumed = false;
+- bool added = sqt->KeyDown(key, shift, ctrl, alt, &consumed) != 0;
++ bool added = sqt->KeyDownWithModifiers(key,
++ ScintillaQt::ModifierFlags(shift, ctrl, alt),
++ &consumed) != 0;
+ if (!consumed)
+ consumed = added;
+
+@@ -314,24 +316,19 @@
+ bool alt = QApplication::keyboardModifiers() & Qt::AltModifier;
+ #endif
+
+- sqt->ButtonDown(pos, time.elapsed(), shift, ctrl, alt);
++ sqt->ButtonDownWithModifiers(pos, time.elapsed(), ScintillaQt::ModifierFlags(shift, ctrl, alt));
+ }
+
+ if (event->button() == Qt::RightButton) {
+- bool shift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
+- bool ctrl = QApplication::keyboardModifiers() & Qt::ControlModifier;
+- bool alt = QApplication::keyboardModifiers() & Qt::AltModifier;
+-
+- sqt->RightButtonDownWithModifiers(pos, time.elapsed(), ScintillaQt::ModifierFlags(shift, ctrl, alt));
++ sqt->RightButtonDownWithModifiers(pos, time.elapsed(), ModifiersOfKeyboard());
+ }
+ }
+
+ void ScintillaEditBase::mouseReleaseEvent(QMouseEvent *event)
+ {
+ Point point = PointFromQPoint(event->pos());
+- bool ctrl = QApplication::keyboardModifiers() & Qt::ControlModifier;
+ if (event->button() == Qt::LeftButton)
+- sqt->ButtonUp(point, time.elapsed(), ctrl);
++ sqt->ButtonUpWithModifiers(point, time.elapsed(), ModifiersOfKeyboard());
+
+ int pos = send(SCI_POSITIONFROMPOINT, point.x, point.y);
+ int line = send(SCI_LINEFROMPOSITION, pos);
+@@ -361,9 +358,9 @@
+ bool alt = QApplication::keyboardModifiers() & Qt::AltModifier;
+ #endif
+
+- int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | (alt ? SCI_ALT : 0);
++ const int modifiers = ScintillaQt::ModifierFlags(shift, ctrl, alt);
+
+- sqt->ButtonMoveWithModifiers(pos, modifiers);
++ sqt->ButtonMoveWithModifiers(pos, time.elapsed(), modifiers);
+ }
+
+ void ScintillaEditBase::contextMenuEvent(QContextMenuEvent *event)
+@@ -794,3 +791,12 @@
+ {
+ emit command(wParam, lParam);
+ }
++
++int ScintillaEditBase::ModifiersOfKeyboard() const
++{
++ const bool shift = QApplication::keyboardModifiers() & Qt::ShiftModifier;
++ const bool ctrl = QApplication::keyboardModifiers() & Qt::ControlModifier;
++ const bool alt = QApplication::keyboardModifiers() & Qt::AltModifier;
++
++ return ScintillaQt::ModifierFlags(shift, ctrl, alt);
++}
+diff -r 2d4cb83e9297 -r af83baede430 qt/ScintillaEditBase/ScintillaEditBase.h
+--- a/qt/ScintillaEditBase/ScintillaEditBase.h Mon Jun 12 12:49:30 2017 +1000
++++ b/qt/ScintillaEditBase/ScintillaEditBase.h Mon Jun 12 13:49:46 2017 +1000
+@@ -147,6 +147,7 @@
+ static bool IsHangul(const QChar qchar);
+ void MoveImeCarets(int offset);
+ void DrawImeIndicator(int indicator, int len);
++ int ModifiersOfKeyboard() const;
+ };
+
+ #ifdef SCI_NAMESPACE
+diff -r 2d4cb83e9297 -r af83baede430 src/Editor.cxx
+--- a/src/Editor.cxx Mon Jun 12 12:49:30 2017 +1000
++++ b/src/Editor.cxx Mon Jun 12 13:49:46 2017 +1000
+@@ -2340,10 +2340,6 @@
+ NotifyParent(scn);
+ }
+
+-void Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) {
+- NotifyDoubleClick(pt, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ void Editor::NotifyHotSpotDoubleClicked(Sci::Position position, int modifiers) {
+ SCNotification scn = {};
+ scn.nmhdr.code = SCN_HOTSPOTDOUBLECLICK;
+@@ -2352,10 +2348,6 @@
+ NotifyParent(scn);
+ }
+
+-void Editor::NotifyHotSpotDoubleClicked(Sci::Position position, bool shift, bool ctrl, bool alt) {
+- NotifyHotSpotDoubleClicked(position, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ void Editor::NotifyHotSpotClicked(Sci::Position position, int modifiers) {
+ SCNotification scn = {};
+ scn.nmhdr.code = SCN_HOTSPOTCLICK;
+@@ -2364,10 +2356,6 @@
+ NotifyParent(scn);
+ }
+
+-void Editor::NotifyHotSpotClicked(Sci::Position position, bool shift, bool ctrl, bool alt) {
+- NotifyHotSpotClicked(position, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ void Editor::NotifyHotSpotReleaseClick(Sci::Position position, int modifiers) {
+ SCNotification scn = {};
+ scn.nmhdr.code = SCN_HOTSPOTRELEASECLICK;
+@@ -2376,10 +2364,6 @@
+ NotifyParent(scn);
+ }
+
+-void Editor::NotifyHotSpotReleaseClick(Sci::Position position, bool shift, bool ctrl, bool alt) {
+- NotifyHotSpotReleaseClick(position, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ bool Editor::NotifyUpdateUI() {
+ if (needUpdateUI) {
+ SCNotification scn = {};
+@@ -2410,10 +2394,6 @@
+ }
+ }
+
+-void Editor::NotifyIndicatorClick(bool click, Sci::Position position, bool shift, bool ctrl, bool alt) {
+- NotifyIndicatorClick(click, position, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ bool Editor::NotifyMarginClick(Point pt, int modifiers) {
+ const int marginClicked = vs.MarginFromLocation(pt);
+ if ((marginClicked >= 0) && vs.ms[marginClicked].sensitive) {
+@@ -2452,10 +2432,6 @@
+ }
+ }
+
+-bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {
+- return NotifyMarginClick(pt, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ bool Editor::NotifyMarginRightClick(Point pt, int modifiers) {
+ int marginRightClicked = vs.MarginFromLocation(pt);
+ if ((marginRightClicked >= 0) && vs.ms[marginRightClicked].sensitive) {
+@@ -3882,10 +3858,6 @@
+ }
+ }
+
+-int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) {
+- return KeyDownWithModifiers(key, ModifierFlags(shift, ctrl, alt), consumed);
+-}
+-
+ void Editor::Indent(bool forwards) {
+ UndoGroup ug(pdoc);
+ for (size_t r=0; r<sel.Count(); r++) {
+@@ -4630,10 +4602,6 @@
+ return;
+ }
+
+-void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
+- return ButtonDownWithModifiers(pt, curTime, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ bool Editor::PositionIsHotspot(Sci::Position position) const {
+ return vs.styles[pdoc->StyleIndexAt(position)].hotspot;
+ }
+@@ -4703,7 +4671,7 @@
+ return hotspot;
+ }
+
+-void Editor::ButtonMoveWithModifiers(Point pt, int modifiers) {
++void Editor::ButtonMoveWithModifiers(Point pt, unsigned int, int modifiers) {
+ if ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) {
+ DwellEnd(true);
+ }
+@@ -4830,11 +4798,7 @@
+ }
+ }
+
+-void Editor::ButtonMove(Point pt) {
+- ButtonMoveWithModifiers(pt, 0);
+-}
+-
+-void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
++void Editor::ButtonUpWithModifiers(Point pt, unsigned int curTime, int modifiers) {
+ //Platform::DebugPrintf("ButtonUp %d %d\n", HaveMouseCapture(), inDragDrop);
+ SelectionPosition newPos = SPositionFromLocation(pt, false, false,
+ AllowVirtualSpace(virtualSpaceOptions, sel.IsRectangular()));
+@@ -4851,7 +4815,7 @@
+ hotSpotClickPos = INVALID_POSITION;
+ SelectionPosition newCharPos = SPositionFromLocation(pt, false, true, false);
+ newCharPos = MovePositionOutsideChar(newCharPos, -1);
+- NotifyHotSpotReleaseClick(newCharPos.Position(), ctrl ? SCI_CTRL : 0);
++ NotifyHotSpotReleaseClick(newCharPos.Position(), modifiers & SCI_CTRL);
+ }
+ if (HaveMouseCapture()) {
+ if (PointInSelMargin(pt)) {
+@@ -4872,7 +4836,7 @@
+ if (selStart < selEnd) {
+ if (drag.Length()) {
+ const int length = static_cast<int>(drag.Length());
+- if (ctrl) {
++ if (modifiers & SCI_CTRL) {
+ const Sci::Position lengthInserted = pdoc->InsertString(
+ newPos.Position(), drag.Data(), length);
+ if (lengthInserted > 0) {
+@@ -4929,7 +4893,7 @@
+ void Editor::Tick() {
+ if (HaveMouseCapture()) {
+ // Auto scroll
+- ButtonMove(ptMouseLast);
++ ButtonMoveWithModifiers(ptMouseLast, 0, 0);
+ }
+ if (caret.period > 0) {
+ timer.ticksToWait -= timer.tickSize;
+@@ -4996,7 +4960,7 @@
+ break;
+ case tickScroll:
+ // Auto scroll
+- ButtonMove(ptMouseLast);
++ ButtonMoveWithModifiers(ptMouseLast, 0, 0);
+ break;
+ case tickWiden:
+ SetScrollBars();
+diff -r 2d4cb83e9297 -r af83baede430 src/Editor.h
+--- a/src/Editor.h Mon Jun 12 12:49:30 2017 +1000
++++ b/src/Editor.h Mon Jun 12 13:49:46 2017 +1000
+@@ -425,19 +425,13 @@
+ void NotifySavePoint(bool isSavePoint);
+ void NotifyModifyAttempt();
+ virtual void NotifyDoubleClick(Point pt, int modifiers);
+- virtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt);
+ void NotifyHotSpotClicked(Sci::Position position, int modifiers);
+- void NotifyHotSpotClicked(Sci::Position position, bool shift, bool ctrl, bool alt);
+ void NotifyHotSpotDoubleClicked(Sci::Position position, int modifiers);
+- void NotifyHotSpotDoubleClicked(Sci::Position position, bool shift, bool ctrl, bool alt);
+ void NotifyHotSpotReleaseClick(Sci::Position position, int modifiers);
+- void NotifyHotSpotReleaseClick(Sci::Position position, bool shift, bool ctrl, bool alt);
+ bool NotifyUpdateUI();
+ void NotifyPainted();
+ void NotifyIndicatorClick(bool click, Sci::Position position, int modifiers);
+- void NotifyIndicatorClick(bool click, Sci::Position position, bool shift, bool ctrl, bool alt);
+ bool NotifyMarginClick(Point pt, int modifiers);
+- bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);
+ bool NotifyMarginRightClick(Point pt, int modifiers);
+ void NotifyNeedShown(Sci::Position pos, Sci::Position len);
+ void NotifyDwelling(Point pt, bool state);
+@@ -476,7 +470,6 @@
+ virtual int KeyCommand(unsigned int iMessage);
+ virtual int KeyDefault(int /* key */, int /*modifiers*/);
+ int KeyDownWithModifiers(int key, int modifiers, bool *consumed);
+- int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);
+
+ void Indent(bool forwards);
+
+@@ -510,10 +503,8 @@
+ void MouseLeave();
+ virtual void ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);
+ virtual void RightButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);
+- virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
+- void ButtonMoveWithModifiers(Point pt, int modifiers);
+- void ButtonMove(Point pt);
+- void ButtonUp(Point pt, unsigned int curTime, bool ctrl);
++ void ButtonMoveWithModifiers(Point pt, unsigned int curTime, int modifiers);
++ void ButtonUpWithModifiers(Point pt, unsigned int curTime, int modifiers);
+
+ void Tick();
+ bool Idle();
+diff -r 2d4cb83e9297 -r af83baede430 src/ScintillaBase.cxx
+--- a/src/ScintillaBase.cxx Mon Jun 12 12:49:30 2017 +1000
++++ b/src/ScintillaBase.cxx Mon Jun 12 13:49:46 2017 +1000
+@@ -537,10 +537,6 @@
+ Editor::ButtonDownWithModifiers(pt, curTime, modifiers);
+ }
+
+-void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
+- ButtonDownWithModifiers(pt, curTime, ModifierFlags(shift, ctrl, alt));
+-}
+-
+ void ScintillaBase::RightButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) {
+ CancelModes();
+ Editor::RightButtonDownWithModifiers(pt, curTime, modifiers);
+diff -r 2d4cb83e9297 -r af83baede430 src/ScintillaBase.h
+--- a/src/ScintillaBase.h Mon Jun 12 12:49:30 2017 +1000
++++ b/src/ScintillaBase.h Mon Jun 12 13:49:46 2017 +1000
+@@ -88,7 +88,6 @@
+ void ContextMenu(Point pt);
+
+ void ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);
+- void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);
+ void RightButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);
+
+ void NotifyStyleToNeeded(Sci::Position endStyleNeeded);
+diff -r 2d4cb83e9297 -r af83baede430 win32/ScintillaWin.cxx
+--- a/win32/ScintillaWin.cxx Mon Jun 12 12:49:30 2017 +1000
++++ b/win32/ScintillaWin.cxx Mon Jun 12 13:49:46 2017 +1000
+@@ -156,7 +156,7 @@
+ return Point::FromInts(pt.x, pt.y);
+ }
+
+-static Point PointFromLong(long lpoint) {
++static Point PointFromLParam(sptr_t lpoint) {
+ return Point(static_cast<short>(LOWORD(lpoint)), static_cast<short>(HIWORD(lpoint)));
+ }
+
+@@ -305,6 +305,8 @@
+
+ bool DragThreshold(Point ptStart, Point ptNow) override;
+ void StartDrag() override;
++ static int MouseModifiers(uptr_t wParam);
++
+ Sci::Position TargetAsUTF8(char *text);
+ void AddCharUTF16(wchar_t const *wcs, unsigned int wclen);
+ Sci::Position EncodedFromUTF8(char *utf8, char *encoded) const;
+@@ -632,6 +634,12 @@
+ SetDragPosition(SelectionPosition(Sci::invalidPosition));
+ }
+
++int ScintillaWin::MouseModifiers(uptr_t wParam) {
++ return ModifierFlags((wParam & MK_SHIFT) != 0,
++ (wParam & MK_CONTROL) != 0,
++ KeyboardIsKeyDown(VK_MENU));
++}
++
+ // Avoid warnings everywhere for old style casts by concentrating them here
+ static WORD LoWord(uptr_t l) {
+ return LOWORD(l);
+@@ -1388,24 +1396,19 @@
+ // KeyboardIsKeyDown(VK_CONTROL),
+ // KeyboardIsKeyDown(VK_MENU));
+ ::SetFocus(MainHWND());
+- ButtonDown(PointFromLong(static_cast<long>(lParam)), ::GetMessageTime(),
+- (wParam & MK_SHIFT) != 0,
+- (wParam & MK_CONTROL) != 0,
+- KeyboardIsKeyDown(VK_MENU));
++ ButtonDownWithModifiers(PointFromLParam(lParam), ::GetMessageTime(),
++ MouseModifiers(wParam));
+ }
+ break;
+
+ case WM_MOUSEMOVE: {
+- const Point pt = PointFromLong(static_cast<long>(lParam));
++ const Point pt = PointFromLParam(lParam);
+
+ // Windows might send WM_MOUSEMOVE even though the mouse has not been moved:
+ // http://blogs.msdn.com/b/oldnewthing/archive/2003/10/01/55108.aspx
+ if (ptMouseLast.x != pt.x || ptMouseLast.y != pt.y) {
+ SetTrackMouseLeaveEvent(true);
+- ButtonMoveWithModifiers(pt,
+- ((wParam & MK_SHIFT) != 0 ? SCI_SHIFT : 0) |
+- ((wParam & MK_CONTROL) != 0 ? SCI_CTRL : 0) |
+- (KeyboardIsKeyDown(VK_MENU) ? SCI_ALT : 0));
++ ButtonMoveWithModifiers(pt, ::GetMessageTime(), MouseModifiers(wParam));
+ }
+ }
+ break;
+@@ -1416,22 +1419,19 @@
+ return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
+
+ case WM_LBUTTONUP:
+- ButtonUp(PointFromLong(static_cast<long>(lParam)),
+- ::GetMessageTime(),
+- (wParam & MK_CONTROL) != 0);
++ ButtonUpWithModifiers(PointFromLParam(lParam),
++ ::GetMessageTime(), MouseModifiers(wParam));
+ break;
+
+ case WM_RBUTTONDOWN: {
+ ::SetFocus(MainHWND());
+- Point pt = PointFromLong(static_cast<long>(lParam));
++ Point pt = PointFromLParam(lParam);
+ if (!PointInSelection(pt)) {
+ CancelModes();
+- SetEmptySelection(PositionFromLocation(PointFromLong(static_cast<long>(lParam))));
++ SetEmptySelection(PositionFromLocation(PointFromLParam(lParam)));
+ }
+
+- RightButtonDownWithModifiers(pt, ::GetMessageTime(), ModifierFlags((wParam & MK_SHIFT) != 0,
+- (wParam & MK_CONTROL) != 0,
+- KeyboardIsKeyDown(VK_MENU)));
++ RightButtonDownWithModifiers(pt, ::GetMessageTime(), MouseModifiers(wParam));
+ }
+ break;
+
+@@ -1494,10 +1494,10 @@
+ case WM_KEYDOWN: {
+ //Platform::DebugPrintf("S keydown %d %x %x %x %x\n",iMessage, wParam, lParam, ::IsKeyDown(VK_SHIFT), ::IsKeyDown(VK_CONTROL));
+ lastKeyDownConsumed = false;
+- const int ret = KeyDown(KeyTranslate(static_cast<int>(wParam)),
+- KeyboardIsKeyDown(VK_SHIFT),
++ const int ret = KeyDownWithModifiers(KeyTranslate(static_cast<int>(wParam)),
++ ModifierFlags(KeyboardIsKeyDown(VK_SHIFT),
+ KeyboardIsKeyDown(VK_CONTROL),
+- KeyboardIsKeyDown(VK_MENU),
++ KeyboardIsKeyDown(VK_MENU)),
+ &lastKeyDownConsumed);
+ if (!ret && !lastKeyDownConsumed) {
+ return ::DefWindowProc(MainHWND(), iMessage, wParam, lParam);
+@@ -1581,7 +1581,7 @@
+ }
+
+ case WM_CONTEXTMENU: {
+- Point pt = PointFromLong(static_cast<long>(lParam));
++ Point pt = PointFromLParam(lParam);
+ POINT rpt = {static_cast<int>(pt.x), static_cast<int>(pt.y)};
+ ::ScreenToClient(MainHWND(), &rpt);
+ const Point ptClient = PointFromPOINT(rpt);
+@@ -3358,7 +3358,7 @@
+ return 0;
+ } else if (iMessage == WM_LBUTTONDOWN) {
+ // This does not fire due to the hit test code
+- sciThis->ct.MouseClick(PointFromLong(static_cast<long>(lParam)));
++ sciThis->ct.MouseClick(PointFromLParam(lParam));
+ sciThis->CallTipClick();
+ return 0;
+ } else if (iMessage == WM_SETCURSOR) {