Compare commits

..

2 commits

Author SHA1 Message Date
c67d2dec04 Uploaded the past half-a-year of tweaks 2026-05-16 20:03:26 +02:00
a1bd9a5d29 Copyright © 2026 Guzio | Licensed under the MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2026-05-16 19:58:50 +02:00
43 changed files with 3346 additions and 15 deletions

View file

@ -0,0 +1,60 @@
{
"features": {
"ghcr.io/devcontainers-extra/features/fish-apt-get:1": {
"version": "1.0.5",
"resolved": "ghcr.io/devcontainers-extra/features/fish-apt-get@sha256:d3c21bb6aec6e0f9d5348adee443c70c31d5f4372b8ad5f56a0ab925b2725108",
"integrity": "sha256:d3c21bb6aec6e0f9d5348adee443c70c31d5f4372b8ad5f56a0ab925b2725108"
},
"ghcr.io/guziomg/devcontainers/extension-spellcheck:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/extension-spellcheck@sha256:954a79f524e5130b7c961e6d0ac7252fbc8e40c5e63229b030f5a27477dfa7ce",
"integrity": "sha256:954a79f524e5130b7c961e6d0ac7252fbc8e40c5e63229b030f5a27477dfa7ce"
},
"ghcr.io/guziomg/devcontainers/extensions-essentials-ultimate:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/extensions-essentials-ultimate@sha256:62483dfabb169b804d1d385eccf0344a8b0d6a62c60b3761d579e70a59291772",
"integrity": "sha256:62483dfabb169b804d1d385eccf0344a8b0d6a62c60b3761d579e70a59291772",
"dependsOn": [
"ghcr.io/guziomg/devcontainers/extensions-github:latest",
"ghcr.io/guziomg/devcontainers/extensions-essentials:latest",
"ghcr.io/guziomg/devcontainers/extension-spellcheck:latest"
]
},
"ghcr.io/guziomg/devcontainers/extensions-essentials:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/extensions-essentials@sha256:bbd0673cb07d64ca60e714a786db2c55bf921fbd49bad907376a0dfa960258d9",
"integrity": "sha256:bbd0673cb07d64ca60e714a786db2c55bf921fbd49bad907376a0dfa960258d9"
},
"ghcr.io/guziomg/devcontainers/extensions-github:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/extensions-github@sha256:5455b28dcb0cfa1c4a0ed0c9ac9fad263af9c5265406021923c50027b6ca62d9",
"integrity": "sha256:5455b28dcb0cfa1c4a0ed0c9ac9fad263af9c5265406021923c50027b6ca62d9"
},
"ghcr.io/guziomg/devcontainers/fish-apt-extended:latest": {
"version": "1.1.0",
"resolved": "ghcr.io/guziomg/devcontainers/fish-apt-extended@sha256:ce8190cd2f0365c625c2e8b5800f27771ccf517823feb082ec96c75f5c083a66",
"integrity": "sha256:ce8190cd2f0365c625c2e8b5800f27771ccf517823feb082ec96c75f5c083a66",
"dependsOn": [
"ghcr.io/devcontainers-extra/features/fish-apt-get:1"
]
},
"ghcr.io/guziomg/devcontainers/personal:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/personal@sha256:f116eaa06ae322f69943724323d757c8fb9b326c3bd7fc1899ee4d54863568ff",
"integrity": "sha256:f116eaa06ae322f69943724323d757c8fb9b326c3bd7fc1899ee4d54863568ff",
"dependsOn": [
"ghcr.io/guziomg/devcontainers/extensions-essentials-ultimate:latest",
"ghcr.io/guziomg/devcontainers/polskie-rozszerzenia:latest",
"ghcr.io/guziomg/devcontainers/fish-apt-extended:latest"
]
},
"ghcr.io/guziomg/devcontainers/polskie-rozszerzenia:latest": {
"version": "1.0.0",
"resolved": "ghcr.io/guziomg/devcontainers/polskie-rozszerzenia@sha256:708c77bf302f7a097384dd98b3beec2e344e4965995ab38a3f861bb923fcf71d",
"integrity": "sha256:708c77bf302f7a097384dd98b3beec2e344e4965995ab38a3f861bb923fcf71d",
"dependsOn": [
"ghcr.io/guziomg/devcontainers/extension-spellcheck:latest"
]
}
}
}

View file

@ -0,0 +1,8 @@
{
"name": "Hyprland configs",
"image": "mcr.microsoft.com/devcontainers/base:noble",
"features": {
//"ghcr.io/guziomg/devcontainers/hyprland:latest": {},
"ghcr.io/guziomg/devcontainers/personal:latest": {}
}
}

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
scripts/volume-bin

7
.luarc.json Normal file
View file

@ -0,0 +1,7 @@
{
"workspace": {
"library": [
"/usr/share/hypr/stubs"
]
}
}

8
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,8 @@
{
"cSpell.words": [
"envar",
"hypr",
"hyprpanel",
"killall"
]
}

19
LICENSE
View file

@ -1,18 +1,7 @@
MIT License
Copyright (c) 2026 Guzio
Copyright © 2026 Guzio
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

16
hyprland.conf.stub Normal file
View file

@ -0,0 +1,16 @@
# This config is a STUB! This should never be generated.
# Use the default lua config from https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.lua
$mainMod = SUPER
$terminal = konsole
$fileManager = dolphin
$menu = hyprlauncher
bind = $mainMod, Q, exec, $terminal
bind = $mainMod, C, killactive,
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, R, exec, $menu

413
hyprland.lua Normal file
View file

@ -0,0 +1,413 @@
-------------------
---- VARIABLES ----
-------------------
local hyprdir = ".config/hypr/"
local scripts = hyprdir.."scripts/"
-- Set programs that I use
local terminal = scripts.."terminal.sh"
local fileManager = "dolphin"
local menu = scripts.."toggle_hyprshell.sh"
------------------
---- MONITORS ----
------------------
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
-- defaults
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = 1,
mirror = "eDP-1",
})
-- Main tablet screen
hl.monitor({
output = "eDP-1",
mode = "preferred",
position = "0x0",
scale = 1,
})
-- My monitor at home
hl.monitor({
output = "desc:Acer Technologies Acer XF240H 0x0160F332",
mode = "preferred",
position = "1925x-900",
scale = 1,
})
-------------------
---- AUTOSTART ----
-------------------
-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
hl.on("hyprland.start", function ()
-- Load plugins
--hl.exec_cmd("hyprpm reload")
-- Special workspaces
hl.exec_cmd(terminal)
hl.exec_cmd("flatpak run app.zen_browser.zen")
hl.exec_cmd("flatpak run com.discordapp.Discord")
hl.exec_cmd("flatpak run im.riot.Riot")
hl.exec_cmd("flatpak run md.obsidian.Obsidian")
-- Core daemons
hl.exec_cmd("hyprshell -c "..hyprdir.."hyprshell.ron -s "..hyprdir.."hyprshell.css run")
hl.exec_cmd("vicinae server")
hl.exec_cmd("wvkbd-deskintl --hidden -o")
hl.exec_cmd("hyprpanel")
hl.exec_cmd(scripts.."keyboard.sh reset")
hl.exec_cmd(scripts.."volume-core.sh --start-daemon")
-- Waydroid (note: this also launches rootedinit.sh under-the-hood)
hl.exec_cmd(scripts.."waydroid.sh")
-- Dark theme
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme Breeze-Dark"); -- for GTK3 apps
hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme prefer-dark"); -- for GTK4 apps
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-color-palette \"'black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90'\""); --Unrelated to Dark Theme (just my color palette), but there was no better place for it.
end)
-------------------------------
---- ENVIRONMENT VARIABLES ----
-------------------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
-- Were the defaults; no reason to fuck around
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
-- Dark theme, again (*must set manually)
hl.env("QT_QPA_PLATFORMTHEME", "qt6ct")
-----------------------
----- PERMISSIONS -----
-----------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
hl.config({
ecosystem = {
enforce_permissions = true,
},
})
hl.permission({binary="/usr/(bin|local/bin)/grim", type="screencopy", mode="allow"})
hl.permission({binary="/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", type="screencopy", mode="allow"})
hl.permission({binary="/usr/(bin|local/bin)/hyprpm", type="plugin", mode="allow"})
hl.permission({binary="/usr/(bin|local/bin)/hyprshell", type="plugin", mode="allow"})
-----------------------
---- LOOK AND FEEL ----
-----------------------
-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
hl.config({
general = {
gaps_in = 4,
gaps_out = {top=0, right=8, bottom=8, left=8},
border_size = 2,
col = {
active_border = { colors = {"rgb(FFE610)", "rgb(E6FF10)"}, angle = 240 },
inactive_border = { colors = {"rgba(FFE61020)", "rgba(E6FF10E0)"}, angle = 240 },
},
-- Set to true to enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true,
-- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
allow_tearing = false,
layout = "dwindle",
},
decoration = {
rounding = 15,
rounding_power = 3,
-- Change transparency of focused and unfocused windows
active_opacity = 1.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 4,
render_power = 3,
color = 0xee1a1a1a,
},
blur = {
enabled = true, --During the Lua migration, I noticed the following note attached in the previous config: „NOTE: Occasionally (when terminal breaks), this needs to be disabled (until I figure out how to get blur only on the background ALWAYS, without making all terminal text glow SOMETIMES)”. However, I don't think I experienced any „terminal glowing” problems in a long time (tho transparency still breaks on it from time to time), so ig this is no longer needed? Leaving the note in, just in case it does end up happening again.
size = 3,
passes = 1,
vibrancy = 0.1696,
},
},
animations = {
enabled = true,
},
})
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} }})
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} }})
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} }})
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} }})
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} }})
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
-- Special workspaces slide-in from the top (thx, https://github.com/hyprwm/Hyprland/discussions/1757#discussioncomment-8921961)
hl.animation({ leaf = "specialWorkspaceIn", enabled=true, speed=2, bezier="easeInOutCubic", style="slidefadevert -50%" })
hl.animation({ leaf = "specialWorkspaceOut", enabled=true, speed=2, bezier="easeInOutCubic", style="slidefadevert -50%" })
-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true, -- You probably want this
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
hl.config({
scrolling = {
fullscreen_on_one_column = true,
},
})
--------------
---- MISC ----
--------------
hl.config({
misc = {
force_default_wallpaper = 2, -- Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
},
})
---------------
---- INPUT ----
---------------
hl.config({
input = {
kb_layout = "pl",
kb_variant = "",
kb_model = "",
kb_options = "fkeys:basic_13-24",
kb_rules = "",
follow_mouse = 1,
sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = true,
},
},
})
---------------------
---- KEYBINDINGS ----
---------------------
local mainMod = "SUPER" -- Sets "Windows" key as main modifier
-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal))
local closeWindowBind = hl.bind(mainMod .. " + Q", hl.dsp.window.close())
-- closeWindowBind:set_enabled(false)
hl.bind(mainMod .. " + M", hl.dsp.exit())
hl.bind(mainMod .. " + SUPER_L", hl.dsp.exec_cmd(menu), { release = true })
-- Quick-pad: Special workspaces + boss-key
hl.bind(mainMod .. " + X", hl.dsp.workspace.toggle_special("terminal"))
hl.bind(mainMod .. " + A", hl.dsp.workspace.toggle_special("browser"))
hl.bind(mainMod .. " + D", hl.dsp.workspace.toggle_special("discord"))
hl.bind(mainMod .. " + C", hl.dsp.workspace.toggle_special("element"))
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("obsidian"))
hl.bind(mainMod .. " + Z", hl.dsp.exec_cmd(scripts.."hide.sh"))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
-- Screenshots
hl.bind("PRINT", hl.dsp.exec_cmd(scripts.."screenshot.sh"))
hl.bind(mainMod.." + PRINT", hl.dsp.exec_cmd(scripts.."screenshot.sh --full"))
--------------------------------
---- WINDOWS AND WORKSPACES ----
--------------------------------
-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Example window rules that are useful
local suppressMaximizeRule = hl.window_rule({
-- Ignore maximize requests from all apps. You'll probably like this.
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
suppressMaximizeRule:set_enabled(false) -- ...No, I won't. I run everything as exclusive-window-per-workspace anyway, so I'm not worried about „Windows deciding to take up all my space” (I literally do that). All this will do is cause de-syncs (especially in client-side decorated apps, like all the crapware made in GTK) for exactly 0 benefit.
hl.window_rule({
-- Fix some dragging issues with XWayland
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Hyprland-run windowrule
hl.window_rule({
name = "move-hyprland-run",
match = { class = "hyprland-run" },
move = "20 monitor_h-120",
float = true,
})
-- My rules
hl.window_rule({
name = "onwinopen-default",
match = {
class = ".*",
float = false
},
workspace = "emptym"
})
hl.window_rule({
name = "onwinopen-override-special-terminal",
match = { class = "org.kde.konsole" },
workspace = "special:terminal"
})
hl.window_rule({
name = "onwinopen-override-special-browser",
match = { class = "app.zen_browser.zen" },
workspace = "special:browser silent"
})
hl.window_rule({
name = "onwinopen-override-special-discord",
match = { class = "discord" },
workspace = "special:discord silent"
})
hl.window_rule({
name = "onwinopen-override-special-element",
match = { class = "im.riot.Riot" },
workspace = "special:element silent"
})
hl.window_rule({
name = "onwinopen-override-special-obsidian",
match = { class = "obsidian" },
workspace = "special:obsidian silent"
})
hl.window_rule({
name = "onwinopen-override-minecraft-default",
match = { class = "Minecraft.*" },
workspace = "emptym",
maximize = true
})
hl.window_rule({
name = "onwinopen-override-minecraft-modpack-melatonin",
match = { class = "Melatonin" },
workspace = "emptym",
maximize = true
})
hl.window_rule({
name = "onwinopen-override-waydroid",
match = { class = "Waydroid" },
workspace = "special:waydroid",
fullscreen = true
})
-------------------
---- HYPRGRASS ----
-------------------
--hl.plugin.touch_gestures = {
-- sensitivity = 4.0,
-- edge_margin = 50,
-- ["hyprgrass-bind"] = ", edge:d:u, exec, $scriptsdir/keyboard.sh --no-rotate",
-- ["hyprgrass-bind"] = ", tap:3, exec, $menu -k"
--}

107
hyprlock.conf Normal file
View file

@ -0,0 +1,107 @@
# sample hyprlock.conf
# for more configuration options, refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock
#
# rendered text in all widgets supports pango markup (e.g. <b> or <i> tags)
# ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#general-remarks
#
# shortcuts to clear password buffer: ESC, Ctrl+U, Ctrl+Backspace
#
# you can get started by copying this config to ~/.config/hypr/hyprlock.conf
#
$font = Monospace
general {
# CHANGED: to true
hide_cursor = true
}
# uncomment to enable fingerprint authentication
# auth {
# fingerprint {
# enabled = true
# ready_message = Scan fingerprint to unlock
# present_message = Scanning...
# retry_delay = 250 # in milliseconds
# }
# }
animations {
enabled = true
bezier = linear, 1, 1, 0, 0
animation = fadeIn, 1, 5, linear
animation = fadeOut, 1, 5, linear
animation = inputFieldDots, 1, 2, linear
}
background {
monitor =
path = screenshot
blur_passes = 3
}
input-field {
monitor =
size = 20%, 5%
outline_thickness = 3
inner_color = rgba(0, 0, 0, 0.0) # no fill
outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg
check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg
fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg
font_color = rgb(143, 143, 143)
fade_on_empty = false
rounding = 15
font_family = $font
placeholder_text = Input password...
fail_text = $PAMFAIL
# uncomment to use a letter instead of a dot to indicate the typed password
# dots_text_format = *
# dots_size = 0.4
dots_spacing = 0.3
# uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator)
# hide_input = true
position = 0, -20
halign = center
valign = center
}
# TIME
label {
monitor =
text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution
font_size = 90
font_family = $font
position = -30, 0
halign = right
valign = top
}
# DATE
label {
monitor =
text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds
font_size = 25
font_family = $font
position = -30, -150
halign = right
valign = top
}
label {
monitor =
text = $LAYOUT[en,ru]
font_size = 24
onclick = hyprctl switchxkblayout all next
position = 250, -20
halign = center
valign = center
}

178
hyprpanel/config.json Normal file
View file

@ -0,0 +1,178 @@
{
"bar.customModules.storage.paths": [
"/"
],
"theme.bar.floating": false,
"bar.layouts": {
"0": {
"middle": [
"worldclock"
],
"right": [
"microphone",
"cava",
"battery",
"windowtitle",
"custom/desktop"
],
"left": [
"dashboard",
"custom/menu",
"custom/screenshot",
"custom/rotate",
"custom/keyboard",
"custom/clipboard",
"systray",
"notifications"
]
},
"1": {
"left": [
"dashboard",
"workspaces",
"windowtitle"
],
"middle": [
"media"
],
"right": [
"volume",
"network",
"bluetooth",
"battery",
"systray",
"clock",
"notifications"
]
},
"2": {
"left": [
"dashboard",
"workspaces",
"windowtitle"
],
"middle": [
"media"
],
"right": [
"volume",
"clock",
"notifications"
]
}
},
"menus.dashboard.controls.enabled": true,
"menus.dashboard.shortcuts.enabled": false,
"menus.dashboard.directories.enabled": false,
"menus.volume.raiseMaximumVolume": false,
"bar.launcher.icon": "󰚥",
"menus.clock.weather.enabled": false,
"menus.power.showLabel": true,
"menus.clock.time.military": true,
"menus.clock.weather.location": "Los Angeles",
"bar.customModules.worldclock.leftClick": "menu:calendar",
"theme.bar.buttons.modules.worldclock.enableBorder": true,
"bar.customModules.worldclock.format": "%H:%M:%S",
"menus.clock.time.hideSeconds": false,
"menus.clock.weather.unit": "imperial",
"bar.customModules.worldclock.divider": "",
"bar.customModules.worldclock.tz": [
"Europe/Warsaw"
],
"bar.customModules.worldclock.icon": "",
"bar.customModules.cava.leftClick": "menu:media",
"bar.customModules.cava.middleClick": "",
"theme.bar.menus.opacity": 100,
"theme.bar.opacity": 100,
"theme.bar.buttons.dashboard.icon": "#f9e2af",
"theme.bar.buttons.dashboard.border": "#f9e2af",
"theme.bar.buttons.style": "wave2",
"theme.bar.menus.border.color": "#313244",
"theme.bar.buttons.battery.text": "#f9e2af",
"theme.bar.buttons.battery.icon": "#f9e2af",
"theme.bar.transparent": true,
"bar.launcher.autoDetectIcon": false,
"theme.bar.buttons.dashboard.enableBorder": true,
"bar.workspaces.monitorSpecific": false,
"bar.workspaces.show_numbered": false,
"bar.workspaces.ignored": "-[0-9]+",
"theme.bar.buttons.windowtitle.enableBorder": true,
"bar.windowtitle.custom_title": true,
"theme.bar.buttons.notifications.enableBorder": true,
"bar.notifications.show_total": true,
"bar.notifications.hideCountWhenZero": true,
"theme.bar.buttons.battery.enableBorder": true,
"theme.bar.buttons.workspaces.enableBorder": true,
"theme.bar.buttons.volume.enableBorder": true,
"theme.bar.buttons.network.enableBorder": true,
"theme.bar.buttons.bluetooth.enableBorder": true,
"theme.bar.buttons.systray.enableBorder": true,
"theme.bar.buttons.clock.enableBorder": true,
"theme.bar.buttons.media.enableBorder": true,
"theme.bar.buttons.modules.microphone.enableBorder": true,
"theme.bar.buttons.modules.ram.enableBorder": true,
"theme.bar.buttons.modules.cpu.enableBorder": true,
"theme.bar.buttons.modules.cpuTemp.enableBorder": true,
"theme.bar.buttons.modules.storage.enableBorder": true,
"theme.bar.buttons.modules.netstat.enableBorder": true,
"theme.bar.buttons.modules.kbLayout.enableBorder": true,
"theme.bar.buttons.modules.updates.enableBorder": true,
"theme.bar.buttons.modules.submap.enableBorder": true,
"theme.bar.buttons.modules.weather.enableBorder": true,
"theme.bar.buttons.modules.hypridle.enableBorder": true,
"theme.bar.buttons.modules.cava.enableBorder": true,
"theme.bar.buttons.modules.power.enableBorder": true,
"bar.customModules.cava.rightClick": "menu:audio",
"bar.volume.rightClick": "menu:media",
"bar.customModules.cava.scrollDown": "hyprpanel vol -5",
"bar.customModules.cava.scrollUp": "hyprpanel vol +5",
"bar.clock.icon": "",
"bar.clock.format": "%A, %Y-%m-%d %H:%M:%S",
"bar.customModules.worldclock.formatDiffDate": "",
"bar.windowtitle.leftClick": "hyprctl dispatch \"hl.dsp.window.close()\"",
"bar.workspaces.show_icons": false,
"bar.workspaces.workspaces": 5,
"bar.workspaces.icons.available": "",
"bar.workspaces.showWsIcons": true,
"bar.workspaces.showApplicationIcons": true,
"bar.workspaces.applicationIconEmptyWorkspace": "",
"theme.bar.buttons.workspaces.smartHighlight": true,
"bar.workspaces.applicationIconOncePerWorkspace": false,
"bar.workspaces.numbered_active_indicator": "highlight",
"theme.bar.buttons.workspaces.numbered_inactive_padding": "0em",
"theme.bar.buttons.workspaces.fontSize": "1.2em",
"theme.bar.buttons.workspaces.pill.radius": "1.9rem * 0.6",
"bar.windowtitle.class_name": true,
"bar.windowtitle.truncation_size": 1,
"bar.windowtitle.icon": true,
"bar.customModules.microphone.label": false,
"menus.media.noMediaText": "Cicho tutaj...",
"bar.volume.label": true,
"bar.network.label": true,
"bar.network.showWifiInfo": true,
"bar.bluetooth.label": false,
"theme.bar.buttons.monochrome": true,
"theme.bar.buttons.borderColor": "#e6ff10",
"theme.bar.buttons.text": "#e6ff10",
"theme.bar.buttons.icon": "#e6ff10",
"theme.bar.buttons.icon_background": "#242438",
"theme.bar.buttons.background": "#000000",
"theme.bar.buttons.workspaces.active": "#e6ff10",
"theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#000000",
"theme.bar.buttons.workspaces.background": "#000000",
"theme.bar.buttons.workspaces.occupied": "#62a0ea",
"theme.bar.buttons.workspaces.available": "#77767b",
"theme.bar.buttons.workspaces.hover": "#62a0ea",
"menus.transition": "crossfade",
"theme.bar.border.width": "0.15em",
"theme.bar.layer": "top",
"theme.bar.margin_sides": "0.5em",
"theme.bar.buttons.enableBorders": false,
"theme.bar.border_radius": "0.4em",
"theme.bar.outer_spacing": "0.2em",
"theme.bar.buttons.y_margins": "0.33em",
"theme.bar.buttons.spacing": "0.19em",
"theme.bar.buttons.padding_x": "0.7rem",
"theme.bar.buttons.padding_y": "0.2rem",
"theme.bar.buttons.background_hover_opacity": 100
}

45
hyprpanel/modules.json Normal file
View file

@ -0,0 +1,45 @@
{
"custom/keyboard": {
"icon": "\udb80\udf0c",
"tooltip": "Przełącz klawiaturę.",
"actions": {
"onLeftClick": "$HOME/.config/hypr/scripts/keyboard.sh"
}
},
"custom/menu": {
"icon": "\udb83\ude6f",
"tooltip": "Menu główne.",
"actions": {
"onLeftClick": "$HOME/.config/hypr/scripts/toggle_hyprshell.sh -k"
}
},
"custom/rotate": {
"icon": "\udb82\udc86",
"tooltip": "Obróć ekran.",
"actions": {
"onLeftClick": "$HOME/.config/hypr/scripts/rotate.sh"
}
},
"custom/clipboard": {
"icon": "\ued7b",
"tooltip": "Schowek",
"actions": {
"onLeftClick": "vicinae vicinae://extensions/vicinae/clipboard/history"
}
},
"custom/screenshot": {
"icon": "\uf030",
"tooltip": "Screenshot",
"actions": {
"onLeftClick": "$HOME/.config/hypr/scripts/screenshot.sh --button",
"onRightClick": "$HOME/.config/hypr/scripts/screenshot.sh --button --full"
}
},
"custom/desktop": {
"icon": "\uebf6",
"tooltip": "Pokaż pulpit",
"actions": {
"onLeftClick": "$HOME/.config/hypr/scripts/hide.sh"
}
}
}

98
hyprpanel/modules.scss Normal file
View file

@ -0,0 +1,98 @@
/* ##################################
* # Custom Volume Module Styling #
* ################################## */
@include styleModule(
// class name
'cmodule-keyboard',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);
@include styleModule(
// class name
'cmodule-menu',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);
@include styleModule(
// class name
'cmodule-rotate',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);
@include styleModule(
// class name
'cmodule-clipboard',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);
@include styleModule(
// class name
'cmodule-screenshot',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);
@include styleModule(
// class name
'cmodule-desktop',
// styling properties
(
'text-color': #E6FF10,
'icon-color': #E6FF10,
'icon-background': #000000,
'label-background': #000000,
'inner-spacing': 0em,
'border-enabled': true,
'border-color': #E6FF10,
'icon-size': 1.2em
)
);

57
hyprshell.css Normal file
View file

@ -0,0 +1,57 @@
:root {
--border-color: #E6FF1030;
--border-color-active: #E6FF10;
--bg-color: rgba(20, 20, 20, 0.7);
--bg-color-hover: rgba(40, 40, 50, 1);
--border-radius: 12px;
--border-size: 3px;
--border-style: solid;
--text-color: rgba(245, 245, 245, 1);
--window-padding: 2px;
}
.window {
}
.monitor {
}
.workspace {
font-size: x-small;
}
.client {
}
.client-image {
}
.launcher {
}
.launcher-input {
}
.launcher-results {
}
.launcher-item {
}
.launcher-exec {
}
.launcher-key {
}
.launcher-plugins {
}
.launcher-plugin {
}

79
hyprshell.ron Normal file
View file

@ -0,0 +1,79 @@
// Edit with `hyprshell config edit`
(
version: 4,
windows: (
scale: 5.0,
items_per_row: 6,
overview: (
launcher: (
default_terminal: "konsole",
launch_modifier: "ctrl",
width: 650,
max_items: 5,
show_when_empty: true,
plugins: (
applications: (
run_cache_weeks: 8,
show_execs: true,
show_actions_submenu: true,
),
terminal: (),
shell: (),
websearch: (
engines: [
(
url: "https://www.startpage.com/sp/search?query={}",
name: "Startpage",
key: 's',
),
(
url: "https://www.youtube.com/results?search_query={}",
name: "YouTube",
key: 'y',
),
],
),
calc: (),
path: (),
actions: (
actions: [
logout,
reboot,
shutdown,
custom(
names: [
"Reload",
],
details: "Reloads Hyprshell",
command: "sleep 1; hyprshell socat \'\"Restart\"\'",
icon: "system-restart",
),
custom(
names: [
"Clipboard",
],
details: "Shows clipboard history",
command: "`",
icon: "system-clipboard",
),
],
),
),
),
key: "insert",
top_offset: 430,
modifier: "super",
filter_by: [],
exclude_workspaces: "",
),
switch: (
modifier: "super",
key: "Tab",
filter_by: [],
switch_workspaces: false,
exclude_workspaces: "special:*",
kill_key: 'q',
),
switch_2: None,
),
)

427
mhyprland.conf Normal file
View file

@ -0,0 +1,427 @@
# NOTE: Observation - all EXECs are relative to $HOME - do $scriptsdir/<NAME>.sh to EXEC scripts
# #######################################################################################
# AUTOGENERATED HYPRLAND CONFIG.
# EDIT THIS CONFIG ACCORDING TO THE WIKI INSTRUCTIONS.
# #######################################################################################
#autogenerated = 1 # remove this line to remove the warning
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/$hyprdir/myColors.conf
# ADDED: convenience variables
$hyprdir = .config/hypr
$scriptsdir = $hyprdir/scripts
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor=,preferred,auto,auto
# ADDED: upped my 2nd monitor by 700 pixels to align with main; fixed main's position (it somehow becomes 3200x0 after changing 2nd monitor's position - I reset it back to 0x0)
monitor = eDP-1,preferred,0x0,1,transform,0
monitor = desc:Acer Technologies Acer XF240H 0x0160F332,preferred,1925x-900,1
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
# CHANGED: From kitty to konsole; from Rofi to Hyprshell
$terminal = $scriptsdir/terminal.sh
#$fileManager = dolphin
$menu = $scriptsdir/toggle_hyprshell.sh
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# CHANGED: Enabled
exec-once = $terminal
# exec-once = nm-applet &flatpak run app.zen_browser.zen
# exec-once = waybar & hyprpaper & firefox
# ADDED: Hyprshell, Vicinae; virtual keyboard, Hyprpanel; browser, Discord, Element, Obsidian; virtual keyboard state reset; volumekey daemon; Waydroid
exec-once = hyprshell -c $hyprdir/hyprshell.ron -s $hyprdir/hyprshell.css run
exec-once = vicinae server
exec-once = wvkbd-deskintl --hidden -o
exec-once = hyprpanel
exec-once = flatpak run app.zen_browser.zen
exec-once = flatpak run com.discordapp.Discord
exec-once = flatpak run im.riot.Riot
exec-once = flatpak run md.obsidian.Obsidian
exec-once = $scriptsdir/keyboard.sh reset
exec-once = $scriptsdir/volume-core.sh --start-daemon
exec-once = $scriptsdir/waydroid.sh
#############################
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/Configuring/Permissions/
# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
# for security reasons
# CHANGED: enabled defaults (grim, xdg-desktop-portal-hyprland, plugins and enforce_permissions)
ecosystem {
enforce_permissions = 1
}
permission = /usr/(bin|local/bin)/grim, screencopy, allow
permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
# ADDED: Hyprshell's plugin
permission = /usr/bin/hyprshell, plugin, allow
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hypr.land/Configuring/Variables/
# ADDED: dark mode
exec-once = gsettings set org.gnome.desktop.interface gtk-theme "Breeze-Dark" # for GTK3 apps
exec-once = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps
# NOTE: a dark theme must be set in qt6ct
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 4
gaps_out = 0, 8, 8, 8
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
# CHANGED: My colors :)
col.active_border = rgb(FFE610) rgb(E6FF10) 240deg
col.inactive_border = rgba(FFE61020) rgba(E6FF10E0) 240deg
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 15
rounding_power = 3
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
# NOTE: Occasionally (when terminal breaks), this needs to be disabled (until I figure out how to get blur only on the background ALWAYS, without making all terminal text glow SOMETIMES)
enabled = true
size = 3
passes = 1
vibrancy = 0.1696
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = yes#, please :)
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1
bezier = easeOutQuint, 0.23, 1, 0.32, 1
bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1
bezier = linear, 0, 0, 1, 1
bezier = almostLinear, 0.5, 0.5, 0.75, 1
bezier = quick, 0.15, 0, 0.1, 1
# Default animations, see https://wiki.hypr.land/Configuring/Animations/
# NAME, ONOFF, SPEED, CURVE, [STYLE]
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
animation = zoomFactor, 1, 7, quick
# ADDED: make special workspaces slide in from the top (thx, https://github.com/hyprwm/Hyprland/discussions/1757#discussioncomment-8921961)
animation = specialWorkspaceIn, 1, 2, easeInOutCubic, slidefadevert -50%
animation = specialWorkspaceOut, 1, 2, easeInOutCubic, slidefadevert -50%
}
# ADDED: My color palette for GTK apps
exec-once = gsettings set org.gnome.desktop.interface gtk-color-palette "'black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90'"
# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
# "Smart gaps" / "No gaps when only"
# uncomment all if you wish to use that.
# workspace = w[tv1], gapsout:0, gapsin:0
# workspace = f[1], gapsout:0, gapsin:0
# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
# windowrule = bordersize 0, floating:0, onworkspace:f[1]
# windowrule = rounding 0, floating:0, onworkspace:f[1]
# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
#dwindle {
# pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
# preserve_split = true # You probably want this
#}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
#CHANGED: preferred wallpaper; Waydroid fix
force_default_wallpaper = 2 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
size_limits_tiled = true #Waydroid needs this
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = pl
kb_variant =
kb_model =
kb_options = fkeys:basic_13-24
kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
}
# ADDED: Fix touch&pen mapping
tablet {
output = eDP-1
transform = 0
}
touchdevice {
output = eDP-1
transform = 0
}
}
# See https://wiki.hypr.land/Configuring/Gestures
#gesture = 3, horizontal, workspace
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
#device {
# name = epic-mouse-v1
# sensitivity = -0.5
#}
###################
### KEYBINDINGS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
bind = $mainMod, T, exec, $terminal # CHANGED: From Q to T
# NOTE: This just means "close window"; no actual pkill involved
bind = $mainMod, Q, killactive, # CHANGED: From C to Q
bind = $mainMod, M, exit,
#bind = $mainMod, E, exec, $fileManager
#bind = $mainMod, V, togglefloating,
# CHANGED: From R to SUPER_L
bind = $mainMod, SUPER_L, exec, $menu
#bind = $mainMod, P, pseudo, # dwindle
#bind = $mainMod, J, togglesplit, # dwindle
# Move focus with mainMod + arrow keys
#bind = $mainMod, left, movefocus, l
#bind = $mainMod, right, movefocus, r
#bind = $mainMod, up, movefocus, u
#bind = $mainMod, down, movefocus, d
# Switch workspaces with mainMod + [0-9]
#bind = $mainMod, 1, workspace, 1
#bind = $mainMod, 2, workspace, 2
#bind = $mainMod, 3, workspace, 3
#bind = $mainMod, 4, workspace, 4
#bind = $mainMod, 5, workspace, 5
#bind = $mainMod, 6, workspace, 6
#bind = $mainMod, 7, workspace, 7
#bind = $mainMod, 8, workspace, 8
#bind = $mainMod, 9, workspace, 9
#bind = $mainMod, 0, workspace, 10
# ADDED: blank-screen workspace;
bind = $mainMod, Z, exec, "$scriptsdir/hide.sh"
# Move active window to a workspace with mainMod + SHIFT + [0-9]
#bind = $mainMod SHIFT, 1, movetoworkspace, 1
#bind = $mainMod SHIFT, 2, movetoworkspace, 2
#bind = $mainMod SHIFT, 3, movetoworkspace, 3
#bind = $mainMod SHIFT, 4, movetoworkspace, 4
#bind = $mainMod SHIFT, 5, movetoworkspace, 5
#bind = $mainMod SHIFT, 6, movetoworkspace, 6
#bind = $mainMod SHIFT, 7, movetoworkspace, 7
#bind = $mainMod SHIFT, 8, movetoworkspace, 8
#bind = $mainMod SHIFT, 9, movetoworkspace, 9
#bind = $mainMod SHIFT, 0, movetoworkspace, 10
# CHANGED: Made my own special workspaces
bind = $mainMod, X, togglespecialworkspace, terminal
bind = $mainMod, A, togglespecialworkspace, browser
bind = $mainMod, D, togglespecialworkspace, discord
bind = $mainMod, C, togglespecialworkspace, element
bind = $mainMod, S, togglespecialworkspace, obsidian
#bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
# NOTE: This - for whatever reason - didn't work when the keyboard was detached. Also, it would suddenly jump by like... 50 presses if I presses the volume key in quick succession. So instead, I have a custom script for this now.
#bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 1%+
#bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
# ADDED: screenshots
bind = , PRINT, exec, $scriptsdir/screenshot.sh --full
bind = $mainMod, PRINT, exec, $scriptsdir/screenshot.sh
bind = , F10, exec, $scriptsdir/screenshot.sh --full
bind = $mainMod, F10, exec, $scriptsdir/screenshot.sh
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule
# windowrule = float,class:^(kitty)$,title:^(kitty)$
# Ignore maximize requests from apps. You'll probably like this.
#windowrule = suppressevent maximize, class:.*
# Fix some dragging issues with XWayland
#windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
# ADDED: Every new window (*also requires special treatment for MC windows) is a workspace of its own, except for special workspaces
windowrule = match:class .*, match:float false, workspace emptym
windowrule = match:class org.kde.konsole, workspace special:terminal silent
windowrule = match:class app.zen_browser.zen, workspace special:browser silent
windowrule = match:class discord, workspace special:discord silent
windowrule = match:class im.riot.Riot, workspace special:element silent
windowrule = match:class obsidian, workspace special:obsidian silent
# ADDED: Minecraft (incl. modpacks having custom names - only Melatonin discovered so far) windows require special treatment to avoid being treated as floating
windowrule = match:class Melatonin, workspace emptym, maximize on
windowrule = match:class Minecraft.*, workspace emptym, maximize on
# ADDED: Lock Waydroid size (Android throws a hissy fit and explodes if you try to resize its „monitor” at runtime) - DISABLED, instead I just decided to make it fullscreen
#windowrule = match:class Waydroid, max_size 1900 1221, min_size 1900 1221, tile on
windowrule = match:class Waydroid, fullscreen on
# ADDED: window rules recommended by Vicinae
#layerrule = blur,vicinae
#layerrule = ignorealpha 0, vicinae
#layerrule = noanim, vicinae
#######################
### ADDED: XWAYLAND ###
#######################
xwayland {
force_zero_scaling = true
}
####################
### ADDED: TOUCH ###
####################
exec = hyprpm reload
plugin {
touch_gestures {
sensitivity = 4.0
edge_margin = 50
hyprgrass-bind = , edge:d:u, exec, $scriptsdir/keyboard.sh --no-rotate
hyprgrass-bind = , tap:3, exec, $menu -k
}
}
debug {
#disable_logs = false
}

412
myhyprland.lua Normal file
View file

@ -0,0 +1,412 @@
-------------------
---- VARIABLES ----
-------------------
local hyprdir = ".config/hypr"
local scripts = hyprdir.."/scripts"
-- Set programs that I use
local terminal = scripts.."terminal.sh"
local fileManager = "dolphin"
local menu = scripts.."toggle-hyprshell.sh"
------------------
---- MONITORS ----
------------------
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
-- defaults
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = 1,
mirror = "eDP-1",
})
-- Main tablet screen
hl.monitor({
output = "eDP-1",
mode = "preferred",
position = "0x0",
scale = 1,
})
-- My monitor at home
hl.monitor({
output = "desc:Acer Technologies Acer XF240H 0x0160F332",
mode = "preferred",
position = "1925x-900",
scale = 1,
})
-------------------
---- AUTOSTART ----
-------------------
-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
hl.on("hyprland.start", function ()
-- Load plugins
--hl.exec_cmd("hyprpm reload")
-- Special workspaces
hl.exec_cmd(terminal)
hl.exec_cmd("flatpak run app.zen_browser.zen")
hl.exec_cmd("flatpak run com.discordapp.Discord")
hl.exec_cmd("flatpak run im.riot.Riot")
hl.exec_cmd("flatpak run md.obsidian.Obsidian")
-- Core daemons
hl.exec_cmd("hyprshell -c "..hyprdir.."/hyprshell.ron -s "..hyprdir.."/hyprshell.css run")
hl.exec_cmd("vicinae server")
hl.exec_cmd("wvkbd-deskintl --hidden -o")
hl.exec_cmd("hyprpanel")
hl.exec_cmd(scripts.."keyboard.sh reset")
hl.exec_cmd(scripts.."volume-core.sh --start-daemon")
-- Waydroid (note: this also launches rootedinit.sh under-the-hood)
hl.exec_cmd(scripts.."waydroid.sh")
-- Dark theme
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme Breeze-Dark"); -- for GTK3 apps
hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme prefer-dark"); -- for GTK4 apps
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-color-palette \"'black:white:gray50:red:purple:blue:light blue:green:yellow:orange:lavender:brown:goldenrod4:dodger blue:pink:light green:gray10:gray30:gray75:gray90'\""); --Unrelated to Dark Theme (just my color palette), but there was no better place for it.
end)
-------------------------------
---- ENVIRONMENT VARIABLES ----
-------------------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
-- Were the defaults; no reason to fuck around
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
-- Dark theme, again (*must set manually)
hl.env("QT_QPA_PLATFORMTHEME", "qt6ct")
-----------------------
----- PERMISSIONS -----
-----------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
hl.config({
ecosystem = {
enforce_permissions = true,
},
})
hl.permission({binary="/usr/(bin|local/bin)/grim", type="screencopy", mode="allow"})
hl.permission({binary="/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", type="screencopy", mode="allow"})
hl.permission({binary="/usr/(bin|local/bin)/hyprpm", type="plugin", mode="allow"})
hl.permission({binary="/usr/(bin|local/bin)/hyprshell", type="plugin", mode="allow"})
-----------------------
---- LOOK AND FEEL ----
-----------------------
-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
hl.config({
general = {
gaps_in = 4,
gaps_out = {top=0, right=8, bottom=8, left=8},
border_size = 2,
col = {
active_border = { colors = {"rgb(FFE610)", "rgb(E6FF10)"}, angle = 240 },
inactive_border = { colors = {"rgba(FFE61020)", "rgba(E6FF10E0)"}, angle = 240 },
},
-- Set to true to enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = true,
-- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on
allow_tearing = false,
layout = "dwindle",
},
decoration = {
rounding = 15,
rounding_power = 3,
-- Change transparency of focused and unfocused windows
active_opacity = 1.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 4,
render_power = 3,
color = 0xee1a1a1a,
},
blur = {
enabled = true, --During the Lua migration, I noticed the following note attached in the previous config: „NOTE: Occasionally (when terminal breaks), this needs to be disabled (until I figure out how to get blur only on the background ALWAYS, without making all terminal text glow SOMETIMES)”. However, I don't think I experienced any „terminal glowing” problems in a long time (tho transparency still breaks on it from time to time), so ig this is no longer needed? Leaving the note in, just in case it does end up happening again.
size = 3,
passes = 1,
vibrancy = 0.1696,
},
},
animations = {
enabled = true,
},
})
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} }})
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} }})
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} }})
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} }})
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} }})
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
-- Special workspaces slide-in from the top (thx, https://github.com/hyprwm/Hyprland/discussions/1757#discussioncomment-8921961)
hl.animation({ leaf = "specialWorkspaceIn", enabled=true, speed=2, bezier="easeInOutCubic", style="slidefadevert -50%" })
hl.animation({ leaf = "specialWorkspaceOut", enabled=true, speed=2, bezier="easeInOutCubic", style="slidefadevert -50%" })
-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true, -- You probably want this
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
hl.config({
scrolling = {
fullscreen_on_one_column = true,
},
})
--------------
---- MISC ----
--------------
hl.config({
misc = {
force_default_wallpaper = 2, -- Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
},
})
---------------
---- INPUT ----
---------------
hl.config({
input = {
kb_layout = "pl",
kb_variant = "",
kb_model = "",
kb_options = "fkeys:basic_13-24",
kb_rules = "",
follow_mouse = 1,
sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = true,
},
},
})
---------------------
---- KEYBINDINGS ----
---------------------
local mainMod = "SUPER" -- Sets "Windows" key as main modifier
-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal))
local closeWindowBind = hl.bind(mainMod .. " + Q", hl.dsp.window.close())
-- closeWindowBind:set_enabled(false)
hl.bind(mainMod .. " + M", hl.dsp.exit())
hl.bind(mainMod, hl.dsp.exec_cmd(menu))
-- Quick-pad: Special workspaces + boss-key
hl.bind(mainMod .. " + X", hl.dsp.workspace.toggle_special("terminal"))
hl.bind(mainMod .. " + A", hl.dsp.workspace.toggle_special("browser"))
hl.bind(mainMod .. " + D", hl.dsp.workspace.toggle_special("discord"))
hl.bind(mainMod .. " + C", hl.dsp.workspace.toggle_special("element"))
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("obsidian"))
hl.bind(mainMod .. " + Z", hl.dsp.exec_cmd(scripts.."hide.sh"))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
-- Screenshots
hl.bind("PRINT", hl.dsp.exec_cmd(scripts.."screenshot.sh"))
hl.bind(mainMod.." + PRINT", hl.dsp.exec_cmd(scripts.."screenshot.sh --full"))
--------------------------------
---- WINDOWS AND WORKSPACES ----
--------------------------------
-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Example window rules that are useful
local suppressMaximizeRule = hl.window_rule({
-- Ignore maximize requests from all apps. You'll probably like this.
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
suppressMaximizeRule:set_enabled(false) -- ...No, I won't. I run everything as exclusive-window-per-workspace anyway, so I'm not worried about „Windows deciding to take up all my space” (I literally do that). All this will do is cause de-syncs (especially in client-side decorated apps, like all the crapware made in GTK) for exactly 0 benefit.
hl.window_rule({
-- Fix some dragging issues with XWayland
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Hyprland-run windowrule
hl.window_rule({
name = "move-hyprland-run",
match = { class = "hyprland-run" },
move = "20 monitor_h-120",
float = true,
})
-- My rules
hl.window_rule({
name = "onwinopen-default",
match = {
class = ".*",
float = false
},
workspace = "emptym"
})
hl.window_rule({
name = "onwinopen-override-special-terminal",
match = { class = "org.kde.konsole" },
workspace = "special:terminal"
})
hl.window_rule({
name = "onwinopen-override-special-browser",
match = { class = "app.zen_browser.zen" },
workspace = "special:browser silent"
})
hl.window_rule({
name = "onwinopen-override-special-discord",
match = { class = "discord" },
workspace = "special:discord silent"
})
hl.window_rule({
name = "onwinopen-override-special-element",
match = { class = "im.riot.Riot" },
workspace = "special:element silent"
})
hl.window_rule({
name = "onwinopen-override-special-obsidian",
match = { class = "obsidian" },
workspace = "special:obsidian silent"
})
hl.window_rule({
name = "onwinopen-override-minecraft-default",
match = { class = "Minecraft.*" },
workspace = "emptym",
maximize = true
})
hl.window_rule({
name = "onwinopen-override-minecraft-modpack-melatonin",
match = { class = "Melatonin" },
workspace = "emptym",
maximize = true
})
hl.window_rule({
name = "onwinopen-override-waydroid",
match = { class = "Waydroid" },
fullscreen = true
})
-------------------
---- HYPRGRASS ----
-------------------
--hl.plugin.touch_gestures = {
-- sensitivity = 4.0,
-- edge_margin = 50,
-- ["hyprgrass-bind"] = ", edge:d:u, exec, $scriptsdir/keyboard.sh --no-rotate",
-- ["hyprgrass-bind"] = ", tap:3, exec, $menu -k"
--}

340
ohyprland.conf Normal file
View file

@ -0,0 +1,340 @@
# This is an example Hyprland config file.
# Refer to the wiki for more information.
# https://wiki.hypr.land/Configuring/
# Please note not all available settings / options are set here.
# For a full list, see the wiki
# You can split this configuration into multiple files
# Create your files separately and then link them to this file like this:
# source = ~/.config/hypr/myColors.conf
################
### MONITORS ###
################
# See https://wiki.hypr.land/Configuring/Monitors/
monitor=,preferred,auto,auto
###################
### MY PROGRAMS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
# Set programs that you use
$terminal = kitty
$fileManager = dolphin
$menu = hyprlauncher
#################
### AUTOSTART ###
#################
# Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this:
# exec-once = $terminal
# exec-once = nm-applet &
# exec-once = waybar & hyprpaper & firefox
#############################
### ENVIRONMENT VARIABLES ###
#############################
# See https://wiki.hypr.land/Configuring/Environment-variables/
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
###################
### PERMISSIONS ###
###################
# See https://wiki.hypr.land/Configuring/Permissions/
# Please note permission changes here require a Hyprland restart and are not applied on-the-fly
# for security reasons
# ecosystem {
# enforce_permissions = 1
# }
# permission = /usr/(bin|local/bin)/grim, screencopy, allow
# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow
#####################
### LOOK AND FEEL ###
#####################
# Refer to https://wiki.hypr.land/Configuring/Variables/
# https://wiki.hypr.land/Configuring/Variables/#general
general {
gaps_in = 5
gaps_out = 20
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
# https://wiki.hypr.land/Configuring/Variables/#decoration
decoration {
rounding = 10
rounding_power = 2
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
shadow {
enabled = true
range = 4
render_power = 3
color = rgba(1a1a1aee)
}
# https://wiki.hypr.land/Configuring/Variables/#blur
blur {
enabled = true
size = 3
passes = 1
vibrancy = 0.1696
}
}
# https://wiki.hypr.land/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves
# NAME, X0, Y0, X1, Y1
bezier = easeOutQuint, 0.23, 1, 0.32, 1
bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1
bezier = linear, 0, 0, 1, 1
bezier = almostLinear, 0.5, 0.5, 0.75, 1
bezier = quick, 0.15, 0, 0.1, 1
# Default animations, see https://wiki.hypr.land/Configuring/Animations/
# NAME, ONOFF, SPEED, CURVE, [STYLE]
animation = global, 1, 10, default
animation = border, 1, 5.39, easeOutQuint
animation = windows, 1, 4.79, easeOutQuint
animation = windowsIn, 1, 4.1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1.49, linear, popin 87%
animation = fadeIn, 1, 1.73, almostLinear
animation = fadeOut, 1, 1.46, almostLinear
animation = fade, 1, 3.03, quick
animation = layers, 1, 3.81, easeOutQuint
animation = layersIn, 1, 4, easeOutQuint, fade
animation = layersOut, 1, 1.5, linear, fade
animation = fadeLayersIn, 1, 1.79, almostLinear
animation = fadeLayersOut, 1, 1.39, almostLinear
animation = workspaces, 1, 1.94, almostLinear, fade
animation = workspacesIn, 1, 1.21, almostLinear, fade
animation = workspacesOut, 1, 1.94, almostLinear, fade
animation = zoomFactor, 1, 7, quick
}
# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/
# "Smart gaps" / "No gaps when only"
# uncomment all if you wish to use that.
# workspace = w[tv1], gapsout:0, gapsin:0
# workspace = f[1], gapsout:0, gapsin:0
# windowrule {
# name = no-gaps-wtv1
# match:float = false
# match:workspace = w[tv1]
#
# border_size = 0
# rounding = 0
# }
#
# windowrule {
# name = no-gaps-f1
# match:float = false
# match:workspace = f[1]
#
# border_size = 0
# rounding = 0
# }
# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more
dwindle {
preserve_split = true # You probably want this
}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :(
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = false
}
}
# See https://wiki.hypr.land/Configuring/Gestures
gesture = 3, horizontal, workspace
# Example per-device config
# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more
device {
name = epic-mouse-v1
sensitivity = -0.5
}
###################
### KEYBINDINGS ###
###################
# See https://wiki.hypr.land/Configuring/Keywords/
$mainMod = SUPER # Sets "Windows" key as main modifier
# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more
bind = $mainMod, Q, exec, $terminal
bind = $mainMod, C, killactive,
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, E, exec, $fileManager
bind = $mainMod, V, togglefloating,
bind = $mainMod, R, exec, $menu
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, layoutmsg, togglesplit # dwindle
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Example special workspace (scratchpad)
bind = $mainMod, S, togglespecialworkspace, magic
bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# Scroll through existing workspaces with mainMod + scroll
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Laptop multimedia keys for volume and LCD brightness
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hypr.land/Configuring/Window-Rules/ for more
# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules
# Example windowrules that are useful
windowrule {
# Ignore maximize requests from all apps. You'll probably like this.
name = suppress-maximize-events
match:class = .*
suppress_event = maximize
}
windowrule {
# Fix some dragging issues with XWayland
name = fix-xwayland-drags
match:class = ^$
match:title = ^$
match:xwayland = true
match:float = true
match:fullscreen = false
match:pin = false
no_focus = true
}
# Hyprland-run windowrule
windowrule {
name = move-hyprland-run
match:class = hyprland-run
move = 20 monitor_h-120
float = yes
}

356
ohyprland.lua Normal file
View file

@ -0,0 +1,356 @@
-- This is an example Hyprland Lua config file.
-- Refer to the wiki for more information.
-- https://wiki.hypr.land/Configuring/Start/
-- Please note not all available settings / options are set here.
-- For a full list, see the wiki
-- You can (and should!!) split this configuration into multiple files
-- Create your files separately and then require them like this:
-- require("myColors")
------------------
---- MONITORS ----
------------------
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
hl.monitor({
output = "",
mode = "preferred",
position = "auto",
scale = "auto",
})
---------------------
---- MY PROGRAMS ----
---------------------
-- Set programs that you use
local terminal = "konsole"
local fileManager = "dolphin"
local menu = "hyprlauncher"
-------------------
---- AUTOSTART ----
-------------------
-- See https://wiki.hypr.land/Configuring/Basics/Autostart/
-- Autostart necessary processes (like notifications daemons, status bars, etc.)
-- Or execute your favorite apps at launch like this:
--
-- hl.on("hyprland.start", function ()
-- hl.exec_cmd(terminal)
-- hl.exec_cmd("nm-applet")
-- hl.exec_cmd("waybar & hyprpaper & firefox")
-- end)
-------------------------------
---- ENVIRONMENT VARIABLES ----
-------------------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/
hl.env("XCURSOR_SIZE", "24")
hl.env("HYPRCURSOR_SIZE", "24")
-----------------------
----- PERMISSIONS -----
-----------------------
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/
-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly
-- for security reasons
-- hl.config({
-- ecosystem = {
-- enforce_permissions = true,
-- },
-- })
-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow")
-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow")
-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow")
-----------------------
---- LOOK AND FEEL ----
-----------------------
-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/
hl.config({
general = {
gaps_in = 5,
gaps_out = 20,
border_size = 2,
col = {
active_border = { colors = {"rgba(33ccffee)", "rgba(00ff99ee)"}, angle = 45 },
inactive_border = "rgba(595959aa)",
},
-- Set to true to enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false,
-- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/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.0,
inactive_opacity = 1.0,
shadow = {
enabled = true,
range = 4,
render_power = 3,
color = 0xee1a1a1a,
},
blur = {
enabled = true,
size = 3,
passes = 1,
vibrancy = 0.1696,
},
},
animations = {
enabled = true,
},
})
-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/
hl.curve("easeOutQuint", { type = "bezier", points = { {0.23, 1}, {0.32, 1} } })
hl.curve("easeInOutCubic", { type = "bezier", points = { {0.65, 0.05}, {0.36, 1} } })
hl.curve("linear", { type = "bezier", points = { {0, 0}, {1, 1} } })
hl.curve("almostLinear", { type = "bezier", points = { {0.5, 0.5}, {0.75, 1} } })
hl.curve("quick", { type = "bezier", points = { {0.15, 0}, {0.1, 1} } })
-- Default springs
hl.curve("easy", { type = "spring", mass = 1, stiffness = 71.2633, dampening = 15.8273644 })
hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" })
hl.animation({ leaf = "windows", enabled = true, speed = 4.79, spring = "easy" })
hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, spring = "easy", style = "popin 87%" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" })
hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" })
hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" })
hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" })
hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" })
hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" })
hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" })
hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" })
hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" })
hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" })
-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- "Smart gaps" / "No gaps when only"
-- uncomment all if you wish to use that.
-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 })
-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 })
-- hl.window_rule({
-- name = "no-gaps-wtv1",
-- match = { float = false, workspace = "w[tv1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- hl.window_rule({
-- name = "no-gaps-f1",
-- match = { float = false, workspace = "f[1]" },
-- border_size = 0,
-- rounding = 0,
-- })
-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more
hl.config({
dwindle = {
preserve_split = true, -- You probably want this
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more
hl.config({
master = {
new_status = "master",
},
})
-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more
hl.config({
scrolling = {
fullscreen_on_one_column = true,
},
})
----------------
---- MISC ----
----------------
hl.config({
misc = {
force_default_wallpaper = -1, -- Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = false, -- If true disables the random hyprland logo / anime girl background. :(
},
})
---------------
---- INPUT ----
---------------
hl.config({
input = {
kb_layout = "us",
kb_variant = "",
kb_model = "",
kb_options = "",
kb_rules = "",
follow_mouse = 1,
sensitivity = 0, -- -1.0 - 1.0, 0 means no modification.
touchpad = {
natural_scroll = false,
},
},
})
hl.gesture({
fingers = 3,
direction = "horizontal",
action = "workspace"
})
-- Example per-device config
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more
hl.device({
name = "epic-mouse-v1",
sensitivity = -0.5,
})
---------------------
---- KEYBINDINGS ----
---------------------
local mainMod = "SUPER" -- Sets "Windows" key as main modifier
-- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more
hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal))
local closeWindowBind = hl.bind(mainMod .. " + C", hl.dsp.window.close())
-- closeWindowBind:set_enabled(false)
hl.bind(mainMod .. " + M", hl.dsp.exec_cmd("command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch 'hl.dsp.exit()'"))
hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager))
hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu))
hl.bind(mainMod .. " + P", hl.dsp.window.pseudo())
hl.bind(mainMod .. " + J", hl.dsp.layout("togglesplit")) -- dwindle only
-- Move focus with mainMod + arrow keys
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" }))
-- Switch workspaces with mainMod + [0-9]
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
for i = 1, 10 do
local key = i % 10 -- 10 maps to key 0
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i}))
hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i }))
end
-- Example special workspace (scratchpad)
hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic"))
hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" }))
-- Scroll through existing workspaces with mainMod + scroll
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Move/resize windows with mainMod + LMB/RMB and dragging
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Laptop multimedia keys for volume and LCD brightness
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, repeating = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown",hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true })
-- Requires playerctl
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
--------------------------------
---- WINDOWS AND WORKSPACES ----
--------------------------------
-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/
-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/
-- Example window rules that are useful
local suppressMaximizeRule = hl.window_rule({
-- Ignore maximize requests from all apps. You'll probably like this.
name = "suppress-maximize-events",
match = { class = ".*" },
suppress_event = "maximize",
})
-- suppressMaximizeRule:set_enabled(false)
hl.window_rule({
-- Fix some dragging issues with XWayland
name = "fix-xwayland-drags",
match = {
class = "^$",
title = "^$",
xwayland = true,
float = true,
fullscreen = false,
pin = false,
},
no_focus = true,
})
-- Layer rules also return a handle.
-- local overlayLayerRule = hl.layer_rule({
-- name = "no-anim-overlay",
-- match = { namespace = "^my-overlay$" },
-- no_anim = true,
-- })
-- overlayLayerRule:set_enabled(false)
-- Hyprland-run windowrule
hl.window_rule({
name = "move-hyprland-run",
match = { class = "hyprland-run" },
move = "20 monitor_h-120",
float = true,
})

14
scripts/get_active_workspace.sh Executable file
View file

@ -0,0 +1,14 @@
#!/bin/sh
if [ "$(hyprctl activewindow)" = "Invalid" ]; then
echo "empty";
else
hyprctl activewindow -j | jq -r .workspace.name | grep special >> /dev/null
if [ $? -eq 0 ]; then
echo "special";
else
echo "normal"
fi
fi
exit 0;

41
scripts/hide.sh Executable file
View file

@ -0,0 +1,41 @@
#!/bin/sh
SCRIPT_THIS="$(realpath "$0")"
SCRIPT_GETTER="$(dirname "$SCRIPT_THIS")/get_active_workspace.sh"
RESTORE_TARGET="2"
RESTORE_TARGET_SPECIAL="DO_NOT_RESTORE_ANY_SPECIAL_WORKSPACES"
ACTIVE_WORKSPACE="$("$SCRIPT_GETTER")"
if [ "$ACTIVE_WORKSPACE" = "empty" ]; then
hyprctl dispatch "hl.dsp.focus({workspace=\"$RESTORE_TARGET\"})"
#hyprctl notify 3 6000 000 "hl.dsp.focus({workspace=\"$RESTORE_TARGET\"})"
if [ "$RESTORE_TARGET_SPECIAL" != "DO_NOT_RESTORE_ANY_SPECIAL_WORKSPACES" ]; then
hyprctl dispatch "hl.dsp.workspace.toggle_special(\"$RESTORE_TARGET_SPECIAL\")"
#hyprctl notify 3 6000 000 "hl.dsp.workspace.toggle_special(\"$RESTORE_TARGET_SPECIAL\")"
fi
elif [ "$ACTIVE_WORKSPACE" = "special" ]; then
SPECIAL_WS_NAME="$(hyprctl activewindow -j | jq -r .workspace.name)"
SPECIAL_WS_NAME="${SPECIAL_WS_NAME#"special:"}"
UNDERLYING_WS_ID="$(hyprctl -j monitors | jq --argjson monitorid "$(hyprctl activewindow -j | jq -r .monitor)" ".[] | select(.id == \$monitorid) | .activeWorkspace.id")"
sed -i "s/RESTORE_TARGET=\"$RESTORE_TARGET\"/RESTORE_TARGET=\"$UNDERLYING_WS_ID\"/" "$SCRIPT_THIS"
sed -i "s/RESTORE_TARGET_SPECIAL=\"$RESTORE_TARGET_SPECIAL\"/RESTORE_TARGET_SPECIAL=\"$SPECIAL_WS_NAME\"/" "$SCRIPT_THIS"
hyprctl dispatch "hl.dsp.workspace.toggle_special(\"$SPECIAL_WS_NAME\")"
#hyprctl notify 3 6000 000 "hl.dsp.workspace.toggle_special(\"$SPECIAL_WS_NAME\")"
hyprctl dispatch "hl.dsp.focus({workspace=\"emptynm\"})"
#hyprctl notify 3 6000 000 "hl.dsp.focus({workspace=\"emptynm\"})"
elif [ "$ACTIVE_WORKSPACE" = "normal" ]; then
sed -i "s/RESTORE_TARGET=\"$RESTORE_TARGET\"/RESTORE_TARGET=\"$(hyprctl activewindow -j | jq -r .workspace.name)\"/" "$SCRIPT_THIS"
sed -i "s/RESTORE_TARGET_SPECIAL=\"$RESTORE_TARGET_SPECIAL\"/RESTORE_TARGET_SPECIAL=\"DO_NOT_RESTORE_ANY_SPECIAL_WORKSPACES\"/" "$SCRIPT_THIS"
hyprctl dispatch "hl.dsp.focus({workspace=\"emptynm\"})"
#hyprctl notify 3 6000 000 "hl.dsp.focus({workspace=\"emptynm\"})"
else
hyprctl notify 3 1000 000 "Error: Unknown workspace state \"$ACTIVE_WORKSPACE\".";
exit 1;
fi

View file

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=Bluetooth Settings
Comment=Open Hyprpanel's Bluetooth menu
Exec=hyprpanel t bluetoothmenu
Terminal=false

View file

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=Hyprpanel Settings
Comment=Open Hyprpanel's Settings menu
Exec=hyprpanel t settings-dialog
Terminal=false

6
scripts/hyprpanel_wifi.desktop Executable file
View file

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=WiFi Settings
Comment=Open Hyprpanel's WiFi menu
Exec=hyprpanel t networkmenu
Terminal=false

31
scripts/install.sh Executable file
View file

@ -0,0 +1,31 @@
#!/bin/sh
if [ -z "$1" ]; then
PERMS="555"
elif [ "$1" = "--editable" ] || [ "$1" = "-e" ]; then
PERMS="777"
else
echo "Usage: $0 [--editable|-e]";
exit 1;
fi
if [ -z "$HOME" ]; then
echo "Script unusable by homeless users. ;-P";
echo "Set your \$HOME envar (or have your shell do it for you, like on every normal distro) and try again.";
exit 1;
fi
DIR="$HOME/.config/hypr/scripts"
if [ "$(realpath "$DIR/$(basename "$0")")" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
echo "Installing...";
ln -vrs "$DIR"/*.desktop "$HOME/.local/share/applications/"
ln -vrs "$HOME/.config/hypr/hyprpanel" "$HOME/.config/"
chmod --verbose $PERMS "$DIR"/*.sh
xdg-mime default open_folder.desktop inode/directory
echo "Done!";
exit 0;

94
scripts/keyboard.sh Executable file
View file

@ -0,0 +1,94 @@
#!/bin/bash
IS_ACTIVE="false"
SCRIPT_LOCATION="$(realpath "$0")"
if [ -z "$1" ]; then
if [ $IS_ACTIVE = "true" ]; then
"$SCRIPT_LOCATION" hide;
else
"$SCRIPT_LOCATION" show;
fi
exit 0;
fi
if [ "$1" == "--no-rotate" ]; then
if [ $IS_ACTIVE = "true" ]; then
"$SCRIPT_LOCATION" hide --no-rotate;
else
"$SCRIPT_LOCATION" show --no-rotate;
fi
exit 0;
fi
if [ "$1" == "hide" ]; then
killall -s SIGUSR1 wvkbd-deskintl;
"$SCRIPT_LOCATION" reset;
if [ -z "$2" ]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,0
hyprctl keyword input:tablet:transform 0
hyprctl keyword input:touchdevice:transform 0
exit 0;
elif [ "$2" == "--no-rotate" ]; then
exit 0;
else
echo "Unknown flag: $2";
fi
exit 1;
fi
if [ "$1" == "show" ]; then
killall -s SIGUSR2 wvkbd-deskintl;
sed -i "s/IS_ACTIVE=\"false\"/IS_ACTIVE=\"true\"/" "$SCRIPT_LOCATION";
if [ -z "$2" ]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,1
hyprctl keyword input:tablet:transform 1
hyprctl keyword input:touchdevice:transform 1
exit 0;
elif [ "$2" == "--no-rotate" ]; then
exit 0;
else
echo "Unknown flag: $2";
fi
exit 1;
fi
if [ "$1" == "json" ]; then
if [ $IS_ACTIVE = "true" ]; then
STATE="active"
ACTION="Hide"
ACTION_PL="Ukryj"
else
STATE="hidden"
ACTION="Show"
ACTION_PL="Pokaż"
fi
echo "{\"state\":\"${STATE}\",\"alt\":\"${ACTION}\",\"action\":{\"en\":\"${ACTION}\",\"pl\":\"${ACTION_PL}\"}}";
exit 0;
fi
if [ "$1" == "status" ]; then
if [ $IS_ACTIVE = "true" ]; then
echo "active";
else
echo "hidden";
fi
exit 0;
fi
if [ "$1" == "reset" ]; then
sed -i "s/IS_ACTIVE=\"true\"/IS_ACTIVE=\"false\"/" "$SCRIPT_LOCATION";
exit 0;
fi
if [ "$1" == "help" ]; then
echo "params: --no-rotate|hide [--no-rotate]|show [--no-rotate]|json|status|reset|help";
echo "no param: toggle";
exit 0;
fi
echo "Unknown command \"${SCRIPT_LOCATION} $1\", use \"${SCRIPT_LOCATION} help\" for help.";
exit 1;

9
scripts/open_folder.desktop Executable file
View file

@ -0,0 +1,9 @@
[Desktop Entry]
Type=Application
Name=Terminal Folder Opener
Comment=Open a terminal in the selected folder
Exec=/home/guzio/.config/hypr/scripts/terminal.sh %f
MimeType=inode/directory
Terminal=false
# Please replace /home/guzio/ with your actual $HOME path!!!

42
scripts/rootedinit.sh Executable file
View file

@ -0,0 +1,42 @@
#!/bin/sh
# from volume-root.sh
if [ -z "$1" ]; then
DIR="$HOME/.config/hypr/scripts"
SELF="$(realpath "$DIR/$(basename "$0")")"
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
else
if [ "root" != "$USER" ]; then
echo "Only root are allowed to arbitrarily specify the directory.";
exit 1;
fi
DIR=$1
SELF="Something went horribly wrong! You were assumed to be root in one check, but non-root by the next one.";
fi
if [ "root" != "$USER" ]; then
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
exec sudo "$SELF" "$DIR";
echo "NOTE: You should never see this message!"
exit 1;
fi
# custom logic for rootedinit.sh
USRDIR="$DIR/../../.."
iptables -P FORWARD ACCEPT #Or Waydroid won't have internet access; iptables-save didn't work for some reason
mount -Bv "$USRDIR/Obrazy" "$USRDIR/.local/share/waydroid/data/media/0/Pictures"
mount -Bv "$USRDIR/Obrazy" "$USRDIR/.local/share/waydroid/data/media/0/DCIM"
mount -Bv "$USRDIR/Dokumenty" "$USRDIR/.local/share/waydroid/data/media/0/Documents"
mount -Bv "$USRDIR/Pobrane" "$USRDIR/.local/share/waydroid/data/media/0/Download"
mount -Bv "$USRDIR/.config" "$USRDIR/.local/share/waydroid/data/media/0/Source OS/conf"
mount -Bv "$USRDIR/.var/app" "$USRDIR/.local/share/waydroid/data/media/0/Source OS/flatpak"
swapon /dev/nvme0n1p3 #Unrelated to Waydroid, but this is probably the least awkward place to lazily put it

37
scripts/rotate.sh Executable file
View file

@ -0,0 +1,37 @@
#!/bin/bash
ORIENTATION="$(head -n1 <(monitor-sensor --accel | grep --line-buffered -Eo "normal|left-up|bottom-up|right-up"))"
hyprctl activewindow|grep Waydroid >> /dev/null
if [ $? -eq 0 ]; then
"$(dirname "$(realpath "$0")")/waydroid-root.sh" "rotate-$ORIENTATION"
ORIENTATION="normal"
fi
if [[ "$ORIENTATION" == "normal" ]]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,0
hyprctl keyword input:tablet:transform 0
hyprctl keyword input:touchdevice:transform 0
elif [[ "$ORIENTATION" == "left-up" ]]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,1
hyprctl keyword input:tablet:transform 1
hyprctl keyword input:touchdevice:transform 1
elif [[ "$ORIENTATION" == "bottom-up" ]]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,2
hyprctl keyword input:tablet:transform 2
hyprctl keyword input:touchdevice:transform 2
elif [[ "$ORIENTATION" == "right-up" ]]; then
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,3
hyprctl keyword input:tablet:transform 3
hyprctl keyword input:touchdevice:transform 3
else
hyprctl notify 3 1000 000 "Unknown orientation: $ORIENTATION. Resetting to normal."
hyprctl keyword monitor eDP-1,preferred,0x0,1,transform,0
hyprctl keyword input:tablet:transform 0
hyprctl keyword input:touchdevice:transform 0
exit 1;
fi
killall monitor-sensor
exit 0;

28
scripts/screenshot.sh Executable file
View file

@ -0,0 +1,28 @@
#!/bin/sh
KILLED=false
if pgrep satty; then
killall satty
KILLED=true
fi
if [ -z $1 ]; then
:
elif [ $1 = "--button" ]; then
if [ $KILLED = "true" ]; then
exit 0;
else
set -- "$2";
fi
fi
if [ -z "$1" ]; then
grim -w "$(hyprctl activewindow -j | jq -r .address)" - | satty --filename -
elif [ "$1" = "--full" ]; then
grim - | satty --filename -
else
echo "Usage: $0 [--button] [--full]";
exit 1;
fi
exit 0;

8
scripts/stop_waydroid.desktop Executable file
View file

@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Kill WayDroid Session
Comment=Kills a WayDroid Session
Exec=waydroid session stop
Terminal=true
# Please replace /home/guzio/ with your actual $HOME path!!!

8
scripts/terminal.sh Executable file
View file

@ -0,0 +1,8 @@
#!/bin/sh
if [ -z "$1" ]; then
konsole --new-tab --workdir $HOME
exit 0;
fi
konsole --new-tab --workdir $1
hyprctl dispatch "hl.dsp.workspace.toggle_special(\"terminal\")"

22
scripts/toggle_hyprshell.sh Executable file
View file

@ -0,0 +1,22 @@
#!/bin/sh
SCRIPTDIR="$(dirname "$(realpath "$0")")"
if hyprctl layers|grep hyprshell; then
wtype -k escape
else
hyprshell socat '"OpenOverview"'
hyprctl activewindow|grep Waydroid >> /dev/null
if [ $? -eq 0 ]; then
hyprctl dispatch "hl.dsp.workspace.toggle_special(\"waydroid\")"
fi
if [ "$1" = "-k" ] && [ "$("$SCRIPTDIR"/keyboard.sh status)" != "active" ]; then
"$SCRIPTDIR"/keyboard.sh show --no-rotate
while hyprctl layers|grep hyprshell; do
sleep 0.1;
done
"$SCRIPTDIR"/keyboard.sh hide --no-rotate
fi
fi

48
scripts/volume-core.sh Executable file
View file

@ -0,0 +1,48 @@
#!/bin/sh
SCRIPT_THIS="$(realpath "$0")"
SCRIPT_ROOT="$(dirname "$SCRIPT_THIS")/volume-root.sh"
SCRIPT_ROOT_WD="$(dirname "$SCRIPT_THIS")/waydroid-root.sh"
if [ -z "$1" ]; then
:
elif [ "$1" = "115" ]; then
# „Always control volume on the Linux side” flow commented out and waiting for a better day, because waydroid-root.sh reset-volume is broken (see waydroid-root.sh for details)
#hyprctl activewindow|grep Waydroid >> /dev/null
#if [ $? -eq 0 ]; then
# "$SCRIPT_ROOT_WD" reset-volume
#fi
#hyprpanel vol +5
# Shitty „hand controls to Android when Waydroid is in focus” flow that I wish I could forgo
hyprctl activewindow|grep Waydroid >> /dev/null
if [ $? -eq 0 ]; then
wpctl set-volume @DEFAULT_AUDIO_SINK@ 100%
else
wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
fi
elif [ "$1" = "114" ]; then
# „Always control volume on the Linux side” flow commented out and waiting for a better day, because waydroid-root.sh reset-volume is broken (see waydroid-root.sh for details)
#hyprctl activewindow|grep Waydroid >> /dev/null
#if [ $? -eq 0 ]; then
# "$SCRIPT_ROOT_WD" reset-volume
#fi
#hyprpanel vol -5
# Shitty „hand controls to Android when Waydroid is in focus” flow that I wish I could forgo
hyprctl activewindow|grep Waydroid >> /dev/null
if [ $? -eq 0 ]; then
wpctl set-volume @DEFAULT_AUDIO_SINK@ 100%
else
wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
fi
elif [ "$1" = "--start-daemon" ]; then
while true; do
"$SCRIPT_ROOT"|xargs "$SCRIPT_THIS"
done
elif [ "$1" = "--quit-daemon" ]; then
killall "$(basename "$SCRIPT_THIS")";
else
echo "Unknown flag: $1";
exit 1;
fi

33
scripts/volume-root.sh Executable file
View file

@ -0,0 +1,33 @@
#!/bin/sh
# I forgot that dirname exists while writing this.
if [ -z "$1" ]; then
DIR="$HOME/.config/hypr/scripts"
SELF="$(realpath "$DIR/$(basename "$0")")"
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
else
if [ "root" != "$USER" ]; then
echo "Only root are allowed to arbitrarily specify the directory.";
exit 1;
fi
DIR=$1
SELF="Something went horribly wrong! You were assumed to be root in one check, but non-root by the next one.";
fi
if [ "root" != "$USER" ]; then
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
exec sudo "$SELF" "$DIR";
echo "NOTE: You should never see this message!"
exit 1;
fi
"$DIR/volume-bin" | grep -Eo "115 press|114 press"

87
scripts/waydroid-root.sh Executable file
View file

@ -0,0 +1,87 @@
#!/bin/sh
# custom logic for waydroid-root.sh [PART 1]
if [ -z "$1" ]; then
echo "Subcommand needed, use \"${SCRIPT_LOCATION} help\" for help.";
exit 1;
fi
if [ "$1" == "help" ]; then
echo "params: rotate-normal|rotate-left-up|rotate-right-up|rotate-bottom-up|reset-volume|help";
exit 0;
fi
# from volume-root.sh (modified to allow an extra param from the user)
if [ -z "$2" ]; then
DIR="$HOME/.config/hypr/scripts"
SELF="$(realpath "$DIR/$(basename "$0")")"
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
else
if [ "root" != "$USER" ]; then
echo "Only root are allowed to arbitrarily specify the directory.";
exit 1;
fi
DIR=$2
SELF="Something went horribly wrong! You were assumed to be root in one check, but non-root by the next one.";
fi
if [ "root" != "$USER" ]; then
if [ "$SELF" != "$(realpath "$0")" ]; then
echo "This script must exist inside of $DIR";
exit 1;
fi
exec sudo "$SELF" "$1" "$DIR";
echo "NOTE: You should never see this message!"
exit 1;
fi
# custom logic for waydroid-root.sh [PART 2]
if [ "$1" == "rotate-normal" ]; then
waydroid shell settings put system user_rotation 0
exit;
fi
if [ "$1" == "rotate-right-up" ]; then
waydroid shell settings put system user_rotation 1
exit;
fi
if [ "$1" == "rotate-bottom-up" ]; then
waydroid shell settings put system user_rotation 2
exit;
fi
if [ "$1" == "rotate-left-up" ]; then
waydroid shell settings put system user_rotation 3
exit;
fi
# Commented-out because it doesn't work. I can QUERY those values just fine, and the returned numbers correspond to what I put in my setting on the Android side - but when I try to SET them, nothing happens. I have no idea why, but it is what it is.
#if [ "$1" == "reset-volume" ]; then
# # These are the „everything is maxed out” values. Don't ask me why are they so random; I didn't make Android.
# waydroid shell settings put system volume_alarm 6
# waydroid shell settings put system volume_alarm_speaker 7
# waydroid shell settings put system volume_bluetooth_sco 7
# waydroid shell settings put system volume_music 5
# waydroid shell settings put system volume_music_speaker 15
# waydroid shell settings put system volume_music_usb_headset 3
# waydroid shell settings put system volume_notification 5
# waydroid shell settings put system volume_notification_speaker 7
# waydroid shell settings put system volume_ring 5
# waydroid shell settings put system volume_ring_speaker 7
# waydroid shell settings put system volume_system 7
# waydroid shell settings put system volume_voice 4
# waydroid shell settings put system volume_voice_speaker 15
# exit 0;
#fi
echo "Unknown command \"${SCRIPT_LOCATION} $1\", use \"${SCRIPT_LOCATION} help\" for help.";
exit 1;

6
scripts/waydroid.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash
SCRIPTDIR="$(dirname "$(realpath "$0")")"
/usr/bin/sshd -f "$HOME/.ssh/wd-local/sshd_config"
waydroid show-full-ui & sleep 60;"$SCRIPTDIR/rootedinit.sh"

BIN
wallpaper-test/wall3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
wallpaper-test/wall4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

1
wayle/config.toml Normal file
View file

@ -0,0 +1 @@
# Wayle configuration file

191
wayle/runtime.toml Normal file
View file

@ -0,0 +1,191 @@
[bar]
bg = "transparent"
button-variant = "basic"
button-label-weight = "bold"
button-rounding = "full"
button-border-width = 2
dropdown-freeze-label = false
[styling]
scale = 1.0
rounding = "full"
[styling.palette]
bg = "#000000"
surface = "#000000"
elevated = "#000000"
fg = "#e6ff10"
fg-muted = "#c6bb05"
primary = "#e6ff10"
red = "#ff0000"
yellow = "#e6ff10"
green = "#00ff00"
blue = "#00ffff"
[modules.battery]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.bluetooth]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.cava]
button-bg-color = "bg-base"
border-show = true
[modules.clock]
border-show = true
button-bg-color = "bg-base"
[modules.cpu]
border-show = true
border-color = "fg-default"
icon-bg-color = "fg-default"
label-color = "fg-default"
button-bg-color = "bg-base"
[modules.dashboard]
border-show = true
[modules.hyprland-workspaces]
container-bg-color = "bg-base"
border-show = true
border-color = "accent"
[modules.hyprsunset]
border-show = true
border-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.idle-inhibit]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.keybind-mode]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.keyboard-input]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.media]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.microphone]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.network]
border-show = true
icon-color = "accent"
button-bg-color = "bg-base"
[modules.netstat]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.notification]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.power]
border-show = true
border-color = "accent"
icon-color = "bg-base"
icon-bg-color = "accent"
[modules.ram]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.storage]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
label-max-length = 435
button-bg-color = "bg-base"
[modules.systray]
border-show = true
button-bg-color = "bg-base"
[modules.volume]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.weather]
border-show = true
icon-color = "accent"
button-bg-color = "bg-base"
[modules.window-title]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[modules.world-clock]
border-show = true
border-color = "accent"
icon-color = "accent"
icon-bg-color = "accent"
label-color = "accent"
button-bg-color = "bg-base"
[wallpaper]
engine-enabled = false
transition-type = "fade"
cycling-mode = "shuffle"

1
wayle/schema.json Normal file

File diff suppressed because one or more lines are too long

1
wayle/themes/schema.json Normal file
View file

@ -0,0 +1 @@
{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Palette","description":"Ten-color palette for CSS generation.","type":"object","properties":{"bg":{"description":"Base background color (darkest).","type":"string"},"surface":{"description":"Card and sidebar background.","type":"string"},"elevated":{"description":"Raised element background.","type":"string"},"fg":{"description":"Primary text color.","type":"string"},"fg_muted":{"description":"Secondary text color.","type":"string"},"primary":{"description":"Accent color for interactive elements.","type":"string"},"red":{"description":"Red palette color.","type":"string"},"yellow":{"description":"Yellow palette color.","type":"string"},"green":{"description":"Green palette color.","type":"string"},"blue":{"description":"Blue palette color.","type":"string"}},"required":["bg","surface","elevated","fg","fg_muted","primary","red","yellow","green","blue"],"$id":"wayle-theme-0.2.3"}

10
wayle/tombi.toml Normal file
View file

@ -0,0 +1,10 @@
[schema]
enabled = true
[[schemas]]
path = "./schema.json"
include = ["config.toml", "runtime.toml"]
[[schemas]]
path = "./themes/schema.json"
include = ["themes/*.toml"]