225 lines
5.4 KiB
Ruby
225 lines
5.4 KiB
Ruby
# ==== 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
|