My touchbar. My rules.


The TouchBar Customization App for your MacBook Pro
My idea is to create a platform for creating plugins to customize the TouchBar. I very much like BTT and having a full custom TouchBar (my BTT preset), and I wanted to create it.
Share your presets here
Visial editor for MTMR -> MTMR Designer
All thanks to @josetwentyfour
Discord
Telegram
Installation
On first install you need to allow access for MTMR in Accessibility otherwise buttons like Esc, Volume, Brightness and other system keys won’t work.
🍏→ System Preferences → Security and Privacy → tab Privacy → Accessibility → MTMR
Examples
MTMR presets
Customization
MTMR preferences are stored in ~/Library/Application\ Support/MTMR/items.json.
The pre-installed configuration contains less or more than you’ll probably want, try to configure:
Buttons
- escape
- exitTouchbar
- brightnessUp
- brightnessDown
- illuminationUp (keyboard illumination)
- illuminationDown (keyboard illumination)
- volumeDown
- volumeUp
- mute
Native Plugins
- timeButton
- battery
- cpu
- currency
- weather
- yandexWeather
- inputsource
- music (tap for pause, longTap for next)
- dock (half-long click to open app, full-long click to kill app)
- nightShift
- dnd (Don’t disturb)
- darkMode
- pomodoro
- network
- upnext (Calendar events)
Media Keys
AppleScript plugins
Custom buttons
- staticButton
- appleScriptTitledButton
- shellScriptTitledButton
Gestures
By default you can enable basic gestures from application menu (status bar -> MTMR icon -> Volume/Brightness gestures):
- two finger slide: change you Volume
- three finger slide: change you Brightness
Custom gestures
You can add custom actions for two/three/four finger swipes. To do it, you need to use swipe type:
"type": "swipe",
"fingers": 2, // number of fingers required (2,3 or 4)
"direction": "right", // direction of swipe (right/left)
"minOffset": 10, // optional: minimal required offset for gesture to emit event
"sourceApple": { // optional: apple script to run
"inline": "beep"
},
"sourceBash": { // optional: bash script to run
"inline": "touch /Users/lobster/test"
}
You may create as many swipe objects in the preset as you want.
Built-in slider types:
"type": "staticButton",
"title": "esc",
{
"type": "appleScriptTitledButton",
"refreshInterval": 60,
"source": {
"filePath": "~/Library/Application Support/MTMR/iTunes.nowPlaying.scpt",
"inline": "tell application \"Finder\"\rif not (exists window 1) then\rmake new Finder window\rset target of front window to path to home folder as string\rend if\ractivate\rend tell",
"base64": "StringInbase64"
},
}
Note: You can change appleScriptTitledButton’s icon by following these steps:
- Declare dictionary of icons in
alternativeImages field
- Make you script return array of two values -
{"TITLE", "IMAGE_LABEL"}
- Make sure that your
IMAGE_LABEL is declared in alternativeImages field
Example:
{
"type": "appleScriptTitledButton",
"source": {
"inline": "if (random number from 1 to 2) = 1 then\n\tset val to {\"title\", \"play\"}\nelse\n\tset val to {\"title\", \"pause\"}\nend if\nreturn val"
},
"refreshInterval": 1,
"image": {
"base64": "iVBORw0KGgoAAAANSUhEUgA..."
},
"alternativeImages": {
"play": {
"base64": "iVBORw0KGgoAAAANSUhEUgAAAAAA..."
},
"pause": {
"base64": "iVBORw0KGgoAAAANSUhEUgAAAIAA..."
}
}
},
Note: script may also use escape sequences to return colors (read https://misc.flogisoft.com/bash/tip_colors_and_formatting for more information)
“16 Colors” is the only mode supported presently. Buttons will set their own background color to the color returned.
Example of “CPU load” button which also changes color based on load value (Note: The native cpu plugin runs runs better):
{
"type": "shellScriptTitledButton",
"width": 80,
"refreshInterval": 2,
"source": {
"inline": "top -l 2 -n 0 -F | egrep -o ' \\d*\\.\\d+% idle' | tail -1 | awk -F% '{p = 100 - $1; if (p > 30) c = \"\\033[33m\"; if (p > 70) c = \"\\033[30;43m\"; printf \"%s%4.1f%%\\n\", c, p}'"
},
"actions": [
{
"trigger": "singleTap",
"action": "appleScript",
"actionAppleScript": {
"inline": "activate application \"Activity Monitor\"\rtell application \"System Events\"\r\ttell process \"Activity Monitor\"\r\t\ttell radio button \"CPU\" of radio group 1 of group 2 of toolbar 1 of window 1 to perform action \"AXPress\"\r\tend tell\rend tell"
}
}
],
"align": "right",
"image": {
"base64":
"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA/1BMVEUAAADaACbYACfYACfjABzXACjYACfXACjYACfYACfYACfYACfdACLYACfXACjYACfVACv/AADXACjYACfYACfXACjYACfXACjaACXYACfYACfVACvYACfYACfZACbZACbYACfYACfZACb/AADYACfYACfVACrXACjVACu/AEDYACfYACfYACfXACjXACjYACfXACjYACfYACfYACfXACjYACfXACjYACfYACfZACbYACfYACfMADPYACfYACfYACfYACfYACfZACbXACjYACfYACfRAC7XACjYACfZACbWACnXACjXACjYACfTACzZACb/AADYACfYACfYACcAAAA+zneGAAAAU3RSTlMAItK+CVPjh3xUxPwPiGDQGAMtSKmN3Vk+wPQG/e26oIJBnwJCdiuAHgTmw+6BX+IgfaqLUvKOW8VKnagK+vBwYrhlc/urCznvhSyUbOEXPAFjGh/ektAAAAABYktHRACIBR1IAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4ggWETQWgEDcSgAAAqVJREFUWMPtl4ly2jAQhsUNNlcw5r4SICEHLSQhCQRyX73T/u//LpUlLIyxbMAznWmn/0ywo5U+27tr7ZoQuwLBUJidRKIxPhKLRtgxHAoGiLfiQIKdKFCTxjGpQmEDCSC+BiAFpNlJBsgaxyyQYQNpIPUf8AcAOzktD+iaoQJQNI5FoMAGdCCv5XZclpfKFXiqUi5Jllf1mvdyQzW96gigd4h6o+mhRp1O0x3vvwa1VSWeqrZU1Jyeogy01ggSVQsoO/i/gjq9/u6u+2LDXq2jshqLHNCgdsCVwO0NILdi0oDmuoAmoImhQDzFRPNnb36L7U43NVfc2EH2D9h5t9OePyIF5IU9uIhvkyN7iiXmQUIOj8x/lB6f0bTaQ3ZA+9iaNCH2Lpg6btsBIRJOpJl0E9ABTvof5kqEGeCjMaN/AnRMgM5XJcI2J1J1gf6S48Tb2Ae6JkAjdgmAeJ1XAOJ1Xg8wGJ6elXwAzkeGjy62BgxG3MuXnoCIkmEq8EQyAUPgajyhPxJAga9SIiRqzwMOuAbGZDrDjQRgKkpiqiPgFphM74B7d4BKy2cyy1RcBvSodUb/HiSAIl+VlEfh8cm4wvPL9nnw+gbc+kkkUVioO95etwe8PBuP8vQoBzg7UQAe5t7syZwoCaMA3AN30wlzh3MYJYkkADeYTckYuJYlkiSVBeCKZtSY/gxlqezlxEt+pdFg6zBesPXn1ih8Aj5vkAels9PhYCkPsl++kg0AQu4dyuqmugIQm+qS5Nv6N+D7wm7d1skPc4xu666Fhd6BxU6r+jub8tNaWNxK29EhsdpR/sVn7FlLm0txPdgni+JrFNd3p+K67MQtyrsp3w2G7xbHd5Plv83z3Wj6b3V9N9ssFv7afaa//ZPn3wD4/vje8PP/N7TebS0hgZhEAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTA4LTIyVDE3OjUyOjIyKzAyOjAwc2qUYAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0wOC0yMlQxNzo1MjoyMiswMjowMAI3LNwAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC"
},
"bordered": false
}
Groups
{
"type": "group",
"align": "center",
"bordered": true,
"title": "stats",
"items": [
{ "type": "play" },
{ "type": "mute" },
...
]
}
To close a group, use the button:
{
"type": "close",
"width": 64
},
Native plugins
cpu
Shows current CPU load in percent, changes color based on load value.
Has lower power consumption and higher stability than the shell-based solution.
{
"type": "cpu",
"refreshInterval": 3,
"width": 80
}
NOTE: Some values don’t work properly: https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations
formatTemplate examples: https://www.datetimeformatter.com/how-to-format-date-time-in-swift/
locale examples: https://gist.github.com/jacobbubu/1836273
{
"type": "timeButton",
"formatTemplate": "dd HH:mm",
"locale": "en_GB",
"timeZone": "UTC"
}
weather
Provider: https://openweathermap.org
Note: Register at https://openweathermap.org to get your API key
Note: Wait for 20 minutes or so for Openweathermap to activate your API key.
Note: Enable MTMR in “Location Services” in the “Security & Privacy” System Preferences pane
"type": "weather",
"refreshInterval": 600,
"units": "metric",
"icon_type": "text",
"api_key": ""
yandexWeather (experimental)
Provider: https://yandex.ru/pogoda. One click to open up weather forecast in your browser.
Note: Enable MTMR in “Location Services” in the “Security & Privacy” System Preferences pane
"type": "yandexWeather",
"refreshInterval": 600
currency
Provider: https://coinbase.com
"type": "currency",
"refreshInterval": 600,
"align": "right",
"from": "BTC",
"to": "USD",
"full": true
music
{
"type": "music",
"align": "center",
"width": 80,
"bordered": false,
"refreshInterval": 2,
"disableMarquee": true
},
pomodoro
Pomodoro plugin. One tap starts the work timer, long-press to start the rest timer. Tap an in-progress timer to reset.
{
"type": "pomodoro",
"workTime": 1200,
"restTime": 600
},
network
Network plugin. The plugin to show network usage
{
"type": "network",
"flip": true,
"units": "dynamic"
},
dock
Dock plugin
{
"type": "dock",
"filter": "(^Xcode$)|(Safari)|(.*player)",
"autoResize": true
},
upnext
Calendar next event plugin
Displays upcoming events from macOS Calendar. Does not display current event.
{
"type": "upnext",
"from": 0,
"to": 12,
"maxToShow": 3,
"autoResize": false
},
Actions:
Example:
"actions": [
{
"trigger": "singleTap",
"action": "hidKey",
"keycode": 53
}
]
Triggers:
singleTap
doubleTap
tripleTap
longTap
Types
"action": "hidKey",
"keycode": 53,
"action": "keyPress",
"keycode": 1,
"action": "appleScript",
"actionAppleScript": {
"inline": "tell application \"Finder\"\rif not (exists window 1) then\rmake new Finder window\rset target of front window to path to home folder as string\rend if\ractivate\rend tell",
},
"action": "shellScript",
"executablePath": "/usr/bin/pmset",
"shellArguments": ["sleepnow"],
"action": "openUrl",
"url": "https://google.com",
Additional parameters:
width restrict how much room a particular button will take
"width": 34
align can stick the item to the side. default is center
"align": "left"
bordered you can do button without border
"bordered": "false"
background allow to specify you button background color
"background": "#FF0000",
by using background with color “#000000” and bordered == false you can create button without gray background but with background when the button is pressed
title specify button title
"title": "hello"
image specify button icon
"image": {
"base64": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAABGdB...."
"filePath": "~/img.png"
}
matchAppId displays the button only when active app’s id matches given regexp
"matchAppId": "Safari"
Troubleshooting
If you can’t open preferences:
- Opening another program which can’t edit text
- Open Terminal.app
- Put
open -a TextEdit ~/Library/Application\ Support/MTMR/items.json command and press Enter
- “After the last update my mtmr is not working anymore!”
- “Buttons sometimes do not trigger action”
- “ESC don’t work”
- “Gestures don’t work”
Re-tick or check a tick for access 🍏→ System Preferences → Security and Privacy → tab Privacy → Accessibility → MTMR
Credits
Built by @Toxblh and @ReDetection.

评论