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