dotfiles/awes2/module/exit-screen.lua

351 lines
6.9 KiB
Lua

local awful = require('awful')
local gears = require('gears')
local wibox = require('wibox')
local beautiful = require('beautiful')
local dpi = beautiful.xresources.apply_dpi
local icons = require('theme.icons')
local apps = require('configuration.apps')
local clickable_container = require('widget.clickable-container')
local filesystem = gears.filesystem
local config_dir = filesystem.get_configuration_dir()
local widget_icon_dir = config_dir .. 'configuration/user-profile/'
local greeter_message = wibox.widget {
markup = 'Choose wisely!',
font = 'SF Pro Text UltraLight 48',
align = 'center',
valign = 'center',
widget = wibox.widget.textbox
}
local profile_name = wibox.widget {
markup = 'user@hostname',
font = 'SF Pro Text Regular 12',
align = 'center',
valign = 'center',
widget = wibox.widget.textbox
}
local profile_imagebox = wibox.widget {
image = widget_icon_dir .. 'default.svg',
resize = true,
forced_height = dpi(110),
clip_shape = gears.shape.circle,
widget = wibox.widget.imagebox
}
local profile_imagebox_bg = wibox.widget {
bg = beautiful.groups_bg,
forced_width = dpi(120),
forced_height = dpi(120),
shape = gears.shape.circle,
widget = wibox.container.background
}
local update_profile_pic = function()
awful.spawn.easy_async_with_shell(
apps.bins.update_profile,
function(stdout)
stdout = stdout:gsub('%\n','')
if not stdout:match("default") then
profile_imagebox:set_image(stdout)
else
profile_imagebox:set_image(widget_icon_dir .. 'default.svg')
end
end
)
end
update_profile_pic()
local update_user_name = function()
awful.spawn.easy_async_with_shell(
"printf \"$(whoami)@$(hostname)\"",
function(stdout)
local stdout = stdout:gsub('%\n','')
local username = stdout:match("(.*)@")
username = username:sub(1, 1):upper() .. username:sub(2)
greeter_message:set_markup('Choose wisely, ' .. username .. '!')
profile_name:set_markup(stdout)
end
)
end
update_user_name()
local build_button = function(icon, name)
local button_text = wibox.widget {
text = name,
font = beautiful.font,
align = 'center',
valign = 'center',
widget = wibox.widget.textbox
}
local a_button = wibox.widget {
{
{
{
{
image = icon,
widget = wibox.widget.imagebox
},
margins = dpi(16),
widget = wibox.container.margin
},
bg = beautiful.groups_bg,
widget = wibox.container.background
},
shape = gears.shape.rounded_rect,
forced_width = dpi(90),
forced_height = dpi(90),
widget = clickable_container
},
left = dpi(24),
right = dpi(24),
widget = wibox.container.margin
}
local build_a_button = wibox.widget {
layout = wibox.layout.fixed.vertical,
spacing = dpi(5),
a_button,
button_text
}
return build_a_button
end
local suspend_command = function()
awesome.emit_signal("module::exit_screen_hide")
awful.spawn.with_shell(apps.default.lock .. ' & systemctl suspend')
end
local exit_command = function()
awesome.quit()
end
local lock_command = function()
awesome.emit_signal("module::exit_screen_hide")
awful.spawn.with_shell('sleep 1 && ' .. apps.default.lock)
end
local poweroff_command = function()
awful.spawn.with_shell('poweroff')
awesome.emit_signal("module::exit_screen_hide")
end
local reboot_command = function()
awful.spawn.with_shell('reboot')
awesome.emit_signal("module::exit_screen_hide")
end
local poweroff = build_button(icons.power, 'Shutdown')
poweroff:connect_signal(
'button::release',
function()
poweroff_command()
end
)
local reboot = build_button(icons.restart, 'Restart')
reboot:connect_signal(
'button::release',
function()
reboot_command()
end
)
local suspend = build_button(icons.sleep, 'Sleep')
suspend:connect_signal(
'button::release',
function()
suspend_command()
end
)
local exit = build_button(icons.logout, 'Logout')
exit:connect_signal(
'button::release',
function()
exit_command()
end
)
local lock = build_button(icons.lock, 'Lock')
lock:connect_signal(
'button::release',
function()
lock_command()
end
)
screen.connect_signal(
"request::desktop_decoration",
function(s)
s.exit_screen = wibox
{
screen = s,
type = 'splash',
visible = false,
ontop = true,
bg = beautiful.background,
fg = beautiful.fg_normal,
height = s.geometry.height,
width = s.geometry.width,
x = s.geometry.x,
y = s.geometry.y
}
local exit_screen_hide = function()
awesome.emit_signal("module::exit_screen_hide")
end
local exit_screen_grabber = awful.keygrabber {
auto_start = true,
stop_event = 'release',
keypressed_callback = function(self, mod, key, command)
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
)
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,
{
{
nil,
{
layout = wibox.layout.fixed.vertical,
spacing = dpi(5),
{
profile_imagebox_bg,
{
layout = wibox.layout.align.vertical,
expand = 'none',
nil,
{
layout = wibox.layout.align.horizontal,
expand = 'none',
nil,
profile_imagebox,
nil
},
nil
},
layout = wibox.layout.stack
},
profile_name
},
nil,
expand = 'none',
layout = wibox.layout.align.horizontal
},
{
layout = wibox.layout.align.horizontal,
expand = 'none',
nil,
{
{
greeter_message,
{
poweroff,
reboot,
suspend,
exit,
lock,
layout = wibox.layout.fixed.horizontal
},
spacing = dpi(30),
layout = wibox.layout.fixed.vertical
},
spacing = dpi(40),
layout = wibox.layout.fixed.vertical
},
nil
},
spacing = dpi(40),
layout = wibox.layout.fixed.vertical
},
nil,
expand = 'none',
layout = wibox.layout.align.horizontal
},
nil,
expand = 'none',
layout = wibox.layout.align.vertical
}
end
)