diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index a69c2b9e63..0de6514469 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -2462,7 +2462,7 @@ TermView::_MouseDistanceSinceLastClick(BPoint where) void TermView::_SendMouseEvent(int32 buttons, int32 mode, int32 x, int32 y, - bool motion) + bool motion, bool upEvent) { if (!fEnableExtendedMouseCoordinates) { char xtermButtons; @@ -2491,13 +2491,16 @@ TermView::_SendMouseEvent(int32 buttons, int32 mode, int32 x, int32 y, fShell->Write(destBuffer, 6); } else { char xtermButtons; - if (buttons == B_PRIMARY_MOUSE_BUTTON) + if ((buttons & B_PRIMARY_MOUSE_BUTTON) + != (fMouseButtons & B_PRIMARY_MOUSE_BUTTON)) { xtermButtons = 0; - else if (buttons == B_SECONDARY_MOUSE_BUTTON) + } else if ((buttons & B_SECONDARY_MOUSE_BUTTON) + != (fMouseButtons & B_SECONDARY_MOUSE_BUTTON)) { xtermButtons = 1; - else if (buttons == B_TERTIARY_MOUSE_BUTTON) + } else if ((buttons & B_TERTIARY_MOUSE_BUTTON) + != (fMouseButtons & B_TERTIARY_MOUSE_BUTTON)) { xtermButtons = 2; - else + } else xtermButtons = 3; if (motion) @@ -2519,8 +2522,7 @@ TermView::_SendMouseEvent(int32 buttons, int32 mode, int32 x, int32 y, destBuffer[9] = xtermY / 100 % 10 + '0'; destBuffer[10] = xtermY / 10 % 10 + '0'; destBuffer[11] = xtermY % 10 + '0'; - // No support for button press/release - destBuffer[12] = 'M'; + destBuffer[12] = upEvent ? 'm' : 'M'; fShell->Write(destBuffer, 13); } } diff --git a/src/apps/terminal/TermView.h b/src/apps/terminal/TermView.h index a1b14a8283..9836831ddc 100644 --- a/src/apps/terminal/TermView.h +++ b/src/apps/terminal/TermView.h @@ -254,7 +254,8 @@ private: void _ScrollToRange(TermPos start, TermPos end); void _SendMouseEvent(int32 button, int32 mode, - int32 x, int32 y, bool motion); + int32 x, int32 y, bool motion, + bool upEvent = false); void _DrawInlineMethodString(); void _HandleInputMethodChanged(BMessage* message); diff --git a/src/apps/terminal/TermViewStates.cpp b/src/apps/terminal/TermViewStates.cpp index 2cd4dc5020..5f1615b1f7 100644 --- a/src/apps/terminal/TermViewStates.cpp +++ b/src/apps/terminal/TermViewStates.cpp @@ -423,7 +423,7 @@ TermView::DefaultState::MouseDown(BPoint where, int32 buttons, int32 modifiers) || fView->fReportNormalMouseEvent || fView->fReportX10MouseEvent) { TermPos clickPos = fView->_ConvertToTerminal(where); fView->_SendMouseEvent(buttons, modifiers, clickPos.x, clickPos.y, - false); + false, false); return; } @@ -452,6 +452,18 @@ TermView::DefaultState::MouseMoved(BPoint where, uint32 transit, } +void +TermView::DefaultState::MouseUp(BPoint where, int32 buttons) +{ + if (fView->fReportAnyMouseEvent || fView->fReportButtonMouseEvent + || fView->fReportNormalMouseEvent || fView->fReportX10MouseEvent) { + TermPos clickPos = fView->_ConvertToTerminal(where); + fView->_SendMouseEvent(buttons, 0, clickPos.x, clickPos.y, + false, true); + } +} + + void TermView::DefaultState::WindowActivated(bool active) { diff --git a/src/apps/terminal/TermViewStates.h b/src/apps/terminal/TermViewStates.h index 1aa0ba07ff..918b64c128 100644 --- a/src/apps/terminal/TermViewStates.h +++ b/src/apps/terminal/TermViewStates.h @@ -72,6 +72,7 @@ public: int32 modifiers); virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage, int32 modifiers); + virtual void MouseUp(BPoint where, int32 buttons); virtual void WindowActivated(bool active);