local awful = require("awful") local gtable = require("gears.table") local naughty = require("naughty") local wibox = require("wibox") local lain = require("lain") local helpers = require("lain.helpers") local markup = lain.util.markup local theme = require("theme") local utils = require("utils") local gfs = require("gears.filesystem") local iconsdir = gfs.get_configuration_dir() .. "icons/" local network_interfaces = {"enp0s25", "wlp3s0"} local widgets = {} widgets.netdown_icon = wibox.widget.imagebox(iconsdir .. "down.png") widgets.netdown = lain.widget.net({ units = 1024^2, iface = network_interfaces, notify = "off", settings = function() widget:set_markup(markup.fontfg(theme.font, theme.colors.green, net_now.received .. "MiB/s ")) end }) widgets.netup_icon = wibox.widget.imagebox(iconsdir .. "up.png") widgets.netup = lain.widget.net({ units = 1024^2, iface = network_interfaces, notify = "off", settings = function() widget:set_markup(markup.fontfg(theme.font, theme.colors.red, net_now.sent .. "MiB/s ")) end }) widgets.mem_icon = wibox.widget.imagebox(iconsdir .. "mem.png") widgets.mem = lain.widget.mem({ settings = function() widget:set_markup(markup.fontfg(theme.font, theme.colors.yellow, mem_now.perc .. "% ")) end }) widgets.cpu_icon = wibox.widget.imagebox(iconsdir .. "cpu.png") widgets.cpu = lain.widget.cpu({ settings = function() widget:set_markup(markup.fontfg(theme.font, theme.colors.cyan, string.format("%02d", cpu_now.usage) .. "% ")) end }) widgets.temp_icon = wibox.widget.imagebox(iconsdir .. "temp.png") widgets.temp = lain.widget.temp({ settings = function() widget:set_markup(markup.fontfg(theme.font, theme.colors.magenta, math.floor(coretemp_now) .. "°C ")) end }) widgets.bat_icon = wibox.widget.imagebox(iconsdir .. "bat.png") widgets.bat = lain.widget.bat({ notify = "off", settings = function() state = bat_now.ac_status == 0 and "D" or "C" widget:set_markup(markup.fontfg(theme.font, theme.fg_normal, state .. bat_now.perc)) end }) widgets.vpn = {} widgets.vpn.icon = wibox.widget.imagebox(iconsdir .. "vpn.png") widgets.vpn.widget = wibox.widget.textbox() widgets.vpn.update = function() helpers.async({ "/bin/ip", "link" }, function(output) connected = false for line in output:gmatch("[^\r\n]+") do vpn_server = string.match(line, "^%d+: mullvad%-(%g+):") if vpn_server then widgets.vpn.widget:set_markup(markup.fontfg(theme.font, theme.colors.blue, vpn_server .. " ")) connected = true end end if connected then widgets.vpn.icon.visible = true else widgets.vpn.widget:set_markup(markup.fontfg(theme.font, theme.colors.blue, "")) widgets.vpn.icon.visible = false end end) end helpers.newtimer("vpn", 5, widgets.vpn.update) widgets.bluetooth = wibox.widget.imagebox(iconsdir .. "bluetooth-on.png") widgets.bluetooth.pass_state = function(callback) helpers.async_with_shell("/sbin/rfkill -n -o SOFT list bluetooth|uniq", function(state) callback(state:gsub("^%s*(.-)%s*$", "%1")) end) end widgets.bluetooth.update = function() widgets.bluetooth.pass_state(function(state) if state == "blocked" then widgets.bluetooth:set_image(iconsdir .. "bluetooth-off.png") else helpers.async_with_shell("for device in $(bluetoothctl devices|cut -d' ' -f 2);do bluetoothctl info $device|grep 'Connected: yes';done|wc -l", function(connected_devices) if tonumber(connected_devices) > 0 then widgets.bluetooth:set_image(iconsdir .. "bluetooth-active.png") else widgets.bluetooth:set_image(iconsdir .. "bluetooth-on.png") end end) end end) end widgets.bluetooth.toggle = function() widgets.bluetooth.pass_state(function(state) if state == "blocked" then awful.spawn.spawn({ "/sbin/rfkill", "unblock", "bluetooth" }) else awful.spawn.spawn({ "/sbin/rfkill", "block", "bluetooth" }) end widgets.bluetooth.update() end) end widgets.bluetooth:buttons( gtable.join( awful.button({ }, 1, widgets.bluetooth.toggle), awful.button({ }, 3, function() awful.spawn.with_shell("blueman-manager; pkill blueman-applet") end) ) ) helpers.newtimer("bluetooth", 10, widgets.bluetooth.update) widgets.redshift = wibox.widget.imagebox(iconsdir .. "redshift-on.png") widgets.redshift.pid = nil utils.handle_pid("redshift", function(pid) if pid and #pid > 0 then widgets.redshift.pid = tonumber(pid) else widgets.redshift.pid = awful.spawn.spawn({ "redshift" }) end end) widgets.redshift.active = true widgets.redshift.toggle = function() awful.spawn.spawn({ "kill", "-SIGUSR1", tostring(widgets.redshift.pid) }) widgets.redshift.active = not widgets.redshift.active if widgets.redshift.active == true then widgets.redshift:set_image(iconsdir .. "redshift-on.png") else widgets.redshift:set_image(iconsdir .. "redshift-off.png") end end widgets.redshift:buttons( gtable.join( awful.button({ }, 1, widgets.redshift.toggle) ) ) widgets.tearstop = wibox.widget.imagebox(iconsdir .. "tearstop-off.png") utils.handle_pid("compton --backend=glx", function(pid) if pid and #pid > 0 then widgets.tearstop.pid = tonumber(pid) widgets.tearstop:set_image(iconsdir .. "tearstop-on.png") end end) widgets.tearstop.pid = nil widgets.tearstop:buttons( gtable.join( awful.button({ }, 1, function() if widgets.tearstop.pid == nil then widgets.tearstop.pid = awful.spawn.spawn({ "compton", "--backend=glx" }) widgets.tearstop:set_image(iconsdir .. "tearstop-on.png") else awful.spawn.spawn({ "kill", tostring(widgets.tearstop.pid) }) widgets.tearstop.pid = nil widgets.tearstop:set_image(iconsdir .. "tearstop-off.png") end end) ) ) widgets.notifications = wibox.widget.imagebox(iconsdir .. "notifications-on.png") widgets.notifications:buttons( gtable.join( awful.button({ }, 1, function() if naughty.is_suspended() then naughty.resume() widgets.notifications:set_image(iconsdir .. "notifications-on.png") else naughty.suspend() widgets.notifications:set_image(iconsdir .. "notifications-off.png") end end) ) ) widgets.cal = {} widgets.cal.toggle = function() if widgets.cal.notification ~= nil then naughty.destroy(widgets.cal.notification) widgets.cal.notification = nil else helpers.async({ "khal", "--color", "calendar" }, function(output) widgets.cal.notification = naughty.notify{ screen = awful.screen.focused(), text = utils.ansi2markup(output:gsub("\n$", ""), theme.colors), timeout = 0, } end) end end widgets.cal.attach = function(parent) parent:buttons(awful.util.table.join( awful.button({}, 1, widgets.cal.toggle) )) end return widgets