# HG changeset patch # User Neil # 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; rStyleIndexAt(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(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(LOWORD(lpoint)), static_cast(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(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(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(lParam)), - ::GetMessageTime(), - (wParam & MK_CONTROL) != 0); + ButtonUpWithModifiers(PointFromLParam(lParam), + ::GetMessageTime(), MouseModifiers(wParam)); break; case WM_RBUTTONDOWN: { ::SetFocus(MainHWND()); - Point pt = PointFromLong(static_cast(lParam)); + Point pt = PointFromLParam(lParam); if (!PointInSelection(pt)) { CancelModes(); - SetEmptySelection(PositionFromLocation(PointFromLong(static_cast(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(wParam)), - KeyboardIsKeyDown(VK_SHIFT), + const int ret = KeyDownWithModifiers(KeyTranslate(static_cast(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(lParam)); + Point pt = PointFromLParam(lParam); POINT rpt = {static_cast(pt.x), static_cast(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(lParam))); + sciThis->ct.MouseClick(PointFromLParam(lParam)); sciThis->CallTipClick(); return 0; } else if (iMessage == WM_SETCURSOR) {