# ==== 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 # 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 # ==== 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) =begin run "bash @src@/startup.sh" bind_key 23, true, "firefox" bind_key 24, true, :kill_window bind_key 25, true, "kitty" bind_key 26, true, "bash @src@/power.sh" bind_key 123, false, %q( pactl set-sink-volume @DEFAULT_SINK@ +5%; vol=$(pactl get-sink-volume @DEFAULT_SINK@ | grep -o '[0-9]\+%' | head -n1); dunstify "Volume Adjusted" "" -h int:value:$vol -r 997 ) bind_key 122, false, %q( pactl set-sink-volume @DEFAULT_SINK@ -5%; vol=$(pactl get-sink-volume @DEFAULT_SINK@ | grep -o '[0-9]\+%' | head -n1); dunstify "Volume Adjusted" "" -h int:value:$vol -r 997 ) bind_key 121, false, %q( pactl set-sink-mute @DEFAULT_SINK@ toggle; vol=$(pactl get-sink-volume @DEFAULT_SINK@ | grep -o '[0-9]\+%' | head -n1); dunstify "Volume Adjusted" "" -h int:value:$vol -r 997 ) bind_key 38, true, %Q( maim -c 0.3,0.5,1.0,0.8 -s | tee /tmp/screenshot_temp.png | xclip -selection clipboard -t image/png; if [ -s '/tmp/screenshot_temp.png' ]; then mv /tmp/screenshot_temp.png ~/screenshots/$(date +%Y-%m-%d_%H:%M:%S).png; fi ) bind_key 232, false, %q( brightnessctl set 5%-; pct=$(brightnessctl -m | cut -d, -f4 | tr -d ' %'); dunstify "Brightness" "" -h int:value:$pct -r 998 ) bind_key 233, false, %q( brightnessctl set 5%+; pct=$(brightnessctl -m | cut -d, -f4 | tr -d ' %'); dunstify "Brightness" "" -h int:value:$pct -r 998 ) bind_key 54, true, 'kitty -e fish -c "y"' bind_key 53, true, 'kitty -e fish -c "editor"' bind_key 41, true, 'kitty -e fish -c "btop"' bind_key 40, true, "bash @src@/run.sh" bind_key 56, true, :add_workspace bind_key 57, true, :delete_workspace bind_key 110, false, %q( dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify \ /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause; dbus-send --print-reply --dest=$(busctl --user list | grep -oP 'org.mpris.MediaPlayer2.firefox.instance_1_\d+') \ /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause ) bind_key 173, true, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous" bind_key 171, true, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next" bind_key 89, true, :toggle_scratchpad bind_key 81, true, :toggle_move_scratchpad bind_key 118, false, "dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause" bind_key 86, false, :workspace_next bind_key 86, true, :move_window_next_workspace bind_key 82, false, :workspace_previous bind_key 82, true, :move_window_previous_workspace bind_key 10, true, "setxkbmap us" bind_key 11, true, "setxkbmap ara" bind_key 55, true, "CM_LAUNCHER=rofi clipmenu" bind_key 39, true, :toggle_floating bind_mouse 8, false, :workspace_next bind_mouse 8, true, :move_window_next_workspace bind_mouse 9, false, :workspace_previous bind_mouse 9, true, :move_window_previous_workspace =end