diff --git a/.luarc.json b/.luarc.json new file mode 100644 index 0000000..62faf36 --- /dev/null +++ b/.luarc.json @@ -0,0 +1,10 @@ +{ + "workspace": { + "library": [ + "/usr/share/hypr/stubs" + ] + }, + "diagnostics": { + "globals": ["hl"] + } +} diff --git a/hyprland.lua b/hyprland.lua new file mode 100644 index 0000000..b9584ef --- /dev/null +++ b/hyprland.lua @@ -0,0 +1,6 @@ +require("modules.binds") +require("modules.env") +require("modules.executes") +require("modules.monitors") +require("modules.settings") +require("modules.windowrules") diff --git a/modules/binds.lua b/modules/binds.lua new file mode 100644 index 0000000..82619d0 --- /dev/null +++ b/modules/binds.lua @@ -0,0 +1,56 @@ +hl.bind("SUPER + mouse:272", hl.dsp.window.drag(), { mouse = true }) +hl.bind("SUPER + mouse:273", hl.dsp.window.resize(), { mouse = true }) + +hl.bind("SUPER + Q", hl.dsp.window.close()) +hl.bind("SUPER + M", hl.dsp.exit()) +hl.bind("SUPER + RETURN", hl.dsp.exec_cmd("ghostty")) +hl.bind("SUPER + E", hl.dsp.exec_cmd("dolphin")) +hl.bind("SUPER + B", hl.dsp.exec_cmd("firefox")) + +hl.bind("SUPER + H", hl.dsp.focus({ direction = "l" })) +hl.bind("SUPER + L", hl.dsp.focus({ direction = "r" })) +hl.bind("SUPER + K", hl.dsp.focus({ direction = "u" })) +hl.bind("SUPER + J", hl.dsp.focus({ direction = "d" })) +hl.bind("SUPER + SHIFT + L", hl.dsp.window.resize({ x = 50, y = 0, relative = true }), { repeating = true }) +hl.bind("SUPER + SHIFT + H", hl.dsp.window.resize({ x = -50, y = 0, relative = true }), { repeating = true }) +hl.bind("SUPER + SHIFT + K", hl.dsp.window.resize({ x = 0, y = -50, relative = true }), { repeating = true }) +hl.bind("SUPER + SHIFT + J", hl.dsp.window.resize({ x = 0, y = 50, relative = true }), { repeating = true }) + +for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + hl.bind("SUPER" .. " + " .. key, hl.dsp.focus({ workspace = i })) + hl.bind("ALT" .. " + " .. key, hl.dsp.window.move({ workspace = i, follow = true })) + -- hl.bind("SUPER" .. " + " .. key, hl.dsp.window.move({ workspace = i, follow = false })) +end + +hl.bind("SUPER + F", hl.dsp.window.fullscreen()) +hl.bind("SUPER + D", hl.dsp.exec_cmd("fuzzel")) +hl.bind( + "XF86AudioRaiseVolume", + hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"), + { repeating = true, locked = true } +) +hl.bind( + "XF86AudioLowerVolume", + hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), + { repeating = true, locked = true } +) +hl.bind( + "XF86AudioMute", + hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), + { repeating = true, 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 }) +hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true }) +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brighnessctl set +5%"), { locked = true, repeating = true }) +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brighnessctl set -5%"), { locked = true, repeating = true }) +hl.bind("XF86WebCam", hl.dsp.exec_cmd(""), { locked = true, repeating = true }) + +hl.bind("PRINT", hl.dsp.global("zshell:screenshotFreeze")) +hl.bind("SUPER + R", hl.dsp.global("zshell:toggle-launcher")) +hl.bind("SUPER + A", hl.dsp.global("zshell:toggle-nc")) +hl.bind("SUPER + V", hl.dsp.global("zshell:toggle-drawing")) +hl.bind("SUPER + F1", hl.dsp.global("zshell:lock")) +hl.bind("SUPER + F2", hl.dsp.global("zshell:toggle-settings")) diff --git a/modules/env.lua b/modules/env.lua new file mode 100644 index 0000000..a765638 --- /dev/null +++ b/modules/env.lua @@ -0,0 +1,29 @@ +hl.env("ZSH","/usr/share/oh-my-zsh/") +hl.env("BROWSER","firefox") +hl.env("TERM","tmux-256color") +hl.env("VISUAL","nvim") +hl.env("EDITOR","nvim") + +hl.env("HYPRCURSOR_THEME","catppuccin-macchiato-light-cursors") +hl.env("HYPRCURSOR_SIZE","28") + +hl.env("ELECTRON_OZONE_PLATFORM_HINT","auto") +hl.env("QT_AUTO_SCREEN_SCALE_FACTOR","1") +hl.env("QT_QPA_PLATFORM","wayland") +hl.env("QT_QPA_PLATFORMTHEME","qt6ct") +hl.env("QT_WAYLAND_DISABLE_WINDOWDECORATION","1") + +hl.env("XDG_SESSION_DESKTOP","Hyprland") +hl.env("XDG_SESSION_TYPE","wayland") +hl.env("CLUTTER_BACKEND","wayland") +hl.env("GDK_BACKEND","wayland") +hl.env("SDL_VIDEODRIVER","wayland") + +hl.env("XDG_CONFIG_HOME","$HOME/.config") +hl.env("XDG_CACHE_HOME","$HOME/.cache") +hl.env("XDG_DATA_HOME","$HOME/.local/share") +hl.env("XDG_PICTRES_HOME","$HOME/Pictures") +hl.env("HYPRSHOT_DIR","$HOME/Pictures/Screenshots") + +hl.env("RUSTICL_ENABLE","radeonsi") +hl.env("AMD_VULKAN_ICD","RADV") diff --git a/modules/executes.lua b/modules/executes.lua new file mode 100644 index 0000000..9061232 --- /dev/null +++ b/modules/executes.lua @@ -0,0 +1,8 @@ +hl.on("hyprland.start", function() + hl.exec_cmd("zshell-cli shell start") + hl.exec_cmd("nm-applet") + hl.exec_cmd("fcitx5") + hl.exec_cmd("wl-paste --type text --watch cliphist store") + hl.exec_cmd("wl-paste --type image --watch cliphist store") + hl.exec_cmd("hyprsunset -i") +end) diff --git a/modules/macchiato.lua b/modules/macchiato.lua new file mode 100644 index 0000000..f2caa68 --- /dev/null +++ b/modules/macchiato.lua @@ -0,0 +1,58 @@ +local M = {} + +M.colors = { + + rosewaterAlpha = "rgb(f4dbd6)", + + flamingoAlpha = "rgb(f0c6c6)", + + pinkAlpha = "rgb(f5bde6)", + + mauveAlpha = "rgb(c6a0f6)", + + redAlpha = "rgb(ed8796)", + + maroonAlpha = "rgb(ee99a0)", + + peachAlpha = "rgb(f5a97f)", + + yellowAlpha = "rgb(eed49f)", + + greenAlpha = "rgb(a6da95)", + + tealAlpha = "rgb(8bd5ca)", + + skyAlpha = "rgb(91d7e3)", + + sapphireAlpha = "rgb(7dc4e4)", + + blueAlpha = "rgb(8aadf4)", + + lavenderAlpha = "rgb(b7bdf8)", + + textAlpha = "rgb(cad3f5)", + + subtext1Alpha = "rgb(b8c0e0)", + + subtext0Alpha = "rgb(a5adcb)", + + overlay2Alpha = "rgb(939ab7)", + + overlay1Alpha = "rgb(8087a2)", + + overlay0Alpha = "rgb(6e738d)", + + surface2Alpha = "rgb(5b6078)", + + surface1Alpha = "rgb(494d64)", + + surface0Alpha = "rgb(363a4f)", + + baseAlpha = "rgb(24273a)", + + mantleAlpha = "rgb(1e2030)", + + crustAlpha = "rgb(181926)", +} + +return M diff --git a/modules/monitors.lua b/modules/monitors.lua new file mode 100644 index 0000000..0fdc005 --- /dev/null +++ b/modules/monitors.lua @@ -0,0 +1,18 @@ +hl.monitor({ + output = "eDP-1", + mode = "2560x1600@60", + position = "0x0", + scale = 1.25, + bitdepth = 10, + cm = "srgb", +}) + +hl.monitor({ + output = "", + mode = "highres@highrr", + position = "right", + scale = 2, + bitdepth = 10, + cm = "srgb", + mirror = "eDP-1" +}) diff --git a/modules/settings.lua b/modules/settings.lua new file mode 100644 index 0000000..b6cc789 --- /dev/null +++ b/modules/settings.lua @@ -0,0 +1,123 @@ +local C = require("modules.macchiato") + +hl.layer_rule({ + name = "blur_popups_bar", + blur = true, + match = { namespace = "ZShell-Bar" }, + ignore_alpha = 0.5, +}) + +hl.layer_rule({ + name = "blur_popups_auth", + blur = true, + match = { namespace = "ZShell-Auth" }, + ignore_alpha = 0.5, +}) + +hl.config({ + input = { + kb_layout = "us", + kb_variant = "intl", + kb_options = "fkeys:basic_13-24", + sensitivity = 0, + accel_profile = "flat", + follow_mouse = 1, + touchpad = { + natural_scroll = true, + scroll_factor = 0.4, + middle_button_emulation = true, + }, + gestures = { + }, + }, + general = { + gaps_in = 2, + gaps_out = 2, + border_size = 2, + col = { + active_border = { + colors = { C.colors.mauveAlpha, C.colors.greenAlpha, C.colors.sapphireAlpha, C.colors.lavenderAlpha }, + angle = 90, + }, + inactive_border = { + colors = { C.colors.surface1Alpha }, + angle = 90, + }, + }, + }, + decoration = { + rounding = 1, + shadow = { + enabled = true, + range = 6, + render_power = 6, + color = C.colors.baseAlpha, + color_inactive = C.colors.mantleAlpha, + }, + blur = { + enabled = true, + size = 2, + passes = 2, + new_optimizations = true, + ignore_opacity = true, + contrast = 1.0, + brightness = 1.0, + vibrancy = 0, + vibrancy_darkness = 0, + xray = false, + noise = 0.05, + popups = true, + input_methods = true, + }, + }, + ecosystem = { + no_donation_nag = true, + no_update_news = true, + }, + misc = { + disable_hyprland_logo = true, + }, + debug = { + full_cm_proto = true, + }, + dwindle = { + preserve_split = true, + }, +}) + +local animations = { + { leaf = "border", enabled = true, speed = 4, bezier = "linear" }, + { leaf = "borderangle", enabled = true, speed = 3, bezier = "linear", style = "loop" }, + { leaf = "fadeOut", enabled = true, speed = 3, bezier = "default" }, + { leaf = "fadeIn", enabled = true, speed = 4, bezier = "default" }, + { leaf = "fadeLayers", enabled = true, speed = 1, bezier = "default" }, + { leaf = "fadePopups", enabled = true, speed = 1, bezier = "default" }, + { leaf = "global", enabled = true, speed = 6, bezier = "default" }, + { leaf = "layers", enabled = true, speed = 5, bezier = "cubic-bezier", style = "fade" }, + { leaf = "windows", enabled = true, speed = 3, bezier = "wind", style = "popin" }, + { leaf = "windowsIn", enabled = true, speed = 3, bezier = "winIn", style = "popin 90%" }, + { leaf = "windowsOut", enabled = true, speed = 3, bezier = "winOut", style = "popin 90%" }, + { leaf = "windowsMove", enabled = true, speed = 1, bezier = "wind", style = "slide" }, + { leaf = "workspaces", enabled = true, speed = 4, bezier = "default" }, +} + +local curves = { + { name = "wind", config = { type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1 } } } }, + { name = "winIn", config = { type = "bezier", points = { { 0.1, 1.0 }, { 0.1, 1 } } } }, + { name = "winOut", config = { type = "bezier", points = { { 1, 0.35 }, { 1, 1 } } } }, + { name = "linear", config = { type = "bezier", points = { { 1, 1 }, { 1, 1 } } } }, + { name = "cubic-bezier", config = { type = "bezier", points = { { 0.215, 0.61 }, { 0.355, 1 } } } }, + { name = "easeOutQuint", config = { type = "bezier", points = { { 0.23, 1 }, { 0.32, 1 } } } }, + { name = "easeInOutCubic", config = { type = "bezier", points = { { 0.65, 0.05 }, { 0.36, 1 } } } }, + { name = "almostLinear", config = { type = "bezier", points = { { 0.5, 0.5 }, { 0.75, 1 } } } }, + { name = "quick", config = { type = "bezier", points = { { 0.15, 0 }, { 0.1, 1 } } } }, + { name = "easy", config = { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 } }, +} + +for _, curve in ipairs(curves) do + hl.curve(curve.name, curve.config) +end + +for _, animation in ipairs(animations) do + hl.animation(animation) +end diff --git a/modules/windowrules.lua b/modules/windowrules.lua new file mode 100644 index 0000000..e353559 --- /dev/null +++ b/modules/windowrules.lua @@ -0,0 +1,34 @@ +hl.window_rule({ + name = "xwayland", + opacity = "0.0 override", + no_anim = true, + no_initial_focus = true, + max_size = { 1, 1 }, + no_blur = true, + no_focus = true, + match = { class = "^(xwaylandvideobridge)$" }, +}) + +hl.window_rule({ + name = "fullscreen_idling", + idle_inhibit = "fullscreen", + match = { class = ".*" }, +}) + +hl.window_rule({ + name = "video_idling", + idle_inhibit = "always", + match = { content = "video" }, +}) + +hl.window_rule({ + name = "game_idling", + idle_inhibit = "always", + match = { content = "game" }, +}) + +hl.window_rule({ + name = "match_fullscreen", + idle_inhibit = "always", + match = { fullscreen_state_internal = 2, fullscreen_state_client = 2 }, +})