From 692767d09ebdc501a01a971b899a86dbcaef1237 Mon Sep 17 00:00:00 2001 From: streetturtle Date: Fri, 18 Dec 2020 21:13:21 -0500 Subject: [PATCH] new widget - logout-menu --- logout-menu-widget/README.md | 45 ++++++ logout-menu-widget/icons/lock.svg | 1 + logout-menu-widget/icons/log-out.svg | 1 + logout-menu-widget/icons/moon.svg | 1 + logout-menu-widget/icons/power.svg | 1 + .../icons/power_w.svg | 0 logout-menu-widget/icons/refresh-cw.svg | 1 + logout-menu-widget/logout-menu.gif | Bin 0 -> 47220 bytes logout-menu-widget/logout-menu.lua | 129 ++++++++++++++++++ 9 files changed, 179 insertions(+) create mode 100644 logout-menu-widget/README.md create mode 100644 logout-menu-widget/icons/lock.svg create mode 100644 logout-menu-widget/icons/log-out.svg create mode 100644 logout-menu-widget/icons/moon.svg create mode 100644 logout-menu-widget/icons/power.svg rename logout-widget/power.svg => logout-menu-widget/icons/power_w.svg (100%) create mode 100644 logout-menu-widget/icons/refresh-cw.svg create mode 100644 logout-menu-widget/logout-menu.gif create mode 100644 logout-menu-widget/logout-menu.lua diff --git a/logout-menu-widget/README.md b/logout-menu-widget/README.md new file mode 100644 index 0000000..d47dcb2 --- /dev/null +++ b/logout-menu-widget/README.md @@ -0,0 +1,45 @@ +# Logout Menu Widget + +This widget shows a menu with options to log out from the current session, lock, reboot, suspend and power off the computer, similar to [logout-popup-widget](https://github.com/streetturtle/awesome-wm-widgets/tree/master/logout-popup-widget): + +![demo](./logout-menu.gif) + +## Installation + +Clone this repo (if not cloned yet) **./.config/awesome/** + +```bash +cd ./.config/awesome/ +git clone https://github.com/streetturtle/awesome-wm-widgets +``` +Then add the widget to the wibar: + +```lua +local logout_menu_widget = require("awesome-wm-widgets.logout-menu-widget.logout-menu") + +s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + ... + -- default + logout_menu_widget(), + -- custom + logout_menu_widget{ + font = 'Play 14', + onlock = function() awful.spawn.with_shell('i3lock-fancy') end + } + ... +``` + +## Customization + +It is possible to customize the widget by providing a table with all or some of the following config parameters: + +| Name | Default | Description | +|---|---|---| +| `font` | `beautiful.font` | Font of the menu items | +| `onlogout` | `function() awesome.quit() end` | Function which is called when the logout item is clicked | +| `onlock` | `function() awful.spawn.with_shell("i3lock") end` | Function which is called when the lock item is clicked | +| `onreboot` | `function() awful.spawn.with_shell("reboot") end` | Function which is called when the reboot item is clicked | +| `onsuspend` | `function() awful.spawn.with_shell("systemctl suspend") end` | Function which is called when the suspend item is clicked | +| `onpoweroff` | `function() awful.spawn.with_shell("shutdown now") end` | Function which is called when the poweroff item is clicked | diff --git a/logout-menu-widget/icons/lock.svg b/logout-menu-widget/icons/lock.svg new file mode 100644 index 0000000..3cfa528 --- /dev/null +++ b/logout-menu-widget/icons/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logout-menu-widget/icons/log-out.svg b/logout-menu-widget/icons/log-out.svg new file mode 100644 index 0000000..77afebb --- /dev/null +++ b/logout-menu-widget/icons/log-out.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logout-menu-widget/icons/moon.svg b/logout-menu-widget/icons/moon.svg new file mode 100644 index 0000000..60e6ce8 --- /dev/null +++ b/logout-menu-widget/icons/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logout-menu-widget/icons/power.svg b/logout-menu-widget/icons/power.svg new file mode 100644 index 0000000..68b1be8 --- /dev/null +++ b/logout-menu-widget/icons/power.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logout-widget/power.svg b/logout-menu-widget/icons/power_w.svg similarity index 100% rename from logout-widget/power.svg rename to logout-menu-widget/icons/power_w.svg diff --git a/logout-menu-widget/icons/refresh-cw.svg b/logout-menu-widget/icons/refresh-cw.svg new file mode 100644 index 0000000..39f52a5 --- /dev/null +++ b/logout-menu-widget/icons/refresh-cw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logout-menu-widget/logout-menu.gif b/logout-menu-widget/logout-menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f17b5133b9318ed6fe25a765cb584de1d5fe045 GIT binary patch literal 47220 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 s(E=rGZ8F{Ik(sRk|HknLQvFq)7)`NG#F z-(7LFfB|w@=aDCipZr_yD?>iM$}!|JVXPjO6f@HAlg|ejM9lldgjQ|0bl)gT?*JS7fD8=oC1N zOOD&32vqKQsu(R9PgOzm!N>QqPVCGfF|*g$YSY6;&3Y}$ z)>b86rik9#D%M}~j~1k6wn=(bPdzJTYmWT;Xf{@zcnDTxvFr4x&cBO=lmRu=xN$JhnJL6MO)K(=_C=Jb* zFzQ-i5kJc|gFur8T-u_JN-bXEzvrq`4R48nmC6!FjYy1HuUIggsu3CJwvMg2q#5qR z-zhG!`npQmtA4@Q{7jF*fwjd{qu$>EC0z4@P$U0~h%*Lh-%eoqM+fY`T_{gj*qwGi zGM+Wr3G!%u`A7`WVookO=j1ciyb^ZDsyGR!(#Gw)rx_S<=n~XU-D=i{USxVRa}w{d z_;O+USE6M^feA^ebLVo$@J$}GAJgSsTD^oZ`w@w=f@S+JM{Zxg8nC%_)_*qIZUUNP zbpFdJFtf&OxP`Znr3X*F&@X#S5k%0P_|Pg~Qq9f-u5SKLsvCcDju?!QLXZaMiJa+D zByyZ94<-spio6BEb+ zIgG*)eqB9YN=Z_76swE-tpGCS3so0L^di(K5niI^r(6C9@8?7x$|_q~tznl$3hhvc z=)?+L2dqv&Q@`}(e-VHA>!#ntzwig~_Z#gJKlcfRzlpzYNSh_KZkPD)3;rhl;HApC zU)pat8Wr*`o&4{_Z+!R3=8^wS{3!ELdZ*Bt<+Uz+g2Lx+yc&_X_eT+Uqgsxy2IwJl zDXjOYsS${}>$BjEYMm}M`ZM+28`WaJ*pZM=uc$4GW0l@)@K}AdRmbZ0g&<;^o^~mRvpN9(D$@#ose)os zDA-eT>5xoftBMMo#>&pXA&`7({PUi|+qq8>6R5|sctc?u3edHo5}WEC&246Z>WZ$7 zpM6F4deIQg)i>09)+EEX7;lE$amN9Nay?k6fVoU`XH2+4bnGhEJA8)+hr_263uZexINMl0(O!&U2ow)(!5nJ7V)7}ar3AQ%pC8s}Y;{me&U3+NMS zdo#X!3uPAZnX7~d)iKcQOuaV5G|3p(9ha%+c?^pYxkE%e#!zsx_TH+Au`Ege{FGC* zpocHO3njz}vqGSP^Je^6b17_nWD(m8`i>F_B3pz%>#gpEcsUh|j1>j4xev*9PDQ7e z144H*_?e=I(tsjyE;;XL?R%n^PTCk=_(nm=I+djxR>DMHpP(>jd2l>GR-1WD!WfpZ zn(E)+DcHmM8d+d(!>(pR_QGI{wM&MmPg+Mp_KXl^pak|~m_ngXu5o+VtjuDgZ4l=G zg!GS^XuA(9G|&{ZFt-}cy1r2)v%lQRrFZ!1u2gt&_@C*25)cSd*FQV}%SI!Rx>y

H(qt!C~Id{x##KGGCs>Z86RMIpap} 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 literal 0 HcmV?d00001 diff --git a/logout-menu-widget/logout-menu.lua b/logout-menu-widget/logout-menu.lua new file mode 100644 index 0000000..5dc2a8e --- /dev/null +++ b/logout-menu-widget/logout-menu.lua @@ -0,0 +1,129 @@ +------------------------------------------------- +-- Logout Menu Widget for Awesome Window Manager +-- More details could be found here: +-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/logout-menu-widget + +-- @author Pavel Makhov +-- @copyright 2020 Pavel Makhov +------------------------------------------------- + +local awful = require("awful") +local wibox = require("wibox") +local spawn = require("awful.spawn") +local gears = require("gears") +local beautiful = require("beautiful") + +local HOME = os.getenv('HOME') +local ICON_DIR = HOME .. '/.config/awesome/awesome-wm-widgets/logout-menu-widget/icons/' + +local logout_menu_widget = wibox.widget { + { + image = ICON_DIR .. 'power_w.svg', + resize = true, + widget = wibox.widget.imagebox, + }, + margins = 4, + layout = wibox.container.margin +} + +local popup = awful.popup { + ontop = true, + visible = false, + shape = function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, 4) + end, + border_width = 1, + border_color = beautiful.bg_focus, + maximum_width = 400, + offset = { y = 5 }, + widget = {} +} +local rows = { layout = wibox.layout.fixed.vertical } + +local function worker(user_args) + + local args = user_args or {} + + local font = args.font or beautiful.font + + local onlogout = args.onlogout or function () awesome.quit() end + local onlock = args.onlock or function() awful.spawn.with_shell("i3lock") end + local onreboot = args.onreboot or function() awful.spawn.with_shell("reboot") end + local onsuspend = args.onsuspend or function() awful.spawn.with_shell("systemctl suspend") end + local onpoweroff = args.onpoweroff or function() awful.spawn.with_shell("shutdown now") end + + local menu_items = { + { name = 'Log out', icon_name = 'log-out.svg', command = onlogout }, + { name = 'Lock', icon_name = 'lock.svg', command = onlock }, + { name = 'Reboot', icon_name = 'refresh-cw.svg', command = onreboot }, + { name = 'Suspend', icon_name = 'moon.svg', command = onsuspend }, + { name = 'Power off', icon_name = 'power.svg', command = onpoweroff }, + } + + for _, item in ipairs(menu_items) do + + local row = wibox.widget { + { + { + { + image = ICON_DIR .. item.icon_name, + resize = false, + widget = wibox.widget.imagebox + }, + { + text = item.name, + font = font, + widget = wibox.widget.textbox + }, + spacing = 12, + layout = wibox.layout.fixed.horizontal + }, + margins = 8, + layout = wibox.container.margin + }, + bg = beautiful.bg_normal, + widget = wibox.container.background + } + + row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end) + row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end) + + local old_cursor, old_wibox + row:connect_signal("mouse::enter", function() + local wb = mouse.current_wibox + old_cursor, old_wibox = wb.cursor, wb + wb.cursor = "hand1" + end) + row:connect_signal("mouse::leave", function() + if old_wibox then + old_wibox.cursor = old_cursor + old_wibox = nil + end + end) + + row:buttons(awful.util.table.join(awful.button({}, 1, function() + popup.visible = not popup.visible + item.command() + end))) + + table.insert(rows, row) + end + popup:setup(rows) + + logout_menu_widget:buttons( + awful.util.table.join( + awful.button({}, 1, function() + if popup.visible then + popup.visible = not popup.visible + else + popup:move_next_to(mouse.current_widget_geometry) + end + end) + ) + ) + + return logout_menu_widget + +end + +return setmetatable(logout_menu_widget, { __call = function(_, ...) return worker(...) end })