MacOS – Can a shortcut be created to toggle menubar visibility (that would persist, as the dock’s does)

macosmenu barshortcut

I can choose in Syst Prefs to have the menubar show always or hide with auto-show (auto-show being show on hover or show on focus-by-keyboard-shortcut).

But when I'm working, I want the menubar always visible. And when I'm recreating, I want it usually hidden.

I like that with the dock I can hit commandoptiond to show or hide the dock, and it stays shown or hidden until I press the same shortcut again.

I wish the menubar worked this way too. Can such a shortcut be created somehow?

Best Answer

You asked, "Can a shortcut be created to toggle menubar visibility (that would persist, as the dock's does)?" and the short answer is, yes.

However, the longer answer is, while it's technically and natively possible to create an Automator Service workflow that gets assigned a keyboard shortcut to hide/unhide the Menu bar in OS X 10.11 and later, including the current macOS, it's not without its issues.

  • You'd have to assign the Automator Service a keyboard shortcut that does not interfere with an existing shortcut in every app that might have focus when you triggered the service's keyboard shortcut.
  • Every app that has focus when the service's keyboard shortcut is triggered would have to be added to System Preferences > Security & Privacy > Privacy > Accessibility, in order for the service's keyboard shortcut to work.

A possible workaround to the second point above would be if there's a third-party app that can be globally set to trigger the Automator Service work flow (or the AppleScript code as an AppleScript script or app not using an Automator Service). This might include apps like Alfred, FastScripts, Karabiner, Karabiner-Elements, Keyboard Maestro, etc., and having not tested these third party apps under this particular scenario I can only offer that as something to look into.

So, how about an AppleScript app you could place in the Dock, so it's readily available to click on, that will toggle the state of the Menu bar? You'd only have to add that AppleScript app to System Preferences > Security & Privacy > Privacy > Accessibility, in order for it to work.

In lieu of a third-party app or as an Automator Service and just as a plain AppleScript app, you do have a keyboard shortcut built in by way of Spotlight, in that you press space and the first character or two of the name you gave to the AppleScript app and then press enter. As an example, name it tmb.app for toggle menu bar, the you'd press spacetmenter to trigger the AppleScript App. After all, I double you already have an app named tm installed.

However, that said, it too is not without possible issues in that it relies on UI Scripting, meaning, it has to open System Preferences to the General settings and click the "Automatically hide and show the menu bar" checkbox and close System Preferences. This means once you triggered the app, you have to let it run and not manually steal focus from System Preferences while the UI Scripting events take place. In other words, you have to stop multitasking for a couple of seconds.

In part, one of the issues using AppleScript and or UI Scripting to hide/unhide the Menu bar is it's just not as graceful as hiding the Dock with its built-in keyboard shortcut, but it's at least doable.

That all said, here's the AppleScript code, that can be used in either an AppleScript script/app, Automator Service, or possibly a third party app, that will toggle the state of the Menu bar in OS X 10.11 and later via UI Scripting.


tell application "System Preferences"
    reveal pane id "com.apple.preference.general"
    delay 1
    tell application "System Events"
        click checkbox "Automatically hide and show the menu bar" of window "General" of process "System Preferences"
    end tell
    quit
end tell

Note there is no error checking to ensure this code in run under OS X 10.11 and later so don't try using it in versions of OS X prior to 10.11. Also note that the value of the delay command may need to be adjusted as necessary under the working conditions of your system.