diff --git a/awesome/components/exit-screen.lua b/awesome/components/exit-screen.lua deleted file mode 100644 index 3178369..0000000 --- a/awesome/components/exit-screen.lua +++ /dev/null @@ -1,225 +0,0 @@ --- ███████╗██╗ ██╗██╗████████╗ ███████╗ ██████╗██████╗ ███████╗███████╗███╗ ██╗ --- ██╔════╝╚██╗██╔╝██║╚══██╔══╝ ██╔════╝██╔════╝██╔══██╗██╔════╝██╔════╝████╗ ██║ --- █████╗ ╚███╔╝ ██║ ██║ ███████╗██║ ██████╔╝█████╗ █████╗ ██╔██╗ ██║ --- ██╔══╝ ██╔██╗ ██║ ██║ ╚════██║██║ ██╔══██╗██╔══╝ ██╔══╝ ██║╚██╗██║ --- ███████╗██╔╝ ██╗██║ ██║ ███████║╚██████╗██║ ██║███████╗███████╗██║ ╚████║ --- ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═══╝ - --- =================================================================== --- Initialization --- =================================================================== - - -local awful = require("awful") -local gears = require("gears") -local wibox = require("wibox") -local beautiful = require("beautiful") -local clickable_container = require("widgets.clickable-container") - -local dpi = beautiful.xresources.apply_dpi -local ICON_DIR = gears.filesystem.get_configuration_dir() .. "/icons/exit-screen/" .. beautiful.name .. "/" - --- define module table -local exit_screen = {} - - --- =================================================================== --- Appearance --- =================================================================== - - -local icon_size = dpi(90) - -local build_button = function(icon) - local button = wibox.widget { - wibox.widget { - wibox.widget { - wibox.widget { - image = icon, - widget = wibox.widget.imagebox - }, - top = dpi(16), - bottom = dpi(16), - left = dpi(16), - right = dpi(16), - widget = wibox.container.margin - }, - shape = gears.shape.circle, - forced_width = icon_size, - forced_height = icon_size, - widget = clickable_container - }, - left = dpi(24), - right = dpi(24), - widget = wibox.container.margin - } - - return button -end - - --- =================================================================== --- Functionality --- =================================================================== - - -local exit_screen_grabber - -local function suspend_command() - exit_screen.hide() - awful.spawn.with_shell(apps.lock .. " & systemctl suspend") -end - -local function exit_command() - awesome.quit() -end - -local function lock_command() - exit_screen.hide() - awful.spawn.with_shell("sleep 1 && " .. apps.lock) -end - -local function poweroff_command() - awful.spawn.with_shell("poweroff") - awful.keygrabber.stop(exit_screen_grabber) -end - -local function reboot_command() - awful.spawn.with_shell("reboot") - awful.keygrabber.stop(exit_screen_grabber) -end - -local poweroff = build_button(ICON_DIR .. "power.png", "Shutdown") -poweroff:connect_signal( - "button::release", - function() - poweroff_command() - end -) - -local reboot = build_button(ICON_DIR .. "restart.png", "Restart") -reboot:connect_signal( - "button::release", - function() - reboot_command() - end -) - -local suspend = build_button(ICON_DIR .. "sleep.png", "Sleep") -suspend:connect_signal( - "button::release", - function() - suspend_command() - end -) - -local exit = build_button(ICON_DIR .. "logout.png", "Logout") -exit:connect_signal( - "button::release", - function() - exit_command() - end -) - -local lock = build_button(ICON_DIR .. "lock.png", "Lock") -lock:connect_signal( - "button::release", - function() - lock_command() - end -) - --- subscribe to the show_exit_screen signal --- show the exit screen when signal is broadcasted -awesome.connect_signal("show_exit_screen", - function() - exit_screen_grabber = awful.keygrabber.run( - function(_, key, event) - if event == "release" then - return - end - - 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 - exit_screen.hide() - end - end - ) - exit_screen.widget.visible = true - end -) - --- hide exit screen -function exit_screen.hide() - awful.keygrabber.stop(exit_screen_grabber) - exit_screen.widget.visible = false -end - - --- =================================================================== --- Create Widget --- =================================================================== - - -local screen_geometry = awful.screen.focused().geometry - --- Create the widget -exit_screen.widget = wibox({ - x = screen_geometry.x, - y = screen_geometry.y, - visible = false, - ontop = true, - type = "splash", - height = screen_geometry.height, - width = screen_geometry.width -}) - -exit_screen.widget:buttons( - gears.table.join( - -- Middle click - Hide exit_screen - awful.button({}, 2, - function() - exit_screen.hide() - end - ), - -- Right click - Hide exit_screen - awful.button({}, 3, - function() - exit_screen.hide() - end - ) - ) -) - --- Item placement -exit_screen.widget:setup { - nil, - { - nil, - { - poweroff, - reboot, - suspend, - exit, - lock, - layout = wibox.layout.fixed.horizontal - }, - nil, - expand = "none", - layout = wibox.layout.align.horizontal - }, - nil, - expand = "none", - layout = wibox.layout.align.vertical -} - -return exit_screen diff --git a/awesome/components/pastel/top-panel.lua b/awesome/components/pastel/top-panel.lua index 2e4b947..45ae36a 100644 --- a/awesome/components/pastel/top-panel.lua +++ b/awesome/components/pastel/top-panel.lua @@ -130,7 +130,7 @@ top_panel.create = function(s) client.connect_signal("focus", change_panel_visibility) updates_indicator:connect_signal("button::press", function(c, _, _, button) - awful.spawn('bash -c "WINIT_X11_SCALE_FACTOR=1 alacritty -e bash -c \"yay ; echo \'\\nDone, press any key to exit...\' ; read\""') + awful.spawn('alacritty -e bash -c "yay ; echo \'\nDone, press any key to exit...\' ; read"') end) end diff --git a/awesome/keys.lua b/awesome/keys.lua index 0474d35..11d6087 100644 --- a/awesome/keys.lua +++ b/awesome/keys.lua @@ -162,7 +162,14 @@ keys.globalkeys = gears.table.join( {description = "Open Nautilus", group = "launcher"} ), -- launch rofi - awful.key({modkey, altkey}, "F9", + awful.key({modkey}, "XF86Launch5", + function() + awful.spawn("/home/user/.config/awesome/scripts/toggle_rofi.sh") + end, + {description = "application launcher", group = "launcher"} + ), + -- launch rofi + awful.key({modkey}, "d", function() awful.spawn("/home/user/.config/awesome/scripts/toggle_rofi.sh") end, @@ -256,7 +263,7 @@ keys.globalkeys = gears.table.join( awful.key({modkey}, "Escape", function() -- emit signal to show the exit screen - awesome.emit_signal("show_exit_screen") + awful.util.spawn("rofi -show power-menu -modi power-menu:~/.config/awesome/scripts/rofi-power-menu") end, {description = "toggle exit screen", group = "hotkeys"} ), diff --git a/awesome/pastel.lua b/awesome/pastel.lua index b969184..d2ff0a4 100644 --- a/awesome/pastel.lua +++ b/awesome/pastel.lua @@ -25,7 +25,6 @@ local pastel = {} pastel.initialize = function() -- Import components require("components.pastel.wallpaper") - require("components.exit-screen") -- Import panels local top_panel = require("components.pastel.top-panel") diff --git a/awesome/rc.lua b/awesome/rc.lua index a86fe42..f1d1ee3 100644 --- a/awesome/rc.lua +++ b/awesome/rc.lua @@ -31,7 +31,7 @@ apps = { local run_on_start_up = { "numlockx on", "nm-applet", - "xcape -e \"Super_L=Super_L|Shift_L|F9\"" + "xcape -e \"Super_L=Super_L|XF86Launch5\" -t 5000" } -- =================================================================== diff --git a/awesome/scripts/rofi-power-menu b/awesome/scripts/rofi-power-menu new file mode 100755 index 0000000..75959c5 --- /dev/null +++ b/awesome/scripts/rofi-power-menu @@ -0,0 +1,240 @@ +#!/usr/bin/env bash + +# This script defines just a mode for rofi instead of being a self-contained +# executable that launches rofi by itself. This makes it more flexible than +# running rofi inside this script as now the user can call rofi as one pleases. +# For instance: +# +# rofi -show powermenu -modi powermenu:./rofi-power-menu +# +# See README.md for more information. + +set -e +set -u + +# All supported choices +all=(shutdown reboot suspend hibernate logout lockscreen) + +# By default, show all (i.e., just copy the array) +show=("${all[@]}") + +declare -A texts +texts[lockscreen]="lock screen" +texts[switchuser]="switch user" +texts[logout]="log out" +texts[suspend]="suspend" +texts[hibernate]="hibernate" +texts[reboot]="reboot" +texts[shutdown]="shut down" + +declare -A icons +icons[lockscreen]="system-lock-screen" +icons[switchuser]="\uf518" +icons[logout]="gnome-logout" +icons[suspend]="system-suspend" +icons[hibernate]="system-hibernate" +icons[reboot]="system-reboot" +icons[shutdown]="system-shutdown" +icons[cancel]="advert-block" + +declare -A actions +actions[lockscreen]="loginctl lock-session ${XDG_SESSION_ID-}" +#actions[switchuser]="???" +actions[logout]="loginctl terminate-session ${XDG_SESSION_ID-}" +actions[suspend]="systemctl suspend" +actions[hibernate]="systemctl hibernate" +actions[reboot]="systemctl reboot" +actions[shutdown]="systemctl poweroff" + +# By default, ask for confirmation for actions that are irreversible +confirmations=(reboot shutdown logout) + +# By default, no dry run +dryrun=false +showsymbols=true + +function check_valid { + option="$1" + shift 1 + for entry in "${@}" + do + if [ -z "${actions[$entry]+x}" ] + then + echo "Invalid choice in $1: $entry" >&2 + exit 1 + fi + done +} + +# Parse command-line options +parsed=$(getopt --options=h --longoptions=help,dry-run,confirm:,choices:,choose:,symbols,no-symbols --name "$0" -- "$@") +if [ $? -ne 0 ]; then + echo 'Terminating...' >&2 + exit 1 +fi +eval set -- "$parsed" +unset parsed +while true; do + case "$1" in + "-h"|"--help") + echo "rofi-power-menu - a power menu mode for Rofi" + echo + echo "Usage: rofi-power-menu [--choices CHOICES] [--confirm CHOICES]" + echo " [--choose CHOICE] [--dry-run] [--symbols|--no-symbols]" + echo + echo "Use with Rofi in script mode. For instance, to ask for shutdown or reboot:" + echo + echo " rofi -show menu -modi \"menu:rofi-power-menu --choices=shutdown/reboot\"" + echo + echo "Available options:" + echo " --dry-run Don't perform the selected action but print it to stderr." + echo " --choices CHOICES Show only the selected choices in the given order. Use / " + echo " as the separator. Available choices are lockscreen, logout," + echo " suspend, hibernate, reboot and shutdown. By default, all" + echo " available choices are shown." + echo " --confirm CHOICES Require confirmation for the gives choices only. Use / as" + echo " the separator. Available choices are lockscreen, logout," + echo " suspend, hibernate, reboot and shutdown. By default, only" + echo " irreversible actions logout, reboot and shutdown require" + echo " confirmation." + echo " --choose CHOICE Preselect the given choice and only ask for a confirmation" + echo " (if confirmation is set to be requested). It is strongly" + echo " recommended to combine this option with --confirm=CHOICE" + echo " if the choice wouldn't require confirmation by default." + echo " Available choices are lockscreen, logout, suspend," + echo " hibernate, reboot and shutdown." + echo " --[no-]symbols Show Unicode symbols or not. Requires a font with support" + echo " for the symbols. Use, for instance, fonts from the" + echo " Nerdfonts collection. By default, they are shown" + echo " -h,--help Show this help text." + exit 0 + ;; + "--dry-run") + dryrun=true + shift 1 + ;; + "--confirm") + IFS='/' read -ra confirmations <<< "$2" + check_valid "$1" "${confirmations[@]}" + shift 2 + ;; + "--choices") + IFS='/' read -ra show <<< "$2" + check_valid "$1" "${show[@]}" + shift 2 + ;; + "--choose") + # Check that the choice is valid + check_valid "$1" "$2" + selectionID="$2" + shift 2 + ;; + "--symbols") + showsymbols=true + shift 1 + ;; + "--no-symbols") + showsymbols=false + shift 1 + ;; + "--") + shift + break + ;; + *) + echo "Internal error" >&2 + exit 1 + ;; + esac +done + +# Define the messages after parsing the CLI options so that it is possible to +# configure them in the future. + +function write_message { + text="$1" + echo -n "$text" +} + +function print_selection { + echo -e "$1" | $(read -r -d '' entry; echo "echo $entry") +} + +declare -A messages +declare -A confirmationMessages +for entry in "${all[@]}" +do + messages[$entry]=$(write_message "${texts[$entry]^}") +done +for entry in "${all[@]}" +do + confirmationMessages[$entry]=$(write_message "Yes, ${texts[$entry]}") +done +confirmationMessages[cancel]=$(write_message "No, cancel") + +if [ $# -gt 0 ] +then + # If arguments given, use those as the selection + selection="${@}" +else + # Otherwise, use the CLI passed choice if given + if [ -n "${selectionID+x}" ] + then + selection="${messages[$selectionID]}" + fi +fi + +# Don't allow custom entries +echo -e "\0no-custom\x1ftrue" +# Use markup +echo -e "\0markup-rows\x1ftrue" + +if [ -z "${selection+x}" ] +then + echo -e "\0prompt\x1fPower menu" + for entry in "${show[@]}" + do + echo -e "${messages[$entry]}\0icon\x1f${icons[$entry]}" + done +else + for entry in "${show[@]}" + do + if [ "$selection" = "$(print_selection "${messages[$entry]}")" ] + then + # Check if the selected entry is listed in confirmation requirements + for confirmation in "${confirmations[@]}" + do + if [ "$entry" = "$confirmation" ] + then + # Ask for confirmation + echo -e "\0prompt\x1fAre you sure" + echo -e "${confirmationMessages[$entry]}\0icon\x1f${icons[$entry]}" + echo -e "${confirmationMessages[cancel]}\0icon\x1f${icons[cancel]}" + exit 0 + fi + done + # If not, then no confirmation is required, so mark confirmed + selection=$(print_selection "${confirmationMessages[$entry]}") + fi + if [ "$selection" = "$(print_selection "${confirmationMessages[$entry]}")" ] + then + if [ $dryrun = true ] + then + # Tell what would have been done + echo "Selected: $entry" >&2 + else + # Perform the action + ${actions[$entry]} + fi + exit 0 + fi + if [ "$selection" = "$(print_selection "${confirmationMessages[cancel]}")" ] + then + # Do nothing + exit 0 + fi + done + # The selection didn't match anything, so raise an error + echo "Invalid selection: $selection" >&2 + exit 1 +fi diff --git a/nvim/lua/mappings.lua b/nvim/lua/mappings.lua index 8f3a557..7795b5f 100644 --- a/nvim/lua/mappings.lua +++ b/nvim/lua/mappings.lua @@ -8,3 +8,7 @@ vim.api.nvim_set_keymap("n", "", ":noh", { noremap = true, si vim.api.nvim_set_keymap("n", "t", ":NvimTreeFindFileToggle", { noremap = true, silent = true }) vim.api.nvim_set_keymap("n", "a", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("n", "x", "", { noremap = true, silent = true }) +-- vim.api.nvim_set_keymap("n", "x", "", { noremap = true, silent = true }) +-- vim.api.nvim_set_keymap("n", "x", "", { noremap = true, silent = true }) +-- vim.api.nvim_set_keymap("n", "x", "", { noremap = true, silent = true }) +-- vim.api.nvim_set_keymap("n", "x", "", { noremap = true, silent = true }) diff --git a/rofi/config.rasi b/rofi/config.rasi index 2e67580..b710440 100644 --- a/rofi/config.rasi +++ b/rofi/config.rasi @@ -2,7 +2,7 @@ configuration { font: "SF Pro Rounded 13"; show-icons: true; icon-theme: "Papirus"; - kb-cancel: "Super_L+Shift_L+F9,Escape"; + kb-cancel: "Super_L+XF86Launch5,Escape"; combi-hide-mode-prefix: true; } @theme "~/.config/rofi/material-ocean.rasi"