Add support for two extra mouse buttons (#mantis-is-down-right-now)

This also fixes a missing definition for "MiddleDouble". Only
implemented for SDL and Qt, someone else will have to do Windows.
console-destruction
Lukas Werling 2016-08-18 22:43:42 +02:00
parent 5d6ecc8dc8
commit 26a552473c
6 changed files with 48 additions and 3 deletions

View File

@ -1420,12 +1420,19 @@ bool C4PlayerControl::DoMouseInput(uint8_t mouse_id, int32_t mouseevent, float g
case C4MC_Button_None: mouseevent_code = KEY_MOUSE_Move; break;
case C4MC_Button_LeftUp: is_down = false; // nobreak
case C4MC_Button_LeftDown: mouseevent_code = KEY_MOUSE_ButtonLeft; break;
case C4MC_Button_LeftDouble: mouseevent_code = KEY_MOUSE_ButtonLeftDouble; break;
case C4MC_Button_RightUp: is_down = false; // nobreak
case C4MC_Button_RightDown: mouseevent_code = KEY_MOUSE_ButtonRight; break;
case C4MC_Button_LeftDouble: mouseevent_code = KEY_MOUSE_ButtonLeftDouble; break;
case C4MC_Button_RightDouble: mouseevent_code = KEY_MOUSE_ButtonRightDouble; break;
case C4MC_Button_MiddleUp: is_down = false; // nobreak
case C4MC_Button_MiddleDown: mouseevent_code = KEY_MOUSE_ButtonMiddle; break;
case C4MC_Button_MiddleDouble: mouseevent_code = KEY_MOUSE_ButtonMiddleDouble; break;
case C4MC_Button_X1Up: is_down = false; // nobreak
case C4MC_Button_X1Down: mouseevent_code = KEY_MOUSE_ButtonX1; break;
case C4MC_Button_X1Double: mouseevent_code = KEY_MOUSE_ButtonX1Double; break;
case C4MC_Button_X2Up: is_down = false; // nobreak
case C4MC_Button_X2Down: mouseevent_code = KEY_MOUSE_ButtonX2; break;
case C4MC_Button_X2Double: mouseevent_code = KEY_MOUSE_ButtonX2Double; break;
case C4MC_Button_Wheel:
if (!wheel_dir) return false;
mouseevent_code = (wheel_dir > 0) ? KEY_MOUSE_Wheel1Up : KEY_MOUSE_Wheel1Down; break;

View File

@ -189,6 +189,9 @@ void C4ConsoleQtViewportView::mousePressEvent(QMouseEvent *eventPress)
{
case Qt::LeftButton: btn = C4MC_Button_LeftDown; break;
case Qt::RightButton: btn = C4MC_Button_RightDown; break;
case Qt::MiddleButton: btn = C4MC_Button_MiddleDown; break;
case Qt::XButton1: btn = C4MC_Button_X1Down; break;
case Qt::XButton2: btn = C4MC_Button_X2Down; break;
}
C4GUI::MouseMove(btn, eventPress->x() * pr, eventPress->y() * pr, GetShiftWParam(), cvp);
}
@ -213,6 +216,9 @@ void C4ConsoleQtViewportView::mouseDoubleClickEvent(QMouseEvent *eventPress)
{
case Qt::LeftButton: btn = C4MC_Button_LeftDouble; break;
case Qt::RightButton: btn = C4MC_Button_RightDouble; break;
case Qt::MiddleButton: btn = C4MC_Button_MiddleDouble; break;
case Qt::XButton1: btn = C4MC_Button_X1Double; break;
case Qt::XButton2: btn = C4MC_Button_X2Double; break;
}
auto pr = GetDevicePixelRatio();
C4GUI::MouseMove(btn, eventPress->x() * pr, eventPress->y() * pr, GetShiftWParam(), cvp);
@ -228,6 +234,9 @@ void C4ConsoleQtViewportView::mouseReleaseEvent(QMouseEvent *releaseEvent)
{
case Qt::LeftButton: btn = C4MC_Button_LeftUp; break;
case Qt::RightButton: btn = C4MC_Button_RightUp; break;
case Qt::MiddleButton: btn = C4MC_Button_MiddleUp; break;
case Qt::XButton1: btn = C4MC_Button_X1Up; break;
case Qt::XButton2: btn = C4MC_Button_X2Up; break;
}
auto pr = GetDevicePixelRatio();
C4GUI::MouseMove(btn, releaseEvent->x() * pr, releaseEvent->y() * pr, GetShiftWParam(), cvp);

View File

@ -284,6 +284,8 @@ C4KeyCode C4KeyCodeEx::String2KeyCode(const StdStrBuf &sName)
if (SEqualNoCase(key_str, "Left",4)) { mouseevent_id=KEY_MOUSE_ButtonLeft; key_str += 4; }
else if (SEqualNoCase(key_str, "Right",5)) { mouseevent_id=KEY_MOUSE_ButtonRight; key_str += 5; }
else if (SEqualNoCase(key_str, "Middle",6)) { mouseevent_id=KEY_MOUSE_ButtonMiddle; key_str += 6; }
else if (SEqualNoCase(key_str, "X1",2)) { mouseevent_id=KEY_MOUSE_ButtonX1; key_str += 2; }
else if (SEqualNoCase(key_str, "X2",2)) { mouseevent_id=KEY_MOUSE_ButtonX2; key_str += 2; }
else if (isdigit(*key_str))
{
// indexed mouse button (e.g. Mouse1Button4 or Mouse1Button4Double)
@ -385,9 +387,13 @@ StdStrBuf C4KeyCodeEx::KeyCode2String(C4KeyCode wCode, bool fHumanReadable, bool
case KEY_MOUSE_ButtonLeft: return FormatString("%s%dLeft", mouse_str, mouse_id);
case KEY_MOUSE_ButtonRight: return FormatString("%s%dRight", mouse_str, mouse_id);
case KEY_MOUSE_ButtonMiddle: return FormatString("%s%dMiddle", mouse_str, mouse_id);
case KEY_MOUSE_ButtonX1: return FormatString("%s%dX1", mouse_str, mouse_id);
case KEY_MOUSE_ButtonX2: return FormatString("%s%dX2", mouse_str, mouse_id);
case KEY_MOUSE_ButtonLeftDouble: return FormatString("%s%dLeftDouble", mouse_str, mouse_id);
case KEY_MOUSE_ButtonRightDouble: return FormatString("%s%dRightDouble", mouse_str, mouse_id);
case KEY_MOUSE_ButtonMiddleDouble:return FormatString("%s%dMiddleDouble", mouse_str, mouse_id);
case KEY_MOUSE_ButtonX1Double: return FormatString("%s%dX1Double", mouse_str, mouse_id);
case KEY_MOUSE_ButtonX2Double: return FormatString("%s%dX2Double", mouse_str, mouse_id);
default:
// extended mouse button
{

View File

@ -98,11 +98,15 @@ const C4KeyCode
KEY_MOUSE_ButtonLeft = KEY_MOUSE_Button1 + 0,
KEY_MOUSE_ButtonRight = KEY_MOUSE_Button1 + 1,
KEY_MOUSE_ButtonMiddle = KEY_MOUSE_Button1 + 2,
KEY_MOUSE_ButtonX1 = KEY_MOUSE_Button1 + 3,
KEY_MOUSE_ButtonX2 = KEY_MOUSE_Button1 + 4,
KEY_MOUSE_ButtonMax = KEY_MOUSE_Button1 + 0x1f, // max number of supported mouse buttons
KEY_MOUSE_Button1Double = 0x30, // double clicks have special events because double click speed is issued by OS
KEY_MOUSE_ButtonLeftDouble = KEY_MOUSE_Button1Double + 0,
KEY_MOUSE_ButtonRightDouble = KEY_MOUSE_Button1Double + 1,
KEY_MOUSE_ButtonMiddleDouble = KEY_MOUSE_Button1Double + 2,
KEY_MOUSE_ButtonX1Double = KEY_MOUSE_Button1Double + 3,
KEY_MOUSE_ButtonX2Double = KEY_MOUSE_Button1Double + 4,
KEY_MOUSE_ButtonMaxDouble = KEY_MOUSE_Button1Double + 0x1f, // max number of supported mouse buttons
KEY_MOUSE_Wheel1Up = 0x40, // mouse control: wheel up
KEY_MOUSE_Wheel1Down = 0x41; // mouse control: wheel down

View File

@ -32,7 +32,14 @@ const int32_t C4MC_Button_None = 0,
C4MC_Button_RightDouble = 6,
C4MC_Button_Wheel = 7,
C4MC_Button_MiddleDown = 8,
C4MC_Button_MiddleUp = 9;
C4MC_Button_MiddleUp = 9,
C4MC_Button_MiddleDouble= 10,
C4MC_Button_X1Down = 11,
C4MC_Button_X1Up = 12,
C4MC_Button_X1Double = 13,
C4MC_Button_X2Down = 14,
C4MC_Button_X2Up = 15,
C4MC_Button_X2Double = 16;
const int32_t C4MC_DragSensitivity = 5;

View File

@ -50,10 +50,22 @@ static void sdlToC4MCBtn(const SDL_MouseButtonEvent &e, int32_t& button, DWORD&
break;
case SDL_BUTTON_MIDDLE:
if (e.state == SDL_PRESSED)
button = C4MC_Button_MiddleDown;
button = e.clicks == 2 ? C4MC_Button_MiddleDouble : C4MC_Button_MiddleDown;
else
button = C4MC_Button_MiddleUp;
break;
case SDL_BUTTON_X1:
if (e.state == SDL_PRESSED)
button = e.clicks == 2 ? C4MC_Button_X1Double : C4MC_Button_X1Down;
else
button = C4MC_Button_X1Up;
break;
case SDL_BUTTON_X2:
if (e.state == SDL_PRESSED)
button = e.clicks == 2 ? C4MC_Button_X2Double : C4MC_Button_X2Down;
else
button = C4MC_Button_X2Up;
break;
}
}