nix/config/sketchybar/items/wifi.lua

219 lines
5.7 KiB
Lua

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 sk-network-load >/dev/null; sk-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.numbers,
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.numbers,
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 = false },
})
-- Background around the item
local wifi_bracket = sbar.add('bracket', 'widgets.wifi.bracket', {
wifi.name,
wifi_up.name,
wifi_down.name,
}, {
-- background = { color = colors.bar.bg },
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.fg,
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.fg or colors.red
local down_color = (env.download == '000 Bps') and colors.fg 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.fg or colors.red,
},
}
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)