diff --git a/headers/private/input/touchpad_settings.h b/headers/private/input/touchpad_settings.h index 9550424121..5b33c781ca 100644 --- a/headers/private/input/touchpad_settings.h +++ b/headers/private/input/touchpad_settings.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2009, Haiku, Inc. All Rights Reserved. + * Copyright 2001-2025, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #ifndef TOUCHPAD_SETTINGS_H @@ -25,6 +25,7 @@ typedef struct { int32 trackpad_acceleration; bool scroll_reverse; + bool scroll_twofinger_natural_scrolling; } touchpad_settings; @@ -40,7 +41,8 @@ const static touchpad_settings kDefaultTouchpadSettings = { 30, 65536, 65536, - false + false, + true }; #define TOUCHPAD_SETTINGS_FILE "Touchpad_settings" diff --git a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp index 56f5241d3d..17947a1593 100644 --- a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp +++ b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp @@ -604,6 +604,9 @@ MouseDevice::_UpdateTouchpadSettings(BMessage* message) message->FindInt8("tapgesture_sensibility", (int8*)&settings.tapgesture_sensibility); + message->FindBool("scroll_twofinger_natural_scrolling", + &settings.scroll_twofinger_natural_scrolling); + if (fIsTouchpad) fTouchpadMovementMaker.SetSettings(settings); 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 ed2e9d6775..d6eefdd3ac 100644 --- a/src/add-ons/input_server/devices/mouse/movement_maker.cpp +++ b/src/add-ons/input_server/devices/mouse/movement_maker.cpp @@ -158,12 +158,12 @@ MovementMaker::GetMovement(uint32 posX, uint32 posY) void -MovementMaker::GetScrolling(uint32 posX, uint32 posY) +MovementMaker::GetScrolling(uint32 posX, uint32 posY, bool reverse) { CALLED(); int32 stepsX = 0, stepsY = 0; - int32 directionMultiplier = fSettings.scroll_reverse ? -1 : 1; + int32 directionMultiplier = reverse ? -1 : 1; _GetRawMovement(posX, posY); _ComputeAcceleration(fSettings.scroll_acceleration); @@ -619,8 +619,9 @@ TouchpadMovement::_CheckScrollingToMovement(const touchpad_movement *event, || fSettings.scroll_bottomrange > 0.999999) { isSideScrollingH = true; } - if (two_fingers(event) - && fSettings.scroll_twofinger) { + bool isTwoFingerScrolling = two_fingers(event) + && fSettings.scroll_twofinger; + if (isTwoFingerScrolling) { // two finger scrolling is enabled isSideScrollingV = true; isSideScrollingH = fSettings.scroll_twofinger_horizontal; @@ -641,7 +642,9 @@ TouchpadMovement::_CheckScrollingToMovement(const touchpad_movement *event, fScrollingStarted = true; StartNewMovment(); } - GetScrolling(event->xPosition, event->yPosition); + GetScrolling(event->xPosition, event->yPosition, isTwoFingerScrolling + ? fSettings.scroll_twofinger_natural_scrolling + : fSettings.scroll_reverse); movement->wheel_ydelta = make_small(yDelta); movement->wheel_xdelta = make_small(xDelta); 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 92f526439b..c33f726b7d 100644 --- a/src/add-ons/input_server/devices/mouse/movement_maker.h +++ b/src/add-ons/input_server/devices/mouse/movement_maker.h @@ -26,7 +26,7 @@ public: protected: void StartNewMovment(); void GetMovement(uint32 posX, uint32 posY); - void GetScrolling(uint32 posX, uint32 posY); + void GetScrolling(uint32 posX, uint32 posY, bool reverse); touchpad_specs fSpecs; touchpad_settings fSettings; diff --git a/src/preferences/input/InputTouchpadPref.cpp b/src/preferences/input/InputTouchpadPref.cpp index 6428f1c4b1..575002c3f7 100644 --- a/src/preferences/input/InputTouchpadPref.cpp +++ b/src/preferences/input/InputTouchpadPref.cpp @@ -70,6 +70,7 @@ TouchpadPref::BuildSettingsMessage() msg.AddInt16("padblocker_threshold", fSettings.padblocker_threshold); msg.AddInt32("trackpad_speed", fSettings.trackpad_speed); msg.AddInt32("trackpad_acceleration", fSettings.trackpad_acceleration); + msg.AddBool("scroll_twofinger_natural_scrolling", fSettings.scroll_twofinger_natural_scrolling); return msg; } @@ -152,6 +153,10 @@ TouchpadPref::LoadSettings() settingsMsg.FindInt32("trackpad_acceleration", &fSettings.trackpad_acceleration); settingsMsg.FindPoint("window_position", &fWindowPosition); + fSettings.scroll_twofinger_natural_scrolling = settingsMsg.GetBool( + "scroll_twofinger_natural_scrolling", + kDefaultTouchpadSettings.scroll_twofinger_natural_scrolling); + return B_OK; } @@ -201,4 +206,4 @@ TouchpadPref::SetAcceleration(int32 accel) fSettings.trackpad_acceleration = value; UpdateRunningSettings(); } -} \ No newline at end of file +} diff --git a/src/preferences/input/InputTouchpadPrefView.cpp b/src/preferences/input/InputTouchpadPrefView.cpp index da2d51668d..615a5ba15e 100644 --- a/src/preferences/input/InputTouchpadPrefView.cpp +++ b/src/preferences/input/InputTouchpadPrefView.cpp @@ -298,10 +298,13 @@ TouchpadPrefView::MessageReceived(BMessage* message) settings.scroll_twofinger = fTwoFingerBox->Value() == B_CONTROL_ON; settings.scroll_twofinger_horizontal = fTwoFingerHorizontalBox->Value() == B_CONTROL_ON; + settings.scroll_twofinger_natural_scrolling + = fTwoFingerNaturalScrollingBox->Value() == B_CONTROL_ON; settings.scroll_acceleration = fScrollAccelSlider->Value(); settings.scroll_xstepsize = (20 - fScrollStepXSlider->Value()) * 3; settings.scroll_ystepsize = (20 - fScrollStepYSlider->Value()) * 3; fTwoFingerHorizontalBox->SetEnabled(settings.scroll_twofinger); + fTwoFingerNaturalScrollingBox->SetEnabled(settings.scroll_twofinger); fRevertButton->SetEnabled(true); fTouchpadPref.UpdateRunningSettings(); break; @@ -361,15 +364,19 @@ TouchpadPrefView::AttachedToWindow() fScrollReverseBox->SetTarget(this); fTwoFingerBox->SetTarget(this); fTwoFingerHorizontalBox->SetTarget(this); + fTwoFingerNaturalScrollingBox->SetTarget(this); fScrollStepXSlider->SetTarget(this); fScrollStepYSlider->SetTarget(this); fScrollAccelSlider->SetTarget(this); + fPadBlockerSlider->SetTarget(this); fTapSlider->SetTarget(this); fSpeedSlider->SetTarget(this); fAccelSlider->SetTarget(this); + fDefaultButton->SetTarget(this); fRevertButton->SetTarget(this); + BSize size = PreferredSize(); Window()->ResizeTo(size.width, size.height); @@ -438,6 +445,8 @@ TouchpadPrefView::SetupView() new BMessage(SCROLL_CONTROL_CHANGED)); fTwoFingerHorizontalBox = new BCheckBox(B_TRANSLATE("Horizontal scrolling"), new BMessage(SCROLL_CONTROL_CHANGED)); + fTwoFingerNaturalScrollingBox = new BCheckBox(B_TRANSLATE("Natural scrolling"), + new BMessage(SCROLL_CONTROL_CHANGED)); float spacing = be_control_look->DefaultItemSpacing(); @@ -447,10 +456,11 @@ TouchpadPrefView::SetupView() .AddStrut(spacing) .Add(fScrollReverseBox) .Add(fTwoFingerBox) - .AddGroup(B_HORIZONTAL, 0) - .AddStrut(spacing * 2) + .AddGroup(B_VERTICAL, 0) + .SetInsets(spacing * 2, 0, 0, 0) .Add(fTwoFingerHorizontalBox) - .End() + .Add(fTwoFingerNaturalScrollingBox) + .End() .AddGlue() .View(); @@ -529,6 +539,9 @@ TouchpadPrefView::SetValues(touchpad_settings* settings) fTwoFingerHorizontalBox->SetValue( settings->scroll_twofinger_horizontal ? B_CONTROL_ON : B_CONTROL_OFF); fTwoFingerHorizontalBox->SetEnabled(settings->scroll_twofinger); + fTwoFingerNaturalScrollingBox->SetValue( + settings->scroll_twofinger_natural_scrolling ? B_CONTROL_ON : B_CONTROL_OFF); + fTwoFingerNaturalScrollingBox->SetEnabled(settings->scroll_twofinger); fScrollStepXSlider->SetValue(20 - settings->scroll_xstepsize / 2); fScrollStepYSlider->SetValue(20 - settings->scroll_ystepsize / 2); fScrollAccelSlider->SetValue(settings->scroll_acceleration); diff --git a/src/preferences/input/InputTouchpadPrefView.h b/src/preferences/input/InputTouchpadPrefView.h index 1eb4c2c1ad..01008de7b9 100644 --- a/src/preferences/input/InputTouchpadPrefView.h +++ b/src/preferences/input/InputTouchpadPrefView.h @@ -98,6 +98,7 @@ private: BCheckBox* fScrollReverseBox; BCheckBox* fTwoFingerBox; BCheckBox* fTwoFingerHorizontalBox; + BCheckBox* fTwoFingerNaturalScrollingBox; BSlider* fScrollStepXSlider; BSlider* fScrollStepYSlider; BSlider* fScrollAccelSlider;