mac desktop
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
### SketchyBar
|
||||
|
||||
This sketchybar setup is insipred by Praveen Gongada's
|
||||
[setup](https://github.com/PraveenGongada/dotfiles/tree/main/sketchybar)
|
||||
|
||||
##### Installation
|
||||
|
||||
```bash
|
||||
brew install felixkratz/formulae/sketchybar
|
||||
brew install jq
|
||||
brew install font-sf-pro
|
||||
brew install --cask sf-symbols
|
||||
curl -L https://github.com/kvndrsslr/sketchybar-app-font/releases/download/v2.0.40/sketchybar-app-font.ttf -o $HOME/Library/Fonts/sketchybar-app-font.ttf
|
||||
curl -L https://github.com/kvndrsslr/sketchybar-app-font/releases/download/v2.0.40/icon_map.sh -o $HOME/.config/sketchybar/icon_map.sh
|
||||
```
|
||||
|
||||
##### Mitigation of some common problems that I faced
|
||||
|
||||
1) Praveen using version 1 of the config (needs to be declared coreclty in the sketchybarrc).
|
||||
2) All the script must be user executable.
|
||||
3) For `after-start-up` command in the `aerospace.toml` to start `borders` and `sketchybar`, prefer keeping all the three bin files in the same bin folder. For me this was
|
||||
in `/opt/homebrew/bin` (on one machine that have). On the other even though
|
||||
files were on different paths, `sketchybar` worked with `brew services star`
|
||||
after I loaded `aerospace`.
|
||||
4) Also in the aerospace.toml, wherever `sketchybar` or `borders` are
|
||||
referenced, the full path must be used. The newer version of the config
|
||||
supports `[exec.env-vars]` to set the path. Here I am just using the dirty way
|
||||
of supplying the full path wherever needed.
|
||||
@@ -1,10 +0,0 @@
|
||||
local colors = require("colors")
|
||||
|
||||
-- Equivalent to the --bar domain
|
||||
sbar.bar({
|
||||
topmost = "window",
|
||||
height = 50,
|
||||
color = colors.bar.bg,
|
||||
padding_right = 3,
|
||||
padding_left = 3,
|
||||
})
|
||||
@@ -1,28 +0,0 @@
|
||||
return {
|
||||
black = 0xff25273A,
|
||||
white = 0xffb5c9ff,
|
||||
red = 0xffFF6C8D,
|
||||
green = 0xff90D05A,
|
||||
blue = 0xff6EA3FE,
|
||||
yellow = 0xffE9AD5B,
|
||||
orange = 0xffFF9856,
|
||||
magenta = 0xffC198FD,
|
||||
grey = 0xff9AA9D9,
|
||||
transparent = 0x00000000,
|
||||
|
||||
bar = {
|
||||
bg = 0x00ffffff,
|
||||
border = 0x00ffffff,
|
||||
},
|
||||
popup = {
|
||||
bg = 0xee25273A,
|
||||
border = 0xff1E2030,
|
||||
},
|
||||
bg1 = 0xff25273A,
|
||||
bg2 = 0xff1E2030,
|
||||
|
||||
with_alpha = function(color, alpha)
|
||||
if alpha > 1.0 or alpha < 0.0 then return color end
|
||||
return (color & 0x00ffffff) | (math.floor(alpha * 255.0) << 24)
|
||||
end,
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
local settings = require("settings")
|
||||
local colors = require("colors")
|
||||
|
||||
-- Equivalent to the --default domain
|
||||
sbar.default({
|
||||
updates = "when_shown",
|
||||
icon = {
|
||||
font = {
|
||||
family = settings.font.text,
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 14.0
|
||||
},
|
||||
color = colors.white,
|
||||
padding_left = settings.paddings,
|
||||
padding_right = settings.paddings,
|
||||
background = { image = { corner_radius = 9 } },
|
||||
},
|
||||
label = {
|
||||
font = {
|
||||
family = settings.font.text,
|
||||
style = settings.font.style_map["Semibold"],
|
||||
size = 13.0
|
||||
},
|
||||
color = colors.white,
|
||||
padding_left = settings.paddings,
|
||||
padding_right = settings.paddings,
|
||||
},
|
||||
background = {
|
||||
height = 34,
|
||||
corner_radius = 12,
|
||||
border_width = 0,
|
||||
border_color = colors.bg2,
|
||||
image = {
|
||||
corner_radius = 9,
|
||||
border_color = colors.grey,
|
||||
border_width = 0
|
||||
}
|
||||
},
|
||||
popup = {
|
||||
background = {
|
||||
border_width = 0,
|
||||
corner_radius = 9,
|
||||
border_color = colors.popup.border,
|
||||
color = colors.popup.bg,
|
||||
shadow = { drawing = true },
|
||||
},
|
||||
blur_radius = 50,
|
||||
},
|
||||
padding_left = 5,
|
||||
padding_right = 5,
|
||||
scroll_texts = true,
|
||||
})
|
||||
@@ -0,0 +1 @@
|
||||
icon_map.sh
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
|
||||
export TRANSPARENT=0x00ffffff
|
||||
|
||||
# -- Catpuccin Scheme --
|
||||
export ITEM_COLOR=0xff1e1e2e
|
||||
export ACCENT_COLOR=0xffcba6f7
|
||||
|
||||
# -- Gray Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xffc3c6cb
|
||||
|
||||
# -- White Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xffffffff
|
||||
|
||||
# -- Teal Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xff2cf9ed
|
||||
|
||||
# -- Purple Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xffeb46f9
|
||||
|
||||
# -- Red Scheme ---
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xffff2453
|
||||
|
||||
# -- Blue Scheme ---
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xff15bdf9
|
||||
|
||||
# -- Green Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xff1dfca1
|
||||
|
||||
# -- Orange Scheme --
|
||||
# export ITEM_COLOR=0xffffffff
|
||||
# export ACCENT_COLOR=0xfff97716
|
||||
|
||||
# -- Yellow Scheme --
|
||||
# export ITEM_COLOR=0xff000000
|
||||
# export ACCENT_COLOR=0xfff7fc17
|
||||
@@ -0,0 +1,926 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
### START-OF-ICON-MAP
|
||||
function __icon_map() {
|
||||
case "$1" in
|
||||
"Live")
|
||||
icon_result=":ableton:"
|
||||
;;
|
||||
"Activity Monitor" | "Aktivitätsanzeige")
|
||||
icon_result=":activity_monitor:"
|
||||
;;
|
||||
"Adobe Bridge"*)
|
||||
icon_result=":adobe_bridge:"
|
||||
;;
|
||||
"Affinity Designer")
|
||||
icon_result=":affinity_designer:"
|
||||
;;
|
||||
"Affinity Designer 2")
|
||||
icon_result=":affinity_designer_2:"
|
||||
;;
|
||||
"Affinity Photo")
|
||||
icon_result=":affinity_photo:"
|
||||
;;
|
||||
"Affinity Photo 2")
|
||||
icon_result=":affinity_photo_2:"
|
||||
;;
|
||||
"Affinity Publisher")
|
||||
icon_result=":affinity_publisher:"
|
||||
;;
|
||||
"Affinity Publisher 2")
|
||||
icon_result=":affinity_publisher_2:"
|
||||
;;
|
||||
"Airmail")
|
||||
icon_result=":airmail:"
|
||||
;;
|
||||
"AirPort Utility")
|
||||
icon_result=":airport_utility:"
|
||||
;;
|
||||
"Alacritty")
|
||||
icon_result=":alacritty:"
|
||||
;;
|
||||
"Alfred")
|
||||
icon_result=":alfred:"
|
||||
;;
|
||||
"Android Messages")
|
||||
icon_result=":android_messages:"
|
||||
;;
|
||||
"Android Studio")
|
||||
icon_result=":android_studio:"
|
||||
;;
|
||||
"Anki")
|
||||
icon_result=":anki:"
|
||||
;;
|
||||
"Anytype")
|
||||
icon_result=":anytype:"
|
||||
;;
|
||||
"Apifox")
|
||||
icon_result=":apifox:"
|
||||
;;
|
||||
"App Eraser")
|
||||
icon_result=":app_eraser:"
|
||||
;;
|
||||
"App Store")
|
||||
icon_result=":app_store:"
|
||||
;;
|
||||
"Arc")
|
||||
icon_result=":arc:"
|
||||
;;
|
||||
"Arduino" | "Arduino IDE")
|
||||
icon_result=":arduino:"
|
||||
;;
|
||||
"Atom")
|
||||
icon_result=":atom:"
|
||||
;;
|
||||
"Audacity")
|
||||
icon_result=":audacity:"
|
||||
;;
|
||||
"Bambu Studio")
|
||||
icon_result=":bambu_studio:"
|
||||
;;
|
||||
"MoneyMoney")
|
||||
icon_result=":bank:"
|
||||
;;
|
||||
"Battle.net")
|
||||
icon_result=":battle_net:"
|
||||
;;
|
||||
"Bazecor")
|
||||
icon_result=":bazecor:"
|
||||
;;
|
||||
"Bear")
|
||||
icon_result=":bear:"
|
||||
;;
|
||||
"BetterTouchTool")
|
||||
icon_result=":bettertouchtool:"
|
||||
;;
|
||||
"Bilibili" | "哔哩哔哩")
|
||||
icon_result=":bilibili:"
|
||||
;;
|
||||
"Bitwarden")
|
||||
icon_result=":bit_warden:"
|
||||
;;
|
||||
"Blender")
|
||||
icon_result=":blender:"
|
||||
;;
|
||||
"Blitzit")
|
||||
icon_result=":blitzit:"
|
||||
;;
|
||||
"BluOS Controller")
|
||||
icon_result=":bluos_controller:"
|
||||
;;
|
||||
"Books" | "Calibre" | "Bücher")
|
||||
icon_result=":book:"
|
||||
;;
|
||||
"Brave Browser")
|
||||
icon_result=":brave_browser:"
|
||||
;;
|
||||
"Bruno")
|
||||
icon_result=":bruno:"
|
||||
;;
|
||||
"BusyCal")
|
||||
icon_result=":busycal:"
|
||||
;;
|
||||
"Calculator" | "Calculette" | "Rechner")
|
||||
icon_result=":calculator:"
|
||||
;;
|
||||
"Calendar" | "日历" | "Fantastical" | "Cron" | "Amie" | "Calendrier" | "カレンダー" | "Notion Calendar" | "Kalender")
|
||||
icon_result=":calendar:"
|
||||
;;
|
||||
"calibre")
|
||||
icon_result=":calibre:"
|
||||
;;
|
||||
"Capacities")
|
||||
icon_result=":capacities:"
|
||||
;;
|
||||
"Caprine")
|
||||
icon_result=":caprine:"
|
||||
;;
|
||||
"Amazon Chime")
|
||||
icon_result=":chime:"
|
||||
;;
|
||||
"Cisco AnyConnect Secure Mobility Client" | "Cisco Secure Client")
|
||||
icon_result=":cisco_anyconnect:"
|
||||
;;
|
||||
"Citrix Workspace" | "Citrix Viewer")
|
||||
icon_result=":citrix:"
|
||||
;;
|
||||
"Claude")
|
||||
icon_result=":claude:"
|
||||
;;
|
||||
"ClickUp")
|
||||
icon_result=":click_up:"
|
||||
;;
|
||||
"Code" | "Code - Insiders")
|
||||
icon_result=":code:"
|
||||
;;
|
||||
"Cold Turkey Blocker")
|
||||
icon_result=":cold_turkey_blocker:"
|
||||
;;
|
||||
"Color Picker" | "数码测色计")
|
||||
icon_result=":color_picker:"
|
||||
;;
|
||||
"Copilot")
|
||||
icon_result=":copilot:"
|
||||
;;
|
||||
"CotEditor")
|
||||
icon_result=":coteditor:"
|
||||
;;
|
||||
"Creative Cloud")
|
||||
icon_result=":creative_cloud:"
|
||||
;;
|
||||
"Cursor")
|
||||
icon_result=":cursor:"
|
||||
;;
|
||||
"Cypress")
|
||||
icon_result=":cypress:"
|
||||
;;
|
||||
"DataGrip")
|
||||
icon_result=":datagrip:"
|
||||
;;
|
||||
"DataSpell")
|
||||
icon_result=":dataspell:"
|
||||
;;
|
||||
"DaVinci Resolve")
|
||||
icon_result=":davinciresolve:"
|
||||
;;
|
||||
"DBeaver")
|
||||
icon_result=":dbeaver:"
|
||||
;;
|
||||
"DeepSeek")
|
||||
icon_result=":deepseek:"
|
||||
;;
|
||||
"Deezer")
|
||||
icon_result=":deezer:"
|
||||
;;
|
||||
"Default")
|
||||
icon_result=":default:"
|
||||
;;
|
||||
"deno")
|
||||
icon_result=":deno:"
|
||||
;;
|
||||
"CleanMyMac X")
|
||||
icon_result=":desktop:"
|
||||
;;
|
||||
"DEVONthink 3")
|
||||
icon_result=":devonthink3:"
|
||||
;;
|
||||
"Dexcom")
|
||||
icon_result=":dexcom:"
|
||||
;;
|
||||
"Dia")
|
||||
icon_result=":dia:"
|
||||
;;
|
||||
"DingTalk" | "钉钉" | "阿里钉")
|
||||
icon_result=":dingtalk:"
|
||||
;;
|
||||
"Discord" | "Discord Canary" | "Discord PTB")
|
||||
icon_result=":discord:"
|
||||
;;
|
||||
"Docker" | "Docker Desktop")
|
||||
icon_result=":docker:"
|
||||
;;
|
||||
"GrandTotal" | "Receipts")
|
||||
icon_result=":dollar:"
|
||||
;;
|
||||
"Double Commander")
|
||||
icon_result=":doublecmd:"
|
||||
;;
|
||||
"Drafts")
|
||||
icon_result=":drafts:"
|
||||
;;
|
||||
"draw.io")
|
||||
icon_result=":draw_io:"
|
||||
;;
|
||||
"Dropbox")
|
||||
icon_result=":dropbox:"
|
||||
;;
|
||||
"Element")
|
||||
icon_result=":element:"
|
||||
;;
|
||||
"Emacs")
|
||||
icon_result=":emacs:"
|
||||
;;
|
||||
"Evernote Legacy")
|
||||
icon_result=":evernote_legacy:"
|
||||
;;
|
||||
"FaceTime" | "FaceTime 通话")
|
||||
icon_result=":face_time:"
|
||||
;;
|
||||
"Feishu")
|
||||
icon_result=":feishu:"
|
||||
;;
|
||||
"Figma")
|
||||
icon_result=":figma:"
|
||||
;;
|
||||
"Final Cut Pro")
|
||||
icon_result=":final_cut_pro:"
|
||||
;;
|
||||
"Finder" | "访达")
|
||||
icon_result=":finder:"
|
||||
;;
|
||||
"Firefox")
|
||||
icon_result=":firefox:"
|
||||
;;
|
||||
"Firefox Developer Edition" | "Firefox Nightly")
|
||||
icon_result=":firefox_developer_edition:"
|
||||
;;
|
||||
"FL Studio")
|
||||
icon_result=":flstudio:"
|
||||
;;
|
||||
"Folx")
|
||||
icon_result=":folx:"
|
||||
;;
|
||||
"Fork")
|
||||
icon_result=":fork:"
|
||||
;;
|
||||
"Foxit PDF Reader")
|
||||
icon_result=":foxit_reader:"
|
||||
;;
|
||||
"Freeform")
|
||||
icon_result=":freeform:"
|
||||
;;
|
||||
"FreeTube")
|
||||
icon_result=":freetube:"
|
||||
;;
|
||||
"Fusion")
|
||||
icon_result=":fusion:"
|
||||
;;
|
||||
"System Preferences" | "System Settings" | "系统设置" | "Réglages Système" | "システム設定" | "Systemeinstellungen" | "Systemeinstellungen")
|
||||
icon_result=":gear:"
|
||||
;;
|
||||
"Ghostty")
|
||||
icon_result=":ghostty:"
|
||||
;;
|
||||
"GitHub Desktop")
|
||||
icon_result=":git_hub:"
|
||||
;;
|
||||
"Godot")
|
||||
icon_result=":godot:"
|
||||
;;
|
||||
"GoLand")
|
||||
icon_result=":goland:"
|
||||
;;
|
||||
"Goodnotes")
|
||||
icon_result=":goodnotes:"
|
||||
;;
|
||||
"Chromium" | "Google Chrome" | "Google Chrome Canary")
|
||||
icon_result=":google_chrome:"
|
||||
;;
|
||||
"Grammarly Editor")
|
||||
icon_result=":grammarly:"
|
||||
;;
|
||||
"Granola")
|
||||
icon_result=":granola:"
|
||||
;;
|
||||
"Helium")
|
||||
icon_result=":helium:"
|
||||
;;
|
||||
"Home Assistant")
|
||||
icon_result=":home_assistant:"
|
||||
;;
|
||||
"Hyper")
|
||||
icon_result=":hyper:"
|
||||
;;
|
||||
"IntelliJ IDEA")
|
||||
icon_result=":idea:"
|
||||
;;
|
||||
"IINA")
|
||||
icon_result=":iina:"
|
||||
;;
|
||||
"Adobe Illustrator"* | "Illustrator")
|
||||
icon_result=":illustrator:"
|
||||
;;
|
||||
"Adobe InDesign"* | "InDesign")
|
||||
icon_result=":indesign:"
|
||||
;;
|
||||
"Infuse")
|
||||
icon_result=":infuse:"
|
||||
;;
|
||||
"Inkdrop")
|
||||
icon_result=":inkdrop:"
|
||||
;;
|
||||
"Inkscape")
|
||||
icon_result=":inkscape:"
|
||||
;;
|
||||
"Insomnia")
|
||||
icon_result=":insomnia:"
|
||||
;;
|
||||
"iPhone Mirroring")
|
||||
icon_result=":iphone_mirroring:"
|
||||
;;
|
||||
"Iris")
|
||||
icon_result=":iris:"
|
||||
;;
|
||||
"iTerm" | "iTerm2")
|
||||
icon_result=":iterm:"
|
||||
;;
|
||||
"Jellyfin Media Player")
|
||||
icon_result=":jellyfin:"
|
||||
;;
|
||||
"JetBrains Gateway")
|
||||
icon_result=":jetbrains_gateway:"
|
||||
;;
|
||||
"JetBrains Toolbox")
|
||||
icon_result=":jetbrains_toolbox:"
|
||||
;;
|
||||
"Joplin")
|
||||
icon_result=":joplin:"
|
||||
;;
|
||||
"카카오톡" | "KakaoTalk")
|
||||
icon_result=":kakaotalk:"
|
||||
;;
|
||||
"Kakoune")
|
||||
icon_result=":kakoune:"
|
||||
;;
|
||||
"KeePassXC")
|
||||
icon_result=":kee_pass_x_c:"
|
||||
;;
|
||||
"Keyboard Maestro")
|
||||
icon_result=":keyboard_maestro:"
|
||||
;;
|
||||
"Keynote" | "Keynote 讲演")
|
||||
icon_result=":keynote:"
|
||||
;;
|
||||
"Kiro")
|
||||
icon_result=":kiro:"
|
||||
;;
|
||||
"kitty")
|
||||
icon_result=":kitty:"
|
||||
;;
|
||||
"Kodi")
|
||||
icon_result=":kodi:"
|
||||
;;
|
||||
"LanguageTool for Desktop")
|
||||
icon_result=":languagetool_for_desktop:"
|
||||
;;
|
||||
"League of Legends")
|
||||
icon_result=":league_of_legends:"
|
||||
;;
|
||||
"LibreWolf")
|
||||
icon_result=":libre_wolf:"
|
||||
;;
|
||||
"LibreOffice")
|
||||
icon_result=":libreoffice:"
|
||||
;;
|
||||
"Adobe Lightroom")
|
||||
icon_result=":lightroom:"
|
||||
;;
|
||||
"Lightroom Classic")
|
||||
icon_result=":lightroomclassic:"
|
||||
;;
|
||||
"LINE")
|
||||
icon_result=":line:"
|
||||
;;
|
||||
"Linear")
|
||||
icon_result=":linear:"
|
||||
;;
|
||||
"LM Studio")
|
||||
icon_result=":lm_studio:"
|
||||
;;
|
||||
"LocalSend")
|
||||
icon_result=":localsend:"
|
||||
;;
|
||||
"Logic Pro")
|
||||
icon_result=":logicpro:"
|
||||
;;
|
||||
"Logseq")
|
||||
icon_result=":logseq:"
|
||||
;;
|
||||
"Canary Mail" | "HEY" | "Mail" | "Mailspring" | "MailMate" | "Superhuman" | "Spark" | "邮件" | "メール")
|
||||
icon_result=":mail:"
|
||||
;;
|
||||
"MAMP" | "MAMP PRO")
|
||||
icon_result=":mamp:"
|
||||
;;
|
||||
"Maps" | "Google Maps" | "マップ" | "Karten")
|
||||
icon_result=":maps:"
|
||||
;;
|
||||
"Marta")
|
||||
icon_result=":marta:"
|
||||
;;
|
||||
"Matlab" | "MATLABWindow" | "MATLAB_R2024b" | "MATLAB_R2024a" | "MATLAB_R2023b" | "MATLAB_R2023a" | "MATLAB_R2022b" | "MATLAB_R2022a" | "MATLAB_R2021b" | "MATLAB_R2021a")
|
||||
icon_result=":matlab:"
|
||||
;;
|
||||
"Mattermost")
|
||||
icon_result=":mattermost:"
|
||||
;;
|
||||
"Google Meet")
|
||||
icon_result=":meet:"
|
||||
;;
|
||||
"Messages" | "信息" | "Nachrichten" | "メッセージ")
|
||||
icon_result=":messages:"
|
||||
;;
|
||||
"Messenger")
|
||||
icon_result=":messenger:"
|
||||
;;
|
||||
"Microsoft Edge")
|
||||
icon_result=":microsoft_edge:"
|
||||
;;
|
||||
"Microsoft Excel")
|
||||
icon_result=":microsoft_excel:"
|
||||
;;
|
||||
"Microsoft Outlook")
|
||||
icon_result=":microsoft_outlook:"
|
||||
;;
|
||||
"Microsoft PowerPoint")
|
||||
icon_result=":microsoft_power_point:"
|
||||
;;
|
||||
"Microsoft Remote Desktop")
|
||||
icon_result=":microsoft_remote_desktop:"
|
||||
;;
|
||||
"Microsoft Teams" | "Microsoft Teams (work or school)")
|
||||
icon_result=":microsoft_teams:"
|
||||
;;
|
||||
"Microsoft Word")
|
||||
icon_result=":microsoft_word:"
|
||||
;;
|
||||
"Min")
|
||||
icon_result=":min_browser:"
|
||||
;;
|
||||
"Miro")
|
||||
icon_result=":miro:"
|
||||
;;
|
||||
"MongoDB Compass"*)
|
||||
icon_result=":mongodb:"
|
||||
;;
|
||||
"Moonlight")
|
||||
icon_result=":moonlight:"
|
||||
;;
|
||||
"mpv")
|
||||
icon_result=":mpv:"
|
||||
;;
|
||||
"Mullvad Browser")
|
||||
icon_result=":mullvad_browser:"
|
||||
;;
|
||||
"Music" | "音乐" | "Musique" | "ミュージック" | "Musik")
|
||||
icon_result=":music:"
|
||||
;;
|
||||
"Navicat Premium")
|
||||
icon_result=":navicat:"
|
||||
;;
|
||||
"Neovide" | "neovide")
|
||||
icon_result=":neovide:"
|
||||
;;
|
||||
"Neovim" | "neovim" | "nvim")
|
||||
icon_result=":neovim:"
|
||||
;;
|
||||
"网易云音乐")
|
||||
icon_result=":netease_music:"
|
||||
;;
|
||||
"NimbleCommander" | "NimbleCommander-Unsigned")
|
||||
icon_result=":nimble_commander:"
|
||||
;;
|
||||
"Noodl" | "Noodl Editor")
|
||||
icon_result=":noodl:"
|
||||
;;
|
||||
"NordVPN")
|
||||
icon_result=":nord_vpn:"
|
||||
;;
|
||||
"Notability")
|
||||
icon_result=":notability:"
|
||||
;;
|
||||
"Notes" | "备忘录" | "メモ" | "Notizen")
|
||||
icon_result=":notes:"
|
||||
;;
|
||||
"Notion")
|
||||
icon_result=":notion:"
|
||||
;;
|
||||
"Nova")
|
||||
icon_result=":nova:"
|
||||
;;
|
||||
"Numbers" | "Numbers 表格")
|
||||
icon_result=":numbers:"
|
||||
;;
|
||||
"Obsidian")
|
||||
icon_result=":obsidian:"
|
||||
;;
|
||||
"OBS")
|
||||
icon_result=":obsstudio:"
|
||||
;;
|
||||
"OmniFocus")
|
||||
icon_result=":omni_focus:"
|
||||
;;
|
||||
"1Password")
|
||||
icon_result=":one_password:"
|
||||
;;
|
||||
"Open Video Downloader")
|
||||
icon_result=":open_video_downloader:"
|
||||
;;
|
||||
"ChatGPT")
|
||||
icon_result=":openai:"
|
||||
;;
|
||||
"OpenAI Translator")
|
||||
icon_result=":openai_translator:"
|
||||
;;
|
||||
"OpenVPN Connect")
|
||||
icon_result=":openvpn_connect:"
|
||||
;;
|
||||
"Opera")
|
||||
icon_result=":opera:"
|
||||
;;
|
||||
"OrbStack")
|
||||
icon_result=":orbstack:"
|
||||
;;
|
||||
"OrcaSlicer")
|
||||
icon_result=":orcaslicer:"
|
||||
;;
|
||||
"Orion" | "Orion RC")
|
||||
icon_result=":orion:"
|
||||
;;
|
||||
"Overleaf" | "ShareLaTeX")
|
||||
icon_result=":overleaf:"
|
||||
;;
|
||||
"Pages" | "Pages 文稿")
|
||||
icon_result=":pages:"
|
||||
;;
|
||||
"Parallels Desktop")
|
||||
icon_result=":parallels:"
|
||||
;;
|
||||
"Parsec")
|
||||
icon_result=":parsec:"
|
||||
;;
|
||||
"Passwords" | "Passwörter")
|
||||
icon_result=":passwords:"
|
||||
;;
|
||||
"PDF Expert")
|
||||
icon_result=":pdf_expert:"
|
||||
;;
|
||||
"Pearcleaner")
|
||||
icon_result=":pearcleaner:"
|
||||
;;
|
||||
"Phoenix Slides")
|
||||
icon_result=":phoenix_slides:"
|
||||
;;
|
||||
"Photos" | "Fotos")
|
||||
icon_result=":photos:"
|
||||
;;
|
||||
"Adobe Photoshop"*)
|
||||
icon_result=":photoshop:"
|
||||
;;
|
||||
"PhpStorm")
|
||||
icon_result=":php_storm:"
|
||||
;;
|
||||
"Pi-hole Remote")
|
||||
icon_result=":pihole:"
|
||||
;;
|
||||
"Pine")
|
||||
icon_result=":pine:"
|
||||
;;
|
||||
"Plex")
|
||||
icon_result=":plex:"
|
||||
;;
|
||||
"Plexamp")
|
||||
icon_result=":plexamp:"
|
||||
;;
|
||||
"Podcasts" | "播客")
|
||||
icon_result=":podcasts:"
|
||||
;;
|
||||
"PomoDone App")
|
||||
icon_result=":pomodone:"
|
||||
;;
|
||||
"Postman")
|
||||
icon_result=":postman:"
|
||||
;;
|
||||
"Premiere" | "Adobe Premiere" | "Adobe Premiere Pro 2024")
|
||||
icon_result=":premiere:"
|
||||
;;
|
||||
"Preview" | "预览" | "Skim" | "zathura" | "Aperçu" | "プレビュー" | "Vorschau")
|
||||
icon_result=":preview:"
|
||||
;;
|
||||
"Proton Mail" | "Proton Mail Bridge")
|
||||
icon_result=":proton_mail:"
|
||||
;;
|
||||
"Proton VPN" | "ProtonVPN")
|
||||
icon_result=":proton_vpn:"
|
||||
;;
|
||||
"PrusaSlicer" | "SuperSlicer")
|
||||
icon_result=":prusaslicer:"
|
||||
;;
|
||||
"PyCharm")
|
||||
icon_result=":pycharm:"
|
||||
;;
|
||||
"qBittorrent")
|
||||
icon_result=":qbittorrent:"
|
||||
;;
|
||||
"QLMarkdown")
|
||||
icon_result=":qlmarkdown:"
|
||||
;;
|
||||
"QQ")
|
||||
icon_result=":qq:"
|
||||
;;
|
||||
"QQ音乐" | "QQMusic")
|
||||
icon_result=":qqmusic:"
|
||||
;;
|
||||
"Quantumult X")
|
||||
icon_result=":quantumult_x:"
|
||||
;;
|
||||
"Quip")
|
||||
icon_result=":quip:"
|
||||
;;
|
||||
"qutebrowser")
|
||||
icon_result=":qute_browser:"
|
||||
;;
|
||||
"Raindrop.io")
|
||||
icon_result=":raindrop_io:"
|
||||
;;
|
||||
"Raycast")
|
||||
icon_result=":raycast:"
|
||||
;;
|
||||
"Reeder")
|
||||
icon_result=":reeder5:"
|
||||
;;
|
||||
"rekordbox")
|
||||
icon_result=":rekordbox:"
|
||||
;;
|
||||
"Reminders" | "提醒事项" | "Rappels" | "リマインダー" | "Erinnerungen")
|
||||
icon_result=":reminders:"
|
||||
;;
|
||||
"Replit")
|
||||
icon_result=":replit:"
|
||||
;;
|
||||
"Repo Prompt")
|
||||
icon_result=":repo_prompt:"
|
||||
;;
|
||||
"Rider" | "JetBrains Rider")
|
||||
icon_result=":rider:"
|
||||
;;
|
||||
"Rio")
|
||||
icon_result=":rio:"
|
||||
;;
|
||||
"Royal TSX")
|
||||
icon_result=":royaltsx:"
|
||||
;;
|
||||
"RustDesk")
|
||||
icon_result=":rustdesk:"
|
||||
;;
|
||||
"Safari" | "Safari浏览器" | "Safari Technology Preview")
|
||||
icon_result=":safari:"
|
||||
;;
|
||||
"Sequel Ace")
|
||||
icon_result=":sequel_ace:"
|
||||
;;
|
||||
"Sequel Pro")
|
||||
icon_result=":sequel_pro:"
|
||||
;;
|
||||
"Session")
|
||||
icon_result=":session:"
|
||||
;;
|
||||
"Setapp")
|
||||
icon_result=":setapp:"
|
||||
;;
|
||||
"SF Symbols" | "SF Symbole")
|
||||
icon_result=":sf_symbols:"
|
||||
;;
|
||||
"Shortcuts")
|
||||
icon_result=":shortcuts:"
|
||||
;;
|
||||
"Signal")
|
||||
icon_result=":signal:"
|
||||
;;
|
||||
"sioyek")
|
||||
icon_result=":sioyek:"
|
||||
;;
|
||||
"Sketch")
|
||||
icon_result=":sketch:"
|
||||
;;
|
||||
"Skype")
|
||||
icon_result=":skype:"
|
||||
;;
|
||||
"Slack")
|
||||
icon_result=":slack:"
|
||||
;;
|
||||
"Spark Desktop")
|
||||
icon_result=":spark:"
|
||||
;;
|
||||
"Spotify")
|
||||
icon_result=":spotify:"
|
||||
;;
|
||||
"Spotlight")
|
||||
icon_result=":spotlight:"
|
||||
;;
|
||||
"Steam" | "Steam Helper")
|
||||
icon_result=":steam:"
|
||||
;;
|
||||
"Studio 3T")
|
||||
icon_result=":studio_3t:"
|
||||
;;
|
||||
"Sublime Text")
|
||||
icon_result=":sublime_text:"
|
||||
;;
|
||||
"Summoners War")
|
||||
icon_result=":summoners_war:"
|
||||
;;
|
||||
"superProductivity")
|
||||
icon_result=":superproductivity:"
|
||||
;;
|
||||
"Surfshark")
|
||||
icon_result=":surfshark:"
|
||||
;;
|
||||
"T3 Chat")
|
||||
icon_result=":t3chat:"
|
||||
;;
|
||||
"Tabby")
|
||||
icon_result=":tabby:"
|
||||
;;
|
||||
"TablePlus")
|
||||
icon_result=":tableplus:"
|
||||
;;
|
||||
"Tana")
|
||||
icon_result=":tana:"
|
||||
;;
|
||||
"TeamSpeak 3")
|
||||
icon_result=":team_speak:"
|
||||
;;
|
||||
"Telegram")
|
||||
icon_result=":telegram:"
|
||||
;;
|
||||
"Terminal" | "终端" | "ターミナル")
|
||||
icon_result=":terminal:"
|
||||
;;
|
||||
"Termius")
|
||||
icon_result=":termius:"
|
||||
;;
|
||||
"Typora")
|
||||
icon_result=":text:"
|
||||
;;
|
||||
"TextEdit")
|
||||
icon_result=":textedit:"
|
||||
;;
|
||||
"Microsoft To Do" | "Things")
|
||||
icon_result=":things:"
|
||||
;;
|
||||
"Thunderbird")
|
||||
icon_result=":thunderbird:"
|
||||
;;
|
||||
"TickTick")
|
||||
icon_result=":tick_tick:"
|
||||
;;
|
||||
"TIDAL")
|
||||
icon_result=":tidal:"
|
||||
;;
|
||||
"Tiny RDM")
|
||||
icon_result=":tinyrdm:"
|
||||
;;
|
||||
"Todoist")
|
||||
icon_result=":todoist:"
|
||||
;;
|
||||
"Toggl Track")
|
||||
icon_result=":toggl_track:"
|
||||
;;
|
||||
"Tor Browser")
|
||||
icon_result=":tor_browser:"
|
||||
;;
|
||||
"Tower")
|
||||
icon_result=":tower:"
|
||||
;;
|
||||
"TradingView")
|
||||
icon_result=":trading_view:"
|
||||
;;
|
||||
"Transmit")
|
||||
icon_result=":transmit:"
|
||||
;;
|
||||
"Trello")
|
||||
icon_result=":trello:"
|
||||
;;
|
||||
"Tweetbot" | "Twitter")
|
||||
icon_result=":twitter:"
|
||||
;;
|
||||
"UTM")
|
||||
icon_result=":utm:"
|
||||
;;
|
||||
"VeraCrypt")
|
||||
icon_result=":veracrypt:"
|
||||
;;
|
||||
"MacVim" | "Vim" | "VimR")
|
||||
icon_result=":vim:"
|
||||
;;
|
||||
"Vivaldi")
|
||||
icon_result=":vivaldi:"
|
||||
;;
|
||||
"VLC")
|
||||
icon_result=":vlc:"
|
||||
;;
|
||||
"VMware Fusion")
|
||||
icon_result=":vmware_fusion:"
|
||||
;;
|
||||
"Vorta")
|
||||
icon_result=":vorta:"
|
||||
;;
|
||||
"VSCodium")
|
||||
icon_result=":vscodium:"
|
||||
;;
|
||||
"Warp")
|
||||
icon_result=":warp:"
|
||||
;;
|
||||
"Weather" | "Wetter")
|
||||
icon_result=":weather:"
|
||||
;;
|
||||
"WebStorm")
|
||||
icon_result=":web_storm:"
|
||||
;;
|
||||
"Webull Desktop")
|
||||
icon_result=":webull:"
|
||||
;;
|
||||
"微信" | "WeChat")
|
||||
icon_result=":wechat:"
|
||||
;;
|
||||
"企业微信" | "WeCom")
|
||||
icon_result=":wecom:"
|
||||
;;
|
||||
"WezTerm")
|
||||
icon_result=":wezterm:"
|
||||
;;
|
||||
"WhatsApp" | "WhatsApp")
|
||||
icon_result=":whats_app:"
|
||||
;;
|
||||
"Windows App")
|
||||
icon_result=":windows_app:"
|
||||
;;
|
||||
"WireGuard")
|
||||
icon_result=":wireguard:"
|
||||
;;
|
||||
"Xcode")
|
||||
icon_result=":xcode:"
|
||||
;;
|
||||
"Yandex Browser" | "Yandex Browser" | "Yandex")
|
||||
icon_result=":yandex_bower:"
|
||||
;;
|
||||
"Yandex Music")
|
||||
icon_result=":yandex_music:"
|
||||
;;
|
||||
"Yazi" | "yazi")
|
||||
icon_result=":yazi:"
|
||||
;;
|
||||
"YouTube")
|
||||
icon_result=":youtube:"
|
||||
;;
|
||||
"YouTube Music")
|
||||
icon_result=":youtube_music:"
|
||||
;;
|
||||
"Yuque" | "语雀")
|
||||
icon_result=":yuque:"
|
||||
;;
|
||||
"Zed")
|
||||
icon_result=":zed:"
|
||||
;;
|
||||
"Zen" | "Zen Browser")
|
||||
icon_result=":zen_browser:"
|
||||
;;
|
||||
"Zeplin")
|
||||
icon_result=":zeplin:"
|
||||
;;
|
||||
"zoom.us")
|
||||
icon_result=":zoom:"
|
||||
;;
|
||||
"Zotero")
|
||||
icon_result=":zotero:"
|
||||
;;
|
||||
"Zulip")
|
||||
icon_result=":zulip:"
|
||||
;;
|
||||
*)
|
||||
icon_result=":default:"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
### END-OF-ICON-MAP
|
||||
@@ -0,0 +1,67 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Loads all defined colors
|
||||
source "$CONFIG_DIR/colors.sh"
|
||||
|
||||
# This is a demo config to show some of the most important commands more easily.
|
||||
# This is meant to be changed and configured, as it is intentionally kept sparse.
|
||||
# For a more advanced configuration example see my dotfiles:
|
||||
# https://github.com/FelixKratz/dotfiles
|
||||
|
||||
PLUGIN_DIR="$CONFIG_DIR/plugins"
|
||||
ITEM_DIR="$CONFIG_DIR/items"
|
||||
|
||||
##### Bar Appearance #####
|
||||
# Configuring the general appearance of the bar, these are only some of the
|
||||
# options available. For all options see:
|
||||
# https://felixkratz.github.io/SketchyBar/config/bar
|
||||
# If you are looking for other colors, see the color picker:
|
||||
# https://felixkratz.github.io/SketchyBar/config/tricks#color-picker
|
||||
|
||||
sketchybar --bar height=36 \
|
||||
blur_radius=30 \
|
||||
position=top \
|
||||
sticky=on \
|
||||
padding_left=10 \
|
||||
padding_right=10 \
|
||||
color=0xcc1e1e2e
|
||||
|
||||
##### Changing Defaults #####
|
||||
# We now change some default values that are applied to all further items
|
||||
# For a full list of all available item properties see:
|
||||
# https://felixkratz.github.io/SketchyBar/config/items
|
||||
|
||||
sketchybar --default icon.font="SF Pro:Semibold:12.0" \
|
||||
icon.color=$ITEM_COLOR \
|
||||
label.font="SF Pro:Semibold:12.0" \
|
||||
label.color=$ITEM_COLOR \
|
||||
background.color=$ACCENT_COLOR \
|
||||
background.corner_radius=10 \
|
||||
background.height=20 \
|
||||
padding_left=4 \
|
||||
padding_right=4 \
|
||||
icon.padding_left=6 \
|
||||
icon.padding_right=3 \
|
||||
label.padding_left=3 \
|
||||
label.padding_right=6
|
||||
|
||||
# -- Left Side Items --
|
||||
source $ITEM_DIR/spaces.sh
|
||||
source $ITEM_DIR/front_app.sh
|
||||
|
||||
# -- Right Side Of Notch Items --
|
||||
# source $ITEM_DIR/media.sh
|
||||
|
||||
# -- Right Side Items --
|
||||
source $ITEM_DIR/calendar.sh
|
||||
source $ITEM_DIR/wifi.sh
|
||||
source $ITEM_DIR/battery.sh
|
||||
source $ITEM_DIR/volume.sh
|
||||
# source $ITEM_DIR/cpu.sh
|
||||
# source $ITEM_DIR/memory.sh
|
||||
|
||||
##### Finalizing Setup #####
|
||||
# The below command is only needed at the end of the initial configuration to
|
||||
# force all scripts to run the first time, it should never be run in an item script.
|
||||
|
||||
sketchybar --update
|
||||
@@ -1 +0,0 @@
|
||||
bin
|
||||
@@ -1,211 +0,0 @@
|
||||
return {
|
||||
["Typora"] = ":text:",
|
||||
["Orion"] = ":orion:",
|
||||
["Orion RC"] = ":orion:",
|
||||
["Grammarly Editor"] = ":grammarly:",
|
||||
["kitty"] = ":kitty:",
|
||||
["ClickUp"] = ":click_up:",
|
||||
["Iris"] = ":iris:",
|
||||
["PomoDone App"] = ":pomodone:",
|
||||
["qutebrowser"] = ":qute_browser:",
|
||||
["Raindrop.io"] = ":raindrop_io:",
|
||||
["Airmail"] = ":airmail:",
|
||||
["Affinity Publisher 2"] = ":affinity_publisher_2:",
|
||||
["Calendar"] = ":calendar:",
|
||||
["日历"] = ":calendar:",
|
||||
["Fantastical"] = ":calendar:",
|
||||
["Cron"] = ":calendar:",
|
||||
["Amie"] = ":calendar:",
|
||||
["Figma"] = ":figma:",
|
||||
["Element"] = ":element:",
|
||||
["Signal"] = ":signal:",
|
||||
["Mattermost"] = ":mattermost:",
|
||||
["Caprine"] = ":caprine:",
|
||||
["Microsoft To Do"] = ":things:",
|
||||
["Things"] = ":things:",
|
||||
["Godot"] = ":godot:",
|
||||
["Android Messages"] = ":android_messages:",
|
||||
["Zed"] = ":zed:",
|
||||
["Anytype"] = ":anytype:",
|
||||
["TeamSpeak 3"] = ":team_speak:",
|
||||
["LibreWolf"] = ":libre_wolf:",
|
||||
["Neovide"] = ":neovide:",
|
||||
["neovide"] = ":neovide:",
|
||||
["Spotlight"] = ":spotlight:",
|
||||
["微信"] = ":wechat:",
|
||||
["Dropbox"] = ":dropbox:",
|
||||
["Transmit"] = ":transmit:",
|
||||
["TickTick"] = ":tick_tick:",
|
||||
["Parallels Desktop"] = ":parallels:",
|
||||
["Audacity"] = ":audacity:",
|
||||
["Rider"] = ":rider:",
|
||||
["JetBrains Rider"] = ":rider:",
|
||||
["DEVONthink 3"] = ":devonthink3:",
|
||||
["Docker"] = ":docker:",
|
||||
["Docker Desktop"] = ":docker:",
|
||||
["Matlab"] = ":matlab:",
|
||||
["VLC"] = ":vlc:",
|
||||
["Alacritty"] = ":alacritty:",
|
||||
["Pages"] = ":pages:",
|
||||
["Pages 文稿"] = ":pages:",
|
||||
["Bear"] = ":bear:",
|
||||
["Pine"] = ":pine:",
|
||||
["Affinity Designer 2"] = ":affinity_designer_2:",
|
||||
["Keyboard Maestro"] = ":keyboard_maestro:",
|
||||
["Joplin"] = ":joplin:",
|
||||
["mpv"] = ":mpv:",
|
||||
["zoom.us"] = ":zoom:",
|
||||
["Affinity Photo 2"] = ":affinity_photo_2:",
|
||||
["Music"] = ":music:",
|
||||
["音乐"] = ":music:",
|
||||
["League of Legends"] = ":league_of_legends:",
|
||||
["Tor Browser"] = ":tor_browser:",
|
||||
["Hyper"] = ":hyper:",
|
||||
["WhatsApp"] = ":whats_app:",
|
||||
["카카오톡"] = ":kakaotalk:",
|
||||
["Discord"] = ":discord:",
|
||||
["Discord Canary"] = ":discord:",
|
||||
["Discord PTB"] = ":discord:",
|
||||
["Neovide"] = ":vim:",
|
||||
["MacVim"] = ":vim:",
|
||||
["Vim"] = ":vim:",
|
||||
["VimR"] = ":vim:",
|
||||
["Keynote"] = ":keynote:",
|
||||
["Keynote 讲演"] = ":keynote:",
|
||||
["iTerm"] = ":iterm:",
|
||||
["IntelliJ IDEA"] = ":idea:",
|
||||
["Finder"] = ":finder:",
|
||||
["访达"] = ":finder:",
|
||||
["Xcode"] = ":xcode:",
|
||||
["GoLand"] = ":goland:",
|
||||
["Android Studio"] = ":android_studio:",
|
||||
["MoneyMoney"] = ":bank:",
|
||||
["Spotify"] = ":spotify:",
|
||||
["KeePassXC"] = ":kee_pass_x_c:",
|
||||
["Alfred"] = ":alfred:",
|
||||
["Color Picker"] = ":color_picker:",
|
||||
["数码测色计"] = ":color_picker:",
|
||||
["Microsoft Word"] = ":microsoft_word:",
|
||||
["Microsoft PowerPoint"] = ":microsoft_power_point:",
|
||||
["Notes"] = ":notes:",
|
||||
["备忘录"] = ":notes:",
|
||||
["Microsoft Edge"] = ":microsoft_edge:",
|
||||
["Sublime Text"] = ":sublime_text:",
|
||||
["Sequel Ace"] = ":sequel_ace:",
|
||||
["Folx"] = ":folx:",
|
||||
["DingTalk"] = ":dingtalk:",
|
||||
["钉钉"] = ":dingtalk:",
|
||||
["阿里钉"] = ":dingtalk:",
|
||||
["WebStorm"] = ":web_storm:",
|
||||
["Sequel Pro"] = ":sequel_pro:",
|
||||
["Skype"] = ":skype:",
|
||||
["网易云音乐"] = ":netease_music:",
|
||||
["PyCharm"] = ":pycharm:",
|
||||
["Canary Mail"] = ":mail:",
|
||||
["HEY"] = ":mail:",
|
||||
["Mail"] = ":mail:",
|
||||
["Mailspring"] = ":mail:",
|
||||
["MailMate"] = ":mail:",
|
||||
["邮件"] = ":mail:",
|
||||
["Default"] = ":default:",
|
||||
["App Store"] = ":app_store:",
|
||||
["Calibre"] = ":book:",
|
||||
["Todoist"] = ":todoist:",
|
||||
["Emacs"] = ":emacs:",
|
||||
["Messenger"] = ":messenger:",
|
||||
["Tower"] = ":tower:",
|
||||
["VSCodium"] = ":vscodium:",
|
||||
["Drafts"] = ":drafts:",
|
||||
["Cypress"] = ":cypress:",
|
||||
["GitHub Desktop"] = ":git_hub:",
|
||||
["Telegram"] = ":telegram:",
|
||||
["Firefox Developer Edition"] = ":firefox_developer_edition:",
|
||||
["Firefox Nightly"] = ":firefox_developer_edition:",
|
||||
["Min"] = ":min_browser:",
|
||||
["Sketch"] = ":sketch:",
|
||||
["Affinity Photo"] = ":affinity_photo:",
|
||||
["MAMP"] = ":mamp:",
|
||||
["MAMP PRO"] = ":mamp:",
|
||||
["Insomnia"] = ":insomnia:",
|
||||
["Bitwarden"] = ":bit_warden:",
|
||||
["Warp"] = ":warp:",
|
||||
["System Preferences"] = ":gear:",
|
||||
["System Settings"] = ":gear:",
|
||||
["系统设置"] = ":gear:",
|
||||
["Affinity Designer"] = ":affinity_designer:",
|
||||
["Live"] = ":ableton:",
|
||||
["Arc"] = ":arc:",
|
||||
["Chromium"] = ":google_chrome:",
|
||||
["Google Chrome"] = ":google_chrome:",
|
||||
["Google Chrome Canary"] = ":google_chrome:",
|
||||
["Jellyfin Media Player"] = ":jellyfin:",
|
||||
["Zulip"] = ":zulip:",
|
||||
["1Password"] = ":one_password:",
|
||||
["FaceTime"] = ":face_time:",
|
||||
["FaceTime 通话"] = ":face_time:",
|
||||
["Citrix Workspace"] = ":citrix:",
|
||||
["Citrix Viewer"] = ":citrix:",
|
||||
["Logseq"] = ":logseq:",
|
||||
["Reeder"] = ":reeder5:",
|
||||
["Code"] = ":code:",
|
||||
["Code - Insiders"] = ":code:",
|
||||
["Notion"] = ":notion:",
|
||||
["Final Cut Pro"] = ":final_cut_pro:",
|
||||
["Zotero"] = ":zotero:",
|
||||
["Safari"] = ":safari:",
|
||||
["Safari浏览器"] = ":safari:",
|
||||
["Safari Technology Preview"] = ":safari:",
|
||||
["Blender"] = ":blender:",
|
||||
["Affinity Publisher"] = ":affinity_publisher:",
|
||||
["Spark Desktop"] = ":spark:",
|
||||
["Zeplin"] = ":zeplin:",
|
||||
["Replit"] = ":replit:",
|
||||
["Podcasts"] = ":podcasts:",
|
||||
["播客"] = ":podcasts:",
|
||||
["NordVPN"] = ":nord_vpn:",
|
||||
["Notability"] = ":notability:",
|
||||
["Numbers"] = ":numbers:",
|
||||
["Numbers 表格"] = ":numbers:",
|
||||
["Nova"] = ":nova:",
|
||||
["Microsoft Excel"] = ":microsoft_excel:",
|
||||
["Trello"] = ":trello:",
|
||||
["Pi-hole Remote"] = ":pihole:",
|
||||
["Linear"] = ":linear:",
|
||||
["CleanMyMac X"] = ":desktop:",
|
||||
["GrandTotal"] = ":dollar:",
|
||||
["Receipts"] = ":dollar:",
|
||||
["Evernote Legacy"] = ":evernote_legacy:",
|
||||
["OmniFocus"] = ":omni_focus:",
|
||||
["Terminal"] = ":terminal:",
|
||||
["终端"] = ":terminal:",
|
||||
["Atom"] = ":atom:",
|
||||
["Kakoune"] = ":kakoune:",
|
||||
["Reminders"] = ":reminders:",
|
||||
["提醒事项"] = ":reminders:",
|
||||
["Tana"] = ":tana:",
|
||||
["OBS"] = ":obsstudio:",
|
||||
["VMware Fusion"] = ":vmware_fusion:",
|
||||
["Tweetbot"] = ":twitter:",
|
||||
["Twitter"] = ":twitter:",
|
||||
["Microsoft Teams"] = ":microsoft_teams:",
|
||||
["Yuque"] = ":yuque:",
|
||||
["语雀"] = ":yuque:",
|
||||
["Slack"] = ":slack:",
|
||||
["Vivaldi"] = ":vivaldi:",
|
||||
["Setapp"] = ":setapp:",
|
||||
["TIDAL"] = ":tidal:",
|
||||
["Miro"] = ":miro:",
|
||||
["Messages"] = ":messages:",
|
||||
["信息"] = ":messages:",
|
||||
["Nachrichten"] = ":messages:",
|
||||
["Brave Browser"] = ":brave_browser:",
|
||||
["Preview"] = ":pdf:",
|
||||
["预览"] = ":pdf:",
|
||||
["Skim"] = ":pdf:",
|
||||
["zathura"] = ":pdf:",
|
||||
["Obsidian"] = ":obsidian:",
|
||||
["Thunderbird"] = ":thunderbird:",
|
||||
["Firefox"] = ":firefox:",
|
||||
["WezTerm"] = ":wezterm:",
|
||||
["default"] = ":default:",
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
return {
|
||||
text = "SF Pro", -- Used for text
|
||||
numbers = "SF Pro", -- Used for numbers
|
||||
mono = "BerkeleyMono Nerd Font",
|
||||
|
||||
-- Unified font style map
|
||||
style_map = {
|
||||
["Regular"] = "Regular",
|
||||
["Semibold"] = "Semibold",
|
||||
["Bold"] = "Bold",
|
||||
["Heavy"] = "Heavy",
|
||||
["Black"] = "Black",
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
#include <mach/mach.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct cpu {
|
||||
host_t host;
|
||||
mach_msg_type_number_t count;
|
||||
host_cpu_load_info_data_t load;
|
||||
host_cpu_load_info_data_t prev_load;
|
||||
bool has_prev_load;
|
||||
|
||||
int user_load;
|
||||
int sys_load;
|
||||
int total_load;
|
||||
};
|
||||
|
||||
static inline void cpu_init(struct cpu* cpu) {
|
||||
cpu->host = mach_host_self();
|
||||
cpu->count = HOST_CPU_LOAD_INFO_COUNT;
|
||||
cpu->has_prev_load = false;
|
||||
}
|
||||
|
||||
static inline void cpu_update(struct cpu* cpu) {
|
||||
kern_return_t error = host_statistics(cpu->host,
|
||||
HOST_CPU_LOAD_INFO,
|
||||
(host_info_t)&cpu->load,
|
||||
&cpu->count );
|
||||
|
||||
if (error != KERN_SUCCESS) {
|
||||
printf("Error: Could not read cpu host statistics.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cpu->has_prev_load) {
|
||||
uint32_t delta_user = cpu->load.cpu_ticks[CPU_STATE_USER]
|
||||
- cpu->prev_load.cpu_ticks[CPU_STATE_USER];
|
||||
|
||||
uint32_t delta_system = cpu->load.cpu_ticks[CPU_STATE_SYSTEM]
|
||||
- cpu->prev_load.cpu_ticks[CPU_STATE_SYSTEM];
|
||||
|
||||
uint32_t delta_idle = cpu->load.cpu_ticks[CPU_STATE_IDLE]
|
||||
- cpu->prev_load.cpu_ticks[CPU_STATE_IDLE];
|
||||
|
||||
cpu->user_load = (double)delta_user / (double)(delta_system
|
||||
+ delta_user
|
||||
+ delta_idle) * 100.0;
|
||||
|
||||
cpu->sys_load = (double)delta_system / (double)(delta_system
|
||||
+ delta_user
|
||||
+ delta_idle) * 100.0;
|
||||
|
||||
cpu->total_load = cpu->user_load + cpu->sys_load;
|
||||
}
|
||||
|
||||
cpu->prev_load = cpu->load;
|
||||
cpu->has_prev_load = true;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
#include "cpu.h"
|
||||
#include "../sketchybar.h"
|
||||
|
||||
int main (int argc, char** argv) {
|
||||
float update_freq;
|
||||
if (argc < 3 || (sscanf(argv[2], "%f", &update_freq) != 1)) {
|
||||
printf("Usage: %s \"<event-name>\" \"<event_freq>\"\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
alarm(0);
|
||||
struct cpu cpu;
|
||||
cpu_init(&cpu);
|
||||
|
||||
// Setup the event in sketchybar
|
||||
char event_message[512];
|
||||
snprintf(event_message, 512, "--add event '%s'", argv[1]);
|
||||
sketchybar(event_message);
|
||||
|
||||
char trigger_message[512];
|
||||
for (;;) {
|
||||
// Acquire new info
|
||||
cpu_update(&cpu);
|
||||
|
||||
// Prepare the event message
|
||||
snprintf(trigger_message,
|
||||
512,
|
||||
"--trigger '%s' user_load='%d' sys_load='%02d' total_load='%02d'",
|
||||
argv[1],
|
||||
cpu.user_load,
|
||||
cpu.sys_load,
|
||||
cpu.total_load );
|
||||
|
||||
// Trigger the event
|
||||
sketchybar(trigger_message);
|
||||
|
||||
// Wait
|
||||
usleep(update_freq * 1000000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
bin/cpu_load: cpu_load.c cpu.h ../sketchybar.h | bin
|
||||
clang -std=c99 -O3 $< -o $@
|
||||
|
||||
bin:
|
||||
mkdir bin
|
||||
@@ -1,3 +0,0 @@
|
||||
all:
|
||||
(cd cpu_load && $(MAKE))
|
||||
(cd network_load && $(MAKE))
|
||||
@@ -1,5 +0,0 @@
|
||||
bin/network_load: network_load.c network.h ../sketchybar.h | bin
|
||||
clang -std=c99 -O3 $< -o $@
|
||||
|
||||
bin:
|
||||
mkdir bin
|
||||
@@ -1,90 +0,0 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <net/if.h>
|
||||
#include <net/if_mib.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
static char unit_str[3][6] = { { " Bps" }, { "KBps" }, { "MBps" }, };
|
||||
|
||||
enum unit {
|
||||
UNIT_BPS,
|
||||
UNIT_KBPS,
|
||||
UNIT_MBPS
|
||||
};
|
||||
struct network {
|
||||
uint32_t row;
|
||||
struct ifmibdata data;
|
||||
struct timeval tv_nm1, tv_n, tv_delta;
|
||||
|
||||
int up;
|
||||
int down;
|
||||
enum unit up_unit, down_unit;
|
||||
};
|
||||
|
||||
static inline void ifdata(uint32_t net_row, struct ifmibdata* data) {
|
||||
static size_t size = sizeof(struct ifmibdata);
|
||||
static int32_t data_option[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL };
|
||||
data_option[4] = net_row;
|
||||
sysctl(data_option, 6, data, &size, NULL, 0);
|
||||
}
|
||||
|
||||
static inline void network_init(struct network* net, char* ifname) {
|
||||
memset(net, 0, sizeof(struct network));
|
||||
|
||||
static int count_option[] = { CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_SYSTEM, IFMIB_IFCOUNT };
|
||||
uint32_t interface_count = 0;
|
||||
size_t size = sizeof(uint32_t);
|
||||
sysctl(count_option, 5, &interface_count, &size, NULL, 0);
|
||||
|
||||
for (int i = 0; i < interface_count; i++) {
|
||||
ifdata(i, &net->data);
|
||||
if (strcmp(net->data.ifmd_name, ifname) == 0) {
|
||||
net->row = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static inline void network_update(struct network* net) {
|
||||
gettimeofday(&net->tv_n, NULL);
|
||||
timersub(&net->tv_n, &net->tv_nm1, &net->tv_delta);
|
||||
net->tv_nm1 = net->tv_n;
|
||||
|
||||
uint64_t ibytes_nm1 = net->data.ifmd_data.ifi_ibytes;
|
||||
uint64_t obytes_nm1 = net->data.ifmd_data.ifi_obytes;
|
||||
ifdata(net->row, &net->data);
|
||||
|
||||
double time_scale = (net->tv_delta.tv_sec + 1e-6*net->tv_delta.tv_usec);
|
||||
if (time_scale < 1e-6 || time_scale > 1e2) return;
|
||||
double delta_ibytes = (double)(net->data.ifmd_data.ifi_ibytes - ibytes_nm1)
|
||||
/ time_scale;
|
||||
double delta_obytes = (double)(net->data.ifmd_data.ifi_obytes - obytes_nm1)
|
||||
/ time_scale;
|
||||
|
||||
double exponent_ibytes = log10(delta_ibytes);
|
||||
double exponent_obytes = log10(delta_obytes);
|
||||
|
||||
if (exponent_ibytes < 3) {
|
||||
net->down_unit = UNIT_BPS;
|
||||
net->down = delta_ibytes;
|
||||
} else if (exponent_ibytes < 6) {
|
||||
net->down_unit = UNIT_KBPS;
|
||||
net->down = delta_ibytes / 1000.0;
|
||||
} else if (exponent_ibytes < 9) {
|
||||
net->down_unit = UNIT_MBPS;
|
||||
net->down = delta_ibytes / 1000000.0;
|
||||
}
|
||||
|
||||
if (exponent_obytes < 3) {
|
||||
net->up_unit = UNIT_BPS;
|
||||
net->up = delta_obytes;
|
||||
} else if (exponent_obytes < 6) {
|
||||
net->up_unit = UNIT_KBPS;
|
||||
net->up = delta_obytes / 1000.0;
|
||||
} else if (exponent_obytes < 9) {
|
||||
net->up_unit = UNIT_MBPS;
|
||||
net->up = delta_obytes / 1000000.0;
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
#include <unistd.h>
|
||||
#include "network.h"
|
||||
#include "../sketchybar.h"
|
||||
|
||||
int main (int argc, char** argv) {
|
||||
float update_freq;
|
||||
if (argc < 4 || (sscanf(argv[3], "%f", &update_freq) != 1)) {
|
||||
printf("Usage: %s \"<interface>\" \"<event-name>\" \"<event_freq>\"\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
alarm(0);
|
||||
// Setup the event in sketchybar
|
||||
char event_message[512];
|
||||
snprintf(event_message, 512, "--add event '%s'", argv[2]);
|
||||
sketchybar(event_message);
|
||||
|
||||
struct network network;
|
||||
network_init(&network, argv[1]);
|
||||
char trigger_message[512];
|
||||
for (;;) {
|
||||
// Acquire new info
|
||||
network_update(&network);
|
||||
|
||||
// Prepare the event message
|
||||
snprintf(trigger_message,
|
||||
512,
|
||||
"--trigger '%s' upload='%03d%s' download='%03d%s'",
|
||||
argv[2],
|
||||
network.up,
|
||||
unit_str[network.up_unit],
|
||||
network.down,
|
||||
unit_str[network.down_unit]);
|
||||
|
||||
// Trigger the event
|
||||
sketchybar(trigger_message);
|
||||
|
||||
// Wait
|
||||
usleep(update_freq * 1000000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <mach/arm/kern_return.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/message.h>
|
||||
#include <bootstrap.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef char* env;
|
||||
|
||||
#define MACH_HANDLER(name) void name(env env)
|
||||
typedef MACH_HANDLER(mach_handler);
|
||||
|
||||
struct mach_message {
|
||||
mach_msg_header_t header;
|
||||
mach_msg_size_t msgh_descriptor_count;
|
||||
mach_msg_ool_descriptor_t descriptor;
|
||||
};
|
||||
|
||||
struct mach_buffer {
|
||||
struct mach_message message;
|
||||
mach_msg_trailer_t trailer;
|
||||
};
|
||||
|
||||
static mach_port_t g_mach_port = 0;
|
||||
|
||||
static inline mach_port_t mach_get_bs_port() {
|
||||
mach_port_name_t task = mach_task_self();
|
||||
|
||||
mach_port_t bs_port;
|
||||
if (task_get_special_port(task,
|
||||
TASK_BOOTSTRAP_PORT,
|
||||
&bs_port ) != KERN_SUCCESS) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* name = getenv("BAR_NAME");
|
||||
if (!name) name = "sketchybar";
|
||||
uint32_t lookup_len = 16 + strlen(name);
|
||||
|
||||
char buffer[lookup_len];
|
||||
snprintf(buffer, lookup_len, "git.felix.%s", name);
|
||||
|
||||
mach_port_t port;
|
||||
if (bootstrap_look_up(bs_port, buffer, &port) != KERN_SUCCESS) return 0;
|
||||
return port;
|
||||
}
|
||||
|
||||
static inline bool mach_send_message(mach_port_t port, char* message, uint32_t len) {
|
||||
if (!message || !port) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct mach_message msg = { 0 };
|
||||
msg.header.msgh_remote_port = port;
|
||||
msg.header.msgh_local_port = 0;
|
||||
msg.header.msgh_id = 0;
|
||||
msg.header.msgh_bits = MACH_MSGH_BITS_SET(MACH_MSG_TYPE_COPY_SEND,
|
||||
MACH_MSG_TYPE_MAKE_SEND,
|
||||
0,
|
||||
MACH_MSGH_BITS_COMPLEX );
|
||||
|
||||
msg.header.msgh_size = sizeof(struct mach_message);
|
||||
msg.msgh_descriptor_count = 1;
|
||||
msg.descriptor.address = message;
|
||||
msg.descriptor.size = len * sizeof(char);
|
||||
msg.descriptor.copy = MACH_MSG_VIRTUAL_COPY;
|
||||
msg.descriptor.deallocate = false;
|
||||
msg.descriptor.type = MACH_MSG_OOL_DESCRIPTOR;
|
||||
|
||||
kern_return_t err = mach_msg(&msg.header,
|
||||
MACH_SEND_MSG,
|
||||
sizeof(struct mach_message),
|
||||
0,
|
||||
MACH_PORT_NULL,
|
||||
MACH_MSG_TIMEOUT_NONE,
|
||||
MACH_PORT_NULL );
|
||||
|
||||
return err == KERN_SUCCESS;
|
||||
}
|
||||
|
||||
static inline uint32_t format_message(char* message, char* formatted_message) {
|
||||
// This is not actually robust, switch to stack based messaging.
|
||||
char outer_quote = 0;
|
||||
uint32_t caret = 0;
|
||||
uint32_t message_length = strlen(message) + 1;
|
||||
for (int i = 0; i < message_length; ++i) {
|
||||
if (message[i] == '"' || message[i] == '\'') {
|
||||
if (outer_quote && outer_quote == message[i]) outer_quote = 0;
|
||||
else if (!outer_quote) outer_quote = message[i];
|
||||
continue;
|
||||
}
|
||||
formatted_message[caret] = message[i];
|
||||
if (message[i] == ' ' && !outer_quote) formatted_message[caret] = '\0';
|
||||
caret++;
|
||||
}
|
||||
|
||||
if (caret > 0 && formatted_message[caret] == '\0'
|
||||
&& formatted_message[caret - 1] == '\0') {
|
||||
caret--;
|
||||
}
|
||||
formatted_message[caret] = '\0';
|
||||
return caret + 1;
|
||||
}
|
||||
|
||||
static inline void sketchybar(char* message) {
|
||||
char formatted_message[strlen(message) + 2];
|
||||
uint32_t length = format_message(message, formatted_message);
|
||||
if (!length) return;
|
||||
|
||||
if (!g_mach_port) g_mach_port = mach_get_bs_port();
|
||||
if (!mach_send_message(g_mach_port, formatted_message, length)) {
|
||||
g_mach_port = mach_get_bs_port();
|
||||
if (!mach_send_message(g_mach_port, formatted_message, length)) {
|
||||
// No sketchybar instance running, exit.
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
-- Add the sketchybar module to the package cpath
|
||||
package.cpath = package.cpath .. ";/Users/" .. os.getenv("USER") .. "/.local/share/sketchybar_lua/?.so"
|
||||
|
||||
os.execute("(cd helpers && make)")
|
||||
@@ -1,17 +0,0 @@
|
||||
# Packages
|
||||
brew install lua
|
||||
brew install switchaudio-osx
|
||||
brew install nowplaying-cli
|
||||
|
||||
brew tap FelixKratz/formulae
|
||||
brew install sketchybar
|
||||
|
||||
# Fonts
|
||||
brew install --cask sf-symbols
|
||||
brew install --cask homebrew/cask-fonts/font-sf-mono
|
||||
brew install --cask homebrew/cask-fonts/font-sf-pro
|
||||
|
||||
curl -L https://github.com/kvndrsslr/sketchybar-app-font/releases/download/v2.0.5/sketchybar-app-font.ttf -o $HOME/Library/Fonts/sketchybar-app-font.ttf
|
||||
|
||||
# SbarLua
|
||||
(git clone https://github.com/FelixKratz/SbarLua.git /tmp/SbarLua && cd /tmp/SbarLua/ && make install && rm -rf /tmp/SbarLua/)
|
||||
@@ -1,3 +0,0 @@
|
||||
all:
|
||||
(cd event_providers && $(MAKE)) >/dev/null
|
||||
(cd menus && $(MAKE)) >/dev/null
|
||||
@@ -1,5 +0,0 @@
|
||||
bin/menus: menus.c | bin
|
||||
clang -std=c99 -O3 -F/System/Library/PrivateFrameworks/ -framework Carbon -framework SkyLight $< -o $@
|
||||
|
||||
bin:
|
||||
mkdir bin
|
||||
@@ -1,248 +0,0 @@
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
void ax_init() {
|
||||
const void *keys[] = { kAXTrustedCheckOptionPrompt };
|
||||
const void *values[] = { kCFBooleanTrue };
|
||||
|
||||
CFDictionaryRef options;
|
||||
options = CFDictionaryCreate(kCFAllocatorDefault,
|
||||
keys,
|
||||
values,
|
||||
sizeof(keys) / sizeof(*keys),
|
||||
&kCFCopyStringDictionaryKeyCallBacks,
|
||||
&kCFTypeDictionaryValueCallBacks );
|
||||
|
||||
bool trusted = AXIsProcessTrustedWithOptions(options);
|
||||
CFRelease(options);
|
||||
if (!trusted) exit(1);
|
||||
}
|
||||
|
||||
void ax_perform_click(AXUIElementRef element) {
|
||||
if (!element) return;
|
||||
AXUIElementPerformAction(element, kAXCancelAction);
|
||||
usleep(150000);
|
||||
AXUIElementPerformAction(element, kAXPressAction);
|
||||
}
|
||||
|
||||
CFStringRef ax_get_title(AXUIElementRef element) {
|
||||
CFTypeRef title = NULL;
|
||||
AXError error = AXUIElementCopyAttributeValue(element,
|
||||
kAXTitleAttribute,
|
||||
&title );
|
||||
|
||||
if (error != kAXErrorSuccess) return NULL;
|
||||
return title;
|
||||
}
|
||||
|
||||
void ax_select_menu_option(AXUIElementRef app, int id) {
|
||||
AXUIElementRef menubars_ref = NULL;
|
||||
CFArrayRef children_ref = NULL;
|
||||
|
||||
AXError error = AXUIElementCopyAttributeValue(app,
|
||||
kAXMenuBarAttribute,
|
||||
(CFTypeRef*)&menubars_ref);
|
||||
if (error == kAXErrorSuccess) {
|
||||
error = AXUIElementCopyAttributeValue(menubars_ref,
|
||||
kAXVisibleChildrenAttribute,
|
||||
(CFTypeRef*)&children_ref );
|
||||
|
||||
if (error == kAXErrorSuccess) {
|
||||
uint32_t count = CFArrayGetCount(children_ref);
|
||||
if (id < count) {
|
||||
AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, id);
|
||||
ax_perform_click(item);
|
||||
}
|
||||
if (children_ref) CFRelease(children_ref);
|
||||
}
|
||||
if (menubars_ref) CFRelease(menubars_ref);
|
||||
}
|
||||
}
|
||||
|
||||
void ax_print_menu_options(AXUIElementRef app) {
|
||||
AXUIElementRef menubars_ref = NULL;
|
||||
CFTypeRef menubar = NULL;
|
||||
CFArrayRef children_ref = NULL;
|
||||
|
||||
AXError error = AXUIElementCopyAttributeValue(app,
|
||||
kAXMenuBarAttribute,
|
||||
(CFTypeRef*)&menubars_ref);
|
||||
if (error == kAXErrorSuccess) {
|
||||
error = AXUIElementCopyAttributeValue(menubars_ref,
|
||||
kAXVisibleChildrenAttribute,
|
||||
(CFTypeRef*)&children_ref );
|
||||
|
||||
if (error == kAXErrorSuccess) {
|
||||
uint32_t count = CFArrayGetCount(children_ref);
|
||||
|
||||
for (int i = 1; i < count; i++) {
|
||||
AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, i);
|
||||
CFTypeRef title = ax_get_title(item);
|
||||
|
||||
if (title) {
|
||||
uint32_t buffer_len = 2*CFStringGetLength(title);
|
||||
char buffer[2*CFStringGetLength(title)];
|
||||
CFStringGetCString(title, buffer, buffer_len, kCFStringEncodingUTF8);
|
||||
printf("%s\n", buffer);
|
||||
CFRelease(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (menubars_ref) CFRelease(menubars_ref);
|
||||
if (children_ref) CFRelease(children_ref);
|
||||
}
|
||||
}
|
||||
|
||||
AXUIElementRef ax_get_extra_menu_item(char* alias) {
|
||||
pid_t pid = 0;
|
||||
CGRect bounds = CGRectNull;
|
||||
CFArrayRef window_list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll,
|
||||
kCGNullWindowID );
|
||||
char owner_buffer[256];
|
||||
char name_buffer[256];
|
||||
char buffer[512];
|
||||
int window_count = CFArrayGetCount(window_list);
|
||||
for (int i = 0; i < window_count; ++i) {
|
||||
CFDictionaryRef dictionary = CFArrayGetValueAtIndex(window_list, i);
|
||||
if (!dictionary) continue;
|
||||
|
||||
CFStringRef owner_ref = CFDictionaryGetValue(dictionary,
|
||||
kCGWindowOwnerName);
|
||||
|
||||
CFNumberRef owner_pid_ref = CFDictionaryGetValue(dictionary,
|
||||
kCGWindowOwnerPID);
|
||||
|
||||
CFStringRef name_ref = CFDictionaryGetValue(dictionary, kCGWindowName);
|
||||
CFNumberRef layer_ref = CFDictionaryGetValue(dictionary, kCGWindowLayer);
|
||||
CFDictionaryRef bounds_ref = CFDictionaryGetValue(dictionary,
|
||||
kCGWindowBounds);
|
||||
|
||||
if (!name_ref || !owner_ref || !owner_pid_ref || !layer_ref || !bounds_ref)
|
||||
continue;
|
||||
|
||||
long long int layer = 0;
|
||||
CFNumberGetValue(layer_ref, CFNumberGetType(layer_ref), &layer);
|
||||
uint64_t owner_pid = 0;
|
||||
CFNumberGetValue(owner_pid_ref,
|
||||
CFNumberGetType(owner_pid_ref),
|
||||
&owner_pid );
|
||||
|
||||
if (layer != 0x19) continue;
|
||||
bounds = CGRectNull;
|
||||
if (!CGRectMakeWithDictionaryRepresentation(bounds_ref, &bounds)) continue;
|
||||
CFStringGetCString(owner_ref,
|
||||
owner_buffer,
|
||||
sizeof(owner_buffer),
|
||||
kCFStringEncodingUTF8);
|
||||
|
||||
CFStringGetCString(name_ref,
|
||||
name_buffer,
|
||||
sizeof(name_buffer),
|
||||
kCFStringEncodingUTF8);
|
||||
snprintf(buffer, sizeof(buffer), "%s,%s", owner_buffer, name_buffer);
|
||||
|
||||
if (strcmp(buffer, alias) == 0) {
|
||||
pid = owner_pid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
CFRelease(window_list);
|
||||
if (!pid) return NULL;
|
||||
|
||||
AXUIElementRef app = AXUIElementCreateApplication(pid);
|
||||
if (!app) return NULL;
|
||||
AXUIElementRef result = NULL;
|
||||
CFTypeRef extras = NULL;
|
||||
CFArrayRef children_ref = NULL;
|
||||
AXError error = AXUIElementCopyAttributeValue(app,
|
||||
kAXExtrasMenuBarAttribute,
|
||||
&extras );
|
||||
if (error == kAXErrorSuccess) {
|
||||
error = AXUIElementCopyAttributeValue(extras,
|
||||
kAXVisibleChildrenAttribute,
|
||||
(CFTypeRef*)&children_ref );
|
||||
|
||||
if (error == kAXErrorSuccess) {
|
||||
uint32_t count = CFArrayGetCount(children_ref);
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
AXUIElementRef item = CFArrayGetValueAtIndex(children_ref, i);
|
||||
CFTypeRef position_ref = NULL;
|
||||
CFTypeRef size_ref = NULL;
|
||||
AXUIElementCopyAttributeValue(item, kAXPositionAttribute,
|
||||
&position_ref );
|
||||
AXUIElementCopyAttributeValue(item, kAXSizeAttribute,
|
||||
&size_ref );
|
||||
if (!position_ref || !size_ref) continue;
|
||||
|
||||
CGPoint position = CGPointZero;
|
||||
AXValueGetValue(position_ref, kAXValueCGPointType, &position);
|
||||
CGSize size = CGSizeZero;
|
||||
AXValueGetValue(size_ref, kAXValueCGSizeType, &size);
|
||||
CFRelease(position_ref);
|
||||
CFRelease(size_ref);
|
||||
// The offset is exactly 8 on macOS Sonoma...
|
||||
// printf("%f %f\n", position.x, bounds.origin.x);
|
||||
if (error == kAXErrorSuccess
|
||||
&& fabs(position.x - bounds.origin.x) <= 10) {
|
||||
result = item;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFRelease(app);
|
||||
return result;
|
||||
}
|
||||
|
||||
extern int SLSMainConnectionID();
|
||||
extern void SLSSetMenuBarVisibilityOverrideOnDisplay(int cid, int did, bool enabled);
|
||||
extern void SLSSetMenuBarVisibilityOverrideOnDisplay(int cid, int did, bool enabled);
|
||||
extern void SLSSetMenuBarInsetAndAlpha(int cid, double u1, double u2, float alpha);
|
||||
void ax_select_menu_extra(char* alias) {
|
||||
AXUIElementRef item = ax_get_extra_menu_item(alias);
|
||||
if (!item) return;
|
||||
SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 0.0);
|
||||
SLSSetMenuBarVisibilityOverrideOnDisplay(SLSMainConnectionID(), 0, true);
|
||||
SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 0.0);
|
||||
ax_perform_click(item);
|
||||
SLSSetMenuBarVisibilityOverrideOnDisplay(SLSMainConnectionID(), 0, false);
|
||||
SLSSetMenuBarInsetAndAlpha(SLSMainConnectionID(), 0, 1, 1.0);
|
||||
CFRelease(item);
|
||||
}
|
||||
|
||||
extern void _SLPSGetFrontProcess(ProcessSerialNumber* psn);
|
||||
extern void SLSGetConnectionIDForPSN(int cid, ProcessSerialNumber* psn, int* cid_out);
|
||||
extern void SLSConnectionGetPID(int cid, pid_t* pid_out);
|
||||
AXUIElementRef ax_get_front_app() {
|
||||
ProcessSerialNumber psn;
|
||||
_SLPSGetFrontProcess(&psn);
|
||||
int target_cid;
|
||||
SLSGetConnectionIDForPSN(SLSMainConnectionID(), &psn, &target_cid);
|
||||
|
||||
pid_t pid;
|
||||
SLSConnectionGetPID(target_cid, &pid);
|
||||
return AXUIElementCreateApplication(pid);
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
if (argc == 1) {
|
||||
printf("Usage: %s [-l | -s id/alias ]\n", argv[0]);
|
||||
exit(0);
|
||||
}
|
||||
ax_init();
|
||||
if (strcmp(argv[1], "-l") == 0) {
|
||||
AXUIElementRef app = ax_get_front_app();
|
||||
if (!app) return 1;
|
||||
ax_print_menu_options(app);
|
||||
CFRelease(app);
|
||||
} else if (argc == 3 && strcmp(argv[1], "-s") == 0) {
|
||||
int id = 0;
|
||||
if (sscanf(argv[2], "%d", &id) == 1) {
|
||||
AXUIElementRef app = ax_get_front_app();
|
||||
if (!app) return 1;
|
||||
ax_select_menu_option(app, id);
|
||||
CFRelease(app);
|
||||
} else ax_select_menu_extra(argv[2]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
local settings = require("settings")
|
||||
|
||||
local icons = {
|
||||
sf_symbols = {
|
||||
plus = "",
|
||||
loading = "",
|
||||
apple = "",
|
||||
gear = "",
|
||||
cpu = "",
|
||||
clipboard = "",
|
||||
|
||||
switch = {
|
||||
on = "",
|
||||
off = "",
|
||||
},
|
||||
volume = {
|
||||
_100="",
|
||||
_66="",
|
||||
_33="",
|
||||
_10="",
|
||||
_0="",
|
||||
},
|
||||
battery = {
|
||||
_100 = "■■■■■■",
|
||||
_80 = "■■■■□",
|
||||
_60 = "■■■□□",
|
||||
_40 = "■■□□□",
|
||||
_20 = "■□□□□",
|
||||
_0 = "◧□□□□",
|
||||
charging = "charging"
|
||||
},
|
||||
wifi = {
|
||||
upload = "",
|
||||
download = "",
|
||||
connected = "",
|
||||
disconnected = "",
|
||||
router = "",
|
||||
},
|
||||
media = {
|
||||
back = "",
|
||||
forward = "",
|
||||
play_pause = "",
|
||||
},
|
||||
},
|
||||
|
||||
-- Alternative NerdFont icons
|
||||
nerdfont = {
|
||||
plus = "",
|
||||
loading = "",
|
||||
apple = "",
|
||||
gear = "",
|
||||
cpu = "",
|
||||
clipboard = "Missing Icon",
|
||||
|
||||
switch = {
|
||||
on = "",
|
||||
off = "",
|
||||
},
|
||||
volume = {
|
||||
_100="",
|
||||
_66="",
|
||||
_33="",
|
||||
_10="",
|
||||
_0="",
|
||||
},
|
||||
battery = {
|
||||
_100 = "",
|
||||
_75 = "",
|
||||
_50 = "",
|
||||
_25 = "",
|
||||
_0 = "",
|
||||
charging = ""
|
||||
},
|
||||
wifi = {
|
||||
upload = "",
|
||||
download = "",
|
||||
connected = "",
|
||||
disconnected = "",
|
||||
router = "Missing Icon"
|
||||
},
|
||||
media = {
|
||||
back = "",
|
||||
forward = "",
|
||||
play_pause = "",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if not (settings.icons == "NerdFont") then
|
||||
return icons.sf_symbols
|
||||
else
|
||||
return icons.nerdfont
|
||||
end
|
||||
@@ -1,16 +0,0 @@
|
||||
-- Require the sketchybar module
|
||||
sbar = require("sketchybar")
|
||||
|
||||
-- Set the bar name, if you are using another bar instance than sketchybar
|
||||
-- sbar.set_bar_name("bottom_bar")
|
||||
|
||||
-- Bundle the entire initial configuration into a single message to sketchybar
|
||||
sbar.begin_config()
|
||||
require("bar")
|
||||
require("default")
|
||||
require("items")
|
||||
sbar.end_config()
|
||||
|
||||
-- Run the event loop of the sketchybar module (without this there will be no
|
||||
-- callback functions executed in the lua module)
|
||||
sbar.event_loop()
|
||||
@@ -1,27 +0,0 @@
|
||||
local colors = require("colors")
|
||||
local icons = require("icons")
|
||||
local settings = require("settings")
|
||||
|
||||
-- Padding item required because of bracket
|
||||
sbar.add("item", { width = 5 })
|
||||
|
||||
local apple = sbar.add("item", {
|
||||
icon = {
|
||||
font = { size = 16.0 },
|
||||
string = icons.apple,
|
||||
padding_right = 12,
|
||||
padding_left = 10,
|
||||
},
|
||||
label = { drawing = false },
|
||||
background = {
|
||||
color = colors.bg2,
|
||||
border_color = colors.black,
|
||||
border_width = 3
|
||||
},
|
||||
padding_left = 1,
|
||||
padding_right = 1,
|
||||
click_script = "$CONFIG_DIR/helpers/menus/bin/menus -s 0"
|
||||
})
|
||||
|
||||
-- Padding item required because of bracket
|
||||
sbar.add("item", { width = 7 })
|
||||
@@ -1,47 +0,0 @@
|
||||
local settings = require("settings")
|
||||
local colors = require("colors")
|
||||
|
||||
-- Padding item required because of bracket
|
||||
sbar.add("item", { position = "right", width = settings.group_paddings })
|
||||
|
||||
local cal = sbar.add("item", {
|
||||
icon = {
|
||||
color = colors.white,
|
||||
padding_left = 12,
|
||||
font = {
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 14.0,
|
||||
},
|
||||
},
|
||||
label = {
|
||||
color = colors.white,
|
||||
padding_right = 16,
|
||||
width = 70,
|
||||
align = "right",
|
||||
font = { family = settings.font.numbers },
|
||||
},
|
||||
position = "right",
|
||||
update_freq = 30,
|
||||
padding_left = 1,
|
||||
padding_right = 1,
|
||||
background = {
|
||||
color = colors.bg2,
|
||||
border_color = colors.black,
|
||||
border_width = 3
|
||||
},
|
||||
})
|
||||
|
||||
-- Double border for calendar using a single item bracket
|
||||
sbar.add("bracket", { cal.name }, {
|
||||
background = {
|
||||
color = colors.transparent,
|
||||
border_color = colors.grey,
|
||||
}
|
||||
})
|
||||
|
||||
-- Padding item required because of bracket
|
||||
sbar.add("item", { position = "right", width = settings.group_paddings })
|
||||
|
||||
cal:subscribe({ "forced", "routine", "system_woke" }, function(env)
|
||||
cal:set({ icon = os.date(" %A %d %B"), label = os.date(" %H:%M") })
|
||||
end)
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item battery right \
|
||||
--set battery update_freq=180 \
|
||||
script="$PLUGIN_DIR/battery.sh" \
|
||||
--subscribe battery system_woke power_source_change
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item calendar right \
|
||||
--set calendar icon= \
|
||||
update_freq=15 \
|
||||
script="$PLUGIN_DIR/calendar.sh"
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item cpu right \
|
||||
--set cpu update_freq=15 \
|
||||
icon= \
|
||||
script="$PLUGIN_DIR/cpu.sh"
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item front_app left \
|
||||
--set front_app background.color=$ACCENT_COLOR \
|
||||
icon.color=$ITEM_COLOR \
|
||||
label.color=$ITEM_COLOR \
|
||||
icon.font="sketchybar-app-font:Regular:12.0" \
|
||||
label.font="SF Pro:Semibold:12.0" \
|
||||
script="$PLUGIN_DIR/front_app.sh" \
|
||||
--subscribe front_app front_app_switched
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item media e \
|
||||
--set media label.color=$ACCENT_COLOR \
|
||||
label.max_chars=20 \
|
||||
icon.padding_left=0 \
|
||||
scroll_texts=on \
|
||||
icon= \
|
||||
icon.color=$ACCENT_COLOR \
|
||||
background.drawing=off \
|
||||
script="$PLUGIN_DIR/media.sh" \
|
||||
--subscribe media media_change
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
USAGE="$(memory_pressure | grep "System-wide memory free percentage:" | awk '{ printf("%02.0f\n", 100-$5"%") }')%"
|
||||
|
||||
sketchybar --add item memory right \
|
||||
--set memory update_freq=15 \
|
||||
icon= \
|
||||
label="$USAGE" \
|
||||
script="$PLUGIN_DIR/memory.sh"
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add event aerospace_workspace_change
|
||||
|
||||
sketchybar --add item aerospace_dummy left \
|
||||
--set aerospace_dummy display=0 \
|
||||
script="$PLUGIN_DIR/spaces.sh" \
|
||||
--subscribe aerospace_dummy aerospace_workspace_change
|
||||
|
||||
for m in $(aerospace list-monitors | awk '{print $1}'); do
|
||||
for sid in $(aerospace list-workspaces --monitor $m); do
|
||||
sketchybar --add space space.$sid left \
|
||||
--set space.$sid space=$sid \
|
||||
icon=$sid \
|
||||
background.color=$TRANSPARENT \
|
||||
label.color=$ACCENT_COLOR \
|
||||
icon.color=$ACCENT_COLOR \
|
||||
script="" \
|
||||
display=$m \
|
||||
label.font="sketchybar-app-font:Regular:12.0" \
|
||||
icon.font="SF Pro:Semibold:12.0" \
|
||||
label.padding_right=10 \
|
||||
label.y_offset=-1 \
|
||||
click_script="$PLUGIN_DIR/space_click.sh $sid"
|
||||
|
||||
apps=$(aerospace list-windows --monitor "$m" --workspace "$sid" |
|
||||
awk -F '|' '{gsub(/^ *| *$/, "", $2); if (!seen[$2]++) print $2}')
|
||||
|
||||
icon_strip=""
|
||||
if [ "${apps}" != "" ]; then
|
||||
while read -r app; do
|
||||
icon_strip+=" $($PLUGIN_DIR/icons.sh "$app")"
|
||||
done <<<"${apps}"
|
||||
else
|
||||
icon_strip=" —"
|
||||
fi
|
||||
|
||||
sketchybar --set space.$sid label="$icon_strip"
|
||||
|
||||
done
|
||||
|
||||
for empty_space in $(aerospace list-workspaces --monitor $m --empty); do
|
||||
sketchybar --set space.$empty_space display=0
|
||||
done
|
||||
for focus in $(aerospace list-workspaces --focused); do
|
||||
sketchybar --set space.$focus background.drawing=on \
|
||||
background.color=$ACCENT_COLOR \
|
||||
label.color=$ITEM_COLOR \
|
||||
icon.color=$ITEM_COLOR
|
||||
done
|
||||
done
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item volume right \
|
||||
--set volume script="$PLUGIN_DIR/volume.sh" \
|
||||
--subscribe volume volume_change
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --add item wifi right \
|
||||
--set wifi \
|
||||
icon="" \
|
||||
label="Updating..." \
|
||||
script="$PLUGIN_DIR/wifi.sh" \
|
||||
--subscribe wifi wifi_change
|
||||
@@ -1,7 +0,0 @@
|
||||
require("items.apple")
|
||||
require("items.menus")
|
||||
require("items.spaces")
|
||||
-- require("items.space_mode")
|
||||
require("items.calendar")
|
||||
require("items.widgets")
|
||||
require("items.media")
|
||||
@@ -1,118 +0,0 @@
|
||||
local icons = require("icons")
|
||||
local colors = require("colors")
|
||||
|
||||
local whitelist = { ["Spotify"] = true,
|
||||
["Music"] = true };
|
||||
|
||||
local media_cover = sbar.add("item", {
|
||||
position = "right",
|
||||
background = {
|
||||
image = {
|
||||
string = "media.artwork",
|
||||
scale = 0.85,
|
||||
},
|
||||
color = colors.transparent,
|
||||
},
|
||||
label = { drawing = false },
|
||||
icon = { drawing = false },
|
||||
drawing = false,
|
||||
updates = true,
|
||||
popup = {
|
||||
align = "center",
|
||||
horizontal = true,
|
||||
}
|
||||
})
|
||||
|
||||
local media_artist = sbar.add("item", {
|
||||
position = "right",
|
||||
drawing = false,
|
||||
padding_left = 3,
|
||||
padding_right = 0,
|
||||
width = 0,
|
||||
icon = { drawing = false },
|
||||
label = {
|
||||
width = 0,
|
||||
font = { size = 9 },
|
||||
color = colors.with_alpha(colors.white, 0.6),
|
||||
max_chars = 18,
|
||||
y_offset = 6,
|
||||
},
|
||||
})
|
||||
|
||||
local media_title = sbar.add("item", {
|
||||
position = "right",
|
||||
drawing = false,
|
||||
padding_left = 3,
|
||||
padding_right = 0,
|
||||
icon = { drawing = false },
|
||||
label = {
|
||||
font = { size = 11 },
|
||||
width = 0,
|
||||
max_chars = 16,
|
||||
y_offset = -5,
|
||||
},
|
||||
})
|
||||
|
||||
sbar.add("item", {
|
||||
position = "popup." .. media_cover.name,
|
||||
icon = { string = icons.media.back },
|
||||
label = { drawing = false },
|
||||
click_script = "nowplaying-cli previous",
|
||||
})
|
||||
sbar.add("item", {
|
||||
position = "popup." .. media_cover.name,
|
||||
icon = { string = icons.media.play_pause },
|
||||
label = { drawing = false },
|
||||
click_script = "nowplaying-cli togglePlayPause",
|
||||
})
|
||||
sbar.add("item", {
|
||||
position = "popup." .. media_cover.name,
|
||||
icon = { string = icons.media.forward },
|
||||
label = { drawing = false },
|
||||
click_script = "nowplaying-cli next",
|
||||
})
|
||||
|
||||
local interrupt = 0
|
||||
local function animate_detail(detail)
|
||||
if (not detail) then interrupt = interrupt - 1 end
|
||||
if interrupt > 0 and (not detail) then return end
|
||||
|
||||
sbar.animate("tanh", 30, function()
|
||||
media_artist:set({ label = { width = detail and "dynamic" or 0 } })
|
||||
media_title:set({ label = { width = detail and "dynamic" or 0 } })
|
||||
end)
|
||||
end
|
||||
|
||||
media_cover:subscribe("media_change", function(env)
|
||||
if whitelist[env.INFO.app] then
|
||||
local drawing = (env.INFO.state == "playing")
|
||||
media_artist:set({ drawing = drawing, label = env.INFO.artist, })
|
||||
media_title:set({ drawing = drawing, label = env.INFO.title, })
|
||||
media_cover:set({ drawing = drawing })
|
||||
|
||||
if drawing then
|
||||
animate_detail(true)
|
||||
interrupt = interrupt + 1
|
||||
sbar.delay(5, animate_detail)
|
||||
else
|
||||
media_cover:set({ popup = { drawing = false } })
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
media_cover:subscribe("mouse.entered", function(env)
|
||||
interrupt = interrupt + 1
|
||||
animate_detail(true)
|
||||
end)
|
||||
|
||||
media_cover:subscribe("mouse.exited", function(env)
|
||||
animate_detail(false)
|
||||
end)
|
||||
|
||||
media_cover:subscribe("mouse.clicked", function(env)
|
||||
media_cover:set({ popup = { drawing = "toggle" }})
|
||||
end)
|
||||
|
||||
media_title:subscribe("mouse.exited.global", function(env)
|
||||
media_cover:set({ popup = { drawing = false }})
|
||||
end)
|
||||
@@ -1,76 +0,0 @@
|
||||
local colors = require("colors")
|
||||
local icons = require("icons")
|
||||
local settings = require("settings")
|
||||
|
||||
local menu_watcher = sbar.add("item", {
|
||||
drawing = false,
|
||||
updates = false,
|
||||
})
|
||||
local space_menu_swap = sbar.add("item", {
|
||||
drawing = false,
|
||||
updates = true,
|
||||
})
|
||||
sbar.add("event", "swap_menus_and_spaces")
|
||||
|
||||
local max_items = 15
|
||||
local menu_items = {}
|
||||
for i = 1, max_items, 1 do
|
||||
local menu = sbar.add("item", "menu." .. i, {
|
||||
padding_left = settings.paddings,
|
||||
padding_right = settings.paddings,
|
||||
drawing = false,
|
||||
icon = { drawing = false },
|
||||
label = {
|
||||
font = {
|
||||
style = settings.font.style_map[i == 1 and "Heavy" or "Semibold"]
|
||||
},
|
||||
padding_left = 6,
|
||||
padding_right = 6,
|
||||
},
|
||||
click_script = "$CONFIG_DIR/helpers/menus/bin/menus -s " .. i,
|
||||
})
|
||||
|
||||
menu_items[i] = menu
|
||||
end
|
||||
|
||||
sbar.add("bracket", { '/menu\\..*/' }, {
|
||||
background = { color = colors.bg1 }
|
||||
})
|
||||
|
||||
local menu_padding = sbar.add("item", "menu.padding", {
|
||||
drawing = false,
|
||||
width = 5
|
||||
})
|
||||
|
||||
local function update_menus(env)
|
||||
sbar.exec("$CONFIG_DIR/helpers/menus/bin/menus -l", function(menus)
|
||||
sbar.set('/menu\\..*/', { drawing = false })
|
||||
menu_padding:set({ drawing = true })
|
||||
id = 1
|
||||
for menu in string.gmatch(menus, '[^\r\n]+') do
|
||||
if id < max_items then
|
||||
menu_items[id]:set( { label = menu, drawing = true } )
|
||||
else break end
|
||||
id = id + 1
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- menu_watcher:subscribe("front_app_switched", update_menus)
|
||||
|
||||
-- space_menu_swap:subscribe("swap_menus_and_spaces", function(env)
|
||||
-- local drawing = menu_items[1]:query().geometry.drawing == "on"
|
||||
-- if drawing then
|
||||
-- menu_watcher:set( { updates = false })
|
||||
-- sbar.set("/menu\\..*/", { drawing = false })
|
||||
-- sbar.set("/space\\..*/", { drawing = true })
|
||||
-- sbar.set("front_app", { drawing = true })
|
||||
-- else
|
||||
-- menu_watcher:set( { updates = true })
|
||||
-- sbar.set("/space\\..*/", { drawing = false })
|
||||
-- sbar.set("front_app", { drawing = false })
|
||||
-- update_menus()
|
||||
-- end
|
||||
-- end)
|
||||
|
||||
return menu_watcher
|
||||
@@ -1,145 +0,0 @@
|
||||
local colors = require("colors")
|
||||
local icons = require("icons")
|
||||
local settings = require("settings")
|
||||
local app_icons = require("helpers.app_icons")
|
||||
|
||||
local spaces = {}
|
||||
|
||||
for i = 1, 10, 1 do
|
||||
local space = sbar.add("space", "space." .. i, {
|
||||
space = i,
|
||||
icon = {
|
||||
font = { family = settings.font.numbers },
|
||||
string = i,
|
||||
padding_left = 15,
|
||||
padding_right = 8,
|
||||
color = colors.white,
|
||||
highlight_color = colors.red,
|
||||
},
|
||||
label = {
|
||||
padding_right = 20,
|
||||
color = colors.grey,
|
||||
highlight_color = colors.white,
|
||||
font = "sketchybar-app-font:Regular:16.0",
|
||||
y_offset = -1,
|
||||
},
|
||||
padding_right = 1,
|
||||
padding_left = 1,
|
||||
background = {
|
||||
color = colors.bg1,
|
||||
border_width = 3,
|
||||
border_color = colors.transparent,
|
||||
},
|
||||
popup = { background = { border_width = 5, border_color = colors.black } }
|
||||
})
|
||||
|
||||
spaces[i] = space
|
||||
|
||||
-- Padding space
|
||||
sbar.add("space", "space.padding." .. i, {
|
||||
space = i,
|
||||
script = "",
|
||||
width = settings.group_paddings,
|
||||
})
|
||||
|
||||
local space_popup = sbar.add("item", {
|
||||
position = "popup." .. space.name,
|
||||
padding_left= 5,
|
||||
padding_right= 0,
|
||||
background = {
|
||||
drawing = true,
|
||||
image = {
|
||||
corner_radius = 9,
|
||||
scale = 0.2
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
space:subscribe("space_change", function(env)
|
||||
local selected = env.SELECTED == "true"
|
||||
local color = selected and colors.red or colors.bg2
|
||||
space:set({
|
||||
icon = { highlight = selected, },
|
||||
label = { highlight = selected },
|
||||
background = { border_color = selected and colors.black or colors.bg2 }
|
||||
})
|
||||
space_bracket:set({
|
||||
background = { border_color = selected and colors.black or colors.bg2 }
|
||||
})
|
||||
end)
|
||||
|
||||
space:subscribe("mouse.clicked", function(env)
|
||||
if env.BUTTON == "other" then
|
||||
space_popup:set({ background = { image = "space." .. env.SID } })
|
||||
space:set({ popup = { drawing = "toggle" } })
|
||||
else
|
||||
local op = (env.BUTTON == "right") and "--destroy" or "--focus"
|
||||
sbar.exec("yabai -m space " .. op .. " " .. env.SID)
|
||||
end
|
||||
end)
|
||||
|
||||
space:subscribe("mouse.exited", function(_)
|
||||
space:set({ popup = { drawing = false } })
|
||||
end)
|
||||
end
|
||||
|
||||
local space_window_observer = sbar.add("item", {
|
||||
drawing = false,
|
||||
updates = true,
|
||||
})
|
||||
|
||||
|
||||
space_window_observer:subscribe("space_windows_change", function(env)
|
||||
local icon_line = ""
|
||||
local no_app = true
|
||||
for app, count in pairs(env.INFO.apps) do
|
||||
no_app = false
|
||||
local lookup = app_icons[app]
|
||||
local icon = ((lookup == nil) and app_icons["default"] or lookup)
|
||||
icon_line = icon_line .. " " .. icon
|
||||
end
|
||||
|
||||
if (no_app) then
|
||||
icon_line = " —"
|
||||
end
|
||||
sbar.animate("tanh", 10, function()
|
||||
spaces[env.INFO.space]:set({ label = icon_line })
|
||||
end)
|
||||
end)
|
||||
|
||||
-- spaces_indicator:subscribe("swap_menus_and_spaces", function(env)
|
||||
-- local currently_on = spaces_indicator:query().icon.value == icons.switch.on
|
||||
-- spaces_indicator:set({
|
||||
-- icon = currently_on and icons.switch.off or icons.switch.on
|
||||
-- })
|
||||
-- end)
|
||||
|
||||
-- spaces_indicator:subscribe("mouse.entered", function(env)
|
||||
-- sbar.animate("tanh", 30, function()
|
||||
-- spaces_indicator:set({
|
||||
-- background = {
|
||||
-- color = { alpha = 1.0 },
|
||||
-- border_color = { alpha = 1.0 },
|
||||
-- },
|
||||
-- icon = { color = colors.bg1 },
|
||||
-- label = { width = "dynamic" }
|
||||
-- })
|
||||
-- end)
|
||||
-- end)
|
||||
|
||||
-- spaces_indicator:subscribe("mouse.exited", function(env)
|
||||
-- sbar.animate("tanh", 30, function()
|
||||
-- spaces_indicator:set({
|
||||
-- background = {
|
||||
-- color = { alpha = 0.0 },
|
||||
-- border_color = { alpha = 0.0 },
|
||||
-- },
|
||||
-- icon = { color = colors.grey },
|
||||
-- label = { width = 0, }
|
||||
-- })
|
||||
-- end)
|
||||
-- end)
|
||||
|
||||
-- spaces_indicator:subscribe("mouse.clicked", function(env)
|
||||
-- sbar.trigger("swap_menus_and_spaces")
|
||||
-- end)
|
||||
@@ -1,105 +0,0 @@
|
||||
local icons = require("icons")
|
||||
local colors = require("colors")
|
||||
local settings = require("settings")
|
||||
|
||||
local battery = sbar.add("item", "widgets.battery", {
|
||||
position = "right",
|
||||
icon = {
|
||||
font = {
|
||||
style = settings.font.style_map["Regular"],
|
||||
size = 12.0,
|
||||
}
|
||||
},
|
||||
label = { font = { family = settings.font.numbers } },
|
||||
update_freq = 180,
|
||||
popup = { align = "center" }
|
||||
})
|
||||
|
||||
local remaining_time = sbar.add("item", {
|
||||
position = "popup." .. battery.name,
|
||||
icon = {
|
||||
string = "Time remaining:",
|
||||
width = 100,
|
||||
align = "left"
|
||||
},
|
||||
label = {
|
||||
string = "??:??h",
|
||||
width = 100,
|
||||
align = "right"
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
battery:subscribe({"routine", "power_source_change", "system_woke"}, function()
|
||||
sbar.exec("pmset -g batt", function(batt_info)
|
||||
local icon = "!"
|
||||
local label = "?"
|
||||
|
||||
local found, _, charge = batt_info:find("(%d+)%%")
|
||||
if found then
|
||||
charge = tonumber(charge)
|
||||
label = charge .. "%"
|
||||
end
|
||||
|
||||
local color = colors.green
|
||||
local charging, _, _ = batt_info:find("AC Power")
|
||||
|
||||
if charging then
|
||||
icon = icons.battery.charging
|
||||
else
|
||||
if found and charge == 0 then
|
||||
icon = icons.battery._0
|
||||
color = colors.red
|
||||
elseif found and charge <= 20 then
|
||||
icon = icons.battery._20
|
||||
color = colors.orange
|
||||
elseif found and charge <= 40 then
|
||||
icon = icons.battery._40
|
||||
elseif found and charge <= 60 then
|
||||
icon = icons.battery._60
|
||||
elseif found and charge <= 80 then
|
||||
icon = icons.battery._80
|
||||
elseif found and charge <= 100 then
|
||||
icon = icons.battery._100
|
||||
else
|
||||
icon = icons.battery._0
|
||||
color = colors.red
|
||||
end
|
||||
end
|
||||
|
||||
local lead = ""
|
||||
if found and charge < 10 then
|
||||
lead = "0"
|
||||
end
|
||||
|
||||
battery:set({
|
||||
icon = {
|
||||
string = icon,
|
||||
color = color
|
||||
},
|
||||
label = { string = lead .. label },
|
||||
})
|
||||
end)
|
||||
end)
|
||||
|
||||
battery:subscribe("mouse.clicked", function(env)
|
||||
local drawing = battery:query().popup.drawing
|
||||
battery:set( { popup = { drawing = "toggle" } })
|
||||
|
||||
if drawing == "off" then
|
||||
sbar.exec("pmset -g batt", function(batt_info)
|
||||
local found, _, remaining = batt_info:find(" (%d+:%d+) remaining")
|
||||
local label = found and remaining .. "h" or "No estimate"
|
||||
remaining_time:set( { label = label })
|
||||
end)
|
||||
end
|
||||
end)
|
||||
|
||||
sbar.add("bracket", "widgets.battery.bracket", { battery.name }, {
|
||||
background = { color = colors.bg1 }
|
||||
})
|
||||
|
||||
sbar.add("item", "widgets.battery.padding", {
|
||||
position = "right",
|
||||
width = settings.group_paddings
|
||||
})
|
||||
@@ -1,69 +0,0 @@
|
||||
local icons = require("icons")
|
||||
local colors = require("colors")
|
||||
local settings = require("settings")
|
||||
|
||||
-- Execute the event provider binary which provides the event "cpu_update" for
|
||||
-- the cpu load data, which is fired every 2.0 seconds.
|
||||
sbar.exec("killall cpu_load >/dev/null; $CONFIG_DIR/helpers/event_providers/cpu_load/bin/cpu_load cpu_update 2.0")
|
||||
|
||||
local cpu = sbar.add("graph", "widgets.cpu" , 62, {
|
||||
position = "right",
|
||||
graph = { color = colors.blue },
|
||||
background = {
|
||||
height = 22,
|
||||
color = { alpha = 0 },
|
||||
border_color = { alpha = 0 },
|
||||
drawing = true,
|
||||
},
|
||||
icon = { string = icons.cpu },
|
||||
label = {
|
||||
string = "cpu ??%",
|
||||
font = {
|
||||
family = settings.font.numbers,
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 9.0,
|
||||
},
|
||||
align = "right",
|
||||
padding_right = 0,
|
||||
width = 0,
|
||||
y_offset = 4
|
||||
},
|
||||
padding_right = settings.paddings + 6
|
||||
})
|
||||
|
||||
cpu:subscribe("cpu_update", function(env)
|
||||
-- Also available: env.user_load, env.sys_load
|
||||
local load = tonumber(env.total_load)
|
||||
cpu:push({ load / 100. })
|
||||
|
||||
local color = colors.blue
|
||||
if load > 30 then
|
||||
if load < 60 then
|
||||
color = colors.yellow
|
||||
elseif load < 80 then
|
||||
color = colors.orange
|
||||
else
|
||||
color = colors.red
|
||||
end
|
||||
end
|
||||
|
||||
cpu:set({
|
||||
graph = { color = color },
|
||||
label = "cpu " .. env.total_load .. "%",
|
||||
})
|
||||
end)
|
||||
|
||||
cpu:subscribe("mouse.clicked", function(env)
|
||||
sbar.exec("open -a 'Activity Monitor'")
|
||||
end)
|
||||
|
||||
-- Background around the cpu item
|
||||
sbar.add("bracket", "widgets.cpu.bracket", { cpu.name }, {
|
||||
background = { color = colors.bg1 }
|
||||
})
|
||||
|
||||
-- Background around the cpu item
|
||||
sbar.add("item", "widgets.cpu.padding", {
|
||||
position = "right",
|
||||
width = settings.group_paddings
|
||||
})
|
||||
@@ -1,4 +0,0 @@
|
||||
require("items.widgets.battery")
|
||||
require("items.widgets.volume")
|
||||
require("items.widgets.wifi")
|
||||
require("items.widgets.cpu")
|
||||
@@ -1,150 +0,0 @@
|
||||
local colors = require("colors")
|
||||
local icons = require("icons")
|
||||
local settings = require("settings")
|
||||
|
||||
local popup_width = 250
|
||||
|
||||
local volume_percent = sbar.add("item", "widgets.volume1", {
|
||||
position = "right",
|
||||
icon = { drawing = false },
|
||||
label = {
|
||||
string = "??%",
|
||||
padding_left = -1,
|
||||
font = { family = settings.font.numbers }
|
||||
},
|
||||
})
|
||||
|
||||
local volume_icon = sbar.add("item", "widgets.volume2", {
|
||||
position = "right",
|
||||
padding_right = -1,
|
||||
icon = {
|
||||
string = icons.volume._100,
|
||||
width = 0,
|
||||
align = "left",
|
||||
color = colors.grey,
|
||||
font = {
|
||||
style = settings.font.style_map["Regular"],
|
||||
size = 14.0,
|
||||
},
|
||||
},
|
||||
label = {
|
||||
width = 25,
|
||||
align = "left",
|
||||
font = {
|
||||
style = settings.font.style_map["Regular"],
|
||||
size = 14.0,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
local volume_bracket = sbar.add("bracket", "widgets.volume.bracket", {
|
||||
volume_icon.name,
|
||||
volume_percent.name
|
||||
}, {
|
||||
background = { color = colors.bg1 },
|
||||
popup = { align = "center" }
|
||||
})
|
||||
|
||||
sbar.add("item", "widgets.volume.padding", {
|
||||
position = "right",
|
||||
width = settings.group_paddings
|
||||
})
|
||||
|
||||
local volume_slider = sbar.add("slider", popup_width, {
|
||||
position = "popup." .. volume_bracket.name,
|
||||
slider = {
|
||||
highlight_color = colors.blue,
|
||||
background = {
|
||||
height = 6,
|
||||
corner_radius = 3,
|
||||
color = colors.bg2,
|
||||
},
|
||||
knob= {
|
||||
string = "",
|
||||
drawing = true,
|
||||
},
|
||||
},
|
||||
background = { color = colors.bg1, height = 2, y_offset = -20 },
|
||||
click_script = 'osascript -e "set volume output volume $PERCENTAGE"'
|
||||
})
|
||||
|
||||
volume_percent:subscribe("volume_change", function(env)
|
||||
local volume = tonumber(env.INFO)
|
||||
local icon = icons.volume._0
|
||||
if volume > 60 then
|
||||
icon = icons.volume._100
|
||||
elseif volume > 30 then
|
||||
icon = icons.volume._66
|
||||
elseif volume > 10 then
|
||||
icon = icons.volume._33
|
||||
elseif volume > 0 then
|
||||
icon = icons.volume._10
|
||||
end
|
||||
|
||||
local lead = ""
|
||||
if volume < 10 then
|
||||
lead = "0"
|
||||
end
|
||||
|
||||
volume_icon:set({ label = icon })
|
||||
volume_percent:set({ label = lead .. volume .. "%" })
|
||||
volume_slider:set({ slider = { percentage = volume } })
|
||||
end)
|
||||
|
||||
local function volume_collapse_details()
|
||||
local drawing = volume_bracket:query().popup.drawing == "on"
|
||||
if not drawing then return end
|
||||
volume_bracket:set({ popup = { drawing = false } })
|
||||
sbar.remove('/volume.device\\.*/')
|
||||
end
|
||||
|
||||
local current_audio_device = "None"
|
||||
local function volume_toggle_details(env)
|
||||
if env.BUTTON == "right" then
|
||||
sbar.exec("open /System/Library/PreferencePanes/Sound.prefpane")
|
||||
return
|
||||
end
|
||||
|
||||
local should_draw = volume_bracket:query().popup.drawing == "off"
|
||||
if should_draw then
|
||||
volume_bracket:set({ popup = { drawing = true } })
|
||||
sbar.exec("SwitchAudioSource -t output -c", function(result)
|
||||
current_audio_device = result:sub(1, -2)
|
||||
sbar.exec("SwitchAudioSource -a -t output", function(available)
|
||||
current = current_audio_device
|
||||
local color = colors.grey
|
||||
local counter = 0
|
||||
|
||||
for device in string.gmatch(available, '[^\r\n]+') do
|
||||
local color = colors.grey
|
||||
if current == device then
|
||||
color = colors.white
|
||||
end
|
||||
sbar.add("item", "volume.device." .. counter, {
|
||||
position = "popup." .. volume_bracket.name,
|
||||
width = popup_width,
|
||||
align = "center",
|
||||
label = { string = device, color = color },
|
||||
click_script = 'SwitchAudioSource -s "' .. device .. '" && sketchybar --set /volume.device\\.*/ label.color=' .. colors.grey .. ' --set $NAME label.color=' .. colors.white
|
||||
|
||||
})
|
||||
counter = counter + 1
|
||||
end
|
||||
end)
|
||||
end)
|
||||
else
|
||||
volume_collapse_details()
|
||||
end
|
||||
end
|
||||
|
||||
local function volume_scroll(env)
|
||||
local delta = env.SCROLL_DELTA
|
||||
sbar.exec('osascript -e "set volume output volume (output volume of (get volume settings) + ' .. delta .. ')"')
|
||||
end
|
||||
|
||||
-- volume_icon:subscribe("mouse.clicked", volume_toggle_details)
|
||||
-- volume_icon:subscribe("mouse.scrolled", volume_scroll)
|
||||
-- volume_percent:subscribe("mouse.clicked", volume_toggle_details)
|
||||
-- volume_percent:subscribe("mouse.exited.global", volume_collapse_details)
|
||||
-- volume_percent:subscribe("mouse.scrolled", volume_scroll)
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
local icons = require("icons")
|
||||
local colors = require("colors")
|
||||
local settings = require("settings")
|
||||
|
||||
-- Execute the event provider binary which provides the event "network_update"
|
||||
-- for the network interface "en0", which is fired every 2.0 seconds.
|
||||
sbar.exec("killall network_load >/dev/null; $CONFIG_DIR/helpers/event_providers/network_load/bin/network_load en0 network_update 2.0")
|
||||
|
||||
local popup_width = 250
|
||||
|
||||
local wifi_up = sbar.add("item", "widgets.wifi1", {
|
||||
position = "right",
|
||||
padding_left = -5,
|
||||
width = 0,
|
||||
icon = {
|
||||
padding_right = 0,
|
||||
font = {
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 9.0,
|
||||
},
|
||||
string = icons.wifi.upload,
|
||||
},
|
||||
label = {
|
||||
font = {
|
||||
family = settings.font.mono,
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 9.0,
|
||||
},
|
||||
color = colors.red,
|
||||
string = "??? Bps",
|
||||
},
|
||||
y_offset = 4,
|
||||
})
|
||||
|
||||
local wifi_down = sbar.add("item", "widgets.wifi2", {
|
||||
position = "right",
|
||||
padding_left = -5,
|
||||
icon = {
|
||||
padding_right = 0,
|
||||
font = {
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 9.0,
|
||||
},
|
||||
string = icons.wifi.download,
|
||||
},
|
||||
label = {
|
||||
font = {
|
||||
family = settings.font.mono,
|
||||
style = settings.font.style_map["Bold"],
|
||||
size = 9.0,
|
||||
},
|
||||
color = colors.blue,
|
||||
string = "??? Bps",
|
||||
},
|
||||
y_offset = -4,
|
||||
})
|
||||
|
||||
local wifi = sbar.add("item", "widgets.wifi.padding", {
|
||||
position = "right",
|
||||
label = { drawing = true, string = [[HERE]] },
|
||||
})
|
||||
|
||||
-- Background around the item
|
||||
local wifi_bracket = sbar.add("bracket", "widgets.wifi.bracket", {
|
||||
wifi.name,
|
||||
wifi_up.name,
|
||||
wifi_down.name
|
||||
}, {
|
||||
background = { color = colors.bg1 },
|
||||
popup = { align = "center", height = 30 }
|
||||
})
|
||||
|
||||
local ssid = sbar.add("item", {
|
||||
position = "popup." .. wifi_bracket.name,
|
||||
icon = {
|
||||
font = {
|
||||
style = settings.font.style_map["Bold"]
|
||||
},
|
||||
string = icons.wifi.router,
|
||||
},
|
||||
width = popup_width,
|
||||
align = "center",
|
||||
label = {
|
||||
font = {
|
||||
size = 15,
|
||||
style = settings.font.style_map["Bold"]
|
||||
},
|
||||
max_chars = 18,
|
||||
string = "????????????",
|
||||
},
|
||||
background = {
|
||||
height = 2,
|
||||
color = colors.grey,
|
||||
y_offset = -15
|
||||
}
|
||||
})
|
||||
|
||||
local hostname = sbar.add("item", {
|
||||
position = "popup." .. wifi_bracket.name,
|
||||
icon = {
|
||||
align = "left",
|
||||
string = "Hostname:",
|
||||
width = popup_width / 2,
|
||||
},
|
||||
label = {
|
||||
max_chars = 20,
|
||||
string = "????????????",
|
||||
width = popup_width / 2,
|
||||
align = "right",
|
||||
}
|
||||
})
|
||||
|
||||
local ip = sbar.add("item", {
|
||||
position = "popup." .. wifi_bracket.name,
|
||||
icon = {
|
||||
align = "left",
|
||||
string = "IP:",
|
||||
width = popup_width / 2,
|
||||
},
|
||||
label = {
|
||||
string = "???.???.???.???",
|
||||
width = popup_width / 2,
|
||||
align = "right",
|
||||
}
|
||||
})
|
||||
|
||||
local mask = sbar.add("item", {
|
||||
position = "popup." .. wifi_bracket.name,
|
||||
icon = {
|
||||
align = "left",
|
||||
string = "Subnet mask:",
|
||||
width = popup_width / 2,
|
||||
},
|
||||
label = {
|
||||
string = "???.???.???.???",
|
||||
width = popup_width / 2,
|
||||
align = "right",
|
||||
}
|
||||
})
|
||||
|
||||
local router = sbar.add("item", {
|
||||
position = "popup." .. wifi_bracket.name,
|
||||
icon = {
|
||||
align = "left",
|
||||
string = "Router:",
|
||||
width = popup_width / 2,
|
||||
},
|
||||
label = {
|
||||
string = "???.???.???.???",
|
||||
width = popup_width / 2,
|
||||
align = "right",
|
||||
},
|
||||
})
|
||||
|
||||
sbar.add("item", { position = "right", width = settings.group_paddings })
|
||||
|
||||
wifi_up:subscribe("network_update", function(env)
|
||||
local up_color = (env.upload == "000 Bps") and colors.grey or colors.red
|
||||
local down_color = (env.download == "000 Bps") and colors.grey or colors.blue
|
||||
wifi_up:set({
|
||||
icon = { color = up_color },
|
||||
label = {
|
||||
string = env.upload,
|
||||
color = up_color
|
||||
}
|
||||
})
|
||||
wifi_down:set({
|
||||
icon = { color = down_color },
|
||||
label = {
|
||||
string = env.download,
|
||||
color = down_color
|
||||
}
|
||||
})
|
||||
end)
|
||||
|
||||
wifi:subscribe({"wifi_change", "system_woke"}, function(env)
|
||||
sbar.exec("ipconfig getifaddr en0", function(ip)
|
||||
local connected = not (ip == "")
|
||||
wifi:set({
|
||||
icon = {
|
||||
string = connected and icons.wifi.connected or icons.wifi.disconnected,
|
||||
color = connected and colors.white or colors.red,
|
||||
},
|
||||
})
|
||||
if connected then
|
||||
sbar.exec("ipconfig getsummary en0 | awk -F ' SSID : ' '/ SSID : / {print $2}'", function(ssid_result)
|
||||
wifi:set({
|
||||
label = { string = ssid_result }
|
||||
})
|
||||
end)
|
||||
else
|
||||
wifi:set({
|
||||
label = { string = "Disconnected" }
|
||||
})
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
local function hide_details()
|
||||
wifi_bracket:set({ popup = { drawing = false } })
|
||||
end
|
||||
|
||||
local function toggle_details()
|
||||
local should_draw = wifi_bracket:query().popup.drawing == "off"
|
||||
if should_draw then
|
||||
wifi_bracket:set({ popup = { drawing = true }})
|
||||
sbar.exec("networksetup -getcomputername", function(result)
|
||||
hostname:set({ label = result })
|
||||
end)
|
||||
sbar.exec("ipconfig getifaddr en0", function(result)
|
||||
ip:set({ label = result })
|
||||
end)
|
||||
sbar.exec("ipconfig getsummary en0 | awk -F ' SSID : ' '/ SSID : / {print $2}'", function(result)
|
||||
ssid:set({ label = result })
|
||||
end)
|
||||
sbar.exec("networksetup -getinfo Wi-Fi | awk -F 'Subnet mask: ' '/^Subnet mask: / {print $2}'", function(result)
|
||||
mask:set({ label = result })
|
||||
end)
|
||||
sbar.exec("networksetup -getinfo Wi-Fi | awk -F 'Router: ' '/^Router: / {print $2}'", function(result)
|
||||
router:set({ label = result })
|
||||
end)
|
||||
else
|
||||
hide_details()
|
||||
end
|
||||
end
|
||||
|
||||
wifi_up:subscribe("mouse.clicked", toggle_details)
|
||||
wifi_down:subscribe("mouse.clicked", toggle_details)
|
||||
wifi:subscribe("mouse.clicked", toggle_details)
|
||||
wifi:subscribe("mouse.exited.global", hide_details)
|
||||
|
||||
local function copy_label_to_clipboard(env)
|
||||
local label = sbar.query(env.NAME).label.value
|
||||
sbar.exec("echo \"" .. label .. "\" | pbcopy")
|
||||
sbar.set(env.NAME, { label = { string = icons.clipboard, align="center" } })
|
||||
sbar.delay(1, function()
|
||||
sbar.set(env.NAME, { label = { string = label, align = "right" } })
|
||||
end)
|
||||
end
|
||||
|
||||
ssid:subscribe("mouse.clicked", copy_label_to_clipboard)
|
||||
hostname:subscribe("mouse.clicked", copy_label_to_clipboard)
|
||||
ip:subscribe("mouse.clicked", copy_label_to_clipboard)
|
||||
mask:subscribe("mouse.clicked", copy_label_to_clipboard)
|
||||
router:subscribe("mouse.clicked", copy_label_to_clipboard)
|
||||
@@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
|
||||
source "$CONFIG_DIR/colors.sh"
|
||||
|
||||
PERCENTAGE=$(pmset -g batt | grep -Eo "\d+%" | cut -d% -f1)
|
||||
CHARGING=$(pmset -g batt | grep 'AC Power')
|
||||
|
||||
if [ $PERCENTAGE = "" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case ${PERCENTAGE} in
|
||||
9[0-9] | 100)
|
||||
ICON=""
|
||||
COLOR=$ITEM_COLOR
|
||||
;;
|
||||
[6-8][0-9])
|
||||
ICON=""
|
||||
COLOR=$ITEM_COLOR
|
||||
;;
|
||||
[3-5][0-9])
|
||||
ICON=""
|
||||
COLOR="0xFFd97706"
|
||||
;;
|
||||
[1-2][0-9])
|
||||
ICON=""
|
||||
COLOR="0xFFf97316"
|
||||
;;
|
||||
*)
|
||||
ICON=""
|
||||
COLOR="0xFFef4444"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ $CHARGING != "" ]]; then
|
||||
ICON=""
|
||||
COLOR=$ITEM_COLOR
|
||||
fi
|
||||
|
||||
# The item invoking this script (name $NAME) will get its icon and label
|
||||
# updated with the current battery status
|
||||
sketchybar --set $NAME icon="$ICON" label="${PERCENTAGE}%" icon.color="$COLOR"
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
sketchybar --set $NAME label="$(date '+%a %d %b %I:%M %p')"
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
CORE_COUNT=$(sysctl -n machdep.cpu.thread_count)
|
||||
CPU_INFO=$(ps -eo pcpu,user)
|
||||
CPU_SYS=$(echo "$CPU_INFO" | grep -v $(whoami) | sed "s/[^ 0-9\.]//g" | awk "{sum+=\$1} END {print sum/(100.0 * $CORE_COUNT)}")
|
||||
CPU_USER=$(echo "$CPU_INFO" | grep $(whoami) | sed "s/[^ 0-9\.]//g" | awk "{sum+=\$1} END {print sum/(100.0 * $CORE_COUNT)}")
|
||||
|
||||
CPU_PERCENT=$(ps -eo pcpu | awk -v core_count=$(sysctl -n machdep.cpu.thread_count) '{sum+=$1} END {printf "%.0f\n", sum/core_count}')
|
||||
sketchybar --set $NAME label="$CPU_PERCENT%"
|
||||
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Some events send additional information specific to the event in the $INFO
|
||||
# variable. E.g. the front_app_switched event sends the name of the newly
|
||||
# focused application in the $INFO variable:
|
||||
# https://felixkratz.github.io/SketchyBar/config/events#events-and-scripting
|
||||
|
||||
app_switched() {
|
||||
for m in $(aerospace list-monitors | awk '{print $1}'); do
|
||||
for sid in $(aerospace list-workspaces --monitor $m --visible); do
|
||||
|
||||
apps=$( (echo "$INFO"; aerospace list-windows --monitor "$m" --workspace "$sid" \
|
||||
| awk -F '|' '{gsub(/^ *| *$/, "", $2); print $2}') \
|
||||
| awk '!seen[$0]++' | sort)
|
||||
|
||||
icon_strip=""
|
||||
if [ "${apps}" != "" ]; then
|
||||
while read -r app; do
|
||||
icon_strip+=" $($CONFIG_DIR/plugins/icons.sh "$app")"
|
||||
done <<<"${apps}"
|
||||
else
|
||||
icon_strip=" —"
|
||||
fi
|
||||
|
||||
sketchybar --animate sin 10 --set space.$sid label="$icon_strip"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
if [ "$SENDER" = "front_app_switched" ]; then
|
||||
|
||||
sketchybar --set $NAME label="$INFO" icon="$($CONFIG_DIR/plugins/icons.sh "$INFO")"
|
||||
|
||||
app_switched
|
||||
fi
|
||||
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Source the icon map with all the application icons
|
||||
source "$CONFIG_DIR/icon_map.sh"
|
||||
|
||||
# Create a cache directory if it doesn't exist
|
||||
CACHE_DIR="$HOME/.cache/sketchybar"
|
||||
mkdir -p "$CACHE_DIR"
|
||||
|
||||
# Cache file for icon mappings
|
||||
ICON_CACHE="$CACHE_DIR/icon_cache.txt"
|
||||
|
||||
# Create the cache file if it doesn't exist
|
||||
if [ ! -f "$ICON_CACHE" ]; then
|
||||
touch "$ICON_CACHE"
|
||||
fi
|
||||
|
||||
# Check if the app is already in cache
|
||||
APP_NAME="$1"
|
||||
CACHED_ICON=$(grep "^$APP_NAME|" "$ICON_CACHE" | cut -d '|' -f2)
|
||||
|
||||
if [ -n "$CACHED_ICON" ]; then
|
||||
# Cache hit, return the icon
|
||||
echo "$CACHED_ICON"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get icon from the mapping function
|
||||
__icon_map "$APP_NAME"
|
||||
|
||||
if [ -n "$icon_result" ]; then
|
||||
echo "$APP_NAME|$icon_result" >>"$ICON_CACHE"
|
||||
fi
|
||||
|
||||
echo "$icon_result"
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
STATE="$(echo "$INFO" | jq -r '.state')"
|
||||
if [ "$STATE" = "playing" ]; then
|
||||
MEDIA="$(echo "$INFO" | jq -r '.title + " - " + .artist')"
|
||||
sketchybar --set $NAME label="$MEDIA" drawing=on
|
||||
else
|
||||
sketchybar --set $NAME drawing=off
|
||||
fi
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
USAGE="$(memory_pressure | grep "System-wide memory free percentage:" | awk '{ printf("%02.0f\n", 100-$5"%") }')%"
|
||||
|
||||
sketchybar --set $NAME label="$USAGE"
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
apps=$(aerospace list-windows --workspace $1 | awk -F '|' '{gsub(/^ *| *$/, "", $2); print $2}')
|
||||
focused=$(aerospace list-workspaces --focused)
|
||||
|
||||
if [ "${apps}" = "" ] && [ "${focused}" != "$1" ]; then
|
||||
sketchybar --set space.$1 display=0
|
||||
else
|
||||
aerospace workspace $1
|
||||
fi
|
||||
@@ -0,0 +1,57 @@
|
||||
#!/bin/sh
|
||||
|
||||
source "$CONFIG_DIR/colors.sh"
|
||||
|
||||
update_workspace_appearance() {
|
||||
local sid=$1
|
||||
local is_focused=$2
|
||||
|
||||
if [ "$is_focused" = "true" ]; then
|
||||
sketchybar --set space.$sid background.drawing=on \
|
||||
background.color=$ACCENT_COLOR \
|
||||
label.color=$ITEM_COLOR \
|
||||
icon.color=$ITEM_COLOR
|
||||
else
|
||||
sketchybar --set space.$sid background.drawing=off \
|
||||
label.color=$ACCENT_COLOR \
|
||||
icon.color=$ACCENT_COLOR
|
||||
fi
|
||||
}
|
||||
|
||||
update_icons() {
|
||||
m=$1
|
||||
sid=$2
|
||||
|
||||
apps=$(aerospace list-windows --monitor "$m" --workspace "$sid" \
|
||||
| awk -F '|' '{gsub(/^ *| *$/, "", $2); if (!seen[$2]++) print $2}' \
|
||||
| sort)
|
||||
|
||||
icon_strip=""
|
||||
if [ "${apps}" != "" ]; then
|
||||
while read -r app; do
|
||||
icon_strip+=" $($CONFIG_DIR/plugins/icons.sh "$app")"
|
||||
done <<<"${apps}"
|
||||
else
|
||||
icon_strip=" —"
|
||||
fi
|
||||
|
||||
sketchybar --animate sin 10 --set space.$sid label="$icon_strip"
|
||||
}
|
||||
|
||||
update_workspace_appearance "$PREV_WORKSPACE" "false"
|
||||
update_workspace_appearance "$FOCUSED_WORKSPACE" "true"
|
||||
|
||||
for m in $(aerospace list-monitors | awk '{print $1}'); do
|
||||
for sid in $(aerospace list-workspaces --monitor $m --visible); do
|
||||
sketchybar --set space.$sid display=$m
|
||||
|
||||
update_icons "$m" "$sid"
|
||||
|
||||
update_icons "$m" "$PREV_WORKSPACE"
|
||||
|
||||
apps=$(aerospace list-windows --monitor "$m" --workspace "$sid" | wc -l)
|
||||
if [ "${apps}" -eq 0 ]; then
|
||||
sketchybar --set space.$sid display=0
|
||||
fi
|
||||
done
|
||||
done
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
|
||||
# The volume_change event supplies a $INFO variable in which the current volume
|
||||
# percentage is passed to the script.
|
||||
|
||||
if [ "$SENDER" = "volume_change" ]; then
|
||||
|
||||
VOLUME=$INFO
|
||||
|
||||
case $VOLUME in
|
||||
[6-9][0-9] | 100)
|
||||
ICON=""
|
||||
;;
|
||||
[3-5][0-9])
|
||||
ICON=""
|
||||
;;
|
||||
[1-9] | [1-2][0-9])
|
||||
ICON=""
|
||||
;;
|
||||
*) ICON="" ;;
|
||||
esac
|
||||
|
||||
sketchybar --set $NAME icon="$ICON" label="$VOLUME%"
|
||||
fi
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
if ifconfig en0 | grep -q "inet "; then
|
||||
sketchybar --set $NAME icon="" label=""
|
||||
else
|
||||
sketchybar --set $NAME icon="" label="Disconnected"
|
||||
fi
|
||||
@@ -1,22 +0,0 @@
|
||||
return {
|
||||
paddings = 3,
|
||||
group_paddings = 5,
|
||||
|
||||
icons = "sf-symbols", -- alternatively available: NerdFont
|
||||
|
||||
-- This is a font configuration for SF Pro and SF Mono (installed manually)
|
||||
font = require("helpers.default_font"),
|
||||
|
||||
-- Alternatively, this is a font config for JetBrainsMono Nerd Font
|
||||
-- font = {
|
||||
-- text = "JetBrainsMono Nerd Font", -- Used for text
|
||||
-- numbers = "JetBrainsMono Nerd Font", -- Used for numbers
|
||||
-- style_map = {
|
||||
-- ["Regular"] = "Regular",
|
||||
-- ["Semibold"] = "Medium",
|
||||
-- ["Bold"] = "SemiBold",
|
||||
-- ["Heavy"] = "Bold",
|
||||
-- ["Black"] = "ExtraBold",
|
||||
-- },
|
||||
-- },
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env lua
|
||||
|
||||
-- Load the sketchybar-package and prepare the helper binaries
|
||||
require("helpers")
|
||||
require("init")
|
||||
Reference in New Issue
Block a user