dotfiles/dot_config/awesome/lib/exit-screen.lua
2024-04-14 18:41:15 -07:00

186 lines
4.6 KiB
Lua

local awful = require("awful")
local gears = require("gears")
local wibox = require("wibox")
local beautiful = require("beautiful")
local helpers = require("helpers")
local config = require("config")
local dpi = beautiful.xresources.apply_dpi
local theme = beautiful.get()
--- Minimalist Exit Screen
--- ~~~~~~~~~~~~~~~~~~~~~~
--- Icons
local icon_font = helpers.ui.set_font("bold 45")
local poweroff_text_icon = config.icons.power
local reboot_text_icon = config.icons.restart
local suspend_text_icon = config.icons.sleep
local exit_text_icon = config.icons.exit
local lock_text_icon = config.icons.lock
local button_bg = theme.color.base
local button_size = dpi(120)
--- Commands
local poweroff_command = function()
awful.spawn.with_shell("systemctl poweroff")
awesome.emit_signal("module::exit_screen:hide")
end
local reboot_command = function()
awful.spawn.with_shell("systemctl reboot")
awesome.emit_signal("module::exit_screen:hide")
end
local suspend_command = function()
awesome.emit_signal("module::exit_screen:hide")
awful.spawn.with_shell("systemctl suspend")
end
local exit_command = function()
awesome.quit()
end
local lock_command = function()
awesome.emit_signal("module::exit_screen:hide")
end
local create_button = function(symbol, hover_color, _, command)
local icon = wibox.widget({
forced_height = button_size,
forced_width = button_size,
halign = "center",
valign = "center",
font = icon_font,
markup = helpers.ui.colorize_text(symbol, theme.color.surface0),
widget = wibox.widget.textbox(),
})
local button = wibox.widget({
{
nil,
icon,
expand = "none",
layout = wibox.layout.align.horizontal,
},
forced_height = button_size,
forced_width = button_size,
border_width = dpi(8),
border_color = theme.color.surface0,
shape = helpers.ui.rrect(theme.border_width * 2),
bg = button_bg,
widget = wibox.container.background,
})
button:buttons(gears.table.join(awful.button({}, 1, function()
command()
end)))
button:connect_signal("mouse::enter", function()
icon.markup = helpers.ui.colorize_text(icon.text, hover_color)
button.border_color = hover_color
end)
button:connect_signal("mouse::leave", function()
icon.markup = helpers.ui.colorize_text(icon.text, theme.color.surface0)
button.border_color = theme.color.surface0
end)
helpers.ui.add_hover_cursor(button, "hand1")
return button
end
--- Create the buttons
local poweroff = create_button(poweroff_text_icon, theme.color.red, "Poweroff", poweroff_command)
local reboot = create_button(reboot_text_icon, theme.color.green, "Reboot", reboot_command)
local suspend = create_button(suspend_text_icon, theme.color.peach, "Suspend", suspend_command)
local exit = create_button(exit_text_icon, theme.color.blue, "Exit", exit_command)
local lock = create_button(lock_text_icon, theme.color.pink, "Lock", lock_command)
local create_exit_screen = function(s)
s.exit_screen = wibox({
screen = s,
type = "splash",
visible = false,
ontop = true,
bg = theme.color.transparent,
fg = theme.fg_normal,
height = s.geometry.height,
width = s.geometry.width,
x = s.geometry.x,
y = s.geometry.y,
})
s.exit_screen:buttons(gears.table.join(
awful.button({}, 2, function()
awesome.emit_signal("module::exit_screen:hide")
end),
awful.button({}, 3, function()
awesome.emit_signal("module::exit_screen:hide")
end)
))
s.exit_screen:setup({
nil,
{
nil,
{
poweroff,
reboot,
suspend,
exit,
lock,
spacing = dpi(50),
layout = wibox.layout.fixed.horizontal,
},
expand = "none",
layout = wibox.layout.align.horizontal,
},
expand = "none",
layout = wibox.layout.align.vertical,
})
end
screen.connect_signal("request::desktop_decoration", function(s)
create_exit_screen(s)
end)
screen.connect_signal("removed", function(s)
create_exit_screen(s)
end)
local exit_screen_grabber = awful.keygrabber({
auto_start = true,
stop_event = "release",
keypressed_callback = function(_, _, key, _)
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
awesome.emit_signal("module::exit_screen:hide")
end
end,
})
awesome.connect_signal("module::exit_screen:show", function()
for s in screen do
s.exit_screen.visible = false
end
awful.screen.focused().exit_screen.visible = true
exit_screen_grabber:start()
end)
awesome.connect_signal("module::exit_screen:hide", function()
exit_screen_grabber:stop()
for s in screen do
s.exit_screen.visible = false
end
end)