commit 9360ba8e8a67bd8d6ad12ab77b585c88373df5b4 Author: Domipoke <42298508+Domipoke@users.noreply.github.com> Date: Thu Jun 25 19:17:20 2026 +0200 first commit diff --git a/hypr/.luarc.json b/hypr/.luarc.json new file mode 100644 index 0000000..36a6172 --- /dev/null +++ b/hypr/.luarc.json @@ -0,0 +1,14 @@ +{ + "workspace": { + "library": [ + "/usr/local/share/hypr/stubs" + ] + }, + "diagnostics": { + "globals": [ + "hl", + "mainMod", + "noctalia" + ] + } +} diff --git a/hypr/.vscode/settings.json b/hypr/.vscode/settings.json new file mode 100644 index 0000000..35ddf31 --- /dev/null +++ b/hypr/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "Lua.workspace.library": [ + "/usr/local/share/hypr/stubs" + ], + "Lua.diagnostics.globals": [ + "hl" + ] +} \ No newline at end of file diff --git a/hypr/animation.lua b/hypr/animation.lua new file mode 100644 index 0000000..875aa31 --- /dev/null +++ b/hypr/animation.lua @@ -0,0 +1,139 @@ +-- Setup curves +hl.curve("wind", { + points = { + { 0.05, 0.9 }, + { 0.1, 1.05 } + }, + type = "bezier" +}) +hl.curve("winIn", { + points = { + { 0.1, 1.1 }, + { 0.1, 1.1 } + }, + type = "bezier" +}) +hl.curve("winOut", { + points = { + { 0.3, -0.3 }, + { 0, 1 } + }, + type = "bezier" +}) +hl.curve("liner", { + points = { + { 1, 1 }, + { 1, 1 } + }, + type = "bezier" +}) +hl.curve("almostLinear", { + points = { + { 0.5, 0.5 }, + { 0.75, 1 } + }, + type = "bezier" +}) + + +-- Setup animations +hl.animation({ + leaf = "windows", + speed = 6, + bezier = "wind", + style = "slide", + enabled = true +}) + +hl.animation({ + leaf = "windowsIn", + speed = 6, + bezier = "winIn", + style = "slide", + enabled = false +}) + +hl.animation({ + leaf = "windowsOut", + speed = 5, + bezier = "winOut", + style = "slide", + enabled = false +}) + +hl.animation({ + leaf = "windowsMove", + speed = 5, + bezier = "wind", + style = "slide", + enabled = false +}) + +hl.animation({ + leaf = "border", + speed = 1, + bezier = "liner", + enabled = true +}) + +hl.animation({ + leaf = "borderangle", + speed = 30, + bezier = "liner", + loop = true, + enabled = true +}) + +hl.animation({ + leaf = "layers", + speed = 6, + bezier = "wind", + style = "popin 90%", + enabled = true +}) + +hl.animation({ + leaf = "layersIn", + speed = 6, + bezier = "winIn", + style = "popin 90%", + enabled = true +}) + +hl.animation({ + leaf = "layersOut", + speed = 5, + bezier = "winOut", + style = "popin 90%", + enabled = true +}) + +hl.animation({ + leaf = "workspaces", + speed = 5, + bezier = "wind", + enabled = true +}) + + + +hl.animation({ + leaf = "fadeIn", + speed = 1.73, + bezier = "almostLinear", + enabled = true +}) + +hl.animation({ + leaf = "fadeOut", + speed = 1.46, + bezier = "almostLinear", + enabled = true +}) + +hl.animation({ + leaf = "fade", + speed = 3.03, + bezier = "almostLinear", + enabled = true +}) diff --git a/hypr/autostart.lua b/hypr/autostart.lua new file mode 100644 index 0000000..d5d4c5f --- /dev/null +++ b/hypr/autostart.lua @@ -0,0 +1,37 @@ +-- ################# +-- ### AUTOSTART ### +-- ################# + +hl.on("hyprland.start", function() + hl.exec_cmd("wl-paste --type text --watch cliphist store") -- Stores only text data + hl.exec_cmd("wl-paste --type image --watch cliphist store") -- Stores only image data + hl.exec_cmd("wl-clip-persist --clipboard regular") + hl.exec_cmd("systemctl --user start hyprpolkitagent") + hl.exec_cmd("hypridle") + + -- Notification + -- hl.exec_cmd("mako") + -- hl.exec_cmd("~/.config/mako/scripts/spotify-notify.sh") + + -- For screen sharing + hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP") + hl.exec_cmd("systemctl --user import-environment") + + hl.exec_cmd("~/.config/hypr/scripts/screensharing.sh") + hl.exec_cmd("xwaylandvideobridge") + + -- Bluetooth + -- hl.exec_cmd("blueman-applet") -- Make sure you have installed blueman + -- hl.exec_cmd("nm-applet") + -- hl.exec_cmd("blueman-tray") + + -- For keyboard + hl.exec_cmd("fcitx5 -D") + + -- Start plugins + hl.exec_cmd("hyprpm reload") + hl.exec_cmd("kded6") + hl.exec_cmd("kbuildsycoca6") + hl.exec_cmd("qs -c noctalia-shell") + +end) diff --git a/hypr/colors.lua b/hypr/colors.lua new file mode 100644 index 0000000..ecd2272 --- /dev/null +++ b/hypr/colors.lua @@ -0,0 +1,102 @@ +image = "/home/akiidjk/.config/wallpapers/eyes.png" + +background = "#131314ff" + +error = "#ffb4abff" + +error_container = "#93000aff" + +inverse_on_surface = "#313030ff" + +inverse_primary = "#5c5e64ff" + +inverse_surface = "#e5e2e2ff" + +on_background = "#e5e2e2ff" + +on_error = "#690005ff" + +on_error_container = "#ffdad6ff" + +on_primary = "#2e3035ff" + +on_primary_container = "#c7c7cdff" + +on_primary_fixed = "#191c20ff" + +on_primary_fixed_variant = "#45474cff" + +on_secondary = "#303032ff" + +on_secondary_container = "#e1dfe2ff" + +on_secondary_fixed = "#1b1b1dff" + +on_secondary_fixed_variant = "#464649ff" + +on_surface = "#e5e2e2ff" + +on_surface_variant = "#c6c6cbff" + +on_tertiary = "#372f29ff" + +on_tertiary_container = "#d3c4bcff" + +on_tertiary_fixed = "#221a15ff" + +on_tertiary_fixed_variant = "#4f453eff" + +outline = "#909095ff" + +outline_variant = "#45474bff" + +primary = "#c5c6ccff" + +primary_container = "#35373cff" + +primary_fixed = "#e2e2e8ff" + +primary_fixed_dim = "#c5c6ccff" + +scrim = "#000000ff" + +secondary = "#c7c6c8ff" + +secondary_container = "#464649ff" + +secondary_fixed = "#e4e2e4ff" + +secondary_fixed_dim = "#c7c6c8ff" + +shadow = "#000000ff" + +source_color = "#35373cff" + +surface = "#131314ff" + +surface_bright = "#3a3939ff" + +surface_container = "#201f20ff" + +surface_container_high = "#2a2a2aff" + +surface_container_highest = "#353435ff" + +surface_container_low = "#1c1b1cff" + +surface_container_lowest = "#0e0e0eff" + +surface_dim = "#131314ff" + +surface_tint = "#c5c6ccff" + +surface_variant = "#45474bff" + +tertiary = "#d2c4bbff" + +tertiary_container = "#3e352fff" + +tertiary_fixed = "#efe0d7ff" + +tertiary_fixed_dim = "#d2c4bbff" + diff --git a/hypr/hyprcolors.lua b/hypr/hyprcolors.lua new file mode 100644 index 0000000..38d5f49 --- /dev/null +++ b/hypr/hyprcolors.lua @@ -0,0 +1,46 @@ +require("colors") + +hl.config({ + general = { + gaps_in = 5, + gaps_out = 15, + border_size = 2, + -- # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col = { + active_border = primary, + inactive_border = on_primary + }, + + -- # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = true, + + -- -- # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false, + + layout = "dwindle" + }, + decoration = { + rounding = 10, + rounding_power = 2, + + -- # Change transparency of focused and unfocused windows + active_opacity = 1, + inactive_opacity = 1, + + shadow = { + enabled = true, + range = 4, + render_power = 3, + color = background, + }, + + -- # https://wiki.hyprland.org/Configuring/Variables/#blur + blur = { + enabled = true, + size = 3, + passes = 1, + vibrancy = 0.1696 + } + + } +}) diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..1d8c3f3 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,22 @@ +general { + lock_cmd = notify-send "lock!" # dbus/sysd lock command (loginctl lock-session) + unlock_cmd = notify-send "unlock!" # same as above, but unlock + ignore_dbus_inhibit = false # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam) + lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. + before_sleep_cmd = loginctl lock-session # lock before suspend. + after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. +} + +# Screenlock +listener { + timeout = 180 # in seconds + on-timeout = hyprlock # command to run when timeout has passed + # on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired. +} + +# Suspend +listener { + timeout = 3600 # in seconds + on-timeout = systemctl suspend # command to run when timeout has passed + # on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired. +} diff --git a/hypr/hyprland.lua b/hypr/hyprland.lua new file mode 100644 index 0000000..c69ec4e --- /dev/null +++ b/hypr/hyprland.lua @@ -0,0 +1,110 @@ +hl.env("AQ_DRM_DEVICES", "/dev/dri/card1") + +-- Setup gestures +hl.gesture({ + fingers = 3, + direction = "horizontal", + action = "workspace" +}) + +-- Some config +hl.config({ + dwindle = { + -- force_split = 0, + preserve_split = true, + -- smart_split = false, + -- smart_resizing = true, + -- permanent_direction_override = false, + -- special_scale_factor = 1, + -- split_width_multiplier = 1.0, + -- use_active_for_splits = true, + -- default_split_ratio = 1.0, + -- split_bias = 0, + -- precise_mouse_move = false, + }, +}) + +-- Load monitors config +require("monitors") + +-- Nvidia settings +hl.env("LIBVA_DRIVER_NAME.nvidia", "true") +hl.env("__GLX_VENDOR_LIBRARY_NAME.nvidia", "true") + +require("autostart") + + +-- ############################# +-- ### ENVIRONMENT VARIABLES ### +-- ############################# + +-- # See https://wiki.hyprland.org/Configuring/Environment-variables/ +hl.env("XCURSOR_SIZE", 24) +hl.env("HYPRCURSOR_SIZE", 24) +hl.env("QT_QPA_PLATFORMTHEME","qt6ct") +hl.env("XDG_MENU_PREFIX","arch- kbuildsycoca6") + +-- # 01-xdg-base.conf +--hl.env("XDG_CONFIG_HOME", "/home/domenico/.config") +--hl.env("XDG_DATA_HOME", "/home/domenico/.local/share") +--hl.env("XDG_CACHE_HOME", "/home/domenco/.cache") +--hl.env("XDG_STATE_HOME", "/home/domenico/.local/state") + +--hl.env("XDG_DATA_DIRS", "/home/domenico/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share") + +-- # 10-kde-on-niri/hyprland + +--hl.env("QT_QPA_PLATFORM", "wayland") + +-- # REQUIRED: make sure portal uses KDE Qt platform theme +--hl.env("QT_QPA_PLATFORMTHEME","kde") +--hl.env("QT_QPA_PLATFORMTHEME_QT6","kde") + +-- # REQUIRED: helps fixing Dolphin default applications issue +--hl.env("XDG_MENU_PREFIX","plasma-") + +--hl.env("QT_AUTO_SCREEN_SCALE_FACTOR","1") +--hl.env("QT_ENABLE_HIGHDPI_SCALING","1") +--hl.env("QT_SCALE_FACTOR_ROUNDING_POLICY","RoundPreferFloor") + +-- 80-gtk-no-btn.conf +--hl.env("GTK_DECORATION_LAYOUT","") + +-- 99-electron.conf +--hl.env("ELECTRON_OZONE_PLATFORM_HINT", "auto") + +-- ##################### +-- ### LOOK AND FEEL ### +-- ##################### +require("hyprcolors") +require("animation") + +hl.config({ + misc = { + force_default_wallpaper = -1, -- # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = true -- # If true disables the random hyprland logo / anime girl background. :( + } +}) + + +-- ############# +-- ### INPUT ### +-- ############# +require("input") +require("keybinds") + +-- ############################## +-- ### WINDOWS AND WORKSPACES ### +-- ############################## +-- # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +-- # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules +require("windowrule") +require("workspace") + +-- ################## +-- ### EXTENSIONS ### +-- ################## +-- require("vicinae") + +-- This loads Noctalia-generated Hyprland colors. +dofile("/home/domenico/.config/hypr/noctalia/noctalia-colors.lua") diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..36a8836 --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,212 @@ +general { + ignore_empty_input = true + fail_timeout = 1000 + # hide_cursor = true +} + + +background { + monitor = + path = $HOME/.current_wallpaper # only png supported for now + color = rgba(25, 20, 20, 1.0) + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_passes = 0 # 0 disables blurring + blur_size = 2 + noise = 0 + contrast = 0 + brightness = 0 + vibrancy = 0 + vibrancy_darkness = 0.0 +} + +input-field { + monitor = + size = 300, 30 + outline_thickness = 0 + dots_size = 0.25 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.55 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true + dots_rounding = -1 + outer_color = rgba(242, 243, 244, 0) + inner_color = rgba(242, 243, 244, 0) + font_color = rgba(242, 243, 244, 0.75) + fade_on_empty = false + placeholder_text = # Text rendered in the input box when it's empty. + hide_input = false + check_color = rgba(204, 136, 34, 0) + fail_color = rgba(204, 34, 34, 0) # if authentication failed, changes outer_color and fail message color + fail_text = $FAIL ($ATTEMPTS) # can be set to empty + fail_transition = 300 # transition time in ms between normal outer_color and fail_color + capslock_color = -1 + numlock_color = -1 + bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above) + invert_numlock = false # change color if numlock is off + swap_font_color = false # see below + position = 0, -468 + halign = center + valign = center +} + +label { + monitor = + text = cmd[update:1000] echo "$(date +"%A, %B %d")" + color = rgba(242, 243, 244, 0.75) + font_size = 20 + font_family = SF Pro Display Bold + position = 0, 405 + halign = center + valign = center +} + +label { + monitor = + text = $TIME12 + color = rgba(242, 243, 244, 0.75) + font_size = 93 + font_family = SF Pro Display Bold + position = 0, 310 + halign = center + valign = center +} + + +label { + monitor = + text = $USER + color = rgba(242, 243, 244, 0.75) + font_size = 12 + font_family = SF Pro Display Bold + position = 0, -407 + halign = center + valign = center +} + +label { + monitor = + text = Touch ID or Enter Password + color = rgba(242, 243, 244, 0.75) + font_size = 10 + font_family = SF Pro Display + position = 0, -438 + halign = center + valign = center +} + +image { + monitor = + path = ~/.config/wallpapers/icons/spidy_black_1.jpg + border_color = 0xffdddddd + border_size = 0 + size = 73 + rounding = -1 + rotate = 0 + reload_time = -1 + reload_cmd = + position = 0, -353 + halign = center + valign = center +} + + + +# Music blur div +shape { + monitor = + size = 340, 140 + color =rgba(00, 00, 00, 0.1) + rounding = 30 + rotate = 0 + position = 0, -150 + halign = center + valign = center + zindex = 1 +} + + + +# Music album art +image { + monitor = + size = 110 + rounding = 20 + rotate = 0 + reload_time = 1 + reload_cmd = ~/.config/hypr/scripts/playerctlock.sh --arturl + position = 800, -150 + halign = left + valign = center + zindex = 5 +} + + +# PLAYER LENGTH +label { + monitor = + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/playerctlock.sh --length | cut -c 1-15)" + color = rgba(255, 255, 255, 0.8) + font_size = 10 + font_family = JetBrains Mono Nerd Font Mono ExtraBold + position = 950, -190 + halign = left + valign = center + zindex = 5 +} + + +# PLAYER STATUS +label { + monitor = + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/playerctlock.sh --status | cut -c 1-15)" + color = rgba(255, 255, 255, 0.8) + font_size = 10 + font_family = JetBrains Mono Nerd Font Mono ExtraBold + position = 950, -170 + halign = left + valign = center + zindex = 5 +} + + + +# PLAYER SOURCE +label { + monitor = + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/playerctlock.sh --source | cut -c 1-15)" + color = rgba(255, 255, 255, 0.6) + font_size = 10 + font_family = JetBrains Mono Nerd Font Mono + position = 950, -140 + halign = left + valign = center + zindex = 5 +} + + +# PLAYER TITLE +label { + monitor = + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/playerctlock.sh --title | cut -c 1-15)" + color = rgba(255, 255, 255, 0.8) + font_size = 12 + font_family = JetBrains Mono Nerd Font Mono ExtraBold + position = 950, -120 + halign = left + valign = center + zindex = 5 +} + + + +# PLAYER ARTIST +label { + monitor = + text = cmd[update:1000] echo "$(~/.config/hypr/scripts/playerctlock.sh --artist | cut -c 1-15)" + color = rgba(255, 255, 255, 0.8) + font_size = 10 + font_family = JetBrains Mono Nerd Font Mono ExtraBold + position = 950, -100 + halign = left + valign = center + zindex = 5 +} diff --git a/hypr/hyprtoolkit.conf b/hypr/hyprtoolkit.conf new file mode 100644 index 0000000..a7b4cde --- /dev/null +++ b/hypr/hyprtoolkit.conf @@ -0,0 +1,7 @@ +background = rgba(1e1e2eff) +base = rgba(1e1e2eff) +text = rgba(cdd6f4ff) +alternate_base = rgba(313244ff) +bright_text = rgba(11111bff) +accent = rgba(cba6f7ff) +accent_secondary = rgba(fab387ff) \ No newline at end of file diff --git a/hypr/input.lua b/hypr/input.lua new file mode 100644 index 0000000..d7fa5ca --- /dev/null +++ b/hypr/input.lua @@ -0,0 +1,15 @@ +-- ############# +-- ### INPUT ### +-- ############# + +-- # https://wiki.hyprland.org/Configuring/Variables/#input +hl.config({ + input = { + kb_layout = "it", + follow_mouse = 1, + sensitivity = 0, -- # -1.0 - 1.0, 0 means no modification. + touchpad = { + natural_scroll = true + }, + } +}) diff --git a/hypr/keybinds.lua b/hypr/keybinds.lua new file mode 100644 index 0000000..1a9c12c --- /dev/null +++ b/hypr/keybinds.lua @@ -0,0 +1,107 @@ +local terminal = "kitty" +local fileManager = "dolphin" +local browser = "vivaldi" +local editor = "code" + +noctalia = "qs -c noctalia-shell ipc call " +mainMod = "SUPER" + +-- Exec +hl.bind(mainMod .. " + RETURN", hl.dsp.exec_cmd(terminal), { description = "Open terminal" }) +hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager), { description = "Open file manager" }) +hl.bind(mainMod .. " + B", hl.dsp.exec_cmd(browser), { description = "Open browser" }) +hl.bind(mainMod .. " + C", hl.dsp.exec_cmd(editor), { description = "Open editor" }) +hl.bind(mainMod .. " + V", hl.dsp.exec_cmd(noctalia .. "plugin:clipper toggle"), {description = "Open Clipboard history"}) +hl.bind("ALT + L", hl.dsp.exec_cmd("hyprlock --grace 5"), { description = "Lock screen" }) + +hl.bind("SUPER + SHIFT + C", hl.dsp.exec_cmd("bash ~/.config/hypr/scripts/hyprPicker.sh"), + { description = "Color picker" }) + +hl.bind("CTRL + SHIFT + A", hl.dsp.exec_cmd("playerctl play-pause"), { description = "Play/pause media" }) +hl.bind("CTRL + SHIFT + D", hl.dsp.exec_cmd("playerctl next"), { description = "Next media" }) +hl.bind("CTRL + SHIFT + S", hl.dsp.exec_cmd("playerctl previous"), { description = "Previous media" }) + +-- WM Control binds +hl.bind(mainMod .. " + Q", hl.dsp.window.close(), { description = "Close window" }) +hl.bind("SUPER + SHIFT + Q", hl.dsp.exit(), { description = "Exit WM" }) +hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen({ mode = 1, internal = 0, client = 2 }), + { description = "Maximize window" }) +hl.bind(mainMod .. " + SHIFT + F", hl.dsp.window.fullscreen({ mode = 0, internal = 0, client = 2 }), + { description = "Fullscreen window" }) +hl.bind(mainMod .. " + T", hl.dsp.window.float(), { description = "Toggle floating" }) +hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit"), { description = "Toggle split" }) +hl.bind(mainMod .. " + G", hl.dsp.layout("swapsplit"), { description = "Swap split" }) + +-- Window Switch +hl.bind(mainMod .. " + CTRL + left", hl.dsp.focus({ direction = "left" }), { description = "Focus left" }) +hl.bind(mainMod .. " + CTRL + right", hl.dsp.focus({ direction = "right" }), { description = "Focus right" }) +hl.bind(mainMod .. " + CTRL + up", hl.dsp.focus({ direction = "up" }), { description = "Focus up" }) +hl.bind(mainMod .. " + CTRL + down", hl.dsp.focus({ direction = "down" }), { description = "Focus down" }) +hl.bind(mainMod .. " + P", hl.dsp.window.pin(), { description = "Pin a window"}) +-- Window Move +-- hl.bind(mainMod .. " + SHIFT + left", hl.windo) + +-- Switch workspaces with mainMod + [0-9] +for i = 1, 10 do + local key = i % 10 + hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = key }), { description = "Focus workspace " .. key }) + hl.bind(mainMod .. " + SHIFT +" .. key, hl.dsp.window.move({ workspace = key }), + { description = "Move to workspace " .. key }) +end +-- hl.bind(mainMod .. " + 0", hl.dsp.workspace(10)) +hl.bind(mainMod .. " + Tab", hl.dsp.focus({ workspace = "previous" }), { description = "Focus previous workspace" }) +hl.bind(mainMod .. " + left", hl.dsp.focus({ workspace = "-1" }), { description = "Focus left workspace" }) +hl.bind(mainMod .. " + SHIFT + left", hl.dsp.window.move({ workspace = "-1" })) + +hl.bind(mainMod .. " + right", hl.dsp.focus({ workspace = "+1" }), { description = "Focus right workspace" }) +hl.bind(mainMod .. " + SHIFT + right", hl.dsp.window.move({ workspace = "+1" })) + +-- Move/resize windows with mainMod + LMB/RMB and dragging +hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true, description = "Drag window" }) +hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true, description = "Resize window" }) + +hl.bind(mainMod .. " + CTRL + SHIFT + left", hl.dsp.window.resize({ x = -40, y = 0, relative = true }), + { description = "Resize window left" }) +hl.bind(mainMod .. " + CTRL + SHIFT + right", hl.dsp.window.resize({ x = 40, y = 0, relative = true }), + { description = "Resize window right" }) +hl.bind(mainMod .. " + CTRL + SHIFT + up", hl.dsp.window.resize({ x = 0, y = -40, relative = true }), + { description = "Resize window up" }) +hl.bind(mainMod .. " + CTRL + SHIFT + down", hl.dsp.window.resize({ x = 0, y = 40, relative = true }), + { description = "Resize window down" }) + +-- Laptop multimedia keys for volume and LCD brightness +hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"), + { repeating = true, description = "Raise volume" }) +hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), + { repeating = true, description = "Lower volume" }) + +hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), + { repeating = true, description = "Toggle mute" }) +hl.bind("SHIFT + XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), + { repeating = true, description = "Toggle mic mute" }) + +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl s 5%+"), + { repeating = true, description = "Raise brightness" }) +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl s 5%-"), + { repeating = true, description = "Lower brightness" }) + +-- Screenshot a window +local satty = "/home/domenico/.cargo/bin/satty --filename - --copy-command wl-copy --fullscreen --output-filename ~/Immagini/Screenshots/satty-$(date '+%Y%m%d-%H:%M:%S').png" +local copy = "wl-copy" +hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd('grim -t png -g "$(slurp)" - | ' .. copy), { description = "Screenshot region" }) +hl.bind("SUPER + CTRL + SHIFT + S", hl.dsp.exec_cmd('grim -t png -g "$(slurp)" - | ' .. satty)) +hl.bind("PRINT", hl.dsp.exec_cmd('grim - | ' .. copy), { description = "Fullscreen Screenshots"}) +-- Night mode and ToggleMirror scripts +hl.bind("SUPER + M", hl.dsp.exec_cmd("bash ~/.config/hypr/scripts/toggleMirror.sh"), { description = "Toggle mirror" }) +hl.bind("SUPER + SHIFT + M", hl.dsp.exec_cmd("bash ~/.config/hypr/scripts/nightmode.sh"), { description = "Toggle night mode" }) + + + +-- Noctalia shortcut +hl.bind(mainMod .. " + Backslash", hl.dsp.exec_cmd(noctalia .. "launcher toggle"), { description = "Toggle quickshell bar" }) +--hl.bind(mainMod .. " + N", hl.dsp.global(noctalia .. ""), { description = "Toggle quickshell hub" }) +hl.bind(mainMod .. " + W", hl.dsp.exec_cmd(noctalia .. "plugin:wallcards toggle"), { description = "Toggle wall picker" }) +hl.bind(mainMod .. " + K", hl.dsp.global("quickshell:keybindingsToggle"), { description = "Toggle keybindings" }) +hl.bind(mainMod .. " + L", hl.dsp.global("quickshell:changeBarLayout"), { description = "Change bar layout" }) + + diff --git a/hypr/monitors.lua b/hypr/monitors.lua new file mode 100644 index 0000000..ca8c3dc --- /dev/null +++ b/hypr/monitors.lua @@ -0,0 +1,42 @@ +--################ +--### MONITORS ### +--################ + +hl.monitor({ + output = "eDP-1", + mode = "1920x1080@144", + position = "0x0", + scale = "1", + cm = "srgb" +}) + +-- hl.monitor({ +-- output = "HDMI-A-1", +-- mode = "1920x1080@60", +-- position = "0x1280", +-- scale = "1", +-- mirror = "eDP-1" +-- }) + + +-- hl.monitor({ +-- output = "DP-3", +-- mode = "1920x1080@60", +-- position = "0x450", +-- scale = "1" +-- }) + +-- hl.monitor({ +-- output = "DP-2", +-- mode = "1920x1080@144", +-- position = "1920x380", +-- scale = "1", +-- }) + +hl.monitor({ + output = "HDMI-A-1", + mode = "1920x1080@60", + position = "3840x0", + scale = "1", + transform = true +}) diff --git a/hypr/noctalia/noctalia-colors.conf b/hypr/noctalia/noctalia-colors.conf new file mode 100644 index 0000000..ca88cb0 --- /dev/null +++ b/hypr/noctalia/noctalia-colors.conf @@ -0,0 +1,25 @@ +$primary = rgb(cba6f7) +$surface = rgb(1e1e2e) +$secondary = rgb(fab387) +$error = rgb(f38ba8) +$tertiary = rgb(94e2d5) +$surface_lowest = rgb(212232) + +general { + col.active_border = $primary + col.inactive_border = $surface +} + +group { + col.border_active = $secondary + col.border_inactive = $surface + col.border_locked_active = $error + col.border_locked_inactive = $surface + + groupbar { + col.active = $secondary + col.inactive = $surface + col.locked_active = $error + col.locked_inactive = $surface + } +} diff --git a/hypr/noctalia/noctalia-colors.lua b/hypr/noctalia/noctalia-colors.lua new file mode 100644 index 0000000..554742c --- /dev/null +++ b/hypr/noctalia/noctalia-colors.lua @@ -0,0 +1,35 @@ +-- Colors template generated by Noctalia +-- Source command is: +-- dofile(os.getenv("HOME") .. "/.config/hypr/noctalia/noctalia-colors.lua") + +local primary = "rgb(cba6f7)" +local surface = "rgb(1e1e2e)" +local secondary = "rgb(fab387)" +local error = "rgb(f38ba8)" + +hl.config({ + general = { + col = { + active_border = primary, + inactive_border = surface, + }, + }, + + group = { + col = { + border_active = secondary, + border_inactive = surface, + border_locked_active = error, + border_locked_inactive = surface, + }, + + groupbar = { + col = { + active = secondary, + inactive = surface, + locked_active = error, + locked_inactive = surface, + }, + }, + }, +}) diff --git a/hypr/performance.lua b/hypr/performance.lua new file mode 100644 index 0000000..aefacf6 --- /dev/null +++ b/hypr/performance.lua @@ -0,0 +1,6 @@ +-- no blur +hl.config({ decoration = { blur = { enabled = false } } }) + +-- no shadow +hl.config({ decoration = { shadow = { enabled = false } } }) + diff --git a/hypr/plugins.conf b/hypr/plugins.conf new file mode 100644 index 0000000..4baaf9d --- /dev/null +++ b/hypr/plugins.conf @@ -0,0 +1,134 @@ +################## PLUGIN MANAGER ################## + +plugin { + +dynamic-cursors { + + # enables the plugin + enabled = true + # sets the cursor behaviour, supports these values: + # tilt - tilt the cursor based on x-velocity + # rotate - rotate the cursor based on movement direction + # stretch - stretch the cursor shape based on direction and velocity + # none - do not change the cursors behaviour + mode = stretch + + # minimum angle difference in degrees after which the shape is changed + # smaller values are smoother, but more expensive for hw cursors + threshold = 2 + + # for mode = rotate + rotate { + + # length in px of the simulated stick used to rotate the cursor + # most realistic if this is your actual cursor size + length = 20 + + # clockwise offset applied to the angle in degrees + # this will apply to ALL shapes + offset = 0.0 + } + + # for mode = tilt + tilt { + + # controls how powerful the tilt is, the lower, the more power + # this value controls at which speed (px/s) the full tilt is reached + # the full tilt being 60° in both directions + limit = 5000 + + # relationship between speed and tilt, supports these values: + # linear - a linear function is used + # quadratic - a quadratic function is used (most realistic to actual air drag) + # negative_quadratic - negative version of the quadratic one, feels more aggressive + # see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done + function = negative_quadratic + + # time window (ms) over which the speed is calculated + # higher values will make slow motions smoother but more delayed + window = 100 + } + + # for mode = stretch + stretch { + + # controls how much the cursor is stretched + # this value controls at which speed (px/s) the full stretch is reached + # the full stretch being twice the original length + limit = 3000 + + # relationship between speed and stretch amount, supports these values: + # linear - a linear function is used + # quadratic - a quadratic function is used + # negative_quadratic - negative version of the quadratic one, feels more aggressive + # see `activation` in `src/mode/utils.cpp` for how exactly the calculation is done + function = quadratic + + # time window (ms) over which the speed is calculated + # higher values will make slow motions smoother but more delayed + window = 100 + } + + # configure shake to find + # magnifies the cursor if its is being shaken + shake { + + # enables shake to find + enabled = true + + # use nearest-neighbour (pixelated) scaling when shaking + # may look weird when effects are enabled + nearest = true + + # controls how soon a shake is detected + # lower values mean sooner + threshold = 6.0 + + # magnification level immediately after shake start + base = 4.0 + # magnification increase per second when continuing to shake + speed = 4.0 + # how much the speed is influenced by the current shake intensitiy + influence = 0.0 + + # maximal magnification the cursor can reach + # values below 1 disable the limit (e.g. 0) + limit = 0.0 + + # time in millseconds the cursor will stay magnified after a shake has ended + timeout = 2000 + + # show cursor behaviour `tilt`, `rotate`, etc. while shaking + effects = false + + # enable ipc events for shake + # see the `ipc` section below + ipc = false + } + + # use hyprcursor to get a higher resolution texture when the cursor is magnified + # see the `hyprcursor` section below + hyprcursor { + + # use nearest-neighbour (pixelated) scaling when magnifing beyond texture size + # this will also have effect without hyprcursor support being enabled + # 0 / false - never use pixelated scaling + # 1 / true - use pixelated when no highres image + # 2 - always use pixleated scaling + nearest = true + + # enable dedicated hyprcursor support + enabled = true + + # resolution in pixels to load the magnified shapes at + # be warned that loading a very high-resolution image will take a long time and might impact memory consumption + # -1 means we use [normal cursor size] * [shake:base option] + resolution = -1 + + # shape to use when clientside cursors are being magnified + # see the shape-name property of shape rules for possible names + # specifying clientside will use the actual shape, but will be pixelated + fallback = clientside + } + } +} diff --git a/hypr/scripts/EOS-greeter.conf b/hypr/scripts/EOS-greeter.conf new file mode 100755 index 0000000..e893257 --- /dev/null +++ b/hypr/scripts/EOS-greeter.conf @@ -0,0 +1,10 @@ +## Configuration file for eos-welcome. +# Note: using bash syntax. +# +# 'Greeter' values: enable or disable. +# 'OnceDaily' values: no or yes; yes means eos-welcome is shown only once a day. +# 'LastCheck' values: automatically filled by eos-welcome. + +Greeter=enable +OnceDaily=no +LastCheck=0 diff --git a/hypr/scripts/hyprPicker.sh b/hypr/scripts/hyprPicker.sh new file mode 100755 index 0000000..f85b61b --- /dev/null +++ b/hypr/scripts/hyprPicker.sh @@ -0,0 +1,4 @@ +#!/bin/sh +hyprpicker --format hex | head -c -1 | wl-copy +convert -size 100x100 xc:$(wl-paste) /tmp/color.png +notify-send -i /tmp/color.png "Copied to your clipboard!" "$(wl-paste)" diff --git a/hypr/scripts/init_wallpapers.sh b/hypr/scripts/init_wallpapers.sh new file mode 100755 index 0000000..ef303ef --- /dev/null +++ b/hypr/scripts/init_wallpapers.sh @@ -0,0 +1,4 @@ +if [ ! -f "$HOME/.current_wallpaper" ]; then + matugen image -t scheme-fidelity -m dark --source-color-index 0 ~/.config/wallpapers/decline.png --show-colors --verbose --fallback-color "#000000" + cp ~/.config/wallpapers/decline.png ~/.current_wallpaper +fi diff --git a/hypr/scripts/nightmode.sh b/hypr/scripts/nightmode.sh new file mode 100755 index 0000000..a0f1ca2 --- /dev/null +++ b/hypr/scripts/nightmode.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if pgrep -x "hyprsunset" > /dev/null +then + killall -9 hyprsunset + notify-send "🌞 Day Mode Activated" -u "low" +else + hyprsunset -t 3500 & + notify-send "🌙 Night Mode Activated" -u "low" +fi diff --git a/hypr/scripts/playerctlock.sh b/hypr/scripts/playerctlock.sh new file mode 100755 index 0000000..d299118 --- /dev/null +++ b/hypr/scripts/playerctlock.sh @@ -0,0 +1,115 @@ +#!/bin/bash + +if [ $# -eq 0 ]; then + echo "Usage: $0 --title | --arturl | --artist | --length | --album | --source" + exit 1 +fi + +# Function to get metadata using playerctl +get_metadata() { + key=$1 + playerctl metadata --format "{{ $key }}" 2>/dev/null +} + +# Check for arguments + +# Function to determine the source and return an icon and text +get_source_info() { + trackid=$(get_metadata "mpris:trackid") + if [[ "$trackid" == *"firefox"* ]]; then + echo -e "Firefox 󰈹" + elif [[ "$trackid" == *"spotify"* ]]; then + echo -e "Spotify " + elif [[ "$trackid" == *"chromium"* ]]; then + echo -e "Chrome " + else + echo "" + fi +} + +# Parse the argument +case "$1" in +--title) + title=$(get_metadata "xesam:title") + if [ -z "$title" ]; then + echo "" + else + echo "${title:0:28}" # Limit the output to 50 characters + fi + ;; +--arturl) + url=$(get_metadata "mpris:artUrl") + if [ -z "$url" ]; then + echo "" + else + if [[ "$url" == file://* ]]; then + url=${url#file://} + elif [[ "$url" == http://* || "$url" == https://* ]]; then + filename=$(basename "$url") + if [[ "$filename" != *.png && "$filename" != *.jpg && "$filename" != *.jpeg ]]; then + filename="${filename}.jpg" + fi + wget -q "$url" -O "/tmp/$filename" + url="/tmp/$filename" + fi + + # Make sure local files also have a png/jpg extension if required + if [[ "$url" != *.png && "$url" != *.jpg && "$url" != *.jpeg ]]; then + if [ -f "$url" ]; then + cp "$url" "/tmp/$(basename "$url").jpg" + url="/tmp/$(basename "$url").jpg" + fi + fi + + echo "$url" + fi + ;; +--artist) + artist=$(get_metadata "xesam:artist") + if [ -z "$artist" ]; then + echo "" + else + echo "${artist:0:30}" # Limit the output to 50 characters + fi + ;; +--length) + length=$(get_metadata "mpris:length") + if [ -z "$length" ]; then + echo "" + else + # Convert length from microseconds to a more readable format (seconds) + echo "$(echo "scale=2; $length / 1000000 / 60" | bc) m" + fi + ;; +--status) + status=$(playerctl status 2>/dev/null) + if [[ $status == "Playing" ]]; then + echo "󰎆" + elif [[ $status == "Paused" ]]; then + echo "󱑽" + else + echo "" + fi + ;; +--album) + album=$(playerctl metadata --format "{{ xesam:album }}" 2>/dev/null) + if [[ -n $album ]]; then + echo "$album" + else + status=$(playerctl status 2>/dev/null) + if [[ -n $status ]]; then + echo "Not album" + else + echo "" + fi + fi + ;; +--source) + get_source_info + ;; +*) + echo "Invalid option: $1" + echo "Usage: $0 --title | --url | --artist | --length | --album | --source" + exit 1 + ;; +esac diff --git a/hypr/scripts/screensharing.sh b/hypr/scripts/screensharing.sh new file mode 100755 index 0000000..15e178a --- /dev/null +++ b/hypr/scripts/screensharing.sh @@ -0,0 +1,8 @@ +#!/bin/bash +sleep 1 +killall xdg-desktop-portal-hyprland +killall xdg-desktop-portal-wlr +killall xdg-desktop-portal +/usr/libexec/xdg-desktop-portal-hyprland & +sleep 2 +/usr/lib/xdg-desktop-portal & diff --git a/hypr/scripts/toggleMirror.sh b/hypr/scripts/toggleMirror.sh new file mode 100755 index 0000000..33f2aa0 --- /dev/null +++ b/hypr/scripts/toggleMirror.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Toggle mirroring HDMI-A-1 to/from eDP-1 on Hyprland + +isMirror=$(hyprctl monitors all -j | jq -r '.[] | select(.name=="HDMI-A-1") | .mirrorOf' 2>/dev/null || echo "none") +echo "Current mirror status: $isMirror" + +if [ "$isMirror" == "none" ]; then + hyprctl eval 'hl.monitor({ output = "HDMI-A-1", mode = "1920x1080@59.95", position = "1920x0", scale = 1.0, mirror = "eDP-1" })' +else + hyprctl eval 'hl.monitor({ output = "HDMI-A-1", mode = "1920x1080@59.95", position = "1920x0", scale = 1.0, mirror = "none"})' +fi diff --git a/hypr/scripts/wallpapers/set.sh b/hypr/scripts/wallpapers/set.sh new file mode 100755 index 0000000..04f36f9 --- /dev/null +++ b/hypr/scripts/wallpapers/set.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eu + +WALL=$1 +echo "setting $WALL as wallpaper" +matugen image -t scheme-fidelity -m dark $WALL --show-colors --verbose --fallback-color "#000000" +echo "set $WALL as wallpaper sucessfuly" diff --git a/hypr/windowrule.lua b/hypr/windowrule.lua new file mode 100644 index 0000000..84d31cd --- /dev/null +++ b/hypr/windowrule.lua @@ -0,0 +1,90 @@ +local inFocusOpacity = "0.95" +local notInFocusOpacity = "0.8" + + + +hl.window_rule({ + suppress_event = "maximize", + match = { + class = ".*" + } +}) + +hl.window_rule({ + no_initial_focus = true, + match = { + class = "^$", + title = "^$", + xwayland = 1, + float = 1, + fullscreen = 0, + pin = 0 + } +}) + + +hl.window_rule({ + opacity = inFocusOpacity .. " " .. notInFocusOpacity, + match = { title = "^.*().*$" } +}) + +hl.window_rule({ + opacity = "0.80", + float = true, + size = { 600, 400 }, + match = { class = "^(nwg-displays)$" } +}) + +hl.window_rule({ + opacity = 0.80, + float = true, + size = { 600, 400 }, + match = { class = "^(blueman-manager)$" } +}) + +hl.window_rule({ + opacity = 0.80, + float = true, + size = { 600, 400 }, + match = { class = "^(org.pulseaudio.pavucontrol)$" } +}) + + +-- xwaylandvideobridge +hl.window_rule({ + opacity = "0.0 override", + no_anim = 1, + no_initial_focus = 1, + no_focus = 1, + max_size = { 1, 1 }, + no_blur = 1, + match = { class = "^(xwaylandvideobridge)$" } +}) + + + +-- Picture in Picture +hl.window_rule({ + float = true, + tile = false, + opacity = "1.0", + pin = true, + match = { + title = "(Picture in picture)" + } +}) + + +-- Spotify mini player +hl.window_rule({ + float = true, + tile = false, + opacity = "1.0 0.75", + size={419, 56}, + move={1482, 1006}, + pin = true, + match = { + workspace = "special:music", + class="Chromium-browser", + } +}) \ No newline at end of file diff --git a/hypr/workspace.lua b/hypr/workspace.lua new file mode 100644 index 0000000..b3a6659 --- /dev/null +++ b/hypr/workspace.lua @@ -0,0 +1,40 @@ +local music_workspace = "music" +local voicechat_workspace = "voice" +local obs_workspace = "obs" + +local numkeys = { + {code = "87"}, -- 1 + {code = "88"}, -- 2 + {code = "89"}, -- 3 + {code = "83"}, -- 4 + {code = "84"}, -- 5 + {code = "85"}, -- 6 + {code = "79"}, -- 7 + {code = "80"}, -- 8 + {code = "81"}, -- 9 + {code = "90"} -- 0 +} + +-- Keybinds that define workspaces +hl.bind(mainMod .. " + code:"..numkeys[7].code, hl.dsp.workspace.toggle_special(music_workspace)) +hl.bind(mainMod .. " + code:"..numkeys[8].code, hl.dsp.workspace.toggle_special(voicechat_workspace)) +hl.bind(mainMod .. " + code:"..numkeys[9].code, hl.dsp.workspace.toggle_special(obs_workspace)) + + +hl.window_rule({ + name = "discord", + match = {class = "^(discord)$"}, + workspace = "special:" .. voicechat_workspace +}) + +hl.window_rule({ + name = "spotify", + match = {class = "^(Spotify)$"}, + workspace = "special:" .. music_workspace +}) + +hl.window_rule({ + name = "obs", + match = {class = "com.obsproject.Studio"}, + workspace = "special:" .. obs_workspace +})