Other posts in this series:

Installing from the AUR

The AUR (Arch User Repository) is the place to go for unofficial packages, one being the xf86-input-mtrack driver. This driver, in my experience, works the best for the Macbook trackpad.

The installation process for AUR packages is a little more involved than straight pacman. To get started, visit the package details page and download the tarball:

https://aur.archlinux.org/packages/xf86-input-mtrack-git/

Once downloaded, extract and build it. The “-s” argument to makepkg automatically installs missing dependencies:

tar -xzvf xf86-input-mtrack-git.tar.gz
cd xf86-input-mtrack-git
makepkg -s

Once built, install it with pacman:

sudo pacman -U *.pkg.tar.xz

Permissions

For whatever reason, unlike the synaptics driver, xf86-input-mtrack will not work until you add yourself to the input group. You’ll need to log out and back in afterwards for the change to take effect:

sudo usermod -G input `whoami`

Driver Tweaking

The xf86-input-mtrack-git package adds the file /etc/X11/xorg.conf.d/10-mtrack.conf which contains the minimal configuration to load the driver. Just to confirm it is loaded, add the following option inside the section:

Option "Sensitivity" "0.1"

(Re)load X and confirm that your mouse cursor is quick sluggish.

The following is a complete configuration file with all options, their descriptions, and their default values taken from the driver’s github project page. You can use it as a starting point to get everything configured to taste:

Section "InputClass"
  MatchIsTouchpad "on"
  Identifier "Touchpads"
  Driver "mtrack"

  # Disables trackpad touch input. A value of 0 will enable the trackpad. A
  # value of 1 will disable tapping and gestures but not movement. A value of 2
  # will disable all input. A value of 3 will also disable physical buttons.
  # Integer. Default is 0.
  Option "TrackpadDisable" "0"

  # Adjusts the sensitivity (movement speed) of the touchpad. This is a real
  # number greater than or equal to zero. Default is 1. A value of 0 will
  # disable pointer movement.
  Option "Sensitivity" "1"

  # Defines the pressure at which a finger is detected as a touch. This is a
  # percentage represented as an integer. Default is 5.
  Option "FingerHigh" "5"

  # Defines the pressure at which a finger is detected as a release. This is a
  # percentage represented as an integer. Default is 5.
  Option "FingerLow" "5"

  # Whether or not to ignore touches that are determined to be thumbs. Boolean
  # value. Defaults to false.
  Option "IgnoreThumb" "false"

  # Whether or not to ignore touches that are determined to be palms. Boolean
  # value. Defaults to false.
  Option "IgnorePalm" "false"

  # Whether or not to disable the entire trackpad when a thumb is touching.
  # Boolean value. Defaults to false.
  Option "DisableOnThumb" "false"

  # Whether or not to disable the entire trackpad when a palm is touching.
  # Boolean value. Defaults to false.
  Option "DisableOnPalm" "false"

  # The width/length ratio of what's considered a thumb. It is expected that a
  # thumb is longer than it is wide. This tells the driver how much longer.
  # Percentage represented by an integer. Defaults to 70.
  Option "ThumbRatio" "70"

  # The minimum size of what's considered a thumb. It is expected that a thumb
  # will be larger than other fingers. This is represented as a percentage of
  # the maximum touch value and is dependent on the trackpad hardware. Integer
  # value. Defaults to 25.
  Option "ThumbSize" "25"

  # The minimum size of what's considered a palm. Palms are expected to be very
  # large on the trackpad. This is represented as a percentage of the maximum
  # touch value and is dependent on the trackpad hardware. Integer value.
  # Defaults to 40.
  Option "PalmSize" "40"

  # The size of an area at the bottom of the trackpad where new touches are
  # ignored (fingers traveling into this area from above will still be
  # tracked). This is represented as a percentage of the total trackpad height.
  # Defaults to 10.
  Option "BottomEdge" "10"

  # Whether or not to enable the physical buttons on or near the trackpad.
  # Boolean value. Defaults to true.
  Option "ButtonEnable" "true"

  # Whether or not the physical buttons are integrated with the trackpad. If
  # you have a one-piece trackpad like on newer MacBooks, this should be set to
  # true. Button emulation depends on this value being correct. Boolean value.
  # Defaults to true.
  Option "ButtonIntegrated" "true"

  # Whether or not to count the moving finger when emulating button clicks.
  # Useful to disable if you use two hands on trackpad. Boolean value. Defaults
  # to true.
  Option "ButtonMoveEmulate" "true"

  # Whether or not to enable button zones. If button zones are enabled then the
  # trackpad will be split into one, two, or three vertical zones. Clicking the
  # integrated button in one of these zones will send the button event for
  # ClickFinger1, ClickFinger2, or ClickFinger3. The driver will only add zones
  # for those ClickFinger values that are enabled. So setting ClickFinger1 to 0
  # and enabling the other two will create two zones, one for ClickFinger2 and
  # one for ClickFinger3. Boolean value. Defaults to false.
  Option "ButtonZonesEnable" "false"

  # How long (in ms) to consider a touching finger as part of button emulation.
  # A value of 0 will not expire touches. Integer value. Defaults to 100.
  Option "ButtonTouchExpire" "100"

  # Which button to emulate when one finger is touching the trackpad during a
  # click. Integer value. A value of 0 disables one-touch emulation. Defaults
  # to 3.
  Option "ClickFinger1" "3"

  # Which button to emulate when two fingers are touching the trackpad during a
  # click. Integer value. A value of 0 disabled one-touch emulation. Defaults
  # to 2.
  Option "ClickFinger2" "2"

  # Which button to emulate when three fingers are touching the trackpad during
  # a click. Integer value. A value of 0 disabled one-touch emulation. Defaults
  # to 0.
  Option "ClickFinger3" "0"

  # Which button to emulate for one-finger tapping. Integer value. A value of 0
  # disables one-finger tapping. Defaults to 1.
  Option "TapButton1" "1"

  # Which button to emulate for two-finger tapping. Integer value. A value of 0
  # disables two-finger tapping. Defaults to 3.
  Option "TapButton2" "3"

  # Which button to emulate for three-finger tapping. Integer value. A value of
  # 0 disables three-finger tapping. Defaults to 2.
  Option "TapButton3" "2"

  # Which button to emulate for four-finger tapping. Integer value. A value of
  # 0 disables three-finger tapping. Defaults to 0.
  Option "TapButton4" "0"

  # When tapping, how much time to hold down the emulated button. Integer value
  # representing milliseconds. Defaults to 50.
  Option "ClickTime" "50"

  # The amount of time to wait for a tap to release before counting it as a
  # move. Integer value representing milliseconds. Defaults to 120.
  Option "MaxTapTime" "120"

  # How far a touch is allowed to move before counting it is no longer
  # considered a tap. Integer value. Defaults to 400.
  Option "MaxTapMove" "400"

  # When a gesture triggers a click, how much time to hold down the emulated
  # button. Integer value representing milliseconds. Defaults to 10.
  Option "GestureClickTime" "10"

  # Touches are allowed to transition from one gesture to another. For example,
  # you may go from scrolling to swiping without releasing your fingers from
  # the pad. This value is the amount of time you must be performing the new
  # gesture before it is triggered. This prevents accidental touches from
  # triggering other gestures. Integer value representing milliseconds.
  # Defaults to 100.
  Option "GestureWaitTime" "100"

  # For two finger scrolling. How far you must move your fingers before a
  # button click is triggered. Integer value. Defaults to 150.
  Option "ScrollDistance" "150"

  # For two finger scrolling. The button that is triggered by scrolling up.
  # Integer value. A value of 0 disables scrolling up. Defaults to 4.
  Option "ScrollUpButton" "4"

  # For two finger scrolling. The button that is triggered by scrolling down.
  # Integer value. A value of 0 disables scrolling down. Defaults to 5.
  Option "ScrollDownButton" "5"

  # For two finger scrolling. The button that is triggered by scrolling left.
  # Integer value. A value of 0 disables scrolling left. Defaults to 6.
  Option "ScrollLeftButton" "6"

  # For two finger scrolling. The button that is triggered by scrolling right.
  # Integer value. A value of 0 disables scrolling right. Defaults to 7.
  Option "ScrollRightButton" "7"

  # For three finger swiping. How far you must move your fingers before a
  # button click is triggered. Integer value. Defaults to 700.
  Option "SwipeDistance" "700"

  # For three finger swiping. The button that is triggered by swiping up.
  # Integer value. A value of 0 disables swiping up. Defaults to 8.
  Option "SwipeUpButton" "8"

  # For three finger swiping. The button that is triggered by swiping down.
  # Integer value. A value of 0 disables swiping down. Defaults to 9.
  Option "SwipeDownButton" "9"

  # For three finger swiping. The button that is triggered by swiping left.
  # Integer value. A value of 0 disables swiping left. Defaults to 10.
  Option "SwipeLeftButton" "10"

  # For three finger swiping. The button that is triggered by swiping right.
  # Integer value. A value of 0 disables swiping right. Defaults to 11.
  Option "SwipeRightButton" "11"

  # For four finger swiping. How far you must move your fingers before a button
  # click is triggered. Integer value. Defaults to 700.
  Option "Swipe4Distance" "700"

  # For four finger swiping. The button that is triggered by swiping up.
  # Integer value. A value of 0 disables swiping up. Defaults to 8.
  Option "Swipe4UpButton" "8"

  # For four finger swiping. The button that is triggered by swiping down.
  # Integer value. A value of 0 disables swiping down. Defaults to 9.
  Option "Swipe4DownButton" "9"

  # For four finger swiping. The button that is triggered by swiping left.
  # Integer value. A value of 0 disables swiping left. Defaults to 10.
  Option "Swipe4LeftButton" "10"

  # For four finger swiping. The button that is triggered by swiping right.
  # Integer value. A value of 0 disables swiping right. Defaults to 11.
  Option "Swipe4RightButton" "11"

  # For pinch scaling. How far you must move your fingers before a button click
  # is triggered. Integer value. Defaults to 150.
  Option "ScaleDistance" "150"

  # For pinch scaling. The button that is triggered by scaling up. Integer
  # value. A value of 0 disables scaling up. Defaults to 12.
  Option "ScaleUpButton" "12"

  # For pinch scaling. The button that is triggered by scaling down. Integer
  # value. A value of 0 disables scaling down. Defaults to 13.
  Option "ScaleDownButton" "13"

  # For two finger rotation. How far you must move your fingers before a button
  # click is triggered. Integer value. Defaults to 150.
  Option "RotateDistance" "150"

  # For two finger rotation. The button that is triggered by rotating left.
  # Integer value. A value of 0 disables rotation left. Defaults to 14.
  Option "RotateLeftButton" "14"

  # For two finger rotation. The button that is triggered by rotating right.
  # Integer value. A value of 0 disables rotation right. Defaults to 14.
  Option "RotateRightButton" "14"

  # Whether or not to enable tap-to-drag functionality. Boolean value. Defaults
  # to true.
  Option "TapDragEnable" "true"

  # The tap-to-drag timeout. This is how long the driver will wait after a
  # single tap for a movement event before sending the click. Integer value
  # representing milliseconds. Defaults to 350.
  Option "TapDragTime" "350"

  # How long after detecting movement to trigger a button down event. During
  # this time pointer movement will be disabled. Increase this value if you
  # find you're draggin when you don't wish it. Integer value representing
  # milliseconds. Defaults to 40.
  Option "TapDragWait" "40"

  # How far the finger is allowed to move during drag wait time. If the finger
  # moves farther than this distance during the wait time then dragging will be
  # canceled and pointer movement will resume. Integer value. Defaults to 200.
  Option "TapDragDist" "200"

  # Whether or not to invert the X axis. Boolean value. Defaults to false.
  Option "AxisXInvert" "false"

  # Whether or not to invert the Y axis. Boolean value. Defaults to false
  Option "AxisYInvert" "false"

EndSection

Dispad

Dispad was written by the same author as xf86-input-mtrack. It is a simple damen that continously disables the trackpad while the keyboard is in use:

https://github.com/BlueDragonX/dispad

I’ve found it absolutely invaluable for preventing annoying palm clicks. You can install it from the AUR just as you do mtrack:

https://aur.archlinux.org/packages/dispad-git/

To ensure that it is running, place the following in your .xinitrc:

dispad --pidfile=~/.dispad.pid