awesome-powermenu/init.lua

148 lines
4.7 KiB
Lua

local awful = require "awful"
local wibox = require("wibox")
local gears = require("gears")
local beautiful = require("beautiful")
local longpress = require("awesome-longpress")
local powermenu = {
buttonsize = 128,
spacing = 5,
iconPath = gears.filesystem.get_configuration_dir() .. "/awesome-powermenu/",
lock = function()
error("Lock requested, but no function specified")
end,
suspend = function()
error("Suspend requested, but no function specified")
end,
logout = function()
error("Logout requested, but no function specified")
end,
poweroff = function()
error("Power off requested, but no function specified")
end,
reboot = function()
error("Reboot requested, but no function specified")
end,
fullscreen = function(self)
self.screen.navbar.visible = not self.screen.navbar.visible
end,
rotateLeft = function(self)
for k,v in pairs(self.screen.outputs) do
awful.spawn(gears.filesystem.get_configuration_dir() .. "/awesome-powermenu/rotate.lua left " .. tostring(k))
end
awesome.restart()
end,
rotateRight = function(self)
for k,v in pairs(self.screen.outputs) do
awful.spawn(gears.filesystem.get_configuration_dir() .. "/awesome-powermenu/rotate.lua right " .. tostring(k))
end
awesome.restart()
end,
brightnessUp = function()
awful.spawn.easy_async_with_shell("ls /sys/class/backlight/",function(stdout,stderr,_,_)
local devices = {}
for line in stdout:gmatch("%S+") do
local f = io.open(string.format("/sys/class/backlight/%s/brightness",line),"rb")
if not f then error("wtf") end
local brightness = tonumber(f:read("*a"))
f:close()
local f = io.open(string.format("/sys/class/backlight/%s/max_brightness",line),"rb")
local max_brightness = tonumber(f:read("*a"))
f:close()
devices[line]={["brightness"]=brightness,["max_brightness"]=max_brightness}
end
for k,v in pairs(devices) do
v.stepsize = math.floor(v.max_brightness / 10)
v.currentstep = math.floor(v.brightness / v.stepsize)
local f = io.open(string.format("/sys/class/backlight/%s/brightness",k),"wb")
f:write(v.stepsize * math.min(10,(v.currentstep+1)))
f:close()
end
end)
end,
brightnessDown = function()
awful.spawn.easy_async_with_shell("ls /sys/class/backlight/",function(stdout,stderr,_,_)
local devices = {}
for line in stdout:gmatch("%S+") do
local f = io.open(string.format("/sys/class/backlight/%s/brightness",line),"rb")
if not f then error("wtf") end
local brightness = tonumber(f:read("*a"))
f:close()
local f = io.open(string.format("/sys/class/backlight/%s/max_brightness",line),"rb")
local max_brightness = tonumber(f:read("*a"))
f:close()
devices[line]={["brightness"]=brightness,["max_brightness"]=max_brightness}
end
for k,v in pairs(devices) do
v.stepsize = math.floor(v.max_brightness / 10)
v.currentstep = math.floor(v.brightness / v.stepsize)
local f = io.open(string.format("/sys/class/backlight/%s/brightness",k),"wb")
f:write(v.stepsize * math.max(1,(v.currentstep-1)))
f:close()
end
end)
end
}
function powermenu.new(s)
local powermenuWidget = wibox.widget{
layout = wibox.layout.grid.vertical(3),
spacing = powermenu.spacing,
}
local powermenuPopup = awful.popup{
layout = wibox.layout.fixed.vertical,
widget = powermenuWidget,
border_color = beautiful.border_focus,
border_width = 2,
ontop = true,
placement = awful.placement.centered,
screen = s,
visible = false,
}
local function addButton(icon, fn, lfn, hide)
if hide == nil then hide = true end
local newButton = awful.widget.button{
image = powermenu.iconPath .. "/" .. icon,
}
newButton:set_forced_width(powermenu.buttonsize)
newButton:set_forced_height(powermenu.buttonsize)
longpress.add(newButton,
function()
fn(powermenuPopup)
if hide then
powermenuPopup:hide()
end
end,
function()
lfn(powermenuPopup)
if hide then
powermenuPopup:hide()
end
end
)
powermenuWidget:add(newButton)
end
addButton("system-log-out.svg", powermenu.logout, powermenu.poweroff)
addButton("system-lock-screen.svg", powermenu.lock)
addButton("system-reboot.svg", awesome.restart, powermenu.reboot)
addButton("object-rotate-left.svg", powermenu.rotateLeft)
addButton("system-suspend.svg", powermenu.suspend)
addButton("object-rotate-right.svg", powermenu.rotateRight)
addButton("brightness-up.svg", powermenu.brightnessUp, nil, false)
addButton("view-fullscreen.svg", powermenu.fullscreen)
addButton("brightness-down.svg", powermenu.brightnessDown, nil, false)
function powermenuPopup.show(self)
self.visible = true
end
function powermenuPopup.hide(self)
self.visible = false
end
function powermenuPopup.toggle(self)
self.visible = not self.visible
end
return powermenuPopup
end
return powermenu