Swiftpack.co - Package - Toxblh/MTMR

My touchbar. My rules. GitHub release license minimal system requirements travis

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. It's my first Swift project for MacOS :)

Share your presets here

Mackbook with touchbar

Discord Telegram

PayPal donate button Buy Me A Coffee My TouchBar My Rules (MTMR)

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

screenshot 2019-02-24 at 23 19 20

🍏→ System Preferences → Security and Privacy → tab Privacy → Accessibility → MTMR

Examples

MTMR presets

Presets for touchbar

Customization

MTMR preferences are stored under ~/Library/Application\ Support/MTMR/items.json.

The pre-installed configuration contains less or more than you'll probably want, try to configure:

Built-in button types:

Buttons

  • escape
  • exitTouchbar
  • brightnessUp
  • brightnessDown
  • illuminationUp (keyboard illumination)
  • illuminationDown (keyboard illumination)
  • volumeDown
  • volumeUp
  • mute

Native Plugins

  • timeButton
  • battery
  • 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

Media Keys

  • previous
  • play
  • next

AppleScript plugins

  • sleep
  • displaySleep

Custom buttons

  • staticButton
  • appleScriptTitledButton
  • shellScriptTitledButton

Gestures on central part:

  • two finger slide: change you Volume
  • three finger slide: change you Brightness

Built-in slider types:

  • brightness
  • volume

You can also make custom buttons using these types

staticButton

 "type": "staticButton",
 "title": "esc",

appleScriptTitledButton

  {
    "type": "appleScriptTitledButton",
    "refreshInterval": 60, //optional
    "source": {
      "filePath": "~/Library/Application Support/MTMR/iTunes.nowPlaying.scpt",
      // or
      "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",
      // or
      "base64": "StringInbase64"
    }
  }

shellScriptTitledButton

Note: script may return also colors using escape sequences (read more here https://misc.flogisoft.com/bash/tip_colors_and_formatting) Only "16 Colors" mode supported atm. If background color returned, button will pick it up as own background color.

Example of "CPU load" button which also changes color based on load value.

{
  "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}'"
  },
  "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": {
    // Or you can specify a filePath here.
    // Images will be resized to 24x24.
    // "filePath": "~/myproject/myimage.jpg" // or "/fixed/path/to/the.png"
    "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

timeButton

Attention! Works not all: 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: you need to register on https://openweathermap.org to get your API key
Note: you may need to wait for near 20 mins until your API key will be activated by Openweathermap
Note: you need to allow using "Location Services" in your Mac OS "Security & Privacy" settings for MTMR

  "type": "weather",
  "refreshInterval": 600, // in seconds
  "units": "metric", // or imperial
  "icon_type": "text" // or images
  "api_key": "" // you can get the key on openweather

yandexWeather (experimental)

Provider: https://yandex.ru/pogoda. One click to open up weather forecast in your browser.
Note: you need to allow using "Location Services" in your Mac OS "Security & Privacy" settings for MTMR

  "type": "yandexWeather",
  "refreshInterval": 600 // in seconds

currency

Provider: https://coinbase.com

  "type": "currency",
  "refreshInterval": 600, // in seconds
  "align": "right",
  "from": "BTC",
  "to": "USD",
  "full": true // £‣1.29$

music

{
  "type": "music",
  "align": "center",
  "width": 80, // Optional
  "bordered": false, // Optional
  "refreshInterval": 2, // in seconds. Optional. Default 5 seconds
  "disableMarquee": true // to disable marquee effect. Optional. Default false
},

pomodoro

Pomodoro plugin. One click to start the work timer, longclick to start the rest timer. Click in progress for reset.

{
  "type": "pomodoro",
  "workTime": 1200, // set time work in seconds. Default 1500 (25 min)
  "restTime": 600 // set time rest in seconds. Default 300 (5 min)
},

network

Network plugin. The plugin to show usage a network

{
  "type": "network",
  "flip": true
},

dock

Dock plugin

{
  "type": "dock",
  "filter": "(^Xcode$)|(Safari)|(.*player)",
  "autoResize": true
},

Actions:

  • hidKey

    https://github.com/aosm/IOHIDFamily/blob/master/IOHIDSystem/IOKit/hidsystem/ev_keymap.h use only numbers

 "action": "hidKey",
 "keycode": 53,
  • keyPress
 "action": "keyPress",
 "keycode": 1,
  • appleScript
 "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",
    // "filePath" or "base64" will work as well
 },
  • shellScript
 "action": "shellScript",
 "executablePath": "/usr/bin/pmset",
 "shellArguments": ["sleepnow"], // optional

  • openUrl
 "action": "openUrl",
 "url": "https://google.com",

LongActions

If you want to longPress for some operations, it is similar to the configuration for Actions but with additional parameters, for example:

 "longAction": "hidKey",
 "longKeycode": 53,
  • longAction
  • longKeycode
  • longActionAppleScript
  • longExecutablePath
  • longShellArguments
  • longUrl

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" // "left", "right" or "center"
  • bordered you can do button without border
  "bordered": "false" // "true" or "false"

Roadmap

  • ☑ Create the first prototype with TouchBar in Storyboard
  • ☑ Put in stripe menu on startup the application
  • ☑ Find how to simulate real buttons like brightness, volume, night shift and etc.
  • ☑ Time in touchbar!
  • ☑ First the weather plugin
  • ☑ Find how to open full-screen TouchBar without the cross and stripe menu
  • ☑ Find how to add haptic feedback
  • ☑ Add icon and menu in StatusBar
  • ☑ Hide from Dock
  • ☑ Status menu: "preferences", "quit"
  • ☑ JSON or another approch for save preset, maybe in ~/Library/Application Support/MTMR/
  • ☑ Custom buttons size, actions by click
  • ☑ Layout: [always left, NSSliderView for center, always right]
  • ☑ System for autoupdate (https://sparkle-project.org/)
  • ☐ Overwrite default values from item types (e.g. title for brightness)
  • ☐ Custom settings for paddings and margins for buttons
  • ☐ XPC Service for scripts
  • ☐ UI for settings
  • ☐ Import config from BTT

Settings:

  • ☐ Interface for plugins and export like presets
  • ☑ Startup at login
  • ☐ Show on/off in Dock
  • ☐ Show on/off in StatusBar
  • ☐ On/off Haptic Feedback

Maybe:

  • ☐ Refactoring the application into packages (AppleScript, JavaScript? and Swift?)

Credits

Built by @Toxblh and @ReDetection.

Analytics

Github

link
Stars: 1758

Dependencies

Used By

Total: 0

Releases

Relative paths. Dock improve. Multitouch settings. Swift 5.1 - 2019-11-19 16:23:43

  • Multitouch settings & swift 5.1. (Thanks to @ReDetection)
  • Dock improvements (Thanks to @ReDetection)
    • extract to settings
    • cleanup in config parser (there were two parts reading the same, one was never executed)
    • implement filter for dock items
    • rewrite from NSScrubber to NSScrollView. mainly to fix open/terminate of the wrong app (not the one being touched), but also to fix extra dock reloads
    • more stylish frontmost app indicator
  • Relative file paths (Thanks to @markrickert)
  • Cleanup parser (Thanks to @ReDetection)

Added HapticFeedback setting - 2019-10-12 12:29:55

image

Add locale to timeButton - 2019-09-04 11:12:47

Fixes. Ya.Weather. Haptic Feedback. - 2019-07-29 11:17:13

DarkMode. Auto weight for Dock - 2019-05-22 21:56:19

Dark mode

{ "type": "darkMode" }

Dock additional property:

"autoResize": true

Network "flip" parameter. Improved stability. - 2019-03-25 12:28:46

Add an additional parameter for network widget flip for change position output and input traffic.

{
	"type": "network",
	"flip": true,
},

Network plugin - 2019-02-24 23:24:23

touch bar shot 2019-02-24 at 23 13 37

try it!

{
  "type": "network",
  "width": 80,
  "align": "right",
},

Stable AppleScript. Thanks @ReDetection - 2019-02-12 23:18:18

Fixed sometime crashes - 2019-02-06 13:49:32

Fix crashes app without timeZone - 2019-01-23 11:58:51

timeZone for timeButton - 2019-01-22 09:28:09

Attention! Works not all: en.wikipedia.org/wiki/List_of_time_zone_abbreviations

{
  "type": "timeButton",
  "formatTemplate": "dd HH:mm",
  "timeZone": "UTC"
}

Full show currency rates - 2019-01-21 17:06:48

touch bar shot 2019-01-21 at 20 02 36

Add to currency block for the full show

"full": true

The default is a short version

Fixes - 2018-10-14 18:12:08

  • Fix reversed 'hide control strip' menu checkmark behaviour
  • Fix can't re-open mtmr after closing

Fix for brightness slider - 2018-10-10 17:24:03

Fix for brightness slider. Correct API for the set new level. Used CoreDisplay.framework

Fixed privacy problems - 2018-09-26 16:27:55

Added AutoUpdater. Added License, don't need open settings for first start - 2018-09-25 23:26:34

image

NightShift, Don't disturb widgets - 2018-08-30 15:47:23

Added new widgets: touch bar shot 2018-08-30 at 16 30 23 touch bar shot 2018-08-30 at 16 30 25

  • NightShift

{
    "type": "nightShift",
},
  • Don't disturb

{
    "type": "dnd",
},

Added Keyboard illumination buttons - 2018-08-26 20:18:42

Added types

illuminationDown illuminationUp

{
    "type": "illuminationDown",
    "align": "left"
  },
  {
    "type": "illuminationUp",
    "align": "left"
  }

issue #106

Preparation for MacOS 10.14 - 2018-06-10 10:16:51

Added possible to work on MacOS 10.14

Groups, Encoding for AS, Start at Login - 2018-06-01 08:31:18

Groups

{
"type": "group",
"align": "center",
"bordered": true,
"title": "stats",
"items": [{ button }, {button}, ...]
}

Start at Login

image

PR #90

Gestures on the central part - 2018-05-22 10:34:56

Gestures on the central part:

  • two finger slide: change you Volume
  • three finger slide: change you Brightness
  • widgets grouping (subgroups)
  • possibility set custom title

Music. Few new settings. - 2018-05-14 09:47:50

New settings: image

  • Show/Hide Control Strip
  • Toggle for blacklist apps will hide MTMR if active the app in the blacklist.

New widget:

  • Music, tap for pause, longTap for next
{
  "type": "music",
  "align": "center",
  "width": 80,
  "bordered": false,
  "refreshInterval": 2,
},

few inner updates:

  • New create and setting for button
  • Better realise borderless buttons
  • Update icon in control strip
  • Changed brightness key codes for buttons

Background for buttons! And buttons with minimal width. Tap and LongTap actions - 2018-04-30 21:45:15

New config for buttons: "bordered": false - if you want to use a button with minimal width without selection a width

And now you can choose background color in HEX #RGBA "background": "#FFAA00FF"

Tap and LongTap: exp. tap:

{
...
longTapAction:
// or
tapAction: {
	"actionType": ""
	// like action
}
...
}```


small changes: 
- Battery time remaining stay like exponent for the percentage

Minor fix - 2018-04-26 13:55:57

fixed bugs - 2018-04-24 10:19:19

fixed #43 #44

You can stay comments in JSON config! - 2018-04-23 12:12:43

InputSource, sort in central, +del button, auto reload preset by changes - 2018-04-22 23:57:40

Native Widgets! - 2018-04-21 00:51:32

In the version added new 3 native widgets:

  • Weather
  • Currency
  • Battery

Updates

  • Added new action: openUrl with additional parameter url
  • Added new button: type: mute
  • FIxed reload for the central scroller
  • Updated default preset.

Added Open preset. Better work reload preset. - 2018-04-19 15:26:18

Added Dock plugin - 2018-04-17 08:37:18

touch bar shot 2018-04-17 at 09 33 13

"type": "dock" work only align left or right