summary refs log tree commit diff
path: root/bin/rcmenu
diff options
context:
space:
mode:
Diffstat (limited to 'bin/rcmenu')
-rwxr-xr-xbin/rcmenu60
1 files changed, 41 insertions, 19 deletions
diff --git a/bin/rcmenu b/bin/rcmenu
index 223d597..c2a359d 100755
--- a/bin/rcmenu
+++ b/bin/rcmenu
@@ -28,28 +28,42 @@ __list() {
 	) | column -t
 }
 
+__start() {
+	local sv=$1
+	export msg=$(doas -n s6-rc -v2 -u change "$sv")
+	export action=start
+}
+__stop() {
+	local sv=$1
+	export msg=$(doas -n s6-rc -v2 -d change "$sv")
+	export action=stopp
+}
+__restart() {
+	local sv="$1"
+	local msg
+	local action
+
+	# bemenu-ism
+	# if [ $menu_exitcode -eq 18 ]; then
+	if jq -ncr '{p:"rcmenu",o:[{l:"restart",x:"false"},{l:"stop",x:"true"}]}' | mkmenu; then
+		__stop "$sv"
+	else
+		__stop "$sv" && sleep 0.5 && __start "$sv"
+		action=restart
+	fi
+
+	export msg
+	export action
+}
+
 __handle() {
 	while read -r line; do
 		sv=$(printf "%s" "${line}" | awk '{print $1}')
 		state=$(printf "%s" "${line}" | awk '{print $2}')
 
 		case "$state" in
-		up | \[bundle\])
-			msg=$(doas -n s6-rc -v2 -d change "$sv")
-			if [ $menu_exitcode -eq 18 ]; then
-				action=stopp
-			else
-				action=restart
-				sleep 0.5
-				msg=$(doas -n s6-rc -v2 -u change "$sv")
-			fi
-			;;
-
-		down)
-			action=start
-			msg=$(doas -n s6-rc -v2 -u change "$sv")
-			;;
-
+		up | \[bundle\]) __restart "$sv" ;;
+		down) __start "$sv" ;;
 		*)
 			action=noop
 			msg=$(printf "unknown service state: %s\n" "$state")
@@ -66,6 +80,14 @@ __handle() {
 	done
 }
 
-svs=$(__list | menu --list=10)
-menu_exitcode=$?
-__handle <<<"$svs"
+case "${1:-}" in
+-h | --help | help) printf "usage: %s [start|stop|restart] SERVICE\n" "$(basename "$0")" ;;
+start) __start "$2" ;;
+stop) __stop "$2" ;;
+restart) __restart "$2" ;;
+*)
+	svs=$(__list | menu -l10)
+	menu_exitcode=$?
+	__handle <<<"$svs"
+	;;
+esac