my complicated awesomewm config (SUNSETTED)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

125 lines
5.0 KiB

--This module is an attempt to add the functionality of automatic suspension to awesome.
--Although it is not supported nor is advised, it should probably work as long as awful.spawn and gears.timer functions don't change
--A known issue: there is a memory leak that is hard to trace
local awful = require("awful")
local gears = require("gears")
local naughty = require("naughty")
local rcfile = io.open(global.config_dir.."powerman.lua")
G_PowerManPIDs = {}
G_PowerManSleepTimer = os.time()
G_PowerManSuspendTimer = os.time()
G_PowerManSleepNotify = os.time()
G_PowerManSuspendNotify = os.time()
G_PowerManTracker = {
MouseCoords = {}
}
local function pgrep(prg)
awful.spawn.easy_async("pgrep "..prg,function(out,err,r,code)
if out ~= "" then
G_PowerManPIDs[prg] = true
else
G_PowerManPIDs[prg] = nil
end
end)
end
if rcfile then
local sleep_activated,suspend_activated = false,false
local sleep_notified,suspend_notified = false,false
--rc file loading
local rc,err = load(rcfile:read("*a"))
rcfile:close()
local rcdata
if not err then
rcdata = rc()
else
require("naughty").notify({
title = "Error reading rc.lua",
text = err
})
end
--disable builtin x11 screensaver timer and dpms timer
awful.spawn("xset -dpms s off")
--defaults
rcdata.sleep_rules = rcdata.sleep_rules or {}
rcdata.suspend_rules = rcdata.suspend_rules or {}
rcdata.sleep_time = rcdata.sleep_time or
((type(rcdata.sleep_time) == "nil") and 900)
rcdata.suspend_time = rcdata.suspend_time or
((type(rcdata.suspend_time) == "nil") and 1800)
rcdata.sleep = rcdata.sleep or ((type(rcdata.sleep) == "nil") and true)
rcdata.suspend = rcdata.suspend
rcdata.sleep_notify = rcdata.sleep_notify or
((type(rcdata.sleep_notify) == "nil") and 600)
rcdata.suspend_notify = rcdata.suspend_notify
--main timer
gears.timer {
timeout = 10,
call_now = true,
autostart = true,
callback = function()
if mouse.coords() and
mouse.coords().x ~= G_PowerManTracker.MouseCoords.x or
mouse.coords().y ~= G_PowerManTracker.MouseCoords.y then
G_PowerManSleepTimer = os.time()
G_PowerManSuspendTimer = os.time()
G_PowerManSleepNotify = os.time()
G_PowerManSuspendNotify = os.time()
sleep_activated = false
suspend_activated = false
sleep_notified = false
suspend_notified = false
end
for flags,progname in pairs(rcdata.sleep_rules) do
pgrep(progname)
if G_PowerManPIDs[progname] then
G_PowerManSleepTimer = os.time()
G_PowerManSleepNotify = os.time()
end
end
for flags,progname in pairs(rcdata.suspend_rules) do
pgrep(progname)
if G_PowerManPIDs[progname] then
G_PowerManSuspendTimer = os.time()
G_PowerManSuspendNotify = os.time()
end
end
if rcdata.sleep_notify and (not sleep_notified) and
(rcdata.sleep_notify+10 < rcdata.sleep_time) then
if os.time()-G_PowerManSleepNotify > rcdata.sleep_notify then
sleep_notified = true
naughty.notify({text="screen will turn off in "..tostring(
math.floor((rcdata.sleep_time-rcdata.sleep_notify)/60)
).." minutes"})
end
end
if rcdata.suspend_notify and (not suspend_notified) and
(rcdata.suspend_notify+10 < rcdata.suspend_time) then
if os.time()-G_PowerManSuspendNotify>rcdata.suspend_notify then
suspend_notified = true
naughty.notify({text="Computer will suspend in"..tostring(
math.floor((rcdata.suspend_time-rcdata.suspend_notify)/60)
).."minutes"})
end
end
if rcdata.sleep and (not sleep_activated) then
if os.time()-G_PowerManSleepTimer > rcdata.sleep_time then
if rcdata.sleep_lock then
rcdata.sleep_lock()
end
sleep_activated = true
awful.spawn("xset s activate dpms suspend")
end
end
if rcdata.suspend and (not suspend_activated) then
if os.time()-G_PowerManSuspendTimer > rcdata.suspend_time then
if rcdata.suspend_lock then
rcdata.suspend_lock()
end
suspend_activated = true
awful.spawn.with_shell("systemctl suspend || loginctl suspend")
end
end
G_PowerManTracker.MouseCoords = mouse.coords() or {}
end
}
end