summaryrefslogtreecommitdiff
path: root/experiments/logout-widget/logout.lua
blob: fb0e06e137a18e82dd94f78fc9ce2098057024bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
-------------------------------------------------
-- Logout widget for Awesome Window Manager
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/logout-widget

-- @author Pavel Makhov
-- @copyright 2020 Pavel Makhov
-------------------------------------------------

local awful = require("awful")
local capi = {keygrabber = keygrabber }
local wibox = require("wibox")
local gears = require("gears")
local beautiful = require("beautiful")
local fancybuttons = require("awesome-buttons.awesome-buttons")


local HOME_DIR = os.getenv("HOME")
local WIDGET_DIR = HOME_DIR .. '/.config/awesome/awesome-wm-widgets/experiments/logout-widget'
local ICONS_DIR = WIDGET_DIR .. '/icons/'


local w = wibox {
    bg = beautiful.fg_normal,
    max_widget_size = 500,
    ontop = true,
    height = 200,
    width = 400,
    shape = function(cr, width, height)
        gears.shape.rounded_rect(cr, width, height, 8)
    end
}

local action = wibox.widget {
    text = ' ',
    widget = wibox.widget.textbox
}


local function create_button(icon_name, action_name, color, onclick)

    local button = fancybuttons.with_icon{ type = 'basic', shape = 'circle', icon = ICONS_DIR .. icon_name, color = color, onclick = onclick }
    button:connect_signal("mouse::enter", function(c) action:set_text(action_name) end)
    button:connect_signal("mouse::leave", function(c) action:set_text(' ') end)
    return button
end

local function launch(args)

    local bg_color = args.bg_color or beautiful.bg_normal
    local accent_color = args.accent_color or beautiful.bg_focus
    local text_color = args.text_color or beautiful.fg_normal
    local phrases = args.phrases or {'Goodbye!'}

    local onlogout = args.onlogout or function () awesome.quit() end
    local onlock = args.onlock
    local onreboot = args.onreboot
    local onsuspend = args.onsuspend
    local onpoweroff = args.onpoweroff or function () awful.spawn.with_shell("shutdown now") end

    w:set_bg(bg_color)

    w:setup {
        {
            {
                markup = '<span color="'.. text_color .. '" size="20000">' .. phrases[ math.random( #phrases ) ] .. '</span>',
                align  = 'center',
                widget = wibox.widget.textbox
            },
            {
                {
                    create_button('log-out.svg', 'Log Out', accent_color, onlogout),
                    create_button('lock.svg', 'Lock', accent_color, onlock),
                    create_button('refresh-cw.svg', 'Reboot', accent_color, onreboot),
                    create_button('moon.svg', 'Suspend', accent_color, onsuspend),
                    create_button('power.svg', 'Power Off', accent_color, onpoweroff),
                    id = 'buttons',
                    spacing = 8,
                    layout = wibox.layout.fixed.horizontal
                },
                valigh = 'center',
                layout = wibox.container.place
            },
            {
                action,
                haligh = 'center',
                layout = wibox.container.place
            },
            spacing = 32,
            layout = wibox.layout.fixed.vertical
        },
        id = 'a',
        shape_border_width = 1,
        valigh = 'center',
        layout = wibox.container.place
    }

    w.visible = true

    awful.placement.centered(w)
    capi.keygrabber.run(function(_, key, event)
        if event == "release" then return end
        if key then
            capi.keygrabber.stop()
            w.visible = false
        end
    end)
end

return {
    launch = launch
}