summaryrefslogtreecommitdiff
path: root/mac/.config/sketchybar.mon/plugins/space.py
diff options
context:
space:
mode:
Diffstat (limited to 'mac/.config/sketchybar.mon/plugins/space.py')
-rwxr-xr-xmac/.config/sketchybar.mon/plugins/space.py199
1 files changed, 199 insertions, 0 deletions
diff --git a/mac/.config/sketchybar.mon/plugins/space.py b/mac/.config/sketchybar.mon/plugins/space.py
new file mode 100755
index 0000000..7ed3e55
--- /dev/null
+++ b/mac/.config/sketchybar.mon/plugins/space.py
@@ -0,0 +1,199 @@
+#!/usr/bin/python3
+
+import os, json, re
+
+ICON_MAP = [
+ {"regex": r"1Password", "icon": ":one_password:"},
+ {"regex": r"Affinity Designer", "icon": ":affinity_designer:"},
+ {"regex": r"Affinity Photo", "icon": ":affinity_photo:"},
+ {"regex": r"Affinity Publisher", "icon": ":affinity_publisher:"},
+ {"regex": r"Airmail", "icon": ":airmail:"},
+ {"regex": r"Alacritty|Hyper|iTerm2|kitty|Terminal|WezTerm", "icon": ":terminal:"},
+ {"regex": r"Alfred", "icon": ":alfred:"},
+ {"regex": r"Android Messages", "icon": ":android_messages:"},
+ {"regex": r"Android Studio", "icon": ":android_studio:"},
+ {"regex": r"App Store", "icon": ":app_store:"},
+ {"regex": r"Atom", "icon": ":atom:"},
+ {"regex": r"Audacity", "icon": ":audacity:"},
+ {"regex": r"Bear", "icon": ":bear:"},
+ {"regex": r"Bitwarden", "icon": ":bit_warden:"},
+ {"regex": r"Blender", "icon": ":blender:"},
+ {"regex": r"Brave Browser", "icon": ":brave_browser:"},
+ {"regex": r"Calendar|Fantastical|Cron|Morgen", "icon": ":calendar:"},
+ {"regex": r"Calibre", "icon": ":book:"},
+ {
+ "regex": r"Canary Mail|HEY|Mail|Mailspring|MailMate|邮件|Outlook|Gmail|Mimestream",
+ "icon": ":mail:",
+ },
+ {"regex": r"Caprine", "icon": ":caprine:"},
+ {
+ "regex": r"Chromium|Google Chrome|Google Chrome Canary",
+ "icon": ":google_chrome:",
+ },
+ {"regex": r"CleanMyMac X", "icon": ":desktop:"},
+ {"regex": r"ClickUp", "icon": ":click_up:"},
+ {"regex": r"Code|Code - Insiders", "icon": ":code:"},
+ {"regex": r"Color Picker", "icon": ":color_picker:"},
+ {"regex": r"DataGrip", "icon": ":datagrip:"},
+ {"regex": r"Default", "icon": ":default:"},
+ {"regex": r"DEVONthink 3", "icon": ":devonthink3:"},
+ {"regex": r"Discord|Discord Canary|Discord PTB", "icon": ":discord:"},
+ {"regex": r"Drafts", "icon": ":drafts:"},
+ {"regex": r"Dropbox", "icon": ":dropbox:"},
+ {"regex": r"Element", "icon": ":element:"},
+ {"regex": r"Emacs", "icon": ":emacs:"},
+ {"regex": r"Evernote Legacy", "icon": ":evernote_legacy:"},
+ {"regex": r"FaceTime", "icon": ":face_time:"},
+ {"regex": r"Figma", "icon": ":figma:"},
+ {"regex": r"Final Cut Pro", "icon": ":final_cut_pro:"},
+ {"regex": r"Finder|访达", "icon": ":finder:"},
+ {
+ "regex": r"Firefox Developer Edition|Firefox Nightly",
+ "icon": ":firefox_developer_edition:",
+ },
+ {"regex": r"Firefox", "icon": ":firefox:"},
+ {"regex": r"Folx", "icon": ":folx:"},
+ {"regex": r"GitHub Desktop", "icon": ":git_hub:"},
+ {"regex": r"Grammarly Editor", "icon": ":grammarly:"},
+ {"regex": r"GrandTotal|Receipts", "icon": ":dollar:"},
+ {"regex": r"IINA", "icon": ":playing:"},
+ {"regex": r"Insomnia", "icon": ":insomnia:"},
+ {"regex": r"IntelliJ IDEA", "icon": ":idea:"},
+ {"regex": r"Iris", "icon": ":iris:"},
+ {"regex": r"Joplin", "icon": ":joplin:"},
+ {"regex": r"Kakoune", "icon": ":kakoune:"},
+ {"regex": r"KeePassXC", "icon": ":kee_pass_x_c:"},
+ {"regex": r"Keyboard Maestro", "icon": ":keyboard_maestro:"},
+ {"regex": r"Keynote", "icon": ":keynote:"},
+ {"regex": r"League of Legends", "icon": ":league_of_legends:"},
+ {"regex": r"LibreWolf", "icon": ":libre_wolf:"},
+ {"regex": r"Linear", "icon": ":linear:"},
+ {"regex": r"Live", "icon": ":ableton:"},
+ {"regex": r"MAMP|MAMP PRO", "icon": ":mamp:"},
+ {"regex": r"Matlab", "icon": ":matlab:"},
+ {"regex": r"Mattermost", "icon": ":mattermost:"},
+ {"regex": r"Messages|Nachrichten", "icon": ":messages:"},
+ {"regex": r"Microsoft Edge", "icon": ":microsoft_edge:"},
+ {"regex": r"Microsoft Excel", "icon": ":microsoft_excel:"},
+ {"regex": r"Microsoft PowerPoint", "icon": ":microsoft_power_point:"},
+ {"regex": r"Microsoft Teams", "icon": ":microsoft_teams:"},
+ {"regex": r"Microsoft To Do|Things", "icon": ":things:"},
+ {"regex": r"Microsoft Word", "icon": ":microsoft_word:"},
+ {"regex": r"Min", "icon": ":min_browser:"},
+ {"regex": r"MoneyMoney", "icon": ":bank:"},
+ {"regex": r"mpv", "icon": ":mpv:"},
+ {"regex": r"Music", "icon": ":music:"},
+ {"regex": r"Neovide|MacVim|Vim|VimR", "icon": ":vim:"},
+ {"regex": r"Notability", "icon": ":notability:"},
+ {"regex": r"Notes", "icon": ":notes:"},
+ {"regex": r"Notion", "icon": ":notion:"},
+ {"regex": r"Nova", "icon": ":nova:"},
+ {"regex": r"Numbers", "icon": ":numbers:"},
+ {"regex": r"OBS", "icon": ":obsstudio:"},
+ {"regex": r"Obsidian", "icon": ":obsidian:"},
+ {"regex": r"OmniFocus", "icon": ":omni_focus:"},
+ {"regex": r"Pages", "icon": ":pages:"},
+ {"regex": r"Parallels Desktop", "icon": ":parallels:"},
+ {"regex": r"Pi-hole Remote", "icon": ":pihole:"},
+ {"regex": r"Pine", "icon": ":pine:"},
+ {"regex": r"Podcasts", "icon": ":podcasts:"},
+ {"regex": r"PomoDone App", "icon": ":pomodone:"},
+ {"regex": r"Preview|Skim|zathura|PDFgear", "icon": ":pdf:"},
+ {"regex": r"qutebrowser", "icon": ":qute_browser:"},
+ {"regex": r"Reeder", "icon": ":reeder5:"},
+ {"regex": r"Reminders", "icon": ":reminders:"},
+ {"regex": r"Safari|Safari Technology Preview|Orion", "icon": ":safari:"},
+ {"regex": r"Sequel Ace", "icon": ":sequel_ace:"},
+ {"regex": r"Sequel Pro", "icon": ":sequel_pro:"},
+ {"regex": r"Setapp", "icon": ":setapp:"},
+ {"regex": r"Signal", "icon": ":signal:"},
+ {"regex": r"Sketch", "icon": ":sketch:"},
+ {"regex": r"Skype", "icon": ":skype:"},
+ {"regex": r"Slack", "icon": ":slack:"},
+ {"regex": r"Spark", "icon": ":spark:"},
+ {"regex": r"Spotify", "icon": ":spotify:"},
+ {"regex": r"Spotlight", "icon": ":spotlight:"},
+ {"regex": r"Sublime Text", "icon": ":sublime_text:"},
+ {"regex": r"System Preferences|System Settings", "icon": ":gear:"},
+ {"regex": r"TeamSpeak 3", "icon": ":team_speak:"},
+ {"regex": r"Telegram", "icon": ":telegram:"},
+ {"regex": r"Thunderbird", "icon": ":thunderbird:"},
+ {"regex": r"TickTick", "icon": ":tick_tick:"},
+ {"regex": r"TIDAL", "icon": ":tidal:"},
+ {"regex": r"Todoist", "icon": ":todoist:"},
+ {"regex": r"Tor Browser", "icon": ":tor_browser:"},
+ {"regex": r"Tower", "icon": ":tower:"},
+ {"regex": r"Transmit", "icon": ":transmit:"},
+ {"regex": r"Trello", "icon": ":trello:"},
+ {"regex": r"Tweetbot|Twitter", "icon": ":twitter:"},
+ {"regex": r"Typora", "icon": ":text:"},
+ {"regex": r"Vivaldi", "icon": ":vivaldi:"},
+ {"regex": r"VLC", "icon": ":vlc:"},
+ {"regex": r"VMware Fusion", "icon": ":vmware_fusion:"},
+ {"regex": r"VSCodium", "icon": ":vscodium:"},
+ {"regex": r"WebStorm", "icon": ":web_storm:"},
+ {"regex": r"WhatsApp", "icon": ":whats_app:"},
+ {"regex": r"Xcode", "icon": ":xcode:"},
+ {"regex": r"Zeplin", "icon": ":zeplin:"},
+ {"regex": r"zoom.us", "icon": ":zoom:"},
+ {"regex": r"Zotero", "icon": ":zotero:"},
+ {"regex": r"Zulip", "icon": ":zulip:"},
+ {"regex": r"微信", "icon": ":wechat:"},
+ {"regex": r"网易云音乐", "icon": ":netease_music:"},
+]
+
+
+def to_sup(s):
+ sups = {
+ "0": "\u2070",
+ "1": "\xb9",
+ "2": "\xb2",
+ "3": "\xb3",
+ "4": "\u2074",
+ "5": "\u2075",
+ "6": "\u2076",
+ "7": "\u2077",
+ "8": "\u2078",
+ "9": "\u2079",
+ }
+
+ return "".join(sups.get(char, char) for char in str(s))
+
+
+def to_icon(app):
+ for x in ICON_MAP:
+ if re.search(x["regex"], app):
+ return x["icon"]
+ return ":default:"
+
+
+def to_formatted_icon(app, c):
+ cnt = f" {to_sup(c)}" if c > 1 else ""
+ return f"{to_icon(app)}{cnt}"
+
+
+def to_formatted_icons(apps):
+ return " ".join([to_formatted_icon(app, cnt) for app, cnt in apps.items()])
+
+
+spaces = {}
+apps = json.loads(os.popen("yabai -m query --windows").read())
+for app in apps:
+ spaces[app["space"]] = spaces.get(app["space"], {})
+ spaces[app["space"]][app["app"]] = spaces[app["space"]].get(app["app"], 0) + 1
+
+args = " ".join(
+ [
+ f'--set space.{space} label="{to_formatted_icons(apps)}" label.drawing=on'
+ for space, apps in spaces.items()
+ ]
+)
+default_args = "--set spaces_bracket drawing=off --set '/space\..*/' background.drawing=on --animate sin 10"
+
+args2 = ""
+spaces = json.loads(os.popen("yabai -m query --spaces").read())
+for space in spaces:
+ if not space["windows"]:
+ args2 = f'{args2} --set space.{space["index"]} label="" label.drawing=off'
+
+os.system(f"sketchybar -m {default_args} {args} {args2}")