212 lines
6.1 KiB
Lua
212 lines
6.1 KiB
Lua
local setmetatable = setmetatable
|
|
|
|
-- Awesome Libs
|
|
local abutton = require('awful.button')
|
|
local akey = require('awful.key')
|
|
local akeygrabber = require('awful.keygrabber')
|
|
local aspawn = require('awful.spawn')
|
|
local beautiful = require('beautiful')
|
|
local dpi = require('beautiful').xresources.apply_dpi
|
|
local gfilesystem = require('gears.filesystem')
|
|
local gtable = require('gears.table')
|
|
local wibox = require('wibox')
|
|
local gsurface = require('gears.surface')
|
|
|
|
local hover = require('src.tools.hover')
|
|
|
|
local capi = {
|
|
awesome = awesome,
|
|
screen = screen,
|
|
}
|
|
|
|
-- Icon directory path
|
|
local icondir = gfilesystem.get_configuration_dir() .. 'src/assets/icons/powermenu/'
|
|
|
|
local instance = nil
|
|
local powermenu = {}
|
|
|
|
local function get_button(type)
|
|
local icon, name, bg_color, command
|
|
|
|
if type == 'shutdown' then
|
|
icon = icondir .. 'shutdown.svg'
|
|
name = 'Shutdown'
|
|
bg_color = beautiful.colorscheme.bg_blue
|
|
command = 'shutdown now'
|
|
elseif type == 'reboot' then
|
|
icon = icondir .. 'reboot.svg'
|
|
name = 'Reboot'
|
|
bg_color = beautiful.colorscheme.bg_red
|
|
command = 'reboot'
|
|
elseif type == 'logout' then
|
|
icon = icondir .. 'logout.svg'
|
|
name = 'Logout'
|
|
bg_color = beautiful.colorscheme.bg_yellow
|
|
command = 'awesome-client "awesome.quit()"'
|
|
elseif type == 'lock' then
|
|
icon = icondir .. 'lock.svg'
|
|
name = 'Lock'
|
|
bg_color = beautiful.colorscheme.bg_green
|
|
command = 'dm-tool lock'
|
|
elseif type == 'suspend' then
|
|
icon = icondir .. 'suspend.svg'
|
|
name = 'Suspend'
|
|
bg_color = beautiful.colorscheme.bg_purple
|
|
command = 'systemctl suspend'
|
|
end
|
|
|
|
local widget = wibox.widget {
|
|
{
|
|
{
|
|
{
|
|
{
|
|
{
|
|
image = icon,
|
|
resize = true,
|
|
valign = 'center',
|
|
halign = 'center',
|
|
widget = wibox.widget.imagebox,
|
|
},
|
|
{
|
|
text = name,
|
|
font = 'JetBrains Mono Bold 30',
|
|
valign = 'center',
|
|
halign = 'center',
|
|
widget = wibox.widget.textbox,
|
|
},
|
|
widget = wibox.layout.fixed.horizontal,
|
|
},
|
|
widget = wibox.container.place,
|
|
},
|
|
margins = dpi(10),
|
|
widget = wibox.container.margin,
|
|
},
|
|
fg = beautiful.colorscheme.bg,
|
|
bg = bg_color,
|
|
shape = beautiful.shape[12],
|
|
widget = wibox.container.background,
|
|
id = 'background',
|
|
},
|
|
height = dpi(70),
|
|
strategy = 'exact',
|
|
widget = wibox.container.constraint,
|
|
}
|
|
|
|
hover.bg_hover { widget = widget.background, overlay = 12, press_overlay = 24 }
|
|
|
|
widget:buttons(gtable.join(
|
|
abutton({}, 1, function()
|
|
aspawn(command)
|
|
end)
|
|
))
|
|
|
|
return widget
|
|
end
|
|
|
|
function powermenu:toggle()
|
|
self.keygrabber:start()
|
|
self.w.visible = not self.w.visible
|
|
end
|
|
|
|
if instance == nil then
|
|
instance = setmetatable(powermenu, {
|
|
__call = function(self)
|
|
self.w = wibox {
|
|
widget = {
|
|
{
|
|
{
|
|
{
|
|
{
|
|
image = gsurface.load_uncached(gfilesystem.get_configuration_dir() .. 'src/assets/userpfp/userpfp.png'),
|
|
resize = true,
|
|
clip_shape = beautiful.shape[30],
|
|
valign = 'center',
|
|
halign = 'center',
|
|
id = 'icon_role',
|
|
widget = wibox.widget.imagebox,
|
|
},
|
|
widget = wibox.container.constraint,
|
|
width = dpi(200),
|
|
height = dpi(200),
|
|
strategy = 'exact',
|
|
},
|
|
{
|
|
halign = 'center',
|
|
valign = 'center',
|
|
font = 'JetBrains Mono Bold 30',
|
|
id = 'text_role',
|
|
widget = wibox.widget.textbox,
|
|
},
|
|
spacing = dpi(50),
|
|
layout = wibox.layout.fixed.vertical,
|
|
},
|
|
{
|
|
{
|
|
get_button('shutdown'),
|
|
get_button('reboot'),
|
|
get_button('logout'),
|
|
get_button('lock'),
|
|
get_button('suspend'),
|
|
spacing = dpi(30),
|
|
layout = wibox.layout.fixed.horizontal,
|
|
},
|
|
widget = wibox.container.place,
|
|
},
|
|
spacing = dpi(50),
|
|
layout = wibox.layout.fixed.vertical,
|
|
},
|
|
widget = wibox.container.place,
|
|
},
|
|
screen = capi.screen.primary,
|
|
type = 'splash',
|
|
visible = false,
|
|
ontop = true,
|
|
bg = beautiful.colorscheme.bg .. '88',
|
|
height = capi.screen.primary.geometry.height,
|
|
width = capi.screen.primary.geometry.width,
|
|
x = capi.screen.primary.geometry.x,
|
|
y = capi.screen.primary.geometry.y,
|
|
}
|
|
|
|
self.w:buttons { gtable.join(
|
|
abutton({}, 3, function()
|
|
self:toggle()
|
|
self.keygrabber:stop()
|
|
end)
|
|
), }
|
|
|
|
self.keygrabber = akeygrabber {
|
|
autostart = false,
|
|
stop_event = 'release',
|
|
stop_key = 'Escape',
|
|
keybindings = {
|
|
akey {
|
|
modifiers = {},
|
|
key = 'Escape',
|
|
on_press = function()
|
|
self:toggle()
|
|
end,
|
|
},
|
|
},
|
|
}
|
|
|
|
-- Get the profile script from /var/lib/AccountsService/icons/${USER}
|
|
-- and copy it to the assets folder
|
|
-- TODO: If the user doesnt have AccountsService look into $HOME/.faces
|
|
--[[ aspawn.easy_async_with_shell("./.config/awesome/src/scripts/pfp.sh 'userPfp'", function(stdout)
|
|
print(stdout)
|
|
if stdout then
|
|
self.w:get_children_by_id('icon_role')[1].image = gsurface.load_uncached(gfilesystem.get_configuration_dir() .. 'src/assets/userpfp/userpfp.png')
|
|
else
|
|
self.w:get_children_by_id('icon_role')[1].image = icondir .. 'defaultpfp.svg'
|
|
end
|
|
end) ]]
|
|
|
|
aspawn.easy_async_with_shell("./.config/awesome/src/scripts/pfp.sh 'userName' '" .. beautiful.user_config.namestyle .. "'", function(stdout)
|
|
self.w:get_children_by_id('text_role')[1].text = stdout:gsub('\n', '')
|
|
end)
|
|
end,
|
|
})
|
|
end
|
|
return instance
|