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.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.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, }, }) 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)