dotfiles/awesome/components/exit-screen.lua

226 lines
6.5 KiB
Lua

-- ███████╗██╗ ██╗██╗████████╗ ███████╗ ██████╗██████╗ ███████╗███████╗███╗ ██╗
-- ██╔════╝╚██╗██╔╝██║╚══██╔══╝ ██╔════╝██╔════╝██╔══██╗██╔════╝██╔════╝████╗ ██║
-- █████╗ ╚███╔╝ ██║ ██║ ███████╗██║ ██████╔╝█████╗ █████╗ ██╔██╗ ██║
-- ██╔══╝ ██╔██╗ ██║ ██║ ╚════██║██║ ██╔══██╗██╔══╝ ██╔══╝ ██║╚██╗██║
-- ███████╗██╔╝ ██╗██║ ██║ ███████║╚██████╗██║ ██║███████╗███████╗██║ ╚████║
-- ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝
-- ===================================================================
-- Initialization
-- ===================================================================
local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local clickable_container = require("widgets.clickable-container")
local dpi = beautiful.xresources.apply_dpi
local ICON_DIR = gears.filesystem.get_configuration_dir() .. "/icons/exit-screen/" .. beautiful.name .. "/"
-- define module table
local exit_screen = {}
-- ===================================================================
-- Appearance
-- ===================================================================
local icon_size = dpi(90)
local build_button = function(icon)
local button = wibox.widget {
wibox.widget {
wibox.widget {
wibox.widget {
image = icon,
widget = wibox.widget.imagebox
},
top = dpi(16),
bottom = dpi(16),
left = dpi(16),
right = dpi(16),
widget = wibox.container.margin
},
shape = gears.shape.circle,
forced_width = icon_size,
forced_height = icon_size,
widget = clickable_container
},
left = dpi(24),
right = dpi(24),
widget = wibox.container.margin
}
return button
end
-- ===================================================================
-- Functionality
-- ===================================================================
local exit_screen_grabber
local function suspend_command()
exit_screen.hide()
awful.spawn.with_shell(apps.lock .. " & systemctl suspend")
end
local function exit_command()
awesome.quit()
end
local function lock_command()
exit_screen.hide()
awful.spawn.with_shell("sleep 1 && " .. apps.lock)
end
local function poweroff_command()
awful.spawn.with_shell("poweroff")
awful.keygrabber.stop(exit_screen_grabber)
end
local function reboot_command()
awful.spawn.with_shell("reboot")
awful.keygrabber.stop(exit_screen_grabber)
end
local poweroff = build_button(ICON_DIR .. "power.png", "Shutdown")
poweroff:connect_signal(
"button::release",
function()
poweroff_command()
end
)
local reboot = build_button(ICON_DIR .. "restart.png", "Restart")
reboot:connect_signal(
"button::release",
function()
reboot_command()
end
)
local suspend = build_button(ICON_DIR .. "sleep.png", "Sleep")
suspend:connect_signal(
"button::release",
function()
suspend_command()
end
)
local exit = build_button(ICON_DIR .. "logout.png", "Logout")
exit:connect_signal(
"button::release",
function()
exit_command()
end
)
local lock = build_button(ICON_DIR .. "lock.png", "Lock")
lock:connect_signal(
"button::release",
function()
lock_command()
end
)
-- subscribe to the show_exit_screen signal
-- show the exit screen when signal is broadcasted
awesome.connect_signal("show_exit_screen",
function()
exit_screen_grabber = awful.keygrabber.run(
function(_, key, event)
if event == "release" then
return
end
if key == "s" then
suspend_command()
elseif key == "e" then
exit_command()
elseif key == "l" then
lock_command()
elseif key == "p" then
poweroff_command()
elseif key == "r" then
reboot_command()
elseif key == "Escape" or key == "q" or key == "x" then
exit_screen.hide()
end
end
)
exit_screen.widget.visible = true
end
)
-- hide exit screen
function exit_screen.hide()
awful.keygrabber.stop(exit_screen_grabber)
exit_screen.widget.visible = false
end
-- ===================================================================
-- Create Widget
-- ===================================================================
local screen_geometry = awful.screen.focused().geometry
-- Create the widget
exit_screen.widget = wibox({
x = screen_geometry.x,
y = screen_geometry.y,
visible = false,
ontop = true,
type = "splash",
height = screen_geometry.height,
width = screen_geometry.width
})
exit_screen.widget:buttons(
gears.table.join(
-- Middle click - Hide exit_screen
awful.button({}, 2,
function()
exit_screen.hide()
end
),
-- Right click - Hide exit_screen
awful.button({}, 3,
function()
exit_screen.hide()
end
)
)
)
-- Item placement
exit_screen.widget:setup {
nil,
{
nil,
{
poweroff,
reboot,
suspend,
exit,
lock,
layout = wibox.layout.fixed.horizontal
},
nil,
expand = "none",
layout = wibox.layout.align.horizontal
},
nil,
expand = "none",
layout = wibox.layout.align.vertical
}
return exit_screen