それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

macOSのメニューバー項目を コマンドから表示・非表示をトグルして切り替える。(VPNの表示非表示の例

macのメニューバーの項目を表示・非表示するのがメンドクサ

VPN を接続したときだけメニューバーに表示してくれればいいのに、VPNを使わないときもVPNメニューがでてくるのは邪魔だよね。

defaults で制御できる。

メニューバーの項目は、defaults で設定値を取り出せるんです。

takuya@menubar$ defaults read com.apple.systemuiserver menuExtras
(
    "/System/Library/CoreServices/Menu Extras/Clock.menu",
    "/System/Library/CoreServices/Menu Extras/Battery.menu",
    "/System/Library/CoreServices/Menu Extras/TextInput.menu",
    "/System/Library/CoreServices/Menu Extras/User.menu",
    "/System/Library/CoreServices/Menu Extras/TimeMachine.menu",
    "/System/Library/CoreServices/Menu Extras/AirPort.menu",
    "/System/Library/CoreServices/Menu Extras/Volume.menu",
    "/System/Library/CoreServices/Menu Extras/Bluetooth.menu"
)

これを使えば、書き込むことも可能でしょ。欲しい物だけ、トグル出来たら便利なので。

VPNメニューのボタンアイコンって、ダサいんですよ。

f:id:takuya_1st:20190903175429p:plain

f:id:takuya_1st:20190903175444p:plain

VPNメニューをトグルするサンプル

特に工夫もなく、思いつくままに書き加えたコードがこちら。

import ast
import subprocess
import argparse
from pprint import  pprint as pp



def toggle_vpn_menu( enable=True ):
  vpn_menu = '/System/Library/CoreServices/Menu Extras/VPN.menu'

  ret = subprocess.check_output("defaults read com.apple.systemuiserver menuExtras", shell=True, universal_newlines=True)
  menus = ast.literal_eval(ret)

  vpn_menu_exists = any([vpn_menu in e for e in menus])

  if vpn_menu_exists  and enable is False : # disable
    ##
    menus = [x for x in menus if not vpn_menu in x]
    cmd = 'defaults write com.apple.systemuiserver menuExtras -array '.split() + menus
    subprocess.check_call(cmd)
    ##
    cmd = "killall SystemUIServer -HUP".split()
    subprocess.check_call(cmd)
    return

  if not vpn_menu_exists and  enable is True: # enable
    menus = list(menus)
    menus.append(vpn_menu)
    cmd = 'defaults write com.apple.systemuiserver menuExtras -array '.split() + menus
    subprocess.check_call(cmd)
    ##
    cmd = "killall SystemUIServer -HUP".split()
    subprocess.check_call(cmd)


def main():
  parser = argparse.ArgumentParser(description=u'VPNメニューをオンオフする。')

  parser.add_argument('-e ', '--enable', action="store_true", help=u'有効化')
  parser.add_argument('-d ', '--disable', action="store_true", help=u'無効化')

  args = parser.parse_args()

  if args.enable:
    toggle_vpn_menu(True)
  else:
    toggle_vpn_menu(False)



if __name__ == '__main__':
    main()

ちなみに、表示するだけなら

` '/System/Library/CoreServices/Menu Extras' `` にある該当メニューをダブルクリックして開くだけで、表示だけならできる。

"open '/System/Library/CoreServices/Menu Extras/VPN.menu'"

f:id:takuya_1st:20190904110543p:plain