diff --git a/.config/hypr/.stylua.toml b/.config/hypr/.stylua.toml new file mode 100644 index 0000000..ba0c6e6 --- /dev/null +++ b/.config/hypr/.stylua.toml @@ -0,0 +1,6 @@ +column_width = 160 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 4 +quote_style = "AutoPreferSingle" +call_parentheses = "None" diff --git a/.config/hypr/apps.lua b/.config/hypr/apps.lua index d0c2fd9..51b1ad7 100644 --- a/.config/hypr/apps.lua +++ b/.config/hypr/apps.lua @@ -1,387 +1,388 @@ -- Browser types -hl.window_rule({ - name = "chromium-browser-tags", - tag = "+chromium-based-browser", +hl.window_rule { + name = 'chromium-browser-tags', + tag = '+chromium-based-browser', match = { - class = "((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)", + class = '((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)', }, -}) -hl.window_rule({ - name = "firefox-tags", - tag = "+firefox-based-browser", +} +hl.window_rule { + name = 'firefox-tags', + tag = '+firefox-based-browser', match = { - class = "([fF]irefox|zen|librewolf)", + class = '([fF]irefox|zen|librewolf)', }, -}) +} -hl.window_rule({ - name = "chromium-browser-opacity-tags", - tag = "-default-opacity", +hl.window_rule { + name = 'chromium-browser-opacity-tags', + tag = '-default-opacity', match = { - tag = "chromium-based-browser", + tag = 'chromium-based-browser', }, -}) -hl.window_rule({ - name = "firefox-browser-opacity-tags", - tag = "-default-opacity", +} +hl.window_rule { + name = 'firefox-browser-opacity-tags', + tag = '-default-opacity', match = { - tag = "firefox-based-browser", + tag = 'firefox-based-browser', }, -}) +} -- Video apps: remove chromium browser tag so they don't get opacity applied -hl.window_rule({ - name = "video-apps-no-browser-tag", - tag = "-chromium-based-browser", +hl.window_rule { + name = 'video-apps-no-browser-tag', + tag = '-chromium-based-browser', match = { - class = "(chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)", + class = '(chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)', }, -}) -hl.window_rule({ - name = "video-apps-no-opacity-tag", - tag = "-default-opacity", +} +hl.window_rule { + name = 'video-apps-no-opacity-tag', + tag = '-default-opacity', match = { - class = "(chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)", + class = '(chrome-youtube.com__-Default|chrome-app.zoom.us__wc_home-Default)', }, -}) +} -- Force chromium-based browsers into a tile to deal with --app bug -hl.window_rule({ - name = "chromium-tile", +hl.window_rule { + name = 'chromium-tile', tile = true, match = { - tag = "chromium-based-browser", + tag = 'chromium-based-browser', }, -}) +} -- Only a subtle opacity change, but not for video sites -hl.window_rule({ - name = "chromium-browser-subtle-opacity", - opacity = "1.0 0.97", +hl.window_rule { + name = 'chromium-browser-subtle-opacity', + opacity = '1.0 0.97', match = { - tag = "chromium-based-browser", + tag = 'chromium-based-browser', }, -}) -hl.window_rule({ - name = "firefox-browser-subtle-opacity", - opacity = "1.0 0.97", +} +hl.window_rule { + name = 'firefox-browser-subtle-opacity', + opacity = '1.0 0.97', match = { - tag = "firefox-based-browser", + tag = 'firefox-based-browser', }, -}) +} -hl.window_rule({ - name = "geforce-now", - idle_inhibit = "fullscreen", +hl.window_rule { + name = 'geforce-now', + idle_inhibit = 'fullscreen', match = { - class = "GeForceNOW", + class = 'GeForceNOW', }, -}) +} -- Remove 1px border around hyprshot screenshots -hl.layer_rule({ - name = "no-anim-for-selection", - match = { namespace = "selection" }, +hl.layer_rule { + name = 'no-anim-for-selection', + match = { namespace = 'selection' }, no_anim = true, -}) +} -- Jetbrains -- Fix splash screen showing in weird places and prevent annoying focus takeovers -hl.window_rule({ - name = "jetbrains-splash", - tag = "+jetbrains-splash", +hl.window_rule { + name = 'jetbrains-splash', + tag = '+jetbrains-splash', center = true, no_focus = true, border_size = 0, match = { - class = "^(jetbrains-.*)$", - title = "^(splash)$", + class = '^(jetbrains-.*)$', + title = '^(splash)$', float = true, }, -}) +} -- Center popups/find windows -hl.window_rule({ - name = "jetbrains-popups", +hl.window_rule { + name = 'jetbrains-popups', center = true, stay_focused = true, border_size = 0, - min_size = { "(monitor_w*0.5)", "(monitor_h*0.5)" }, - tag = "+jetbrains", + min_size = { '(monitor_w*0.5)', '(monitor_h*0.5)' }, + tag = '+jetbrains', match = { - class = "^(jetbrains-.*)$", - title = "^()$", + class = '^(jetbrains-.*)$', + title = '^()$', float = true, }, -}) +} -- Disable window flicker when autocomplete or tooltips appear -hl.window_rule({ - name = "jetbrains-tooltip", +hl.window_rule { + name = 'jetbrains-tooltip', no_initial_focus = true, match = { - class = "^(jetbrains-.*)$", - title = "^(win.*)$", + class = '^(jetbrains-.*)$', + title = '^(win.*)$', float = true, }, -}) +} -- Disable mouse focus -hl.window_rule({ - name = "jetbrains-no-follow-mouse", +hl.window_rule { + name = 'jetbrains-no-follow-mouse', no_follow_mouse = true, match = { - class = "^(jetbrains-.*)$", + class = '^(jetbrains-.*)$', }, -}) +} -- Keep enpass focused -hl.window_rule({ - name = "enpass-assistant", +hl.window_rule { + name = 'enpass-assistant', stay_focused = true, center = true, match = { - class = "^(Enpass)$", - title = "^(Enpass Assistant)$", + class = '^(Enpass)$', + title = '^(Enpass Assistant)$', }, -}) +} -- Float LocalSend and fzf file picker -hl.window_rule({ - name = "localsend-float", +hl.window_rule { + name = 'localsend-float', float = true, center = true, match = { - class = "(localsend|Share|fzf-file-picker)", + class = '(localsend|Share|fzf-file-picker)', }, -}) +} -- Picture-in-picture overlays -hl.window_rule({ - name = "pip-overlay", - tag = "+pip", +hl.window_rule { + name = 'pip-overlay', + tag = '+pip', match = { - title = "(Picture.?in.?[Pp]icture)", + title = '(Picture.?in.?[Pp]icture)', }, -}) -hl.window_rule({ - name = "pip-overlay", - tag = "-default-opacity", +} +hl.window_rule { + name = 'pip-overlay', + tag = '-default-opacity', float = true, pin = true, size = { 600, 338 }, keep_aspect_ratio = true, border_size = 0, - opacity = "1 1", + opacity = '1 1', match = { - tag = "pip", + tag = 'pip', }, -}) +} -- Retroarch -hl.window_rule({ - name = "retroarch-fullscreen", +hl.window_rule { + name = 'retroarch-fullscreen', fullscreen = true, - workspace = "name:Gaming_1", - tag = "-default-opacity", - opacity = "1 1", - idle_inhibit = "fullscreen", + workspace = 'name:Gaming_1', + tag = '-default-opacity', + opacity = '1 1', + idle_inhibit = 'fullscreen', match = { - class = "com.libretro.RetroArch", + class = 'com.libretro.RetroArch', }, -}) +} -- Scratchpad apps -hl.window_rule({ - name = "spotify-scratchpad", - workspace = "special:scratchpad", +hl.window_rule { + name = 'spotify-scratchpad', + workspace = 'special:music', match = { - class = "Spotify", + class = 'Spotify|psysonic', }, -}) -hl.window_rule({ - name = "signal-scratchpad", - workspace = "special:scratchpad", +} +hl.window_rule { + name = 'comms-scratchpad', + workspace = 'special:comms', match = { - class = "signal", + class = '^(chrome-discord.com__channels_@me-Default|chrome-web.whatsapp.com__-Default|signal)$', }, -}) -hl.window_rule({ - name = "discord-scratchpad", - workspace = "special:scratchpad", +} +hl.window_rule { + name = 'superproductivity-scratchpad', + workspace = 'special:prod', match = { - class = "^(chrome-discord.com__channels_@me-Default)$", + class = '^(superproductivity|org.station.notes)$', }, -}) +} -- Float Nextcloud -hl.window_rule({ - name = "nextcloud-float", +hl.window_rule { + name = 'nextcloud-float', float = true, match = { - class = "com.nextcloud.desktopclient.nextcloud", + class = 'com.nextcloud.desktopclient.nextcloud', }, -}) +} -- Position drawing -hl.window_rule({ - name = "krita-drawing", - workspace = "name:Art_1", - tag = "-default-opacity", - opacity = "1 1", +hl.window_rule { + name = 'krita-drawing', + workspace = 'name:Art_1', + tag = '-default-opacity', + opacity = '1 1', match = { - class = "(krita)", + class = '(krita)', }, -}) +} -- Float Steam -hl.window_rule({ - name = "steam-float", +hl.window_rule { + name = 'steam-float', float = true, no_initial_focus = true, - workspace = "name:Gaming_1", - idle_inhibit = "fullscreen", + workspace = 'name:Gaming_1', + idle_inhibit = 'fullscreen', match = { - class = "steam", + class = 'steam', }, -}) -hl.window_rule({ - name = "steam-app-size", +} +hl.window_rule { + name = 'steam-app-size', center = true, match = { - class = "steam", - title = "Steam", + class = 'steam', + title = 'Steam', }, -}) -hl.window_rule({ - name = "steam-opacity", - tag = "-default-opacity", - opacity = "1 1", +} +hl.window_rule { + name = 'steam-opacity', + tag = '-default-opacity', + opacity = '1 1', match = { - class = "steam.*", + class = 'steam.*', }, -}) -hl.window_rule({ - name = "steam-friends-size", +} +hl.window_rule { + name = 'steam-friends-size', size = { 460, 800 }, match = { - class = "steam", - title = "Friends List", + class = 'steam', + title = 'Friends List', }, -}) +} -- Float Lunar Client -hl.window_rule({ - name = "atlauncher-float", +hl.window_rule { + name = 'atlauncher-float', float = true, - workspace = "name:Gaming_1", + workspace = 'name:Gaming_1', center = true, size = { 1100, 700 }, - tag = "-default-opacity", - opacity = "1 1", - idle_inhibit = "fullscreen", + tag = '-default-opacity', + opacity = '1 1', + idle_inhibit = 'fullscreen', match = { - class = "atlauncher", + class = 'atlauncher', }, -}) +} -- Floating windows -hl.window_rule({ - name = "floating-window-tags", - tag = "+floating-window", +hl.window_rule { + name = 'floating-window-tags', + tag = '+floating-window', match = { - class = "(org.station.bluetui|org.station.impala|org.station.wiremix|org.station.btop|org.station.terminal|org.station.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Station|About|TUI.float|imv|mpv)", + class = '(org.station.bluetui|org.station.impala|org.station.wiremix|org.station.btop|org.station.terminal|org.station.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Station|About|TUI.float|imv|mpv)', }, -}) -hl.window_rule({ - name = "floating-dialog-tags", - tag = "+floating-window", +} +hl.window_rule { + name = 'floating-dialog-tags', + tag = '+floating-window', match = { - class = "(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus)", - title = "^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)", + class = '(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus)', + title = '^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)', }, -}) -hl.window_rule({ - name = "floating-window-tags", - tag = "+floating-window", +} +hl.window_rule { + name = 'floating-window-tags', + tag = '+floating-window', float = true, center = true, size = { 875, 600 }, match = { - tag = "floating-window", + tag = 'floating-window', }, -}) +} -- Calculator float -hl.window_rule({ - name = "calculator-float", +hl.window_rule { + name = 'calculator-float', float = true, match = { - class = "org.gnome.Calculator", + class = 'org.gnome.Calculator', }, -}) +} -- Fullscreen screensaver -hl.window_rule({ - name = "screensaver-fullscreen", +hl.window_rule { + name = 'screensaver-fullscreen', fullscreen = true, float = true, - animation = "slide", + animation = 'slide', match = { - class = "org.station.screensaver", + class = 'org.station.screensaver', }, -}) +} -- No transparency on media windows -hl.window_rule({ - name = "media-no-opacity", - tag = "-default-opacity", - opacity = "1 1", +hl.window_rule { + name = 'media-no-opacity', + tag = '-default-opacity', + opacity = '1 1', match = { - class = "^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$", + class = '^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$', }, -}) +} -- Popped window rounding -hl.window_rule({ - name = "popped-window-rounding", +hl.window_rule { + name = 'popped-window-rounding', rounding = 8, match = { - tag = "pop", + tag = 'pop', }, -}) +} -- Prevent idle while open -hl.window_rule({ - name = "idle-inhibit-apps", - idle_inhibit = "always", +hl.window_rule { + name = 'idle-inhibit-apps', + idle_inhibit = 'always', match = { - tag = "noidle", + tag = 'noidle', }, -}) +} -- Prevent Telegram from stealing focus on new messages -hl.window_rule({ - name = "telegram-no-focus-steal", +hl.window_rule { + name = 'telegram-no-focus-steal', focus_on_activate = false, match = { - class = "org.telegram.desktop", + class = 'org.telegram.desktop', }, -}) +} -- Define terminal tag to style them uniformly -hl.window_rule({ - name = "terminal-tags", - tag = "+terminal", +hl.window_rule { + name = 'terminal-tags', + tag = '+terminal', match = { - class = "(Alacritty|kitty|com.mitchellh.ghostty)", + class = '(Alacritty|kitty|com.mitchellh.ghostty)', }, -}) -hl.window_rule({ - name = "terminal-opacity-tags", - tag = "-default-opacity", - opacity = "0.97 0.9", +} +hl.window_rule { + name = 'terminal-opacity-tags', + tag = '-default-opacity', + opacity = '0.97 0.9', match = { - tag = "terminal", + tag = 'terminal', }, -}) +} -- Application-specific animation -hl.layer_rule({ - name = "walker-no-anim", +hl.layer_rule { + name = 'walker-no-anim', no_anim = true, - match = { namespace = "walker" }, -}) + match = { namespace = 'walker' }, +} -- Webcam overlay for screen recording -hl.window_rule({ - name = "webcam-overlay", +hl.window_rule { + name = 'webcam-overlay', float = true, pin = true, no_initial_focus = true, no_dim = true, size = { 320, 180 }, - move = { "(monitor_w-360)", "(monitor_h-220)" }, + move = { '(monitor_w-360)', '(monitor_h-220)' }, match = { - title = "WebcamOverlay", + title = 'WebcamOverlay', }, -}) +} + diff --git a/.config/hypr/bindings.lua b/.config/hypr/bindings.lua index 8020aa6..9c6d53b 100644 --- a/.config/hypr/bindings.lua +++ b/.config/hypr/bindings.lua @@ -2,7 +2,7 @@ -- Media -- ========================== -- Only display the OSD on the currently focused monitor -local osdclient = "swayosd-client --monitor \"$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')\"" +local osdclient = 'swayosd-client --monitor "$(hyprctl monitors -j | jq -r \'.[] | select(.focused == true).name\')"' local exec = hl.dsp.exec_cmd local shortcut = hl.dsp.send_shortcut @@ -26,80 +26,80 @@ local function bindlr(key, cmd, desc, opts) end local function notify(text) - hl.notification.create({ text = text, duration = 2000 }) + hl.notification.create { text = text, duration = 2000 } end -- Laptop multimedia keys for volume and LCD brightness (with OSD) -bindlr("XF86AudioRaiseVolume", exec(osdclient .. " --output-volume raise"), "Volume up") -bindlr("XF86AudioRaiseVolume", exec(osdclient .. " --output-volume raise"), "Volume up") -bindlr("XF86AudioLowerVolume", exec(osdclient .. " --output-volume lower"), "Volume down") -bindlr("XF86AudioMute", exec(osdclient .. " --output-volume mute-toggle"), "Mute") -bindlr("XF86AudioMicMute", exec(osdclient .. " --input-volume mute-toggle"), "Mute microphone") -bindlr("XF86MonBrightnessUp", exec("station-brightness-display +5%"), "Brightness up") -bindlr("XF86MonBrightnessDown", exec("station-brightness-display 5%-"), "Brightness down") -bindlr("XF86KbdBrightnessUp", exec("station-brightness-keyboard up"), "Keyboard brightness up") -bindlr("XF86KbdBrightnessDown", exec("station-brightness-keyboard down"), "Keyboard brightness down") -bindl("XF86KbdLightOnOff", exec("station-brightness-keyboard cycle"), "Keyboard backlight cycle") +bindlr('XF86AudioRaiseVolume', exec(osdclient .. ' --output-volume raise'), 'Volume up') +bindlr('XF86AudioRaiseVolume', exec(osdclient .. ' --output-volume raise'), 'Volume up') +bindlr('XF86AudioLowerVolume', exec(osdclient .. ' --output-volume lower'), 'Volume down') +bindlr('XF86AudioMute', exec(osdclient .. ' --output-volume mute-toggle'), 'Mute') +bindlr('XF86AudioMicMute', exec(osdclient .. ' --input-volume mute-toggle'), 'Mute microphone') +bindlr('XF86MonBrightnessUp', exec 'station-brightness-display +5%', 'Brightness up') +bindlr('XF86MonBrightnessDown', exec 'station-brightness-display 5%-', 'Brightness down') +bindlr('XF86KbdBrightnessUp', exec 'station-brightness-keyboard up', 'Keyboard brightness up') +bindlr('XF86KbdBrightnessDown', exec 'station-brightness-keyboard down', 'Keyboard brightness down') +bindl('XF86KbdLightOnOff', exec 'station-brightness-keyboard cycle', 'Keyboard backlight cycle') -- Precise 1% multimedia adjustments with Alt modifier -bindlr("ALT + XF86AudioRaiseVolume", exec("$osdclient --output-volume +1"), "Volume up precise") -bindlr("ALT + XF86AudioLowerVolume", exec("$osdclient --output-volume -1"), "Volume down precise") -bindlr("ALT + XF86MonBrightnessUp", exec("station-brightness-display +1%"), "Brightness up precise") -bindlr("ALT + XF86MonBrightnessDown", exec("station-brightness-display 1%-"), "Brightness down precise") +bindlr('ALT + XF86AudioRaiseVolume', exec '$osdclient --output-volume +1', 'Volume up precise') +bindlr('ALT + XF86AudioLowerVolume', exec '$osdclient --output-volume -1', 'Volume down precise') +bindlr('ALT + XF86MonBrightnessUp', exec 'station-brightness-display +1%', 'Brightness up precise') +bindlr('ALT + XF86MonBrightnessDown', exec 'station-brightness-display 1%-', 'Brightness down precise') -- Requires playerctl -bindl("XF86AudioNext", exec(osdclient .. " --playerctl next"), "Next track") -bindl("XF86AudioPause", exec(osdclient .. " --playerctl play-pause"), "Pause") -bindl("XF86AudioPlay", exec(osdclient .. " --playerctl play-pause"), "Play") -bindl("XF86AudioPrev", exec(osdclient .. " --playerctl previous"), "Previous track") +bindl('XF86AudioNext', exec(osdclient .. ' --playerctl next'), 'Next track') +bindl('XF86AudioPause', exec(osdclient .. ' --playerctl play-pause'), 'Pause') +bindl('XF86AudioPlay', exec(osdclient .. ' --playerctl play-pause'), 'Play') +bindl('XF86AudioPrev', exec(osdclient .. ' --playerctl previous'), 'Previous track') -- Switch audio output with Super + Mute -bindl("SUPER + XF86AudioMute", exec("station-cmd-audio-switch"), "Switch audio output") +bindl('SUPER + XF86AudioMute', exec 'station-cmd-audio-switch', 'Switch audio output') -- ========================== -- Copy & Paste -- ========================== -bind("SUPER + C", shortcut({ mods = "CTRL", key = "Insert" }), "Universal copy") -bind("SUPER + V", shortcut({ mods = "SHIFT", key = "Insert" }), "Universal paste") -bind("SUPER + X", shortcut({ mods = "CRTL", key = "X" }), "Universal cut") -bind("SUPER + A", shortcut({ mods = "CTRL", key = "A" }), "Universal cut") -bind("SUPER + CTRL + V", exec("station-launch-walker -m clipboard"), "Clipboard manager") +bind('SUPER + C', shortcut { mods = 'CTRL', key = 'Insert' }, 'Universal copy') +bind('SUPER + V', shortcut { mods = 'SHIFT', key = 'Insert' }, 'Universal paste') +bind('SUPER + X', shortcut { mods = 'CRTL', key = 'X' }, 'Universal cut') +bind('SUPER + A', shortcut { mods = 'CTRL', key = 'A' }, 'Universal cut') +bind('SUPER + CTRL + V', exec 'station-launch-walker -m clipboard', 'Clipboard manager') -- Close windows -bind("SUPER + Q", hl.dsp.window.close(), "Close window") +bind('SUPER + Q', hl.dsp.window.close(), 'Close window') -- ========================== -- Tiling -- ========================== -bind("SUPER + P", hl.dsp.window.pseudo()--[[# dwindle]], "Pseudo window") -bind("SUPER + F", hl.dsp.window.fullscreen(0), "Full screen") -bind("SUPER + CTRL + F", hl.dsp.window.fullscreen(1), "Full width") -bind("SUPER + T", function() +bind('SUPER + P', hl.dsp.window.pseudo()--[[# dwindle]], 'Pseudo window') +bind('SUPER + F', hl.dsp.window.fullscreen(0), 'Full screen') +bind('SUPER + CTRL + F', hl.dsp.window.fullscreen(1), 'Full width') +bind('SUPER + T', function() local width = 1300 local height = 900 local pinned = hl.get_active_window().pinned if pinned then hl.dispatch(hl.dsp.window.pin()) - hl.dispatch(hl.dsp.window.float({ action = "toggle" })) - hl.dispatch(hl.dsp.window.tag({ tag = "-pop" })) + hl.dispatch(hl.dsp.window.float { action = 'toggle' }) + hl.dispatch(hl.dsp.window.tag { tag = '-pop' }) else - hl.dispatch(hl.dsp.window.float({ action = "toggle" })) - hl.dispatch(hl.dsp.window.resize({ x = width, y = height })) + hl.dispatch(hl.dsp.window.float { action = 'toggle' }) + hl.dispatch(hl.dsp.window.resize { x = width, y = height }) hl.dispatch(hl.dsp.window.center()) hl.dispatch(hl.dsp.window.pin()) - hl.dispatch(hl.dsp.window.alter_zorder({ mode = "top" })) - hl.dispatch(hl.dsp.window.tag({ tag = "+pop" })) + hl.dispatch(hl.dsp.window.alter_zorder { mode = 'top' }) + hl.dispatch(hl.dsp.window.tag { tag = '+pop' }) end -end, "Pop window out (float & pin)") -bind("SUPER + CTRL + L", function() - local layouts = { "dwindle", "scrolling", "monocle", "master" } +end, 'Pop window out (float & pin)') +bind('SUPER + CTRL + L', function() + local layouts = { 'dwindle', 'scrolling', 'monocle', 'master' } local workspace = hl.get_active_workspace() if hl.get_active_special_workspace() then workspace = hl.get_active_special_workspace() end - local next_layout = "dwindle" + local next_layout = 'dwindle' if not workspace then return @@ -114,162 +114,167 @@ bind("SUPER + CTRL + L", function() end if workspace.special then - hl.workspace_rule({ workspace = tostring(workspace.name), layout = next_layout }) + hl.workspace_rule { workspace = tostring(workspace.name), layout = next_layout } else - hl.workspace_rule({ workspace = tostring(workspace.id), layout = next_layout }) + hl.workspace_rule { workspace = tostring(workspace.id), layout = next_layout } end - notify("󱂬 Workspace layout set to " .. next_layout) -end, "Toggle workspace layout") + notify('󱂬 Workspace layout set to ' .. next_layout) +end, 'Toggle workspace layout') -- Move focus with SUPER + arrow keys -bind("SUPER + H", hl.dsp.focus({ direction = "left" }), "Move window focus left") -bind("SUPER + L", hl.dsp.focus({ direction = "right" }), "Move window focus right") -bind("SUPER + K", hl.dsp.focus({ direction = "up" }), "Move window focus up") -bind("SUPER + J", hl.dsp.focus({ direction = "down" }), "Move window focus down") -bind("SUPER + SHIFT + H", hl.dsp.window.move({ direction = "left" }), "Move window left") -bind("SUPER + SHIFT + L", hl.dsp.window.move({ direction = "right" }), "Move window right") -bind("SUPER + SHIFT + K", hl.dsp.window.move({ direction = "up" }), "Move window up") -bind("SUPER + SHIFT + J", hl.dsp.window.move({ direction = "down" }), "Move window down") +bind('SUPER + H', hl.dsp.focus { direction = 'left' }, 'Move window focus left') +bind('SUPER + L', hl.dsp.focus { direction = 'right' }, 'Move window focus right') +bind('SUPER + K', hl.dsp.focus { direction = 'up' }, 'Move window focus up') +bind('SUPER + J', hl.dsp.focus { direction = 'down' }, 'Move window focus down') +bind('SUPER + SHIFT + H', hl.dsp.window.move { direction = 'left' }, 'Move window left') +bind('SUPER + SHIFT + L', hl.dsp.window.move { direction = 'right' }, 'Move window right') +bind('SUPER + SHIFT + K', hl.dsp.window.move { direction = 'up' }, 'Move window up') +bind('SUPER + SHIFT + J', hl.dsp.window.move { direction = 'down' }, 'Move window down') -- Control scratchpad -bind("SUPER + S", hl.dsp.workspace.toggle_special("scratchpad"), "Toggle scratchpad") -bind("SUPER + ALT + S", hl.dsp.window.move({ workspace = "special:scratchpad" }), "Move window to scratchpad") +bind('SUPER + S', hl.dsp.workspace.toggle_special 'scratchpad', 'Toggle scratchpad') +bind('SUPER + ALT + S', hl.dsp.window.move { workspace = 'special:scratchpad' }, 'Move window to scratchpad') +bind('SUPER + N', function() + hl.dispatch(hl.dsp.workspace.toggle_special 'prod') + local windows = hl.get_windows { workspace = 'special:prod' } + if #windows == 0 then + hl.exec_cmd 'station-launch-or-focus ^superProductivity$ "uwsm-app -- super-productivity"' + hl.exec_cmd 'uwsm-app -- xdg-terminal-exec --app-id=org.station.notes nvim ~/Tower/Documents/Notes' + end +end, 'Toggle productivity workspace') +bind('SUPER + M', function() + hl.dispatch(hl.dsp.workspace.toggle_special 'music') + local windows = hl.get_windows { workspace = 'special:music' } + if #windows == 0 then + hl.exec_cmd 'station-launch-or-focus spotify' + hl.exec_cmd 'station-launch-or-focus psysonic' + end +end, 'Toggle music workspace') +bind('SUPER + D', function() + hl.dispatch(hl.dsp.workspace.toggle_special 'comms') + local windows = hl.get_windows { workspace = 'special:comms' } + if #windows == 0 then + hl.exec_cmd 'station-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"' + hl.exec_cmd 'station-launch-or-focus ^chrome-web.whatsapp.com__-Default$ "station-launch-webapp https://web.whatsapp.com"' + hl.exec_cmd 'station-launch-or-focus ^chrome-discord.com__channels_@me-Default$ "station-launch-webapp https://discord.com/channels/@me"' + end +end, 'Toggle comms workspace') -- Cycle through applications on active workspace -bind("SUPER + TAB", hl.dsp.window.cycle_next({ next = true }), "Cycle to next window") -bind("SUPER + SHIFT + TAB", hl.dsp.window.cycle_next({ next = false }), "Cycle to prev window") +bind('SUPER + TAB', hl.dsp.window.cycle_next { next = true }, 'Cycle to next window') +bind('SUPER + SHIFT + TAB', hl.dsp.window.cycle_next { next = false }, 'Cycle to prev window') -- bind("SUPER + TAB", /*bringactivetotop*/, "Reveal active window on top") -- bind("SUPER SHIFT + TAB", /*bringactivetotop*/, "Reveal active window on top") -- Resize active window -bind("SUPER + code:20", hl.dsp.window.resize({ x = -100, y = 0 }), "Expand window left") -bind("SUPER + code:21", hl.dsp.window.resize({ x = 100, y = 0 }), "Shrink window left") -bind("SUPER + SHIFT + code:20", hl.dsp.window.resize({ x = 0, y = -100 }), "Shrink window up") -bind("SUPER + SHIFT + code:21", hl.dsp.window.resize({ x = 0, y = 100 }), "Expand window down") +bind('SUPER + code:20', hl.dsp.window.resize { x = -100, y = 0 }, 'Expand window left') +bind('SUPER + code:21', hl.dsp.window.resize { x = 100, y = 0 }, 'Shrink window left') +bind('SUPER + SHIFT + code:20', hl.dsp.window.resize { x = 0, y = -100 }, 'Shrink window up') +bind('SUPER + SHIFT + code:21', hl.dsp.window.resize { x = 0, y = 100 }, 'Expand window down') -- Move/resize windows with mainMod + LMB/RMB and dragging -bind("SUPER + mouse:272", hl.dsp.window.drag(), "Move window", { mouse = true }) -bind("SUPER + mouse:273", hl.dsp.window.resize(), "Resize window", { mouse = true }) +bind('SUPER + mouse:272', hl.dsp.window.drag(), 'Move window', { mouse = true }) +bind('SUPER + mouse:273', hl.dsp.window.resize(), 'Resize window', { mouse = true }) -- Toggle current window to be a group or stack in other window manager lingo -bind("SUPER + G", hl.dsp.group.toggle(), "Toggle window to a group") +bind('SUPER + G', hl.dsp.group.toggle(), 'Toggle window to a group') -- Move to the next tab group window -bind("SUPER + bracketleft", hl.dsp.group.prev(), "Move to previous window in the group") -bind("SUPER + bracketright", hl.dsp.group.next(), "Move to next window in the group") +bind('SUPER + bracketleft', hl.dsp.group.prev(), 'Move to previous window in the group') +bind('SUPER + bracketright', hl.dsp.group.next(), 'Move to next window in the group') -- Move current window in the tab group -bind("SUPER + SHIFT + bracketleft", hl.dsp.group.move_window({ direction = "left" }), "Move window left in group") -bind("SUPER + SHIFT + bracketright", hl.dsp.group.move_window({ direction = "right" }), "Move window right in group") +bind('SUPER + SHIFT + bracketleft', hl.dsp.group.move_window { direction = 'left' }, 'Move window left in group') +bind('SUPER + SHIFT + bracketright', hl.dsp.group.move_window { direction = 'right' }, 'Move window right in group') -- Move current window out of the tab group -bind("SUPER + CTRL + bracketleft", hl.dsp.window.move({ out_of_group = "left" }), "Move window out of group left") -bind("SUPER + CTRL + bracketright", hl.dsp.window.move({ out_of_group = "right" }), "Move window out of group right") +bind('SUPER + CTRL + bracketleft', hl.dsp.window.move { out_of_group = 'left' }, 'Move window out of group left') +bind('SUPER + CTRL + bracketright', hl.dsp.window.move { out_of_group = 'right' }, 'Move window out of group right') -- Move current window into an existing tab group or create a new one -bind( - "SUPER + SHIFT + CTRL + bracketleft", - hl.dsp.window.move({ into_or_create_group = "left" }), - "Move window into group left" -) -bind( - "SUPER + SHIFT + CTRL + bracketright", - hl.dsp.window.move({ into_or_create_group = "right" }), - "Move window into group right" -) +bind('SUPER + SHIFT + CTRL + bracketleft', hl.dsp.window.move { into_or_create_group = 'left' }, 'Move window into group left') +bind('SUPER + SHIFT + CTRL + bracketright', hl.dsp.window.move { into_or_create_group = 'right' }, 'Move window into group right') -- ========================== -- Utilities -- ========================== -- Menus -bind("SUPER + SPACE", exec("station-launch-walker"), "Launch apps") -bind("SUPER + CTRL + E", exec("station-launch-walker -m symbols"), "Emoji picker") -bind("SUPER + CTRL + C", exec("station-menu capture"), "Capture menu") -bind("SUPER + CTRL + O", exec("station-menu toggle"), "Toggle menu") -bind("SUPER + ALT + SPACE", exec("station-menu"), "Station menu") -bind("SUPER + ESCAPE", exec("station-menu system"), "System menu") -bindl("XF86PowerOff", exec("station-menu system"), "Power menu") -bind("SUPER + K", exec("station-menu-keybindings"), "Show key bindings") -bind("XF86Calculator", exec("gnome-calculator"), "Calculator") +bind('SUPER + SPACE', exec 'station-launch-walker', 'Launch apps') +bind('SUPER + CTRL + E', exec 'station-launch-walker -m symbols', 'Emoji picker') +bind('SUPER + CTRL + C', exec 'station-menu capture', 'Capture menu') +bind('SUPER + CTRL + O', exec 'station-menu toggle', 'Toggle menu') +bind('SUPER + ALT + SPACE', exec 'station-menu', 'Station menu') +bind('SUPER + ESCAPE', exec 'station-menu system', 'System menu') +bindl('XF86PowerOff', exec 'station-menu system', 'Power menu') +bind('SUPER + K', exec 'station-menu-keybindings', 'Show key bindings') +bind('XF86Calculator', exec 'gnome-calculator', 'Calculator') -- Aesthetics -bind("SUPER + SHIFT + SPACE", exec("station-toggle-waybar"), "Toggle top bar") -bind("SUPER + CTRL + SPACE", exec("station-menu background"), "Theme background menu") +bind('SUPER + SHIFT + SPACE', exec 'station-toggle-waybar', 'Toggle top bar') +bind('SUPER + CTRL + SPACE', exec 'station-menu background', 'Theme background menu') -- bind("SUPER SHIFT CTRL + SPACE", exec("station-menu theme"), "Theme menu") -bind( - "SUPER + BACKSPACE", - exec("hyprctl dispatch setprop \"address:$(hyprctl activewindow -j | jq -r '.address')\" opaque toggle"), - "Toggle window transparency" -) -bind("SUPER + SHIFT + BACKSPACE", function() - local gaps = hl.get_config("general.gaps_out") +bind('SUPER + BACKSPACE', exec 'hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r \'.address\')" opaque toggle', 'Toggle window transparency') +bind('SUPER + SHIFT + BACKSPACE', function() + local gaps = hl.get_config 'general.gaps_out' if gaps.top == 0 then - hl.config({ + hl.config { general = { gaps_out = 10, gaps_in = 5, border_size = 2, }, - }) + } else - hl.config({ + hl.config { general = { gaps_out = 0, gaps_in = 0, border_size = 0, }, - }) + } end -end, "Toggle window gaps") +end, 'Toggle window gaps') -- Notifications -bind("SUPER + COMMA", exec("makoctl dismiss"), "Dismiss last notification") -bind("SUPER + SHIFT + COMMA", exec("makoctl dismiss --all"), "Dismiss all notifications") -bind("SUPER + CTRL + COMMA", exec("station-toggle-notification-silencing"), "Toggle silencing notifications") -bind("SUPER + ALT + COMMA", exec("makoctl invoke"), "Invoke last notification") -bind("SUPER + SHIFT + ALT + COMMA", exec("makoctl restore"), "Restore last notification") +bind('SUPER + COMMA', exec 'makoctl dismiss', 'Dismiss last notification') +bind('SUPER + SHIFT + COMMA', exec 'makoctl dismiss --all', 'Dismiss all notifications') +bind('SUPER + CTRL + COMMA', exec 'station-toggle-notification-silencing', 'Toggle silencing notifications') +bind('SUPER + ALT + COMMA', exec 'makoctl invoke', 'Invoke last notification') +bind('SUPER + SHIFT + ALT + COMMA', exec 'makoctl restore', 'Restore last notification') -- Toggles -bind("SUPER + CTRL + I", exec("station-toggle-idle"), "Toggle locking on idle") -bind("SUPER + CTRL + N", exec("station-toggle-nightlight"), "Toggle nightlight") +bind('SUPER + CTRL + I', exec 'station-toggle-idle', 'Toggle locking on idle') +bind('SUPER + CTRL + N', exec 'station-toggle-nightlight', 'Toggle nightlight') -- Captures -bind("PRINT", exec("station-cmd-screenshot"), "Screenshot") -bind("ALT + PRINT", exec("station-menu screenrecord"), "Screenrecording") -bind("SUPER + PRINT", exec("pkill hyprpicker || hyprpicker -a"), "Color picker") +bind('PRINT', exec 'station-cmd-screenshot', 'Screenshot') +bind('ALT + PRINT', exec 'station-menu screenrecord', 'Screenrecording') +bind('SUPER + PRINT', exec 'pkill hyprpicker || hyprpicker -a', 'Color picker') -- File sharing -- bind("SUPER CTRL + S", exec("station-menu share"), "Share") -- Waybar-less information -bind("SUPER + CTRL + ALT + T", exec('notify " $(date +"%A %H:%M — %d %B W%V %Y")"'), "Show time") -bind( - "SUPER + CTRL + ALT + B", - exec('notify-send "󰁹 Battery is at $(station-battery-remaining)%"'), - "Show battery remaining" -) -bind("SUPER + CTRL + ALT + W", function() +bind('SUPER + CTRL + ALT + T', exec 'notify " $(date +"%A %H:%M — %d %B W%V %Y")"', 'Show time') +bind('SUPER + CTRL + ALT + B', exec 'notify-send "󰁹 Battery is at $(station-battery-remaining)%"', 'Show battery remaining') +bind('SUPER + CTRL + ALT + W', function() local window = hl.get_active_window() - notify("Window: " .. window.title .. "\nClass: " .. window.class) -end, "Show active window name and class") + notify('Window: ' .. window.title .. '\nClass: ' .. window.class) +end, 'Show active window name and class') -- Control panels -bind("SUPER + CTRL + A", exec("station-launch-audio"), "Audio controls") -bind("SUPER + CTRL + B", exec("station-launch-bluetooth"), "Bluetooth controls") -bind("SUPER + CTRL + W", exec("station-launch-wifi"), "Wifi controls") -bind("SUPER + CTRL + T", exec("station-launch-tui btop"), "Activity") +bind('SUPER + CTRL + A', exec 'station-launch-audio', 'Audio controls') +bind('SUPER + CTRL + B', exec 'station-launch-bluetooth', 'Bluetooth controls') +bind('SUPER + CTRL + W', exec 'station-launch-wifi', 'Wifi controls') +bind('SUPER + CTRL + T', exec 'station-launch-tui btop', 'Activity') -- Dictation -- bind("SUPER CTRL + X", exec("voxtype record toggle"), "Toggle dictation") -- Zoom -bind( - "SUPER + CTRL + Z", - exec("hyprctl keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float + 1')"), - "Zoom in" -) -bind("SUPER + CTRL + ALT + Z", exec("hyprctl keyword cursor:zoom_factor 1"), "Reset zoom") +bind('SUPER + CTRL + Z', exec "hyprctl keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float + 1')", 'Zoom in') +bind('SUPER + CTRL + ALT + Z', exec 'hyprctl keyword cursor:zoom_factor 1', 'Reset zoom') -- Lock system -- bind("SUPER CTRL + L", exec("station-lock-screen"), "Lock system") @@ -277,41 +282,33 @@ bind("SUPER + CTRL + ALT + Z", exec("hyprctl keyword cursor:zoom_factor 1"), "Re -- ========================== -- Applications -- ========================== -bind("SUPER + RETURN", exec("uwsm-app -- xdg-terminal-exec"), "Terminal") -bind("SUPER + ALT + RETURN", exec('uwsm-app -- xdg-terminal-exec --dir="$(station-cmd-terminal-cwd)" tmux new'), "Tmux") -bind("SUPER + SHIFT + F", exec("uwsm-app -- nautilus --new-window"), "File manager") -bind( - "SUPER + ALT + SHIFT + F", - exec('uwsm-app -- nautilus --new-window "$(station-cmd-terminal-cwd)"'), - "File manager (cwd)" -) -bind("SUPER + SHIFT + B", exec("/home/chris/.local/bin/station-launch-browser"), "Browser") -bind("SUPER + SHIFT + ALT + B", exec("station-launch-browser --private"), "Browser (private)") -bind("SUPER + SHIFT + M", exec("station-launch-or-focus spotify"), "Music") -bind("SUPER + SHIFT + N", exec("station-launch-editor"), "Editor") +bind('SUPER + RETURN', exec 'uwsm-app -- xdg-terminal-exec', 'Terminal') +bind('SUPER + ALT + RETURN', exec 'uwsm-app -- xdg-terminal-exec --dir="$(station-cmd-terminal-cwd)" tmux new', 'Tmux') +bind('SUPER + SHIFT + F', exec 'uwsm-app -- nautilus --new-window', 'File manager') +bind('SUPER + ALT + SHIFT + F', exec 'uwsm-app -- nautilus --new-window "$(station-cmd-terminal-cwd)"', 'File manager (cwd)') +bind('SUPER + SHIFT + B', exec 'station-launch-browser', 'Browser') +bind('SUPER + SHIFT + ALT + B', exec 'station-launch-browser --private', 'Browser (private)') +bind('SUPER + SHIFT + S', exec 'station-launch-or-focus spotify', 'Spotify') +bind('SUPER + SHIFT + M', exec 'station-launch-or-focus psysonic', 'Music') -- bind("SUPER SHIFT + D", exec("station-launch-tui lazydocker"), "Docker") -bind("SUPER + SHIFT + G", exec('station-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"'), "Signal") -bind( - "SUPER + SHIFT + O", - exec('station-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"'), - "Obsidian" -) +bind('SUPER + SHIFT + G', exec 'station-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"', 'Signal') +bind('SUPER + SHIFT + D', exec 'station-launch-or-focus ^chrome-discord.com__channels_@me-Default$ "uwsm-app -- discord"', 'Discord') +bind('SUPER + SHIFT + W', exec 'station-launch-or-focus ^chrome-web.whatsapp.com__-Default$ "uwsm-app -- whatsapp"', 'Whatsapp') +bind('SUPER + SHIFT + P', exec 'station-launch-or-focus ^superProductivity$ "uwsm-app -- super-productivity"', 'Super Productivity') +bind('SUPER + SHIFT + N', exec 'uwsm-app -- xdg-terminal-exec --app-id=org.station.notes nvim ~/Tower/Documents/Notes', 'Editor') -- bind("SUPER SHIFT + W", exec("uwsm-app -- typora --enable-wayland-ime"), "Typora") -bind("SUPER + SHIFT + SLASH", exec("Enpass showassistant"), "Passwords") -bind("SUPER + SHIFT + E", exec("station-launch-or-focus mailspring"), "Email") +bind('SUPER + SHIFT + SLASH', exec 'Enpass showassistant', 'Passwords') +bind('SUPER + SHIFT + E', exec 'station-launch-or-focus mailspring', 'Email') -bind("SUPER + SHIFT + A", exec('station-launch-webapp "https://gemini.google.com/app"'), "ChatGPT") -bind("SUPER + SHIFT + C", exec('station-launch-webapp "https://tower.scarif.space/apps/calendar"'), "Calendar") -bind("SUPER + SHIFT + Y", exec('station-launch-or-focus-webapp "YouTube" "https://youtube.com/"'), "YouTube") -bind("SUPER + SHIFT + ALT + G", exec('station-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"'), "WhatsApp") -bind( - "SUPER + SHIFT + CTRL + G", - exec('station-launch-or-focus-webapp "Google Maps" "https://maps.google.com"'), - "Google Maps" -) +bind('SUPER + SHIFT + A', exec 'station-launch-webapp "https://gemini.google.com/app"', 'ChatGPT') +bind('SUPER + SHIFT + C', exec 'station-launch-webapp "https://tower.scarif.space/apps/calendar"', 'Calendar') +bind('SUPER + SHIFT + Y', exec 'station-launch-or-focus-webapp "YouTube" "https://youtube.com/"', 'YouTube') +bind('SUPER + SHIFT + ALT + G', exec 'station-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"', 'WhatsApp') +bind('SUPER + SHIFT + CTRL + G', exec 'station-launch-or-focus-webapp "Google Maps" "https://maps.google.com"', 'Google Maps') -- bind("SUPER SHIFT + P", exec("station-launch-or-focus-webapp "Google Photos" "https://photos.google.com/""), "Google Photos") -- bind("SUPER SHIFT + X", exec("station-launch-webapp "https://x.com/""), "X") -- bind("SUPER SHIFT ALT + X", exec("station-launch-webapp "https://x.com/compose/post""), "X Post") -- Add extra bindings -bind("SUPER + SHIFT + R", exec("ghostty -e ssh scarif"), "SSH to scarif") +bind('SUPER + SHIFT + R', exec 'ghostty -e ssh scarif', 'SSH to scarif') + diff --git a/.config/nvim b/.config/nvim index 603e7a2..58753ae 160000 --- a/.config/nvim +++ b/.config/nvim @@ -1 +1 @@ -Subproject commit 603e7a2b7abc1e34158e26bfa48da30ae2f9e1a1 +Subproject commit 58753ae8014eeae48faf98f78db360ba9319dca4 diff --git a/.local/share/applications/Discord.desktop b/.local/share/applications/Discord.desktop index b1c9130..079396c 100644 --- a/.local/share/applications/Discord.desktop +++ b/.local/share/applications/Discord.desktop @@ -3,6 +3,7 @@ Version=1.0 Name=Discord Comment=Discord Exec=station-launch-webapp https://discord.com/channels/@me +Exec=station-launch-or-focus ^chrome-discord.com__channels_@me-Default$ "station-launch-webapp https://discord.com/channels/@me" Terminal=false Type=Application Icon=/home/chris/.local/share/applications/icons/Discord.png diff --git a/.local/share/applications/WhatsApp.desktop b/.local/share/applications/WhatsApp.desktop index fb54b21..0eaade8 100644 --- a/.local/share/applications/WhatsApp.desktop +++ b/.local/share/applications/WhatsApp.desktop @@ -2,7 +2,7 @@ Version=1.0 Name=WhatsApp Comment=WhatsApp -Exec=station-launch-webapp https://web.whatsapp.com +Exec=station-launch-or-focus ^chrome-web.whatsapp.com__-Default$ "station-launch-webapp https://web.whatsapp.com" Terminal=false Type=Application Icon=/home/chris/.local/share/applications/icons/WhatsApp