523 lines
10 KiB
Lua
523 lines
10 KiB
Lua
-- ~/.config/hypr/hyprland.lua
|
||
-- Hyprland >= 0.55
|
||
-- Einfache, konservative Lua-Konfiguration
|
||
|
||
local mainMod = "ALT"
|
||
|
||
local terminal = "kitty"
|
||
local fileManager = "thunar"
|
||
local menu = "wofi --show drun"
|
||
local browser = "firefox"
|
||
|
||
|
||
-- ============================================================
|
||
-- HAUPTKONFIGURATION
|
||
-- ============================================================
|
||
|
||
hl.env("XCURSOR_THEME", "Bibata-Modern-Ice")
|
||
hl.env("XCURSOR_SIZE", "24")
|
||
hl.env("HYPRCURSOR_THEME", "Bibata-Modern-Ice")
|
||
hl.env("HYPRCURSOR_SIZE", "24")
|
||
|
||
hl.on("hyprland.start", function()
|
||
hl.exec_cmd("hyprctl setcursor Bibata-Modern-Ice 24")
|
||
end)
|
||
|
||
|
||
hl.config({
|
||
|
||
monitor = {
|
||
",preferred,auto,1",
|
||
},
|
||
|
||
env = {
|
||
"XDG_CURRENT_DESKTOP,Hyprland",
|
||
"XDG_SESSION_TYPE,wayland",
|
||
"XDG_SESSION_DESKTOP,Hyprland",
|
||
"QT_QPA_PLATFORM,wayland;xcb",
|
||
"GDK_BACKEND,wayland,x11",
|
||
"MOZ_ENABLE_WAYLAND,1",
|
||
"XCURSOR_THEME,Bibata-Modern-Ice",
|
||
"XCURSOR_SIZE,24",
|
||
"HYPRCURSOR_THEME,Bibata-Modern-Ice",
|
||
"HYPRCURSOR_SIZE,24",
|
||
},
|
||
|
||
input = {
|
||
kb_layout = "de",
|
||
follow_mouse = 1,
|
||
sensitivity = 0,
|
||
|
||
touchpad = {
|
||
natural_scroll = true,
|
||
disable_while_typing = true,
|
||
tap_to_click = true,
|
||
},
|
||
},
|
||
|
||
general = {
|
||
gaps_in = 5,
|
||
gaps_out = 12,
|
||
border_size = 2,
|
||
|
||
["col.active_border"] = "rgba(89b4faee)",
|
||
["col.inactive_border"] = "rgba(31324455)",
|
||
|
||
resize_on_border = true,
|
||
layout = "dwindle",
|
||
allow_tearing = false,
|
||
},
|
||
|
||
decoration = {
|
||
rounding = 8,
|
||
|
||
blur = {
|
||
enabled = true,
|
||
size = 6,
|
||
passes = 2,
|
||
},
|
||
},
|
||
|
||
animations = {
|
||
enabled = true,
|
||
},
|
||
|
||
dwindle = {
|
||
preserve_split = true,
|
||
},
|
||
|
||
master = {
|
||
new_status = "master",
|
||
},
|
||
|
||
misc = {
|
||
force_default_wallpaper = 0,
|
||
disable_hyprland_logo = true,
|
||
disable_splash_rendering = true,
|
||
},
|
||
})
|
||
|
||
-- ============================================================
|
||
-- LAYOUT WECHSELN (dwm-artig)
|
||
-- ============================================================
|
||
|
||
local layoutCycle = { "dwindle", "master" }
|
||
|
||
hl.bind(mainMod .. " + SPACE", function()
|
||
local current = hl.get_config("general.layout")
|
||
|
||
local nextLayout = layoutCycle[1]
|
||
for i, name in ipairs(layoutCycle) do
|
||
if name == current then
|
||
nextLayout = layoutCycle[(i % #layoutCycle) + 1]
|
||
break
|
||
end
|
||
end
|
||
|
||
hl.config({ general = { layout = nextLayout } })
|
||
|
||
hl.notification.create({
|
||
text = "Layout: " .. nextLayout,
|
||
timeout = 800,
|
||
icon = "ok",
|
||
})
|
||
end)
|
||
|
||
-- Master-Layout: Orientierung durchschalten (links/rechts/oben/unten/zentriert)
|
||
-- entspricht in etwa dwm's tile/bstack-Varianten – nur wirksam wenn master aktiv
|
||
hl.bind(mainMod .. " + SHIFT + SPACE", hl.dsp.layout("orientationcycle"))
|
||
|
||
|
||
hl.env("GTK_THEME", "Adwaita:dark")
|
||
|
||
hl.config({
|
||
exec_once = {
|
||
"/usr/lib/xdg-desktop-portal-gtk"
|
||
}
|
||
})
|
||
|
||
-- ============================================================
|
||
-- AUTOSTART
|
||
-- ============================================================
|
||
|
||
hl.on("hyprland.start", function()
|
||
|
||
hl.exec_cmd(
|
||
"dbus-update-activation-environment " ..
|
||
"WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
|
||
)
|
||
|
||
|
||
hl.exec_cmd("killall -e xdg-desktop-portal-hyprland xdg-desktop-portal")
|
||
|
||
-- kurz warten, dann XDPH zuerst starten (Backend muss vor dem Router da sein)
|
||
hl.exec_cmd("sh -c 'sleep 1 && /usr/libexec/xdg-desktop-portal-hyprland'")
|
||
hl.exec_cmd("sh -c 'sleep 2 && /usr/libexec/xdg-desktop-portal'")
|
||
|
||
|
||
hl.exec_cmd("qs -c noctalia-shell")
|
||
hl.exec_cmd("gentoo-pipewire-launcher")
|
||
hl.exec_cmd("mpd ~/.config/mpd/mpd.conf &")
|
||
end)
|
||
|
||
-- ============================================================
|
||
-- NOCTALIA LAYER RULE
|
||
-- ============================================================
|
||
|
||
hl.layer_rule({
|
||
name = "noctalia",
|
||
match = {
|
||
namespace = "^noctalia-.*$",
|
||
},
|
||
no_anim = true,
|
||
})
|
||
|
||
|
||
-- ============================================================
|
||
-- TOUCHPAD-GESTEN
|
||
-- ============================================================
|
||
|
||
hl.gesture({
|
||
fingers = 3,
|
||
direction = "horizontal",
|
||
action = "workspace",
|
||
})
|
||
|
||
|
||
-- ============================================================
|
||
-- PROGRAMME
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
mainMod .. " + Return",
|
||
hl.dsp.exec_cmd(terminal)
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + E",
|
||
hl.dsp.exec_cmd(fileManager)
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + R",
|
||
hl.dsp.exec_cmd(menu)
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + B",
|
||
hl.dsp.exec_cmd(browser)
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- FENSTER
|
||
-- ============================================================
|
||
|
||
-- Aktives Fenster schließen
|
||
hl.bind(
|
||
mainMod .. " + Q",
|
||
hl.dsp.window.close()
|
||
)
|
||
|
||
-- Hyprland beenden
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + Q",
|
||
hl.dsp.exit()
|
||
)
|
||
|
||
-- Floating umschalten
|
||
hl.bind(
|
||
mainMod .. " + V",
|
||
hl.dsp.window.float({
|
||
action = "toggle",
|
||
})
|
||
)
|
||
|
||
-- Pseudotile umschalten
|
||
hl.bind(
|
||
mainMod .. " + P",
|
||
hl.dsp.window.pseudo({
|
||
action = "toggle",
|
||
})
|
||
)
|
||
|
||
-- Split-Richtung umschalten
|
||
hl.bind(
|
||
mainMod .. " + J",
|
||
hl.dsp.layout("togglesplit")
|
||
)
|
||
|
||
-- Fullscreen umschalten
|
||
hl.bind(
|
||
mainMod .. " + F",
|
||
hl.dsp.window.fullscreen({
|
||
mode = "fullscreen",
|
||
action = "toggle",
|
||
})
|
||
)
|
||
|
||
-- Mod + Linksklick-Drag: Fenster verschieben
|
||
hl.bind(
|
||
mainMod .. " + mouse:272",
|
||
hl.dsp.window.drag(),
|
||
{ mouse = true }
|
||
)
|
||
|
||
-- Mod + Rechtsklick-Drag: Fenster resizen
|
||
hl.bind(
|
||
mainMod .. " + mouse:273",
|
||
hl.dsp.window.resize(),
|
||
{ mouse = true }
|
||
)
|
||
|
||
-- ============================================================
|
||
-- FOKUS WECHSELN
|
||
-- ============================================================
|
||
|
||
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",
|
||
})
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- FENSTER VERSCHIEBEN
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + left",
|
||
hl.dsp.window.move({
|
||
direction = "left",
|
||
})
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + right",
|
||
hl.dsp.window.move({
|
||
direction = "right",
|
||
})
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + up",
|
||
hl.dsp.window.move({
|
||
direction = "up",
|
||
})
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + down",
|
||
hl.dsp.window.move({
|
||
direction = "down",
|
||
})
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- WORKSPACES 1 BIS 9
|
||
-- ============================================================
|
||
|
||
for i = 1, 9 do
|
||
|
||
-- Workspace öffnen
|
||
hl.bind(
|
||
mainMod .. " + " .. tostring(i),
|
||
hl.dsp.focus({
|
||
workspace = tostring(i),
|
||
})
|
||
)
|
||
|
||
-- Fenster zu Workspace verschieben
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + " .. tostring(i),
|
||
hl.dsp.window.move({
|
||
workspace = tostring(i),
|
||
follow = false,
|
||
})
|
||
)
|
||
end
|
||
|
||
|
||
-- ============================================================
|
||
-- WORKSPACE 10
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
mainMod .. " + 0",
|
||
hl.dsp.focus({
|
||
workspace = "10",
|
||
})
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + SHIFT + 0",
|
||
hl.dsp.window.move({
|
||
workspace = "10",
|
||
follow = false,
|
||
})
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- WORKSPACE MIT MAUSRAD
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
mainMod .. " + mouse_down",
|
||
hl.dsp.focus({
|
||
workspace = "e+1",
|
||
})
|
||
)
|
||
|
||
hl.bind(
|
||
mainMod .. " + mouse_up",
|
||
hl.dsp.focus({
|
||
workspace = "e-1",
|
||
})
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- SCREENSHOTS
|
||
-- ============================================================
|
||
|
||
-- Bereich auswählen
|
||
hl.bind(
|
||
"Print",
|
||
hl.dsp.exec_cmd(
|
||
'grim -g "$(slurp)" - | wl-copy'
|
||
)
|
||
)
|
||
|
||
-- Gesamter Bildschirm
|
||
hl.bind(
|
||
"SHIFT + Print",
|
||
hl.dsp.exec_cmd(
|
||
"grim - | wl-copy"
|
||
)
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- AUDIO
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
"XF86AudioRaiseVolume",
|
||
hl.dsp.exec_cmd(
|
||
"wpctl set-volume -l 1.0 @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"
|
||
),
|
||
{
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- MEDIEN
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
"XF86AudioPlay",
|
||
hl.dsp.exec_cmd("playerctl play-pause"),
|
||
{
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
hl.bind(
|
||
"XF86AudioNext",
|
||
hl.dsp.exec_cmd("playerctl next"),
|
||
{
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
hl.bind(
|
||
"XF86AudioPrev",
|
||
hl.dsp.exec_cmd("playerctl previous"),
|
||
{
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- HELLIGKEIT
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
"XF86MonBrightnessUp",
|
||
hl.dsp.exec_cmd("brightnessctl set +5%"),
|
||
{
|
||
repeating = true,
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
hl.bind(
|
||
"XF86MonBrightnessDown",
|
||
hl.dsp.exec_cmd("brightnessctl set 5%-"),
|
||
{
|
||
repeating = true,
|
||
locked = true,
|
||
}
|
||
)
|
||
|
||
|
||
-- ============================================================
|
||
-- BILDSCHIRM SPERREN
|
||
-- ============================================================
|
||
|
||
hl.bind(
|
||
mainMod .. " + L",
|
||
hl.dsp.exec_cmd(
|
||
"qs -c noctalia-shell ipc call lockScreen lock"
|
||
)
|
||
)
|