From f3be814bcaa85afd8906b44ef07911c764eab76c Mon Sep 17 00:00:00 2001 From: voidarc Date: Tue, 12 May 2026 10:53:40 +0100 Subject: [PATCH 1/6] everything is gone --- animations.conf | 19 ------ binds.conf | 58 ------------------ cat.png | Bin 3596 -> 0 bytes hyprland.conf | 8 --- hyprland.lua | 0 hyprlock.conf | 109 ---------------------------------- input.conf | 38 ------------ mocha.conf | 78 ------------------------ rules.conf | 155 ------------------------------------------------ startup.conf | 15 ----- style.conf | 93 ----------------------------- windows.conf | 1 - 12 files changed, 574 deletions(-) delete mode 100644 animations.conf delete mode 100644 binds.conf delete mode 100644 cat.png delete mode 100644 hyprland.conf create mode 100644 hyprland.lua delete mode 100644 hyprlock.conf delete mode 100644 input.conf delete mode 100644 mocha.conf delete mode 100644 rules.conf delete mode 100644 startup.conf delete mode 100644 style.conf delete mode 100644 windows.conf diff --git a/animations.conf b/animations.conf deleted file mode 100644 index cdc05bd..0000000 --- a/animations.conf +++ /dev/null @@ -1,19 +0,0 @@ -animations { - enabled = true - - bezier = heavyOvershoot, 0.53, 0.51, 0.3, 1.22 - bezier = lightOvershoot, 0.33, 0.61, 0.63, 1.19 - bezier = smoothSnap, 0.32, 0.51, 0.44, 1 - bezier = smoothIn, 0.25, 1, 0.5, 1 - bezier = smoothOutOvershoot, 0.46, -0.25, 0.81, 0.51 - - animation = workspaces, 1, 2.5, heavyOvershoot, slidefade 30% - animation = specialWorkspace, 1, 2, smoothIn, slidefadevert -80% - animation = specialWorkspaceOut, 1, 1.7, smoothOutOvershoot, slidefadevert -80% - - animation = windows, 1, 2, smoothIn, slide right - animation = windowsMove, 1, 2, smoothSnap - animation = windowsOut, 1, 4, heavyOvershoot, popin 30% - - animation = fade, 1, 2, smoothIn -} diff --git a/binds.conf b/binds.conf deleted file mode 100644 index dc3c9c2..0000000 --- a/binds.conf +++ /dev/null @@ -1,58 +0,0 @@ -# Script Path -$scrPath = ~/.config/scripts - -# Assign apps -$term = kitty -$file = nemo -$browser = firefox -$launcher = $scrPath/otter-launch.sh - -# Window/Session actions -bind = $mainMod, backspace, exec, $scrPath/dontkillsteam.sh # close focused window -bind = $mainMod, d, exec, $launcher - -# Super key to drag windows -binds { - drag_threshold = 10 - scroll_event_delay = 0 -} -bindm = $submod, mouse:272, movewindow -bindr = $submod, mouse:272, layoutmsg, promote -bindc = $submod, mouse:272, togglefloating - -# Resize floating window with scrollwheels -bind = $submod, mouse_down, resizeactive, 0 -30 -bind = $submod, mouse_up, resizeactive, 0 30 -bind = $submod, mouse_left, resizeactive, 30 0 -bind = $submod, mouse_right, resizeactive, -30 0 -bind = $submod, space, togglefloating, # toggle the window between focus and float - -# Screenshot/Screencapture -bind = Super+SHIFT, S, exec, grimblast copy area - -# Move/Change window focus -bind = $mainMod, h, layoutmsg, focus l -bind = $mainMod, l, layoutmsg, focus r -bind = $mainMod, k, movefocus, u -bind = $mainMod, j, movefocus, d - -# Resize floating windows with keyboard -bind = $submod ctrl, h, resizeactive, -50 0 -bind = $submod ctrl, l, resizeactive, 50 0 -bind = $submod ctrl, k, resizeactive, 0 50 -bind = $submod ctrl, j, resizeactive, 0 -50 - -# Change window positions with keyboard -bind = $mainMod SHIFT, H, swapwindow, l -bind = $mainMod SHIFT, L, swapwindow, r -bind = $mainMod SHIFT, K, swapwindow, u -bind = $mainMod SHIFT, J, swapwindow, d - -# Move/Switch to special workspace (scratchpad) -bind = $mainMod, MINUS, togglespecialworkspace, scratch -bind = $mainMod SHIFT, MINUS, movetoworkspacesilent, special:scratch - -# Music workspace -bind = $mainMod, m, togglespecialworkspace, music - -source = ~/.config/hypr/binds-local.conf diff --git a/cat.png b/cat.png deleted file mode 100644 index deb6a0416b73e2a1168f3456f0970eb1e3b1053e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3596 zcmcgti9eL<9)I4MF=i}TMi^x|mLYV_X`(v9Boc>{WIxiIQ)9~(*%I%hs3b)>#Gs^9 zh-6>p?WDAb&MjnDa)@KQc4F>B_x=U<^SSTmGw=KSmgo2V?Q_xg7YlI_1rY#%xaEE` zI{<_+c%GyX;k#||Vh#Kt!FCp=NXIMP7)Ve9_qzlGAWB>NA>d}FJX8?1wYE2hLOgr; z&E0ul--uw}a~OvC`6a`5U|{6aoUc!FM(VSMJUy|Bn>}7$n7@ByU?3J8e43v%6wJXm z9FD&i=HTEE7IwkG;XzQ)6(1k$;kD+VAnfstwt#^1VVn!W!5D-H^ofk&^^p_pwrPGu0Mpnx`f#MatK@#(3A6v<7Pu~>>MdgtUMrOYnW3-XgTiRi$ZKmxOg0-t*i%iDs`{$h8^q$+*iZvil6TegD(D5R4=)UW8#OOOs z<0hsK_Jx%8#Pv;gZ_8QVRGghhVOo}L>iSqS$b-0~qcL$OgT_`OSeu%o^Gbe30ym>4Jg38BhHW3KrA4)j5C-q( zgqhG6vyWpAFFCefT?yDxE+TfF2U31{S(l|3Kz8ABlWFKbsY@m23tPDJ{9S#oz!wet z&Y>r>|Kdv+hd+P)dUWjIDcPs&bSm?!jCW5E=iM!xmUiVntvUX}zR|%ONkb+&YsESi zDxO+xz_!4v#7%oXJED4P2cyqSnvBD)_D^iXsY6u`zD4G@4AM1db&ZmF$ft z>OvpWEeYM)#o)X8K`dinR!&O?vQ=>>{fkkahWj+2buZvv^X6qf)oL=v@=La_}5 zYweV|ncK9KL}6#`HG=$+Ag`s5Fm6y|m-6^F21;lZg?V2FaW~ZeGjK)7>SxR{Piv$% zmzx`wt!qG72eOjtKdi~17xLK=RH$oNH#bNni!yCJph5FP^L)CoV+?m2Y}EAr=H~X5 zvJ&W0Ep+J*Vz--MM9-E3^==`((|dv~zUxs%C%J77u1liVZ-Nx7{g_i%4LoOnl>IN| zPS48aZ$KE=UJ(lT><%i^n{=ks3FD4PqREun(tQtc=o2ieDXXBXC2j*m`kRzSVpNsB zc>24k1wogEa8?;LrLClj0+O>kp{d&@+|v>vYwy9*D=a7ecDrmc`9~CkSgb`#+m*5K z`$o6(LiT3?>qv^=@xiGpu`MmXZ378=vGj*qqFvsJ$mf#~PF7K5T?tS99zkqP(_-}P zrT}aEL*H#?mjx$|9s3cwAx%nKq}C!KNumdArWn|9HN5F<$V%au@vgTuAoVg}>AhW5 ziu8Z5LxgF2lF*dd{q7rM;)@2nDFSa+mQ+phRPR6tE?_AiiU!@0qsIjocG9uu(9mWcq##~5b)Vj=i?ge!%wXmlsux0jum`(1@z=eCw@;|w zjV~w&t-Q|mjI05~K?ZKNqwBv~{%x4j>YEc2!p>xZ^@-AdV1*dhN)q+RsLEcx@^(QO zq+)>PlFRREwh_qrZ!PMTMsvDJX)ie@+^ESs7XbnPOhZ5W%*;<-qpvo&mPE>~%PT$H z_6*KbxNtGuhQd_MIHlUzDcnSL-OGcCZXiC+0b3UY$kIn)LOSb>Z#- z|Gh4o`C}!;e6@AFDU#66oC26w7|Ve>U|C;%E#cvpaQBth!vh0vBA2tz#v!_JB(j3; zT_F-T56FolvOGX*xsJGxMc80mZ5T&KSi$PfAZ+>ZR-C<&!u)e{c-87o)y%Nn23{B- z-cZNQSO%G=`!;RQ3GW(9nyW2dJ=k;~(cO$NZcgd6do*ZFh=rHv;j%dU6_xoXiCh_G z7J#+4Tv=uT4HevswgopPtTpMyeHiiw)VQoS)XXC86BC6?VAfaT1dNqOX))G=R2ilYy=SmGr&me6_)~cFz z3F}>)Ogk7RC|a$YwYhTz99i~RIk;Xz50TyHyY&my@Mbo#^#{BG_7WG~Ac#h`JX3rI zqf+xfOJfBSgV@YM+26{2v~t=-J`@>d&sokl`=!_iY&@t1ls zvI>Up~ zzJxTsYfu*lvE3SY18Y0(RNvMsjJ~fUSnqbk!L5HtqqnOT>XruTo*&SK-NsA0lP!ar z{xs8VH8$O@*kUAZ^(mc|=r=!B@DrRm!->0DP~5qgKY`E=U+b>3Fw9<5V6ycPM!9O0 zaP~wL0|#}aw2##(IyfLwnI%*v8z2k=giL|G0fh(@lH^t3Fm|2c7nq1J@%?c3Kv&iT zL1OvG|WP`x5K-5X9bDVCiG zst`Eb)=0DYt~y#tKW-7LXVlr-7j4jU0;DDYR^6?NSpSo&bW{uBkcHiqPT9vGaWs@O z)v6h󰌾 Logged in as $USER - hide_input = false - check_color = $accent - fail_color = $red - fail_text = $FAIL ($ATTEMPTS) - capslock_color = $yellow - position = 0, -47 - halign = center - valign = center -} diff --git a/input.conf b/input.conf deleted file mode 100644 index 6a18fbe..0000000 --- a/input.conf +++ /dev/null @@ -1,38 +0,0 @@ -input { - kb_layout = gb - follow_mouse = 1 - - touchpad { - natural_scroll = true - disable_while_typing = true - } - - sensitivity = -0.3 - force_no_accel = false - tablet { - left_handed = true - output = current - } -} - -cursor { - inactive_timeout = 2 - warp_on_change_workspace = 1 - hide_on_key_press = true - warp_on_toggle_special = 1 -} - -device { - name = 2.4g-wireless-optical-mouse--mouse - sensitivity = -0.65 - accel_profile = adaptive -} - -device { - name = wacom-bamboo-16fg-4x5-finger - flip_x = true - flip_y = true - natural_scroll = false - sensitivity = 0.3 - accel_profile = adaptive -} diff --git a/mocha.conf b/mocha.conf deleted file mode 100644 index 8ccb56a..0000000 --- a/mocha.conf +++ /dev/null @@ -1,78 +0,0 @@ - -$rosewater = rgb(f5e0dc) -$rosewaterAlpha = f5e0dc - -$flamingo = rgb(f2cdcd) -$flamingoAlpha = f2cdcd - -$pink = rgb(f5c2e7) -$pinkAlpha = f5c2e7 - -$mauve = rgb(cba6f7) -$mauveAlpha = cba6f7 - -$red = rgb(f38ba8) -$redAlpha = f38ba8 - -$maroon = rgb(eba0ac) -$maroonAlpha = eba0ac - -$peach = rgb(fab387) -$peachAlpha = fab387 - -$yellow = rgb(f9e2af) -$yellowAlpha = f9e2af - -$green = rgb(a6e3a1) -$greenAlpha = a6e3a1 - -$teal = rgb(94e2d5) -$tealAlpha = 94e2d5 - -$sky = rgb(89dceb) -$skyAlpha = 89dceb - -$sapphire = rgb(74c7ec) -$sapphireAlpha = 74c7ec - -$blue = rgb(89b4fa) -$blueAlpha = 89b4fa - -$lavender = rgb(b4befe) -$lavenderAlpha = b4befe - -$text = rgb(cdd6f4) -$textAlpha = cdd6f4 - -$subtext1 = rgb(bac2de) -$subtext1Alpha = bac2de - -$subtext0 = rgb(a6adc8) -$subtext0Alpha = a6adc8 - -$overlay2 = rgb(9399b2) -$overlay2Alpha = 9399b2 - -$overlay1 = rgb(7f849c) -$overlay1Alpha = 7f849c - -$overlay0 = rgb(6c7086) -$overlay0Alpha = 6c7086 - -$surface2 = rgb(585b70) -$surface2Alpha = 585b70 - -$surface1 = rgb(45475a) -$surface1Alpha = 45475a - -$surface0 = rgb(313244) -$surface0Alpha = 313244 - -$base = rgb(1e1e2e) -$baseAlpha = 1e1e2e - -$mantle = rgb(181825) -$mantleAlpha = 181825 - -$crust = rgb(11111b) -$crustAlpha = 11111b diff --git a/rules.conf b/rules.conf deleted file mode 100644 index 80dfb52..0000000 --- a/rules.conf +++ /dev/null @@ -1,155 +0,0 @@ -windowrule { - name = nodim-youtube - no_dim = on - opaque = on - match:class = ^(firefox|Firefox)$ - match:title = ^(.*YouTube.*)$ -} - -windowrule { - name = nodim-delfin - no_dim = on - opaque = on - match:class = ^(cafe.avery.Delfin)$ -} - -windowrule { - name = float-firefoxDialogue - float = on - match:title = ^(About Mozilla Firefox)$ -} - -windowrule { - name = file-browser - float = on - size = 800 500 - animation = popin - match:class = ^(xdg-desktop-portal-gtk)$ -} - -windowrule { - name = firefox-pip - float = on - match:class = ^(firefox)$ - match:title = ^(Picture-in-Picture)$ -} - -windowrule { - name = float-history - float = on - match:class = ^(firefox)$ - match:title = ^(Library)$ -} - -windowrule { - name = nwg-look - float = on - match:class = ^(nwg-look)$ -} - -windowrule { - name = volume-control - float = on - match:class = ^(org.pulseaudio.pavucontrol)$ -} - -windowrule { - name = blueman-size - float = on - size = 600 400 - animation = popin - match:class = ^(.blueman-manager-wrapped)$ -} - -windowrule { - name = float-nm - float = on - match:class = ^(nm-applet)$ -} - -windowrule { - name = float-nm - float = on - match:class = ^(nm-connection-editor)$ -} - -windowrule { - name = float-auth-agent - float = on - match:class = ^(org.kde.polkit-kde-authentication-agent-1)$ -} - -windowrule { - name = firefox-popups - size = 800 500 - animation = popin - match:class = ^(firefox)$ - match:title = ^(.*Save.*) -} - -windowrule { - name = otter-launcher-initial - size = 425 220 - float = on - opaque = on - animation = popin 50% - match:class = ^(otter)$ -} - -windowrule { - name = jellyfin tui - animation = slide top - match:class = ^(jf-tui)$ -} - -windowrule { - name = nodim-fullscreen - match:fullscreen = 1 - no_dim = on -} - -windowrule { - name = nodim-kitty - match:class = ^(kitty)$ - opaque = on - xray = on -} - -layerrule { - name = layerrule-1 - blur = on - ignore_alpha = 0 - match:namespace = notifications -} - -layerrule { - name = something to do with wlogout - blur = on - match:namespace = logout_dialog -} - -layerrule { - name = layerrule-3 - blur = on - ignore_alpha = 0 - match:namespace = waybar -} - -layerrule { - name = layerrule-4 - ignore_alpha = 0 - blur = on - animation = popin 70% - match:namespace = otter-panel -} - -layerrule { - name = layerrule-5 - animation = slide right - blur = on - ignore_alpha = 0 - match:namespace = swaync-control-center -} - -workspace = special:music, gapsout:5 400 400 400 -workspace = special:scratch, gapsout:20 20 20 20 diff --git a/startup.conf b/startup.conf deleted file mode 100644 index c9ac52d..0000000 --- a/startup.conf +++ /dev/null @@ -1,15 +0,0 @@ -exec-once = $scrPath/resetxdgportal.sh # reset XDPH for screenshare -exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP # for XDPH -exec-once = dbus-update-activation-environment --systemd --all # for XDPH -exec-once = dconf write /org/gnome/desktop/interface/color-scheme '"prefer-dark"' -exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP # for XDPH -exec-once = $scrPath/polkitkdeauth.sh # authentication dialogue for GUI apps -exec-once = waybar # System bar -exec-once = sleep 10 && curl -X POST -H "Content-Type: application/json" -d "{\"ref\":\"$(git -C ~/.dotfiles rev-parse HEAD)\", \"status\":\"$(git -C ~/.dotfiles diff --quiet && echo "clean" || echo "dirty")\"}" https://n8n.voidarc.co.uk/webhook/config-checker # check if config is up to date -exec-once = elephant # Data for Walker -exec-once = walker --gapplication-service # make walker faster -exec-once = dunst # Notifications -exec-once = ~/.config/scripts/.venv/bin/python ~/.config/scripts/notify.py # Android notification forwarding -exec-once = wayvnc 0.0.0.0 --output=DP-1 # runs vnc server on all interfaces -exec-once = syncthing -home=/home/user01/.config/syncthing -no-browser # starts syncthing in background -exec-once = gotify-desktop # gotify daemon for service notifications diff --git a/style.conf b/style.conf deleted file mode 100644 index 4d2d7d1..0000000 --- a/style.conf +++ /dev/null @@ -1,93 +0,0 @@ -# Environment -env = PATH,$PATH:$scrPath -env = XDG_CURRENT_DESKTOP,Hyprland -env = XDG_SESSION_TYPE,wayland -env = XDG_SESSION_DESKTOP,Hyprland -env = QT_QPA_PLATFORM,wayland;xcb -env = QT_QPA_PLATFORMTHEME,qt6ct -env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 -env = QT_AUTO_SCREEN_SCALE_FACTOR,1 -env = MOZ_ENABLE_WAYLAND,1 -env = GDK_SCALE,1 - -# Misc -misc { - vrr = 0 - animate_manual_resizes = true - disable_hyprland_logo = true - disable_splash_rendering = true - force_default_wallpaper = 0 -} - -xwayland { - force_zero_scaling = false -} - -# Layout -dwindle { - pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below - preserve_split = true # You probably want this - permanent_direction_override = true -} - -scrolling { - column_width = 0.8 - follow_min_visible = 0.1 - focus_fit_method = 1 -} - -# GTK shennanigans -exec = gsettings set org.gnome.desktop.interface icon-theme 'BeautyDream' -exec = gsettings set org.gnome.desktop.interface gtk-theme 'Catppuccin-Mocha' -exec = gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' - -# Make things look nice -general { - gaps_in = 3 - gaps_out = 5, 6, 6, 6 - border_size = 3 - col.active_border = rgba(ca9ee6cc) rgba(f38ba8cc) 45deg - col.inactive_border = rgba(45475aaa) rgba(b4befeaa) 45deg - layout = scrolling - resize_on_border = true -} - -ecosystem { - no_update_news = true - no_donation_nag = true -} - -group { - col.border_active = rgba(ca9ee6cc) rgba(f2d5cfcc) 45deg - col.border_inactive = rgba(bac2decc) rgba(bac2decc) 45deg - col.border_locked_active = rgba(ca9ee6ff) rgba(f2d5cfff) 45deg - col.border_locked_inactive = rgba(b4befecc) rgba(6c7086cc) 45deg -} - -decoration { - rounding = 10 - - active_opacity = 1.0 - inactive_opacity = 0.8 - - dim_inactive = true - dim_strength = 0.2 - - blur { - enabled = true - size = 2 - passes = 3 - vibrancy = 0.5 - } -} - -# Fonts and Cursors -exec = hyprctl setcursor Bibata-Modern-Ice 20 -exec = gsettings set org.gnome.desktop.interface cursor-theme 'Bibata-Modern-Ice' -exec = gsettings set org.gnome.desktop.interface cursor-size 20 -exec = gsettings set org.gnome.desktop.interface font-name 'FiraMono Nerd Font' -exec = gsettings set org.gnome.desktop.interface document-font-name 'Cantarell 10' -exec = gsettings set org.gnome.desktop.interface monospace-font-name 'CaskaydiaCove Nerd Font Mono 9' -exec = gsettings set org.gnome.desktop.interface font-antialiasing 'rgba' -exec = gsettings set org.gnome.desktop.interface font-hinting 'full' -env XCURSOR_SIZE = 20 diff --git a/windows.conf b/windows.conf deleted file mode 100644 index ddc927d..0000000 --- a/windows.conf +++ /dev/null @@ -1 +0,0 @@ -monitor = , preferred, auto, 1.2 From c93ddf3818f588d7e6ea16b86d0085b31314a07d Mon Sep 17 00:00:00 2001 From: voidarc Date: Tue, 12 May 2026 11:47:52 +0100 Subject: [PATCH 2/6] some nonsense --- .gitignore | 1 + .luarc.json | 10 ++++++++++ hyprland.lua | 1 + modules.lua | 28 ++++++++++++++++++++++++++++ modules/binds.lua | 8 ++++++++ modules/startup.lua | 4 ++++ 6 files changed, 52 insertions(+) create mode 100644 .gitignore create mode 100644 .luarc.json create mode 100644 modules.lua create mode 100644 modules/binds.lua create mode 100644 modules/startup.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f8011a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.session diff --git a/.luarc.json b/.luarc.json new file mode 100644 index 0000000..5dc4338 --- /dev/null +++ b/.luarc.json @@ -0,0 +1,10 @@ +{ + "workspace": { + "library": [ + "/nix/store/k1jc5h9ls6j600hcpjciqn0s29whas63-hyprland-0.55.0+date=2026-05-11_5e441ca/share/hypr/stubs/hl.meta.lua" + ] + }, + "diagnostics": { + "globals": ["hl"] + } +} diff --git a/hyprland.lua b/hyprland.lua index e69de29..98fbc8a 100644 --- a/hyprland.lua +++ b/hyprland.lua @@ -0,0 +1 @@ +require("modules") diff --git a/modules.lua b/modules.lua new file mode 100644 index 0000000..8bab8f7 --- /dev/null +++ b/modules.lua @@ -0,0 +1,28 @@ +-- loader.lua +local function get_modules() + local modules = {} + + -- -1: list one file per line + -- ../modules/*.lua: target sibling directory + local cmd = "ls -1 ../modules/*.lua 2>/dev/null" + + local p = io.popen(cmd) + if not p then + return modules + end + + for path in p:lines() do + -- Extract the filename between the last '/' and the '.lua' + local name = path:match("([^/]+)%.lua$") + if name then + table.insert(modules, name) + end + end + + p:close() + return modules +end + +-- Return the result of the function so require("loader") +-- gives you the table immediately. +return get_modules() diff --git a/modules/binds.lua b/modules/binds.lua new file mode 100644 index 0000000..20ad9aa --- /dev/null +++ b/modules/binds.lua @@ -0,0 +1,8 @@ +local mainMod = "SUPER + " +local binds = { + { key = "x", dispatch = "kitty" }, +} + +for _, bind in ipairs(binds) do + hl.bind(mainMod .. bind.key, hl.dsp.exec_cmd(bind.dispatch)) +end diff --git a/modules/startup.lua b/modules/startup.lua new file mode 100644 index 0000000..156555e --- /dev/null +++ b/modules/startup.lua @@ -0,0 +1,4 @@ +hl.on("hyprland.start", function() + hl.exec_cmd("waybar") + hl.exec_cmd("dunst") +end) From b45ba4f751ea0abb8fc202e2d523e6fe1ddff2d2 Mon Sep 17 00:00:00 2001 From: voidarc Date: Tue, 12 May 2026 20:06:37 +0100 Subject: [PATCH 3/6] loads of stuff but still not done yet --- autoload.lua | 21 +++ hyprland.lua | 288 +++++++++++++++++++++++++++++++- modules.lua | 28 ---- modules/binds.lua | 35 +++- modules/mocha.lua | 133 +++++++++++++++ modules/monitors.lua | 28 ++++ modules/settings.lua | 0 modules/settings/animations.lua | 1 + modules/settings/input.lua | 24 +++ modules/settings/style.lua | 37 ++++ modules/startup.lua | 15 +- 11 files changed, 576 insertions(+), 34 deletions(-) create mode 100644 autoload.lua delete mode 100644 modules.lua create mode 100644 modules/mocha.lua create mode 100644 modules/monitors.lua create mode 100644 modules/settings.lua create mode 100644 modules/settings/animations.lua create mode 100644 modules/settings/input.lua create mode 100644 modules/settings/style.lua diff --git a/autoload.lua b/autoload.lua new file mode 100644 index 0000000..2506db2 --- /dev/null +++ b/autoload.lua @@ -0,0 +1,21 @@ +-- ~/.config/hypr/autoload.lua + +local modules = os.getenv("HOME") .. "/.config/hypr/modules" + +local p = io.popen('find -L "' .. modules .. '" -name "*.lua" -type f | sort') +if not p then + return +end + +for path in p:lines() do + local ok, err = pcall(dofile, path) + if not ok then + hl.notification.create({ + text = "autoload: " .. path .. "\n" .. tostring(err), + timeout = 8000, + icon = "warning", + }) + end +end + +p:close() diff --git a/hyprland.lua b/hyprland.lua index 98fbc8a..3c81ce8 100644 --- a/hyprland.lua +++ b/hyprland.lua @@ -1 +1,287 @@ -require("modules") +local handle = io.popen("hostname") +Hostname = "unknown" -- Default fallback + +if handle then + local result = handle:read("*l") -- Read the first line + handle:close() + if result then + Hostname = result:gsub("%s+", "") -- Remove whitespace/newlines + end +end + +if Hostname == "HACKSTATION" then + hl.bind("SUPER + c", hl.dsp.exec_cmd("dunstify " .. tostring(Hostname))) +end + +require("autoload") + +-- This is an example Hyprland Lua config file. +-- Refer to the wiki for more information. +-- https://wiki.hypr.land/Configuring/Start/ + +-- Please note not all available settings / options are set here. +-- For a full list, see the wiki + +-- You can (and should!!) split this configuration into multiple files +-- Create your files separately and then require them like this: +-- require("myColors") + +------------------ +---- MONITORS ---- +------------------ + +-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ +hl.monitor({ + output = "", + mode = "preferred", + position = "auto", + scale = "auto", +}) + +--------------------- +---- MY PROGRAMS ---- +--------------------- + +-- Set programs that you use +local terminal = "kitty" +local fileManager = "dolphin" +local menu = "hyprlauncher" + +------------------- +---- AUTOSTART ---- +------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Autostart/ + +-- Autostart necessary processes (like notifications daemons, status bars, etc.) +-- Or execute your favorite apps at launch like this: +-- +-- hl.on("hyprland.start", function () +-- hl.exec_cmd(terminal) +-- hl.exec_cmd("nm-applet") +-- hl.exec_cmd("waybar & hyprpaper & firefox") +-- end) + +------------------------------- +---- ENVIRONMENT VARIABLES ---- +------------------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ + +hl.env("XCURSOR_SIZE", "24") +hl.env("HYPRCURSOR_SIZE", "24") + +----------------------- +----- PERMISSIONS ----- +----------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/ +-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly +-- for security reasons + +-- hl.config({ +-- ecosystem = { +-- enforce_permissions = true, +-- }, +-- }) + +-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow") +-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow") +-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow") + +----------------------- +---- LOOK AND FEEL ---- +----------------------- + +-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/ + +-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ +hl.curve("easeOutQuint", { type = "bezier", points = { { 0.23, 1 }, { 0.32, 1 } } }) +hl.curve("easeInOutCubic", { type = "bezier", points = { { 0.65, 0.05 }, { 0.36, 1 } } }) +hl.curve("linear", { type = "bezier", points = { { 0, 0 }, { 1, 1 } } }) +hl.curve("almostLinear", { type = "bezier", points = { { 0.5, 0.5 }, { 0.75, 1 } } }) +hl.curve("quick", { type = "bezier", points = { { 0.15, 0 }, { 0.1, 1 } } }) + +-- Default springs +hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 }) + +hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" }) +hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" }) +hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" }) +hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" }) +hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" }) +hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" }) +hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" }) +hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" }) +hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" }) +hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" }) +hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" }) +hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" }) +hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" }) +hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" }) + +-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ +-- "Smart gaps" / "No gaps when only" +-- uncomment all if you wish to use that. +-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 }) +-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 }) +-- hl.window_rule({ +-- name = "no-gaps-wtv1", +-- match = { float = false, workspace = "w[tv1]" }, +-- border_size = 0, +-- rounding = 0, +-- }) +-- hl.window_rule({ +-- name = "no-gaps-f1", +-- match = { float = false, workspace = "f[1]" }, +-- border_size = 0, +-- rounding = 0, +-- }) + +-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more +hl.config({ + dwindle = { + preserve_split = true, -- You probably want this + }, +}) + +-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more +hl.config({ + master = { + new_status = "master", + }, +}) + +-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more +hl.config({ + scrolling = { + fullscreen_on_one_column = true, + }, +}) + +---------------- +---- MISC ---- +---------------- + +hl.config({ + misc = { + force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :( + }, +}) +--------------------- +---- KEYBINDINGS ---- +--------------------- + +local mainMod = "SUPER" -- Sets "Windows" key as main modifier + +-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more + +-- Move focus with mainMod + arrow keys +hl.bind(mainMod .. " + h", hl.dsp.focus({ direction = "left" })) +hl.bind(mainMod .. " + l", hl.dsp.focus({ direction = "right" })) +hl.bind(mainMod .. " + k", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. " + j", hl.dsp.focus({ direction = "down" })) + +-- Switch workspaces with mainMod + [0-9] +-- Move active window to a workspace with mainMod + SHIFT + [0-9] +for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i })) + hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i })) +end + +-- Example special workspace (scratchpad) +hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic")) +hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" })) + +-- Scroll through existing workspaces with mainMod + scroll +hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) +hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) + +-- Move/resize windows with mainMod + LMB/RMB and dragging +hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true }) +hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true }) + +-- Laptop multimedia keys for volume and LCD brightness +hl.bind( + "XF86AudioRaiseVolume", + hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), + { locked = true, repeating = true } +) +hl.bind( + "XF86AudioLowerVolume", + hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), + { locked = true, repeating = true } +) +hl.bind( + "XF86AudioMute", + hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), + { locked = true, repeating = true } +) +hl.bind( + "XF86AudioMicMute", + hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), + { locked = true, repeating = true } +) +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true }) +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true }) + +-- Requires playerctl +hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true }) +hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) +hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) +hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true }) + +-------------------------------- +---- WINDOWS AND WORKSPACES ---- +-------------------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ +-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + +-- Example window rules that are useful + +local suppressMaximizeRule = hl.window_rule({ + -- Ignore maximize requests from all apps. You'll probably like this. + name = "suppress-maximize-events", + match = { class = ".*" }, + + suppress_event = "maximize", +}) +-- suppressMaximizeRule:set_enabled(false) + +hl.window_rule({ + -- Fix some dragging issues with XWayland + name = "fix-xwayland-drags", + match = { + class = "^$", + title = "^$", + xwayland = true, + float = true, + fullscreen = false, + pin = false, + }, + + no_focus = true, +}) + +-- Layer rules also return a handle. +-- local overlayLayerRule = hl.layer_rule({ +-- name = "no-anim-overlay", +-- match = { namespace = "^my-overlay$" }, +-- no_anim = true, +-- }) +-- overlayLayerRule:set_enabled(false) + +-- Hyprland-run windowrule +hl.window_rule({ + name = "move-hyprland-run", + match = { class = "hyprland-run" }, + + move = "20 monitor_h-120", + float = true, +}) diff --git a/modules.lua b/modules.lua deleted file mode 100644 index 8bab8f7..0000000 --- a/modules.lua +++ /dev/null @@ -1,28 +0,0 @@ --- loader.lua -local function get_modules() - local modules = {} - - -- -1: list one file per line - -- ../modules/*.lua: target sibling directory - local cmd = "ls -1 ../modules/*.lua 2>/dev/null" - - local p = io.popen(cmd) - if not p then - return modules - end - - for path in p:lines() do - -- Extract the filename between the last '/' and the '.lua' - local name = path:match("([^/]+)%.lua$") - if name then - table.insert(modules, name) - end - end - - p:close() - return modules -end - --- Return the result of the function so require("loader") --- gives you the table immediately. -return get_modules() diff --git a/modules/binds.lua b/modules/binds.lua index 20ad9aa..b53b3c0 100644 --- a/modules/binds.lua +++ b/modules/binds.lua @@ -1,8 +1,37 @@ local mainMod = "SUPER + " -local binds = { - { key = "x", dispatch = "kitty" }, +local subMod = mainMod +local keyboardString = "qwertyuiop" + +if Hostname == "mobile02" then + mainMod = "ALT + " + subMod = "SUPER + " + keyboardString = "1234567890" +end + +-- Delete windows +hl.bind(mainMod .. " + backspace", hl.dsp.window.close()) + +-- Open windows +local globalAppBinds = { + { key = "RETURN", dispatch = "kitty" }, + { key = "f", dispatch = "firefox" }, + { key = "s", dispatch = "nemo" }, } -for _, bind in ipairs(binds) do +for _, bind in ipairs(globalAppBinds) do hl.bind(mainMod .. bind.key, hl.dsp.exec_cmd(bind.dispatch)) end + +-- Workspace functions +local keyboardSplit = {} + +for char in keyboardString:gmatch(".") do + table.insert(keyboardSplit, char) +end + +for index, bind in ipairs(keyboardSplit) do + hl.bind(mainMod .. bind, hl.dsp.focus({ workspace = index })) + hl.bind(mainMod .. "SHIFT + " .. bind, hl.dsp.window.move({ workspace = index, follow = false })) +end + +-- Move windows with hjkl diff --git a/modules/mocha.lua b/modules/mocha.lua new file mode 100644 index 0000000..f21d444 --- /dev/null +++ b/modules/mocha.lua @@ -0,0 +1,133 @@ +return { + name = "mocha", + rosewater = { + hex = "#f5e0dc", + rgb = { 245, 224, 220 }, + hsl = { 10, 0.56, 0.91 }, + }, + flamingo = { + hex = "#f2cdcd", + rgb = { 242, 205, 205 }, + hsl = { 0, 0.59, 0.88 }, + }, + pink = { + hex = "#f5c2e7", + rgb = { 245, 194, 231 }, + hsl = { 316, 0.72, 0.86 }, + }, + mauve = { + hex = "#cba6f7", + rgb = { 203, 166, 247 }, + hsl = { 267, 0.84, 0.81 }, + }, + red = { + hex = "#f38ba8", + rgb = { 243, 139, 168 }, + hsl = { 343, 0.81, 0.75 }, + }, + maroon = { + hex = "#eba0ac", + rgb = { 235, 160, 172 }, + hsl = { 350, 0.65, 0.77 }, + }, + peach = { + hex = "#fab387", + rgb = { 250, 179, 135 }, + hsl = { 23, 0.92, 0.75 }, + }, + yellow = { + hex = "#f9e2af", + rgb = { 249, 226, 175 }, + hsl = { 41, 0.86, 0.83 }, + }, + green = { + hex = "#a6e3a1", + rgb = { 166, 227, 161 }, + hsl = { 115, 0.54, 0.76 }, + }, + teal = { + hex = "#94e2d5", + rgb = { 148, 226, 213 }, + hsl = { 170, 0.57, 0.73 }, + }, + sky = { + hex = "#89dceb", + rgb = { 137, 220, 235 }, + hsl = { 189, 0.71, 0.73 }, + }, + sapphire = { + hex = "#74c7ec", + rgb = { 116, 199, 236 }, + hsl = { 199, 0.76, 0.69 }, + }, + blue = { + hex = "#89b4fa", + rgb = { 137, 180, 250 }, + hsl = { 217, 0.92, 0.76 }, + }, + lavender = { + hex = "#b4befe", + rgb = { 180, 190, 254 }, + hsl = { 232, 0.97, 0.85 }, + }, + text = { + hex = "#cdd6f4", + rgb = { 205, 214, 244 }, + hsl = { 226, 0.64, 0.88 }, + }, + subtext1 = { + hex = "#bac2de", + rgb = { 186, 194, 222 }, + hsl = { 227, 0.35, 0.80 }, + }, + subtext0 = { + hex = "#a6adc8", + rgb = { 166, 173, 200 }, + hsl = { 228, 0.24, 0.72 }, + }, + overlay2 = { + hex = "#9399b2", + rgb = { 147, 153, 178 }, + hsl = { 228, 0.17, 0.64 }, + }, + overlay1 = { + hex = "#7f849c", + rgb = { 127, 132, 156 }, + hsl = { 230, 0.13, 0.55 }, + }, + overlay0 = { + hex = "#6c7086", + rgb = { 108, 112, 134 }, + hsl = { 231, 0.11, 0.47 }, + }, + surface2 = { + hex = "#585b70", + rgb = { 88, 91, 112 }, + hsl = { 233, 0.12, 0.39 }, + }, + surface1 = { + hex = "#45475a", + rgb = { 69, 71, 90 }, + hsl = { 234, 0.13, 0.31 }, + }, + surface0 = { + hex = "#313244", + rgb = { 49, 50, 68 }, + hsl = { 237, 0.16, 0.23 }, + }, + base = { + hex = "#1e1e2e", + rgb = { 30, 30, 46 }, + hsl = { 240, 0.21, 0.15 }, + }, + mantle = { + hex = "#181825", + rgb = { 24, 24, 37 }, + hsl = { 240, 0.21, 0.12 }, + }, + crust = { + hex = "#11111b", + rgb = { 17, 17, 27 }, + hsl = { 240, 0.23, 0.09 }, + }, +} diff --git a/modules/monitors.lua b/modules/monitors.lua new file mode 100644 index 0000000..bcb90c5 --- /dev/null +++ b/modules/monitors.lua @@ -0,0 +1,28 @@ +if Hostname == "HACKSTATION" then + hl.monitor({ + output = "DP-1", + position = "0x0", + mode = "1920x1080@60", + scale = "1", + }) + + hl.monitor({ + output = "DP-2", + position = "1920x0", + mode = "1920x1080@60", + scale = "1", + }) + + hl.monitor({ + output = "HDMI-A-1", + position = "-1920x0", + mode = "1920x1080@60", + scale = "1", + }) + + hl.workspace_rule({ workspace = "1", monitor = "DP-1" }) + hl.workspace_rule({ workspace = "2", monitor = "HDMI-A-1" }) + hl.workspace_rule({ workspace = "3", monitor = "DP-2" }) +else + hl.monitor({ output = "", mode = "preferred", position = "auto", scale = "1.2" }) +end diff --git a/modules/settings.lua b/modules/settings.lua new file mode 100644 index 0000000..e69de29 diff --git a/modules/settings/animations.lua b/modules/settings/animations.lua new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/modules/settings/animations.lua @@ -0,0 +1 @@ + diff --git a/modules/settings/input.lua b/modules/settings/input.lua new file mode 100644 index 0000000..28df91d --- /dev/null +++ b/modules/settings/input.lua @@ -0,0 +1,24 @@ +hl.config({ + input = { + kb_layout = "gb", + follow_mouse = 1, + + touchpad = { + natural_scroll = true, + disable_while_typing = true, + }, + + sensitivity = -0.3, + force_no_accel = false, + tablet = { + left_handed = true, + output = "current", + }, + }, + cursor = { + inactive_timeout = 2, + warp_on_change_workspace = 1, + hide_on_key_press = true, + warp_on_toggle_special = 1, + }, +}) diff --git a/modules/settings/style.lua b/modules/settings/style.lua new file mode 100644 index 0000000..2c5d186 --- /dev/null +++ b/modules/settings/style.lua @@ -0,0 +1,37 @@ +local ctp = require("modules.mocha") +hl.config({ + general = { + gaps_in = 3, + resize_on_border = true, + gaps_out = { top = 5, right = 6, bottom = 6, left = 6 }, + border_size = 3, + layout = "scrolling", + col = { + active_border = { + colors = { "rgba(" .. ctp.mauve.hex:sub(2) .. "cc)", "rgba(" .. ctp.red.hex:sub(2) .. "cc)" }, + angle = 45, + }, + inactive_border = { + colors = { "rgba(" .. ctp.surface1.hex:sub(2) .. "cc)", "rgba(" .. ctp.lavender.hex:sub(2) .. "cc)" }, + angle = 45, + }, + }, + }, + decoration = { + rounding = 10, + rounding_power = 2, + + -- Change transparency of focused and unfocused windows + active_opacity = 1.0, + inactive_opacity = 0.8, + dim_inactive = true, + dim_strength = 0.2, + + blur = { + enabled = true, + size = 2, + passes = 3, + vibrancy = 0.5, + }, + }, +}) diff --git a/modules/startup.lua b/modules/startup.lua index 156555e..6e58604 100644 --- a/modules/startup.lua +++ b/modules/startup.lua @@ -1,4 +1,15 @@ +local appList = { + "waybar", + "dunst", + "wpaperd -d", + "wayvnc 0.0.0.0 --output=DP-1", + "syncthing -home=/home/user01/.config/syncthing -no-browser", + "gotify-desktop", + "sleep 10 && curl -X POST -H 'Content-Type: application/json' -d '{'ref':'$(git -C ~/.dotfiles rev-parse HEAD)', 'status':'$(git -C ~/.dotfiles diff --quiet && echo 'clean' || echo 'dirty')'}' https://n8n.voidarc.co.uk/webhook/config-checker", +} + hl.on("hyprland.start", function() - hl.exec_cmd("waybar") - hl.exec_cmd("dunst") + for _, command in ipairs(appList) do + hl.exec_cmd(command) + end end) From 92e9dd1b8e82bb4debccca81623c2f915793d311 Mon Sep 17 00:00:00 2001 From: voidarc Date: Tue, 12 May 2026 21:26:58 +0100 Subject: [PATCH 4/6] did a load of stuff for no reason --- autoload.lua | 3 ++ hyprland.lua | 56 ------------------------------------ modules/.luarc.json | 10 +++++++ modules/binds.lua | 25 +++++++++++++--- modules/settings.lua | 0 modules/settings/.luarc.json | 10 +++++++ modules/settings/style.lua | 23 +++++++++++++++ 7 files changed, 67 insertions(+), 60 deletions(-) create mode 100644 modules/.luarc.json delete mode 100644 modules/settings.lua create mode 100644 modules/settings/.luarc.json diff --git a/autoload.lua b/autoload.lua index 2506db2..7b87b89 100644 --- a/autoload.lua +++ b/autoload.lua @@ -1,12 +1,15 @@ -- ~/.config/hypr/autoload.lua +-- Path to search local modules = os.getenv("HOME") .. "/.config/hypr/modules" +-- Get all files in modules dir local p = io.popen('find -L "' .. modules .. '" -name "*.lua" -type f | sort') if not p then return end +-- Recursively search and return modules for path in p:lines() do local ok, err = pcall(dofile, path) if not ok then diff --git a/hyprland.lua b/hyprland.lua index 3c81ce8..37096fa 100644 --- a/hyprland.lua +++ b/hyprland.lua @@ -15,62 +15,6 @@ end require("autoload") --- This is an example Hyprland Lua config file. --- Refer to the wiki for more information. --- https://wiki.hypr.land/Configuring/Start/ - --- Please note not all available settings / options are set here. --- For a full list, see the wiki - --- You can (and should!!) split this configuration into multiple files --- Create your files separately and then require them like this: --- require("myColors") - ------------------- ----- MONITORS ---- ------------------- - --- See https://wiki.hypr.land/Configuring/Basics/Monitors/ -hl.monitor({ - output = "", - mode = "preferred", - position = "auto", - scale = "auto", -}) - ---------------------- ----- MY PROGRAMS ---- ---------------------- - --- Set programs that you use -local terminal = "kitty" -local fileManager = "dolphin" -local menu = "hyprlauncher" - -------------------- ----- AUTOSTART ---- -------------------- - --- See https://wiki.hypr.land/Configuring/Basics/Autostart/ - --- Autostart necessary processes (like notifications daemons, status bars, etc.) --- Or execute your favorite apps at launch like this: --- --- hl.on("hyprland.start", function () --- hl.exec_cmd(terminal) --- hl.exec_cmd("nm-applet") --- hl.exec_cmd("waybar & hyprpaper & firefox") --- end) - -------------------------------- ----- ENVIRONMENT VARIABLES ---- -------------------------------- - --- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ - -hl.env("XCURSOR_SIZE", "24") -hl.env("HYPRCURSOR_SIZE", "24") - ----------------------- ----- PERMISSIONS ----- ----------------------- diff --git a/modules/.luarc.json b/modules/.luarc.json new file mode 100644 index 0000000..5dc4338 --- /dev/null +++ b/modules/.luarc.json @@ -0,0 +1,10 @@ +{ + "workspace": { + "library": [ + "/nix/store/k1jc5h9ls6j600hcpjciqn0s29whas63-hyprland-0.55.0+date=2026-05-11_5e441ca/share/hypr/stubs/hl.meta.lua" + ] + }, + "diagnostics": { + "globals": ["hl"] + } +} diff --git a/modules/binds.lua b/modules/binds.lua index b53b3c0..862564b 100644 --- a/modules/binds.lua +++ b/modules/binds.lua @@ -1,25 +1,42 @@ +-- Set modifier keys local mainMod = "SUPER + " local subMod = mainMod local keyboardString = "qwertyuiop" +local keybindIndex = 1 +-- Set different modifiers on laptop if Hostname == "mobile02" then mainMod = "ALT + " subMod = "SUPER + " keyboardString = "1234567890" + keybindIndex = 2 end -- Delete windows hl.bind(mainMod .. " + backspace", hl.dsp.window.close()) +hl.bind(mainMod .. "d", function() + hl.notification.create({ text = tostring(hl.get_windows({ class = "otter" })[1]), timeout = 3000, icon = "ok" }) + if hl.get_windows({ class = "otter" })[1] ~= nil then + hl.dsp.focus({ window = { class = "otter" } }) + else + hl.exec_cmd("kitty --class otter --title otter-launcher -e sh -c 'sleep 0.05 && otter-launcher'") + end +end) + -- Open windows local globalAppBinds = { - { key = "RETURN", dispatch = "kitty" }, - { key = "f", dispatch = "firefox" }, - { key = "s", dispatch = "nemo" }, + { key = { "RETURN" }, dispatch = "kitty" }, + { key = { "f", "o" }, dispatch = "firefox" }, + { key = { "s" }, dispatch = "nemo" }, } for _, bind in ipairs(globalAppBinds) do - hl.bind(mainMod .. bind.key, hl.dsp.exec_cmd(bind.dispatch)) + if bind.key[keybindIndex] then + hl.bind(mainMod .. bind.key[keybindIndex], hl.dsp.exec_cmd(bind.dispatch)) + else + hl.bind(mainMod .. bind.key[1], hl.dsp.exec_cmd(bind.dispatch)) + end end -- Workspace functions diff --git a/modules/settings.lua b/modules/settings.lua deleted file mode 100644 index e69de29..0000000 diff --git a/modules/settings/.luarc.json b/modules/settings/.luarc.json new file mode 100644 index 0000000..5dc4338 --- /dev/null +++ b/modules/settings/.luarc.json @@ -0,0 +1,10 @@ +{ + "workspace": { + "library": [ + "/nix/store/k1jc5h9ls6j600hcpjciqn0s29whas63-hyprland-0.55.0+date=2026-05-11_5e441ca/share/hypr/stubs/hl.meta.lua" + ] + }, + "diagnostics": { + "globals": ["hl"] + } +} diff --git a/modules/settings/style.lua b/modules/settings/style.lua index 2c5d186..3a97fbc 100644 --- a/modules/settings/style.lua +++ b/modules/settings/style.lua @@ -1,5 +1,8 @@ +-- Import catppuccin colors local ctp = require("modules.mocha") hl.config({ + + -- gaps and colors general = { gaps_in = 3, resize_on_border = true, @@ -17,6 +20,17 @@ hl.config({ }, }, }, + + -- Scrolling layout settings + scrolling = { + column_width = 0.8, + follow_min_visible = 0.1, + focus_fit_method = 0, + wrap_focus = false, + wrap_swapcol = false, + }, + + -- Window appearence decoration = { rounding = 10, rounding_power = 2, @@ -34,4 +48,13 @@ hl.config({ vibrancy = 0.5, }, }, + + -- Remove irritants + ecosystem = { + no_update_news = true, + no_donation_nag = true, + }, }) + +hl.env("XCURSOR_SIZE", "20") +hl.env("HYPRCURSOR_SIZE", "20") From f678372ee4ca764ff2b92d287048b5765032bb1e Mon Sep 17 00:00:00 2001 From: voidarc Date: Wed, 13 May 2026 12:39:49 +0100 Subject: [PATCH 5/6] minimum functionality restored kinda --- hyprland.lua | 10 ------ modules/binds.lua | 67 ++++++++++++++++++++++++++++++++++++-- modules/rules.lua | 22 +++++++++++++ modules/settings/style.lua | 2 +- 4 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 modules/rules.lua diff --git a/hyprland.lua b/hyprland.lua index 37096fa..ddf92b2 100644 --- a/hyprland.lua +++ b/hyprland.lua @@ -125,18 +125,8 @@ local mainMod = "SUPER" -- Sets "Windows" key as main modifier -- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more -- Move focus with mainMod + arrow keys -hl.bind(mainMod .. " + h", hl.dsp.focus({ direction = "left" })) -hl.bind(mainMod .. " + l", hl.dsp.focus({ direction = "right" })) -hl.bind(mainMod .. " + k", hl.dsp.focus({ direction = "up" })) -hl.bind(mainMod .. " + j", hl.dsp.focus({ direction = "down" })) - -- Switch workspaces with mainMod + [0-9] -- Move active window to a workspace with mainMod + SHIFT + [0-9] -for i = 1, 10 do - local key = i % 10 -- 10 maps to key 0 - hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i })) - hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i })) -end -- Example special workspace (scratchpad) hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic")) diff --git a/modules/binds.lua b/modules/binds.lua index 862564b..09507ef 100644 --- a/modules/binds.lua +++ b/modules/binds.lua @@ -15,10 +15,10 @@ end -- Delete windows hl.bind(mainMod .. " + backspace", hl.dsp.window.close()) +-- If otter is open, focus it, if not make a new window hl.bind(mainMod .. "d", function() - hl.notification.create({ text = tostring(hl.get_windows({ class = "otter" })[1]), timeout = 3000, icon = "ok" }) if hl.get_windows({ class = "otter" })[1] ~= nil then - hl.dsp.focus({ window = { class = "otter" } }) + hl.dispatch(hl.dsp.focus({ window = "class:otter" })) else hl.exec_cmd("kitty --class otter --title otter-launcher -e sh -c 'sleep 0.05 && otter-launcher'") end @@ -51,4 +51,67 @@ for index, bind in ipairs(keyboardSplit) do hl.bind(mainMod .. "SHIFT + " .. bind, hl.dsp.window.move({ workspace = index, follow = false })) end +-- Music workspace +hl.bind(mainMod .. "m", hl.dsp.workspace.toggle_special("music")) + -- Move windows with hjkl +hl.bind(mainMod .. "SHIFT + h", hl.dsp.layout("swapcol l")) +hl.bind(mainMod .. "SHIFT + l", hl.dsp.layout("swapcol r")) +hl.bind(mainMod .. "k", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. "j", hl.dsp.focus({ direction = "down" })) + +-- Function to get window position relative to monitor +local function normalise_current_window_pos() + local active = hl.get_active_window() + if active then + local xpos = active.at.x + -- If on right monitor + if xpos > 1920 then + xpos = xpos - 1920 + return xpos + -- If on left monitor + elseif xpos < 1 then + xpos = xpos + 1920 + return xpos + else + return xpos + end + end +end + +hl.bind(mainMod .. "h", function() + local pos = normalise_current_window_pos() + if pos then + -- 9 derived from 5 gap plus 3 border (8), so first pixel of window is 9 + if pos == 9 then + -- If first window, then move to monitor to the left + hl.dispatch(hl.dsp.focus({ monitor = "-1" })) + end + end + hl.dispatch(hl.dsp.layout("move -col")) +end) + +hl.bind(mainMod .. "l", function() + -- Move before so you can detect if it is the last window + hl.dispatch(hl.dsp.layout("move +col")) + if not normalise_current_window_pos() then + -- Go back a window + hl.dispatch(hl.dsp.layout("move -col")) + -- Move to monitor to the right + hl.dispatch(hl.dsp.focus({ monitor = "+1" })) + end +end) + +-- Fullscreen with b +hl.bind(mainMod .. "b", hl.dsp.window.fullscreen({ action = "toggle" })) + +-- Special workspace +hl.bind(mainMod .. "minus", hl.dsp.workspace.toggle_special("scratch")) +hl.bind(mainMod .. "SHIFT + minus", hl.dsp.window.move({ workspace = "special:scratch", follow = false })) + +-- Float resize and move window with mouse +hl.bind(subMod .. "mouse:272", hl.dsp.window.drag(), { mouse = true, drag = true }) +hl.bind(subMod .. "mouse:272", hl.dsp.window.float(), { mouse = true, click = true }) +hl.bind(subMod .. "mouse:272", hl.dsp.layout("promote"), { mouse = true, release = true }) + +hl.bind(subMod .. "SHIFT + mouse:272", hl.dsp.window.resize(), { mouse = true }) diff --git a/modules/rules.lua b/modules/rules.lua new file mode 100644 index 0000000..d8c0114 --- /dev/null +++ b/modules/rules.lua @@ -0,0 +1,22 @@ +hl.window_rule({ + name = "otter-launcher", + match = { + class = "otter", + }, + float = true, + size = { 410, 220 }, + opaque = true, +}) + +hl.window_rule({ + name = "nodim-youtube", +}) + +hl.workspace_rule({ + workspace = "special:music", + gaps_out = { + left = 400, + right = 400, + bottom = 400, + }, +}) diff --git a/modules/settings/style.lua b/modules/settings/style.lua index 3a97fbc..55bac43 100644 --- a/modules/settings/style.lua +++ b/modules/settings/style.lua @@ -25,7 +25,7 @@ hl.config({ scrolling = { column_width = 0.8, follow_min_visible = 0.1, - focus_fit_method = 0, + focus_fit_method = 1, wrap_focus = false, wrap_swapcol = false, }, From 0909e98a03e4fa49deeef4bcc6bf95b5b88fdd81 Mon Sep 17 00:00:00 2001 From: voidarc Date: Wed, 13 May 2026 19:49:14 +0100 Subject: [PATCH 6/6] full functionality restored (omg) --- autoload.lua | 1 + hyprland.lua | 212 +------------------------------- modules/binds.lua | 4 +- modules/events.lua | 32 +++++ modules/rules.lua | 74 +++++++++++ modules/settings/animations.lua | 76 ++++++++++++ modules/settings/input.lua | 33 +++-- modules/startup.lua | 15 --- 8 files changed, 210 insertions(+), 237 deletions(-) create mode 100644 modules/events.lua delete mode 100644 modules/startup.lua diff --git a/autoload.lua b/autoload.lua index 7b87b89..19e210b 100644 --- a/autoload.lua +++ b/autoload.lua @@ -12,6 +12,7 @@ end -- Recursively search and return modules for path in p:lines() do local ok, err = pcall(dofile, path) + -- If you fucked up the syntax like an idiot if not ok then hl.notification.create({ text = "autoload: " .. path .. "\n" .. tostring(err), diff --git a/hyprland.lua b/hyprland.lua index ddf92b2..3f2eae0 100644 --- a/hyprland.lua +++ b/hyprland.lua @@ -1,6 +1,8 @@ +-- Get hostname from envvars or something local handle = io.popen("hostname") Hostname = "unknown" -- Default fallback +-- If there is a hostname at all if handle then local result = handle:read("*l") -- Read the first line handle:close() @@ -9,213 +11,5 @@ if handle then end end -if Hostname == "HACKSTATION" then - hl.bind("SUPER + c", hl.dsp.exec_cmd("dunstify " .. tostring(Hostname))) -end - +-- Import everything else require("autoload") - ------------------------ ------ PERMISSIONS ----- ------------------------ - --- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/ --- Please note permission changes here require a Hyprland restart and are not applied on-the-fly --- for security reasons - --- hl.config({ --- ecosystem = { --- enforce_permissions = true, --- }, --- }) - --- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow") --- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow") --- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow") - ------------------------ ----- LOOK AND FEEL ---- ------------------------ - --- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/ - --- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ -hl.curve("easeOutQuint", { type = "bezier", points = { { 0.23, 1 }, { 0.32, 1 } } }) -hl.curve("easeInOutCubic", { type = "bezier", points = { { 0.65, 0.05 }, { 0.36, 1 } } }) -hl.curve("linear", { type = "bezier", points = { { 0, 0 }, { 1, 1 } } }) -hl.curve("almostLinear", { type = "bezier", points = { { 0.5, 0.5 }, { 0.75, 1 } } }) -hl.curve("quick", { type = "bezier", points = { { 0.15, 0 }, { 0.1, 1 } } }) - --- Default springs -hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 }) - -hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" }) -hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" }) -hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" }) -hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" }) -hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" }) -hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" }) -hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" }) -hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" }) -hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" }) -hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" }) -hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" }) -hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" }) -hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" }) -hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) -hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" }) -hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) -hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" }) - --- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ --- "Smart gaps" / "No gaps when only" --- uncomment all if you wish to use that. --- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 }) --- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 }) --- hl.window_rule({ --- name = "no-gaps-wtv1", --- match = { float = false, workspace = "w[tv1]" }, --- border_size = 0, --- rounding = 0, --- }) --- hl.window_rule({ --- name = "no-gaps-f1", --- match = { float = false, workspace = "f[1]" }, --- border_size = 0, --- rounding = 0, --- }) - --- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more -hl.config({ - dwindle = { - preserve_split = true, -- You probably want this - }, -}) - --- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more -hl.config({ - master = { - new_status = "master", - }, -}) - --- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more -hl.config({ - scrolling = { - fullscreen_on_one_column = true, - }, -}) - ----------------- ----- MISC ---- ----------------- - -hl.config({ - misc = { - force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers - disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :( - }, -}) ---------------------- ----- KEYBINDINGS ---- ---------------------- - -local mainMod = "SUPER" -- Sets "Windows" key as main modifier - --- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more - --- Move focus with mainMod + arrow keys --- Switch workspaces with mainMod + [0-9] --- Move active window to a workspace with mainMod + SHIFT + [0-9] - --- Example special workspace (scratchpad) -hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic")) -hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" })) - --- Scroll through existing workspaces with mainMod + scroll -hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) -hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) - --- Move/resize windows with mainMod + LMB/RMB and dragging -hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true }) -hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true }) - --- Laptop multimedia keys for volume and LCD brightness -hl.bind( - "XF86AudioRaiseVolume", - hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), - { locked = true, repeating = true } -) -hl.bind( - "XF86AudioLowerVolume", - hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), - { locked = true, repeating = true } -) -hl.bind( - "XF86AudioMute", - hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), - { locked = true, repeating = true } -) -hl.bind( - "XF86AudioMicMute", - hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), - { locked = true, repeating = true } -) -hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true }) -hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true }) - --- Requires playerctl -hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true }) -hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) -hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) -hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true }) - --------------------------------- ----- WINDOWS AND WORKSPACES ---- --------------------------------- - --- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ --- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ - --- Example window rules that are useful - -local suppressMaximizeRule = hl.window_rule({ - -- Ignore maximize requests from all apps. You'll probably like this. - name = "suppress-maximize-events", - match = { class = ".*" }, - - suppress_event = "maximize", -}) --- suppressMaximizeRule:set_enabled(false) - -hl.window_rule({ - -- Fix some dragging issues with XWayland - name = "fix-xwayland-drags", - match = { - class = "^$", - title = "^$", - xwayland = true, - float = true, - fullscreen = false, - pin = false, - }, - - no_focus = true, -}) - --- Layer rules also return a handle. --- local overlayLayerRule = hl.layer_rule({ --- name = "no-anim-overlay", --- match = { namespace = "^my-overlay$" }, --- no_anim = true, --- }) --- overlayLayerRule:set_enabled(false) - --- Hyprland-run windowrule -hl.window_rule({ - name = "move-hyprland-run", - match = { class = "hyprland-run" }, - - move = "20 monitor_h-120", - float = true, -}) diff --git a/modules/binds.lua b/modules/binds.lua index 09507ef..4d5fdb4 100644 --- a/modules/binds.lua +++ b/modules/binds.lua @@ -51,6 +51,8 @@ for index, bind in ipairs(keyboardSplit) do hl.bind(mainMod .. "SHIFT + " .. bind, hl.dsp.window.move({ workspace = index, follow = false })) end + + -- Music workspace hl.bind(mainMod .. "m", hl.dsp.workspace.toggle_special("music")) @@ -110,7 +112,7 @@ hl.bind(mainMod .. "minus", hl.dsp.workspace.toggle_special("scratch")) hl.bind(mainMod .. "SHIFT + minus", hl.dsp.window.move({ workspace = "special:scratch", follow = false })) -- Float resize and move window with mouse -hl.bind(subMod .. "mouse:272", hl.dsp.window.drag(), { mouse = true, drag = true }) +hl.bind(subMod .. "mouse:272", hl.dsp.window.drag(), { mouse = true }) hl.bind(subMod .. "mouse:272", hl.dsp.window.float(), { mouse = true, click = true }) hl.bind(subMod .. "mouse:272", hl.dsp.layout("promote"), { mouse = true, release = true }) diff --git a/modules/events.lua b/modules/events.lua new file mode 100644 index 0000000..9b40e3e --- /dev/null +++ b/modules/events.lua @@ -0,0 +1,32 @@ +local appList = { + "waybar", + "dunst", + "wpaperd -d", + "wayvnc 0.0.0.0 --output=DP-1", + "syncthing -home=/home/user01/.config/syncthing -no-browser", + "gotify-desktop", + "sleep 10 && curl -X POST -H 'Content-Type: application/json' -d '{'ref':'$(git -C ~/.dotfiles rev-parse HEAD)', 'status':'$(git -C ~/.dotfiles diff --quiet && echo 'clean' || echo 'dirty')'}' https://n8n.voidarc.co.uk/webhook/config-checker", +} + +local localAppList +if Hostname == "HACKSTATION" then + -- If on desktop do all the decoration nonsense + localAppList = { + "kitten panel --edge=background -o background_opacity=0 --output-name HDMI-A-1 sh -c 'cmatrix -b -C magenta -a -u 10'", + "kitten panel --edge=background -o background_opacity=0 --output-name DP-2 sh -c 'cava'", + } +elseif Hostname == "mobile02" then + -- If on laptop, launch way-edges + localAppList = { + "way-edges", + } +end + +table.insert(appList, localAppList) + +-- For everything in the applist run it on startup +hl.on("hyprland.start", function() + for _, command in ipairs(appList) do + hl.exec_cmd(command) + end +end) diff --git a/modules/rules.lua b/modules/rules.lua index d8c0114..be323ab 100644 --- a/modules/rules.lua +++ b/modules/rules.lua @@ -1,17 +1,66 @@ +-- Size for otter launcher hl.window_rule({ name = "otter-launcher", match = { class = "otter", }, float = true, + animation = "popin 80%", size = { 410, 220 }, opaque = true, }) +-- Dont dim youtube windows hl.window_rule({ name = "nodim-youtube", + match = { + class = "^(firefox|Firefox)$", + title = "^(.*YouTube.*)$", + }, + no_dim = true, + opaque = true, }) +-- Define windows that float +local standardFloatingWindows = { + { class = "^(xdg-desktop-portal-gtk)$" }, + { class = "^(firefox)$", title = "^(.*Save.*)" }, +} + +-- For every window that floats make a rule +for _, window in ipairs(standardFloatingWindows) do + hl.window_rule({ + name = "float file selector", + match = { + -- both are optional ig + class = window.class or "", + title = window.title or "", + }, + float = true, + animation = "popin 70%", + size = { 800, 500 }, + }) +end + +-- Don't dim fullscreen windows +hl.window_rule({ + name = "nodim fullscreen", + match = { + fullscreen = true, + }, + no_dim = true, + opaque = true, +}) + +hl.window_rule({ + name = "jelly slide", + match = { + class = "^(jf-tui)$", + }, + animation = "slide top", +}) + +-- Define gaps for music workspace hl.workspace_rule({ workspace = "special:music", gaps_out = { @@ -19,4 +68,29 @@ hl.workspace_rule({ right = 400, bottom = 400, }, + animation = "slidefadevert", +}) + +-- Something from the example idk +hl.window_rule({ + name = "move-hyprland-run", + match = { class = "hyprland-run" }, + + move = "20 monitor_h-120", + float = true, +}) + +-- Fix some dragging issues with XWayland +hl.window_rule({ + name = "fix-xwayland-drags", + match = { + class = "^$", + title = "^$", + xwayland = true, + float = true, + fullscreen = false, + pin = false, + }, + + no_focus = true, }) diff --git a/modules/settings/animations.lua b/modules/settings/animations.lua index 8b13789..c79a321 100644 --- a/modules/settings/animations.lua +++ b/modules/settings/animations.lua @@ -1 +1,77 @@ +local beziers = { + -- Overshoot + { name = "heavyOvershoot", points = { 0.53, 0.51, 0.4, 1.22 } }, + { name = "lightOvershoot", points = { 0.33, 0.61, 0.63, 1.19 } }, + -- Linear + { name = "smoothSnap", points = { 0.32, 0.51, 0.44, 1 } }, + { name = "smoothIn", points = { 0.25, 1, 0.5, 1 } }, + { name = "smoothOutOvershoot", points = { 0.46, -0.25, 0.81, 0.51 } }, + + -- Springs + { name = "hardSpring", kind = "spring" }, + { name = "mediumSpring", kind = "spring", stiffness = 50, dampening = 10 }, + { name = "looseSpring", kind = "spring", dampening = 5, stiffness = 50 }, +} + +-- For every curve in the table (ik it says bezier stfu) +for _, bezier in ipairs(beziers) do + -- If there are points then its not a spring + if bezier.points then + hl.curve(bezier.name, { + type = "bezier", + points = { { bezier.points[1], bezier.points[2] }, { bezier.points[3], bezier.points[4] } }, + }) + -- If its a spring + elseif bezier.kind == "spring" then + hl.curve(bezier.name, { + type = "spring", + -- If all the parameters are empty make a spring with the values from the wiki + mass = bezier.mass or 1, + stiffness = bezier.stiffness or 70, + dampening = bezier.dampening or 10, + }) + else + -- You fucked something up + hl.notification.create({ text = "invalid curve generated", icon = "warning", timeout = 8000 }) + end +end + +local animations = { + -- Default animation + { leaf = "global", speed = 5, spring = "mediumSpring" }, + + -- Window animations + { leaf = "windows", speed = 2, spring = "mediumSpring", style = "slide right" }, + { leaf = "windowsOut", speed = 2, bezier = "heavyOvershoot", style = "popin 30%" }, + + -- Fade + { leaf = "fade", speed = 2, bezier = "smoothIn" }, + + -- Workspaces and Special + { leaf = "workspaces", speed = 2, bezier = "heavyOvershoot", style = "slidefade 20%" }, + { leaf = "specialWorkspace", speed = 5, spring = "mediumSpring", style = "slidefadevert -80%" }, +} + +-- For every entry in the animation table +for _, anim in ipairs(animations) do + -- If there is a bezier param + if anim.bezier then + hl.animation({ + leaf = anim.leaf, + enabled = true, + speed = anim.speed, + bezier = anim.bezier or "", + style = anim.style or "", + }) + elseif anim.spring then + -- Make a spring instead bcs apparently they're different idk + hl.animation({ + leaf = anim.leaf, + enabled = true, + speed = anim.speed, + spring = anim.spring or "", + style = anim.style or "", + }) + end +end diff --git a/modules/settings/input.lua b/modules/settings/input.lua index 28df91d..70bb48f 100644 --- a/modules/settings/input.lua +++ b/modules/settings/input.lua @@ -1,24 +1,33 @@ hl.config({ input = { - kb_layout = "gb", - follow_mouse = 1, + kb_layout = "gb", -- Goddamn kier starmer + follow_mouse = 1, -- Moving to a window will focus it touchpad = { - natural_scroll = true, - disable_while_typing = true, + natural_scroll = true, -- Better scrolling + disable_while_typing = true, -- Sanity }, - sensitivity = -0.3, - force_no_accel = false, + sensitivity = -0.3, -- DPI is too high ffs + force_no_accel = false, -- I love mouse acceleration tablet = { - left_handed = true, - output = "current", + left_handed = true, -- Top 10 disabilities + output = "current", -- Make the tablet usable }, }, cursor = { - inactive_timeout = 2, - warp_on_change_workspace = 1, - hide_on_key_press = true, - warp_on_toggle_special = 1, + inactive_timeout = 2, -- Hide white thing on the screen + hide_on_key_press = true, -- Hide white thing when typing + warp_on_change_workspace = 1, -- Make it go to workspaces + warp_on_toggle_special = 1, -- Go to special workspaces too + persistent_warps = true, -- Go back to where it was when I warp }, }) + +if Hostname == "mobile02" then + hl.config({ + input = { -- If on laptop make caps the escape key but make it be capslock when shift caps is pressed + kb_options = "caps:escape_shifted_capslock", + }, + }) +end diff --git a/modules/startup.lua b/modules/startup.lua deleted file mode 100644 index 6e58604..0000000 --- a/modules/startup.lua +++ /dev/null @@ -1,15 +0,0 @@ -local appList = { - "waybar", - "dunst", - "wpaperd -d", - "wayvnc 0.0.0.0 --output=DP-1", - "syncthing -home=/home/user01/.config/syncthing -no-browser", - "gotify-desktop", - "sleep 10 && curl -X POST -H 'Content-Type: application/json' -d '{'ref':'$(git -C ~/.dotfiles rev-parse HEAD)', 'status':'$(git -C ~/.dotfiles diff --quiet && echo 'clean' || echo 'dirty')'}' https://n8n.voidarc.co.uk/webhook/config-checker", -} - -hl.on("hyprland.start", function() - for _, command in ipairs(appList) do - hl.exec_cmd(command) - end -end)