diff --git a/modules/wm/hyprland/default.nix b/modules/wm/hyprland/default.nix index 211d140..968d547 100644 --- a/modules/wm/hyprland/default.nix +++ b/modules/wm/hyprland/default.nix @@ -268,6 +268,10 @@ in { misc = { forceDefaultWallpaper = 0; keyPressEnablesDPMS = true; + newWindowTakesOverFullscreen = 2; + + enableSwallow = true; + swallowRegex = "^kitty$"; }; input = { @@ -278,6 +282,8 @@ in { sensitivity = 0.0; touchpad.naturalScroll = true; numlockByDefault = true; + + touchpad.dragLock = true; }; gestures = { @@ -286,7 +292,7 @@ in { group = { autoGroup = false; - dragIntoGroup = 2; + dragIntoGroup = 1; col = { borderActive = config.horseman.wm.hyprland.config.general.col.activeBorder; # I don't wanna believe this can't be done better :( @@ -302,6 +308,15 @@ in { }; }; + binds = { + workspaceCenterOn = 1; + dragThreshold = 50; + }; + + ecosystem = { + noDonationNag = true; + }; + monitors = { defaultMonitor = true; }; diff --git a/modules/wm/hyprland/options.nix b/modules/wm/hyprland/options.nix index 9a337e9..50d2576 100644 --- a/modules/wm/hyprland/options.nix +++ b/modules/wm/hyprland/options.nix @@ -3,10 +3,13 @@ config, ... }: let - inherit (lib) mkOption mkIf types trivial strings; + inherit (lib) mkOption types mkIf trivial strings; inherit (builtins) concatStringsSep elem genList elemAt; + inherit (trivial) boolToString; + inherit (strings) floatToString; cfg = config.horseman.wm.hyprland; homeCfg = config.horseman; + keybinding = types.submodule { options = { flags = mkOption { @@ -45,205 +48,1171 @@ }; }; }; + vec2 = types.submodule { + options = { + x = mkOption {type = types.int;}; + y = mkOption {type = types.int;}; + }; + }; + fontWeight = types.enum ["thin" "ultralight" "light" "semilight" "book" "normal" "medium" "semibold" "bold" "ultrabold" "heavy" "ultraheavy"]; in { - options = { - horseman.wm.hyprland.config = { - execOnce = mkOption {type = types.listOf types.str;}; - env = mkOption {type = types.listOf types.str;}; - windowrules = mkOption {type = types.listOf types.str;}; - - workspaces = mkOption { - type = types.listOf types.str; + options.horseman.wm.hyprland.config = { + execOnce = mkOption {type = types.listOf types.str;}; + env = mkOption {type = types.listOf types.str;}; + windowrules = mkOption {type = types.listOf types.str;}; + workspaces = mkOption {type = types.listOf types.str;}; + general = { + borderSize = mkOption { + type = types.int; + default = 1; + }; + noBorderOnFloating = mkOption { + type = types.bool; + default = false; + }; + gapsIn = mkOption { + type = types.int; + default = 5; + }; + gapsOut = mkOption { + type = types.int; + default = 20; + }; + gapsWorkspaces = mkOption { + type = types.int; + default = 0; + }; + col.inactiveBorder = mkOption { + type = types.str; + default = "0xff444444"; + }; + col.activeBorder = mkOption { + type = types.str; + default = "0xffffffff"; + }; + col.nogroupBorder = mkOption { + type = types.str; + default = "0xffffaaff"; + }; + col.nogroupBorderActive = mkOption { + type = types.str; + default = "0xffff00ff"; + }; + layout = mkOption { + type = types.enum ["dwindle" "master"]; + default = "dwindle"; + }; + noFocusFallback = mkOption { + type = types.bool; + default = false; + }; + resizeOnBorder = mkOption { + type = types.bool; + default = false; + }; + extendBorderGrabArea = mkOption { + type = types.int; + default = 15; + }; + hoverIconOnBorder = mkOption { + type = types.bool; + default = true; + }; + allowTearing = mkOption { + type = types.bool; + default = false; + }; + resizeCorner = mkOption { + type = types.ints.between 0 4; + default = 0; }; - general = { - gapsIn = mkOption {type = types.int;}; - gapsOut = mkOption {type = types.int;}; - borderSize = mkOption {type = types.int;}; - col.activeBorder = mkOption {type = types.str;}; - col.inactiveBorder = mkOption {type = types.str;}; - resizeOnBorder = mkOption {type = types.bool;}; - allowTearing = mkOption {type = types.bool;}; - layout = mkOption {type = types.enum ["dwindle" "master"];}; - }; - - decoration = { - rounding = mkOption {type = types.int;}; - activeOpacity = mkOption {type = types.float;}; - inactiveOpacity = mkOption {type = types.float;}; - - shadow = { - enabled = mkOption {type = types.bool;}; - range = mkOption {type = types.int;}; - renderPower = mkOption {type = types.int;}; - color = mkOption {type = types.str;}; - }; - - blur = { - enabled = mkOption {type = types.bool;}; - size = mkOption {type = types.int;}; - passes = mkOption {type = types.int;}; - vibrancy = mkOption {type = types.float;}; - }; - }; - - animations = { + snap = { enabled = mkOption { type = types.bool; + default = false; }; + windowGap = mkOption { + type = types.int; + default = 10; + }; + monitorGap = mkOption { + type = types.int; + default = 10; + }; + borderOverlap = mkOption { + type = types.bool; + default = false; + }; + }; + }; - beziers = mkOption { - type = types.listOf (types.submodule { - options = { - name = mkOption {type = types.str;}; - startX = mkOption {type = types.number;}; - startY = mkOption {type = types.number;}; - endX = mkOption {type = types.number;}; - endY = mkOption {type = types.number;}; + decoration = { + rounding = mkOption { + type = types.int; + default = 0; + }; + roundingPower = mkOption { + type = types.numbers.between 2 10; + default = 2.0; + }; + activeOpacity = mkOption { + type = types.numbers.between 0 1; + default = 1.0; + }; + inactiveOpacity = mkOption { + type = types.numbers.between 0 1; + default = 1.0; + }; + fullscreenOpacity = mkOption { + type = types.numbers.between 0 1; + default = 1.0; + }; + dimInactive = mkOption { + type = types.bool; + default = false; + }; + dimStrength = mkOption { + type = types.numbers.between 0 1; + default = 0.5; + }; + dimSpecial = mkOption { + type = types.numbers.between 0 1; + default = 0.2; + }; + dimAround = mkOption { + type = types.numbers.between 0 1; + default = 0.4; + }; + screenShader = mkOption { + type = types.str; + default = ""; + }; + borderPartOfWindow = mkOption { + type = types.bool; + default = true; + }; + + blur = { + enabled = mkOption { + type = types.bool; + default = true; + }; + size = mkOption { + type = types.int; + default = 8; + }; + passes = mkOption { + type = types.int; + default = 1; + }; + ignoreOpacity = mkOption { + type = types.bool; + default = true; + }; + newOptimizations = mkOption { + type = types.bool; + default = true; + }; + xray = mkOption { + type = types.bool; + default = false; + }; + noise = mkOption { + type = types.numbers.between 0 1; + default = 0.0117; + }; + contrast = mkOption { + type = types.numbers.between 0 2; + default = 0.8916; + }; + brightness = mkOption { + type = types.numbers.between 0 2; + default = 0.8172; + }; + vibrancy = mkOption { + type = types.numbers.between 0 1; + default = 0.1696; + }; + vibrancyDarkness = mkOption { + type = types.numbers.between 0 1; + default = 0.0; + }; + special = mkOption { + type = types.bool; + default = false; + }; + popups = mkOption { + type = types.bool; + default = false; + }; + popupsIgnorealpha = mkOption { + type = types.numbers.between 0 1; + default = 0.2; + }; + inputMethods = mkOption { + type = types.bool; + default = false; + }; + inputMethodsIgnorealpha = mkOption { + type = types.numbers.between 0 1; + default = 0.2; + }; + }; + + shadow = { + enabled = mkOption { + type = types.bool; + default = true; + }; + range = mkOption { + type = types.int; + default = 4; + }; + renderPower = mkOption { + type = types.ints.between 1 4; + default = 3; + }; + sharp = mkOption { + type = types.bool; + default = false; + }; + ignoreWindow = mkOption { + type = types.bool; + default = true; + }; + color = mkOption { + type = types.str; + default = "0xee1a1a1a"; + }; + colorInactive = mkOption { + type = types.nullOr types.str; + default = null; + }; + offset = mkOption { + type = vec2; + default = { + x = 0; + y = 0; + }; + }; + scale = mkOption { + type = types.numbers.between 0 1; + default = 1.0; + }; + }; + }; + + animations = { + enabled = mkOption { + type = types.bool; + default = true; + }; + workspaceWraparound = mkOption { + type = types.bool; + default = false; + }; + + beziers = mkOption { + type = types.listOf (types.submodule { + options = { + name = mkOption {type = types.str;}; + startX = mkOption {type = types.number;}; + startY = mkOption {type = types.number;}; + endX = mkOption {type = types.number;}; + endY = mkOption {type = types.number;}; + }; + }); + }; + + animations = mkOption { + type = types.listOf (types.submodule { + options = { + name = mkOption {type = types.str;}; + on = mkOption {type = types.bool;}; + speed = mkOption { + type = types.number; + default = 0; }; - }); - }; - - animations = mkOption { - type = types.listOf (types.submodule { - options = { - name = mkOption {type = types.str;}; - on = mkOption {type = types.bool;}; - speed = mkOption { - type = types.number; - default = 0; - }; - curve = mkOption { - type = types.str; - default = ""; - }; - style = mkOption { - type = types.str; - default = ""; - }; + curve = mkOption { + type = types.str; + default = ""; }; - }); - }; - }; - - dwindle = { - pseudotile = mkOption {type = types.bool;}; - preserveSplit = mkOption {type = types.bool;}; - }; - - master = { - newStatus = mkOption {type = types.enum ["master" "slave" "inherit"];}; - }; - - misc = { - forceDefaultWallpaper = mkOption {type = types.enum [0 1 2 (-1)];}; - keyPressEnablesDPMS = mkOption {type = types.bool;}; - }; - - input = { - kbLayout = mkOption {type = types.str;}; - repeatRate = mkOption {type = types.int;}; - repeatDelay = mkOption {type = types.int;}; - followMouse = mkOption {type = types.enum [0 1 2 3];}; - sensitivity = mkOption {type = types.numbers.between (-1.0) 1.0;}; - numlockByDefault = mkOption {type = types.bool;}; - touchpad = { - naturalScroll = mkOption {type = types.bool;}; - }; - }; - - gestures = { - workspaceSwipe = mkOption {type = types.bool;}; - }; - - group = { - autoGroup = mkOption {type = types.bool;}; - dragIntoGroup = mkOption {type = types.enum [0 1 2];}; - - col.borderActive = mkOption {type = types.str;}; - col.borderInactive = mkOption {type = types.str;}; - col.borderLockedActive = mkOption {type = types.str;}; - col.borderLockedInactive = mkOption {type = types.str;}; - - groupbar = { - fontSize = mkOption {type = types.int;}; - height = mkOption {type = types.int;}; - keepUpperGap = mkOption {type = types.bool;}; - }; - }; - - monitors = { - defaultMonitor = mkOption {type = types.bool;}; - bindWorkspaces = mkOption { - type = types.enum ["no" "interlaced"]; - default = "no"; - }; - - displays = mkOption { - type = types.listOf (types.submodule { - options = { - output = mkOption {type = types.str;}; - resolution = mkOption { - type = types.str; - default = "highres"; - }; - refreshRate = mkOption { - type = types.str; - default = "highrr"; - }; - x = mkOption {type = types.int;}; - y = mkOption {type = types.int;}; - scale = mkOption { - type = types.number; - default = 1; - }; - transform = mkOption { - type = types.enum [0 1 2 3 4 5 6 7]; - default = 0; - }; - wallpaper = mkOption { - type = types.nullOr types.path; - default = null; - }; + style = mkOption { + type = types.str; + default = ""; }; - }); + }; + }); + }; + }; + + input = { + kbModel = mkOption { + type = types.str; + default = ""; + }; + kbLayout = mkOption { + type = types.str; + default = "us"; + }; + kbVariant = mkOption { + type = types.str; + default = ""; + }; + kbOptions = mkOption { + type = types.str; + default = ""; + }; + kbRules = mkOption { + type = types.str; + default = ""; + }; + kbFile = mkOption { + type = types.str; + default = ""; + }; + numlockByDefault = mkOption { + type = types.bool; + default = false; + }; + resolveBindsBySym = mkOption { + type = types.bool; + default = false; + }; + repeatRate = mkOption { + type = types.int; + default = 25; + }; + repeatDelay = mkOption { + type = types.int; + default = 600; + }; + sensitivity = mkOption { + type = types.numbers.between 0 1; + default = 0.0; + }; + accelProfile = mkOption { + type = types.enum ["" "adaptive" "flat"]; + default = ""; + }; + forceNoAccel = mkOption { + type = types.bool; + default = false; + }; + leftHanded = mkOption { + type = types.bool; + default = false; + }; + scrollPoints = mkOption { + type = types.str; + default = ""; + }; + scrollMethod = mkOption { + type = types.enum ["" "2fg" "edge" "on_button_down" "no_scroll"]; + default = ""; + }; + scrollButton = mkOption { + type = types.int; + default = 0; + }; + scrollButtonLock = mkOption { + type = types.bool; + default = false; + }; + scrollFactor = mkOption { + type = types.float; + default = 1.0; + }; + naturalScroll = mkOption { + type = types.bool; + default = false; + }; + followMouse = mkOption { + type = types.enum [0 1 2 3]; + default = 1; + }; + followMouseThreshold = mkOption { + type = types.float; + default = 0.0; + }; + focusOnClose = mkOption { + type = types.enum [0 1]; + default = 0; + }; + mouseRefocus = mkOption { + type = types.bool; + default = true; + }; + floatSwitchOverrideFocus = mkOption { + type = types.enum [1 2]; + default = 1; + }; + specialFallthrough = mkOption { + type = types.bool; + default = false; + }; + offWindowAxisEvents = mkOption { + type = types.enum [0 1 2 3]; + default = 1; + }; + emulateDiscreteScroll = mkOption { + type = types.enum [0 1 2]; + default = 1; + }; + + touchpad = { + disableWhileTyping = mkOption { + type = types.bool; + default = true; + }; + naturalScroll = mkOption { + type = types.bool; + default = false; + }; + scrollFactor = mkOption { + type = types.float; + default = 1.0; + }; + middleButtonEmulation = mkOption { + type = types.bool; + default = false; + }; + tapButtonMap = mkOption { + type = types.enum ["lrm" "lmr"]; + default = "lrm"; + }; + clickfingerBehavior = mkOption { + type = types.bool; + default = false; + }; + tapToClick = mkOption { + type = types.bool; + default = true; + }; + dragLock = mkOption { + type = types.bool; + default = false; + }; + tapAndDrag = mkOption { + type = types.bool; + default = true; + }; + flipX = mkOption { + type = types.bool; + default = false; + }; + flipY = mkOption { + type = types.bool; + default = false; }; }; - keybindings = { - binds = mkOption {type = types.listOf keybinding;}; - - submaps = mkOption { - type = types.listOf (types.submodule { - options = { - name = mkOption {type = types.str;}; - enterBind = mkOption {type = submapKeybinding;}; - exitBind = mkOption {type = submapKeybinding;}; - binds = mkOption {type = types.listOf keybinding;}; - }; - }); + touchdevice = { + transform = mkOption { + type = types.ints.between (-1) 7; + default = -1; + }; + output = mkOption { + type = types.str; + default = "[[Auto]]"; + }; + enabled = mkOption { + type = types.bool; + default = true; }; }; - sleep = { - lockCommand = mkOption {type = types.str;}; - - listeners = mkOption { - type = types.listOf (types.submodule { - options = { - timeout = mkOption {type = types.ints.positive;}; - onTimeout = mkOption {type = types.str;}; - onResume = mkOption { - type = types.str; - default = ""; - }; - ignoreInhibit = mkOption { - type = types.bool; - default = false; - }; - }; - }); + tablet = { + transform = mkOption { + type = types.ints.between (-1) 7; + default = -1; }; + output = mkOption { + type = types.str; + default = ""; + }; + regionPosition = mkOption { + type = vec2; + default = { + x = 0; + y = 0; + }; + }; + absoluteRegionPosition = mkOption { + type = types.bool; + default = false; + }; + regionSize = mkOption { + type = vec2; + default = { + x = 0; + y = 0; + }; + }; + relativeInput = mkOption { + type = types.bool; + default = false; + }; + leftHanded = mkOption { + type = types.bool; + default = false; + }; + activeAreaSize = mkOption { + type = vec2; + default = { + x = 0; + y = 0; + }; + }; + activeAreaPosition = mkOption { + type = vec2; + default = { + x = 0; + y = 0; + }; + }; + }; + }; + + gestures = { + workspaceSwipe = mkOption { + type = types.bool; + default = false; + }; + workspaceSwipeFingers = mkOption { + type = types.int; + default = 3; + }; + workspaceSwipeMinFingers = mkOption { + type = types.bool; + default = false; + }; + workspaceSwipeDistance = mkOption { + type = types.int; + default = 300; + }; + workspaceSwipeTouch = mkOption { + type = types.bool; + default = false; + }; + workspaceSwipeInvert = mkOption { + type = types.bool; + default = true; + }; + workspaceSwipeTouchInvert = mkOption { + type = types.bool; + default = false; + }; + workspaceSwipeMinSpeedToForce = mkOption { + type = types.int; + default = 30; + }; + workspaceSwipeCancelRatio = mkOption { + type = types.numbers.between 0 1; + default = 0.5; + }; + workspaceSwipeCreateNew = mkOption { + type = types.bool; + default = true; + }; + workspaceSwipeDirectionLock = mkOption { + type = types.bool; + default = true; + }; + workspaceSwipeDirectionLockThreshold = mkOption { + type = types.int; + default = 10; + }; + workspaceSwipeForever = mkOption { + type = types.bool; + default = false; + }; + workspaceSwipeUseR = mkOption { + type = types.bool; + default = false; + }; + }; + + group = { + autoGroup = mkOption { + type = types.bool; + default = true; + }; + insertAfterCurrent = mkOption { + type = types.bool; + default = true; + }; + focusRemovedWindow = mkOption { + type = types.bool; + default = true; + }; + dragIntoGroup = mkOption { + type = types.enum [0 1 2]; + default = 1; + }; + mergeGroupsOnDrag = mkOption { + type = types.bool; + default = true; + }; + mergeGroupsOnGroupbar = mkOption { + type = types.bool; + default = true; + }; + mergeFloatedIntoTiledOnGroupbar = mkOption { + type = types.bool; + default = false; + }; + groupOnMovetoworkspace = mkOption { + type = types.bool; + default = false; + }; + col.borderActive = mkOption { + type = types.str; + default = "0x66ffff00"; + }; + col.borderInactive = mkOption { + type = types.str; + default = "0x66777700"; + }; + col.borderLockedActive = mkOption { + type = types.str; + default = "0x66ff5500"; + }; + col.borderLockedInactive = mkOption { + type = types.str; + default = "0x66775500"; + }; + + groupbar = { + enabled = mkOption { + type = types.bool; + default = true; + }; + fontFamily = mkOption { + type = types.str; + default = ""; + }; + fontSize = mkOption { + type = types.int; + default = 8; + }; + fontWeightActive = mkOption { + type = fontWeight; + default = "normal"; + }; + fontWeightInactive = mkOption { + type = fontWeight; + default = "normal"; + }; + gradients = mkOption { + type = types.bool; + default = false; + }; + height = mkOption { + type = types.int; + default = 14; + }; + indicatorGap = mkOption { + type = types.int; + default = 0; + }; + indicatorHeight = mkOption { + type = types.int; + default = 3; + }; + stacked = mkOption { + type = types.bool; + default = false; + }; + priority = mkOption { + type = types.int; + default = 3; + }; + renderTitles = mkOption { + type = types.bool; + default = true; + }; + textOffset = mkOption { + type = types.int; + default = 0; + }; + scrolling = mkOption { + type = types.bool; + default = true; + }; + rounding = mkOption { + type = types.int; + default = 1; + }; + gradientRounding = mkOption { + type = types.int; + default = 2; + }; + roundOnlyEdges = mkOption { + type = types.bool; + default = true; + }; + gradientRoundOnlyEdges = mkOption { + type = types.bool; + default = true; + }; + textColor = mkOption { + type = types.str; + default = "0xffffffff"; + }; + col.active = mkOption { + type = types.str; + default = "0x66ffff00"; + }; + col.inactive = mkOption { + type = types.str; + default = "0x66777700"; + }; + col.lockedActive = mkOption { + type = types.str; + default = "0x66ff5500"; + }; + col.lockedInactive = mkOption { + type = types.str; + default = "0x66775500"; + }; + gapsIn = mkOption { + type = types.int; + default = 2; + }; + gapsOut = mkOption { + type = types.int; + default = 2; + }; + keepUpperGap = mkOption { + type = types.bool; + default = true; + }; + }; + }; + + misc = { + disableHyprlandLogo = mkOption { + type = types.bool; + default = false; + }; + disableSplashRendering = mkOption { + type = types.bool; + default = false; + }; + col.splash = mkOption { + type = types.str; + default = "0xffffffff"; + }; + fontFamily = mkOption { + type = types.str; + default = "Sans"; + }; + splashFontFamily = mkOption { + type = types.str; + default = ""; + }; + forceDefaultWallpaper = mkOption { + type = types.enum [(-1) 0 1 2]; + default = -1; + }; + vfr = mkOption { + type = types.bool; + default = true; + }; + vrr = mkOption { + type = types.enum [0 1 2 3]; + default = 0; + }; + mouseMoveEnablesDPMS = mkOption { + type = types.bool; + default = false; + }; + keyPressEnablesDPMS = mkOption { + type = types.bool; + default = false; + }; + alwaysFollowOnDnd = mkOption { + type = types.bool; + default = true; + }; + layersHogKeyboardFocus = mkOption { + type = types.bool; + default = true; + }; + animateManualResizes = mkOption { + type = types.bool; + default = false; + }; + animateMouseWindowdragging = mkOption { + type = types.bool; + default = false; + }; + disableAutoreload = mkOption { + type = types.bool; + default = false; + }; + enableSwallow = mkOption { + type = types.bool; + default = false; + }; + swallowRegex = mkOption { + type = types.str; + default = ""; + }; + swallowExceptionRegex = mkOption { + type = types.str; + default = ""; + }; + focusOnActivate = mkOption { + type = types.bool; + default = false; + }; + mouseMoveFocusesMonitor = mkOption { + type = types.bool; + default = true; + }; + allowSessionLockRestore = mkOption { + type = types.bool; + default = false; + }; + backgroundColor = mkOption { + type = types.str; + default = "0x111111"; + }; + closeSpecialOnEmpty = mkOption { + type = types.bool; + default = true; + }; + newWindowTakesOverFullscreen = mkOption { + type = types.enum [0 1 2]; + default = 0; + }; + exitWindowRetainsFullscreen = mkOption { + type = types.bool; + default = false; + }; + initialWorkspaceTracking = mkOption { + type = types.enum [0 1 2]; + default = 1; + }; + middleClickPaste = mkOption { + type = types.bool; + default = true; + }; + renderUnfocusedFps = mkOption { + type = types.int; + default = 15; + }; + disableXdgEnvChecks = mkOption { + type = types.bool; + default = false; + }; + disableHyprlandQtutilsCheck = mkOption { + type = types.bool; + default = false; + }; + lockdeadScreenDelay = mkOption { + type = types.int; + default = 1000; + }; + enableAnrDialog = mkOption { + type = types.bool; + default = true; + }; + anrMissedPings = mkOption { + type = types.int; + default = 1; + }; + }; + + binds = { + passMouseWhenBound = mkOption { + type = types.bool; + default = false; + }; + scrollEventDelay = mkOption { + type = types.int; + default = 300; + }; + workspaceBackAndForth = mkOption { + type = types.bool; + default = false; + }; + hideSpecialOnWorkspaceChange = mkOption { + type = types.bool; + default = false; + }; + allowWorkspaceCycles = mkOption { + type = types.bool; + default = false; + }; + workspaceCenterOn = mkOption { + type = types.enum [0 1]; + default = 0; + }; + focusPreferredMethod = mkOption { + type = types.enum [0 1]; + default = 0; + }; + ignoreGroupLock = mkOption { + type = types.bool; + default = false; + }; + movefocusCyclesFullscreen = mkOption { + type = types.bool; + default = false; + }; + movefocusCyclesGroupfirst = mkOption { + type = types.bool; + default = false; + }; + disableKeybindGrabbing = mkOption { + type = types.bool; + default = false; + }; + windowDirectionMonitorFallback = mkOption { + type = types.bool; + default = true; + }; + allowPinFullscreen = mkOption { + type = types.bool; + default = false; + }; + dragThreshold = mkOption { + type = types.int; + default = 0; + }; + }; + + xwayland = { + enabled = mkOption { + type = types.bool; + default = true; + }; + useNearestNeighbor = mkOption { + type = types.bool; + default = true; + }; + forceZeroScaling = mkOption { + type = types.bool; + default = false; + }; + createAbstractSocket = mkOption { + type = types.bool; + default = false; + }; + }; + + opengl = { + nvidiaAntiFlicker = mkOption { + type = types.bool; + default = true; + }; + }; + + render = { + directScanout = mkOption { + type = types.enum [0 1 2]; + default = 0; + }; + expandUndersizedTextures = mkOption { + type = types.bool; + default = true; + }; + xpMode = mkOption { + type = types.bool; + default = false; + }; + ctmAnimation = mkOption { + type = types.enum [0 1 2]; + default = 2; + }; + cmFsPassthrough = mkOption { + type = types.enum [0 1 2]; + default = 2; + }; + cmEnabled = mkOption { + type = types.bool; + default = true; + }; + sendContentType = mkOption { + type = types.bool; + default = true; + }; + }; + + cursor = { + syncGsettingsTheme = mkOption { + type = types.bool; + default = true; + }; + noHardwareCursors = mkOption { + type = types.enum [0 1 2]; + default = 2; + }; + noBreakFsVrr = mkOption { + type = types.enum [0 1 2]; + default = 2; + }; + minRefreshRate = mkOption { + type = types.int; + default = 24; + }; + hotspotPadding = mkOption { + type = types.int; + default = 1; + }; + inactiveTimeout = mkOption { + type = types.number; + default = 0; + }; + noWarps = mkOption { + type = types.bool; + default = false; + }; + persistentWarps = mkOption { + type = types.bool; + default = false; + }; + warpOnChangeWorkspace = mkOption { + type = types.enum [0 1 2]; + default = 0; + }; + warpOnToggleSpecial = mkOption { + type = types.enum [0 1 2]; + default = 0; + }; + defaultMonitor = mkOption { + type = types.str; + default = ""; + }; + zoomFactor = mkOption { + type = types.float; + default = 1.0; + }; + zoomRigid = mkOption { + type = types.bool; + default = false; + }; + enableHyprcursor = mkOption { + type = types.bool; + default = true; + }; + hideOnKeyPress = mkOption { + type = types.bool; + default = false; + }; + hideOnTouch = mkOption { + type = types.bool; + default = true; + }; + useCpuBuffer = mkOption { + type = types.enum [0 1 2]; + default = 2; + }; + warpBackAfterNonMouseInput = mkOption { + type = types.bool; + default = false; + }; + }; + + ecosystem = { + noUpdateNews = mkOption { + type = types.bool; + default = false; + }; + noDonationNag = mkOption { + type = types.bool; + default = false; + }; + enforcePermissions = mkOption { + type = types.bool; + default = false; + }; + }; + + dwindle = { + pseudotile = mkOption {type = types.bool;}; + preserveSplit = mkOption {type = types.bool;}; + }; + + master = { + newStatus = mkOption {type = types.enum ["master" "slave" "inherit"];}; + }; + + monitors = { + defaultMonitor = mkOption {type = types.bool;}; + bindWorkspaces = mkOption { + type = types.enum ["no" "interlaced"]; + default = "no"; + }; + + displays = mkOption { + type = types.listOf (types.submodule { + options = { + output = mkOption {type = types.str;}; + resolution = mkOption { + type = types.str; + default = "highres"; + }; + refreshRate = mkOption { + type = types.str; + default = "highrr"; + }; + x = mkOption {type = types.int;}; + y = mkOption {type = types.int;}; + scale = mkOption { + type = types.number; + default = 1; + }; + transform = mkOption { + type = types.enum [0 1 2 3 4 5 6 7]; + default = 0; + }; + wallpaper = mkOption { + type = types.nullOr types.path; + default = null; + }; + }; + }); + }; + }; + + keybindings = { + binds = mkOption {type = types.listOf keybinding;}; + + submaps = mkOption { + type = types.listOf (types.submodule { + options = { + name = mkOption {type = types.str;}; + enterBind = mkOption {type = submapKeybinding;}; + exitBind = mkOption {type = submapKeybinding;}; + binds = mkOption {type = types.listOf keybinding;}; + }; + }); + }; + }; + + sleep = { + lockCommand = mkOption {type = types.str;}; + + listeners = mkOption { + type = types.listOf (types.submodule { + options = { + timeout = mkOption {type = types.ints.positive;}; + onTimeout = mkOption {type = types.str;}; + onResume = mkOption { + type = types.str; + default = ""; + }; + ignoreInhibit = mkOption { + type = types.bool; + default = false; + }; + }; + }); }; }; }; @@ -281,150 +1250,6 @@ in { wallpaper = , /home/horseman/nix-config/misc/wallpaper.jpg ''; - xdg.configFile."hypr/hyprland.conf".text = '' - # This file has been auto-generated. - - ${concatStringsSep "\n" (map (kb: "bind${concatStringsSep "" kb.flags} = ${concatStringsSep " " kb.mods}, ${kb.key}, ${kb.dispatcher}${ - if (elem "m" kb.flags) # Mouse binds take one argument less - then "" - else ", ${kb.params}" - }") - cfg.config.keybindings.binds)} - - ${concatStringsSep "\n\n" (map (sm: '' - bind${concatStringsSep "" sm.enterBind.flags} = ${concatStringsSep " " sm.enterBind.mods}, ${sm.enterBind.key}, submap, ${sm.name} - submap = ${sm.name} - - ${concatStringsSep "\n" (map (kb: "bind${concatStringsSep "" kb.flags} = ${concatStringsSep " " kb.mods}, ${kb.key}, ${kb.dispatcher}${ - if (elem "m" kb.flags) # Mouse binds take one argument less - then "" - else ", ${kb.params}" - }") - sm.binds)} - - bind${concatStringsSep "" sm.exitBind.flags} = ${concatStringsSep " " sm.exitBind.mods}, ${sm.exitBind.key}, submap, reset - submap = reset - '') - cfg.config.keybindings.submaps)} - - ${concatStringsSep "\n" (map (x: "exec-once = " + x) cfg.config.execOnce)} - - ${concatStringsSep "\n" (map (x: "env = " + x) cfg.config.env)} - - general { - gaps_in = ${toString cfg.config.general.gapsIn} - gaps_out = ${toString cfg.config.general.gapsOut} - border_size = ${toString cfg.config.general.borderSize} - col.active_border = ${cfg.config.general.col.activeBorder} - col.inactive_border = ${cfg.config.general.col.inactiveBorder} - resize_on_border = ${trivial.boolToString cfg.config.general.resizeOnBorder} - allow_tearing = ${trivial.boolToString cfg.config.general.allowTearing} - layout = ${cfg.config.general.layout} - } - - decoration { - rounding = ${toString cfg.config.decoration.rounding} - - active_opacity = ${strings.floatToString cfg.config.decoration.activeOpacity} - inactive_opacity = ${strings.floatToString cfg.config.decoration.inactiveOpacity} - - shadow { - enabled = ${trivial.boolToString cfg.config.decoration.shadow.enabled} - range = ${toString cfg.config.decoration.shadow.range} - render_power = ${toString cfg.config.decoration.shadow.renderPower} - color = ${cfg.config.decoration.shadow.color} - } - - blur { - enabled = ${trivial.boolToString cfg.config.decoration.blur.enabled} - size = ${toString cfg.config.decoration.blur.size} - passes = ${toString cfg.config.decoration.blur.passes} - vibrancy = ${strings.floatToString cfg.config.decoration.blur.vibrancy} - } - } - - animations { - enabled = ${trivial.boolToString cfg.config.animations.enabled} - - ${concatStringsSep "\n " (map (bez: "bezier = ${bez.name}, ${strings.floatToString bez.startX}, ${strings.floatToString bez.startY}, ${strings.floatToString bez.endX}, ${strings.floatToString bez.endY}") cfg.config.animations.beziers)} - - ${concatStringsSep "\n " (map (anim: "animation = ${anim.name}, ${toString anim.on}, ${strings.floatToString anim.speed}, ${anim.curve}, ${anim.style}") cfg.config.animations.animations)} - } - - dwindle { - pseudotile = ${trivial.boolToString cfg.config.dwindle.pseudotile} - preserve_split = ${trivial.boolToString cfg.config.dwindle.preserveSplit} - } - - master { - new_status = ${cfg.config.master.newStatus} - } - - misc { - force_default_wallpaper = ${toString cfg.config.misc.forceDefaultWallpaper} - key_press_enables_dpms = ${trivial.boolToString cfg.config.misc.keyPressEnablesDPMS} - } - - input { - kb_layout = ${cfg.config.input.kbLayout} - repeat_rate = ${toString cfg.config.input.repeatRate} - repeat_delay = ${toString cfg.config.input.repeatDelay} - follow_mouse = ${toString cfg.config.input.followMouse} - sensitivity = ${strings.floatToString cfg.config.input.sensitivity} - numlock_by_default = ${trivial.boolToString cfg.config.input.numlockByDefault} - - touchpad { - natural_scroll = ${trivial.boolToString cfg.config.input.touchpad.naturalScroll} - } - } - - gestures { - workspace_swipe = ${trivial.boolToString cfg.config.gestures.workspaceSwipe} - } - - - group { - auto_group = ${trivial.boolToString cfg.config.group.autoGroup} - drag_into_group = ${toString cfg.config.group.dragIntoGroup} - - col.border_active = ${cfg.config.group.col.borderActive} - col.border_inactive = ${cfg.config.group.col.borderInactive} - col.border_locked_active = ${cfg.config.group.col.borderLockedActive} - col.border_locked_inactive = ${cfg.config.group.col.borderLockedInactive} - - groupbar { - font_size = ${toString cfg.config.group.groupbar.fontSize} - height = ${toString cfg.config.group.groupbar.height} - keep_upper_gap = ${trivial.boolToString cfg.config.group.groupbar.keepUpperGap} - - col.active = ${cfg.config.group.col.borderActive} - col.inactive = ${cfg.config.group.col.borderInactive} - col.locked_active = ${cfg.config.group.col.borderLockedActive} - col.locked_inactive = ${cfg.config.group.col.borderLockedInactive} - } - } - - ${concatStringsSep "\n" (map (mon: "monitor = ${mon.output}, ${mon.resolution}@${mon.refreshRate}, ${toString mon.x}x${toString mon.y}, ${strings.floatToString mon.scale}, transform, ${toString mon.transform}") cfg.config.monitors.displays)} - - ${ - if cfg.config.monitors.defaultMonitor - then "monitor = ,preferred, auto, auto" - else "" - } - - ${concatStringsSep "\n" (map (wr: "windowrule = " + wr) cfg.config.windowrules)} - - ${concatStringsSep "\n" (map (ws: "workspace = " + ws) cfg.config.workspaces)} - - ${ - concatStringsSep "\n" ( - if cfg.config.monitors.bindWorkspaces == "interlaced" - then (map (x: "workspace = ${toString (x + 1)}, persistent:true, monitor:${(elemAt cfg.config.monitors.displays (x - (2 * (x / 2)))).output}") (genList (x: x) 10)) - else [] - ) - } - ''; - xdg.configFile."hypr/hyprlock.conf".text = '' $font = Monospace @@ -482,6 +1307,375 @@ in { valign = top } ''; + + xdg.configFile."hypr/hyprland.conf".text = '' + # This file has been auto-generated. + + ${concatStringsSep "\n" (map (kb: "bind${concatStringsSep "" kb.flags} = ${concatStringsSep " " kb.mods}, ${kb.key}, ${kb.dispatcher}${ + if (elem "m" kb.flags) # Mouse binds take one argument less + then "" + else ", ${kb.params}" + }") + cfg.config.keybindings.binds)} + + ${concatStringsSep "\n\n" (map (sm: '' + bind${concatStringsSep "" sm.enterBind.flags} = ${concatStringsSep " " sm.enterBind.mods}, ${sm.enterBind.key}, submap, ${sm.name} + submap = ${sm.name} + + ${concatStringsSep "\n" (map (kb: "bind${concatStringsSep "" kb.flags} = ${concatStringsSep " " kb.mods}, ${kb.key}, ${kb.dispatcher}${ + if (elem "m" kb.flags) # Mouse binds take one argument less + then "" + else ", ${kb.params}" + }") + sm.binds)} + + bind${concatStringsSep "" sm.exitBind.flags} = ${concatStringsSep " " sm.exitBind.mods}, ${sm.exitBind.key}, submap, reset + submap = reset + '') + cfg.config.keybindings.submaps)} + + ${concatStringsSep "\n" (map (x: "exec-once = " + x) cfg.config.execOnce)} + + ${concatStringsSep "\n" (map (x: "env = " + x) cfg.config.env)} + + general { + border_size = ${toString cfg.config.general.borderSize} + no_border_on_floating = ${boolToString cfg.config.general.noBorderOnFloating} + gaps_in = ${toString cfg.config.general.gapsIn} + gaps_out = ${toString cfg.config.general.gapsOut} + gaps_workspaces = ${toString cfg.config.general.gapsWorkspaces} + col.inactive_border = ${cfg.config.general.col.inactiveBorder} + col.active_border = ${cfg.config.general.col.activeBorder} + col.nogroup_border = ${cfg.config.general.col.nogroupBorder} + col.nogroup_border_active = ${cfg.config.general.col.nogroupBorderActive} + layout = ${cfg.config.general.layout} + no_focus_fallback = ${boolToString cfg.config.general.noFocusFallback} + resize_on_border = ${boolToString cfg.config.general.resizeOnBorder} + extend_border_grab_area = ${toString cfg.config.general.extendBorderGrabArea} + hover_icon_on_border = ${boolToString cfg.config.general.hoverIconOnBorder} + allow_tearing = ${boolToString cfg.config.general.allowTearing} + resize_corner = ${toString cfg.config.general.resizeCorner} + + snap { + enabled = ${boolToString cfg.config.general.snap.enabled} + window_gap = ${toString cfg.config.general.snap.windowGap} + monitor_gap = ${toString cfg.config.general.snap.monitorGap} + border_overlap = ${boolToString cfg.config.general.snap.borderOverlap} + } + } + + decoration { + rounding = ${toString cfg.config.decoration.rounding} + rounding_power = ${toString cfg.config.decoration.roundingPower} + active_opacity = ${toString cfg.config.decoration.activeOpacity} + inactive_opacity = ${toString cfg.config.decoration.inactiveOpacity} + fullscreen_opacity = ${toString cfg.config.decoration.fullscreenOpacity} + dim_inactive = ${boolToString cfg.config.decoration.dimInactive} + dim_strength = ${toString cfg.config.decoration.dimStrength} + dim_special = ${toString cfg.config.decoration.dimSpecial} + dim_around = ${toString cfg.config.decoration.dimAround} + screen_shader = ${toString cfg.config.decoration.screenShader} + border_part_of_window = ${boolToString cfg.config.decoration.borderPartOfWindow} + + blur { + enabled = ${boolToString cfg.config.decoration.blur.enabled} + size = ${toString cfg.config.decoration.blur.size} + passes = ${toString cfg.config.decoration.blur.passes} + ignore_opacity = ${boolToString cfg.config.decoration.blur.ignoreOpacity} + new_optimizations = ${boolToString cfg.config.decoration.blur.newOptimizations} + xray = ${boolToString cfg.config.decoration.blur.xray} + noise = ${toString cfg.config.decoration.blur.noise} + contrast = ${toString cfg.config.decoration.blur.contrast} + brightness = ${toString cfg.config.decoration.blur.brightness} + vibrancy = ${toString cfg.config.decoration.blur.vibrancy} + vibrancy_darkness = ${toString cfg.config.decoration.blur.vibrancyDarkness} + special = ${boolToString cfg.config.decoration.blur.special} + popups = ${boolToString cfg.config.decoration.blur.popups} + popups_ignorealpha = ${toString cfg.config.decoration.blur.popupsIgnorealpha} + input_methods = ${boolToString cfg.config.decoration.blur.inputMethods} + input_methods_ignorealpha = ${toString cfg.config.decoration.blur.inputMethodsIgnorealpha} + } + + shadow { + enabled = ${boolToString cfg.config.decoration.shadow.enabled} + range = ${toString cfg.config.decoration.shadow.range} + render_power = ${toString cfg.config.decoration.shadow.renderPower} + sharp = ${boolToString cfg.config.decoration.shadow.sharp} + ignore_window = ${boolToString cfg.config.decoration.shadow.ignoreWindow} + color = ${toString cfg.config.decoration.shadow.color} + ${ + if (cfg.config.decoration.shadow.colorInactive == null) + then "" + else "color_inactive = ${toString cfg.config.decoration.shadow.colorInactive}" + } + offset = ${toString cfg.config.decoration.shadow.offset.x} ${toString cfg.config.decoration.shadow.offset.y} + scale = ${toString cfg.config.decoration.shadow.scale} + } + } + + animations { + enabled = ${boolToString cfg.config.animations.enabled} + workspace_wraparound = ${boolToString cfg.config.animations.workspaceWraparound} + + ${concatStringsSep "\n " (map (bez: "bezier = ${bez.name}, ${floatToString bez.startX}, ${floatToString bez.startY}, ${floatToString bez.endX}, ${floatToString bez.endY}") cfg.config.animations.beziers)} + + ${concatStringsSep "\n " (map (anim: "animation = ${anim.name}, ${toString anim.on}, ${floatToString anim.speed}, ${anim.curve}, ${anim.style}") cfg.config.animations.animations)} + } + + input { + kb_model = ${toString cfg.config.input.kbModel} + kb_layout = ${toString cfg.config.input.kbLayout} + kb_variant = ${toString cfg.config.input.kbVariant} + kb_options = ${toString cfg.config.input.kbOptions} + kb_rules = ${toString cfg.config.input.kbRules} + kb_file = ${toString cfg.config.input.kbFile} + numlock_by_default = ${boolToString cfg.config.input.numlockByDefault} + resolve_binds_by_sym = ${boolToString cfg.config.input.resolveBindsBySym} + repeat_rate = ${toString cfg.config.input.repeatRate} + repeat_delay = ${toString cfg.config.input.repeatDelay} + sensitivity = ${toString cfg.config.input.sensitivity} + accel_profile = ${toString cfg.config.input.accelProfile} + force_no_accel = ${boolToString cfg.config.input.forceNoAccel} + left_handed = ${boolToString cfg.config.input.leftHanded} + scroll_points = ${toString cfg.config.input.scrollPoints} + scroll_method = ${toString cfg.config.input.scrollMethod} + scroll_button = ${toString cfg.config.input.scrollButton} + scroll_button_lock = ${boolToString cfg.config.input.scrollButtonLock} + scroll_factor = ${toString cfg.config.input.scrollFactor} + natural_scroll = ${boolToString cfg.config.input.naturalScroll} + follow_mouse = ${toString cfg.config.input.followMouse} + follow_mouse_threshold = ${toString cfg.config.input.followMouseThreshold} + focus_on_close = ${toString cfg.config.input.focusOnClose} + mouse_refocus = ${boolToString cfg.config.input.mouseRefocus} + float_switch_override_focus = ${toString cfg.config.input.floatSwitchOverrideFocus} + special_fallthrough = ${boolToString cfg.config.input.specialFallthrough} + off_window_axis_events = ${toString cfg.config.input.offWindowAxisEvents} + emulate_discrete_scroll = ${toString cfg.config.input.emulateDiscreteScroll} + + touchpad { + disable_while_typing = ${boolToString cfg.config.input.touchpad.disableWhileTyping} + natural_scroll = ${boolToString cfg.config.input.touchpad.naturalScroll} + scroll_factor = ${toString cfg.config.input.touchpad.scrollFactor} + middle_button_emulation = ${boolToString cfg.config.input.touchpad.middleButtonEmulation} + tap_button_map = ${toString cfg.config.input.touchpad.tapButtonMap} + clickfinger_behavior = ${boolToString cfg.config.input.touchpad.clickfingerBehavior} + tap-to-click = ${boolToString cfg.config.input.touchpad.tapToClick} + drag_lock = ${toString cfg.config.input.touchpad.dragLock} + tap-and-drag = ${toString cfg.config.input.touchpad.tapAndDrag} + flip_x = ${boolToString cfg.config.input.touchpad.flipX} + flip_y = ${boolToString cfg.config.input.touchpad.flipY} + } + + touchdevice { + transform = ${toString cfg.config.input.touchdevice.transform} + output = ${toString cfg.config.input.touchdevice.output} + enabled = ${boolToString cfg.config.input.touchdevice.enabled} + } + + tablet { + transform = ${toString cfg.config.input.tablet.transform} + output = ${toString cfg.config.input.tablet.output} + region_position = ${toString cfg.config.input.tablet.regionPosition.x} ${toString cfg.config.input.tablet.regionPosition.y} + absolute_region_position = ${boolToString cfg.config.input.tablet.absoluteRegionPosition} + region_size = ${toString cfg.config.input.tablet.regionSize.x} ${toString cfg.config.input.tablet.regionSize.y} + relative_input = ${boolToString cfg.config.input.tablet.relativeInput} + left_handed = ${boolToString cfg.config.input.tablet.leftHanded} + active_area_size = ${toString cfg.config.input.tablet.activeAreaSize.x} ${toString cfg.config.input.tablet.activeAreaSize.y} + active_area_position = ${toString cfg.config.input.tablet.activeAreaPosition.x} ${toString cfg.config.input.tablet.activeAreaPosition.y} + } + } + + gestures { + workspace_swipe = ${boolToString cfg.config.gestures.workspaceSwipe} + workspace_swipe_fingers = ${toString cfg.config.gestures.workspaceSwipeFingers} + workspace_swipe_min_fingers = ${boolToString cfg.config.gestures.workspaceSwipeMinFingers} + workspace_swipe_distance = ${toString cfg.config.gestures.workspaceSwipeDistance} + workspace_swipe_touch = ${boolToString cfg.config.gestures.workspaceSwipeTouch} + workspace_swipe_invert = ${boolToString cfg.config.gestures.workspaceSwipeInvert} + workspace_swipe_touch_invert = ${boolToString cfg.config.gestures.workspaceSwipeTouchInvert} + workspace_swipe_min_speed_to_force = ${toString cfg.config.gestures.workspaceSwipeMinSpeedToForce} + workspace_swipe_cancel_ratio = ${floatToString cfg.config.gestures.workspaceSwipeCancelRatio} + workspace_swipe_create_new = ${boolToString cfg.config.gestures.workspaceSwipeCreateNew} + workspace_swipe_direction_lock = ${boolToString cfg.config.gestures.workspaceSwipeDirectionLock} + workspace_swipe_direction_lock_threshold = ${toString cfg.config.gestures.workspaceSwipeDirectionLockThreshold} + workspace_swipe_forever = ${boolToString cfg.config.gestures.workspaceSwipeForever} + workspace_swipe_use_r = ${boolToString cfg.config.gestures.workspaceSwipeUseR} + } + + group { + auto_group = ${boolToString cfg.config.group.autoGroup} + insert_after_current = ${boolToString cfg.config.group.insertAfterCurrent} + focus_removed_window = ${boolToString cfg.config.group.focusRemovedWindow} + drag_into_group = ${toString cfg.config.group.dragIntoGroup} + merge_groups_on_drag = ${boolToString cfg.config.group.mergeGroupsOnDrag} + merge_groups_on_groupbar = ${boolToString cfg.config.group.mergeGroupsOnGroupbar} + merge_floated_into_tiled_on_groupbar = ${boolToString cfg.config.group.mergeFloatedIntoTiledOnGroupbar} + group_on_movetoworkspace = ${boolToString cfg.config.group.groupOnMovetoworkspace} + col.border_active = ${toString cfg.config.group.col.borderActive} + col.border_inactive = ${toString cfg.config.group.col.borderInactive} + col.border_locked_active = ${toString cfg.config.group.col.borderLockedActive} + col.border_locked_inactive = ${toString cfg.config.group.col.borderLockedInactive} + + groupbar { + enabled = ${boolToString cfg.config.group.groupbar.enabled} + font_family = ${toString cfg.config.group.groupbar.fontFamily} + font_size = ${toString cfg.config.group.groupbar.fontSize} + font_weight_active = ${toString cfg.config.group.groupbar.fontWeightActive} + font_weight_inactive = ${toString cfg.config.group.groupbar.fontWeightInactive} + gradients = ${boolToString cfg.config.group.groupbar.gradients} + height = ${toString cfg.config.group.groupbar.height} + indicator_gap = ${toString cfg.config.group.groupbar.indicatorGap} + indicator_height = ${toString cfg.config.group.groupbar.indicatorHeight} + stacked = ${boolToString cfg.config.group.groupbar.stacked} + priority = ${toString cfg.config.group.groupbar.priority} + render_titles = ${boolToString cfg.config.group.groupbar.renderTitles} + text_offset = ${toString cfg.config.group.groupbar.textOffset} + scrolling = ${boolToString cfg.config.group.groupbar.scrolling} + rounding = ${toString cfg.config.group.groupbar.rounding} + gradient_rounding = ${toString cfg.config.group.groupbar.gradientRounding} + round_only_edges = ${boolToString cfg.config.group.groupbar.roundOnlyEdges} + gradient_round_only_edges = ${boolToString cfg.config.group.groupbar.gradientRoundOnlyEdges} + text_color = ${toString cfg.config.group.groupbar.textColor} + col.active = ${toString cfg.config.group.groupbar.col.active} + col.inactive = ${toString cfg.config.group.groupbar.col.inactive} + col.locked_active = ${toString cfg.config.group.groupbar.col.lockedActive} + col.locked_inactive = ${toString cfg.config.group.groupbar.col.lockedInactive} + gaps_in = ${toString cfg.config.group.groupbar.gapsIn} + gaps_out = ${toString cfg.config.group.groupbar.gapsOut} + keep_upper_gap = ${boolToString cfg.config.group.groupbar.keepUpperGap} + } + } + + misc { + disable_hyprland_logo = ${boolToString cfg.config.misc.disableHyprlandLogo} + disable_splash_rendering = ${boolToString cfg.config.misc.disableSplashRendering} + col.splash = ${toString cfg.config.misc.col.splash} + font_family = ${toString cfg.config.misc.fontFamily} + splash_font_family = ${toString cfg.config.misc.splashFontFamily} + force_default_wallpaper = ${toString cfg.config.misc.forceDefaultWallpaper} + vfr = ${toString cfg.config.misc.vfr} + vrr = ${toString cfg.config.misc.vrr} + mouse_move_enables_dpms = ${boolToString cfg.config.misc.mouseMoveEnablesDPMS} + key_press_enables_dpms = ${boolToString cfg.config.misc.keyPressEnablesDPMS} + always_follow_on_dnd = ${boolToString cfg.config.misc.alwaysFollowOnDnd} + layers_hog_keyboard_focus = ${boolToString cfg.config.misc.layersHogKeyboardFocus} + animate_manual_resizes = ${boolToString cfg.config.misc.animateManualResizes} + animate_mouse_windowdragging = ${boolToString cfg.config.misc.animateMouseWindowdragging} + disable_autoreload = ${boolToString cfg.config.misc.disableAutoreload} + enable_swallow = ${boolToString cfg.config.misc.enableSwallow} + swallow_regex = ${toString cfg.config.misc.swallowRegex} + swallow_exception_regex = ${toString cfg.config.misc.swallowExceptionRegex} + focus_on_activate = ${boolToString cfg.config.misc.focusOnActivate} + mouse_move_focuses_monitor = ${boolToString cfg.config.misc.mouseMoveFocusesMonitor} + allow_session_lock_restore = ${boolToString cfg.config.misc.allowSessionLockRestore} + background_color = ${toString cfg.config.misc.backgroundColor} + close_special_on_empty = ${boolToString cfg.config.misc.closeSpecialOnEmpty} + new_window_takes_over_fullscreen = ${toString cfg.config.misc.newWindowTakesOverFullscreen} + exit_window_retains_fullscreen = ${boolToString cfg.config.misc.exitWindowRetainsFullscreen} + initial_workspace_tracking = ${toString cfg.config.misc.initialWorkspaceTracking} + middle_click_paste = ${boolToString cfg.config.misc.middleClickPaste} + render_unfocused_fps = ${toString cfg.config.misc.renderUnfocusedFps} + disable_xdg_env_checks = ${boolToString cfg.config.misc.disableXdgEnvChecks} + disable_hyprland_qtutils_check = ${boolToString cfg.config.misc.disableHyprlandQtutilsCheck} + lockdead_screen_delay = ${toString cfg.config.misc.lockdeadScreenDelay} + enable_anr_dialog = ${boolToString cfg.config.misc.enableAnrDialog} + anr_missed_pings = ${toString cfg.config.misc.anrMissedPings} + } + + binds { + pass_mouse_when_bound = ${boolToString cfg.config.binds.passMouseWhenBound} + scroll_event_delay = ${toString cfg.config.binds.scrollEventDelay} + workspace_back_and_forth = ${boolToString cfg.config.binds.workspaceBackAndForth} + hide_special_on_workspace_change = ${boolToString cfg.config.binds.hideSpecialOnWorkspaceChange} + allow_workspace_cycles = ${boolToString cfg.config.binds.allowWorkspaceCycles} + workspace_center_on = ${toString cfg.config.binds.workspaceCenterOn} + focus_preferred_method = ${toString cfg.config.binds.focusPreferredMethod} + ignore_group_lock = ${boolToString cfg.config.binds.ignoreGroupLock} + movefocus_cycles_fullscreen = ${boolToString cfg.config.binds.movefocusCyclesFullscreen} + movefocus_cycles_groupfirst = ${boolToString cfg.config.binds.movefocusCyclesGroupfirst} + disable_keybind_grabbing = ${boolToString cfg.config.binds.disableKeybindGrabbing} + window_direction_monitor_fallback = ${boolToString cfg.config.binds.windowDirectionMonitorFallback} + allow_pin_fullscreen = ${boolToString cfg.config.binds.allowPinFullscreen} + drag_threshold = ${toString cfg.config.binds.dragThreshold} + } + + xwayland { + enabled = ${boolToString cfg.config.xwayland.enabled} + use_nearest_neighbor = ${boolToString cfg.config.xwayland.useNearestNeighbor} + force_zero_scaling = ${boolToString cfg.config.xwayland.forceZeroScaling} + create_abstract_socket = ${boolToString cfg.config.xwayland.createAbstractSocket} + } + + opengl { + nvidia_anti_flicker = ${boolToString cfg.config.opengl.nvidiaAntiFlicker} + } + + render { + direct_scanout = ${toString cfg.config.render.directScanout} + expand_undersized_textures = ${boolToString cfg.config.render.expandUndersizedTextures} + xp_mode = ${boolToString cfg.config.render.xpMode} + ctm_animation = ${toString cfg.config.render.ctmAnimation} + cm_fs_passthrough = ${toString cfg.config.render.cmFsPassthrough} + cm_enabled = ${boolToString cfg.config.render.cmEnabled} + send_content_type = ${boolToString cfg.config.render.sendContentType} + } + + cursor { + sync_gsettings_theme = ${boolToString cfg.config.cursor.syncGsettingsTheme} + no_hardware_cursors = ${toString cfg.config.cursor.noHardwareCursors} + no_break_fs_vrr = ${toString cfg.config.cursor.noBreakFsVrr} + min_refresh_rate = ${toString cfg.config.cursor.minRefreshRate} + hotspot_padding = ${toString cfg.config.cursor.hotspotPadding} + inactive_timeout = ${toString cfg.config.cursor.inactiveTimeout} + no_warps = ${boolToString cfg.config.cursor.noWarps} + persistent_warps = ${boolToString cfg.config.cursor.persistentWarps} + warp_on_change_workspace = ${toString cfg.config.cursor.warpOnChangeWorkspace} + warp_on_toggle_special = ${toString cfg.config.cursor.warpOnToggleSpecial} + default_monitor = ${toString cfg.config.cursor.defaultMonitor} + zoom_factor = ${toString cfg.config.cursor.zoomFactor} + zoom_rigid = ${boolToString cfg.config.cursor.zoomRigid} + enable_hyprcursor = ${boolToString cfg.config.cursor.enableHyprcursor} + hide_on_key_press = ${boolToString cfg.config.cursor.hideOnKeyPress} + hide_on_touch = ${boolToString cfg.config.cursor.hideOnTouch} + use_cpu_buffer = ${toString cfg.config.cursor.useCpuBuffer} + warp_back_after_non_mouse_input = ${boolToString cfg.config.cursor.warpBackAfterNonMouseInput} + } + + ecosystem { + no_update_news = ${boolToString cfg.config.ecosystem.noUpdateNews} + no_donation_nag = ${boolToString cfg.config.ecosystem.noDonationNag} + enforce_permissions = ${boolToString cfg.config.ecosystem.enforcePermissions} + } + + dwindle { + pseudotile = ${boolToString cfg.config.dwindle.pseudotile} + preserve_split = ${boolToString cfg.config.dwindle.preserveSplit} + } + + master { + new_status = ${toString cfg.config.master.newStatus} + } + + ${concatStringsSep "\n" (map (mon: "monitor = ${mon.output}, ${mon.resolution}@${mon.refreshRate}, ${toString mon.x}x${toString mon.y}, ${floatToString mon.scale}, transform, ${toString mon.transform}") cfg.config.monitors.displays)} + + ${ + if cfg.config.monitors.defaultMonitor + then "monitor = ,preferred, auto, auto" + else "" + } + + ${concatStringsSep "\n" (map (wr: "windowrule = " + wr) cfg.config.windowrules)} + + ${concatStringsSep "\n" (map (ws: "workspace = " + ws) cfg.config.workspaces)} + + ${ + concatStringsSep "\n" ( + if cfg.config.monitors.bindWorkspaces == "interlaced" + then (map (x: "workspace = ${toString (x + 1)}, persistent:true, monitor:${(elemAt cfg.config.monitors.displays (x - (2 * (x / 2)))).output}") (genList (x: x) 10)) + else [] + ) + } + ''; }; }; }