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)