diff --git a/hypr/configs/apps.lua b/hypr/configs/apps.lua new file mode 100644 index 0000000..985cf82 --- /dev/null +++ b/hypr/configs/apps.lua @@ -0,0 +1,26 @@ +-- Was: configs/default_apps.conf + +local bar = "waybar" +local notifications = "swaync-client" +local terminal = "kitty" + +return { + launcher = "rofi -show drun", + + bar = bar, + bar_toggle = "killall -SIGUSR1 " .. bar, + bar_reload = "killall " .. bar .. "; " .. bar, + + notifications = notifications, + notifications_read = notifications .. " -C", + notifications_toggle = notifications .. " -t", + notifications_reload = notifications .. " -R && " .. notifications .. " -rs", + + browser = "firefox", + notetaking = "notesh", + terminal = terminal, + office_suite = "libreoffice", + editor = terminal .. " vim", + ide = "code", + file_manager = "nemo", +} diff --git a/hypr/configs/binds.lua b/hypr/configs/binds.lua new file mode 100644 index 0000000..eda9154 --- /dev/null +++ b/hypr/configs/binds.lua @@ -0,0 +1,237 @@ +-- Was: configs/binds.conf +-- +-- Translation notes (hyprlang -> Lua): +-- bind = MOD, KEY, dispatcher, arg -> hl.bind("MOD + KEY", hl.dsp....) +-- bindm -> { mouse = true } +-- bindl -> { locked = true } +-- binde -> { repeating = true } +-- bindle -> { locked = true, repeating = true } +-- killactive -> hl.dsp.window.close() +-- fullscreen, 0 -> hl.dsp.window.fullscreen({ mode = "fullscreen" }) +-- movefocus, l -> hl.dsp.focus({ direction = "left" }) +-- movewindow, l -> hl.dsp.window.move({ direction = "left" }) +-- workspace, N -> hl.dsp.focus({ workspace = N }) +-- movetoworkspace, N -> hl.dsp.window.move({ workspace = N }) +-- movetoworkspacesilent -> hl.dsp.window.move({ workspace = N, follow = false }) +-- togglegroup -> hl.dsp.group.toggle() +-- lockactivegroup,toggle-> hl.dsp.group.lock_active({ action = "toggle" }) +-- changegroupactive -> hl.dsp.group.next() +-- resizeactive, X Y -> hl.dsp.window.resize({ x = X, y = Y, relative = true }) +-- submap -> hl.dsp.submap() + hl.define_submap() +-- bare numeric keys (20/21/23) were keycodes -> "code:20" etc. + +local vars = require("configs.vars") +local apps = require("configs.apps") + +local mainMod = vars.mods.main -- SUPER +local altMod = vars.mods.alt -- ALT +local altrMod = vars.mods.altr -- SUPER + MOD5 + +local scripts = vars.paths.scripts +local launcher = vars.paths.launcher + +local launch = scripts .. "/launch_app " + +---------------------- +---- APPLICATIONS ---- +---------------------- + +hl.bind(mainMod .. " + S", hl.dsp.exec_cmd(launch .. apps.browser)) +hl.bind(mainMod .. " + V", hl.dsp.exec_cmd(launch .. apps.ide)) +hl.bind(mainMod .. " + O", hl.dsp.exec_cmd(launch .. apps.office_suite)) +hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(launch .. apps.file_manager)) +hl.bind(mainMod .. " + C", hl.dsp.exec_cmd(launch .. apps.terminal)) + +hl.bind(mainMod .. " + SHIFT + C", hl.dsp.exec_cmd(launch .. apps.terminal .. " docker exec -it yocto zsh")) +hl.bind(altMod .. " + C", hl.dsp.exec_cmd(launch .. apps.terminal .. " ssh Hetzner")) +hl.bind(altMod .. " + SHIFT + C", hl.dsp.exec_cmd(launch .. apps.terminal .. " docker exec -it ros2 zsh")) + +hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(launch .. "element-desktop")) +hl.bind(mainMod .. " + M", hl.dsp.exec_cmd(launch .. "thunderbird")) + +---- Notifications Menu +hl.bind(mainMod .. " + N", hl.dsp.exec_cmd(apps.notifications_toggle)) +hl.bind(mainMod .. " + SHIFT + N", hl.dsp.exec_cmd(apps.notifications_read)) + +---- Bar +-- NOTE: in binds.conf, SUPER+SHIFT+R was bound twice (notifications reload and +-- bar reload). hyprlang ran both; in Lua the later bind would shadow the +-- earlier one, so both are dispatched explicitly here. +hl.bind(mainMod .. " + SHIFT + R", function() + hl.dispatch(hl.dsp.exec_cmd(apps.notifications_reload)) + hl.dispatch(hl.dsp.exec_cmd(apps.bar_reload)) +end) +hl.bind(mainMod .. " + SHIFT + T", hl.dsp.exec_cmd(apps.bar_toggle)) + +----------------------------- +---- PICKERS / LAUNCHERS ---- +----------------------------- + +hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(apps.launcher)) +hl.bind(mainMod .. " + SHIFT + P", hl.dsp.exec_cmd(launcher .. "/wallpaper/wallpaper")) +hl.bind(altMod .. " + P", hl.dsp.exec_cmd(launcher .. "/wireguard/wireguard_selection menu")) +hl.bind(mainMod .. " + ESCAPE", hl.dsp.exec_cmd(launcher .. "/powermenu/powermenu")) +hl.bind(mainMod .. " + Y", hl.dsp.exec_cmd(launcher .. "/clipboard/clipboard")) + +---- Screenshots +hl.bind(mainMod .. " + SHIFT + S", hl.dsp.exec_cmd("hyprshot -m window --clipboard-only")) +hl.bind(altMod .. " + SHIFT + S", hl.dsp.exec_cmd("hyprshot -m region --clipboard-only")) + +------------------ +---- PYPRLAND ---- +------------------ + +hl.bind(mainMod .. " + B", hl.dsp.exec_cmd("pypr toggle btop")) +-- hl.bind(mainMod .. " + RETURN", hl.dsp.exec_cmd("pypr toggle kitty")) + +hl.bind(mainMod .. " + P", hl.dsp.exec_cmd(scripts .. "/random_wallpaper")) + +----------------- +---- WINDOWS ---- +----------------- + +---- Basic Operations +hl.bind(mainMod .. " + Q", hl.dsp.window.close()) +hl.bind(altMod .. " + Q", hl.dsp.window.close()) +hl.bind(mainMod .. " + W", hl.dsp.exec_cmd(scripts .. "/toggle_floating")) +hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen({ mode = "fullscreen" })) +-- hl.bind(mainMod .. " + P", hl.dsp.window.pseudo()) + +---- Mouse +hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true }) +hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true }) + +---- Focusing +hl.bind(mainMod .. " + LEFT", hl.dsp.focus({ direction = "left" })) +hl.bind(mainMod .. " + RIGHT", hl.dsp.focus({ direction = "right" })) +hl.bind(mainMod .. " + UP", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. " + DOWN", hl.dsp.focus({ direction = "down" })) + +---- Moving +hl.bind(altMod .. " + LEFT", hl.dsp.window.move({ direction = "left" })) +hl.bind(altMod .. " + RIGHT", hl.dsp.window.move({ direction = "right" })) +hl.bind(altMod .. " + UP", hl.dsp.window.move({ direction = "up" })) +hl.bind(altMod .. " + DOWN", hl.dsp.window.move({ direction = "down" })) + +---- Center and Split +-- hl.bind(mainMod .. " + D", hl.dsp.layout("togglesplit")) + +---- Group Control +hl.bind(mainMod .. " + G", hl.dsp.group.toggle()) +hl.bind(mainMod .. " + CTRL + G", hl.dsp.group.lock_active({ action = "toggle" })) +hl.bind("ALT + TAB", hl.dsp.group.next()) + +---- Resizing Windows (submap) +hl.bind(mainMod .. " + code:23", hl.dsp.submap("resize")) -- keycode 23 = TAB + +hl.define_submap("resize", function() + hl.bind("RIGHT", hl.dsp.window.resize({ x = 40, y = 0, relative = true }), { repeating = true }) + hl.bind("LEFT", hl.dsp.window.resize({ x = -40, y = 0, relative = true }), { repeating = true }) + hl.bind("UP", hl.dsp.window.resize({ x = 0, y = -40, relative = true }), { repeating = true }) + hl.bind("DOWN", hl.dsp.window.resize({ x = 0, y = 40, relative = true }), { repeating = true }) + + hl.bind("ESCAPE", hl.dsp.submap("reset")) +end) + +-------------------- +---- WORKSPACES ---- +-------------------- + +-- 1-10 on mainMod, 11-20 on altMod, 21-30 on altrMod. +-- Key 0 maps to the 10th workspace of each block. +local wsBlocks = { + { mod = mainMod, offset = 0 }, + { mod = altMod, offset = 10 }, + { mod = altrMod, offset = 20 }, +} + +for _, block in ipairs(wsBlocks) do + for i = 1, 10 do + local key = i % 10 -- 10 -> key 0 + local ws = block.offset + i + + -- Focus a workspace + hl.bind(block.mod .. " + " .. key, hl.dsp.focus({ workspace = ws })) + + -- Move the active window to a workspace (following it) + hl.bind(block.mod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = ws })) + + -- Move the active window to a workspace silently (staying put) + hl.bind(block.mod .. " + CTRL + " .. key, hl.dsp.window.move({ workspace = ws, follow = false })) + end +end + +---- Moving to other Workspace with Mouse Control +hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "m-1" })) +hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "m+1" })) + +--------------- +---- MEDIA ---- +--------------- + +local locked = { locked = true } +local lockrep = { locked = true, repeating = true } + +---- Mute +hl.bind(mainMod .. " + CTRL + mouse:280", hl.dsp.exec_cmd("swayosd-client --output-volume mute-toggle"), locked) -- Extra Up Button +hl.bind("XF86AudioMute", hl.dsp.exec_cmd("swayosd-client --output-volume mute-toggle"), locked) +hl.bind(mainMod .. " + CTRL + mouse:281", hl.dsp.exec_cmd("swayosd-client --input-volume mute-toggle"), locked) -- Extra Down Button +hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("swayosd-client --input-volume mute-toggle"), locked) + +---- Playback +hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), locked) +hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), locked) +hl.bind(mainMod .. " + CTRL + mouse:282", hl.dsp.exec_cmd("playerctl play-pause"), locked) -- Extra Center Button +hl.bind(mainMod .. " + CTRL + RETURN", hl.dsp.exec_cmd("playerctl play-pause"), locked) + +hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), locked) +hl.bind(mainMod .. " + CTRL + mouse:275", hl.dsp.exec_cmd("playerctl previous"), locked) -- Extra Back Button +hl.bind(mainMod .. " + CTRL + code:20", hl.dsp.exec_cmd("playerctl previous"), locked) -- Minus Key + +hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), locked) +hl.bind(mainMod .. " + CTRL + mouse:276", hl.dsp.exec_cmd("playerctl next"), locked) -- Extra Forward Button +hl.bind(mainMod .. " + CTRL + code:21", hl.dsp.exec_cmd("playerctl next"), locked) -- Plus Key + +---- Output Volume +hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("swayosd-client --output-volume +10"), lockrep) +hl.bind(mainMod .. " + ALT + code:21", hl.dsp.exec_cmd("swayosd-client --output-volume raise"), lockrep) +hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("swayosd-client --output-volume -10"), lockrep) +hl.bind(mainMod .. " + ALT + code:20", hl.dsp.exec_cmd("swayosd-client --output-volume lower"), lockrep) + +---- Input Volume +-- NOTE: binds.conf had `XF86InputRaiseVolume` / `XF86InputLowerVolume` here. +-- Those keysyms do not exist in xkbcommon (there is no XF86Input* family), so +-- these two binds never did anything -- hyprlang accepted the line and silently +-- ignored it, while hl.bind() validates the keysym and reports an error. +-- They are left commented out; the SUPER+SHIFT binds below are the working ones. +-- hl.bind("XF86InputRaiseVolume", hl.dsp.exec_cmd("swayosd-client --input-volume raise"), lockrep) +-- hl.bind("XF86InputLowerVolume", hl.dsp.exec_cmd("swayosd-client --input-volume lower"), lockrep) +hl.bind(mainMod .. " + SHIFT + code:21", hl.dsp.exec_cmd("swayosd-client --input-volume raise"), lockrep) +hl.bind(mainMod .. " + SHIFT + code:20", hl.dsp.exec_cmd("swayosd-client --input-volume lower"), lockrep) + +---- Brightness +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("swayosd-client --brightness +10"), lockrep) +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("swayosd-client --brightness -10"), lockrep) + +--------------- +---- OTHER ---- +--------------- + +-- Color picker +hl.bind(mainMod .. " + INSERT", hl.dsp.exec_cmd(scripts .. "/color_picker")) + +-- Disable anim, blur, etc +hl.bind(mainMod .. " + F12", hl.dsp.exec_cmd(scripts .. "/performance")) + +-- Freeze active window +hl.bind(mainMod .. " + H", hl.dsp.exec_cmd(scripts .. "/hyprfreeze -a")) + +-- Open Wikis +-- hl.bind(mainMod .. " + F1", hl.dsp.exec_cmd("xdg-open https://wiki.hypr.land/")) + +-- Zoom +-- hl.bind(mainMod .. " + SHIFT + mouse:276", hl.dsp.exec_cmd("hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 + 0.5}')")) +-- hl.bind(mainMod .. " + SHIFT + mouse:275", hl.dsp.exec_cmd("hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 - 0.5}')")) + +-- Lock +hl.bind(mainMod .. " + L", hl.dsp.exec_cmd("swaylock")) diff --git a/hypr/configs/env.lua b/hypr/configs/env.lua new file mode 100644 index 0000000..7b564e4 --- /dev/null +++ b/hypr/configs/env.lua @@ -0,0 +1,31 @@ +-- Was: configs/env.conf +-- +-- NOTE: hyprlang had both `env` and `envd` (the latter also exported into the +-- systemd/D-Bus activation environment). Lua only has hl.env(); Hyprland now +-- manages systemd/D-Bus activation vars by default for everything set here +-- (that is what HYPRLAND_NO_SD_VARS=1 turns off), so the former `envd` entries +-- are plain hl.env() calls now. + +-- XDG +hl.env("XDG_CURRENT_DESKTOP", "Hyprland") +hl.env("XDG_SESSION_TYPE", "wayland") +hl.env("XDG_SESSION_DESKTOP", "Hyprland") + +-- QT +hl.env("QT_QPA_PLATFORM", "wayland") +hl.env("QT_QPA_PLATFORMTHEME", "qt5ct") +hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1") +hl.env("QT_AUTO_SCREEN_SCALE_FACTOR", "1") +hl.env("QT_STYLE_OVERRIDE", "kvantum") + +-- Tearing +hl.env("WLR_DRM_NO_ATOMIC", "0") + +-- Themes +hl.env("GTK_THEME", "catppuccin-macchiato-lavender-standard+default") +hl.env("XCURSOR_THEME", "catppuccin-macchiato-dark-cursors") +-- hl.env("XCURSOR_THEME", "Wii-Pointer-P1") +hl.env("XCURSOR_SIZE", "24") +hl.env("HYPRCURSOR_THEME", "catppuccin-macchiato-dark-cursors") +-- hl.env("HYPRCURSOR_THEME", "Wii-Pointer-P1") +hl.env("HYPRCURSOR_SIZE", "24") diff --git a/hypr/configs/input.lua b/hypr/configs/input.lua new file mode 100644 index 0000000..30f33ac --- /dev/null +++ b/hypr/configs/input.lua @@ -0,0 +1,17 @@ +-- Was: configs/input.conf + +hl.config({ + input = { + kb_layout = "de", + kb_options = "compose:rctrl, level3:ralt_switch, grp:win_space_toggle", + + follow_mouse = 1, + numlock_by_default = true, + + touchpad = { + natural_scroll = true, + disable_while_typing = true, + scroll_factor = 0.5, + }, + }, +}) diff --git a/hypr/configs/misc.lua b/hypr/configs/misc.lua new file mode 100644 index 0000000..99197f9 --- /dev/null +++ b/hypr/configs/misc.lua @@ -0,0 +1,36 @@ +-- Was: configs/misc.conf + +hl.config({ + general = { + allow_tearing = false, + }, + + misc = { + always_follow_on_dnd = true, + disable_hyprland_logo = true, + vrr = 0, + animate_manual_resizes = true, + animate_mouse_windowdragging = false, + enable_swallow = true, + font_family = "JetBrainsMono Nerd Font", + enable_anr_dialog = false, + }, + + binds = { + movefocus_cycles_fullscreen = false, + }, + + xwayland = { + force_zero_scaling = true, + }, + + dwindle = { + -- pseudotile = true, -- Master switch for pseudotiling + preserve_split = true, -- You probably want this + force_split = 0, + }, +}) + +-- The `gestures {}` block in misc.conf was fully commented out. The modern +-- equivalent is hl.gesture(); uncomment to enable a 4-finger workspace swipe. +-- hl.gesture({ fingers = 4, direction = "horizontal", action = "workspace" }) diff --git a/hypr/configs/plugins.lua b/hypr/configs/plugins.lua new file mode 100644 index 0000000..b332287 --- /dev/null +++ b/hypr/configs/plugins.lua @@ -0,0 +1,23 @@ +-- Was: configs/plugins.conf +-- +-- All the individual plugin blocks were commented out; only the hyprpm reload +-- was live. Plugin config files under plugins/ are still hyprlang .conf and are +-- NOT loaded from here (they weren't before either -- their source lines were +-- commented out). + +hl.on("hyprland.start", function() + hl.exec_cmd("hyprpm reload -n") +end) + +-- Hyprtrails +-- hl.exec_cmd("hyprpm enable hyprtrails"); require("plugins.hyprtrails") +-- Hyprexpo +-- hl.exec_cmd("hyprpm enable hyprexpo"); require("plugins.hyprexpo") +-- Hyprsplit +-- hl.exec_cmd("hyprpm enable hyprsplit"); require("plugins.hyprsplit") +-- Hyprtasking +-- hl.exec_cmd("hyprpm enable hyprtasking"); require("plugins.hyprtasking") +-- Hyprspace +-- hl.exec_cmd("hyprpm enable hyprspace"); require("plugins.hyprspace") +-- Dynamic-cursors +-- hl.exec_cmd("hyprpm enable dynamic-cursors"); require("plugins.dynamic-cursors") diff --git a/hypr/configs/profiles/common.lua b/hypr/configs/profiles/common.lua new file mode 100644 index 0000000..ede57b0 --- /dev/null +++ b/hypr/configs/profiles/common.lua @@ -0,0 +1,31 @@ +-- Shared profile logic: given three outputs, lay out the 30 workspaces. +-- +-- 1-10 -> MONITOR1, 11-20 -> MONITOR2, 21-30 -> MONITOR3. +-- The first workspace of each block is that monitor's default. +-- Was: configs/workspaces.conf (byte-identical on both machines, because it +-- only ever referred to $MONITOR1/2/3). + +local M = {} + +function M.workspaces(monitors) + local blocks = { + { first = 1, last = 10, monitor = monitors[1] }, + { first = 11, last = 20, monitor = monitors[2] }, + { first = 21, last = 30, monitor = monitors[3] }, + } + + for _, block in ipairs(blocks) do + for ws = block.first, block.last do + hl.workspace_rule({ + workspace = tostring(ws), + monitor = block.monitor, + default = (ws == block.first), + }) + end + end +end + +-- Gaming workspaces (10 / 20 / 30) had these commented out in workspaces.conf: +-- no_rounding = true, decorate = false, gaps_in = -1, gaps_out = 0, no_border = true + +return M diff --git a/hypr/configs/profiles/init.lua b/hypr/configs/profiles/init.lua new file mode 100644 index 0000000..ca27c18 --- /dev/null +++ b/hypr/configs/profiles/init.lua @@ -0,0 +1,35 @@ +-- Machine profile selection. +-- +-- Each profile owns the two things that genuinely differ between machines: +-- the monitor layout and the workspace-to-monitor assignment. +-- +-- Selection order: +-- 1. $HYPR_PROFILE, if set (e.g. `HYPR_PROFILE=laptop Hyprland`) +-- 2. hostname match +-- 3. fallback: "laptop" +-- +-- To add a machine: create configs/profiles/.lua and add it to `byHost`. + +local byHost = { + mainPC = "pc", +} + +local fallback = "laptop" + +local function hostname() + -- Cheap file read at config-load time (not in a bind callback, so it is + -- safe to block on). os.getenv("HOSTNAME") is not reliably exported. + local f = io.open("/etc/hostname") + if not f then return nil end + local h = f:read("l") + f:close() + -- strip stray whitespace + return h and h:match("^%s*(.-)%s*$") or nil +end + +local host = hostname() +local profile = os.getenv("HYPR_PROFILE") or byHost[host] or fallback + +require("configs.profiles." .. profile) + +return { name = profile, host = host } diff --git a/hypr/configs/profiles/laptop.lua b/hypr/configs/profiles/laptop.lua new file mode 100644 index 0000000..03fb40d --- /dev/null +++ b/hypr/configs/profiles/laptop.lua @@ -0,0 +1,22 @@ +-- Profile: laptop +-- Internal hidpi panel plus two external 1080p outputs. +-- Was: the committed configs/monitors.conf in the dotfiles repo. + +local common = require("configs.profiles.common") + +local MONITOR1 = "eDP-1" -- internal panel +local MONITOR2 = "DP-1" -- second +local MONITOR3 = "HDMI-A-1" -- third + +-- Main Monitor +hl.monitor({ output = MONITOR1, mode = "3072x1920@120.00", position = "0x0", scale = 2.0, vrr = 1 }) + +-- Second Monitor +hl.monitor({ output = MONITOR2, mode = "1920x1080@60.00", position = "0x1920", scale = 1.0 }) +-- FSIT: position = "-1920x-800" +-- mirror = MONITOR1 + +-- Third Monitor +hl.monitor({ output = MONITOR3, mode = "1920x1080@60.00", position = "0x1920", scale = 1.0, mirror = MONITOR1 }) + +common.workspaces({ MONITOR1, MONITOR2, MONITOR3 }) diff --git a/hypr/configs/profiles/pc.lua b/hypr/configs/profiles/pc.lua new file mode 100644 index 0000000..896dd65 --- /dev/null +++ b/hypr/configs/profiles/pc.lua @@ -0,0 +1,24 @@ +-- Profile: pc (hostname "mainPC") +-- Three 1080p outputs, no internal panel. +-- Was: the live ~/.config/hypr/configs/monitors.conf on this machine. + +local common = require("configs.profiles.common") + +local MONITOR1 = "DP-1" -- main +local MONITOR2 = "HDMI-A-1" -- second +local MONITOR3 = "DP-2" -- third + +-- Main Monitor +hl.monitor({ output = MONITOR1, mode = "1920x1080@120.00", position = "0x0", scale = 1.0 }) +-- add vrr = 1 to the above if wanted + +-- Second Monitor +hl.monitor({ output = MONITOR2, mode = "1920x1080@60.00", position = "-1920x280", scale = 1.0 }) +-- FSIT Arbeitsplatz: position = "-1920x-800" +-- mirror = MONITOR3 + +-- Third Monitor +hl.monitor({ output = MONITOR3, mode = "1920x1080@60.00", position = "0x1920", scale = 1.0 }) +-- mirror = MONITOR1 + +common.workspaces({ MONITOR1, MONITOR2, MONITOR3 }) diff --git a/hypr/configs/vars.lua b/hypr/configs/vars.lua new file mode 100644 index 0000000..5834ad5 --- /dev/null +++ b/hypr/configs/vars.lua @@ -0,0 +1,19 @@ +-- Shared values used by several config modules. +-- In Lua each require() is its own scope, so hyprlang's global "$VAR" +-- no longer leaks across files: modules return a table instead. +-- +-- Monitor names are NOT here -- they are per-machine and live in +-- configs/profiles/{pc,laptop}.lua. + +return { + mods = { + main = "SUPER", + alt = "ALT", + altr = "SUPER + MOD5", + }, + + paths = { + scripts = os.getenv("HOME") .. "/.config/hypr/scripts", + launcher = os.getenv("HOME") .. "/.config/rofi/scripts", + }, +} diff --git a/hypr/hyprland.lua b/hypr/hyprland.lua new file mode 100644 index 0000000..53e7720 --- /dev/null +++ b/hypr/hyprland.lua @@ -0,0 +1,25 @@ +-- Hyprland Lua config (migrated from hyprland.conf + configs/ + theme/). +-- +-- Hyprland loads hyprland.lua in preference to hyprland.conf when both exist, +-- and only decides at startup -- so switching between them needs a restart. +-- The .conf files are kept intact next to these; to roll back, move +-- hyprland.lua aside and restart Hyprland. +-- +-- Each require() is its own Lua scope, so an error in one file does not stop +-- the others -- but a require() of a *missing* file kills this file, so keep +-- the paths correct. + +-- Configs +require("configs.env") +require("configs.profiles.init") -- monitors + workspaces, per machine +require("configs.binds") +require("configs.input") +require("configs.misc") +require("configs.plugins") +require("theme.theme") + +-- Autostart +hl.on("hyprland.start", function() + hl.exec_cmd(os.getenv("HOME") .. "/.config/hypr/scripts/autostart/services") + hl.exec_cmd(os.getenv("HOME") .. "/.config/hypr/scripts/autostart/apps") +end) diff --git a/hypr/pyprland.toml b/hypr/pyprland.toml index 40ed4d8..96d9ebd 100644 --- a/hypr/pyprland.toml +++ b/hypr/pyprland.toml @@ -63,6 +63,6 @@ lazy = true [wallpapers] path = "~/.config/hypr/theme/walls/" interval = 60 # change every hour -command = "swww img --transition-bezier 0.5,1.19,.8,.4 --transition-type wipe --transition-duration 2 --transition-fps 75 \"[file]\" && notify-send 'Wallpaper Changed' -i \"[file]\" --app-name=Wallpaper" -clear_command = "swww clear" +command = "awww img --transition-bezier 0.5,1.19,.8,.4 --transition-type wipe --transition-duration 2 --transition-fps 75 \"[file]\" && notify-send 'Wallpaper Changed' -i \"[file]\" --app-name=Wallpaper" +clear_command = "awww clear" extensions = ["jpg", "png", "gif", "jpeg"] diff --git a/hypr/scripts/autostart/services b/hypr/scripts/autostart/services index d71ff9e..5407e6a 100755 --- a/hypr/scripts/autostart/services +++ b/hypr/scripts/autostart/services @@ -27,8 +27,13 @@ hypridle & # Clipboard wl-paste --watch cliphist store & -# Polkit authentication -/usr/lib/hyprpolkitagent/hyprpolkitagent & +# Polkit authentication -- hyprpolkitagent on the laptop, polkit-gnome on mainPC. +# Whichever is installed wins, so this one file works on both machines. +if [ -x /usr/lib/hyprpolkitagent/hyprpolkitagent ]; then + /usr/lib/hyprpolkitagent/hyprpolkitagent & +elif [ -x /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 ]; then + /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & +fi # Screen sharing and portals "$HOME"/.config/hypr/scripts/portal & diff --git a/hypr/theme/animations.lua b/hypr/theme/animations.lua new file mode 100644 index 0000000..7dda0b6 --- /dev/null +++ b/hypr/theme/animations.lua @@ -0,0 +1,37 @@ +-- Was: theme/animations.conf + +hl.config({ animations = { enabled = true } }) + +-- Curves. hyprlang's `bezier = name, x0, y0, x1, y1` becomes hl.curve with +-- two control points. +hl.curve("default", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.02} } }) +hl.curve("wind", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.02} } }) +hl.curve("overshot", { type = "bezier", points = { {0.13, 0.99}, {0.29, 1.02} } }) +hl.curve("liner", { type = "bezier", points = { {1, 1}, {1, 1} } }) +hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1.03} } }) + +-- Fast Animations +-- (old form: animation = , , , ,