Terminal: Add support for extended mouse coordinates
Fixes #11949 Change-Id: I779d1a9af2e3208ba3c055692de5e62b6a7b72fc Reviewed-on: https://review.haiku-os.org/c/haiku/+/1919 Reviewed-by: Stephan Aßmus <superstippi@gmx.de>
This commit is contained in:
parent
d8779e44ee
commit
e3c74f400e
@ -177,9 +177,9 @@ enum {
|
||||
#define TAB_WIDTH 8
|
||||
|
||||
#define MIN_COLS 10
|
||||
#define MAX_COLS 256
|
||||
#define MAX_COLS 999
|
||||
#define MIN_ROWS 10
|
||||
#define MAX_ROWS 256
|
||||
#define MAX_ROWS 999
|
||||
|
||||
// Insert mode flag
|
||||
#define MODE_OVER 0
|
||||
|
@ -1395,6 +1395,10 @@ TermParse::_DecPrivateModeSet(int value)
|
||||
// Use All Motion Mouse Tracking
|
||||
fBuffer->ReportAnyMouseEvent(true);
|
||||
break;
|
||||
case 1006:
|
||||
// Enable extended mouse coordinates with SGR scheme
|
||||
fBuffer->EnableExtendedMouseCoordinates(true);
|
||||
break;
|
||||
case 1034:
|
||||
// Interpret "meta" key, sets eighth bit.
|
||||
fBuffer->EnableInterpretMetaKey(true);
|
||||
@ -1470,6 +1474,10 @@ TermParse::_DecPrivateModeReset(int value)
|
||||
// Disable All Motion Mouse Tracking.
|
||||
fBuffer->ReportAnyMouseEvent(false);
|
||||
break;
|
||||
case 1006:
|
||||
// Disable extended mouse coordinates with SGR scheme
|
||||
fBuffer->EnableExtendedMouseCoordinates(false);
|
||||
break;
|
||||
case 1034:
|
||||
// Don't interpret "meta" key.
|
||||
fBuffer->EnableInterpretMetaKey(false);
|
||||
|
@ -174,7 +174,8 @@ TermView::TermView(BRect frame, const ShellParameters& shellParameters,
|
||||
fReportX10MouseEvent(false),
|
||||
fReportNormalMouseEvent(false),
|
||||
fReportButtonMouseEvent(false),
|
||||
fReportAnyMouseEvent(false)
|
||||
fReportAnyMouseEvent(false),
|
||||
fEnableExtendedMouseCoordinates(false)
|
||||
{
|
||||
status_t status = _InitObject(shellParameters);
|
||||
if (status != B_OK)
|
||||
@ -197,7 +198,8 @@ TermView::TermView(int rows, int columns,
|
||||
fReportX10MouseEvent(false),
|
||||
fReportNormalMouseEvent(false),
|
||||
fReportButtonMouseEvent(false),
|
||||
fReportAnyMouseEvent(false)
|
||||
fReportAnyMouseEvent(false),
|
||||
fEnableExtendedMouseCoordinates(false)
|
||||
{
|
||||
status_t status = _InitObject(shellParameters);
|
||||
if (status != B_OK)
|
||||
@ -230,7 +232,8 @@ TermView::TermView(BMessage* archive)
|
||||
fReportX10MouseEvent(false),
|
||||
fReportNormalMouseEvent(false),
|
||||
fReportButtonMouseEvent(false),
|
||||
fReportAnyMouseEvent(false)
|
||||
fReportAnyMouseEvent(false),
|
||||
fEnableExtendedMouseCoordinates(false)
|
||||
{
|
||||
BRect frame = Bounds();
|
||||
|
||||
@ -317,6 +320,7 @@ TermView::_InitObject(const ShellParameters& shellParameters)
|
||||
fReportNormalMouseEvent = false;
|
||||
fReportButtonMouseEvent = false;
|
||||
fReportAnyMouseEvent = false;
|
||||
fEnableExtendedMouseCoordinates = false;
|
||||
fMouseClipboard = be_clipboard;
|
||||
fDefaultState = new(std::nothrow) DefaultState(this);
|
||||
fSelectState = new(std::nothrow) SelectState(this);
|
||||
@ -1846,18 +1850,21 @@ TermView::MessageReceived(BMessage *msg)
|
||||
}
|
||||
case MSG_REPORT_MOUSE_EVENT:
|
||||
{
|
||||
bool report;
|
||||
if (msg->FindBool("reportX10MouseEvent", &report) == B_OK)
|
||||
fReportX10MouseEvent = report;
|
||||
bool value;
|
||||
if (msg->FindBool("reportX10MouseEvent", &value) == B_OK)
|
||||
fReportX10MouseEvent = value;
|
||||
|
||||
if (msg->FindBool("reportNormalMouseEvent", &report) == B_OK)
|
||||
fReportNormalMouseEvent = report;
|
||||
if (msg->FindBool("reportNormalMouseEvent", &value) == B_OK)
|
||||
fReportNormalMouseEvent = value;
|
||||
|
||||
if (msg->FindBool("reportButtonMouseEvent", &report) == B_OK)
|
||||
fReportButtonMouseEvent = report;
|
||||
if (msg->FindBool("reportButtonMouseEvent", &value) == B_OK)
|
||||
fReportButtonMouseEvent = value;
|
||||
|
||||
if (msg->FindBool("reportAnyMouseEvent", &report) == B_OK)
|
||||
fReportAnyMouseEvent = report;
|
||||
if (msg->FindBool("reportAnyMouseEvent", &value) == B_OK)
|
||||
fReportAnyMouseEvent = value;
|
||||
|
||||
if (msg->FindBool("enableExtendedMouseCoordinates", &value) == B_OK)
|
||||
fEnableExtendedMouseCoordinates = value;
|
||||
break;
|
||||
}
|
||||
case MSG_REMOVE_RESIZE_VIEW_IF_NEEDED:
|
||||
@ -2407,30 +2414,65 @@ void
|
||||
TermView::_SendMouseEvent(int32 buttons, int32 mode, int32 x, int32 y,
|
||||
bool motion)
|
||||
{
|
||||
char xtermButtons;
|
||||
if (buttons == B_PRIMARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 0;
|
||||
else if (buttons == B_SECONDARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 1;
|
||||
else if (buttons == B_TERTIARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 2;
|
||||
else
|
||||
xtermButtons = 32 + 3;
|
||||
if (!fEnableExtendedMouseCoordinates) {
|
||||
char xtermButtons;
|
||||
if (buttons == B_PRIMARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 0;
|
||||
else if (buttons == B_SECONDARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 1;
|
||||
else if (buttons == B_TERTIARY_MOUSE_BUTTON)
|
||||
xtermButtons = 32 + 2;
|
||||
else
|
||||
xtermButtons = 32 + 3;
|
||||
|
||||
if (motion)
|
||||
xtermButtons += 32;
|
||||
if (motion)
|
||||
xtermButtons += 32;
|
||||
|
||||
char xtermX = x + 1 + 32;
|
||||
char xtermY = y + 1 + 32;
|
||||
char xtermX = x + 1 + 32;
|
||||
char xtermY = y + 1 + 32;
|
||||
|
||||
char destBuffer[6];
|
||||
destBuffer[0] = '\033';
|
||||
destBuffer[1] = '[';
|
||||
destBuffer[2] = 'M';
|
||||
destBuffer[3] = xtermButtons;
|
||||
destBuffer[4] = xtermX;
|
||||
destBuffer[5] = xtermY;
|
||||
fShell->Write(destBuffer, 6);
|
||||
char destBuffer[6];
|
||||
destBuffer[0] = '\033';
|
||||
destBuffer[1] = '[';
|
||||
destBuffer[2] = 'M';
|
||||
destBuffer[3] = xtermButtons;
|
||||
destBuffer[4] = xtermX;
|
||||
destBuffer[5] = xtermY;
|
||||
fShell->Write(destBuffer, 6);
|
||||
} else {
|
||||
char xtermButtons;
|
||||
if (buttons == B_PRIMARY_MOUSE_BUTTON)
|
||||
xtermButtons = 0;
|
||||
else if (buttons == B_SECONDARY_MOUSE_BUTTON)
|
||||
xtermButtons = 1;
|
||||
else if (buttons == B_TERTIARY_MOUSE_BUTTON)
|
||||
xtermButtons = 2;
|
||||
else
|
||||
xtermButtons = 3;
|
||||
|
||||
if (motion)
|
||||
xtermButtons += 32;
|
||||
|
||||
int16 xtermX = x + 1;
|
||||
int16 xtermY = y + 1;
|
||||
|
||||
char destBuffer[13];
|
||||
destBuffer[0] = '\033';
|
||||
destBuffer[1] = '[';
|
||||
destBuffer[2] = '<';
|
||||
destBuffer[3] = xtermButtons + '0';
|
||||
destBuffer[4] = ';';
|
||||
destBuffer[5] = xtermX / 100 % 10 + '0';
|
||||
destBuffer[6] = xtermX / 10 % 10 + '0';
|
||||
destBuffer[7] = xtermX % 10 + '0';
|
||||
destBuffer[8] = ';';
|
||||
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';
|
||||
fShell->Write(destBuffer, 13);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -359,6 +359,7 @@ private:
|
||||
bool fReportNormalMouseEvent;
|
||||
bool fReportButtonMouseEvent;
|
||||
bool fReportAnyMouseEvent;
|
||||
bool fEnableExtendedMouseCoordinates;
|
||||
BClipboard* fMouseClipboard;
|
||||
|
||||
// states
|
||||
|
@ -157,6 +157,17 @@ TerminalBuffer::ReportAnyMouseEvent(bool reportAnyMouseEvent)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TerminalBuffer::EnableExtendedMouseCoordinates(bool enable)
|
||||
{
|
||||
if (fListenerValid) {
|
||||
BMessage message(MSG_REPORT_MOUSE_EVENT);
|
||||
message.AddBool("enableExtendedMouseCoordinates", enable);
|
||||
fListener.SendMessage(&message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TerminalBuffer::SetEncoding(int encoding)
|
||||
{
|
||||
|
@ -60,6 +60,7 @@ public:
|
||||
void ReportNormalMouseEvent(bool report);
|
||||
void ReportButtonMouseEvent(bool report);
|
||||
void ReportAnyMouseEvent(bool report);
|
||||
void EnableExtendedMouseCoordinates(bool enable);
|
||||
|
||||
protected:
|
||||
virtual void NotifyListener();
|
||||
|
Loading…
Reference in New Issue
Block a user