UnnaturalScrollWheels Documentation

Invert scroll direction for physical scroll wheels while maintaining "Natural" scrolling for trackpads on MacOS

4,228 stars Swift Swift 1 file ยท ~1,075 tokens
RAW Doc

File: README.md

UnnaturalScrollWheels

Invert scroll direction for physical scroll wheels while maintaining "Natural" scrolling for trackpads on MacOS.

Why? What does it do?

For some reason in macOS, toggling the "Scroll direction: Natural" option in Mouse settings also changes it in Trackpad settings despite being in separate places.

This application makes it so that scroll direction for physical scroll wheels is the opposite of what is shown in settings without messing with the scroll direction of the trackpad.

The issue is described here:

https://apple.stackexchange.com/questions/116617/how-to-separate-mouse-and-trackpad-settings

Unfortunately most/all solutions no longer work reliably if at all in Catalina.

Installation

Using Homebrew

text
brew install --cask unnaturalscrollwheels

Manual download

  1. Download the latest .dmg from the releases page, mount it, and copy the .app to your applications folder and open it like any other application.

  2. The app requires accessibility permissions to "Control your computer". This is required to intercept scroll events, invert them and modify their deltas to disable acceleration and apply your settings.

That's it!

Usage

One possible confusion may be how to modify your preferences once you've hidden the app from menu bar. To show preferences and temporarily show the menu bar icon again, simply open the application again which will display the preferences window.


File: UnnaturalScrollWheels/Assets.xcassets/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: UnnaturalScrollWheels/Assets.xcassets/AppIcon.appiconset/Contents.json

{
"images" : [
{
"filename" : "16x16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "32x32-1.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "32x32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "64x64.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "128x128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "256x256.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "256x256-1.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "512x512-1.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "512x512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "1024x1024.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: .github/FUNDING.yml

These are supported funding model platforms

github: ther0n
custom: "https://paypal.me/theron1998"


File: .github/workflows/ci.yml

name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
build:
name: Build
runs-on: macos-14
steps:
- uses: actions/checkout@v4

text
- name: Select Xcode
    run: sudo xcode-select -s /Applications/Xcode_15.4.app/Contents/Developer

  - name: Build (Release, Universal)
    run: |
      xcodebuild build \
        -project UnnaturalScrollWheels.xcodeproj \
        -scheme UnnaturalScrollWheels \
        -configuration Release \
        -destination "generic/platform=macOS" \
        ARCHS="x86_64 arm64" \
        ONLY_ACTIVE_ARCH=NO \
        CODE_SIGN_IDENTITY="-" \
        CODE_SIGNING_REQUIRED=NO \
        CODE_SIGNING_ALLOWED=NO | xcpretty

  - name: Verify universal binary
    run: |
      APP=$(find ~/Library/Developer/Xcode/DerivedData -name "UnnaturalScrollWheels.app" -path "*/Release/*" | head -1)
      echo "App found at: $APP"
      file "$APP/Contents/MacOS/UnnaturalScrollWheels"
      lipo -info "$APP/Contents/MacOS/UnnaturalScrollWheels"

File: .github/workflows/release.yml

[Binary file]