# ==== State ==== MAX_PROJECTS = 9 SUBS = 2 # workspaces per project $current_project = 1 # 1..MAX_PROJECTS $current_sub = 0 # 0..SUBS-1 # For each special workspace, remembers which workspace you were on # before you jumped into it -- so hitting the mode key again toggles back. $special_origin = {} SPECIAL = { terminal: { cmd: "kitty" }, browser: { cmd: "firefox" }, music: { cmd: "spotify" }, misc: { cmd: nil }, # doesn't start anything todo: { cmd: nil }, # doesn't start anything } # ==== Helpers ==== def project_ws(n, sub) :"p#{n}_#{sub}" end def running?(process) system("pgrep #{process} > /dev/null 2>&1") end def go_project(n, sub) $current_project = n $current_sub = sub jump_ws project_ws(n, sub) end def in_project?(ws) !SPECIAL.key?(ws) end puts "hello1" # Toggle between a special-mode workspace (terminal/browser/music/misc/todo) # and whatever workspace you were last on. Starts the associated app if # it isn't already running. `ws` is the current workspace, passed in by # the bind block (bind gives us (window, current_ws)). def go_special(name, ws) cfg = SPECIAL.fetch(name) if ws == name target = $special_origin[name] || project_ws($current_project, $current_sub) jump_ws target else $special_origin[name] = ws jump_ws name system("#{cfg[:cmd]} >/dev/null 2>&1 &") if cfg[:cmd] && !running?(cfg[:cmd]) end end # ==== Untouched bindings ==== bind ?q do |x| kill x end bind ?w do system "kitty >/dev/null 2>&1 &" end bind ?e do exit end bind ?f do |x| toggle_float x end # ==== Mode switches ==== bind ?[ do |_, ws| go_special :terminal, ws end bind ?] do |_, ws| go_special :misc, ws end bind "tab" do |_, ws| go_special :browser, ws end bind 89 do |_, ws| go_special :music, ws end bind 81 do |_, ws| go_special :todo, ws end puts "hello2" # ==== Project navigation ==== (1..MAX_PROJECTS).each do |n| bind n.to_s do go_project(n, $current_sub) end end bind 86, :none do |_, ws| next unless in_project?(ws) n = (($current_project - 2) % MAX_PROJECTS) + 1 go_project(n, $current_sub) end bind 82, :none do |_, ws| next unless in_project?(ws) n = ($current_project % MAX_PROJECTS) + 1 go_project(n, $current_sub) end bind 79, :none do |_, ws| next unless in_project?(ws) go_project($current_project, ($current_sub + 1) % SUBS) end bind 80, :none do |_, ws| next unless in_project?(ws) go_project($current_project, ($current_sub - 1 + SUBS) % SUBS) end # ==== Startup ==== go_project(1, 0) puts "hello3"