master hovercats/bin / sh / workspace
  1#!/bin/sh
  2
  3set -e
  4
  5# Original, unmodified script can be found at https://github.com/wmutils/contrib
  6
  7# Constructs and groups windows into workspaces to switch between using your favorite keybinder.
  8
  9NUM_WS=9
 10
 11help() {
 12	cat << EOF
 13usage: $(basename "$0") [-hinp] [-g ws_num] [-m ws_num]
 14	-h: Displays this message
 15	-i: Initialize workspaces. Should be called once in a startup script.
 16	-n: Move up one workspace
 17	-p: Move down one workspace
 18	-g, <ws_num>: go to the workspace specified by <ws_num>
 19	-m, <ws_num>: move the currently focused window to the worskpace specified by <ws_num>
 20EOF
 21	exit 1
 22}
 23# Initializes us in workspace 0.
 24ws_init() {
 25	mkdir -p /tmp/workspaces/
 26	i=0
 27	while [ "$i" -le "${NUM_WS}" ]; do
 28		:> /tmp/workspaces/ws"$i"
 29		i="$(echo "$i" + 1 | bc)"
 30	done
 31	echo 0 > /tmp/workspaces/curr
 32}
 33# Saves all mapped windows to the current workspace.
 34save_ws() {
 35	curr=$(cat /tmp/workspaces/curr)
 36	lsw > "/tmp/workspaces/ws${curr}"
 37}
 38move_to_ws() {
 39	ws_num="$1"
 40	if [ "${ws_num}" -gt "${NUM_WS}" ] || [ "${ws_num}" -lt 0 ]; then
 41		echo "Workspace not found"
 42		return
 43	fi
 44	curr_ws="$(cat /tmp/workspaces/curr)";
 45	if [ "${ws_num}" = "${curr_ws}" ]; then
 46		# same workspace. ignore flicker
 47		return
 48	fi
 49	save_ws
 50	curr_windows="$(lsw)"
 51	if [ "${curr_windows}" ]; then
 52		mapw -u "$(lsw)"
 53	fi
 54	new_windows="$(cat /tmp/workspaces/ws"${ws_num}")"
 55	if [ "${new_windows}" ]; then
 56		mapw -m "${new_windows}"
 57	fi
 58	echo "${ws_num}" > /tmp/workspaces/curr
 59}
 60next_ws() {
 61	# Get what ws we're currently in.
 62	curr="$(cat /tmp/workspaces/curr)"
 63	curr="$(echo "${curr}" + 1 | bc)"
 64
 65	# Take care of loopback.
 66	if [ "${curr}" -gt "${NUM_WS}" ]; then
 67		curr=0
 68	fi
 69
 70	move_to_ws "${curr}"
 71}
 72prev_ws() {
 73	# Get what ws we're currently in.
 74	curr="$(cat /tmp/workspaces/curr)"
 75	curr="$(echo "${curr}" - 1 | bc)"
 76
 77	# Take care of loopback.
 78	if [ "${curr}" -lt 0 ]; then
 79		curr="${NUM_WS}"
 80	fi
 81
 82	move_to_ws "${curr}"
 83}
 84move_focused_window() {
 85	ws_num="$1"
 86	if [ "${ws_num}" -gt "${NUM_WS}" ] || [ "${ws_num}" -lt 0 ]; then
 87		echo "Workspace not found"
 88		return
 89	fi
 90	wid="$(pfw)"
 91	curr_ws="$(cat /tmp/workspaces/curr)";
 92	if [ "${ws_num}" != "${curr_ws}" ]; then
 93		pfw >> "/tmp/workspaces/ws$1"
 94		mapw -u "${wid}"
 95	fi
 96}
 97while getopts ":m:g:npi" opt; do
 98	case "${opt}" in
 99		n)
100			next_ws;;
101		p)
102			prev_ws;;
103		g)
104			move_to_ws "${OPTARG}";;
105		m)
106			move_focused_window "${OPTARG}";;
107		i)
108			ws_init;;
109		\?)
110			help;;
111	esac
112done