#!/usr/bin/env perl use strict; use warnings; use constant { SLOCK_PATH => '/usr/local/bin/slock', ACPI_PATH => '/usr/sbin/acpiconf', KILL_PATH => '/usr/bin/killall', SHUTDOWN_PATH => '/sbin/shutdown', NOTIF_PATH => '/usr/local/bin/notify-send', EMACS_PATH => '/usr/local/bin/emacsclient' }; use constant LIST => [ 'Lock screen', 'Sleep', 'Logout', 'Reboot', 'Shutdown' ]; use constant CONFIRM => [ "No", "Yes" ]; sub confirm { my ($var) = @_; my $list; my $choice; for (@{+CONFIRM}) { $list .= $_ . "\n"; } $choice = `printf "%s" "$list" | dmenu -i -p "$var?" -l 2 -m 0`; chomp $choice; if ($choice eq ${+CONFIRM}[1]) { return (1); } return (0); } sub action { my ($var) = @_; my $pid; chomp $var; if ($var eq ${+LIST}[0]) { exec(SLOCK_PATH); } elsif ($var eq ${+LIST}[1]) { $pid = fork(); if (not $pid) { exec(SLOCK_PATH); } else { system( NOTIF_PATH, '-u', 'normal', 'shutdown', ' G\'night, partner!' ); exec(ACPI_PATH, '-s', '3'); } } elsif ($var eq ${+LIST}[2]) { if (confirm($var) == 1) { system(EMACS_PATH, '-e', '(save-buffers-kill-terminal)'); exec(KILL_PATH, 'dwm'); } } elsif ($var eq ${+LIST}[3]) { if (confirm($var) == 1) { system(EMACS_PATH, '-e', '(save-buffers-kill-terminal)'); exec(SHUTDOWN_PATH, '-r', 'now'); } } elsif ($var eq ${+LIST}[4]) { if (confirm($var) == 1) { system(EMACS_PATH, '-e', '(save-buffers-kill-terminal)'); system( NOTIF_PATH, '-u', 'normal', 'shutdown', ' Farewell, partner!' ); sleep 2; exec(SHUTDOWN_PATH, '-p', 'now'); } } return; } sub main { my $list; my $choice; for (@{+LIST}) { $list .= $_ . "\n"; } $choice = `printf "%s" "$list" | dmenu -i -l 5 -m 0`; action($choice); return (0); } main(); __END__