diff --git a/headers/private/input/touchpad_settings.h b/headers/private/input/touchpad_settings.h index 8fc38e60da..854516caa1 100644 --- a/headers/private/input/touchpad_settings.h +++ b/headers/private/input/touchpad_settings.h @@ -34,6 +34,10 @@ typedef struct { // 0x04: edge motion on button click move // 0x08: edge motion on button click drag + bool finger_click; // 1 finger click -> click button id 1 + // 2 fingers' click -> click button id 2 + // 3 fingers' click -> click button id 3 + bool software_button_areas; } touchpad_settings; @@ -53,6 +57,7 @@ const static touchpad_settings kDefaultTouchpadSettings = { false, true, 0x02, + true, false }; diff --git a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp index 8ae0be1af7..8843a69cef 100644 --- a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp +++ b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp @@ -608,6 +608,8 @@ MouseDevice::_UpdateTouchpadSettings(BMessage* message) &settings.scroll_twofinger_natural_scrolling); message->FindInt8("edge_motion", (int8*)&settings.edge_motion); + message->FindBool("finger_click", + &settings.finger_click); message->FindBool("software_button_areas", &settings.software_button_areas); diff --git a/src/add-ons/input_server/devices/mouse/movement_maker.cpp b/src/add-ons/input_server/devices/mouse/movement_maker.cpp index aaebc2e138..3eb89f34ea 100644 --- a/src/add-ons/input_server/devices/mouse/movement_maker.cpp +++ b/src/add-ons/input_server/devices/mouse/movement_maker.cpp @@ -353,7 +353,8 @@ TouchpadMovement::EventToMovement(const touchpad_movement* _event, mouse_movemen movement->timestamp = system_time(); touchpad_movement event2 = *_event; - _SoftwareButtonAreas(&event2); + if (!_ClickFingerButtonEmulator(&event2)) + _SoftwareButtonAreas(&event2); const touchpad_movement* event = &event2; if ((movement->timestamp - fTapTime) > fTapTimeOUT) { @@ -398,6 +399,27 @@ TouchpadMovement::EventToMovement(const touchpad_movement* _event, mouse_movemen } +bool +TouchpadMovement::_ClickFingerButtonEmulator(touchpad_movement *event) { + CALLED(); + + if (event->buttons != 0) { + // ClickFinger behaviour. + // Simulate with 2 fingers click => right button click + // Simulate with 3 fingers click => middle button click + if (fSettings.finger_click && two_fingers(event)) { + event->buttons = 2; + return true; + } else if (fSettings.finger_click && three_fingers(event)) { + event->buttons = 4; + return true; + } + } + + return false; +} + + void TouchpadMovement::_SoftwareButtonAreas(touchpad_movement *event) { CALLED(); diff --git a/src/add-ons/input_server/devices/mouse/movement_maker.h b/src/add-ons/input_server/devices/mouse/movement_maker.h index 70d3364023..24a56935ce 100644 --- a/src/add-ons/input_server/devices/mouse/movement_maker.h +++ b/src/add-ons/input_server/devices/mouse/movement_maker.h @@ -76,6 +76,7 @@ private: void _UpdateButtons(mouse_movement *movement); bool _EdgeMotion(const touchpad_movement *event, mouse_movement *movement, bool validStart); + inline bool _ClickFingerButtonEmulator(touchpad_movement *event); inline void _SoftwareButtonAreas(touchpad_movement *event); inline void _NoTouchToMovement(const touchpad_movement *event, mouse_movement *movement); diff --git a/src/preferences/input/InputTouchpadPref.cpp b/src/preferences/input/InputTouchpadPref.cpp index 40649e09ef..6da96a1a30 100644 --- a/src/preferences/input/InputTouchpadPref.cpp +++ b/src/preferences/input/InputTouchpadPref.cpp @@ -72,6 +72,7 @@ TouchpadPref::BuildSettingsMessage() msg.AddInt32("trackpad_acceleration", fSettings.trackpad_acceleration); msg.AddBool("scroll_twofinger_natural_scrolling", fSettings.scroll_twofinger_natural_scrolling); msg.AddInt8("edge_motion", fSettings.edge_motion); + msg.AddBool("finger_click", fSettings.finger_click); msg.AddBool("software_button_areas", fSettings.software_button_areas); return msg; @@ -161,6 +162,9 @@ TouchpadPref::LoadSettings() fSettings.edge_motion = settingsMsg.GetInt8( "edge_motion", kDefaultTouchpadSettings.edge_motion); + fSettings.finger_click = settingsMsg.GetBool( + "finger_click", + kDefaultTouchpadSettings.finger_click); fSettings.software_button_areas = settingsMsg.GetBool( "software_button_areas", kDefaultTouchpadSettings.software_button_areas); diff --git a/src/preferences/input/InputTouchpadPrefView.cpp b/src/preferences/input/InputTouchpadPrefView.cpp index 459d0b51ad..a4b9b5a35d 100644 --- a/src/preferences/input/InputTouchpadPrefView.cpp +++ b/src/preferences/input/InputTouchpadPrefView.cpp @@ -315,6 +315,12 @@ TouchpadPrefView::MessageReceived(BMessage* message) fTouchpadPref.UpdateRunningSettings(); break; + case FINGER_CLICK_CHANGED: + settings.finger_click = fFingerClickBox->Value() == B_CONTROL_ON; + fRevertButton->SetEnabled(true); + fTouchpadPref.UpdateRunningSettings(); + break; + case SOFTWARE_BUTTON_AREAS_CHANGED: settings.software_button_areas = fSoftwareButtonAreasBox->Value() == B_CONTROL_ON; fRevertButton->SetEnabled(true); @@ -382,6 +388,7 @@ TouchpadPrefView::AttachedToWindow() fScrollAccelSlider->SetTarget(this); fEdgeMotionOptionPopUp->SetTarget(this); + fFingerClickBox->SetTarget(this); fSoftwareButtonAreasBox->SetTarget(this); fPadBlockerSlider->SetTarget(this); @@ -479,6 +486,8 @@ TouchpadPrefView::SetupView() B_EDGE_MOTION_ON_MOVE | B_EDGE_MOTION_ON_TAP_DRAG | B_EDGE_MOTION_ON_BUTTON_CLICK_MOVE | B_EDGE_MOTION_ON_BUTTON_CLICK_DRAG); + fFingerClickBox = new BCheckBox(B_TRANSLATE("Finger click"), + new BMessage(FINGER_CLICK_CHANGED)); fSoftwareButtonAreasBox = new BCheckBox(B_TRANSLATE("Software button areas"), new BMessage(SOFTWARE_BUTTON_AREAS_CHANGED)); @@ -545,7 +554,11 @@ TouchpadPrefView::SetupView() .SetInsets(B_USE_WINDOW_SPACING) .Add(scrollBox) .Add(fEdgeMotionOptionPopUp) - .Add(fSoftwareButtonAreasBox) + .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING) + .Add(fFingerClickBox) + .Add(new BSeparatorView(B_VERTICAL)) + .Add(fSoftwareButtonAreasBox) + .End() .Add(new BSeparatorView(B_HORIZONTAL)) .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING) .AddGroup(B_VERTICAL, B_USE_DEFAULT_SPACING) @@ -580,6 +593,7 @@ TouchpadPrefView::SetValues(touchpad_settings* settings) fTwoFingerNaturalScrollingBox->SetValue( settings->scroll_twofinger_natural_scrolling ? B_CONTROL_ON : B_CONTROL_OFF); fTwoFingerNaturalScrollingBox->SetEnabled(settings->scroll_twofinger); + fFingerClickBox->SetValue(settings->finger_click); fSoftwareButtonAreasBox->SetValue(settings->software_button_areas); fEdgeMotionOptionPopUp->SetValue(settings->edge_motion); fScrollStepXSlider->SetValue(20 - settings->scroll_xstepsize / 2); diff --git a/src/preferences/input/InputTouchpadPrefView.h b/src/preferences/input/InputTouchpadPrefView.h index 2cfe7814d5..7ed326956b 100644 --- a/src/preferences/input/InputTouchpadPrefView.h +++ b/src/preferences/input/InputTouchpadPrefView.h @@ -41,6 +41,7 @@ const uint PADBLOCK_TIME_CHANGED = '&ptc'; const uint PAD_SPEED_CHANGED = '&psc'; const uint PAD_ACCELERATION_CHANGED = '&pac'; const uint EDGE_MOTION_CHANGED = '&emc'; +const uint FINGER_CLICK_CHANGED = '&fcc'; const uint SOFTWARE_BUTTON_AREAS_CHANGED = '&sbc'; class DeviceListView; @@ -102,6 +103,7 @@ private: BCheckBox* fTwoFingerBox; BCheckBox* fTwoFingerHorizontalBox; BCheckBox* fTwoFingerNaturalScrollingBox; + BCheckBox* fFingerClickBox; BCheckBox* fSoftwareButtonAreasBox; BSlider* fScrollStepXSlider; BSlider* fScrollStepYSlider;