#!/usr/bin/env perl use strict; use warnings; use Sys::Hostname; use constant OS => `uname | tr -d '\n'`; use constant { SLOCK_PATH => 'slock', XSCREENSAVER_PATH => 'xscreensaver-command', ACPI_PATH => '/usr/sbin/acpiconf', KILL_PATH => '/usr/bin/killall', SHUTDOWN_PATH => '/sbin/shutdown', LOGINCTL_PATH => '/usr/bin/loginctl', NOTIF_PATH => 'notify-send', HOSTNAME => (split /\./, hostname())[0] }; use constant LIST => [ 'lock screen', 'sleep', 'logout', 'reboot', 'shutdown' ]; use constant CONFIRM => [ "no", "yes" ]; sub confirm { my ($var, $color) = @_; my $list; my $choice; for (@{+CONFIRM}) { $list .= $_ . "\n"; } my $menu = "dmenu -sb '$color' -shb '$color'"; if (defined $ENV{WAYLAND_DISPLAY}) { $menu = "wmenu -S '$color'"; } $choice = `printf "%s" "$list" | \ $menu -i -p "$var?"`; chomp $choice; if ($choice eq ${+CONFIRM}[1]) { return (1); } return (0); } sub action { my ($var, $color) = @_; my $pid; chomp $var; if ($var eq ${+LIST}[0]) { if (defined $ENV{WAYLAND_DISPLAY}) { exec("waylock", "-init-color", "0x1d2021", "-input-color", "0xd79921", "-fail-color", "0xcc241d"); } else { exec(XSCREENSAVER_PATH, '-lock'); } } elsif ($var eq ${+LIST}[1]) { $pid = fork(); if (not $pid) { if (defined $ENV{WAYLAND_DISPLAY}) { exec("waylock", "-init-color", "0x1d2021", "-input-color", "0xd79921", "-fail-color", "0xcc241d"); } else { exec(XSCREENSAVER_PATH, '-lock'); } } else { system( NOTIF_PATH, '-u', 'normal', 'shutdown', ' g\'night, partner!' ); sleep 2; if (HOSTNAME eq 'mother') { exec(LOGINCTL_PATH, 'suspend'); } elsif (HOSTNAME eq 'po-rbo') { exec('systemctl', 'suspend'); } exec(ACPI_PATH, '-s', '3'); } } elsif ($var eq ${+LIST}[2]) { if (confirm($var, $color) == 1) { if (HOSTNAME eq 'mother') { exec(LOGINCTL_PATH, 'terminate-session', 'self'); } exec(KILL_PATH, 'dwm'); } } elsif ($var eq ${+LIST}[3]) { if (confirm($var, $color) == 1) { if (HOSTNAME eq 'mother') { exec(LOGINCTL_PATH, 'reboot'); } elsif (HOSTNAME eq 'po-rbo') { exec('systemctl', 'reboot'); } system( NOTIF_PATH, '-u', 'normal', 'shutdown', ' rebootin\', partner!' ); exec(SHUTDOWN_PATH, '-r', 'now'); } } elsif ($var eq ${+LIST}[4]) { if (confirm($var, $color) == 1) { system( NOTIF_PATH, '-u', 'normal', 'shutdown', ' farewell, partner!' ); sleep 2; if (HOSTNAME eq 'mother') { exec(LOGINCTL_PATH, 'poweroff'); } elsif (HOSTNAME eq 'po-rbo') { exec('systemctl', 'poweroff'); } exec(SHUTDOWN_PATH, '-p', 'now'); } } return; } sub main { my $list; my $choice; my $color; $color = '#cc241d'; if (@ARGV == 1) { $color = $ARGV[0]; } for (@{+LIST}) { $list .= $_ . "\n"; } my $menu = "dmenu -sb '$color' -shb '$color'"; if (defined $ENV{WAYLAND_DISPLAY}) { $menu = "wmenu -S '$color'"; } $choice = `printf "%s" "$list" | $menu -i`; action($choice, $color); return (0); } main(); __END__