feat: finalize migration to chezmoi and modernize configuration logic

- Modularize Hyprland config into hyprland.d/
- Implement infinitely scalable monitor/workspace logic using templates and loop-based data structures
- Consolidate host-specific configs (hyprlock, hyprpaper, waybar) into single templates
- Resolve waybar symlink conflict and fix template execution errors
- Integrate chezmoi data variables for scale, resolution, and peripherals
This commit is contained in:
s0wlz (Matthias Puchstein)
2025-12-27 22:52:43 +01:00
commit 8018b53353
363 changed files with 30476 additions and 0 deletions

33
.chezmoiignore.tmpl Normal file
View File

@@ -0,0 +1,33 @@
{{- $tags := .chezmoi.config.data.tags -}}
{{- if not (index $tags "cs2") -}}
.local/share/Steam/steamapps/common/Counter-Strike Global Offensive/game/csgo/cfg/autoexec.cfg
{{- end -}}
{{- if not (index $tags "pipewire") -}}
.config/pipewire/**
{{- end -}}
{{- if not (index $tags "hyprland") -}}
.config/autostart/swayosd-server.desktop
.config/autostart/waybar.desktop
.config/hypr/**
{{- end -}}
{{- if not (index $tags "dev") -}}
.config/autostart/jetbrains-toolbox.desktop
{{- end -}}
{{- if not (index $tags "entertainment") -}}
.config/autostart/jellyfin-mpv-shim.desktop
{{- end -}}
{{- if not (index $tags "desktop") -}}
.config/autostart/info.mumble.Mumble.desktop
.config/autostart/vesktop.desktop
.config/autostart/steam.desktop
.config/MangoHud/**
{{- end -}}
.config/hypr/hyprland.wiki/**
.config/waybar/waybar.wiki/**
AGENTS.md
GEMINI.md

View File

@@ -0,0 +1,31 @@
{{- if (index .chezmoi.config.data.tags "pipewire") -}}
#!/bin/sh
set -eu
# Re-run whenever the denoising config changes.
# conf-sha: {{ (include "dot_config/pipewire/pipewire.conf.d/99-input-denoising.conf") | sha256sum }}
if command -v pacman >/dev/null 2>&1; then
if pacman -Q noise-suppression-for-voice >/dev/null 2>&1; then
exit 0
fi
if [ -t 0 ]; then
printf 'noise-suppression-for-voice not installed. Install now? [y/N] ' >&2
read -r ans
case "$ans" in
[yY]|[yY][eE][sS]) sudo pacman -S --needed noise-suppression-for-voice ;;
*) printf 'Skipping noise-suppression-for-voice install.\n' >&2 ;;
esac
else
printf 'noise-suppression-for-voice not installed. Install with: sudo pacman -S --needed noise-suppression-for-voice\n' >&2
fi
else
if [ ! -f /usr/lib/ladspa/librnnoise_ladspa.so ]; then
printf 'rnnoise LADSPA plugin missing; install noise-suppression-for-voice for your distro.\n' >&2
fi
fi
{{- else -}}
#!/bin/sh
exit 0
{{- end -}}

30
AGENTS.md Normal file
View File

@@ -0,0 +1,30 @@
# Repository Guidelines
## Project Structure & Module Organization
This is a chezmoi dotfiles source tree. Key paths:
- `dot_config/` maps to `~/.config/` (e.g., `dot_config/hypr/`, `dot_config/nvim/`, `dot_config/waybar/`).
- `dot_local/` maps to `~/.local/` (app data, scripts, etc.).
- `dot_profile.tmpl` renders to `~/.profile`.
- `.chezmoiscripts/` contains chezmoi hooks (e.g., `run_onchange_*` scripts).
- Host-specific variants use `##hostname.<name>` (e.g., `hyprpaper.conf##hostname.owlenlap01`).
- `dot_config/waybar/waybar.wiki/` and `dot_config/hypr/hyprland.wiki/` are mirrored docs with `dot_git/` metadata; treat them as upstream mirrors unless intentionally updating.
## Build, Test, and Development Commands
There is no build system; apply and verify changes with chezmoi:
- `chezmoi diff` preview pending changes.
- `chezmoi apply` render and apply to `$HOME`.
- `chezmoi status` show managed file status.
After applying, restart the affected app (e.g., reload Hyprland/Waybar) to validate.
## Coding Style & Naming Conventions
- Match the existing files formatting; dont reflow unrelated sections.
- Lua configs in `dot_config/nvim/` use 2space indents and include `dot_config/nvim/dot_stylua.toml` and `dot_config/nvim/selene.toml` for format/lint settings.
- Use chezmoi prefixes: `dot_` for dotfiles, `executable_` for executable files, `symlink_` for symlinks, `private_` for restrictedpermission files, and `.tmpl` for Go templates.
## Testing Guidelines
No automated tests are defined. Validate by:
- Running `chezmoi diff` and `chezmoi apply`.
- Smoketesting the specific tool you changed (e.g., open Neovim, restart Waybar, reload Hyprland).
## Commit & Pull Request Guidelines
This repository has no commits yet, so there is no established commit message convention. Use short, imperative subjects and include a scope when helpful (e.g., `hypr: adjust keybinds`). For PRs, include a clear summary, affected paths, and screenshots for visual/UI changes.

68
GEMINI.md Normal file
View File

@@ -0,0 +1,68 @@
# Project Overview
This is a **chezmoi** source directory used for managing user configuration files (dotfiles) on a Linux system. It centralizes the configuration for the shell, window manager, editor, and other utilities, allowing for consistent setups across multiple machines (referenced by hostname tags like `owlenlap01`, `owlenpc00`).
## Key Components
* **Dotfile Manager:** [chezmoi](https://www.chezmoi.io/)
* **Window Manager:** [Hyprland](https://hyprland.org/) (Modular configuration)
* **Shell:** [Zsh](https://www.zsh.org/) managed with [Zim](https://zimfw.sh/) and themed with [Powerlevel10k](https://github.com/romkatv/powerlevel10k).
* **Editor:** [Neovim](https://neovim.io/) configured with Lua and [lazy.nvim](https://github.com/folke/lazy.nvim).
* **Status Bar:** [Waybar](https://github.com/Alexays/Waybar)
* **Terminal Emulators:** [Kitty](https://sw.kovidgoyal.net/kitty/), [Alacritty](https://alacritty.org/)
* **Other:** Tmux, Mpv, Dunst/SwayNC, Fuzzel/Rofi equivalent.
## Directory Structure
The directory structure follows standard `chezmoi` conventions:
* **`dot_config/`**: Maps to `~/.config/`. Contains the bulk of application configurations.
* **`hypr/`**: Hyprland configuration. `hyprland.conf` is the entry point, sourcing files from `hyprland.d/`. Host-specific overrides exist (e.g., `hyprpaper.conf##hostname.owlenlap01`).
* **`nvim/`**: Neovim configuration. `init.lua` bootstraps `lazy.nvim`.
* **`zsh/`**: Zsh configuration, including `dot_zshrc` (mapped to `~/.config/zsh/.zshrc`).
* **`waybar/`**: Waybar configuration and styles.
* **`dot_local/`**: Maps to `~/.local/`. Contains scripts and local data.
* **`.chezmoiscripts/`**: Contains scripts that run when `chezmoi apply` is executed (e.g., `run_onchange_...`).
* **`dot_profile.tmpl`**: A template that renders to `~/.profile`, handling environment variables. It uses tags (e.g., `dev`, `desktop`) to conditionally include configurations.
## Usage
This directory is the **source of truth**. Do not edit files directly in `~/.config` if they are managed here; your changes will be overwritten.
### Common Commands
* **Apply Changes:**
```bash
chezmoi apply
```
Renders templates and copies files to the target destination (usually `$HOME`).
* **Preview Changes:**
```bash
chezmoi diff
```
Shows what will change in the destination directory if `chezmoi apply` is run.
* **Edit a File:**
```bash
chezmoi edit <file_path>
```
Opens the source file for editing in your `$EDITOR`.
* **Check Status:**
```bash
chezmoi status
```
### Templates and Logic
Files ending in `.tmpl` are Go templates. They support logic based on `chezmoi` data.
* **Variables:** `{{ .chezmoi.homeDir }}` represents the user's home directory.
* **Tags:** Logic like `{{- if (index $tags "dev") }}` is used to enable features based on the machine's role (e.g., development tools, desktop-specific GPU settings).
## Development Conventions
* **Hyprland:** Keep configuration modular. Add new settings to the appropriate file in `dot_config/hypr/hyprland.d/` rather than cluttering `hyprland.conf`.
* **Neovim:** Configuration is split into `lazy_setup.lua` (plugins) and `polish.lua` (general settings).
* **Zsh:** Custom aliases should go in `dot_config/zsh/aliases.zsh`.
* **Naming:** Use `dot_` to represent a dot prefix (e.g., `dot_config` -> `.config`). Use `executable_` to mark files as executable.

View File

@@ -0,0 +1,76 @@
################### File Generated by Goverlay ###################
legacy_layout=false
horizontal
background_alpha=0.5
round_corners=10
background_alpha=0.5
background_color=241F31
width=10
heigth=10
font_size=14
text_color=FFFFFF
position=top-center
no_small_font
hud_no_margins
hud_compact
offset_y=5
pci_dev=0:12:00.0
table_columns=1
fps
gpu_text=GPU
gpu_stats
gpu_load_change
gpu_load_value=50,90
gpu_load_color=FFFFFF,FFAA7F,CC0000
throttling_status
gpu_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_load_change
cpu_load_value=50,90
cpu_load_color=FFFFFF,FFAA7F,CC0000
cpu_temp
cpu_color=2E97CB
swap
vram
vram_color=AD64C1
ram
ram_color=C26693
procmem
wine
wine_color=EB5B5B
fps_limit_method=late
fps_limit=0
fsr
hdr
refresh_rate
gamemode
custom_text=Arch Linux
exec=uname -r
#offset=0
vsync=0
gl_vsync=-1
time#
version
output_folder=/home/mpuchstein
log_duration=30
autostart_log=0
log_interval=100
toggle_fps_limit=Shift_L+F1
toggle_logging=Shift_L+F2
reload_cfg=Shift_R+F9
toggle_preset=Shift_R+F10
toggle_hud_position=Shift_R+F11
toggle_hud=Shift_R+F12

View File

@@ -0,0 +1,76 @@
################### File Generated by Goverlay ###################
legacy_layout=false
horizontal
background_alpha=0.5
round_corners=10
background_alpha=0.5
background_color=241F31
width=10
heigth=10
font_size=14
text_color=FFFFFF
position=top-center
no_small_font
hud_no_margins
hud_compact
offset_y=5
pci_dev=0:12:00.0
table_columns=1
fps
gpu_text=GPU
gpu_stats
gpu_load_change
gpu_load_value=50,90
gpu_load_color=FFFFFF,FFAA7F,CC0000
throttling_status
gpu_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_load_change
cpu_load_value=50,90
cpu_load_color=FFFFFF,FFAA7F,CC0000
cpu_temp
cpu_color=2E97CB
swap
vram
vram_color=AD64C1
ram
ram_color=C26693
procmem
wine
wine_color=EB5B5B
fps_limit_method=late
fps_limit=0
fsr
hdr
refresh_rate
gamemode
custom_text=Arch Linux
exec=uname -r
#offset=0
vsync=0
gl_vsync=-1
time#
version
output_folder=/home/mpuchstein
log_duration=30
autostart_log=0
log_interval=100
toggle_fps_limit=Shift_L+F1
toggle_logging=Shift_L+F2
reload_cfg=Shift_R+F9
toggle_preset=Shift_R+F10
toggle_hud_position=Shift_R+F11
toggle_hud=Shift_R+F12

View File

@@ -0,0 +1,16 @@
[general]
import = [
"/home/mpuchstein/.config/alacritty/themes/themes/github_dark.toml"
]
live_config_reload = true
ipc_socket = true
[window]
opacity = 0.7
[font]
normal = { family = "Inconsolata Nerd Font Mono", style = "Regular" }
size = 9
[mouse]
hide_when_typing = true

View File

@@ -0,0 +1,11 @@
[Desktop Entry]
Name=Nextcloud
GenericName=File Synchronizer
Exec="/usr/bin/nextcloud" --background
Terminal=false
Icon=Nextcloud
Categories=Network
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true
X-GNOME-Autostart-Delay=10

View File

@@ -0,0 +1,15 @@
[Desktop Entry]
Icon=/opt/jetbrains-toolbox/toolbox.svg
Exec=/opt/jetbrains-toolbox/jetbrains-toolbox --minimize
Version=1.0
Type=Application
Categories=Development
Name=JetBrains Toolbox
StartupWMClass=jetbrains-toolbox
Terminal=false
MimeType=x-scheme-handler/jetbrains;
X-GNOME-Autostart-enabled=true
StartupNotify=false
X-GNOME-Autostart-Delay=10
X-MATE-Autostart-Delay=10
X-KDE-autostart-after=panel

View File

@@ -0,0 +1,18 @@
[Desktop Entry]
Name=Mumble
GenericName=Voice Chat
GenericName[de]=Sprachkonferenz
GenericName[fr]=Chat vocal
Comment=Open source, low-latency, high quality voice chat.
Comment[de]=Ein Open Source Sprachkonferenzprogramm mit niedriger Latenz und hoher Qualität
Comment[fr]=Un logiciel de chat vocal de haute qualité et de faible latence
Exec=mumble %u
Icon=mumble
Terminal=false
Type=Application
StartupNotify=false
StartupWMClass=mumble
MimeType=x-scheme-handler/mumble;
Categories=Network;Chat;Qt;
Keywords=VoIP;Messaging;Voice Chat;Secure Communication;
Version=1.0

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=Element
Comment=Feature-rich client for Matrix
Exec=/usr/bin/element-desktop --password-store="gnome-libsecret" %u
Terminal=false
Type=Application
Icon=io.element.Element
StartupWMClass=Element
Categories=Network;InstantMessaging;Chat;IRCClient
MimeType=x-scheme-handler/element;

View File

@@ -0,0 +1,4 @@
[Desktop Entry]
Exec=/usr/bin/jellyfin-mpv-shim
Name=jellyfin-mpv-shim
Type=Application

View File

@@ -0,0 +1,4 @@
[Desktop Entry]
Exec=/usr/bin/swayosd-server
Name=swayosd-server
Type=Application

View File

@@ -0,0 +1 @@
/usr/share/applications/steam.desktop

View File

@@ -0,0 +1,12 @@
[Desktop Entry]
Name=Vesktop
Exec=vesktop %U
Terminal=false
Type=Application
Icon=vesktop
StartupWMClass=vesktop
GenericName=Internet Messenger
Categories=Network;
Keywords=discord;vencord;electron;chat;
MimeType=x-scheme-handler/discord;
Comment=Vesktop is a custom Discord desktop app

View File

@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Waybar
Comment=Start Waybar on login
Exec=waybar
TryExec=waybar
Icon=waybar
Terminal=false

257
dot_config/btop/btop.conf Normal file
View File

@@ -0,0 +1,257 @@
#? Config file for btop v. 1.4.5
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
color_theme = "Default"
#* If the theme set background should be shown, set to False if you want terminal background transparency.
theme_background = True
#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false.
truecolor = True
#* Set to true to force tty mode regardless if a real tty has been detected or not.
#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols.
force_tty = False
#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets.
#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box.
#* Use whitespace " " as separator between different presets.
#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty"
presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty"
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
vim_keys = False
#* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = True
#* Default symbols to use for graph creation, "braille", "block" or "tty".
#* "braille" offers the highest resolution but might not be included in all fonts.
#* "block" has half the resolution of braille but uses more common characters.
#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY.
#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view.
graph_symbol = "braille"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_cpu = "default"
# Graph symbol to use for graphs in gpu box, "default", "braille", "block" or "tty".
graph_symbol_gpu = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_mem = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_net = "default"
# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty".
graph_symbol_proc = "default"
#* Manually set which boxes to show. Available values are "cpu mem net proc" and "gpu0" through "gpu5", separate values with whitespace.
shown_boxes = "cpu mem net proc"
#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs.
update_ms = 2000
#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct",
#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly.
proc_sorting = "cpu lazy"
#* Reverse sorting order, True or False.
proc_reversed = False
#* Show processes as a tree.
proc_tree = False
#* Use the cpu graph colors in the process list.
proc_colors = True
#* Use a darkening gradient in the process list.
proc_gradient = True
#* If process cpu usage should be of the core it's running on or usage of the total available cpu power.
proc_per_core = False
#* Show process memory as bytes instead of percent.
proc_mem_bytes = True
#* Show cpu graph for each process.
proc_cpu_graphs = True
#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate)
proc_info_smaps = False
#* Show proc box on left side of screen instead of right.
proc_left = False
#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop).
proc_filter_kernel = False
#* In tree-view, always accumulate child process resources in the parent process.
proc_aggregate = False
#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_upper = "Auto"
#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available.
#* Select from a list of detected attributes from the options menu.
cpu_graph_lower = "Auto"
#* If gpu info should be shown in the cpu box. Available values = "Auto", "On" and "Off".
show_gpu_info = "Auto"
#* Toggles if the lower CPU graph should be inverted.
cpu_invert_lower = True
#* Set to True to completely disable the lower CPU graph.
cpu_single_graph = False
#* Show cpu box at bottom of screen instead of top.
cpu_bottom = False
#* Shows the system uptime in the CPU box.
show_uptime = True
#* Shows the CPU package current power consumption in watts. Requires running `make setcap` or `make setuid` or running with sudo.
show_cpu_watts = True
#* Show cpu temperature.
check_temp = True
#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors.
cpu_sensor = "Auto"
#* Show temperatures for cpu cores also if check_temp is True and sensors has been found.
show_coretemp = True
#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core.
#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine.
#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries.
#* Example: "4:0 5:1 6:3"
cpu_core_map = ""
#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine".
temp_scale = "celsius"
#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024.
base_10_sizes = False
#* Show CPU frequency.
show_cpu_freq = True
#* Draw a clock at top of screen, formatting according to strftime, empty string to disable.
#* Special formatting: /host = hostname | /user = username | /uptime = system uptime
clock_format = "%X"
#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort.
background_update = True
#* Custom cpu model name, empty string to disable.
custom_cpu_name = ""
#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ".
#* Only disks matching the filter will be shown. Prepend exclude= to only show disks not matching the filter. Examples: disk_filter="/boot /home/user", disks_filter="exclude=/boot /home/user"
disks_filter = ""
#* Show graphs instead of meters for memory values.
mem_graphs = True
#* Show mem box below net box instead of above.
mem_below_net = False
#* Count ZFS ARC in cached and available memory.
zfs_arc_cached = True
#* If swap memory should be shown in memory box.
show_swap = True
#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk.
swap_disk = True
#* If mem box should be split to also show disks info.
show_disks = True
#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar.
only_physical = True
#* Read disks list from /etc/fstab. This also disables only_physical.
use_fstab = True
#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool)
zfs_hide_datasets = False
#* Set to true to show available disk space for privileged users.
disk_free_priv = False
#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view.
show_io_stat = True
#* Toggles io mode for disks, showing big graphs for disk read/write speeds.
io_mode = False
#* Set to True to show combined read/write io graphs in io mode.
io_graph_combined = False
#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ".
#* Example: "/mnt/media:100 /:20 /boot:1".
io_graph_speeds = ""
#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False.
net_download = 100
net_upload = 100
#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest.
net_auto = True
#* Sync the auto scaling for download and upload to whichever currently has the highest scale.
net_sync = True
#* Starts with the Network Interface specified here.
net_iface = ""
#* "True" shows bitrates in base 10 (Kbps, Mbps). "False" shows bitrates in binary sizes (Kibps, Mibps, etc.). "Auto" uses base_10_sizes.
base_10_bitrate = "Auto"
#* Show battery stats in top right if battery is present.
show_battery = True
#* Which battery to use if multiple are present. "Auto" for auto detection.
selected_battery = "Auto"
#* Show power stats of battery next to charge indicator.
show_battery_watts = True
#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG".
#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info.
log_level = "WARNING"
#* Measure PCIe throughput on NVIDIA cards, may impact performance on certain cards.
nvml_measure_pcie_speeds = True
#* Measure PCIe throughput on AMD cards, may impact performance on certain cards.
rsmi_measure_pcie_speeds = True
#* Horizontally mirror the GPU graph.
gpu_mirror_graph = True
#* Custom gpu0 model name, empty string to disable.
custom_gpu_name0 = ""
#* Custom gpu1 model name, empty string to disable.
custom_gpu_name1 = ""
#* Custom gpu2 model name, empty string to disable.
custom_gpu_name2 = ""
#* Custom gpu3 model name, empty string to disable.
custom_gpu_name3 = ""
#* Custom gpu4 model name, empty string to disable.
custom_gpu_name4 = ""
#* Custom gpu5 model name, empty string to disable.
custom_gpu_name5 = ""

View File

@@ -0,0 +1,119 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="#191724"
# Base
# Main text color
theme[main_fg]="#e0def4"
# Text
# Title color for boxes
theme[title]="#908caa"
# Subtle
# Highlight color for keyboard shortcuts
theme[hi_fg]="#e0def4"
# Text
# Background color of selected item in processes box
theme[selected_bg]="#524f67"
# HL High
# Foreground color of selected item in processes box
theme[selected_fg]="#f6c177"
# Gold
# Color of inactive/disabled text
theme[inactive_fg]="#403d52"
# HL Med
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="#9ccfd8"
# Foam
# Background color of the percentage meters
theme[meter_bg]="#9ccfd8"
# Foam
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="#c4a7e7"
# Iris
# Cpu box outline color
theme[cpu_box]="#ebbcba"
# Rose
# Memory/disks box outline color
theme[mem_box]="#31748f"
# Pine
# Net up/down box outline color
theme[net_box]="#c4a7e7"
# Iris
# Processes box outline color
theme[proc_box]="#eb6f92"
# Love
# Box divider line and small boxes line color
theme[div_line]="#6e6a86"
# Muted
# Temperature graph colors
theme[temp_start]="#ebbcba"
# Rose
theme[temp_mid]="#f6c177"
# Gold
theme[temp_end]="#eb6f92"
# Love
# CPU graph colors
theme[cpu_start]="#f6c177"
# Gold
theme[cpu_mid]="#ebbcba"
# Rose
theme[cpu_end]="#eb6f92"
# Love
# Mem/Disk free meter
# all love
theme[free_start]="#eb6f92"
theme[free_mid]="#eb6f92"
theme[free_end]="#eb6f92"
# Mem/Disk cached meter
# all iris
theme[cached_start]="#c4a7e7"
theme[cached_mid]="#c4a7e7"
theme[cached_end]="#c4a7e7"
# Mem/Disk available meter
# all pine
theme[available_start]="#31748f"
theme[available_mid]="#31748f"
theme[available_end]="#31748f"
# Mem/Disk used meter
# all rose
theme[used_start]="#ebbcba"
theme[used_mid]="#ebbcba"
theme[used_end]="#ebbcba"
# Download graph colors
# Pine for start, foam for the rest
theme[download_start]="#31748f"
theme[download_mid]="#9ccfd8"
theme[download_end]="#9ccfd8"
# Upload graph colors
theme[upload_start]="#ebbcba"
# Rose for start
theme[upload_mid]="#eb6f92"
# Love for mid and end
theme[upload_end]="#eb6f92"
# Process box color gradient for threads, mem and cpu usage
theme[process_start]="#31748f"
# Pine
theme[process_mid]="#9ccfd8"
# Foam for mid and end
theme[process_end]="#9ccfd8"

View File

@@ -0,0 +1,132 @@
# output=<not set>
# font=monospace
# dpi-aware=auto
# use-bold=no
# prompt="> "
# placeholder=
# icon-theme=default
# icons-enabled=yes
# hide-before-typing=no
# fields=filename,name,generic
# password-character=*
# filter-desktop=no
# match-mode=fzf
# sort-result=yes
# match-counter=no
# delayed-filter-ms=300
# delayed-filter-limit=20000
# show-actions=no
# terminal=$TERMINAL -e # Note: you cannot actually use environment variables here
# launch-prefix=<not set>
# list-executables-in-path=no
# anchor=center
# x-margin=0
# y-margin=0
# lines=15
# minimal-lines=no
# width=30
# tabs=8
# horizontal-pad=40
# vertical-pad=8
# inner-pad=0
lines=10
width=40
horizontal-pad=50
vertical-pad=20
inner-pad=20
# scaling-filter=box
# image-size-ratio=0.5
# gamma-correct-blending=no
# line-height=<use font metrics>
# letter-spacing=0
# layer=overlay
# keyboard-focus=exclusive
# exit-on-keyboard-focus-loss=yes
# cache=<not set>
# render-workers=<number of logical CPUs>
# match-workers=<number of logical CPUs>
# enable-mouse=yes
include=~/.config/fuzzel/themes/rose-pine.ini
#[colors]
# background=fdf6e3ff
# text=657b83ff
# prompt=586e75ff
# placeholder=93a1a1ff
# input=657b83ff
# match=cb4b16ff
# selection=eee8d5ff
# selection-text=586e75ff
# selection-match=cb4b16ff
# counter=93a1a1ff
# border=002b36ff
[border]
width=2
radius=20
# width=1
# radius=10
[dmenu]
# mode=text # text|index
# exit-immediately-if-empty=no
[key-bindings]
# cancel=Escape Control+g Control+c Control+bracketleft
# execute=Return KP_Enter Control+y
# execute-or-next=Tab
# execute-input=Shift+Return Shift+KP_Enter
# cursor-left=Left Control+b
# cursor-left-word=Control+Left Mod1+b
# cursor-right=Right Control+f
# cursor-right-word=Control+Right Mod1+f
# cursor-home=Home Control+a
# cursor-end=End Control+e
# delete-line=Control+Shift+BackSpace
# delete-prev=BackSpace Control+h
# delete-prev-word=Mod1+BackSpace Control+BackSpace Control+w
# delete-line-backward=Control+u
# delete-next=Delete KP_Delete Control+d
# delete-next-word=Mod1+d Control+Delete Control+KP_Delete
# delete-line-forward=Control+k
# prev=Up Control+p
# prev-with-wrap=ISO_Left_Tab
# prev-page=Page_Up KP_Page_Up
# next=Down Control+n
# next-with-wrap=none
# next-page=Page_Down KP_Page_Down
# expunge=Shift+Delete
# clipboard-paste=Control+v XF86Paste
# primary-paste=Shift+Insert Shift+KP_Insert
# custom-N: *dmenu mode only*. Like execute, but with a non-zero
# exit-code; custom-1 exits with code 10, custom-2 with 11, custom-3
# with 12, and so on.
# custom-1=Mod1+1
# custom-2=Mod1+2
# custom-3=Mod1+3
# custom-4=Mod1+4
# custom-5=Mod1+5
# custom-6=Mod1+6
# custom-7=Mod1+7
# custom-8=Mod1+8
# custom-9=Mod1+9
# custom-10=Mod1+0
# custom-11=Mod1+exclam
# custom-12=Mod1+at
# custom-13=Mod1+numbersign
# custom-14=Mod1+dollar
# custom-15=Mod1+percent
# custom-16=Mod1+dead_circumflex
# custom-17=Mod1+ampersand
# custom-18=Mod1+asterix
# custom-19=Mod1+parentleft

View File

@@ -0,0 +1,12 @@
[colors]
background=#191724ff
text=#e0def4ff
prompt=#e0def4ff
placeholder=#6e6a86ff
input=#e0def4ff
match=#ebbcbaff
selection=#403d52ff
selection-text=#e0def4ff
selection-match=#ebbcbaff
counter=#f6c177ff
border=#ebbcbaff

View File

@@ -0,0 +1,11 @@
[Filechooser Settings]
LocationMode=path-bar
ShowHidden=false
ShowSizeColumn=true
GeometryX=0
GeometryY=0
GeometryWidth=657
GeometryHeight=492
SortColumn=name
SortOrder=ascending
StartupMode=recent

View File

@@ -0,0 +1,2 @@
/* Remove dotted lines from GTK 3 applications */
.undershoot.top, .undershoot.right, .undershoot.bottom, .undershoot.left { background-image: none; }

View File

@@ -0,0 +1,17 @@
[Settings]
gtk-theme-name=Adwaita
gtk-icon-theme-name=Adwaita
gtk-font-name=InconsolataGo Nerd Font Mono 11
gtk-cursor-theme-name=volantes
gtk-cursor-theme-size=24
gtk-toolbar-style=GTK_TOOLBAR_ICONS
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
gtk-button-images=0
gtk-menu-images=0
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=1
gtk-xft-hinting=1
gtk-xft-hintstyle=hintslight
gtk-xft-rgba=rgb
gtk-application-prefer-dark-theme=1

View File

@@ -0,0 +1,7 @@
[Settings]
gtk-theme-name=Adwaita
gtk-icon-theme-name=Adwaita
gtk-font-name=InconsolataGo Nerd Font Mono 11
gtk-cursor-theme-name=volantes
gtk-cursor-theme-size=24
gtk-application-prefer-dark-theme=1

View File

@@ -0,0 +1,39 @@
### based on the example config from hyprland.org
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
ignore_dbus_inhibit = false # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam)
ignore_systemd_inhibit = false # whether to ignore systemd-inhibit --what=idle inhibitors
}
#listener {
# timeout = 150 # 2.5min.
# on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
# on-resume = brightnessctl -r # monitor backlight restore.
#}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
#listener {
# timeout = 150 # 2.5min.
# on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
# on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
#}
listener {
timeout = 300 # 5min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
}
listener {
timeout = 600 # 10min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 1200 # 20min
on-timeout = systemctl suspend # suspend pc
}

View File

@@ -0,0 +1,33 @@
###############
### THEME ###
###############
source = ~/.config/hypr/hyprland.d/00-theme.conf
################
### MONITORS ###
################
source = ~/.config/hypr/hyprland.d/10-monitors.conf
source = ~/.config/hypr/hyprland.d/20-workspaces.conf
############################
### LAYOUT AND BEHAVIOR ###
############################
source = ~/.config/hypr/hyprland.d/30-general.conf
source = ~/.config/hypr/hyprland.d/40-input.conf
source = ~/.config/hypr/hyprland.d/50-layout.conf
source = ~/.config/hypr/hyprland.d/60-rules.conf
###################
### KEYBINDINGS ###
###################
source = ~/.config/hypr/hyprland.d/70-keybinds.conf
#################
### AUTOSTART ###
#################
source = ~/.config/hypr/hyprland.d/80-autostart.conf

View File

@@ -0,0 +1 @@
source = ~/.config/hypr/hyprland.d/rose-pine.conf

View File

@@ -0,0 +1,14 @@
{{- range .monitors }}
monitorv2 {
output = {{ .name }}
mode = {{ .width }}x{{ .height }}@{{ .refresh_rate }}
position = {{ .position }}
scale = {{ .scale }}
{{- if index . "vrr" }}
vrr = {{ .vrr }}
{{- end }}
}
{{- end }}
{{- if not .monitors }}
monitor = , preferred, auto, 1
{{- end }}

View File

@@ -0,0 +1,5 @@
{{- range $monitor := .monitors }}
{{- range $index, $ws := .workspaces }}
workspace = {{ $ws }}, monitor:{{ $monitor.name }}{{ if eq $index 0 }}, default:true{{ end }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,101 @@
# Refer to https://wiki.hyprland.org/Configuring/Variables/
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 5
gaps_out = 5,5,5,5
border_size = 2
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
col.active_border = $border_active
col.inactive_border = $border_inactive
col.nogroup_border = $border_nogroup_inactive
col.nogroup_border_active = $border_nogroup_active
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = master
}
render {
new_render_scheduling = true
}
cursor {
hide_on_key_press = true # Hide cursor when typing
persistent_warps = true # Cursor returns to last position in window
warp_on_change_workspace = true # Move cursor to focused window on workspace switch
inactive_timeout = 0
zoom_factor = 1.0
zoom_rigid = false
enable_hyprcursor = true
sync_gsettings_theme = true
}
# https://wiki.hyprland.org/Configuring/Variables/#decoration
decoration {
rounding = 5
# Change transparency of focused and unfocused windows
active_opacity = 1.0
inactive_opacity = 1.0
# Dim inactive windows
dim_modal = true
dim_inactive = true
dim_strength = 0.1
shadow {
enabled = false
range = 4
render_power = 3
color = $dec_shadow
}
# https://wiki.hyprland.org/Configuring/Variables/#blur
blur {
enabled = true
size = 3
passes = 1
vibrancy = 0.1696
}
}
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations {
enabled = yes, please :)
# Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
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.0
bezier = quick,0.15,0,0.1,1
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 = specialWorkspace, 1, 1.5, easeOutQuint, slidevert
}

View File

@@ -0,0 +1,34 @@
{{- $tags := .chezmoi.config.data.tags -}}
# https://wiki.hyprland.org/Configuring/Variables/#input
input {
kb_layout = ultimatekeys
kb_options = caps:escape_shifted_capslock
numlock_by_default = true
repeat_rate = 25
repeat_delay = 600
follow_mouse = 1
mouse_refocus = true
float_switch_override_focus = 2
special_fallthrough = true
touchpad {
disable_while_typing = true
scroll_factor = 1.0
tap-to-click = true
}
}
{{- if (index $tags "desktop") }}
device {
name = "Logitech Gaming Mouse G502"
sensitivity = 0.0
accel_profile = flat
}
{{- end }}
# Example per-device config
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
#device {
# name = epic-mouse-v1
# sensitivity = -0.5
#}

View File

@@ -0,0 +1,35 @@
# See https://wiki.hyprland.org/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
smart_split = true
}
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
master {
orientation = left
# center_master_fallback = left
# slave_count_for_center_master = 4
mfact = 0.60
new_status = slave
new_on_top = true
new_on_active = after
inherit_fullscreen = true
allow_small_split = false
special_scale_factor = 0.8
drop_at_cursor = true
}
# https://wiki.hyprland.org/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. :(
vrr = 2
vfr = true
mouse_move_enables_dpms = true
key_press_enables_dpms = true
layers_hog_keyboard_focus = true
mouse_move_focuses_monitor = true
col.splash = $splash_text
}

View File

@@ -0,0 +1,123 @@
# Ref https://wiki.hyprland.org/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
# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1]
# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1]
# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1]
# windowrulev2 = rounding 0, floating:0, onworkspace:f[1]
##############
### GROUPS ###
##############
group {
auto_group = true
insert_after_current = true
focus_removed_window = true
drag_into_group = 1
merge_groups_on_drag = true
merge_groups_on_groupbar = true
merge_floated_into_tiled_on_groupbar = true
group_on_movetoworkspace = false
col.border_active = $border_group_active
col.border_inactive = $border_group_inactive
col.border_locked_active = $border_grouplocked_active
col.border_locked_inactive = $border_grouplocked_active
groupbar{
enabled = true
height = 12
font_family = InconsolataGo Nerd Font Mono
font_size = 8
font_weight_active = semibold
font_weight_inactive = normal
stacked = false
gradients = true
gradient_rounding = 5
indicator_height = 0
rounding = 0
gradient_round_only_edges = true
text_color = $groupbar_text
col.active = $groupbar_active
col.inactive = $groupbar_inactive
col.locked_active = $groupbar_grouplocked_active
col.locked_inactive = $groupbar_grouplocked_inactive
gaps_out = 0
gaps_in = 0
render_titles = true
scrolling = true
priority = 3
}
}
##############################
### WINDOWS AND WORKSPACES ###
##############################
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
# Example windowrule v1
# windowrule = float, ^(kitty)$
# Example windowrule v2
# windowrulev2 = 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
windowrule = noinitialfocus,xwayland:1
## ========== Special Workspaces ==========
workspace = special:keepass, on-created-empty:keepassxc
#windowrule = float, class:org.keepassxc.KeePassXC
#windowrule = noscreenshare, class:org.keepassxc.KeePassXC
#windowrule = size 60% 60%, class:org.keepassxc.KeePassXC
#windowrule = center, class:org.keepassxc.KeePassXC
## ========== Communication ==========
# Mumble & Discord & TeamSpeak
windowrule = workspace 2, class:^(info\.mumble\.Mumble|discord|TeamSpeak|vesktop)$
# Signal & Element
windowrule = workspace 1, class:^(signal|Element)$
## ========== Multimedia ==========
windowrule = workspace 10, class:Spotify
### ========== Development ==========
#windowrulev2 = float, class:jetbrains-webstorm, title:Welcome to WebStorm
#windowrulev2 = size 1080 720, class:jetbrains-webstorm, title:Welcome to WebStorm
## ========== Gaming ==========
# Steam & Battle.net & Lutris
windowrule = workspace 3, class:^(steam|battle\.net\.exe|net\.lutris\.Lutris)$
## ========== System ==========
windowrule = float, class:com.saivert.pwvucontrol
windowrule = float, class:scrrec
windowrule = pin, class:scrrec
windowrule = idleinhibit always, class:scrrec
windowrule = rounding 10, class:scrrec
windowrule = opacity 0.6, class:scrrec
windowrule = noborder, class:scrrec
windowrule = size 300 100, class:scrrec
windowrule = move 1% 1%, class:scrrec
windowrule = monitor 0, class:scrrec
windowrule = noinitialfocus, class:scrrec
windowrule = float, class:com.gabm.satty
windowrule = size >700 >400, class:com.gabm.satty
# Blur swaync
#layerrule = blur, swaync-control-center
#layerrule = blur, swaync-notification-window
#layerrule = ignorezero, swaync-control-center
#layerrule = ignorezero, swaync-notification-window
#layerrule = ignorealpha, swaync-control-center
#layerrule = ignorealpha, swaync-notification-window

View File

@@ -0,0 +1,184 @@
##############################################
################## MY APPS ###################
##############################################
# Set programs that you use
$terminal = uwsm app -T
$terminal_backup = uwsm app -- kitty
$term_tmux = uwsm app -- kitty tmux
$term_tmux_append = uwsm app -- kitty tmux a
$filemanager = uwsm app -- nautilus
$launcher = uwsm app -- sherlock
$powermenu = uwsm app -- sherlock -sm pm
$clipman = uwsm app -- sherlock-clp | sherlock | cliphist decode | wl-copy
$browser = uwsm app -- firefox
$browserprv = uwsm app -- firefox --private-window
$altbrowser = uwsm app -- chromium
$editor = uwsm app -T -- nvim
$alteditor = uwsm app -- zeditor
$taskman = uwsm app -- uuctl wofi
$pwdmgr = uwsm app -- keepassxc
$notcenter = uwsm app -- swaync-client -t -sw
$notdnd = uwsm app -- swaync-client -d
$nothide = uwsm app -- swaync-client --hide-latest
$notclose = uwsm app -- swaync-client --close-latest
$notcloseall = uwsm app -- swaync-client --close-all
$soundctl = uwsm app -- pwvucontrol
$lockcmd = loginctl lock-session
##############################################
################## KEYBINDS ##################
##############################################
$mainMod = SUPER
bind = $mainMod, E, exec, $filemanager
bind = $mainMod, W, exec, $browser
bind = $mainMod SHIFT, W, exec, $browserprv
bind = $mainMod CTRL, W, exec, $altbrowser
bind = $mainMod Shift, E, exec, $editor
bind = $mainMod CTRL, E, exec, $alteditor
bind = $mainMod, X, exec, $launcher
bind = $mainMod, B, exec, $powermenu
bind = $mainMod, C, exec, $clipman
bind = $mainMod, Return, exec, $terminal_backup
bind = $mainMod SHIFT, Return, exec, $term_tmux
bind = $mainMod ALT_L, Return, exec, $term_tmux_append
bind = $mainMod CTRL, Return, exec, $terminal
bind = $mainMod, Escape, exec, $taskman
bind = $mainMod, R, exec, $pwdmgr
bind = $mainMod, F4, exec, $soundctl
bind = $mainMod, Grave, exec, $notcenter
bind = $mainMod SHIFT, Grave, exec, $notdnd
bind = $mainMod, A, exec, $nothide
bind = $mainMod SHIFT, A, exec, $notclose
bind = $mainMod CTRL, A, exec, $notcloseall
bind = $mainMod SHIFT, Pause, exec, uwsm stop
bind = $mainMod, Pause, exec, $lockcmd
bind = $mainMod SHIFT, Escape, exec, $lockcmd
bind = $mainMod, I, pin
bind = $mainMod, Q, killactive,
bind = $mainMod, Space, togglefloating,
bind = $mainMod SHIFT, F, fullscreen
bind = $mainMod SHIFT, S, movetoworkspace, special # move to the special workspace
bind = $mainMod, S, togglespecialworkspace # show/hide special workspace
#dwindle layout
bind = $mainMod, Tab, swapsplit,
bind = $mainMod SHIFT, Tab, togglesplit,
bind = $mainMod CTRL, Tab, layoutmsg, movetoroot
bind = $mainMod, P, pseudo,
#master layout
bind = $mainMod, Tab, layoutmsg, swapwithmaster
bind = $mainMod SHIFT, Tab, layoutmsg, addmaster
bind = $mainMod CTRL, Tab, layoutmsg, removemaster
bind = $mainMod CTRL SHIFT, Tab, layoutmsg, rollnext
# MOVE FOCUS with mainMod + vim keys
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d
# MOVE WINDOW with mainMod SHIFT + vim keys
bind = $mainMod SHIFT, H, movewindow, l
bind = $mainMod SHIFT, L, movewindow, r
bind = $mainMod SHIFT, K, movewindow, u
bind = $mainMod SHIFT, J, movewindow, d
# Resize window with mainMod + CTRL + vim keys
bind = $mainMod CTRL, h, resizeactive,-25 0
bind = $mainMod CTRL, l, resizeactive,25 0
bind = $mainMod CTRL, k, resizeactive,0 -25
bind = $mainMod CTRL, j, resizeactive,0 25
# Special workspaces
bind = $mainMod, N, togglespecialworkspace, keepass
# 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
# MOVE ACTIVE WINDOW TO A WORKSPACE with mainMod + SHIFT + [0-9]
bind = $mainMod CTRL SHIFT, 1, movetoworkspacesilent, 1
bind = $mainMod CTRL SHIFT, 2, movetoworkspacesilent, 2
bind = $mainMod CTRL SHIFT, 3, movetoworkspacesilent, 3
bind = $mainMod CTRL SHIFT, 4, movetoworkspacesilent, 4
bind = $mainMod CTRL SHIFT, 5, movetoworkspacesilent, 5
bind = $mainMod CTRL SHIFT, 6, movetoworkspacesilent, 6
bind = $mainMod CTRL SHIFT, 7, movetoworkspacesilent, 7
bind = $mainMod CTRL SHIFT, 8, movetoworkspacesilent, 8
bind = $mainMod CTRL SHIFT, 9, movetoworkspacesilent, 9
bind = $mainMod CTRL SHIFT, 0, movetoworkspacesilent, 10
bind = $mainMod, Z, changegroupactive, f
bind = $mainMod SHIFT, Z, changegroupactive, b
bind = $mainMod CTRL, Z, togglegroup
bind = $mainMod ALT_L, H, movewindoworgroup, l
bind = $mainMod ALT_L, J, movewindoworgroup, d
bind = $mainMod ALT_L, K, movewindoworgroup, u
bind = $mainMod ALT_L, L, movewindoworgroup, r
# MOVE/RESIZE WINDOWS with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Brightness controls
bindel = ,XF86MonBrightnessUp, exec, swayosd-client --brightness +5
bindel = ,XF86MonBrightnessDown, exec, swayosd-client --brightness -5
# Output volume control
bindel = ,XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise --max-volume 150
bindel = ,XF86AudioLowerVolume, exec, swayosd-client --output-volume lower --max-volume 150
bindel = ,XF86AudioMute, exec, swayosd-client --output-volume mute-toggle
# Input volume control
bindel = SHIFT ,XF86AudioRaiseVolume, exec, swayosd-client --input-volume raise --max-volume 150
bindel = SHIFT ,XF86AudioLowerVolume, exec, swayosd-client --input-volume lower --max-volume 150
bindel = SHIFT ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle
# Zoom control
bind = $mainMod, M, exec, hyprctl keyword cursor:zoom_factor 2
bind = $mainMod SHIFT, M, exec, hyprctl keyword cursor:zoom_factor 1
# Requires playerctl
bindl = , XF86AudioNext, exec, swayosd-client --playerctl next
bindl = , XF86AudioPause, exec, swayosd-client --playerctl play-pause
bindl = , XF86AudioPlay, exec, swayosd-client --playerctl play-pause
bindl = , XF86AudioPrev, exec, swayosd-client --playerctl previous
# Screenshot and recording controls
bind = , Print, exec, grimblast --notify copy output
bind = CTRL, Print, exec, grimblast --notify edit output
bind = $mainMod, Print, exec, grimblast --notify edit area
bind = ALT_L, Print, exec, grimblast --notify copy screen
bind = ALT_L SHIFT, Print, exec, grimblast --notify edit screen
bind = SHIFT, Print, exec, uwsm app -- kitty --app-id=scrrec wf-recorder -f ~/Videos/scrrec.mkv -y -g "$(slurp)"

View File

@@ -0,0 +1,6 @@
# AUTOSTART
# most apps are either started as systemd service like either directly like hyprpolkitagent or indirectly via uwsm
# and ~/.config/autostart
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
exec-once = wl-clip-persist --clipboard regular

View File

@@ -0,0 +1,97 @@
#######################################
### CATTPUCCIN MOCHA HYPRLAND THEME ###
#######################################
$rosewater = rgb(f5e0dc)
$rosewaterAlpha = f5e0dc
$flamingo = rgb(f2cdcd)
$flamingoAlpha = f2cdcd
$pink = rgb(f5c2e7)
$pinkAlpha = f5c2e7
$mauve = rgb(cba6f7)
$mauveAlpha = cba6f7
$red = rgb(f38ba8)
$redAlpha = f38ba8
$maroon = rgb(eba0ac)
$maroonAlpha = eba0ac
$peach = rgb(fab387)
$peachAlpha = fab387
$yellow = rgb(f9e2af)
$yellowAlpha = f9e2af
$green = rgb(a6e3a1)
$greenAlpha = a6e3a1
$teal = rgb(94e2d5)
$tealAlpha = 94e2d5
$sky = rgb(89dceb)
$skyAlpha = 89dceb
$sapphire = rgb(74c7ec)
$sapphireAlpha = 74c7ec
$blue = rgb(89b4fa)
$blueAlpha = 89b4fa
$lavender = rgb(b4befe)
$lavenderAlpha = b4befe
$text = rgb(cdd6f4)
$textAlpha = cdd6f4
$subtext1 = rgb(bac2de)
$subtext1Alpha = bac2de
$subtext0 = rgb(a6adc8)
$subtext0Alpha = a6adc8
$overlay2 = rgb(9399b2)
$overlay2Alpha = 9399b2
$overlay1 = rgb(7f849c)
$overlay1Alpha = 7f849c
$overlay0 = rgb(6c7086)
$overlay0Alpha = 6c7086
$surface2 = rgb(585b70)
$surface2Alpha = 585b70
$surface1 = rgb(45475a)
$surface1Alpha = 45475a
$surface0 = rgb(313244)
$surface0Alpha = 313244
$base = rgb(1e1e2e)
$baseAlpha = 1e1e2e
$mantle = rgb(181825)
$mantleAlpha = 181825
$crust = rgb(11111b)
$crustAlpha = 11111b
$splash_text = rgba($textAlphaee)
$dec_shadow = rgba($surface0Alpha88)
$border_active = rgba($pinkAlphaff) rgba($mauveAlphaff) 45deg
$border_inactive = rgba($redAlphabb) rgba($mauveAlphabb) 45deg
$border_nogroup_active = rgba($tealAlphaff) rgba($yellowAlphaff) 45deg
$border_nogroup_inactive = rgba($tealAlphaaa) rgba($yellowAlphaff) 45deg
$border_group_active = rgba($sapphireAlphaff) rgba($lavenderAlphaff) 45deg
$border_group_inactive = rgba($blueAlphadd) rgba($peachAlphadd) 45deg
$border_grouplocked_active = rgba($maroonAlphaff) rgba(f7767eff) 45deg
$border_grouplocked_inactive = rgba(ff007caa) rgba(f7767eff) 45deg
$groupbar_text = rgba($baseAlphaff)
$groupbar_active = rgba($sapphireAlphaff) rgba($lavenderAlphaaa)
$groupbar_inactive = rgba($blueAlphaee) rgba($lavenderAlphaaa)
$groupbar_grouplocked_active = rgba($tealAlphaff) rgba($greenAlphaff)
$groupbar_grouplocked_inactive = rgba($tealAlphaaa) rgba($greenAlphaaa)

View File

@@ -0,0 +1,18 @@
##################################
### TOKYO NIGHT HYPRLAND THEME ###
##################################
$splash_text = rgba(ffffffff)
$dec_shadow = rgba(1a1a1aee)
$border_active = rgba(33ccffee) rgba(00ff99ee) 45deg
$border_inactive = rgba(595959aa)
$border_nogroup_active =
$border_nogroup_inactive =
$border_group_active = 0x66ffff00
$border_group_inactive = 0x66777700
$border_grouplocked_active = 0x66ff5500
$border_grouplocked_inactive = 0x66ff5500
$groupbar_text = 0xffffffff
$groupbar_active = 0x66ffff00
$groupbar_inactive = 0x66777700
$groupbar_grouplocked_active = 0x66ff5500
$groupbar_grouplocked_inactive = 0x66775500

View File

@@ -0,0 +1,72 @@
#####################################
### ROSÉ PINE HYPRLAND THEME ###
#####################################
# Base colors
$base = rgb(191724)
$baseAlpha = 191724
$surface = rgb(1f1d2e)
$surfaceAlpha = 1f1d2e
$overlay = rgb(26233a)
$overlayAlpha = 26233a
$muted = rgb(6e6a86)
$mutedAlpha = 6e6a86
$subtle = rgb(908caa)
$subtleAlpha = 908caa
$text = rgb(e0def4)
$textAlpha = e0def4
# Accent colors
$love = rgb(eb6f92)
$loveAlpha = eb6f92
$gold = rgb(f6c177)
$goldAlpha = f6c177
$rose = rgb(ebbcba)
$roseAlpha = ebbcba
$pine = rgb(31748f)
$pineAlpha = 31748f
$foam = rgb(9ccfd8)
$foamAlpha = 9ccfd8
$iris = rgb(c4a7e7)
$irisAlpha = c4a7e7
# Highlight variants
$highlight_low = rgb(21202e)
$highlight_lowAlpha = 21202e
$highlight_med = rgb(403d52)
$highlight_medAlpha = 403d52
$highlight_high = rgb(524f67)
$highlight_highAlpha = 524f67
# Theme-specific definitions
$splash_text = rgba($textAlphaee)
$dec_shadow = rgba($overlayAlpha88)
# Border configurations
$border_active = rgba($roseAlphaff) rgba($irisAlphaff) 45deg
$border_inactive = rgba($mutedAlphabb) rgba($subtleAlphabb) 45deg
$border_nogroup_active = rgba($pineAlphaff) rgba($foamAlphaff) 45deg
$border_nogroup_inactive = rgba($pineAlphaaa) rgba($foamAlphaaa) 45deg
$border_group_active = rgba($irisAlphaff) rgba($loveAlphaff) 45deg
$border_group_inactive = rgba($mutedAlphadd) rgba($subtleAlphadd) 45deg
$border_grouplocked_active = rgba($goldAlphaff) rgba($roseAlphaff) 45deg
$border_grouplocked_inactive = rgba($goldAlphaaa) rgba($roseAlphaaa) 45deg
# Group bar configurations
$groupbar_text = rgba($baseAlphaff)
$groupbar_active = rgba($roseAlphaff) rgba($irisAlphaaa)
$groupbar_inactive = rgba($mutedAlphaee) rgba($subtleAlphaaa)
$groupbar_grouplocked_active = rgba($goldAlphaff) rgba($loveAlphaff)
$groupbar_grouplocked_inactive = rgba($goldAlphaaa) rgba($loveAlphaaa)

View File

@@ -0,0 +1,18 @@
##################################
### TOKYO NIGHT HYPRLAND THEME ###
##################################
$splash_text = rgba(a9b1d6ee)
$dec_shadow = rgba(737aa2ee)
$border_active = rgba(9ece6aff) rgba(7aa2f7ff) 45deg
$border_inactive = rgba(9d7cd8aa) rgba(7aa2f7ff) 45deg
$border_nogroup_active = rgba(7aa2f7ff) rgba(89ddffff) 45deg
$border_nogroup_inactive = rgba(7aa2f7aa) rgba(89ddffaa) 45deg
$border_group_active = rgba(ff9e64ff) rgba(ff0e64ff) 45deg
$border_group_inactive = rgba(ff9e64aa) rgba(ff0e64aa) 45deg
$border_grouplocked_active = rgba(ff007cff) rgba(f7767eff) 45deg
$border_grouplocked_inactive = rgba(ff007caa) rgba(f7767eff) 45deg
$groupbar_text = rgba(1f2335ff)
$groupbar_active = rgba(ff9e64ee) rgba(ff9e6499)
$groupbar_inactive = rgba(ff9e64bb) rgba(ff9e6499)
$groupbar_grouplocked_active = rgba(ff007cee) rgba(ff007c99)
$groupbar_grouplocked_inactive = rgba(ff007cbb) rgba(ff007c99)

View File

@@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2022, vaxerski
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,39 @@
# Hyprland Wiki
Welcome to the Hyprland Wiki! Here we store the wiki pages. They are automatically updated on the
website whenever a change occurs, within a reasonable timeframe (usually 12 minutes).
You can find the site at [https://wiki.hypr.land/](https://wiki.hypr.land/)
## Contributing to the Wiki
Feel free to open an issue or a PR if you feel anything is necessary.
Make sure to clearly state the reason for the changes.
Commits should have the form:
`Dir/Page: summary of changes`
Optionally, you can include a longer commit message 2 lines below the commit
title.
This format makes it easier to glance over the commit list and figure out what
each commit is about.
Additionally, if you make many changes in your PR, it is best to squash them
into self-contained commits that contain one logical change.
For info about how to squash commits, see [this](https://stackoverflow.com/a/5189600).
## Local development
To see your local changes, make sure to have `go` and `hugo` installed. Then, run
```sh
$ hugo serve
```
and open `http://localhost:1313` to see the locally-rendered wiki.
## License
This repository is licensed under the [BSD 3-Clause License](./LICENSE).

View File

@@ -0,0 +1,8 @@
:root {
--primary-hue: 186deg;
--primary-saturation: 100%;
}
.outdated span {
color: #df1500;
}

View File

@@ -0,0 +1,118 @@
baseURL = "https://wiki.hypr.land/"
title = "Hyprland Wiki"
enableRobotsTXT = true
enableGitInfo = true
defaultContentLanguage = "en"
enableInlineShortcodes = true
languageCode = 'en-us'
pluralizeListTitles = false
disablePathToLower = true
[outputs]
home = ["HTML"]
page = ["HTML"]
section = ["HTML", "RSS"]
[module.imports]
path = "github.com/imfing/hextra"
[markup.goldmark.renderer]
unsafe = true
[markup.goldmark.renderHooks.link]
useEmbedded = "fallback"
[markup.highlight]
noClasses = false
[[menu.main]]
identifier = "version"
name = "Latest git"
url = "https://wiki.hypr.land/version-selector/"
weight = 1
[[menu.main.params]]
type = "version"
outdated = false # set for any version that isn't the current one
version = "" # only change when setting the version, otherwise it is "Latest git" by default
[[menu.main]]
identifier = "Home"
name = "Home"
url = "https://hypr.land/"
weight = 2
[[menu.main]]
identifier = "showcase"
name = "Showcase"
url = "https://hypr.land/hall_of_fame"
weight = 3
[[menu.main]]
identifier = "News"
name = "News"
url = "https://hypr.land/news"
weight = 4
[[menu.main]]
name = "Search"
weight = 5
[menu.main.params]
type = "search"
#[[menu.main]]
#name = "Discord"
#weight = 6
#url = "https://discord.gg/hyprland-cathedral-961691461554950145"
#[menu.main.params]
#icon = "discord"
[[menu.main]]
name = "GitHub"
weight = 7
url = "https://github.com/hyprwm/Hyprland"
[menu.main.params]
icon = "github"
[params]
description = "The documentation for Hyprland."
displayUpdatedDate = true
dateFormat = "January 2, 2006"
[params.navbar]
displayTitle = true
displayLogo = true
width = "full"
[params.navbar.logo]
path = "favicon.svg"
dark = "favicon-dark.svg"
[params.page]
width = "full"
[params.theme]
default = "dark"
displayToggle = true
[params.footer]
enable = false
displayCopyright = true
displayPoweredBy = true
width = "normal"
[params.search]
enable = true
type = "flexsearch"
[params.search.flexsearch]
index = "content"
[params.editURL]
enable = true
base = "https://github.com/hyprwm/hyprland-wiki/edit/main/content/"
[params.blog.list]
displayTags = true
[params.comments]
enable = false

View File

@@ -0,0 +1,115 @@
---
weight: 9
title: Animations
---
## General
Animations are declared with the `animation` keyword.
```ini
animation = NAME, ONOFF, SPEED, CURVE [,STYLE]
```
`ONOFF` use `0` to disable, `1` to enable. _Note:_ if it's `0`, you
can omit further args.
`SPEED` is the amount of ds (1ds = 100ms) the animation will take.
`CURVE` is the bezier curve name, see [curves](#curves).
`STYLE` (optional) is the animation style.
The animations are a tree. If an animation is unset, it will inherit its
parent's values. See [the animation tree](#animation-tree).
### Examples
```ini
animation = workspaces, 1, 8, default
animation = windows, 1, 10, myepiccurve, slide
animation = fade, 0
```
### Animation tree
```txt
global
↳ windows - styles: slide, popin, gnomed
↳ windowsIn - window open - styles: same as windows
↳ windowsOut - window close - styles: same as windows
↳ windowsMove - everything in between, moving, dragging, resizing.
↳ layers - styles: slide, popin, fade
↳ layersIn - layer open
↳ layersOut - layer close
↳ fade
↳ fadeIn - fade in for window open
↳ fadeOut - fade out for window close
↳ fadeSwitch - fade on changing activewindow and its opacity
↳ fadeShadow - fade on changing activewindow for shadows
↳ fadeDim - the easing of the dimming of inactive windows
↳ fadeLayers - for controlling fade on layers
↳ fadeLayersIn - fade in for layer open
↳ fadeLayersOut - fade out for layer close
↳ fadePopups - for controlling fade on wayland popups
↳ fadePopupsIn - fade in for wayland popup open
↳ fadePopupsOut - fade out for wayland popup close
↳ fadeDpms - for controlling fade when dpms is toggled
↳ border - for animating the border's color switch speed
↳ borderangle - for animating the border's gradient angle - styles: once (default), loop
↳ workspaces - styles: slide, slidevert, fade, slidefade, slidefadevert
↳ workspacesIn - styles: same as workspaces
↳ workspacesOut - styles: same as workspaces
↳ specialWorkspace - styles: same as workspaces
↳ specialWorkspaceIn - styles: same as workspaces
↳ specialWorkspaceOut - styles: same as workspaces
↳ zoomFactor - animates the screen zoom
↳ monitorAdded - monitor added zoom animation
```
> [!WARNING]
> Using the `loop` style for `borderangle` requires Hyprland to _constantly_ render new frames at a frequency equal to your screen's refresh rate (e.g. 60 times per second for a 60hz monitor), which might stress your CPU/GPU and will impact battery life. <br>
> This will apply even if animations are disabled or borders are not visible.
## Curves
Defining your own [Bézier curve](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) can be done with the `bezier` keyword:
```ini
bezier = NAME, X0, Y0, X1, Y1
```
where `NAME` is a name of your choice and `X0, Y0, X1, Y1` are the the two control points for a Cubic Bézier curve. <br>
A good website to design your own Bézier can be [cssportal.com](https://www.cssportal.com/css-cubic-bezier-generator/). <br>
If you want to instead choose from a list of pre-made Béziers, you can check out [easings.net](https://easings.net).
### Example
```ini
bezier = overshoot, 0.05, 0.9, 0.1, 1.1
```
### Extras
For animation style `popin` in `windows`, you can specify a minimum percentage
to start from. For example, the following will make the animation 80% -> 100% of
the size:
```ini
animation = windows, 1, 8, default, popin 80%
```
For animation styles `slide`, `slidevert`, `slidefade` and `slidefadevert` in `workspaces`, you can
specify a movement percentage. For example, the following will make windows move
20% of the screen width:
```ini
animation = workspaces, 1, 8, default, slidefade 20%
```
For animation style `slide` in `windows` and `layers` you can specify a forced side. <br>
You can choose between `top`, `bottom`, `left` or `right`.
```ini
animation = windows, 1, 8, default, slide left
```

View File

@@ -0,0 +1,483 @@
---
weight: 5
title: Binds
---
## Basic
```ini
bind = MODS, key, dispatcher, params
```
for example,
```ini
bind = SUPER_SHIFT, Q, exec, firefox
```
will bind opening Firefox to <key>SUPER</key> + <key>SHIFT</key> + <key>Q</key>
> [!NOTE]
> For binding keys without a modkey, leave it empty:
>
> ```ini
> bind = , Print, exec, grim
> ```
_For a complete mod list, see [Variables](../Variables/#variable-types)._
_The dispatcher list can be found in
[Dispatchers](../Dispatchers/#list-of-dispatchers)._
## Uncommon syms / binding with a keycode
See the
[xkbcommon-keysyms.h header](https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-keysyms.h)
for all the keysyms. The name you should use is the segment after `XKB_KEY_`.
If you want to bind by a keycode, you can put it in the KEY position with
a `code:` prefix, e.g.:
```ini
bind = SUPER, code:28, exec, amongus
```
This will bind <key>SUPER</key> + <key>t</key> since <key>t</key> is keycode 28.
> [!NOTE]
> If you are unsure of what your key's name or keycode is, you can use [`wev`](https://github.com/jwrdegoede/wev) to find out.
## Misc
### Workspace bindings on non-QWERTY layouts
Keys used for keybinds need to be accessible without any modifiers in your layout.
For instance, the [French AZERTY](https://en.wikipedia.org/wiki/AZERTY) layout uses <key>SHIFT</key> + _`unmodified key`_ to write `0-9` numbers. As such, the workspace keybinds for this layout need to use the names of the _`unmodified keys`_ , and will not work when using the `0-9` numbers.
> [!NOTE]
> To get the correct name for an `unmodified_key`, refer to [the section on uncommon syms](#uncommon-syms--binding-with-a-keycode)
```ini
# On a French layout, instead of:
# bind = $mainMod, 1, workspace, 1
# Use
bind = $mainMod, ampersand, workspace, 1
```
For help configuring the French AZERTY layout, see this [article](https://rherault.dev/articles/hyprland-fr-layout).
### Unbind
You can also unbind a key with the `unbind` keyword, e.g.:
```ini
unbind = SUPER, O
```
This may be useful for dynamic keybindings with `hyprctl`, e.g.:
```bash
hyprctl keyword unbind SUPER, O
```
> [!NOTE]
> In `unbind`, key is case-sensitive It must exactly match the case of the `bind` you are unbinding.
>
> ```ini
> bind = SUPER, TAB, workspace, e+1
> unbind = SUPER, Tab # this will NOT unbind
> unbind = SUPER, TAB # this will unbind
> ```
## Bind flags
`bind` supports flags in this format:
```ini
bind[flags] = ...
```
e.g.:
```ini
bindrl = MOD, KEY, exec, amongus
```
Available flags:
| Flag | Name | Description |
|------|------|-------------|
| `l` | locked | Will also work when an input inhibitor (e.g. a lockscreen) is active. |
| `r` | release | Will trigger on release of a key. |
| `c` | click | Will trigger on release of a key or button as long as the mouse cursor stays inside `binds:drag_threshold`. |
| `g` | drag | Will trigger on release of a key or button as long as the mouse cursor moves outside `binds:drag_threshold`. |
| `o` | long press | Will trigger on long press of a key. |
| `e` | repeat | Will repeat when held. |
| `n` | non-consuming | Key/mouse events will be passed to the active window in addition to triggering the dispatcher. |
| `m` | mouse | See the dedicated [Mouse Binds](#mouse-binds) section. |
| `t` | transparent | Cannot be shadowed by other binds. |
| `i` | ignore mods | Will ignore modifiers. |
| `s` | separate | Will arbitrarily combine keys between each mod/key, see [Keysym combos](#keysym-combos). |
| `d` | has description | Will allow you to write a description for your bind. |
| `p` | bypass | Bypasses the app's requests to inhibit keybinds. |
| `u` | submap universal | Will be active no matter the submap. |
Example Usage:
```ini
# Example volume button that allows press and hold, volume limited to 150%
binde = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
# Example volume button that will activate even while an input inhibitor is active
bindl = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
# Open wofi on first press, closes it on second
bindr = SUPER, SUPER_L, exec, pkill wofi || wofi
# Describe a bind
bindd = SUPER, Q, Open my favourite terminal, exec, kitty
# Skip player on long press and only skip 5s on normal press
bindo = SUPER, XF86AudioNext, exec, playerctl next
bind = SUPER, XF86AudioNext, exec, playerctl position +5
```
### Mouse buttons
You can also bind or unbind mouse buttons by prefacing the mouse keycode with `mouse:`, e.g.:
```ini
bind = SUPER, mouse:272, exec, amongus # bind `exec amogus` to SUPER + LMB.
```
### Binding modkeys only
To only bind modkeys, you need to use the TARGET modmask (with the
activating mod) and the `r` flag, e.g.:
```ini
bindr = SUPER ALT, Alt_L, exec, amongus # bind `exec amongus` to SUPER + ALT.
```
### Keysym combos
For an arbitrary combination of multiple keys, separate keysyms with `&` between
each mod/key, and use the `s` flag, e.g.:
```ini
# You can use a single mod with multiple keys.
binds = Control_L, A&Z, exec, kitty
# You can also specify multiple specific mods.
binds = Control_L&Shift_L, K, exec, kitty
# You can also do both!
binds = Control_R&Super_R&Alt_L, J&K&L, exec, kitty
# If you are feeling a little wild... you can use other keys for binds...
binds = Escape&Apostrophe&F7, T&O&A&D, exec, battletoads 2: retoaded
```
> [!NOTE]
> Please note that this is only valid for keysyms and it makes all mods keysyms.
> If you don't know what a keysym is use `wev` and press the key you want to use.
### Mouse wheel
You can also bind mouse wheel events with `mouse_up` and `mouse_down` (or
`mouse_left` and `mouse_right` if your mouse supports horizontal scrolling):
```ini
bind = SUPER, mouse_down, workspace, e-1
```
> [!NOTE]
> You can control the reset time with `binds:scroll_event_delay`.
### Switches
Switches are useful for binding events like closing and opening a laptop's lid:
```ini
# Trigger when the switch is toggled.
bindl = , switch:[switch name], exec, swaylock
# Trigger when the switch is turning on.
bindl = , switch:on:[switch name], exec, hyprctl keyword monitor "eDP-1, disable"
# Trigger when the switch is turning off.
bindl = , switch:off:[switch name], exec, hyprctl keyword monitor "eDP-1, 2560x1600, 0x0, 1"
```
> [!WARNING]
> Systemd `HandleLidSwitch` settings in `logind.conf` may conflict with Hyprland's laptop lid switch configurations.
> [!NOTE]
> You can view your switches with `hyprctl devices`.
### Multiple binds to one key
You can trigger multiple actions with the same keybind by assigning it multiple times, with different `disapatcher`s and `param`s:
```ini
# To switch between windows in a floating workspace:
bind = SUPER, Tab, cyclenext # Change focus to another window
bind = SUPER, Tab, bringactivetotop # Bring it to the top
```
> [!WARNING]
> The keybinds will be executed top to bottom, in the order they were written in.
### Description
You can describe your keybind with the `d` flag.
Your description always goes in front of the `dispatcher`, and must not include commas (`,`)!
```ini
bindd = MODS, key, description, dispatcher, params
```
For example:
```ini
bindd = SUPER, Q, Open my favourite terminal, exec, kitty
```
If you want to access your description you can use `hyprctl binds`.
For more information have a look at [Using Hyprctl](../Using-hyprctl).
## Mouse Binds
These are binds that rely on mouse movement. They will have one less arg.
`binds:drag_threshold` can be used to differentiate between clicks and drags with the same button:
```ini
binds {
drag_threshold = 10 # Fire a drag event only after dragging for more than 10px
}
bindm = ALT, mouse:272, movewindow # ALT + LMB: Move a window by dragging more than 10px.
bindc = ALT, mouse:272, togglefloating # ALT + LMB: Floats a window by clicking
```
Available mouse binds:
| Name | Description | Params |
| ---- | ----------- | ------ |
| movewindow | moves the active window | None |
| resizewindow | resizes the active window | `1` -> Resize and keep window aspect ratio. <br> `2` -> Resize and ignore `keepaspectratio` window rule/prop. <br> None or anything else for normal resize |
Common mouse button key codes (check `wev` for other buttons):
```txt
LMB -> 272
RMB -> 273
MMB -> 274
```
> [!NOTE]
> Mouse binds, despite their name, behave like normal binds.
> You are free to use whatever keys / mods you please. When held, the mouse function will be
> activated.
### Touchpad
As clicking and moving the mouse on a touchpad is unergonomic, you can also use keyboard keys instead of mouse clicks.
```ini
bindm = SUPER, mouse:272, movewindow
bindm = SUPER, Control_L, movewindow
bindm = SUPER, mouse:273, resizewindow
bindm = SUPER, ALT_L, resizewindow
```
## Global Keybinds
### Classic
Yes, you heard this right, Hyprland does support global keybinds for _ALL_ apps,
including OBS, Discord, Firefox, etc.
See the [`pass`](../Dispatchers/#list-of-dispatchers) and
[`sendshortcut`](../Dispatchers/#list-of-dispatchers) dispatchers for keybinds.
Let's take OBS as an example: the "Start/Stop Recording" keybind is set to
<key>SUPER</key> + <key>F10</key>, to make it work globally, simply add:
```ini
bind = SUPER, F10, pass, class:^(com\.obsproject\.Studio)$
```
to your config and you're done.
`pass` will pass the `PRESS` and `RELEASE` events by itself, no need for a `bindr`.
This also means that push-to-talk will work flawlessly with one `pass`, e.g.:
```ini
bind = , mouse:276, pass, class:^(TeamSpeak 3)$ # Pass MOUSE5 to TeamSpeak3.
```
You may also add shortcuts, where other keys are passed to the window.
```ini
bind = SUPER, F10, sendshortcut, SUPER, F4, class:^(com\.obsproject\.Studio)$ # Send SUPER + F4 to OBS when SUPER + F10 is pressed.
```
> [!WARNING]
> This works flawlessly with all native Wayland applications, however, XWayland is a bit wonky.
> Make sure that what you're passing is a "global Xorg keybind", otherwise passing from a different XWayland app may not work.
### DBus Global Shortcuts
Some applications may already support the GlobalShortcuts portal in
xdg-desktop-portal.
If that's the case, it's recommended to use the following method instead of `pass`:
Open your desired app and run `hyprctl globalshortcuts` in a terminal.
This will give you a list of currently registered shortcuts with their description(s).
Choose whichever you like, for example `coolApp:myToggle`, and bind it to
whatever you want with the `global` dispatcher:
```ini
bind = SUPERSHIFT, A, global, coolApp:myToggle
```
> [!NOTE]
> Please note that this function will _only_ work with
> [XDPH](../../Hypr-Ecosystem/xdg-desktop-portal-hyprland).
## Submaps
Keybind submaps, also known as _modes_ or _groups_, allow you to activate a
separate set of keybinds.
For example, if you want to enter a `resize` _mode_ that allows you to resize windows with the arrow keys, you can do it like this:
```ini
# Switch to a submap called `resize`.
bind = ALT, R, submap, resize
# Start a submap called "resize".
submap = resize
# Set repeatable binds for resizing the active window.
binde = , right, resizeactive, 10 0
binde = , left, resizeactive, -10 0
binde = , up, resizeactive, 0 -10
binde = , down, resizeactive, 0 10
# Use `reset` to go back to the global submap
bind = , escape, submap, reset
# Reset the submap, which will return to the global submap
submap = reset
# Keybinds further down will be global again...
```
> [!WARNING]
> Do not forget a keybind (`escape`, in this case) to reset the keymap while inside it!
>
> If you get stuck inside a keymap, you can use `hyprctl dispatch submap reset` to go back.
> If you do not have a terminal open, tough luck buddy. You have been warned.
You can also set the same keybind to perform multiple actions, such as resize
and close the submap, like so:
```ini
bind = ALT, R, submap, resize
submap = resize
bind = , right, resizeactive, 10 0
bind = , right, submap, reset
# ...
submap = reset
```
This works because the binds are executed in the order they appear, and
assigning multiple actions per bind is possible.
You can set a keybind that will be active no matter the current submap with the submap universal bind flag.
```ini
bindu = $mainMod, K, exec, kitty
```
### Nesting
Submaps can be nested, see the following example:
```ini
bind = $mainMod, M, submap, main_submap
submap = main_submap
# ...
# nested_one
bind = , 1, submap, nested_one
submap = nested_one
# ...
bind = SHIFT, escape, submap, reset
bind = , escape, submap, main_submap
submap = main_submap
# /nested_one
# nested_two
bind = , 2, submap, nested_two
submap = nested_two
# ...
bind = SHIFT, escape, submap, reset
bind = , escape, submap, main_submap
submap = main_submap
# /nested_two
bind = , escape, submap, reset
submap = reset
```
### Automatically close a submap on dispatch
Submaps can be automatically closed or sent to another submap by appending ``,`` followed by a submap or _reset_.
```ini
bind = SUPER,a, submap, submapA
# Sets the submap to submapB after pressing a.
submap = submapA, submapB
bind = ,a,exec, someCoolThing.sh
submap = reset
# Reset submap to default after pressing a.
submap = submapB, reset
bind = ,a,exec, soemOtherCoolThing.sh
submap = reset
```
### Catch-All
You can also define a keybind via the special `catchall` keyword, which
activates no matter which key is pressed.
This can be used to prevent any keys from passing to your active application
while in a submap or to exit it immediately when any unknown key is pressed:
```ini
bind = , catchall, submap, reset
```
## Example Binds
### Media
These binds set the expected behavior for regular keyboard media volume keys,
including when the screen is locked:
```ini
bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
# Requires playerctl
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
bindl = , XF86AudioNext, exec, playerctl next
```

View File

@@ -0,0 +1,240 @@
---
weight: 6
title: Dispatchers
---
Please keep in mind some layout-specific dispatchers will be listed in the
layout pages (See the sidebar).
## Parameter explanation
| Param type | Description |
| --- | --- |
| window | a window. Any of the following: class regex (by default, optionally `class:`), `initialclass:` initial class regex, `title:` title regex, `initialtitle` initial title regex, `tag:` window tag regex, `pid:` the pid, `address:` the address, `activewindow` an active window, `floating` the first floating window on the current workspace, `tiled` the first tiled window on the current workspace |
| workspace | see [below]({{< relref "#workspaces" >}}). |
| direction | `l` `r` `u` `d` left right up down |
| monitor | One of: direction, ID, name, `current`, relative (e.g. `+1` or `-1`) |
| resizeparams | relative pixel delta vec2 (e.g. `10 -10`), optionally a percentage of the window size (e.g. `20 25%`) or `exact` followed by an exact vec2 (e.g. `exact 1280 720`), optionally a percentage of the screen size (e.g. `exact 50% 50%`) |
| floatvalue | a relative float delta (e.g `-0.2` or `+0.2`) or `exact` followed by a the exact float value (e.g. `exact 0.5`) |
| zheight | `top` or `bottom` |
| mod | `SUPER`, `SUPER_ALT`, etc. |
| key | `g`, `code:42`, `42` or mouse clicks (`mouse:272`) |
## List of Dispatchers
| Dispatcher | Description | Params |
| --- | --- | --- |
| exec | executes a shell command | command (supports rules, see [below]({{< relref "#executing-with-rules" >}})) |
| execr | executes a raw shell command (does not support rules) | command |
| pass | passes the key (with mods) to a specified window. Can be used as a workaround to global keybinds not working on Wayland. | window |
| sendshortcut | sends specified keys (with mods) to an optionally specified window. Can be used like pass | mod, key[, window] |
| sendkeystate | Send a key with specific state (down/repeat/up) to a specified window (window must keep focus for events to continue). | mod, key, state, window |
| killactive | closes (not kills) the active window | none |
| forcekillactive | kills the active window | none |
| closewindow | closes a specified window | window |
| killwindow | kills a specified window | window |
| signal | sends a signal to the active window | signal |
| signalwindow | sends a signal to a specified window | `window,signal`, e.g.`class:Alacritty,9` |
| workspace | changes the workspace | workspace |
| movetoworkspace | moves the focused window to a workspace | workspace OR `workspace,window` for a specific window |
| movetoworkspacesilent | same as above, but doesn't switch to the workspace | workspace OR `workspace,window` for a specific window |
| togglefloating | toggles the current window's floating state | left empty / `active` for current, or `window` for a specific window |
| setfloating | sets the current window's floating state to true | left empty / `active` for current, or `window` for a specific window |
| settiled | sets the current window's floating state to false | left empty / `active` for current, or `window` for a specific window |
| fullscreen | sets the focused window's fullscreen mode | `mode action`, where mode can be 0 - fullscreen (takes your entire screen) or 1 - maximize (keeps gaps and bar(s)), while action is optional and can be `toggle` (default), `set` or `unset`. |
| fullscreenstate | sets the focused window's fullscreen mode and the one sent to the client | `internal client action`, where internal (the hyprland window) and client (the application) can be `-1` - current, `0` - none, `1` - maximize, `2` - fullscreen, `3` - maximize and fullscreen. action is optional and can be `toggle` (default) or `set`. |
| dpms | sets all monitors' DPMS status. Do not use with a keybind directly. | `on`, `off`, or `toggle`. For specific monitor add monitor name after a space |
| forceidle | sets elapsed time for all idle timers, ignoring idle inhibitors. Timers return to normal behavior upon the next activity. Do not use with a keybind directly. | floatvalue (number of seconds) |
| pin | pins a window (i.e. show it on all workspaces) _note: floating only_ | left empty / `active` for current, or `window` for a specific window |
| movefocus | moves the focus in a direction | direction |
| movewindow | moves the active window in a direction or to a monitor. For floating windows, moves the window to the screen edge in that direction | direction or `mon:` and a monitor, optionally followed by a space and `silent` to prevent the focus from moving with the window|
| swapwindow | swaps the active window with another window in the given direction or with a specific window | direction or `window`|
| centerwindow | center the active window _note: floating only_ | none (for monitor center) or 1 (to respect monitor reserved area) |
| resizeactive | resizes the active window | resizeparams |
| moveactive | moves the active window | resizeparams |
| resizewindowpixel | resizes a selected window | `resizeparams,window`, e.g. `100 100,^(kitty)$` |
| movewindowpixel | moves a selected window | `resizeparams,window` |
| cyclenext | focuses the next window (on a workspace, if `visible` is not provided) | none (for next) or `prev` (for previous) additionally `tiled` for only tiled, `floating` for only floating. `prev tiled` is ok. `visible` for all monitors cycling. `visible prev floating` is ok. if `hist` arg provided - focus order will depends on focus history. All other modifiers is also working for it, `visible next floating hist` is ok. |
| swapnext | swaps the focused window with the next window on a workspace | none (for next) or `prev` (for previous) |
| tagwindow | apply tag to current or the first window matching | `tag [window]`, e.g. `+code ^(foot)$`, `music` |
| focuswindow | focuses the first window matching | window |
| focusmonitor | focuses a monitor | monitor |
| splitratio | changes the split ratio | floatvalue |
| movecursortocorner | moves the cursor to the corner of the active window | direction, 0 - 3, bottom left - 0, bottom right - 1, top right - 2, top left - 3 |
| movecursor | moves the cursor to a specified position | `x y` |
| renameworkspace | rename a workspace | `id name`, e.g. `2 work` |
| exit | exits the compositor with no questions asked. It's recommended to use `hyprshutdown` instead of this. | none |
| forcerendererreload | forces the renderer to reload all resources and outputs | none |
| movecurrentworkspacetomonitor | Moves the active workspace to a monitor | monitor |
| focusworkspaceoncurrentmonitor | Focuses the requested workspace on the current monitor, swapping the current workspace to a different monitor if necessary. If you want XMonad/Qtile-style workspace switching, replace `workspace` in your config with this. | workspace |
| moveworkspacetomonitor | Moves a workspace to a monitor | workspace and a monitor separated by a space |
| swapactiveworkspaces | Swaps the active workspaces between two monitors | two monitors separated by a space |
| bringactivetotop | _Deprecated_ in favor of alterzorder. Brings the current window to the top of the stack | none |
| alterzorder | Modify the window stack order of the active or specified window. Note: this cannot be used to move a floating window behind a tiled one. | zheight[,window] |
| togglespecialworkspace | toggles a special workspace on/off | none (for the first) or name for named (name has to be a special workspace's name) |
| focusurgentorlast | Focuses the urgent window or the last window | none |
| togglegroup | toggles the current active window into a group | none |
| changegroupactive | switches to the next window in a group. | b - back, f - forward, or index start at 1 |
| focuscurrentorlast | Switch focus from current to previously focused window | none |
| lockgroups | Locks the groups (all groups will not accept new windows) | `lock` for locking, `unlock` for unlocking, `toggle` for toggle |
| lockactivegroup | Lock the focused group (the current group will not accept new windows or be moved to other groups) | `lock` for locking, `unlock` for unlocking, `toggle` for toggle |
| moveintogroup | Moves the active window into a group in a specified direction. No-op if there is no group in the specified direction. | direction |
| moveoutofgroup | Moves the active window out of a group. No-op if not in a group | left empty / `active` for current, or `window` for a specific window |
| movewindoworgroup | Behaves as `moveintogroup` if there is a group in the given direction. Behaves as `moveoutofgroup` if there is no group in the given direction relative to the active group. Otherwise behaves like `movewindow`. | direction |
| movegroupwindow | Swaps the active window with the next or previous in a group | `b` for back, anything else for forward |
| denywindowfromgroup | Prohibit the active window from becoming or being inserted into group | `on`, `off` or, `toggle` |
| setignoregrouplock | Temporarily enable or disable binds:ignore_group_lock | `on`, `off`, or `toggle` |
| global | Executes a Global Shortcut using the GlobalShortcuts portal. See [here](../Binds/#global-keybinds) | name |
| submap | Change the current mapping group. See [Submaps](../Binds/#submaps) | `reset` or name |
| event | Emits a custom event to socket2 in the form of `custom>>yourdata` | the data to send |
| setprop | Sets a window property | `window property value` |
| toggleswallow | If a window is swallowed by the focused window, unswallows it. Execute again to swallow it back | none |
> [!WARNING]
> [uwsm](../../Useful-Utilities/Systemd-start) users should avoid using `exit` dispatcher, or terminating Hyprland process directly, as exiting Hyprland this way removes it from under its clients and interferes with ordered shutdown sequence. Use `exec, uwsm stop` (or [other variants](https://github.com/Vladimir-csp/uwsm#how-to-stop)) which will gracefully bring down graphical session (and login session bound to it, if any). If you experience problems with units entering inconsistent states, affecting subsequent sessions, use `exec, loginctl terminate-user ""` instead (terminates all units of the user).
>
> It's also strongly advised to replace the `exit` dispatcher inside `hyprland.conf` keybinds section accordingly.
> [!WARNING]
> It is NOT recommended to set DPMS or forceidle with a keybind directly, as it
> might cause undefined behavior. Instead, consider something like
>
> ```ini
> bind = MOD, KEY, exec, sleep 1 && hyprctl dispatch dpms off
> ```
### Grouped (tabbed) windows
Hyprland allows you to make a group from the current active window with the
`togglegroup` bind dispatcher.
A group is like i3wms “tabbed” container. It takes the space of one window, and
you can change the window to the next one in the tabbed “group” with the
`changegroupactive` bind dispatcher.
The new groups border colors are configurable with the appropriate `col.`
settings in the `group` config section.
You can lock a group with the `lockactivegroup` dispatcher in order to stop new
windows from entering this group. In addition, the `lockgroups` dispatcher can be
used to toggle an independent global group lock that will prevent new windows
from entering any groups, regardless of their local group lock stat.
You can prevent a window from being added to a group or becoming a group with the
`denywindowfromgroup` dispatcher. `movewindoworgroup` will behave like
`movewindow` if the current active window or window in direction has this property
set.
## Workspaces
You have nine choices:
- ID: e.g. `1`, `2`, or `3`
- Relative ID: e.g. `+1`, `-3` or `+100`
- workspace on monitor, relative with `+` or `-`, absolute with `~`: e.g. `m+1`,
`m-2` or `m~3`
- workspace on monitor including empty workspaces, relative with `+` or `-`,
absolute with `~`: e.g. `r+1` or `r~3`
- open workspace, relative with `+` or `-`, absolute with `~`: e.g. `e+1`,
`e-10`, or `e~2`
- Name: e.g. `name:Web`, `name:Anime` or `name:Better anime`
- Previous workspace: `previous`, or `previous_per_monitor`
- First available empty workspace: `empty`, suffix with `m` to only search
on monitor. and/or `n` to make it the _next_ available empty workspace. e.g.
`emptynm`
- Special Workspace: `special` or `special:name` for named special workspaces.
> [!WARNING]
> `special` is supported ONLY on `movetoworkspace` and `movetoworkspacesilent`.
> Any other dispatcher will result in undocumented behavior.
> [!WARNING]
> Numerical workspaces (e.g. `1`, `2`, `13371337`) are allowed **ONLY** between 1
> and 2147483647 (inclusive).
> Neither `0` nor negative numbers are allowed.
## Special Workspace
A special workspace is what is called a "scratchpad" in some other places. A
workspace that you can toggle on/off on any monitor.
> [!NOTE]
> You can define multiple named special workspaces, but the amount of those is
> limited to 97 at a time.
For example, to move a window/application to a special workspace you can use the
following syntax:
```ini
bind = SUPER, C, movetoworkspace, special
#The above syntax will move the window to a special workspace upon pressing 'SUPER'+'C'.
#To see the hidden window you can use the togglespecialworkspace dispatcher mentioned above.
```
## Executing with rules
The `exec` dispatcher supports adding rules. Please note some windows might work
better, some worse. It records the PID of the spawned process and uses that.
For example, if your process forks and then the fork opens a window, this will
not work.
The syntax is:
```ini
bind = mod, key, exec, [rules...] command
```
For example:
```ini
bind = SUPER, E, exec, [workspace 2 silent; float; move 0 0] kitty
```
### setprop
Props are any of the _dynamic effects_ of [Window Rules](../Window-Rules#dynamic-effects).
For example:
```sh
address:0x13371337 no_anim 1
address:0x13371337 no_max_size 0
address:0x13371337 opaque toggle
address:0x13371337 immediate unset
address:0x13371337 border_size relative -2
address:0x13371337 rounding_power relative 0.1
```
### Fullscreenstate
`fullscreenstate internal client`
The `fullscreenstate` dispatcher decouples the state that Hyprland maintains for a window from the fullscreen state that is communicated to the client.
`internal` is a reference to the state maintained by Hyprland.
`client` is a reference to the state that the application receives.
| Value | State | Description |
| --- | --- | --- |
| -1 | Current | Maintains the current fullscreen state. |
| 0 | None | Window allocates the space defined by the current layout. |
| 1 | Maximize | Window takes up the entire working space, keeping the margins. |
| 2 | Fullscreen | Window takes up the entire screen. |
| 3 | Maximize and Fullscreen | The state of a fullscreened maximized window. Works the same as fullscreen. |
For example:
`fullscreenstate 2 0` Fullscreens the application and keeps the client in non-fullscreen mode.
This can be used to prevent Chromium-based browsers from going into presentation mode when they detect they have been fullscreened.
`fullscreenstate 0 2` Keeps the window non-fullscreen, but the client goes into fullscreen mode within the window.

View File

@@ -0,0 +1,57 @@
---
weight: 12
title: Dwindle Layout
---
Dwindle is a BSPWM-like layout, where every window on a workspace is a member of
a binary tree.
## Quirks
Dwindle splits are NOT PERMANENT. The split is determined dynamically with the
W/H ratio of the parent node. If W > H, it's side-by-side. If H > W, it's
top-and-bottom. You can make them permanent by enabling `preserve_split`.
## Config
category name: `dwindle`
| name | description | type | default |
| --- | --- | --- | --- |
| pseudotile | enable pseudotiling. Pseudotiled windows retain their floating size when tiled. | bool | false |
| force_split | 0 -> split follows mouse, 1 -> always split to the left (new = left or top) 2 -> always split to the right (new = right or bottom) | int | 0 |
| preserve_split | if enabled, the split (side/top) will not change regardless of what happens to the container. | bool | false |
| smart_split | if enabled, allows a more precise control over the window split direction based on the cursor's position. The window is conceptually divided into four triangles, and cursor's triangle determines the split direction. This feature also turns on preserve_split. | bool | false |
| smart_resizing | if enabled, resizing direction will be determined by the mouse's position on the window (nearest to which corner). Else, it is based on the window's tiling position. | bool | true |
| permanent_direction_override | if enabled, makes the preselect direction persist until either this mode is turned off, another direction is specified, or a non-direction is specified (anything other than l,r,u/t,d/b) | bool | false |
| special_scale_factor | specifies the scale factor of windows on the special workspace [0 - 1] | float | 1 |
| split_width_multiplier | specifies the auto-split width multiplier. Multiplying window size is useful on widescreen monitors where window W > H even after several splits. | float | 1.0 |
| use_active_for_splits | whether to prefer the active window or the mouse position for splits | bool | true |
| default_split_ratio | the default split ratio on window open. 1 means even 50/50 split. [0.1 - 1.9] | float | 1.0 |
| split_bias | specifies which window will receive the split ratio. 0 -> directional (the top or left window), 1 -> the current window | int | 0 |
| precise_mouse_move | bindm movewindow will drop the window more precisely depending on where your mouse is. | bool | false |
| single_window_aspect_ratio | whenever only a single window is shown on a screen, add padding so that it conforms to the specified aspect ratio. A value like `4 3` on a 16:9 screen will make it a 4:3 window in the middle with padding to the sides. | Vec2D | 0 0 |
| single_window_aspect_ratio_tolerance | sets a tolerance for `single_window_aspect_ratio`, so that if the padding that would have been added is smaller than the specified fraction of the height or width of the screen, it will not attempt to adjust the window size [0 - 1] | int | 0.1 |
## Bind Dispatchers
| dispatcher | description | params |
| --- | --- | --- |
| pseudo | toggles the given window's pseudo mode | left empty / `active` for current, or `window` for a specific window |
## Layout messages
Dispatcher `layoutmsg` params:
| param | description | args |
| --- | --- | --- |
| togglesplit | toggles the split (top/side) of the current window. `preserve_split` must be enabled for toggling to work. | none |
| swapsplit | swaps the two halves of the split of the current window. | none |
| preselect | A one-time override for the split direction. (valid for the next window to be opened, only works on tiled windows) | direction |
| movetoroot | moves the selected window (active window if unspecified) to the root of its workspace tree. The default behavior maximizes the window in its current subtree. If `unstable` is provided as the second argument, the window will be swapped with the other subtree instead. It is not possible to only provide the second argument, but `movetoroot active unstable` will achieve the same result. | [window, [ string ]] |
e.g.:
```ini
bind = SUPER, A, layoutmsg, preselect l
```

View File

@@ -0,0 +1,146 @@
---
weight: 18
title: Environment variables
---
> [!NOTE]
> [uwsm](../../Useful-Utilities/Systemd-start) users should avoid placing environment variables in the `hyprland.conf` file.
> Instead, use `~/.config/uwsm/env` for theming, xcursor, Nvidia and toolkit variables, and `~/.config/uwsm/env-hyprland` for `HYPR*` and `AQ_*` variables.
> The format is `export KEY=VAL`.
>
> ```plain
> export XCURSOR_SIZE=24
> ```
>
> See [uwsm readme](https://github.com/Vladimir-csp/uwsm?tab=readme-ov-file#4-environments-and-shell-profile) for additional information.
You can use the `env` keyword to set environment variables prior to the
initialization of the Display Server, e.g.:
```ini
env = GTK_THEME,Nord
```
> [!WARNING]
> Note that when using the `env` keyword, Hyprland reads the value of the variable as a **raw string** and puts it into the environment _as is_.
> You should **NOT** add quotes `""` around the values.
>
> Some examples with differently formatted values:
>
> ✗ DON'T:
>
> ```py
> env = QT_AUTO_SCREEN_SCALE_FACTOR,"1"
> env = QT_QPA_PLATFORM,"wayland"
> env = QT_QPA_PLATFORM,"wayland;xcb"
> env = AQ_DRM_DEVICES=,"/dev/dri/card1:/dev/dri/card0"
> ```
>
> ✓ Instead, DO:
>
> ```py
> env = QT_AUTO_SCREEN_SCALE_FACTOR,1
> env = QT_QPA_PLATFORM,wayland
> env = QT_QPA_PLATFORM,wayland;xcb
> env = AQ_DRM_DEVICES=,/dev/dri/card1:/dev/dri/card0
> ```
> [!WARNING]
> Please avoid putting those environment variables in `/etc/environment`.
> That will cause all sessions (including Xorg ones) to pick up your Wayland-specific
> environment on traditional Linux distros.
## Hyprland Environment Variables
- `HYPRLAND_TRACE=1` - Enables more verbose logging.
- `HYPRLAND_NO_RT=1` - Disables realtime priority setting by Hyprland.
- `HYPRLAND_NO_SD_NOTIFY=1` - If systemd, disables the `sd_notify` calls.
- `HYPRLAND_NO_SD_VARS=1` - Disables management of variables in systemd and dbus activation environments.
- `HYPRLAND_CONFIG` - Specifies where you want your Hyprland configuration.
## Aquamarine Environment Variables <!-- ref https://github.com/hyprwm/aquamarine/blob/main/docs/env.md -->
- `AQ_TRACE=1` - Enables more verbose logging.
- `AQ_DRM_DEVICES=` - Set an explicit list of DRM devices (GPUs) to use. It's a colon-separated list of paths, with the first being the primary.
E.g.: `/dev/dri/card1:/dev/dri/card0`
- `AQ_FORCE_LINEAR_BLIT=0` - Disables forcing linear explicit modifiers on Multi-GPU buffers to potentially workaround Nvidia issues.
- `AQ_MGPU_NO_EXPLICIT=1` - Disables explicit syncing on mgpu buffers.
- `AQ_NO_MODIFIERS=1` - Disables modifiers for DRM buffers.
## Toolkit Backend Variables
- `env = GDK_BACKEND,wayland,x11,*` - GTK: Use Wayland if available; if not, try X11 and then any other GDK backend.
- `env = QT_QPA_PLATFORM,wayland;xcb` - Qt: Use Wayland if available, fall back to
X11 if not.
- `env = SDL_VIDEODRIVER,wayland` - Run SDL2 applications on Wayland. Remove or set to
`x11` if games that provide older versions of SDL cause compatibility issues
- `env = CLUTTER_BACKEND,wayland` - Clutter package already has Wayland enabled, this
variable will force Clutter applications to try and use the Wayland backend
## XDG Specifications
- `env = XDG_CURRENT_DESKTOP,Hyprland`
- `env = XDG_SESSION_TYPE,wayland`
- `env = XDG_SESSION_DESKTOP,Hyprland`
XDG specific environment variables are often detected through portals and
applications that may set those for you, however it is not a bad idea to set
them explicitly.
If your [desktop portal](https://wiki.archlinux.org/title/XDG_Desktop_Portal) is malfunctioning for seemingly
no reason (no errors), it's likely your XDG env isn't set correctly.
> [!NOTE]
> [uwsm](../../Useful-Utilities/Systemd-start) users don't need to explicitly set XDG environment variables, as uwsm sets them automatically.
## Qt Variables
- `env = QT_AUTO_SCREEN_SCALE_FACTOR,1` -
[(From the Qt documentation)](https://doc.qt.io/qt-5/highdpi.html) enables
automatic scaling, based on the monitor's pixel density
- `env = QT_QPA_PLATFORM,wayland;xcb` - Tell Qt applications to use the Wayland
backend, and fall back to X11 if Wayland is unavailable
- `env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1` - Disables window decorations on Qt
applications
- `env = QT_QPA_PLATFORMTHEME,qt5ct` - Tells Qt based applications to pick your theme
from qt5ct, use with Kvantum.
## NVIDIA Specific
To force GBM as a backend, set the following environment variables:
- `env = GBM_BACKEND,nvidia-drm`
- `env = __GLX_VENDOR_LIBRARY_NAME,nvidia`
> See
> [Archwiki Wayland Page](https://wiki.archlinux.org/title/Wayland#Requirements)
> for more details on those variables.
- `env = LIBVA_DRIVER_NAME,nvidia` - Hardware acceleration on NVIDIA GPUs
> See
> [Archwiki Hardware Acceleration Page](https://wiki.archlinux.org/title/Hardware_video_acceleration)
> for details and necessary values before setting this variable.
- `__GL_GSYNC_ALLOWED` - Controls if G-Sync capable monitors should use Variable
Refresh Rate (VRR)
> See
> [Nvidia Documentation](https://download.nvidia.com/XFree86/Linux-32bit-ARM/375.26/README/openglenvvariables.html)
> for details.
- `__GL_VRR_ALLOWED` - Controls if Adaptive Sync should be used. Recommended to
set as "0" to avoid having problems on some games.
- `env = AQ_NO_ATOMIC,1` - use legacy DRM interface instead of atomic mode
setting. **NOT** recommended.
## Theming Related Variables
- `GTK_THEME` - Set a GTK theme manually, for those who want to avoid appearance
tools such as lxappearance or nwg-look.
- `XCURSOR_THEME` - Set your cursor theme. The theme needs to be installed and
readable by your user.
- `XCURSOR_SIZE` - Set cursor size. See [here](../../FAQ/) for why you might
want this variable set.

View File

@@ -0,0 +1,60 @@
---
weight: 21
title: Example configurations
---
This page houses links to a few repositories with beautiful Hyprland
configurations for you to get inspired from or learn how to configure Hyprland
from a more tangible example.
> [!WARNING]
> These configurations are popular and have many people using them. PRs that add
> more configurations will not be merged.
### end_4 (illogical-impulse)
![end-4/dots-hyprland screenshot](https://raw.githubusercontent.com/end-4/dots-hyprland-wiki/bc4820a76fb4f4ab87fe8f2be80413ab72bee19c/public/screenshots/iiqs.1.jpg)
[https://github.com/end-4/dots-hyprland](https://github.com/end-4/dots-hyprland)
### Stephan Raabe (ML4W)
![mylinuxforwork/dotfiles screenshot](https://i.ibb.co/6ydHNt9/screenshot-29-1.png)
[https://github.com/mylinuxforwork/dotfiles](https://github.com/mylinuxforwork/dotfiles)
### fufexan
![fufexan/dotfiles screenshot](https://user-images.githubusercontent.com/36706276/192147190-cf9cf4df-94cb-4a3b-b9d8-137ed0c2538f.png)
[https://github.com/fufexan/dotfiles](https://github.com/fufexan/dotfiles)
### linuxmobile
![linuxmobile/hyprland-dots screenshot](https://i.ibb.co/kGrhpKd/68747470733a2f2f692e696d6775722e636f6d2f553173336a69372e706e67.png)
[https://github.com/linuxmobile/hyprland-dots](https://github.com/linuxmobile/hyprland-dots)
### flick0
![flick0/dotfiles screenshot](https://raw.githubusercontent.com/flick0/dotfiles/aurora/assets/fetch.png)
[https://github.com/flick0/dotfiles](https://github.com/flick0/dotfiles)
### iamverysimp1e
![1amSimp1e/dots screenshot](https://github.com/1amSimp1e/dots/blob/main/ScreenShots/HyprLand/preview.png)
[https://github.com/1amSimp1e/dots](https://github.com/1amSimp1e/dots)
### notusknot
![notusknot/dotfiles-nix screenshot](https://github.com/notusknot/dotfiles-nix/raw/main/pics/screenshot.png)
[https://github.com/notusknot/dotfiles-nix](https://github.com/notusknot/dotfiles-nix)
### coffebar
![coffebar/dotfiles screenshot](https://github.com/coffebar/dotfiles/raw/6a5d595c594f108cd10219df08d338e98e1d2d7d/screenshot.png)
[https://github.com/coffebar/dotfiles](https://github.com/coffebar/dotfiles)

View File

@@ -0,0 +1,33 @@
---
weight: 16
title: Expanding functionality
---
Hyprland exposes two powerful sockets for you to use.
The first, socket1, can be fully controlled with `hyprctl`, see its usage
[here](../Using-hyprctl).
The second, socket2, sends events for certain changes / actions and can be used
to react to different events. See its description [here](../../IPC/).
## Example script
This bash script will change the outer gaps to 20 if the currently focused
monitor is DP-1, and 30 otherwise.
```bash
#!/usr/bin/env bash
function handle {
if [[ ${1:0:10} == "focusedmon" ]]; then
if [[ ${1:12:4} == "DP-1" ]]; then
hyprctl keyword general:gaps_out 20
else
hyprctl keyword general:gaps_out 30
fi
fi
}
socat - "UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while read -r line; do handle "$line"; done
```

View File

@@ -0,0 +1,58 @@
---
weight: 10
title: Gestures
---
## General
Hyprland supports 1:1 gestures for the trackpad for some operations. The basic syntax looks like this:
```ini
gesture = fingers, direction, action, options
```
Various actions may have their own options, or none. You can drop the options altogether and end
on the action arg if the action takes none.
You can also restrict gestures to a modifier by adding `, mod: [MODMASK]` after `direction`,
or scale the animation's speed by a float by adding `scale: [SCALE]`.
Examples:
```ini
gesture = 3, horizontal, workspace
gesture = 3, down, mod: ALT, close
gesture = 3, up, mod: SUPER, scale: 1.5, fullscreen
gesture = 3, left, scale: 1.5, float
```
### Directions
The following directions are supported:
| `direction` | Description |
| -- | -- |
| `swipe` | any swipe
| `horizontal` | horizontal swipe
| `vertical` | vertical swipe
| `left`, `right`, `up`, `down` | swipe directions
| `pinch` | any pinch
| `pinchin`, `pinchout` | directional pinch
### Actions
Specifying `unset` as the action will unset a specific gesture that was previously set. Please note it needs to exactly match everything
from the original gesture including direction, mods, fingers and scale.
| `action` | Description | Arguments |
| -- | -- | -- |
| `dispatcher` | the most basic, executes a dispatcher once the gesture ends | `dispatcher, params` |
| `workspace` | workspace swipe gesture, for switching workspaces |
| `move` | moves the active window | none |
| `resize` | resizes the active window | none |
| `special` | toggles a special workspace | special workspace without the `special:`, e.g. `mySpecialWorkspace` |
| `close` | closes the active window | none |
| `fullscreen` | fullscreens the active window | none for fullscreen, `maximize` for maximize |
| `float` | floats the active window | none for toggle, `float` or `tile` for one-way |

View File

@@ -0,0 +1,177 @@
---
weight: 3
title: Keywords
---
Keywords are not variables, but "commands" for more advanced configuring. On
this page, you will be presented with some that do not deserve their own page.
See the sidebar for more keywords to control binds, animations, monitors, et
cetera.
> [!WARNING]
> Please remember, that for ALL arguments separated by a comma, if you want to
> leave one of them empty, you cannot reduce the number of commas, _unless told
> otherwise in a specific section_:
>
> ```ini
> three_param_keyword = A, B, C # OK
> three_param_keyword = A, C # NOT OK
> three_param_keyword = A, , C # OK
> three_param_keyword = A, B, # OK
> ```
## Executing
You can execute a shell script on:
- startup of the compositor
- every time the config is reloaded.
- shutdown of the compositor
`exec-once = command` will execute only on launch ([support rules](../Dispatchers/#executing-with-rules))
`execr-once = command` will execute only on launch
`exec = command` will execute on each reload ([support rules](../Dispatchers/#executing-with-rules))
`execr = command` will execute on each reload
`exec-shutdown = command` will execute only on shutdown
## Sourcing (multi-file)
Use the `source` keyword to source another file. Globbing is supported
For example, in your `hyprland.conf` you can:
```ini
source = ~/.config/hypr/myColors.conf
source = ~/.config/hypr/custom/*
```
And Hyprland will enter that file and parse it like a Hyprland config.
Please note it's LINEAR. Meaning lines above the `source =` will be parsed first,
then lines inside `~/.config/hypr/myColors.conf`, then lines below.
## Gestures
Use [libinput-gestures](https://github.com/bulletmark/libinput-gestures) with
`hyprctl` if you want to expand Hyprland's gestures beyond what's offered in
[Variables](../Variables).
## Per-device input configs
Per-device config options will overwrite your options set in the `input`
section. It's worth noting that ONLY values explicitly changed will be
overwritten.
In order to apply per-device config options, add a new category like this:
```ini
device {
name = ...
# options ...
}
```
The `name` can be easily obtained by checking the output of `hyprctl devices`.
Inside of it, put your config options. All options from the `input` category
(and all subcategories, e.g. `input:touchpad`) can be put inside, **EXCEPT**:
- `force_no_accel`
- `follow_mouse`
- `float_switch_override_focus`
Properties that change names:
```plain
touchdevice:transform -> transform
touchdevice:output -> output
```
You can also use the `output` setting for tablets to bind them to outputs.
Remember to use the name of the `Tablet` and not `Tablet Pad` or `Tablet tool`.
Additional properties only present in per-device configs:
- `enabled` -> (only for mice / touchpads / touchdevices / keyboards)
- enables / disables the device (connects / disconnects from the on-screen cursor)
- default: Enabled
- `keybinds` -> (only for devices that send key events)
- enables / disables keybinds for the device
- default: Enabled
Example config section:
```ini
device {
name = royuan-akko-multi-modes-keyboard-b
repeat_rate = 50
repeat_delay = 500
middle_button_emulation = 0
}
```
Example modifying per-device config values using `hyprctl`:
```bash
hyprctl -r -- keyword device[my-device]:sensitivity -1
```
> [!NOTE]
> Per-device layouts will by default not alter the keybind keymap, so for example
> with a global keymap of `us` and a per-device one of `fr`, the keybinds will
> still act as if you were on `us`.
>
> You can change this behavior by setting `resolve_binds_by_sym = 1`. In that case
> you'll need to type the symbol specified in the bind to activate it.
## Wallpapers
The "Hyprland" background you see when you first start Hyprland is **NOT A
WALLPAPER**, it's the default image rendered at the bottom of the render stack.
To set a wallpaper, use a wallpaper utility like
[hyprpaper](https://github.com/hyprwm/hyprpaper) or
[swaybg](https://github.com/swaywm/swaybg).
More can be found in [Useful Utilities](../../Useful-Utilities).
## Setting the environment
> [!NOTE]
> A new environment cannot be passed to already running processes. If you change / add / remove an `env = ` entry
> when Hyprland is running, only newly spawned apps will pick up the changes.
You can use the `env` keyword to set environment variables,
e.g:
```ini
env = XCURSOR_SIZE,24
```
You can also add a `d` flag if you want the env var to be exported to D-Bus
(systemd only):
```ini
envd = XCURSOR_SIZE,24
```
> [!WARNING]
> Hyprland puts the raw string to the env var. You should _not_ add quotes around
> the values.
>
> e.g.:
>
> ```ini
> env = QT_QPA_PLATFORM,wayland
> ```
>
> and _**NOT**_
>
> ```ini
> env = QT_QPA_PLATFORM,"wayland"
> ```

View File

@@ -0,0 +1,82 @@
---
weight: 13
title: Master Layout
---
The master layout makes one (or more) window(s) be the "master", taking (by
default) the left part of the screen, and tiles the rest on the right. You can
change the orientation on a per-workspace basis if you want to use anything other
than the default left/right split.
![master1](https://user-images.githubusercontent.com/43317083/179357849-321f042c-f536-44b3-9e6f-371df5321836.gif)
## Config
_category name `master`_
| name | description | type | default |
| --- | --- | --- | --- |
| allow_small_split | enable adding additional master windows in a horizontal split style | bool | false |
| special_scale_factor | the scale of the special workspace windows. [0.0 - 1.0] | float | 1 |
| mfact | the size as a percentage of the master window, for example `mfact = 0.70` would mean 70% of the screen will be the master window, and 30% the slave [0.0 - 1.0] | floatvalue | 0.55 |
| new_status | `master`: new window becomes master; `slave`: new windows are added to slave stack; `inherit`: inherit from focused window | string | `slave` |
| new_on_top | whether a newly open window should be on the top of the stack | bool | false |
| new_on_active | `before`, `after`: place new window relative to the focused window; `none`: place new window according to the value of `new_on_top`. | string | `none` |
| orientation | default placement of the master area, can be left, right, top, bottom or center | string | left |
| inherit_fullscreen | inherit fullscreen status when cycling/swapping to another window (e.g. monocle layout) | bool | true |
| slave_count_for_center_master | when using orientation=center, make the master window centered only when at least this many slave windows are open. (Set 0 to always_center_master) | int | 2 |
| center_master_fallback | Set fallback for center master when slaves are less than slave_count_for_center_master, can be left ,right ,top ,bottom | string | left |
| smart_resizing | if enabled, resizing direction will be determined by the mouse's position on the window (nearest to which corner). Else, it is based on the window's tiling position. | bool | true |
| drop_at_cursor | when enabled, dragging and dropping windows will put them at the cursor position. Otherwise, when dropped at the stack side, they will go to the top/bottom of the stack depending on new_on_top. | bool | true |
| always_keep_position | whether to keep the master window in its configured position when there are no slave windows | bool | false |
## Dispatchers
`layoutmsg` commands:
| command | description | params |
| --- | --- | --- |
| swapwithmaster | swaps the current window with master. If the current window is the master, swaps it with the first child. | either `master` (new focus is the new master window), `child` (new focus is the new child) or `auto` (which is the default, keeps the focus of the previously focused window). Adding `ignoremaster` will ignore this dispatcher if master is already focused. |
| focusmaster | focuses the master window. | either `master` (focus stays on master), `auto` (default; focus first non-master window if already on master) or `previous` (remember current window when focusing master, if already on master, focus previous or fallback to `auto`). |
| cyclenext | focuses the next window respecting the layout | either `loop` (allow looping from the bottom of the pile back to master) or `noloop` (force stop at the bottom of the pile, like in DWM). `loop` is the default if left blank. |
| cycleprev | focuses the previous window respecting the layout | either `loop` (allow looping from master to the bottom of the pile) or `noloop` (force stop at master, like in DWM). `loop` is the default if left blank. |
| swapnext | swaps the focused window with the next window respecting the layout | either `loop` (allow swapping the bottom of the pile and master) or `noloop` (do not allow it, like in DWM). `loop` is the default if left blank. |
| swapprev | swaps the focused window with the previous window respecting the layout | either `loop` (allow swapping master and the bottom of the pile) or `noloop` (do not allow it, like in DWM). `loop` is the default if left blank. |
| addmaster | adds a master to the master side. That will be the active window, if it's not a master, or the first non-master window. | none |
| removemaster | removes a master from the master side. That will be the active window, if it's a master, or the last master window. | none |
| orientationleft | sets the orientation for the current workspace to left (master area left, slave windows to the right, vertically stacked) | none |
| orientationright | sets the orientation for the current workspace to right (master area right, slave windows to the left, vertically stacked) | none |
| orientationtop | sets the orientation for the current workspace to top (master area top, slave windows to the bottom, horizontally stacked) | none |
| orientationbottom | sets the orientation for the current workspace to bottom (master area bottom, slave windows to the top, horizontally stacked) | none |
| orientationcenter | sets the orientation for the current workspace to center (master area center, slave windows alternate to the left and right, vertically stacked) | none |
| orientationnext | cycle to the next orientation for the current workspace (clockwise) | none |
| orientationprev | cycle to the previous orientation for the current workspace (counter-clockwise) | none |
| orientationcycle | cycle to the next orientation from the provided list, for the current workspace | allowed values: `left`, `top`, `right`, `bottom`, or `center`. The values have to be separated by a space. If left empty, it will work like `orientationnext` |
| mfact | change mfact, the master split ratio | the new split ratio, a relative float delta (e.g `-0.2` or `+0.2`) or `exact` followed by a the exact float value between 0.0 and 1.0 |
| rollnext | rotate the next window in stack to be the master, while keeping the focus on master | none |
| rollprev | rotate the previous window in stack to be the master, while keeping the focus on master | none |
Parameters for the commands are separated by a single space.
> [!NOTE]
> Example usage:
>
> ```ini
> bind = MOD, KEY, layoutmsg, cyclenext
> # behaves like xmonads promote feature (https://hackage.haskell.org/package/xmonad-contrib-0.17.1/docs/XMonad-Actions-Promote.html)
> bind = MOD, KEY, layoutmsg, swapwithmaster master
> ```
## Workspace Rules
`layoutopt` rules:
| rule | description | type |
| --- | --- | --- |
| orientation:[o] | Sets the orientation of a workspace. For available orientations, see [Config->orientation](#config) | string |
Example usage:
```ini
workspace = 2, layoutopt:orientation:top
```

View File

@@ -0,0 +1,312 @@
---
weight: 4
title: Monitors
---
## General
The general config of a monitor looks like this:
```ini
monitor = name, resolution, position, scale
```
A common example:
```ini
monitor = DP-1, 1920x1080@144, 0x0, 1
```
This will make the monitor on `DP-1` a `1920x1080` display, at
144Hz, `0x0` off from the top left corner, with a scale of 1 (unscaled).
To list all available monitors (active and inactive):
```bash
hyprctl monitors all
```
Monitors are positioned on a virtual "layout". The `position` is the position,
in pixels, of said display in the layout. (calculated from the top-left corner)
For example:
```ini
monitor = DP-1, 1920x1080, 0x0, 1
monitor = DP-2, 1920x1080, 1920x0, 1
```
will tell Hyprland to put DP-1 on the _left_ of DP-2, while
```ini
monitor = DP-1, 1920x1080, 1920x0, 1
monitor = DP-2, 1920x1080, 0x0, 1
```
will tell Hyprland to put DP-1 on the _right_.
The `position` may contain _negative_ values, so the above example could also be
written as
```ini
monitor = DP-1, 1920x1080, 0x0, 1
monitor = DP-2, 1920x1080, -1920x0, 1
```
Hyprland uses an inverse Y cartesian system. Thus, a negative y coordinate
places a monitor higher, and a positive y coordinate will place it lower.
For example:
```ini
monitor = DP-1, 1920x1080, 0x0, 1
monitor = DP-2, 1920x1080, 0x-1080, 1
```
will tell Hyprland to put DP-2 _above_ DP-1, while
```ini
monitor = DP-1, 1920x1080, 0x0, 1
monitor = DP-2, 1920x1080, 0x1080, 1
```
will tell Hyprland to put DP-2 _below_.
> [!NOTE]
> The position is calculated with the scaled (and transformed) resolution, meaning
> if you want your 4K monitor with scale 2 to the left of your 1080p one, you'd
> use the position `1920x0` for the second screen (3840 / 2). If the monitor is
> also rotated 90 degrees (vertical), you'd use `1080x0`.
> [!WARNING]
> No monitors can overlap. This means that if your set positions make any monitors
> overlap, you will get a warning.
Leaving the name empty will define a fallback rule to use when no other rules
match.
There are a few special values for the resolutions:
- `preferred` - use the display's preferred size and refresh rate.
- `highres` - use the highest supported resolution.
- `highrr` - use the highest supported refresh rate.
- `maxwidth` - use the widest supported resolution.
Position also has a few special values:
- `auto` - let Hyprland decide on a position. By default, it places each new monitor to the right of existing ones,
using the monitor's top left corner as the root point.
- `auto-right/left/up/down` - place the monitor to the right/left, above or below other monitors,
also based on each monitor's top left corner as the root.
- `auto-center-right/left/up/down` - place the monitor to the right/left, above or below other monitors,
but calculate placement from each monitor's center rather than its top left corner.
_**Please Note:**_ While specifying a monitor direction for your first monitor is allowed, this does nothing and it will
be positioned at (0,0). Also, the direction is always from the center out, so you can specify `auto-up` then `auto-left`,
but the left monitors will just be left of the origin and above the origin. You can also specify duplicate directions and
monitors will continue to go in that direction.
You can also use `auto` as a scale to let Hyprland decide on a scale for you.
These depend on the PPI of the monitor.
Recommended rule for quickly plugging in random monitors:
```ini
monitor = , preferred, auto, 1
```
This will make any monitor that was not specified with an explicit rule
automatically placed on the right of the other(s), with its preferred
resolution.
For more specific rules, you can also use the output's description (see
`hyprctl monitors` for more details). If the output of `hyprctl monitors` looks
like the following:
```yaml
Monitor eDP-1 (ID 0):
1920x1080@60.00100 at 0x0
description: Chimei Innolux Corporation 0x150C (eDP-1)
make: Chimei Innolux Corporation
model: 0x150C
[...]
```
then the `description` value up to, but not including the portname `(eDP-1)` can
be used to specify the monitor:
```ini
monitor = desc:Chimei Innolux Corporation 0x150C, preferred, auto, 1.5
```
Remember to remove the `(portname)`!
### Custom modelines
You can set up a custom modeline by changing the resolution field to a modeline,
for example:
```ini
monitor = DP-1, modeline 1071.101 3840 3848 3880 3920 2160 2263 2271 2277 +hsync -vsync, 0x0, 1
```
### Disabling a monitor
To disable a monitor, use
```ini
monitor = name, disable
```
> [!WARNING]
> Disabling a monitor will literally remove it from the layout, moving all windows
> and workspaces to any remaining ones. If you want to disable your monitor in a
> screensaver style (just turn off the monitor) use the `dpms`
> [dispatcher](../Dispatchers).
## Custom reserved area
A reserved area is an area that remains unoccupied by tiled windows.
If your workflow requires a custom reserved area, you can add it with:
```ini
monitor = name, addreserved, TOP, BOTTOM, LEFT, RIGHT
```
Where `TOP` `BOTTOM` `LEFT` `RIGHT` are integers, i.e the number in pixels of
the reserved area to add. This does stack on top of the calculated reserved area
(e.g. bars), but you may only use one of these rules per monitor in the config.
## Extra args
You can combine extra arguments at the end of the monitor rule, examples:
```ini
monitor = eDP-1, 2880x1800@90, 0x0, 1, transform, 1, mirror, DP-2, bitdepth, 10
```
See below for more details about each argument.
### Mirrored displays
If you want to mirror a display, add a `, mirror, <NAME>` at the end of the
monitor rule, examples:
```ini
monitor = DP-3, 1920x1080@60, 0x0, 1, mirror, DP-2
monitor = , preferred, auto, 1, mirror, DP-1
```
Please remember that mirroring displays will not "re-render" everything for your
second monitor, so if mirroring a 1080p screen onto a 4K one, the resolution
will still be 1080p on the 4K display. This also means squishing and stretching
will occur on aspect ratios that differ (e.g 16:9 and 16:10).
### 10 bit support
If you want to enable 10 bit support for your display, add a `, bitdepth, 10` at
the end of the monitor rule, e.g:
```ini
monitor = eDP-1, 2880x1800@90, 0x0, 1, bitdepth, 10
```
> [!WARNING]
> Colors registered in Hyprland (e.g. the border color) do _not_ support
> 10 bit.
> Some applications do _not_ support screen capture with 10 bit enabled.
### Color management presets
Add a `, cm, X` to change default sRGB output preset
```ini
monitor = eDP-1, 2880x1800@90, 0x0, 1, bitdepth, 10, cm, wide
```
```plain
auto - srgb for 8bpc, wide for 10bpc if supported (recommended)
srgb - sRGB primaries (default)
dcip3 - DCI P3 primaries
dp3 - Apple P3 primaries
adobe - Adobe RGB primaries
wide - wide color gamut, BT2020 primaries
edid - primaries from edid (known to be inaccurate)
hdr - wide color gamut and HDR PQ transfer function (experimental)
hdredid - same as hdr with edid primaries (experimental)
```
Fullscreen HDR is possible without hdr `cm` setting if `render:cm_fs_passthrough` is enabled.
Use `sdrbrightness, B` and `sdrsaturation, S` to control SDR brightness and saturation in HDR mode. The default for both values is `1.0`. Typical brightness value should be in `1.0 ... 2.0` range.
```ini
monitor = eDP-1, 2880x1800@90, 0x0, 1, bitdepth, 10, cm, hdr, sdrbrightness, 1.2, sdrsaturation, 0.98
```
The default transfer function assumed to be in use on an SDR display for sRGB content is defined by `, sdr_eotf, X`. The default (`0`) is to follow `render:cm_sdr_eotf`. This can be changed to piecewise sRGB with `1`, or Gamma 2.2 with `2`.
### VRR
Per-display VRR can be done by adding `, vrr, X` where `X` is the mode from the
[variables page](../Variables).
## Rotating
If you want to rotate a monitor, add a `, transform, X` at the end of the monitor
rule, where `X` corresponds to a transform number, e.g.:
```ini
monitor = eDP-1, 2880x1800@90, 0x0, 1, transform, 1
```
Transform list:
```plain
0 -> normal (no transforms)
1 -> 90 degrees
2 -> 180 degrees
3 -> 270 degrees
4 -> flipped
5 -> flipped + 90 degrees
6 -> flipped + 180 degrees
7 -> flipped + 270 degrees
```
## Monitor v2
Alternative syntax. `monitor = DP-1,1920x1080@144,0x0,1,transform,2` is the same as
```ini
monitorv2 {
output = DP-1
mode = 1920x1080@144
position = 0x0
scale = 1
transform = 2
}
```
The `disable` flag turns into `disabled = true`, but other named settings keep their names: `name, value` &rarr; `name = value` (e.g. `bitdepth,10` &rarr; `bitdepth = 10`)
EDID overrides and SDR &rarr; HDR settings:
| name | description | type |
|---|---|---|
| supports_wide_color | Force wide color gamut support (1 - force on, 0 - does nothing) | bool |
| supports_hdr | Force HDR support. Requires wide color gamut (1 - force on, 0 - does nothing) | bool |
| sdr_min_luminance | SDR minimum lumninace used for SDR &rarr; HDR mapping. Set to 0.005 for true black matching HDR black | float |
| sdr_max_luminance | SDR maximum luminance. Can be used to adjust overall SDR &rarr; HDR brightness. 80 - 400 is a reasonable range. The desired value is likely between 200 and 250 | int |
| min_luminance | Monitor's minimum luminance | float |
| max_luminance | Monitor's maximum possible luminance | int |
| max_avg_luminance | Monitor's maximum luminance on average for a typical frame | int |
Note: those values might get passed to the monitor itself and cause increased burn-in or other damage if it's firmware lacks some safety checks.
## Default workspace
See [Workspace Rules](../Workspace-Rules).
### Binding workspaces to a monitor
See [Workspace Rules](../Workspace-Rules).

View File

@@ -0,0 +1,126 @@
---
weight: 19
title: Multi-GPU
---
## General
If your host machine uses multiple GPUs, you may want to use one GPU
for rendering all the elements for Hyprland including windows, animations, and
another for hardware acceleration for certain applications, etc.
This setup is very common in the likes of gaming laptops, GPU-passthrough
(without VFIO) capable hosts, and if you have multiple GPUs in general.
## Detecting GPUs
For this case, the writer is taking the example of their laptop.
Upon running `lspci -d ::03xx`, one can list all the PCI display controllers
available.
```plain
01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
06:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)
```
Here it is clear that 2 GPUs are available, the dedicated NVIDIA GTX 1650 Mobile
/ Max-Q and the integrated AMD Cezanne Radeon Vega Series GPU.
Now, run `ls -l /dev/dri/by-path`
```plain
total 0
lrwxrwxrwx 1 root root 8 Jul 14 15:45 pci-0000:01:00.0-card -> ../card0
lrwxrwxrwx 1 root root 13 Jul 14 15:45 pci-0000:01:00.0-render -> ../renderD128
lrwxrwxrwx 1 root root 8 Jul 14 15:45 pci-0000:06:00.0-card -> ../card1
lrwxrwxrwx 1 root root 13 Jul 14 15:45 pci-0000:06:00.0-render -> ../renderD129
```
So from the above outputs, we can see that the path for the AMD card is
`pci-0000:06:00.0-card`, due to the matching `06:00.0` from the first command.
Do not use the `card1` symlink indicated here. It is dynamically assigned at
boot and is subject to frequent change, making it unsuitable as a marker for GPU selection.
## Telling Hyprland which GPU to use
After determining which "card" belongs to which GPU, we can now tell
Hyprland which GPUs to use by setting the `AQ_DRM_DEVICES` environment variable.
> [!NOTE]
> It is generally a good idea for laptops to use the integrated GPU as the primary
> renderer as this preserves battery life and is practically indistinguishable
> from using the dedicated GPU on modern systems in most cases. Hyprland can be
> run on integrated GPUs just fine. The same principle applies for desktop setups
> with lower and higher power rating GPUs respectively.
If you would like to use another GPU, or the wrong GPU is picked by default,
set `AQ_DRM_DEVICES` to a `:`-separated list of card paths, e.g.
```plain
env = AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1
```
Here, we tell Hyprland which GPUs it's allowed to use, in order of priority.
For example, `card0` will be the primary renderer, but if it isn't available for
whatever reason, then `card1` is primary.
Do note that if you have an external monitor connected to, for example `card1`,
that card must be included in `AQ_DRM_DEVICES` for the monitor to work, though
it doesn't have to be the primary renderer.
You should now be able to use an integrated GPU for lighter GPU loads,
including Hyprland, or default to your dGPU if you prefer.
> [!NOTE]
> [uwsm](../../Useful-Utilities/Systemd-start) users are advised to export the `AQ_DRM_DEVICES` variable inside `~/.config/uwsm/env-hyprland`, instead.
> This method ensures that the variable is properly exported to the systemd environment without conflicting with other compositors or desktop environments.
>
> ```plain
> export AQ_DRM_DEVICES="/dev/dri/card0:/dev/dri/card1"
> ```
## Creating consistent device paths for specific cards
As mentioned above, it's not recommended to use the `/dev/dri/card*` device paths since they
periodically change which device they are symlinked to. Furthermore, the colons in the actual card
device paths are not usable in the `AQ_DRM_DEVICES` environment variable since colons `:` are used
as a separator for multiple paths.
It's possible to use udev rules to create reliable symlinks to particular device cards. For example,
to create a symlink to an AMD card at the path `/dev/dri/amd-igpu`, we can create a udev rule at
`/etc/udev/rules.d/amd-igpu-dev-path.rules` programmatically like so:
```sh
SYMLINK_NAME="amd-igpu"
RULE_PATH="/etc/udev/rules.d/amd-igpu-dev-path.rules"
AMD_IGPU_ID=$(lspci -d ::03xx | grep 'AMD' | cut -f1 -d' ')
UDEV_RULE="$(cat <<EOF
KERNEL=="card*", \
KERNELS=="0000:$AMD_IGPU_ID", \
SUBSYSTEM=="drm", \
SUBSYSTEMS=="pci", \
SYMLINK+="dri/$SYMLINK_NAME"
EOF
)"
echo "$UDEV_RULE" | sudo tee "$RULE_PATH"
```
Then reloading the udev rules with:
```sh
sudo udevadm control --reload
sudo udevadm trigger
```
There should now be a symlink at `/dev/dri/amd-igpu` that points to your respective card file:
```console
$ ls -l /dev/dri/amd-igpu
lrwxrwxrwx 1 root root 5 /dev/dri/amd-igpu -> card1
```
This symlink will automatically update to point to correct card file if it ever changes.
Now it is possible to use the new symlink in the `AQ_DRM_DEVICES` environment variable:
```plain
env = AQ_DRM_DEVICES, /dev/dri/amd-igpu
```

View File

@@ -0,0 +1,36 @@
---
weight: 22
title: Performance
---
This page documents known tricks and fixes to boost performance if by any chance
you stumble upon problems or you do not care that much about animations.
## Fractional scaling
Wayland fractional scaling is a lot better than before, but it is not perfect.
Some applications do not support it yet or the support is experimental at best.
If you have problems with your graphics card having high usage or Hyprland
feeling laggy, try setting the scaling to integer numbers such as `1` or `2`
like in this example `monitor=,preferred,auto,2`.
## Low FPS/stutter/FPS drops on Intel iGPU with TLP (mainly laptops)
The TLP defaults are rather aggressive, setting `INTEL_GPU_MIN_FREQ_ON_AC`
and/or `INTEL_GPU_MIN_FREQ_ON_BAT` in `/etc/tlp.conf` to something slightly
higher (e.g. to 500 from 300) will reduce stutter significantly or, in the best
case, remove it completely.
## How do I make Hyprland draw as little power as possible on my laptop?
**_Useful Optimizations_**:
- `decoration:blur:enabled = false` and `decoration:shadow:enabled = false` to disable
fancy but battery hungry effects.
- `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is
happening on-screen.
## My games work poorly, especially proton ones
Using `gamescope` tends to fix any and all issues with Wayland/Hyprland.

View File

@@ -0,0 +1,105 @@
---
weight: 14
title: Permissions
---
If you have `hyprland-guiutils` installed, you can make use of Hyprland's built-in
permission system.
For now, it only has a few permissions, but it might include more in the future.
## Permissions
Permissions work a bit like Android ones. If an app tries to do something sensitive with
the compositor (Hyprland), Hyprland will pop up a notification asking you if you
want to let it do that.
> [!NOTE]
> Before setting up permissions, make sure you enable them by setting
> `ecosystem:enforce_permissions = true`, as it's disabled by default.
### Configuring permissions
> [!IMPORTANT]
> Permissions set up in the config are **not** reloaded on-the-fly and require a Hyprland
> restart for security reasons.
Configuring them is simple:
```ini
permission = regex, permission, mode
```
for example:
```ini
permission = /usr/bin/grim, screencopy, allow
```
Will allow `/usr/bin/grim` to always capture your screen without asking.
```ini
permission = /usr/bin/appsuite-.*, screencopy, allow
```
Will allow any app whose path starts with `/usr/bin/appsuite-` to capture your screen without asking.
### Permission modes
There are 3 modes:
- `allow`: Don't ask, just allow the app to proceed.
- `ask`: Pop up a notification every time the app tries to do something sensitive. These popups allow you to Deny, Allow until the app exits, or Allow until Hyprland exits.
- `deny`: Don't ask, always deny the application access.
### Permission list
`screencopy`:
- Default: **ASK**
- Access to your screen _without_ going through xdg-desktop-portal-hyprland. Examples include: `grim`, `wl-screenrec`, `wf-recorder`.
- If denied, will render a black screen with a "permission denied" text.
- Why deny? For apps / scripts that might maliciously try to capture your screen without your knowledge by using wayland protocols directly.
`plugin`:
- Default: **ASK**
- Access to load a plugin. Can be either a regex for the app binary, or plugin path.
- Do _not_ allow `hyprctl` to load your plugins by default (attacker could issue `hyprctl plugin load /tmp/my-malicious-plugin.so`) - use either `deny` to disable or `ask` to be prompted.
`keyboard`:
- Default: **ALLOW**
- Access to connecting a new keyboard. Regex of the device name.
- If you want to disable all keyboards not matching a regex, make a rule that sets `DENY` for `.*` _as the last keyboard permission rule_.
- Why deny? Rubber duckies, malicious virtual / usb keyboards.
## Notes
**xdg-desktop-portal** implementations (including xdph) are just regular applications. They will go through permissions too. You might want to consider
adding a rule like this:
```ini
permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow
```
if you are not allowing screencopy for all apps.
<br/>
NixOS does not have static paths for the binaries, so regex has to be used. These example rules allow `grim` and `xdg-desktop-portal-hyprland` to copy the screen:
```ini
permission = /nix/store/[a-z0-9]{32}-grim-[0-9.]*/bin/grim, screencopy, allow
permission = /nix/store/[a-z0-9]{32}-xdg-desktop-portal-hyprland-[0-9.]*/libexec/.xdg-desktop-portal-hyprland-wrapped, screencopy, allow
```
When rendering the configuration with Nix itself, string interpolation can also be used (be aware that if the path contains special regex characters (e.g. `+`) they need to be escaped):
```ini
permission = ${lib.getExe pkgs.grim}, screencopy, allow
permission = ${lib.escapeRegex (lib.getExe config.programs.hyprlock.package)}, screencopy, allow
permission = ${pkgs.xdg-desktop-portal-hyprland}/libexec/.xdg-desktop-portal-hyprland-wrapped, screencopy, allow
```
<br/>
On some **BSD** systems paths might not work. In such cases, you might want to disable permissions altogether, by setting
```ini
ecosystem {
enforce_permissions = false
}
```
otherwise, you have no _config_ control over permissions (popups will still work, although will not show paths, and "remember" will not be available).

View File

@@ -0,0 +1,46 @@
---
weight: 1
title: Start
---
The config is located in `$XDG_CONFIG_HOME/hypr/hyprland.conf`. In most cases,
that maps to `~/.config/hypr/hyprland.conf`.
You can tell Hyprland to use a specific configuration file by using the
`--config` (or `-c`) argument.
Hyprland will automatically generate an example config for you if you don't have
one. You can find an example config
[here](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf).
By removing the line containing `autogenerated=1` you'll remove the yellow
warning.
The config is reloaded the moment you save it. However, you can use
`hyprctl reload` to reload the config manually.
Start a section with `name {` and end in `}` **_in separate lines!_**
> [!WARNING]
> The default config is not complete and does not list all the options / features
> of Hyprland. Please refer to this wiki page and the pages linked further down
> here for full configuration instructions.
>
> **Make sure to read the [Variables](../Variables) page as well**. It covers all
> the toggleable / numerical options.
## Language style and syntax
See the [hyprlang page](../../Hypr-Ecosystem/hyprlang).
## Basic configuring
To configure Hyprland's options, animations, styling, etc. see
[Variables](../Variables).
## Advanced configuring
Some keywords (binds, curves, execs, monitors, etc.) are not variables but
define special behavior.
See all of them in [Keywords](../Keywords) and the sidebar.

View File

@@ -0,0 +1,56 @@
---
weight: 11
title: Tearing
---
Screen tearing is used to reduce latency and/or jitter in games.
## Enabling tearing
To enable tearing:
- Set `general:allow_tearing` to `true`. This is a "master toggle"
- Add an `immediate` windowrule to your game of choice. This makes sure that
Hyprland will tear it.
> [!WARNING]
> Please note that tearing will only be in effect when the game is in fullscreen
> and the only thing visible on the screen.
Example snippet:
```env
general {
allow_tearing = true
}
windowrule = match:class cs2, immediate yes
```
> [!WARNING]
> If you experience graphical issues, you may be out of luck. Tearing support is
> experimental.
> See the likely culprits below.
## Common issues
### No tearing at all
Make sure your window rules are matching and you have the master toggle enabled.
Also make sure nothing except for your game is showing on your monitor. No
notifications, overlays, lockscreens, bars, other windows, etc. (on a different
monitor is fine)
### Apps that should tear, freeze
Almost definitely means your GPU driver does not support tearing.
Please _do not_ report issues if this is the culprit.
### Graphical artifacts (random colorful pixels, etc)
Likely issue with your graphics driver.
Please _do not_ report issues if this is the culprit. Unfortunately, it's most
likely your GPU driver's fault.

View File

@@ -0,0 +1,408 @@
---
weight: 20
title: Uncommon tips & tricks
---
## Switchable keyboard layouts
The easiest way to accomplish this is to set this using XKB settings, for
example:
```ini
input {
kb_layout = us,cz
kb_variant = ,qwerty
kb_options = grp:alt_shift_toggle
}
```
Variants are set per layout.
> [!WARNING]
> The first layout defined in the input section will be the one used for binds by
> default.
>
> For example: `us,ua` -> config binds would be e.g. `SUPER, A`, while on `ua,us`
> -> `SUPER, Cyrillic_ef`
>
> You can change this behavior globally or per-device by setting
> `resolve_binds_by_sym = 1`. In that case, binds will activate when the symbol
> typed matches the symbol specified in the bind.
>
> For example: if your layouts are `us,fr` and have a bind for `SUPER, A` you'd
> need to press the first letter on the second row while the `us` layout is active
> and the first letter on the first row while the `fr` layout is active.
You can also bind a key to execute `hyprctl switchxkblayout` for more keybind
freedom. See [Using hyprctl](../Using-hyprctl).
To find the valid layouts and `kb_options`, you can check out the
`/usr/share/X11/xkb/rules/base.lst`. For example:
To get the layout name of a language:
```sh
grep -i 'persian' /usr/share/X11/xkb/rules/base.lst
```
To get the list of keyboard shortcuts you can put in the `kb_options` to toggle
keyboard layouts:
```sh
grep 'grp:.*toggle' /usr/share/X11/xkb/rules/base.lst
```
## Disabling keybinds with one master keybind
If you want to disable all keybinds with another keybind (make a keybind toggle
of sorts) you can just use a submap with only a keybind to exit it.
```ini
bind = MOD, KEY, submap, clean
submap = clean
bind = MOD, KEY, submap, reset
submap = reset
```
## Remapping Caps Lock
You can customize the behavior of the Caps Lock key using `kb_options`.
To view all available options related to Caps Lock, run:
```sh
grep 'caps' /usr/share/X11/xkb/rules/base.lst
```
For example, to remap Caps lock to Ctrl:
```ini
input {
kb_options = ctrl:nocaps
}
```
To swap Caps Lock and Escape:
```ini
input {
kb_options = caps:swapescape
}
```
You can also find additional `kb_options` unrelated to Caps Lock in `/usr/share/X11/xkb/rules/base.lst`.
## Set F13-F24 as usual function keys
By default, F13-F24 are mapped by xkb as various "XF86" keysyms. These cause binding
issues in many programs. One example is OBS Studio, which does not detect the XF86
keysyms as usable keybindings, making you unable to use them for binds. This option
simply maps them back to the expected F13-F24 values, which are bindable as normal.
> [!WARNING]
> This option was only added recently to `xkeyboard-config`. Please ensure you are on version
> 2.43 or greater for this option to do anything.
```ini
input {
kb_options = fkeys:basic_13-24
}
```
## Minimize windows using special workspaces
This approach uses special workspaces to mimic the "minimize window" function, by using a single keybind to toggle the minimized state.
Note that one keybind can only handle one window.
```ini
bind = $mod, S, togglespecialworkspace, magic
bind = $mod, S, movetoworkspace, +0
bind = $mod, S, togglespecialworkspace, magic
bind = $mod, S, movetoworkspace, special:magic
bind = $mod, S, togglespecialworkspace, magic
```
## Show desktop
This approach uses same principle as the [Minimize windows using special workspaces](#minimize-windows-using-special-workspaces) section.
It moves all windows from current workspace to a special workspace named `desktop`.
Showing desktop state is remembered per workspace.
Create a script:
```sh
#!/bin/env sh
TMP_FILE="$XDG_RUNTIME_DIR/hyprland-show-desktop"
CURRENT_WORKSPACE=$(hyprctl monitors -j | jq '.[] | .activeWorkspace | .name' | sed 's/"//g')
if [ -s "$TMP_FILE-$CURRENT_WORKSPACE" ]; then
readarray -d $'\n' -t ADDRESS_ARRAY <<< $(< "$TMP_FILE-$CURRENT_WORKSPACE")
for address in "${ADDRESS_ARRAY[@]}"
do
CMDS+="dispatch movetoworkspacesilent name:$CURRENT_WORKSPACE,address:$address;"
done
hyprctl --batch "$CMDS"
rm "$TMP_FILE-$CURRENT_WORKSPACE"
else
HIDDEN_WINDOWS=$(hyprctl clients -j | jq --arg CW "$CURRENT_WORKSPACE" '.[] | select (.workspace .name == $CW) | .address')
readarray -d $'\n' -t ADDRESS_ARRAY <<< $HIDDEN_WINDOWS
for address in "${ADDRESS_ARRAY[@]}"
do
address=$(sed 's/"//g' <<< $address )
if [[ -n address ]]; then
TMP_ADDRESS+="$address\n"
fi
CMDS+="dispatch movetoworkspacesilent special:desktop,address:$address;"
done
hyprctl --batch "$CMDS"
echo -e "$TMP_ADDRESS" | sed -e '/^$/d' > "$TMP_FILE-$CURRENT_WORKSPACE"
fi
```
then bind it:
```ini
bind = $mainMod , D, exec, <PATH TO SCRIPT>
```
## Minimize Steam instead of killing
Steam will exit entirely when its last window is closed using the `killactive`
dispatcher. To minimize Steam to tray, use the following script to close
applications:
```sh
if [ "$(hyprctl activewindow -j | jq -r ".class")" = "Steam" ]; then
xdotool getactivewindow windowunmap
else
hyprctl dispatch killactive ""
fi
```
## Shimeji
To use Shimeji programs like
[this](https://codeberg.org/thatonecalculator/spamton-linux-shimeji), set the
following rules:
```ini
windowrule {
name = shimeji
match:class = com-group_finity-mascot-Main
float = true
no_blur = true
no_focus = true
no_shadow = true
border_size = 0
}
```
> [!NOTE]
> The app indicator probably won't show, so you'll have to `killall -9 java` to
> kill them.
![Demo GIF of Spamton Shimeji](https://github.com/hyprwm/hyprland-wiki/assets/36706276/261afd03-bf41-4513-b72b-3483d43d418c)
## Toggle animations/blur/etc hotkey
For increased performance in games, or for less distractions at a keypress
1. create file
`~/.config/hypr/gamemode.sh && chmod +x ~/.config/hypr/gamemode.sh` and add:
```bash
#!/usr/bin/env sh
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
if [ "$HYPRGAMEMODE" = 1 ] ; then
hyprctl --batch "\
keyword animations:enabled 0;\
keyword animation borderangle,0; \
keyword decoration:shadow:enabled 0;\
keyword decoration:blur:enabled 0;\
keyword decoration:fullscreen_opacity 1;\
keyword general:gaps_in 0;\
keyword general:gaps_out 0;\
keyword general:border_size 1;\
keyword decoration:rounding 0"
hyprctl notify 1 5000 "rgb(40a02b)" "Gamemode [ON]"
exit
else
hyprctl notify 1 5000 "rgb(d20f39)" "Gamemode [OFF]"
hyprctl reload
exit 0
fi
exit 1
```
Edit to your liking of course. If animations are enabled, it disables all the
pretty stuff. Otherwise, the script reloads your config to grab your defaults.
2. Add this to your `hyprland.conf`:
```ini
bind = WIN, F1, exec, ~/.config/hypr/gamemode.sh
```
The hotkey toggle will be WIN+F1, but you can change this to whatever you want.
## Zoom
To zoom using Hyprland's built-in zoom utility
> [!WARNING]
> If mouse wheel bindings work only for the first time, you should probably reduce reset time with `binds:scroll_event_delay`
```ini
bind = $mod, mouse_down, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
bind = $mod, mouse_up, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
binde = $mod, equal, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
binde = $mod, minus, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
binde = $mod, KP_ADD, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float * 1.1')
binde = $mod, KP_SUBTRACT, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '(.float * 0.9) | if . < 1 then 1 else . end')
bind = $mod SHIFT, mouse_up, exec, hyprctl -q keyword cursor:zoom_factor 1
bind = $mod SHIFT, mouse_down, exec, hyprctl -q keyword cursor:zoom_factor 1
bind = $mod SHIFT, minus, exec, hyprctl -q keyword cursor:zoom_factor 1
bind = $mod SHIFT, KP_SUBTRACT, exec, hyprctl -q keyword cursor:zoom_factor 1
bind = $mod SHIFT, 0, exec, hyprctl -q keyword cursor:zoom_factor 1
```
## Alt tab behaviour
To mimic DE's alt-tab behaviour. Here is an example that uses foot, fzf, [grim-hyprland](https://github.com/eriedaberrie/grim-hyprland) and chafa to the screenshot in the terminal.
![alttab](https://github.com/user-attachments/assets/2a260809-b1b0-4f72-8644-46cc9d8b8971)
Dependencies :
- foot
- fzf
- [grim-hyprland](https://github.com/eriedaberrie/grim-hyprland)
- chafa
- jq
1. add this to your config
```ini
exec-once = foot --server -c $XDG_CONFIG_HOME/foot/foot.ini
bind = ALT, TAB, exec, $HOME/.config/hypr/scripts/alttab/enable.sh 'down'
bind = ALT SHIFT, TAB, exec, $HOME/.config/hypr/scripts/alttab/enable.sh 'up'
submap=alttab
bind = ALT, tab, sendshortcut, , tab, class:alttab
bind = ALT SHIFT, tab, sendshortcut, shift, tab, class:alttab
bindrt = ALT, ALT_L, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , return,class:alttab
bindrt = ALT SHIFT, ALT_L, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , return,class:alttab
bind = ALT, Return, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , return, class:alttab
bind = ALT SHIFT, Return, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , return, class:alttab
bind = ALT, escape, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , escape,class:alttab
bind = ALT SHIFT, escape, exec, $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh ; hyprctl -q dispatch sendshortcut , escape,class:alttab
submap = reset
workspace = special:alttab, gapsout:0, gapsin:0, bordersize:0
windowrule = match:class alttab, no_anim
windowrule = match:class alttab, stay_focused
windowrule = match:class alttab, workspace special:alttab
windowrule = match:class alttab, border_size 0
```
2. create file `touch $XDG_CONFIG_HOME/hypr/scripts/alttab/alttab.sh && chmod +x $XDG_CONFIG_HOME/hypr/scripts/alttab/alttab.sh` and add:
```bash {filename="alttab.sh"}
#!/usr/bin/env bash
hyprctl -q dispatch submap alttab
start=$1
address=$(hyprctl -j clients | jq -r 'sort_by(.focusHistoryID) | .[] | select(.workspace.id >= 0) | "\(.address)\t\(.title)"' |
fzf --color prompt:green,pointer:green,current-bg:-1,current-fg:green,gutter:-1,border:bright-black,current-hl:red,hl:red \
--cycle \
--sync \
--bind tab:down,shift-tab:up,start:$start,double-click:ignore \
--wrap \
--delimiter=$'\t' \
--with-nth=2 \
--preview "$XDG_CONFIG_HOME/hypr/scripts/alttab/preview.sh {}" \
--preview-window=down:80% \
--layout=reverse |
awk -F"\t" '{print $1}')
if [ -n "$address" ] ; then
echo "$address" > $XDG_RUNTIME_DIR/hypr/alttab/address
fi
hyprctl -q dispatch submap reset
```
I chose to exclude windows that are in special workspaces but it can be modified by removing `select(.workspace.id >= 0)`
3. create file `touch $XDG_CONFIG_HOME/hypr/scripts/alttab/preview.sh && chmod +x $XDG_CONFIG_HOME/hypr/scripts/alttab/preview.sh` and add:
```bash {filename="preview.sh"}
#!/usr/bin/env bash
line="$1"
IFS=$'\t' read -r addr _ <<< "$line"
dim=${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}
grim -t png -l 0 -w "$addr" $XDG_RUNTIME_DIR/hypr/alttab/preview.png
chafa --animate false --dither=none -s "$dim" "$XDG_RUNTIME_DIR/hypr/alttab/preview.png"
```
4. create file `touch $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh && chmod +x $XDG_CONFIG_HOME/hypr/scripts/alttab/disable.sh` and add:
```bash {filename="disable.sh"}
#!/usr/bin/env bash
hyprctl -q keyword animations:enabled true
hyprctl -q --batch "keyword unbind ALT, TAB ; keyword unbind ALT SHIFT, TAB ; keyword bind ALT, TAB, exec, $HOME/.config/hypr/scripts/alttab/enable.sh 'down' ; keyword bind ALT SHIFT, TAB, exec, $HOME/.config/hypr/scripts/alttab/enable.sh 'up'"
```
5. create file `touch $XDG_CONFIG_HOME/hypr/scripts/alttab/enable.sh && chmod +x $XDG_CONFIG_HOME/hypr/scripts/alttab/enable.sh` and add:
```bash {filename="enable.sh"}
#!/usr/bin/env bash
mkdir -p $XDG_RUNTIME_DIR/hypr/alttab
hyprctl -q --batch "keyword animations:enabled false; keyword unbind ALT, TAB ; keyword unbind ALT SHIFT, TAB"
footclient -a alttab $HOME/.config/hypr/scripts/alttab/alttab.sh $1
hyprctl --batch -q "dispatch focuswindow address:$(cat $XDG_RUNTIME_DIR/hypr/alttab/address) ; dispatch alterzorder top"
```
## Config versioning
Some updates add breaking changes, which can be anticipated by looking at the git
development branch.
Since Hyprland 0.53, we export a variable for each major version, that looks like this:
```
$HYPRLAND_V_0_XX
```
You can make your configs conditional, e.g.:
```
# hyprlang if HYPRLAND_V_0_53
someValue = 0.53
# hyprlang endif
# hyprlang if !HYPRLAND_V_0_53
someValue = 0.52
# hyprlang endif
```
The -git branch exports the variable for the next major release.
All future releases will export all _past_ variables as well, e.g. 0.54 will also export 0.53.

View File

@@ -0,0 +1,315 @@
---
weight: 15
title: Using hyprctl
---
`hyprctl` is a utility for controlling some parts of the compositor from a CLI
or a script. It should automatically be installed along with Hyprland.
> [!WARNING]
> _hyprctl_ calls will be dispatched by the compositor _synchronously_, meaning
> any spam of the utility will cause slowdowns. It's recommended to use `--batch`
> for many control calls, and limiting the amount of info calls.
>
> For live event handling, see the [socket2](../../IPC/).
## Commands
### dispatch
Issue a `dispatch` to call a keybind dispatcher with an argument.
An argument has to be present, for dispatchers without parameters it can be
anything.
To pass an argument starting with `-` or `--`, such as command line options
to `exec` programs, pass `--` as an option. This will disable any subsequent
parsing of options by _hyprctl_.
Examples:
```sh
hyprctl dispatch exec kitty
hyprctl dispatch -- exec kitty --single-instance
hyprctl dispatch pseudo x
```
Returns: `ok` on success, an error message on fail.
See [Dispatchers](../Dispatchers) for a list of dispatchers.
### keyword
issue a `keyword` to call a config keyword dynamically.
Examples:
```sh
hyprctl keyword bind SUPER,O,pseudo
hyprctl keyword general:border_size 10
hyprctl keyword monitor DP-3,1920x1080@144,0x0,1
```
Returns: `ok` on success, an error message on fail.
### reload
Issue a `reload` to force reload the config.
### kill
Issue a `kill` to get into a kill mode, where you can kill an app by clicking on
it. You can exit it with ESCAPE.
Kind of like xkill.
### setcursor
Sets the cursor theme and reloads the cursor manager. Will set the theme for
everything except GTK, because GTK.
Please note that since 0.37.0, this only accepts hyprcursor themes. For legacy xcursor themes,
use the `XCURSOR_THEME` and `XCURSOR_SIZE` env vars.
params: theme and size
e.g.:
```sh
hyprctl setcursor Bibata-Modern-Classic 24
```
### output
Allows you to add and remove fake outputs to your preferred backend.
Usage:
```sh
hyprctl output create [backend] (name)
```
or
```sh
hyprctl output remove [name]
```
Where `[backend]` is the name of the backend and `(name)` is an optional name
for the output. If `(name)` is not specified, the default naming scheme will be
used (`HEADLESS-2`, `WL-1`, etc.)
> [!NOTE]
> `create` and `remove` can also be `add` or `destroy`, respectively.
Available backends:
- `wayland`: Creates an output as a Wayland window. This will only work if
you're already running Hyprland with the Wayland backend.
- `headless`: Creates a headless monitor output. If you're running a VNC/RDP/
Sunshine server, you should use this.
- `auto`: Picks a backend for you. For example, if you're running Hyprland from
the TTY, `headless` will be chosen.
For example, to create a headless output named "test":
```sh
hyprctl output create headless test
```
And to remove it:
```sh
hyprctl output remove test
```
### switchxkblayout
Sets the xkb layout index for a keyboard.
For example, if you set:
```ini
device {
name = my-epic-keyboard-v1
kb_layout = us,pl,de
}
```
You can use this command to switch between them.
```sh
hyprctl switchxkblayout [DEVICE] [CMD]
```
where `CMD` is either `next` for next, `prev` for previous, or `ID` for a
specific one (in the above case, `us`: 0, `pl`: 1, `de`: 2). You can find the
`DEVICE` using `hyprctl devices` command.
`DEVICE` can also be `current` or `all`, self-explanatory. Current is the `main` keyboard from `devices`.
Example command for a typical keyboard:
```sh
hyprctl switchxkblayout at-translated-set-2-keyboard next
```
> [!NOTE]
> If you want a single variant i.e. pl/dvorak on one layout but us/qwerty on the
> other, xkb parameters can still be blank, however the amount of comma-separated
> parameters have to match. Alternatively, a single parameter can be specified for
> it to apply to all three.
>
> ```ini
> input {
> kb_layout = pl,us,ru
> kb_variant = dvorak,,
> kb_options = caps:ctrl_modifier
> }
> ```
### seterror
Sets the hyprctl error string. Will reset when Hyprland's config is reloaded.
```sh
hyprctl seterror 'rgba(66ee66ff)' hello world this is my problem
```
To disable:
```sh
hyprctl seterror disable
```
### getprop
Gets a property value of a window.
```sh
hyprctl getprop [window] [property]
```
Where `window` is as described [here](../Dispatchers#parameter-explanation), and `property` is any which can be set with [setprop](../Dispatchers/#setprop).
#### Notes
- If `animationstyle` is unset, `(unset)` is returned.
- `min_size` defaults to `20 20`.
- `max_size` defaults to `inf inf` or `[null,null]` in JSON.
### notify
Sends a notification using the built-in Hyprland notification system.
```sh
hyprctl notify [ICON] [TIME_MS] [COLOR] [MESSAGE]
```
For example:
```sh
hyprctl notify -1 10000 "rgb(ff1ea3)" "Hello everyone!"
```
Icon of `-1` means "No icon"
Color of `0` means "Default color for icon"
Icon list:
```sh
WARNING = 0
INFO = 1
HINT = 2
ERROR = 3
CONFUSED = 4
OK = 5
```
Optionally, you can specify a font size of the notification like so:
```sh
hyprctl notify -1 10000 "rgb(ff0000)" "fontsize:35 This text is big"
```
The default font-size is 13.
### dismissnotify
Dismisses all or up to AMOUNT notifications.
```sh
hyprctl dismissnotify # dismiss all notifications
hyprctl dismissnotify 2 # dismiss the oldest 2 notifications
hyprctl dismissnotify -1 # dismiss all notifications (same as no arguments)
```
## Info
```plain
version - prints the Hyprland version along with flags, commit and branch of build.
monitors - lists active outputs with their properties, 'monitors all' lists active and inactive outputs
workspaces - lists all workspaces with their properties
activeworkspace - gets the active workspace and its properties
workspacerules - gets the list of defined workspace rules
clients - lists all windows with their properties
devices - lists all connected keyboards and mice
decorations [window] - lists all decorations and their info
binds - lists all registered binds
activewindow - gets the active window name and its properties
layers - lists all the layers
splash - prints the current random splash
getoption [option] - gets the config option status (values)
cursorpos - gets the current cursor position in global layout coordinates
animations - gets the currently configured info about animations and beziers
instances - lists all running instances of Hyprland with their info
layouts - lists all layouts available (including from plugins)
configerrors - lists all current config parsing errors
rollinglog - prints tail of the log. Also supports -f/--follow option
locked - prints whether the current session is locked.
descriptions - returns a JSON with all config options, their descriptions and types.
submap - prints the current submap the keybinds are in
```
For the getoption command, the option name should be written as
`section:option`, e.g.:
```sh
hyprctl getoption general:border_size
# For nested sections:
hyprctl getoption input:touchpad:disable_while_typing
```
See [Variables](../Variables) for sections and options you can use.
## Batch
You can also use `--batch` to specify a batch of commands to execute.
e.g.
```sh
hyprctl --batch "keyword general:border_size 2 ; keyword general:gaps_out 20"
```
`;` separates the commands
## Flags
You can specify flags for the request like this:
```sh
hyprctl -j monitors
```
flag list:
```txt
j -> output in JSON
i -> select instance (id or index in hyprctl instances)
```

View File

@@ -0,0 +1,571 @@
---
weight: 2
title: Variables
---
For basic syntax info, see [Configuring Hyprland](..).
This page documents all the "options" of Hyprland. For binds, monitors,
animations, etc. see the sidebar. For anything else, see
[Keywords](../Keywords).
Please keep in mind some options that are layout-specific will be documented in
the layout pages and not here. (See the Sidebar for Dwindle and Master layouts)
## Variable types
| type | description |
| --- | --- |
| int | integer |
| bool | boolean, `true` or `false` (`yes` or `no`, `on` or `off`, `0` or `1`) - any numerical value that is not `0` or `1` will cause undefined behavior. |
| float | floating point number |
| color | color (see hint below for color info) |
| vec2 | vector with 2 float values, separated by a space (e.g. `0 0` or `-10.9 99.1`) |
| MOD | a string modmask (e.g. `SUPER` or `SUPERSHIFT` or `SUPER + SHIFT` or `SUPER and SHIFT` or `CTRL_SHIFT` or empty for none. You are allowed to put any separators you please except for a `,`) |
| str | a string |
| gradient | a gradient, in the form of `color color ... [angle]` where `color` is a color (see above) and angle is an angle in degrees, in the format of `123deg` e.g. `45deg` (e.g. `rgba(11ee11ff) rgba(1111eeff) 45deg`) Angle is optional and will default to `0deg` |
| font_weight | an integer between 100 and 1000, or one of the following presets: `thin` `ultralight` `light` `semilight` `book` `normal` `medium` `semibold` `bold` `ultrabold` `heavy` `ultraheavy` |
> [!NOTE] **Colors**
>
> You have 3 options:
> - rgba(), e.g. `rgba(b3ff1aee)`, or the decimal equivalent `rgba(179,255,26,0.933)`
> (decimal rgba/rgb values should have no spaces between numbers)
> - rgb(), e.g. `rgb(b3ff1a)`, or the decimal equivalent `rgb(179,255,26)`
> - legacy, e.g. `0xeeb3ff1a` -> ARGB order
> [!NOTE] **Mod list**
>
> ```ini
> SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5
> ```
## Sections
### General
| name | description | type | default |
|---|---|---|---|
| border_size | size of the border around windows | int | 1 |
| gaps_in | gaps between windows, also supports css style gaps (top, right, bottom, left -> 5,10,15,20) | int | 5 |
| gaps_out | gaps between windows and monitor edges, also supports css style gaps (top, right, bottom, left -> 5,10,15,20) | int | 20 |
| float_gaps | gaps between windows and monitor edges for floating windows, also supports css style gaps (top, right, bottom, left -> 5 10 15 20). -1 means default | int | 0 |
| gaps_workspaces | gaps between workspaces. Stacks with gaps_out. | int | 0 |
| col.inactive_border | border color for inactive windows | gradient | 0xff444444 |
| col.active_border | border color for the active window | gradient | 0xffffffff |
| col.nogroup_border | inactive border color for window that cannot be added to a group (see `denywindowfromgroup` dispatcher) | gradient | 0xffffaaff |
| col.nogroup_border_active | active border color for window that cannot be added to a group | gradient | 0xffff00ff |
| layout | which layout to use. [dwindle/master] | str | dwindle |
| no_focus_fallback | if true, will not fall back to the next available window when moving focus in a direction where no window was found | bool | false |
| resize_on_border | enables resizing windows by clicking and dragging on borders and gaps | bool | false |
| extend_border_grab_area | extends the area around the border where you can click and drag on, only used when `general:resize_on_border` is on. | int | 15 |
| hover_icon_on_border | show a cursor icon when hovering over borders, only used when `general:resize_on_border` is on. | bool | true |
| allow_tearing | master switch for allowing tearing to occur. See [the Tearing page](../Tearing). | bool | false |
| resize_corner | force floating windows to use a specific corner when being resized (1-4 going clockwise from top left, 0 to disable) | int | 0 |
| modal_parent_blocking | whether parent windows of modals will be interactive | bool | true |
| locale | overrides the system locale (e.g. en_US, es) | str | \[\[Empty\]\] |
#### Snap
_Subcategory `general:snap:`_
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | enable snapping for floating windows | bool | false |
| window_gap | minimum gap in pixels between windows before snapping | int | 10 |
| monitor_gap | minimum gap in pixels between window and monitor edges before snapping | int | 10 |
| border_overlap | if true, windows snap such that only one border's worth of space is between them | bool | false |
| respect_gaps | if true, snapping will respect gaps between windows(set in general:gaps_in) | bool | false |
> [!IMPORTANT]
> A subcategory is a nested category:
>
> ```ini
> general {
> # ...
> # ...
>
> snap {
> # ...
> # ...
> }
> }
> ```
>
> Doing `general:snap {` is **invalid**!
### Decoration
| name | description | type | default |
| --- | --- | --- | --- |
| rounding | rounded corners' radius (in layout px) | int | 0 |
| rounding_power | adjusts the curve used for rounding corners, larger is smoother, 2.0 is a circle, 4.0 is a squircle, 1.0 is a triangular corner. [1.0 - 10.0] | float | 2.0 |
| active_opacity | opacity of active windows. [0.0 - 1.0] | float | 1.0 |
| inactive_opacity | opacity of inactive windows. [0.0 - 1.0] | float | 1.0 |
| fullscreen_opacity | opacity of fullscreen windows. [0.0 - 1.0] | float | 1.0 |
| dim_modal | enables dimming of parents of modal windows | bool | true |
| dim_inactive | enables dimming of inactive windows | bool | false |
| dim_strength | how much inactive windows should be dimmed [0.0 - 1.0] | float | 0.5 |
| dim_special | how much to dim the rest of the screen by when a special workspace is open. [0.0 - 1.0] | float | 0.2 |
| dim_around | how much the `dim_around` window rule should dim by. [0.0 - 1.0] | float | 0.4 |
| screen_shader | a path to a custom shader to be applied at the end of rendering. See `examples/screenShader.frag` for an example. | str | \[\[Empty\]\] |
| border_part_of_window | whether the window border should be a part of the window | bool | true |
#### Blur
_Subcategory `decoration:blur:`_
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | enable kawase window background blur | bool | true |
| size | blur size (distance) | int | 8 |
| passes | the amount of passes to perform | int | 1 |
| ignore_opacity | make the blur layer ignore the opacity of the window | bool | true |
| new_optimizations | whether to enable further optimizations to the blur. Recommended to leave on, as it will massively improve performance. | bool | true |
| xray | if enabled, floating windows will ignore tiled windows in their blur. Only available if new_optimizations is true. Will reduce overhead on floating blur significantly. | bool | false |
| noise | how much noise to apply. [0.0 - 1.0] | float | 0.0117 |
| contrast | contrast modulation for blur. [0.0 - 2.0] | float | 0.8916 |
| brightness | brightness modulation for blur. [0.0 - 2.0] | float | 0.8172 |
| vibrancy | Increase saturation of blurred colors. [0.0 - 1.0] | float | 0.1696 |
| vibrancy_darkness | How strong the effect of `vibrancy` is on dark areas . [0.0 - 1.0] | float | 0.0 |
| special | whether to blur behind the special workspace (note: expensive) | bool | false |
| popups | whether to blur popups (e.g. right-click menus) | bool | false |
| popups_ignorealpha | works like ignore_alpha in layer rules. If pixel opacity is below set value, will not blur. [0.0 - 1.0] | float | 0.2 |
| input_methods | whether to blur input methods (e.g. fcitx5) | bool | false |
| input_methods_ignorealpha | works like ignore_alpha in layer rules. If pixel opacity is below set value, will not blur. [0.0 - 1.0] | float | 0.2 |
> [!NOTE]
> `blur:size` and `blur:passes` have to be at least 1.
>
> Increasing `blur:passes` is necessary to prevent blur looking wrong on higher
> `blur:size` values, but remember that higher `blur:passes` will require more
> strain on the GPU.
#### Shadow
_Subcategory `decoration:shadow:`_
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | enable drop shadows on windows | bool | true |
| range | Shadow range ("size") in layout px | int | 4 |
| render_power | in what power to render the falloff (more power, the faster the falloff) [1 - 4] | int | 3 |
| sharp | if enabled, will make the shadows sharp, akin to an infinite render power | bool | false |
| ignore_window | if true, the shadow will not be rendered behind the window itself, only around it. | bool | true |
| color | shadow's color. Alpha dictates shadow's opacity. | color | 0xee1a1a1a |
| color_inactive | inactive shadow color. (if not set, will fall back to color) | color | unset |
| offset | shadow's rendering offset. | vec2 | [0, 0] |
| scale | shadow's scale. [0.0 - 1.0] | float | 1.0 |
### Animations
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | enable animations | bool | true |
| workspace_wraparound | enable workspace wraparound, causing directional workspace animations to animate as if the first and last workspaces were adjacent | bool | false |
> [!NOTE]
> _[More about Animations](../Animations)._
### Input
| name | description | type | default |
|---|---|---|---|
| kb_model | Appropriate XKB keymap parameter. See the note below. | str | \[\[Empty\]\] |
| kb_layout | Appropriate XKB keymap parameter | str | us |
| kb_variant | Appropriate XKB keymap parameter | str | \[\[Empty\]\] |
| kb_options | Appropriate XKB keymap parameter | str | \[\[Empty\]\] |
| kb_rules | Appropriate XKB keymap parameter | str | \[\[Empty\]\] |
| kb_file | If you prefer, you can use a path to your custom .xkb file. | str | \[\[Empty\]\] |
| numlock_by_default | Engage numlock by default. | bool | false |
| resolve_binds_by_sym | Determines how keybinds act when multiple layouts are used. If false, keybinds will always act as if the first specified layout is active. If true, keybinds specified by symbols are activated when you type the respective symbol with the current layout. | bool | false |
| repeat_rate | The repeat rate for held-down keys, in repeats per second. | int | 25 |
| repeat_delay | Delay before a held-down key is repeated, in milliseconds. | int | 600 |
| sensitivity | Sets the mouse input sensitivity. Value is clamped to the range -1.0 to 1.0. [libinput#pointer-acceleration](https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html#pointer-acceleration) | float | 0.0 |
| accel_profile | Sets the cursor acceleration profile. Can be one of `adaptive`, `flat`. Can also be `custom`, see [below](#custom-accel-profiles). Leave empty to use `libinput`'s default mode for your input device. [libinput#pointer-acceleration](https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html#pointer-acceleration) [adaptive/flat/custom]| str | \[\[Empty\]\] |
| force_no_accel | Force no cursor acceleration. This bypasses most of your pointer settings to get as raw of a signal as possible. **Enabling this is not recommended due to potential cursor desynchronization.** | bool | false |
| rotation | Sets the rotation of a device in degrees clockwise off the logical neutral position. Value is clamped to the range 0 to 359. | int | 0 |
| left_handed | Switches RMB and LMB | bool | false |
| scroll_points | Sets the scroll acceleration profile, when `accel_profile` is set to `custom`. Has to be in the form `<step> <points>`. Leave empty to have a flat scroll curve. | str | \[\[Empty\]\] |
| scroll_method | Sets the scroll method. Can be one of `2fg` (2 fingers), `edge`, `on_button_down`, `no_scroll`. [libinput#scrolling](https://wayland.freedesktop.org/libinput/doc/latest/scrolling.html) [2fg/edge/on_button_down/no_scroll] | str | \[\[Empty\]\] |
| scroll_button | Sets the scroll button. Has to be an int, cannot be a string. Check `wev` if you have any doubts regarding the ID. 0 means default. | int | 0 |
| scroll_button_lock | If the scroll button lock is enabled, the button does not need to be held down. Pressing and releasing the button toggles the button lock, which logically holds the button down or releases it. While the button is logically held down, motion events are converted to scroll events. | bool | false |
| scroll_factor | Multiplier added to scroll movement for external mice. Note that there is a separate setting for [touchpad scroll_factor](#touchpad). | float | 1.0 |
| natural_scroll | Inverts scrolling direction. When enabled, scrolling moves content directly, rather than manipulating a scrollbar. | bool | false |
| follow_mouse | Specify if and how cursor movement should affect window focus. See the note below. [0/1/2/3] | int | 1 |
| follow_mouse_threshold | The smallest distance in logical pixels the mouse needs to travel for the window under it to get focused. Works only with follow_mouse = 1. | float | 0.0 |
| focus_on_close | Controls the window focus behavior when a window is closed. When set to 0, focus will shift to the next window candidate. When set to 1, focus will shift to the window under the cursor. [0/1] | int | 0 |
| mouse_refocus | If disabled, mouse focus won't switch to the hovered window unless the mouse crosses a window boundary when `follow_mouse=1`. | bool | true |
| float_switch_override_focus | If enabled (1 or 2), focus will change to the window under the cursor when changing from tiled-to-floating and vice versa. If 2, focus will also follow mouse on float-to-float switches. | int | 1 |
| special_fallthrough | if enabled, having only floating windows in the special workspace will not block focusing windows in the regular workspace. | bool | false |
| off_window_axis_events | Handles axis events around (gaps/border for tiled, dragarea/border for floated) a focused window. `0` ignores axis events `1` sends out-of-bound coordinates `2` fakes pointer coordinates to the closest point inside the window `3` warps the cursor to the closest point inside the window | int | 1 |
| emulate_discrete_scroll | Emulates discrete scrolling from high resolution scrolling events. `0` disables it, `1` enables handling of non-standard events only, and `2` force enables all scroll wheel events to be handled | int | 1 |
> [!NOTE] **XKB Settings**
>
> You can find a list of models, layouts, variants and options in
> [`/usr/share/X11/xkb/rules/base.lst`](file:///usr/share/X11/xkb/rules/base.lst).
> Alternatively, you can use the `localectl` command to discover what is available
> on your system.
>
> For switchable keyboard configurations, take a look at
> [the uncommon tips & tricks page entry](../Uncommon-tips--tricks/#switchable-keyboard-layouts).
> [!NOTE] **Follow Mouse Cursor**
> - 0 - Cursor movement will not change focus.
> - 1 - Cursor movement will always change focus to the window under the cursor.
> - 2 - Cursor focus will be detached from keyboard focus. Clicking on a window
> will move keyboard focus to that window.
> - 3 - Cursor focus will be completely separate from keyboard focus. Clicking on
> a window will not change keyboard focus.
> [!NOTE] **Custom Accel Profiles**
>
> #### `accel_profile`
>
> `custom <step> <points...>`
>
> Example: `custom 200 0.0 0.5`
>
> #### `scroll_points`
>
> NOTE: Only works when `accel_profile` is set to `custom`.
>
> `<step> <points...>`
>
> Example: `0.2 0.0 0.5 1 1.2 1.5`
>
> To mimic the Windows acceleration curves, take a look at
> [this script](https://gist.github.com/fufexan/de2099bc3086f3a6c83d61fc1fcc06c9).
>
> See
> [the libinput doc](https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html)
> for more insights on how it works.
#### Touchpad
_Subcategory `input:touchpad:`_
| name | description | type | default |
| --- | --- | --- | --- |
| disable_while_typing | Disable the touchpad while typing. | bool | true |
| natural_scroll | Inverts scrolling direction. When enabled, scrolling moves content directly, rather than manipulating a scrollbar. | bool | false |
| scroll_factor | Multiplier applied to the amount of scroll movement. | float | 1.0 |
| middle_button_emulation | Sending LMB and RMB simultaneously will be interpreted as a middle click. This disables any touchpad area that would normally send a middle click based on location. [libinput#middle-button-emulation](https://wayland.freedesktop.org/libinput/doc/latest/middle-button-emulation.html) | bool | false |
| tap_button_map | Sets the tap button mapping for touchpad button emulation. Can be one of `lrm` (default) or `lmr` (Left, Middle, Right Buttons). [lrm/lmr] | str | \[\[Empty\]\] |
| clickfinger_behavior | Button presses with 1, 2, or 3 fingers will be mapped to LMB, RMB, and MMB respectively. This disables interpretation of clicks based on location on the touchpad. [libinput#clickfinger-behavior](https://wayland.freedesktop.org/libinput/doc/latest/clickpad-softbuttons.html#clickfinger-behavior) | bool | false |
| tap-to-click | Tapping on the touchpad with 1, 2, or 3 fingers will send LMB, RMB, and MMB respectively. | bool | true |
| drag_lock | When enabled, lifting the finger off while dragging will not drop the dragged item. 0 -> disabled, 1 -> enabled with timeout, 2 -> enabled sticky. [libinput#tap-and-drag](https://wayland.freedesktop.org/libinput/doc/latest/tapping.html#tap-and-drag) | int | 0 |
| tap-and-drag | Sets the tap and drag mode for the touchpad | bool | true |
| flip_x | inverts the horizontal movement of the touchpad | bool | false |
| flip_y | inverts the vertical movement of the touchpad | bool | false |
| drag_3fg | enables three finger drag, 0 -> disabled, 1 -> 3 fingers, 2 -> 4 fingers [libinput#drag-3fg](https://wayland.freedesktop.org/libinput/doc/latest/drag-3fg.html) | int | 0 |
#### Touchdevice
_Subcategory `input:touchdevice:`_
| name | description | type | default |
| --- | --- | --- | --- |
| transform | Transform the input from touchdevices. The possible transformations are the same as [those of the monitors](../Monitors/#rotating). `-1` means it's unset. | int | -1 |
| output | The monitor to bind touch devices. The default is auto-detection. To stop auto-detection, use an empty string or the "\[\[Empty\]\]" value. | string | \[\[Auto\]\] |
| enabled | Whether input is enabled for touch devices. | bool | true |
#### Virtualkeyboard
_Subcategory `input:virtualkeyboard:`_
| name | description | type | default |
| --- | --- | --- | --- |
| share_states | Unify key down states and modifier states with other keyboards. 0 -> no, 1 -> yes, 2 -> yes unless IME client | int | 2 |
| release_pressed_on_close | Release all pressed keys by virtual keyboard on close. | bool | false |
#### Tablet
_Subcategory `input:tablet:`_
| name | description | type | default |
| --- | --- | --- | --- |
| transform | transform the input from tablets. The possible transformations are the same as [those of the monitors](../Monitors/#rotating). `-1` means it's unset. | int | -1 |
| output | the monitor to bind tablets. Can be `current` or a monitor name. Leave empty to map across all monitors. | string | \[\[Empty\]\] |
| region_position | position of the mapped region in monitor layout relative to the top left corner of the bound monitor or all monitors. | vec2 | [0, 0] |
| absolute_region_position | whether to treat the `region_position` as an absolute position in monitor layout. Only applies when `output` is empty. | bool | false |
| region_size | size of the mapped region. When this variable is set, tablet input will be mapped to the region. [0, 0] or invalid size means unset. | vec2 | [0, 0] |
| relative_input | whether the input should be relative | bool | false |
| left_handed | if enabled, the tablet will be rotated 180 degrees | bool | false |
| active_area_size | size of tablet's active area in mm | vec2 | [0, 0] |
| active_area_position | position of the active area in mm | vec2 | [0, 0] |
### Per-device input config
Described [here](../Keywords#per-device-input-configs).
### Gestures
_Subcategory `gestures:`_
| name | description | type | default |
| --- | --- | --- | --- |
| workspace_swipe_distance | in px, the distance of the touchpad gesture | int | 300 |
| workspace_swipe_touch | enable workspace swiping from the edge of a touchscreen | bool | false |
| workspace_swipe_invert | invert the direction (touchpad only) | bool | true |
| workspace_swipe_touch_invert | invert the direction (touchscreen only) | bool | false |
| workspace_swipe_min_speed_to_force | minimum speed in px per timepoint to force the change ignoring `cancel_ratio`. Setting to `0` will disable this mechanic. | int | 30 |
| workspace_swipe_cancel_ratio | how much the swipe has to proceed in order to commence it. (0.7 -> if > 0.7 * distance, switch, if less, revert) [0.0 - 1.0] | float | 0.5 |
| workspace_swipe_create_new | whether a swipe right on the last workspace should create a new one. | bool | true |
| workspace_swipe_direction_lock | if enabled, switching direction will be locked when you swipe past the `direction_lock_threshold` (touchpad only). | bool | true |
| workspace_swipe_direction_lock_threshold | in px, the distance to swipe before direction lock activates (touchpad only). | int | 10 |
| workspace_swipe_forever | if enabled, swiping will not clamp at the neighboring workspaces but continue to the further ones. | bool | false |
| workspace_swipe_use_r | if enabled, swiping will use the `r` prefix instead of the `m` prefix for finding workspaces. | bool | false |
| close_max_timeout | the timeout for a window to close when using a 1:1 gesture, in ms | int | 1000 |
> [!NOTE]
> `workspace_swipe`, `workspace_swipe_fingers` and `workspace_swipe_min_fingers` were removed in favor of the new gestures system.
>
> You can add this gesture config to replicate the swiping functionality with 3 fingers. See the [gestures](../Gestures) page for more info.
>
> ```ini
> gesture = 3, horizontal, workspace
> ```
### Group
_Subcategory `group:`_
| name | description | type | default |
| --- | --- | --- | --- |
| auto_group | whether new windows will be automatically grouped into the focused unlocked group. Note: if you want to disable auto_group only for specific windows, use [the "group barred" window rule](../Window-Rules/#group-window-rule-options) instead. | bool | true |
| insert_after_current | whether new windows in a group spawn after current or at group tail | bool | true |
| focus_removed_window | whether Hyprland should focus on the window that has just been moved out of the group | bool | true |
| drag_into_group | whether dragging a window into a unlocked group will merge them. Options: 0 (disabled), 1 (enabled), 2 (only when dragging into the groupbar) | int | 1 |
| merge_groups_on_drag | whether window groups can be dragged into other groups | bool | true |
| merge_groups_on_groupbar | whether one group will be merged with another when dragged into its groupbar | bool | true |
| merge_floated_into_tiled_on_groupbar | whether dragging a floating window into a tiled window groupbar will merge them | bool | false |
| group_on_movetoworkspace | whether using movetoworkspace[silent] will merge the window into the workspace's solitary unlocked group | bool | false |
| col.border_active | active group border color | gradient | 0x66ffff00 |
| col.border_inactive | inactive (out of focus) group border color | gradient | 0x66777700 |
| col.border_locked_active | active locked group border color | gradient | 0x66ff5500 |
| col.border_locked_inactive | inactive locked group border color | gradient | 0x66775500 |
#### Groupbar
_Subcategory `group:groupbar:`_
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | enables groupbars | bool | true |
| font_family | font used to display groupbar titles, use `misc:font_family` if not specified | string | [\[Empty]] |
| font_size | font size of groupbar title | int | 8 |
| font_weight_active | font weight of active groupbar title | font_weight | normal |
| font_weight_inactive | font weight of inactive groupbar title | font_weight | normal |
| gradients | enables gradients | bool | false |
| height | height of the groupbar | int | 14 |
| indicator_gap | height of gap between groupbar indicator and title | int | 0 |
| indicator_height | height of the groupbar indicator | int | 3 |
| stacked | render the groupbar as a vertical stack | bool | false |
| priority | sets the decoration priority for groupbars | int | 3 |
| render_titles | whether to render titles in the group bar decoration | bool | true |
| text_offset | adjust vertical position for titles | int | 0 |
| scrolling | whether scrolling in the groupbar changes group active window | bool | true |
| rounding | how much to round the indicator | int | 1 |
| rounding_power | adjusts the curve used for rounding groupbar corners, larger is smoother, 2.0 is a circle, 4.0 is a squircle, 1.0 is a triangular corner. [1.0 - 10.0] | float | 2.0 |
| gradient_rounding | how much to round the gradients | int | 2 |
| gradient_rounding_power | adjusts the curve used for rounding gradient corners, larger is smoother, 2.0 is a circle, 4.0 is a squircle, 1.0 is a triangular corner. [1.0 - 10.0] | float | 2.0 |
| round_only_edges | round only the indicator edges of the entire groupbar | bool | true |
| gradient_round_only_edges | round only the gradient edges of the entire groupbar | bool | true |
| text_color | color for window titles in the groupbar | color | 0xffffffff |
| text_color_inactive | color for inactive windows' titles in the groupbar (if unset, defaults to text_color) | color | unset |
| text_color_locked_active | color for the active window's title in a locked group (if unset, defaults to text_color) | color | unset |
| text_color_locked_inactive | color for inactive windows' titles in locked groups (if unset, defaults to text_color_inactive) | color | unset |
| col.active | active group bar background color | gradient | 0x66ffff00 |
| col.inactive | inactive (out of focus) group bar background color | gradient | 0x66777700 |
| col.locked_active | active locked group bar background color | gradient | 0x66ff5500 |
| col.locked_inactive | inactive locked group bar background color | gradient | 0x66775500 |
| gaps_in | gap size between gradients | int | 2 |
| gaps_out | gap size between gradients and window | int | 2 |
| keep_upper_gap | add or remove upper gap | bool | true |
| blur | applies blur to the groupbar indicators and gradients | bool | false |
### Misc
_Subcategory `misc:`_
| name | description | type | default |
|---|---|---|---|
| disable_hyprland_logo | disables the random Hyprland logo / anime girl background. :( | bool | false |
| disable_splash_rendering | disables the Hyprland splash rendering. (requires a monitor reload to take effect) | bool | false |
| disable_scale_notification | disables notification popup when a monitor fails to set a suitable scale | bool | false |
| col.splash | Changes the color of the splash text (requires a monitor reload to take effect). | color | 0xffffffff |
| font_family | Set the global default font to render the text including debug fps/notification, config error messages and etc., selected from system fonts. | string | Sans |
| splash_font_family | Changes the font used to render the splash text, selected from system fonts (requires a monitor reload to take effect). | string | [\[Empty]] |
| force_default_wallpaper | Enforce any of the 3 default wallpapers. Setting this to `0` or `1` disables the anime background. `-1` means "random". [-1/0/1/2] | int | -1 |
| vfr | controls the VFR status of Hyprland. Heavily recommended to leave enabled to conserve resources. | bool | true |
| vrr | controls the VRR (Adaptive Sync) of your monitors. 0 - off, 1 - on, 2 - fullscreen only, 3 - fullscreen with `video` or `game` content type [0/1/2/3] | int | 0 |
| mouse_move_enables_dpms | If DPMS is set to off, wake up the monitors if the mouse moves. | bool | false |
| key_press_enables_dpms | If DPMS is set to off, wake up the monitors if a key is pressed. | bool | false |
| name_vk_after_proc | Name virtual keyboards after the processes that create them. E.g. /usr/bin/fcitx5 will have hl-virtual-keyboard-fcitx5. | bool | true |
| always_follow_on_dnd | Will make mouse focus follow the mouse when drag and dropping. Recommended to leave it enabled, especially for people using focus follows mouse at 0. | bool | true |
| layers_hog_keyboard_focus | If true, will make keyboard-interactive layers keep their focus on mouse move (e.g. wofi, bemenu) | bool | true |
| animate_manual_resizes | If true, will animate manual window resizes/moves | bool | false |
| animate_mouse_windowdragging | If true, will animate windows being dragged by mouse, note that this can cause weird behavior on some curves | bool | false |
| disable_autoreload | If true, the config will not reload automatically on save, and instead needs to be reloaded with `hyprctl reload`. Might save on battery. | bool | false |
| enable_swallow | Enable window swallowing | bool | false |
| swallow_regex | The _class_ regex to be used for windows that should be swallowed (usually, a terminal). To know more about the list of regex which can be used [use this cheatsheet](https://github.com/ziishaned/learn-regex/blob/master/README.md). | str | \[\[Empty\]\] |
| swallow_exception_regex | The _title_ regex to be used for windows that should _not_ be swallowed by the windows specified in swallow_regex (e.g. wev). The regex is matched against the parent (e.g. Kitty) window's title on the assumption that it changes to whatever process it's running. | str | \[\[Empty\]\] |
| focus_on_activate | Whether Hyprland should focus an app that requests to be focused (an `activate` request) | bool | false |
| mouse_move_focuses_monitor | Whether mouse moving into a different monitor should focus it | bool | true |
| allow_session_lock_restore | if true, will allow you to restart a lockscreen app in case it crashes | bool | false |
| session_lock_xray | if true, keep rendering workspaces below your lockscreen | bool | false |
| background_color | change the background color. (requires enabled `disable_hyprland_logo`) | color | 0x111111 |
| close_special_on_empty | close the special workspace if the last window is removed | bool | true |
| on_focus_under_fullscreen | if there is a fullscreen or maximized window, decide whether a tiled window requested to focus should replace it, stay behind or disable the fullscreen/maximized state. 0 - ignore focus request (keep focus on fullscreen window), 1 - takes over, 2 - unfullscreen/unmaximize [0/1/2] | int | 2 |
| exit_window_retains_fullscreen | if true, closing a fullscreen window makes the next focused window fullscreen | bool | false |
| initial_workspace_tracking | if enabled, windows will open on the workspace they were invoked on. 0 - disabled, 1 - single-shot, 2 - persistent (all children too) | int | 1 |
| middle_click_paste | whether to enable middle-click-paste (aka primary selection) | bool | true |
| render_unfocused_fps | the maximum limit for render_unfocused windows' fps in the background (see also [Window-Rules](../Window-Rules/#dynamic-effects) - `render_unfocused`)| int | 15 |
| disable_xdg_env_checks | disable the warning if XDG environment is externally managed | bool | false |
| disable_hyprland_qtutils_check | disable the warning if hyprland-qtutils is not installed | bool | false |
| lockdead_screen_delay | delay after which the "lockdead" screen will appear in case a lockscreen app fails to cover all the outputs (5 seconds max) | int | 1000 |
| enable_anr_dialog | whether to enable the ANR (app not responding) dialog when your apps hang | bool | true |
| anr_missed_pings | number of missed pings before showing the ANR dialog | int | 5 |
| size_limits_tiled | whether to apply min_size and max_size rules to tiled windows | bool | false |
| disable_watchdog_warning | whether to disable the warning about not using start-hyprland | bool | false |
### Binds
_Subcategory `binds:`_
| name | description | type | default |
| --- | --- | --- | --- |
| pass_mouse_when_bound | if disabled, will not pass the mouse events to apps / dragging windows around if a keybind has been triggered. | bool | false |
| scroll_event_delay | in ms, how many ms to wait after a scroll event to allow passing another one for the binds. | int | 300 |
| workspace_back_and_forth | If enabled, an attempt to switch to the currently focused workspace will instead switch to the previous workspace. Akin to i3's _auto_back_and_forth_. | bool | false |
| hide_special_on_workspace_change | If enabled, changing the active workspace (including to itself) will hide the special workspace on the monitor where the newly active workspace resides. | bool | false |
| allow_workspace_cycles | If enabled, workspaces don't forget their previous workspace, so cycles can be created by switching to the first workspace in a sequence, then endlessly going to the previous workspace. | bool | false |
| workspace_center_on | Whether switching workspaces should center the cursor on the workspace (0) or on the last active window for that workspace (1) | int | 0 |
| focus_preferred_method | sets the preferred focus finding method when using `focuswindow`/`movewindow`/etc with a direction. 0 - history (recent have priority), 1 - length (longer shared edges have priority) | int | 0 |
| ignore_group_lock | If enabled, dispatchers like `moveintogroup`, `moveoutofgroup` and `movewindoworgroup` will ignore lock per group. | bool | false |
| movefocus_cycles_fullscreen | If enabled, when on a fullscreen window, `movefocus` will cycle fullscreen, if not, it will move the focus in a direction. | bool | false |
| movefocus_cycles_groupfirst | If enabled, when in a grouped window, movefocus will cycle windows in the groups first, then at each ends of tabs, it'll move on to other windows/groups | bool | false |
| disable_keybind_grabbing | If enabled, apps that request keybinds to be disabled (e.g. VMs) will not be able to do so. | bool | false |
| window_direction_monitor_fallback | If enabled, moving a window or focus over the edge of a monitor with a direction will move it to the next monitor in that direction. | bool | true |
| allow_pin_fullscreen | If enabled, Allow fullscreen to pinned windows, and restore their pinned status afterwards | bool | false |
| drag_threshold | Movement threshold in pixels for window dragging and c/g bind flags. 0 to disable and grab on mousedown. | int | 0 |
### XWayland
_Subcategory `xwayland:`_
| name | description | type | default |
| --- | --- | --- | --- |
| enabled | allow running applications using X11 | bool | true |
| use_nearest_neighbor | uses the nearest neighbor filtering for xwayland apps, making them pixelated rather than blurry | bool | true |
| force_zero_scaling | forces a scale of 1 on xwayland windows on scaled displays. | bool | false |
| create_abstract_socket | Create the [abstract Unix domain socket](../XWayland/#abstract-unix-domain-socket) for XWayland connections. (XWayland restart is required for changes to take effect; Linux only) | bool | false |
### OpenGL
_Subcategory `opengl:`_
| name | description | type | default |
| --- | --- | --- | --- |
| nvidia_anti_flicker | reduces flickering on nvidia at the cost of possible frame drops on lower-end GPUs. On non-nvidia, this is ignored. | bool | true |
### Render
_Subcategory `render:`_
| name | description | type | default |
| --- | --- | --- | --- |
| direct_scanout | Enables direct scanout. Direct scanout attempts to reduce lag when there is only one fullscreen application on a screen (e.g. game). It is also recommended to set this to false if the fullscreen application shows graphical glitches. 0 - off, 1 - on, 2 - auto (on with content type 'game') | int | 0 |
| expand_undersized_textures | Whether to expand undersized textures along the edge, or rather stretch the entire texture. | bool | true |
| xp_mode | Disables back buffer and bottom layer rendering. | bool | false |
| ctm_animation | Whether to enable a fade animation for CTM changes (hyprsunset). 2 means "auto" which disables them on Nvidia. | int | 2 |
| cm_fs_passthrough | Passthrough color settings for fullscreen apps when possible. 0 - off, 1 - always, 2 - hdr only | int | 2 |
| cm_enabled | Whether the color management pipeline should be enabled or not (requires a restart of Hyprland to fully take effect) | bool | true |
| send_content_type | Report content type to allow monitor profile autoswitch (may result in a black screen during the switch) | bool | true |
| cm_auto_hdr | Auto-switch to HDR in fullscreen when needed. 0 - off, 1 - switch to `cm, hdr`, 2 - switch to `cm, hdredid` | int | 1 |
| new_render_scheduling | Automatically uses triple buffering when needed, improves FPS on underpowered devices. | bool | false |
| non_shader_cm | Enable CM without shader. 0 - disable, 1 - whenever possible, 2 - DS and passthrough only, 3 - disable and ignore CM issues | int | 3 |
| cm_sdr_eotf | Default transfer function for displaying SDR apps. 0 - Default (currently gamma22), 1 - Treat unspecified as Gamma 2.2, 2 - Treat unspecified and sRGB as Gamma 2.2, 3 - Treat unspecified as sRGB (previous default) | int | 0 |
`cm_auto_hdr` requires `--target-colorspace-hint-mode=source` mpv option to work with mpv versions greater than v0.40.0
### Cursor
_Subcategory `cursor:`_
| name | description | type | default |
| --- | --- | --- | --- |
| invisible | don't render cursors | bool | false |
| sync_gsettings_theme | sync xcursor theme with gsettings, it applies cursor-theme and cursor-size on theme load to gsettings making most CSD gtk based clients use same xcursor theme and size. | bool | true |
| no_hardware_cursors | disables hardware cursors. 0 - use hw cursors if possible, 1 - don't use hw cursors, 2 - auto (disable when tearing) | int | 2 |
| no_break_fs_vrr | disables scheduling new frames on cursor movement for fullscreen apps with VRR enabled to avoid framerate spikes (may require no_hardware_cursors = true) 0 - off, 1 - on, 2 - auto (on with content type 'game') | int | 2 |
| min_refresh_rate | minimum refresh rate for cursor movement when `no_break_fs_vrr` is active. Set to minimum supported refresh rate or higher | int | 24 |
| hotspot_padding | the padding, in logical px, between screen edges and the cursor | int | 1 |
| inactive_timeout | in seconds, after how many seconds of cursor's inactivity to hide it. Set to `0` for never. | float | 0 |
| no_warps | if true, will not warp the cursor in many cases (focusing, keybinds, etc) | bool | false |
| persistent_warps | When a window is refocused, the cursor returns to its last position relative to that window, rather than to the centre. | bool | false |
| warp_on_change_workspace | Move the cursor to the last focused window after changing the workspace. Options: 0 (Disabled), 1 (Enabled), 2 (Force - ignores cursor:no_warps option) | int | 0 |
| warp_on_toggle_special | Move the cursor to the last focused window when toggling a special workspace. Options: 0 (Disabled), 1 (Enabled), 2 (Force - ignores cursor:no_warps option) | int | 0 |
| default_monitor | the name of a default monitor for the cursor to be set to on startup (see `hyprctl monitors` for names) | str | [[EMPTY]] |
| zoom_factor | the factor to zoom by around the cursor. Like a magnifying glass. Minimum 1.0 (meaning no zoom) | float | 1.0 |
| zoom_rigid | whether the zoom should follow the cursor rigidly (cursor is always centered if it can be) or loosely | bool | false |
| zoom_detached_camera | detach the camera from the mouse when zoomed in, only ever moving the camera to keep the mouse in view when it goes past the screen edges | bool | true |
| enable_hyprcursor | whether to enable hyprcursor support | bool | true |
| hide_on_key_press | Hides the cursor when you press any key until the mouse is moved. | bool | false |
| hide_on_touch | Hides the cursor when the last input was a touch input until a mouse input is done. | bool | true |
| hide_on_tablet | Hides the cursor when the last input was a tablet input until a mouse input is done. | bool | true |
| use_cpu_buffer | Makes HW cursors use a CPU buffer. Required on Nvidia to have HW cursors. 0 - off, 1 - on, 2 - auto (nvidia only) | int | 2 |
| warp_back_after_non_mouse_input | Warp the cursor back to where it was after using a non-mouse input to move it, and then returning back to mouse. | bool | false |
| zoom_disable_aa | disable antialiasing when zooming, which means things will be pixelated instead of blurry | bool | false |
### Ecosystem
_Subcategory `ecosystem:`_
| name | description | type | default |
| --- | --- | --- | --- |
| no_update_news | disable the popup that shows up when you update hyprland to a new version. | bool | false |
| no_donation_nag | disable the popup that shows up twice a year encouraging to donate. | bool | false |
| enforce_permissions | whether to enable [permission control](../Permissions). | bool | false |
### Quirks
_Subcategory `quirks:`_
| name | description | type | default |
| --- | --- | --- | --- |
| prefer_hdr | Report HDR mode as preferred. 0 - off, 1 - always, 2 - gamescope only | int | 0 |
Some clients expect monitor to be in HDR mode prior to the client start. This breaks auto HDR activation and can cause whitescreen and flickering. Use `prefer_hdr` to fix it,
### Debug
_Subcategory `debug:`_
> [!WARNING]
> Only for developers.
| name | description | type | default |
| --- | --- | --- | --- |
| overlay | print the debug performance overlay. Disable VFR for accurate results. | bool | false |
| damage_blink | (epilepsy warning!) flash areas updated with damage tracking | bool | false |
| disable_logs | disable logging to a file | bool | true |
| disable_time | disables time logging | bool | true |
| damage_tracking | redraw only the needed bits of the display. Do **not** change. (default: full - 2) monitor - 1, none - 0 | int | 2 |
| enable_stdout_logs | enables logging to stdout | bool | false |
| manual_crash | set to 1 and then back to 0 to crash Hyprland. | int | 0 |
| suppress_errors | if true, do not display config file parsing errors. | bool | false |
| watchdog_timeout | sets the timeout in seconds for watchdog to abort processing of a signal of the main thread. Set to 0 to disable. | int | 5 |
| disable_scale_checks | disables verification of the scale factors. Will result in pixel alignment and rounding errors. | bool | false |
| error_limit | limits the number of displayed config file parsing errors. | int | 5 |
| error_position | sets the position of the error bar. top - 0, bottom - 1 | int | 0 |
| colored_stdout_logs | enables colors in the stdout logs. | bool | true |
| pass | enables render pass debugging. | bool | false |
| full_cm_proto | claims support for all cm proto features (requires restart) | bool | false |
### More
There are more config options described in other pages, which are layout- or
circumstance-specific. See the sidebar for more pages.

View File

@@ -0,0 +1,348 @@
---
weight: 7
title: Window Rules
---
> [!WARNING]
> Rules are evaluated top to bottom, so the order they're written in does matter!
> More info in [Notes](#notes)
## Window Rules
You can set window rules to achieve different window behaviors based
on their properties.
### Syntax
Basic named rule syntax:
```ini
windowrule {
name = apply-something
match:class = my-window
border_size = 10
}
```
Basic anonymous rule syntax:
```ini
windowrule = match:class my-window, border_size 10
```
Rules are split into two categories of parameters: _props_ and _effects_. Props
are the `match:` parts, which are used to determine if a window should get the
rule. Effects are what is applied.
_All_ props must match for a rule to be applied.
You can have as many props and effects per rule as you please, in any order as you please, as long as:
- there is only one of one type (e.g. specifying `match:class` twice is invalid)
- there is at least one _prop_
### Props
The supported fields for props are:
| Field | Argument | Description |
| -------------- | --------------- | --- |
| match:class | \[RegEx\] | Windows with `class` matching `RegEx`. |
| match:title | \[RegEx\] | Windows with `title` matching `RegEx`. |
| match:initial_class | \[RegEx\] | Windows with `initialClass` matching `RegEx`. |
| match:initial_title |\[RegEx\] | Windows with `initialTitle` matching `RegEx`. |
| match:tag | \[name\] | Windows with matching `tag`. |
| match:xwayland | \[bool\] | Xwayland windows. |
| match:float | \[bool\] | Floating windows. |
| match:fullscreen | \[bool\] | Fullscreen windows. |
| match:pin | \[bool\] | Pinned windows. |
| match:focus | \[bool\] | Currently focused window. |
| match:group | \[bool\] | Grouped windows. |
| match:modal | \[bool\] | Modal windows (e.g. "Are you sure" popups) |
| match:fullscreen_state_client | \[client\] | Windows with matching `fullscreenstate`. `client` can be `0` - none, `1` - maximize, `2` - fullscreen, `3` - maximize and fullscreen. |
| match:fullscreen_state_internal | \[internal\] | Windows with matching `fullscreenstate`. `internal` can be `0` - none, `1` - maximize, `2` - fullscreen, `3` - maximize and fullscreen. |
| match:workspace | \[workspace\] | Windows on matching workspace. `w` can be `id`, `name:string` or `workspace selector`. |
| match:content | \[int\] | Windows with specified content type (none = 0, photo = 1, video = 2, game = 3) |
| match:xdg_tag | \[RegEx\] | Match a window by its xdgTag (see `hyprctl clients` to check if it has one) |
Keep in mind that you _have_ to declare at least one field, but not all.
> [!NOTE]
> To get more information about a window's class, title, XWayland status or its
> size, you can use `hyprctl clients`.
> [!NOTE]
> In the output of the `hyprctl clients` command:
> `fullscreen` refers to `fullscreen_state_internal` and
> `fullscreenClient` refers to `fullscreen_state_client`
### RegEx writing
Please note Hyprland uses [Google's RE2](https://github.com/google/re2) for parsing RegEx. This means that all operations requiring polynomial
time to compute will not work. See the [RE2 wiki](https://github.com/google/re2/wiki/Syntax) for supported extensions.
If you want to _negate_ a RegEx, as in pass only when the RegEx _fails_, you can prefix it with `negative:`, e.g.: `negative:kitty`.
## Effects
### Static effects
Static effects are evaluated once when the window is opened and never again. This essentially means that it is always the `initialTitle` and `initialClass` which will be found when matching on `title` and `class`, respectively.
> [!WARNING]
> It is not possible to `float` (or any other static rule) a window based on a change in the `title` after the window has been created. This applies to all static effects listed here.
| Effect | argument | Description |
| ---- | ----------- | --- |
| float | \[on\] | Floats a window. |
| tile | \[on\] |Tiles a window. |
| fullscreen | \[on\] | Fullscreens a window. |
| maximize | \[on\] | Maximizes a window. |
| fullscreen_state | \[internal\] \[client\] | Sets the focused window's fullscreen mode and the one sent to the client, where internal and client can be `0` - none, `1` - maximize, `2` - fullscreen, `3` - maximize and fullscreen. |
| move | \[expr\] \[expr\] | Moves a floating window to a given coordinate, monitor-local. Two expressions are space-separated. |
| size | \[expr\] \[expr\] | Resizes a floating window to a given size. Two expressions are space-separated. |
| center | \[on\] | If the window is floating, will center it on the monitor. |
| pseudo | \[on\] | Pseudotiles a window. |
| monitor | \[id\] | Sets the monitor on which a window should open. `id` can be either the id number or the name (e.g. `1` or `DP-1`). |
| workspace | \[w\] | Sets the workspace on which a window should open (for workspace syntax, see [dispatchers->workspaces](../Dispatchers#workspaces)). <br> You can also set \[w\] to `unset`. This will unset all previous workspace rules applied to this window. Additionally you can add `silent` after the workspace to make the window open silently. |
| no_initial_focus | \[on\] | Disables the initial focus to the window |
| pin | \[on\] | Pins the window (i.e. show it on all workspaces). _Note: floating only_. |
| group | \[options\] | Sets window group properties. See the note below. |
| suppress_event | \[types...\] | Ignores specific events from the window. Events are space separated, and can be: `fullscreen`, `maximize`, `activate`, `activatefocus`, `fullscreenoutput`. |
| content | \[none\|photo\|video\|game\] | Sets content type. |
| no_close_for | \[ms\] | Makes the window uncloseable with the `killactive` dispatcher for a given amount of ms on open. |
#### Expressions
Expressions are space-separated, so your math cannot have spaces. They are regular, math expressions, with a few variables exposed,
names of which are self-explanatory. All position variables are monitor-local.
- `monitor_w` and `monitor_h` for monitor size
- `window_x` and `window_y` for window position
- `window_w` and `window_h` for window size
- `cursor_x` and `cursor_y` for cursor position
Example expressions:
- `window_w*0.5`
- `(monitor_w/2)+17`
It's probably a good idea to surround your expressions with parentheses for clarity, with space-separation:
- `(monitor_w*0.5) (monitor_h*0.5)`
- `((monitor_w*0.5)+17) (monitor_h*0.2)`
### Dynamic effects
Dynamic effects are re-evaluated every time a property changes.
| Effect | argument | Description |
| ---- | ----------- | --- |
| persistent_size | \[on\] | Allows size persistence between application launches for floating windows. |
| no_max_size | \[on\] | Removes max size limitations. Especially useful with windows that report invalid max sizes (e.g. winecfg). |
| stay_focused | \[on\] | Forces focus on the window as long as it's visible. |
| animation | \[style\] (\[opt\]) | Forces an animation onto a window, with a selected opt. Opt is optional. |
| border_color | \[c\] | Force the border color of the window. <br> Options for c: `color`/`color ... color angle` -> sets the active border color/gradient OR `color color`/`color ... color angle color ... color [angle]` -> sets the active and inactive border color/gradient of the window. See [variables->colors](../Variables#variable-types) for color definition. |
| idle_inhibit | \[mode\] | Sets an idle inhibit rule for the window. If active, apps like `hypridle` will not fire. Modes: `none`, `always`, `focus`, `fullscreen`. |
| opacity | \[a\] | Additional opacity multiplier. Options for a: `float` -> sets an overall opacity, `float float` -> sets active_opacity and inactive_opacity respectively, `float float float` -> sets active_opacity, inactive_opacity and fullscreen_opacity respectively. |
| tag | \[name\] | Applies the tag `name` to the window, use prefix `+`/`-` to set/unset flag, or no prefix to toggle the flag. |
| max_size | \[w\] \[h\] | Sets the maximum size (x,y -> int). Applies to floating windows. (use `misc:size_limits_tiled` to include tiled windows.) |
| min_size | \[w\] \[h\] | Sets the minimum size (x,y -> int). Applies to floating windows. (use `misc:size_limits_tiled` to include tiled windows.) |
| border_size | \[int\] | Sets the border size. |
| rounding | \[int\] | Forces the application to have X pixels of rounding, ignoring the set default (in `decoration:rounding`). Has to be an int. |
| rounding_power | \[float\] | Overrides the rounding power for the window (see `decoration:rounding_power`). |
| allows_input | \[on\] | Forces an XWayland window to receive input, even if it requests not to do so. (Might fix issues like Game Launchers not receiving focus for some reason) |
| dim_around | \[on\] | Dims everything around the window. Please note that this rule is meant for floating windows and using it on tiled ones may result in strange behavior. |
| decorate | \[on\] | (default is _true_) Whether to draw window decorations or not |
| focus_on_activate | \[on\] | Whether Hyprland should focus an app that requests to be focused (an `activate` request). |
| keep_aspect_ratio | \[on\] | Forces aspect ratio when resizing window with the mouse. |
| nearest_neighbor | \[on\] | Forces the window to use [nearest neighbor](https://en.wikipedia.org/wiki/Image_scaling#Nearest-neighbor_interpolation) filtering. |
| no_anim | \[on\] | Disables the animations for the window. |
| no_blur | \[on\] | Disables blur for the window. |
| no_dim | \[on\] | Disables window dimming for the window. |
| no_focus | \[on\] | Disables focus to the window. |
| no_follow_mouse | \[on\] | Prevents the window from being focused when the mouse moves over it when `input:follow_mouse=1` is set. |
| no_shadow | \[on\] | Disables shadows for the window. |
| no_shortcuts_inhibit | \[on\] | Disallows the app from [inhibiting your shortcuts](https://wayland.app/protocols/keyboard-shortcuts-inhibit-unstable-v1). |
| no_screen_share | \[on\] | Hides the window and its popups from screen sharing by drawing black rectangles in their place. The rectangles are drawn even if other windows are above. |
| no_vrr | \[on\] | Disables VRR for the window. Only works when [`misc:vrr`](../Variables/#Misc) is set to `2` or `3`. |
| opaque | \[on\] | Forces the window to be opaque. |
| force_rgbx | \[on\] | Forces Hyprland to ignore the alpha channel on the whole window's surfaces, effectively making it _actually, fully 100% opaque_. |
| sync_fullscreen | \[on\] | Whether the fullscreen mode should always be the same as the one sent to the window (will only take effect on the next fullscreen mode change). |
| immediate | \[on\] | Forces the window to allow tearing. See [the Tearing page](../Tearing). |
| xray | \[on\] | Sets blur xray mode for the window. |
| render_unfocused | \[on\] | Forces the window to think it's being rendered when it's not visible. See also [Variables - Misc](../Variables/#Misc) for setting `render_unfocused_fps`. |
| scroll_mouse | \[float\] | Forces the window to override the variable `input:scroll_factor`. |
| scroll_touchpad | \[float\] | Forces the window to override the variable `input:touchpad:scroll_factor`. |
All dynamic effects can be set with `setprop`, see [`setprop`](../Dispatchers#setprop).
### `group` window rule options
- `set` \[`always`\] - Open window as a group.
- `new` - Shorthand for `barred set`.
- `lock` \[`always`\] - Lock the group that added this window. Use with `set` or
`new` (e.g. `new lock`) to create a new locked group.
- `barred` - Do not automatically group the window into the focused unlocked group.
- `deny` - Do not allow the window to be toggled as or added to group (see `denywindowfromgroup` dispatcher).
- `invade` - Force open window in the locked group.
- `override` \[other options\] - Override other `group` rules, e.g. You can make all windows in a particular workspace open as a group, and use `group override barred` to make windows with specific titles open as normal windows.
- `unset` - Clear all `group` rules.
> [!NOTE]
> The `group` rule without options is a shorthand for `group set`.
>
> By default, `set` and `lock` only affect new windows once. The `always`
> qualifier makes them always effective.
### Tags
Window may have several tags, either static or dynamic. Dynamic tags will have a suffix of `*`.
You may check window tags with `hyprctl clients`.
Use the `tagwindow` dispatcher to add a static tag to a window:
```bash
hyprctl dispatch tagwindow +code # Add tag to current window.
hyprctl dispatch tagwindow -- -code # Remove tag from current window (use `--` to protect the leading `-`).
hyprctl dispatch tagwindow code # Toggle the tag of current window.
# Or you can tag windows matched with a window RegEx:
hyprctl dispatch tagwindow +music deadbeef
hyprctl dispatch tagwindow +media title:Celluloid
```
Use the `tag` rule to add a dynamic tag to a window:
```ini
windowrule = tag +term, match:class footclient # Add dynamic tag `term*` to window footclient.
windowrule = tag term, match:class footclient # Toggle dynamic tag `term*` for window footclient.
windowrule = tag +code, match:tag cpp # Add dynamic tag `code*` to window with tag `cpp`.
windowrule = opacity 0.8, match:tag code # Set opacity for window with tag `code` or `code*`.
windowrule = opacity 0.7, match:tag cpp # Window with tag `cpp` will match both `code` and `cpp`, the last one will override prior match.
windowrule = opacity 0.6, match:tag term* # Set opacity for window with tag `term*` only, `term` will not be matched.
windowrule = tag -code, match:tag term # Remove dynamic tag `code*` for window with tag `term` or `term*`.
```
Or with a keybind for convenience:
```ini
bind = $mod Ctrl, 2, tagwindow, alpha_0.2
bind = $mod Ctrl, 4, tagwindow, alpha_0.4
windowrule = opacity 0.2 override, match:tag alpha_0.2
windowrule = opacity 0.4 override, match:tag alpha_0.4
```
The `tag` rule can only manipulate dynamic tags, and the `tagwindow` dispatcher only works with static tags (i.e. once the dispatcher is called, dynamic tags will be cleared).
### Example Rules
```ini
# Move kitty to 100 100 and add an anim style
windowrule {
name = move-kitty
match:class = kitty
move = 100 100
animation = popin
}
windowrule = no_blur on, match:class firefox # Disable blur for firefox
windowrule = move (cursor_x-(window_w*0.5)) (cursor_y-(window_h*0.5)), match:class kitty # Move kitty to the center of the cursor
windowrule = border_color rgb(FF0000) rgb(880808), match:fullscreen 1 # Set border color to red if window is fullscreen
windowrule = border_color rgb(FFFF00), match:title .*Hyprland.* # Set border color to yellow when title contains Hyprland
windowrule = opacity 1.0 override 0.5 override 0.8 override, match:class kitty # Set opacity to 1.0 active, 0.5 inactive and 0.8 fullscreen for kitty
windowrule = match:class kitty, rounding 10 # Set rounding to 10 for kitty
windowrule = match:class (pinentry-)(.*), stay_focused on # Fix pinentry losing focus
```
### Notes
Effects that are marked as _Dynamic_ will be reevaluated if the matching property
of the window changes.<br>
For instance, if a rule is defined that changes the `border_color` of a window
when it is floating, then the `border_color` will change to the requested color
when it is set to floating, and revert to the default color when it is tiled again.
Effects will be processed from top to bottom, where the _last_ match will take
precedence. i.e.
```ini
windowrule = opacity 0.8 0.8, match:class kitty
windowrule = opacity 0.5 0.5, match:float yes
```
Here, all non-fullscreen kitty windows will have `opacity 0.8`, except if
they are floating. Otherwise, they will have `opacity 0.5`. The rest of the
non-fullscreen floating windows will have `opacity 0.5`.
```ini
windowrule = opacity 0.5 0.5, match:float true
windowrule = opacity 0.8 0.8, match:class kitty
```
Here, all kitty windows will have `opacity 0.8`, even if they are floating.
The rest of the floating windows will have `opacity 0.5`.
> [!NOTE]
> Opacity is a PRODUCT of all opacities by default. For example, setting
> `active_opacity` to `0.5` and `opacity` to `0.5` will result in a total opacity of
> `0.25`. <br>
> You are allowed to set opacities over `1.0`, but any opacity product over `1.0`
> will cause graphical glitches. <br>
> For example, using `0.5 * 2 = 1` is fine, but `0.5 * 4 = 2` will cause graphical glitches. <br>
> You can put `override` after an opacity value to override it to an exact value
> rather than a multiplier.
> For example, to set active and inactive opacity to 0.8, and make fullscreen windows
> fully opaque regardless of other opacity rules:
>
> ```ini
> windowrule = match:class kitty, opacity 0.8 override 0.8 override 1.0 override
> ```
### Dynamically enabling / disabling / changing rules
Only named rules can be dynamically changed, enabled or disabled. Anonymous rules cannot be.
For enabling or disabling, the keyword `enable` is exposed:
```sh
hyprctl keyword 'windowrule[my-rule-name]:enable false'
```
For changing properties, the same syntax can be used:
```sh
hyprctl keyword 'windowrule[my-rule-name]:match:class kitty'
```
_the singlequotes are necessary, otherwise your shell might try to parse the string_
## Layer Rules
Some things in Wayland are not windows, but layers. That includes, for example:
app launchers, status bars, or wallpapers.
Those have specific rules, separate from windows. Their syntax is the exact same,
but they have different props and effects.
### Props
| Field | Argument | Description |
| -------------- | --------------- | --- |
| match:namespace | \[RegEx\] | namespace of the layer, check `hyprctl layers`. |
### Effects
| effect | argument | description |
| ---- | ----------- | --- |
| no_anim | \[on\] | Disables animations. |
| blur | \[on\] | Enables blur for the layer. |
| blur_popups | \[on\] | Enables blur for the popups. |
| ignore_alpha | \[a\] | Makes blur ignore pixels with opacity of `a` or lower. `a` is float value from `0` to `1`. `a = 0` if unspecified. |
| dim_around | \[on\] | Dims everything behind the layer. |
| xray | \[on\] | Sets the blur xray mode for a layer. `0` for off, `1` for on, `unset` for default. |
| animation | \[style\] | Allows you to set a specific animation style for this layer. |
| order | \[n\] | Sets the order relative to other layers. A higher `n` means closer to the edge of the monitor. Can be negative. `n = 0` if unspecified. |
| above_lock | \[0/1/2\] | If non-zero, renders the layer above the lockscreen when the session is locked. If set to `2`, you can interact with the layer on the lockscreen, otherwise it will only be rendered above it. |
| no_screen_share | \[on\] | Hides the layer from screen sharing by drawing a black rectangle over it. |

View File

@@ -0,0 +1,111 @@
---
weight: 8
title: Workspace Rules
---
You can set workspace rules to achieve workspace-specific behaviors. For
instance, you can define a workspace where all windows are drawn without borders
or gaps.
For layout-specific rules, see the specific layout page. For example:
[Master Layout->Workspace Rules](../Master-Layout#workspace-rules).
### Workspace selectors
Workspaces that have already been created can be targeted by workspace
selectors, e.g. `r[2-4] w[t1]`.
Selectors have props separated by a space. No spaces are allowed inside props
themselves.
Props:
- `r[A-B]` - ID range from A to B inclusive
- `s[bool]` - Whether the workspace is special or not
- `n[bool]`, `n[s:string]`, `n[e:string]` - named actions. `n[bool]` ->
whether a workspace is a named workspace, `s` and `e` are starts and ends
with respectively
- `m[monitor]` - Monitor selector
- `w[(flags)A-B]`, `w[(flags)X]` - Prop for window counts on the workspace.
A-B is an inclusive range, X is a specific number. Flags can be omitted.
It can be `t` for tiled-only, `f` for floating-only, `g` to count groups
instead of windows, `v` to count only visible windows, and `p` to count
only pinned windows.
- `f[-1]`, `f[0]`, `f[1]`, `f[2]` - fullscreen state of the workspace. `-1`: no
fullscreen, `0`: fullscreen, `1`: maximized, `2`, fullscreen without
fullscreen state sent to the window.
### Syntax
```ini
workspace = WORKSPACE, RULES
```
- WORKSPACE is a valid workspace identifier (see
[Dispatchers->Workspaces](../Dispatchers#workspaces)). This field is
mandatory. This _can be_ a workspace selector, but please note
workspace selectors can only match _existing_ workspaces.
- RULES is one (or more) rule(s) as described here in [rules](#rules).
### Examples
```ini
workspace = name:myworkspace, gapsin:0, gapsout:0
workspace = 3, rounding:false, bordersize:0
workspace = w[tg1-4], shadow:false
```
#### Smart gaps
To replicate "smart gaps" / "no gaps when only" from other WMs/Compositors, use this bad boy:
```ini
workspace = w[tv1], gapsout:0, gapsin:0
workspace = f[1], gapsout:0, gapsin:0
windowrule = border_size 0, match:float 0, match:workspace w[tv1]
windowrule = rounding 0, match:float 0, match:workspace w[tv1]
windowrule = border_size 0, match:float 0, match:workspace f[1]
windowrule = rounding 0, match:float 0, match:workspace f[1]
```
#### Smart gaps (ignoring special workspaces)
You can combine workspace selectors for more fine-grained control, for example, to ignore special workspaces:
```ini
workspace = w[tv1]s[false], gapsout:0, gapsin:0
workspace = f[1]s[false], gapsout:0, gapsin:0
windowrule = border_size 0, match:float 0, match:workspace w[tv1]s[false]
windowrule = rounding 0, match:float 0, match:workspace w[tv1]s[false]
windowrule = border_size 0, match:float 0, match:workspace f[1]s[false]
windowrule = rounding 0, match:float 0, match:workspace f[1]s[false]
```
## Rules
| Rule | Description | type |
| --- | --- | --- |
| monitor:[m] | Binds a workspace to a monitor. See [syntax](#syntax) and [Monitors](../Monitors). | string |
| default:[b] | Whether this workspace should be the default workspace for the given monitor | bool |
| gapsin:[x] | Set the gaps between windows (equivalent to [General->gaps_in](../Variables#general)) | int |
| gapsout:[x] | Set the gaps between windows and monitor edges (equivalent to [General->gaps_out](../Variables#general)) | int |
| bordersize:[x] | Set the border size around windows (equivalent to [General->border_size](../Variables#general)) | int |
| border:[b] | Whether to draw borders or not | bool |
| shadow:[b] | Whether to draw shadows or not | bool |
| rounding:[b] | Whether to draw rounded windows or not | bool |
| decorate:[b] | Whether to draw window decorations or not | bool |
| persistent:[b] | Keep this workspace alive even if empty and inactive | bool |
| on-created-empty:[c] | A command to be executed once a workspace is created empty (i.e. not created by moving a window to it). See the [command syntax](../Dispatchers#executing-with-rules) | string |
| defaultName:[s] | A default name for the workspace. | string |
### Example Rules
```ini
workspace = 3, rounding:false, decorate:false
workspace = name:coding, rounding:false, decorate:false, gapsin:0, gapsout:0, border:false, monitor:DP-1
workspace = 8,bordersize:8
workspace = name:Hello, monitor:DP-1, default:true
workspace = name:gaming, monitor:desc:Chimei Innolux Corporation 0x150C, default:true
workspace = 5, on-created-empty:[float] firefox
workspace = special:scratchpad, on-created-empty:foot
```

View File

@@ -0,0 +1,54 @@
---
weight: 17
title: XWayland
---
XWayland is the bridging mechanism between legacy Xorg programs and Wayland
compositors.
## HiDPI XWayland
XWayland currently looks pixelated on HiDPI screens, due to Xorg's inability to
scale.
This problem is mitigated by the
[`xwayland:force_zero_scaling`](../Variables/#xwayland) option,
which forces XWayland windows not to be scaled.
This will get rid of the pixelated look, but will not scale applications
properly. To do this, each toolkit has its own mechanism.
```ini
# change monitor to high resolution, the last argument is the scale factor
monitor = , highres, auto, 2
# unscale XWayland
xwayland {
force_zero_scaling = true
}
# toolkit-specific scale
env = GDK_SCALE,2
env = XCURSOR_SIZE,32
```
The GDK_SCALE variable won't conflict with Wayland-native GTK programs.
> [!WARNING]
> XWayland HiDPI patches are no longer supported. Do not use them.
## Abstract Unix domain socket
X11 applications use Unix domain sockets to communicate with XWayland. On Linux, libX11 prefers
to use the abstract Unix domain socket. This type of socket uses a separate, abstract namespace that
is independent of the host filesystem. This makes abstract sockets more flexible
but harder to [isolate](https://github.com/hyprwm/Hyprland/pull/8874)
for some kinds of sandboxes like Flatpak. However, removing the abstract socket
has [potential](https://gitlab.gnome.org/GNOME/mutter/-/issues/1613) security
and compatibility issues.
Keeping that in mind, we add the [`xwayland:create_abstract_socket`](../Variables/#xwayland) option.
When the abstract socket is disabled, only the regular Unix domain
socket will be created.
_\* Abstract Unix domain sockets are available only on Linux-based systems_

View File

@@ -0,0 +1,16 @@
---
weight: 3
title: Configuring
---
This section is all about the configuring (aka ricing) of your Hyprland experience.
It links to other pages where necessary, and will walk you through:
- The config file
- Every option and function in it
- Extending functionality via scripts
- Some uncommon tips and tricks (e.g. switching layouts, disabling keybinds on-demand, etc)
It also contains some sample configurations you can take inspiration from.
Start with [the Start Page](./Start).

View File

@@ -0,0 +1,20 @@
---
weight: 12
title: Connect
---
These are the links to official Hyprland-related spaces or profiles:
## Profiles
Twitter: [twitter.com/hyprwm](https://twitter.com/hyprwm)
## Spaces
Discord: [discord.gg/hQ9XvMUjjr](https://discord.gg/hQ9XvMUjjr)<br/>
Matrix: `#hyprland:matrix.vaxry.net`
## Other
hyprland.org git instance: [code.hyprland.org](https://code.hyprland.org/)<br/>
Hyprland website: [hyprland.org](https://hyprland.org/)<br/>

View File

@@ -0,0 +1,58 @@
---
title: Issue Guidelines
---
Due to the influx of low quality or incomprehensible issues,
we prefer to begin possible bug reports or feature requests as *discussions*,
and elevate them to issues if they can be confirmed by a member to be relevant,
and once enough information about the problem has been gathered.
> [!NOTE] **Why?**
>
> We are volunteers, doing this in our free time. Out of respect, please read this document
> _fully_ before posting an issue _or_ discussion. If you can spend a few minutes reading this,
> it saves us, the developers, much more time overall, so we can deliver fixes and features faster.
>
> Thank you!
## Issue Guidelines
If you are experiencing a bug, or missing a feature, please do not open an issue.
Instead, we ask you to open a [discussion](https://github.com/hyprwm/Hyprland/discussions).
### Before you start a discussion
_Search the discussions and issues thoroughly_. It's likely that there's already one open for your bug / feature that you can
just "like" instead of wasting both your time writing a new one and our time closing it and redirecting you.
### The lifecycle of a discussion
A discussion is opened by a user.
For bugs:
- If a discussion is solved, user error, or not a hyprland issue, it gets closed.
- If a discussion is a Hyprland problem, but cannot be tied to Hyprland in a clear way, or is not reproducible, it stays a discussion until that changes.
- If a discussion is reproducible, a member of Hyprland promotes the discussion to an issue by opening an issue with the key information and links the original discussion.
> [!NOTE]
> To get logs for your bug please see [Crashes and Bugs](https://wiki.hypr.land/Crashes-and-Bugs/)
For feature requests:
- If a discussion describes a feature that is already possible (via scripts, features, or official tools), invalid, or not applicable, it gets closed.
- If a discussion describes a feature that is _not_ already possible, it stays a discussion.
- If a discussion describes a feature that is _not_ already possible, and it gathers enough attention, a member may promote it to an issue by opening an issue with the key information and links the original discussion.
Please note we are all volunteers and our numbers are small, so issues may stay idle.
### Gathering attention for your discussion / a discussion you care about
Avoid posting comments such as "when fix?". Instead, use the thumbs up
reaction under the discussion, or issue (if one exists).
If a discussion has reached 5 "likes" or more, and it hasn't been promoted, you may ping a member in the discussion
(`@vaxerski`, `@fufexan` or `@notashelf` are the most likely ones to work)
Please ***do not*** ping the members just because the discussion has become stale,
or failed to gather attention. If that is the case, attempt to bring it back
on track by posting *further* relevant information that might spark a discussion,
or tell people interested about the discussion so that they can "like" it.

View File

@@ -0,0 +1,96 @@
---
title: PR Guidelines
---
## PR Requirements
- Clean, not hacky code
- Described changes and _why_ they were there
- Following the style (see below)
## Code Style
Please read this if you are submitting a PR, in order to minimize the amount of style nits received, and save
the time for the maintainers.
### Before you submit
Make sure you ran clang-format: `clang-format -i src/**/*{cpp,hpp}`
Check if your changes don't violate `clang-tidy`. Usually this is built into your IDE.
### Clang-format
This is non-negotiable. Your code **must** be formatted.
### Clang-tidy
Clang-tidy violations are not hard requirements, but please try to minimize them, and
_only_ ignore them if it's absolutely necessary.
I've tweaked it so that in 99% of cases you absolutely should fix it.
### Testing
Please check the [Tests](../Tests) page for information about tests in Hyprland, and related
projects.
No test regressions is a _must_, while new tests are _required_ if possible to test (e.g.
graphical stuff is not testable).
### Other
Some stuff clang-tidy / clang-format won't catch:
- No uninitialized _primitives_ (int, float, double, size_t, etc.)
- No short if braces. if your if/else body contains 1 _line_ (not 1 statement) do not put `{}` around it.
- The above rule does not apply to loops / etc
- Consider adding a `;` inside of empty function bodies
- Whenever you're initializing vectors arrays or maps with a lot of elements, add a `,` after the last element to make the styling nicer
- Consider forward-declaring things in headers if possible instead of including. Speeds up compile times.
- no `using namespace std;`, and `using namespace (anything else)` is only allowed in source files, not headers.
- prefer guards rather than nesting. `if(!valid) return;` is much better than `if (valid) { /* a billion things */ }`
### Naming conventions
Although we've used hungarian notation in the past, we are moving away from it.
The current, and new code, should use `camelCase` with an `m_` prefix if the variable is a member of a class. (not a struct)
Additionally:
- classes have a prefix of `C`: `CMyClass`
- structs have a prefix of `S`: `SMyStruct`
- interfaces have a prefix of `I`: `IMyInterface`
- global pointers for singletons have a prefix of `g_`: `g_someManager`
- constant variables are in CAPS: `const auto MYVARIABLE = ...`
## General code requirements
### No raw pointers
This is a simple rule - don't use raw pointers (e.g. `CMyClass*`) unless _absolutely necessary_. You have `UP`, `SP` and `WP` at your disposal.
These are unique, shared and weak pointers respectively.
### No malloc
Unless absolutely necessary, do not use malloc / free. You _will_ forget to free the memory.
### Avoid dubious cleanups
If a function is a C-style allocator, e.g. `some_c_call_make_new()`, it will likely require a `some_c_call_free()`. In these cases, either:
- wrap the thing in a C++ class, or
- if used only within one function, use a `CScopeGuard` to always free it when the function exits.
### Use the STL
Generally, use the STL instead of trying to reinvent the wheel.
### Use hyprutils
Hyprutils provides a lot of utilities that are well-suited for hyprland (and other hypr* projects) specifically. Use them.
### No absolute includes from /src
Imagine this scenario:
```
src/
a/
a.hpp
b/
b.hpp
```
If you are in `a.hpp` and want to include `b.hpp`, you _must_ use `../b/b.hpp`, and _cannot_ use `b/b.hpp`. The latter will break plugins.
One exception you might notice in the code is absolute paths from the root are allowed, e.g. `protocols/some-protocol.hpp`.

View File

@@ -0,0 +1,65 @@
---
title: Tests
---
Hyprland and some other projects under the hypr* umbrella have _tests_ that
try to catch bugs and regressions before code is merged.
Building in Debug will by default build tests.
## Running tests
### GTests
GTests are GoogleTests that are _unit tests_. These tests simply check how
some elements behave when they can run on their own.
In all hypr* projects, GTests are ran by ctest. Run:
```sh
ctest -j$(nproc) -C Debug --test-dir=build
```
And make sure your tests pass.
### Hyprland's hyprtester
A lot of hyprland's code cannot be unit tested, thus we have our own Hyprtester
binary which runs hyprland and issues commands and expects results.
To run Hyprtester, `cd` into `./hyprtester`, then run:
```sh
../build/hyprtester/hyprtester --plugin ./plugin/hyprtestplugin.so
```
*This will run for a while!* At the end, it will print summary results
of how many tests passed, and how many failed.
The goal of failed tests is to be **0**.
## Submitting new tests
New tests have to either be a GTest, if the thing tested is possible to be unit tested,
or a part of hyprtester.
For both test types, you can check the test directories in the project. GTests live in `tests/`,
while hyprtester tests live in `hyprtester/`.
### What to test
If you're submitting a new feature, it's obviously your feature. For a fix, try to write a test
case that would fail before your fix.
For new tests, you can inspect the coverage report.
First, run _both_ ctest and hyprtester. Then, run (from the repo root):
```sh
gcovr -r . build --html --html-details -o build/coverage.html --gcov-ignore-parse-errors="negative_hits.warn" && xdg-open ./build/coverage.html
```
this will run for a while, then open a report in your browser. You can see which files have been tested in
what amount, and click on the files to see a line-by-line breakdown.
If there are paths untested, we'd be very happy to receive tests for them.

View File

@@ -0,0 +1,67 @@
---
title: Translations
---
Some parts of the Hyprland ecosystem are localized. More and more are getting localization
frameworks. This is a short page showing how to contribute translations to Hyprland apps.
## Find the translation file
Here you'll find a list of translation files for hyprapps ready to translate:
- [hyprland](https://github.com/hyprwm/Hyprland/blob/main/src/i18n/Engine.cpp)
- [hyprlauncher](https://github.com/hyprwm/hyprlauncher/blob/main/src/i18n/Engine.cpp)
- [hyprpwcenter](https://github.com/hyprwm/hyprpwcenter/blob/main/src/i18n/Engine.cpp)
_more are coming, this list will be updated_
## Translate
Translations are in C++, but they are straightforward, and don't require much expertise.
You submit a translation via a traditional MR on Github.
### Basic translations (unconditional)
You register a translation for a key and your language code. For example, for key `TXT_KEY_HELLO`, and language
`pl_PL` (polish), you can:
```cpp
registerEntry("pl_PL", TXT_KEY_HELLO, "Siemka!");
```
Some translations have variables, included like so:
```cpp
registerEntry("pl_PL", TXT_KEY_HELLO, "Siemka, {name}!");
```
### Conditional translations
In some languages, you might want to change your translation based on e.g. the amount. (apple vs apples). In this
case, it's a bit more complicated, but it looks like this:
```cpp
registerEntry("pl_PL", TXT_KEY_HELLO, [](const Hyprutils::I18n::translationVarMap& vars) {
int peopleAmount = std::stoi(vars.at("count"));
if (peopleAmount == 1)
return "Mam {count} dziewczynkę anime.";
int last = peopleAmount % 10;
int lastTwo = peopleAmount % 100;
if (last >= 2 && last <= 4 && !(lastTwo >= 12 && lastTwo <= 14))
return "Mam {count} dziewczynki anime.";
return "Mam {count} dziewczynek anime.";
});
```
As you can see, you can change the returned string based on some variable. Please note all variables
are strings, so you need to call a standard function like `std::stoi` to obtain an integer.
### Fallbacks
In general, if you are translating into a language with regional variants, if the translations are the same,
you don't need two entries.
Order of fallbacks is as follows:
`xy_ZT` -> `xy_XY` -> `xy_ANYTHING` -> `global fallback`, usually `en_US`.
So, if you write something for `de_DE`, and the user has `de_AT`, if `de_AT` is missing,
`de_DE` will be used.

View File

@@ -0,0 +1,112 @@
---
weight: 13
title: Contributing and Debugging
---
PR, code styling and code FAQs are [here](./PR-Guidelines)
For issues, please see
[the guidelines](https://github.com/hyprwm/Hyprland/blob/main/docs/ISSUE_GUIDELINES.md)
## Build in debug mode
### Required packages
See [manual build](https://wiki.hypr.land/Getting-Started/Installation/#manual-manual-build) for deps.
### Recommended, CMake
Install the VSCode C/C++ and CMake Tools extensions and use that.
I've attached a
[example/launch.json](https://github.com/hyprwm/Hyprland/blob/main/example/launch.json)
that you can copy to your .vscode/ folder in the repo root.
With that, you can build in debug, go to the debugging tab and hit
`(gdb) Launch`.
_note:_ You probably want to set `watchdog_timeout = 0` in the debug {} section
of your config. Otherwise Hyprland will notice its hanging when you hit a
breakpoint and it will crash after you continue out of it.
### Custom, CLI
`make debug`
Attach and profile in your preferred way.
### Nix
To build the package in debug mode, you have to override it like this:
```nix
hyprland.override {
debug = true;
};
```
This code can go in the `package` attribute of the NixOS/Home Manager modules.
## Development environment
### Setup
Make a copy of your config in `~/.config/hypr` called `hyprlandd.conf`. `Debug`
builds automatically use `hyprlandd.conf`, but you can also pass `--config ~/path/to/conf.conf`
for an override on release / different file.
#### Recommended debug config changes
- remove _all_ `exec=` or `exec-once=` directives from your config.
- change default modifier for binds (e.g. `SUPER` -> `ALT`)
#### Launch the dev env
Launch the output `Hyprland` binary in `./build/` _when logged into a Hyprland
session_.
A new window should open with Hyprland running inside of it. You can now test stuff
in the nested session without worrying about nuking your actual
session, and also being able to debug it easily. I'd also recommend to launch Hyprland
with some sort of a debugger, like `gdb`. Your IDE (if you use one) can likely do it
for you, otherwise `gdb ./build/Hyprland` should suffice. This will help you debug
crashes.
For gdb, when Hyprland crashes, gdb will stop and allow you to inspect the current state
with commands like `bt`, `frame`, `print`, etc. An IDE will allow you to do it
graphically.
## LSP and Formatting
If you want proper LSP support in an editor that doesn't automatically set it
up, use clangd. You'll probably notice there will be a bunch of warnings
because we haven't generated compile commands, to do this run:
```sh
cmake -S . -B build/ -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
```
Also, before submitting a PR please format with clang-format, to run this only
on your changes run `git-clang-format` in your projects root directory.
## Logs, dumps, etc
You can use the logs and the GDB debugger, but running Hyprland in debug compile
as a driver and using it for a while might give more insight to the more random
bugs.
When Hyprland crashes, use `coredumpctl` and then `coredumpctl info PID` to see
the dump. See the instructions below for more info about `coredumpctl`.
You can also use the amazing command
```sh
watch -n 0.1 "grep -v \"arranged\" $XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/hyprland.log | tail -n 40"
```
for live logs. (replace `hyprland` with `hyprlandd` for debug builds)
### How do I get a coredump?
See
[`ISSUE_GUIDELINES.md`](https://github.com/hyprwm/Hyprland/blob/main/docs/ISSUE_GUIDELINES.md).

View File

@@ -0,0 +1,172 @@
---
weight: 10
title: Crashes and Bugs
---
## Getting the log
Firstly, make sure you have enabled logs in the Hyprland config. Set `debug:disable_logs` to `false`.
If you are in a TTY, and the Hyprland session that crashed was the last one you
launched, the log can be printed with
```sh
cat $XDG_RUNTIME_DIR/hypr/$(ls -t $XDG_RUNTIME_DIR/hypr/ | head -n 1)/hyprland.log
```
if you are in a Hyprland session, and you want the log of the last session, use
```sh
cat $XDG_RUNTIME_DIR/hypr/$(ls -t $XDG_RUNTIME_DIR/hypr/ | head -n 2 | tail -n 1)/hyprland.log
```
## Obtaining the Hyprland Crash Report
If you have `$XDG_CACHE_HOME` set, the crash report directory is
`$XDG_CACHE_HOME/hyprland`. If not, it's `$HOME/.cache/hyprland`.
Go to the crash report directory and you should find a file named
`hyprlandCrashReport[XXXX].txt` where `[XXXX]` is the PID of the process that
crashed.
Attach that file to your issue.
## Crashes at launch
Diagnose the issue by what is in the log:
- `backend failed to start` -> launch in the TTY and refer to the logs in RED.
- `Monitor X has NO PREFERRED MODE, and an INVALID one was requested` -> your
monitor is bork.
- Other -> see the coredump. Use `coredumpctl`, find the latest one's PID and do
`coredumpctl info PID`.
- failing on a driver (e.g. `radeon`) -> report an issue.
- failing on `Hyprland` -> report an issue.
## Crashes not at launch
Report an issue on GitHub or on the Discord server.
## Obtaining a debug stacktrace
> Systemd-only.
1. Build Hyprland in debug (`make debug`).
2. Start Hyprland and get it to crash.
3. In a tty or terminal, do `coredumpctl debug Hyprland`.
- If gdb asks you for symbols, say `y`.
- If it asks about paging, say `c`.
4. Once you get to `(gdb)`, start file logging with `set logging enabled`.
- For a specific file, use `set logging file output.log`.
5. Run `bt -full`, then `exit` once finished, and attach the output.
## Obtaining a trace log
Launch Hyprland with `HYPRLAND_TRACE=1 AQ_TRACE=1` environment variables set.
These variables will enable _very_ verbose logging and it's not recommended to enable them unless debugging, as they
might cause slowdowns and _massive_ log files.
Try to reproduce your issue as fast as possible so we don't have to sift through 1 million lines of logs.
## Bugs
First of all, **_READ THE [FAQ PAGE](../FAQ)_**
If your bug is not listed there, you can ask on the Discord server or open a
[discussion on GitHub](https://github.com/hyprwm/Hyprland/discussions).
## Bisecting an issue
"Bisecting" is finding the first _git_ commit that introduced a specific bug or
regression using binary search. This is done in `git` using the `git bisect` command.
First, clone the Hyprland repo if you haven't already:
```sh
git clone --recursive https://github.com/hyprwm/Hyprland
cd Hyprland
```
Start the bisect process:
```sh
git bisect start
```
Enter the first known good commit hash that did not contain the issue:
```sh
git bisect good [good commit]
```
Then, enter the known bad commit hash that does contain the issue. You can simply use HEAD:
```sh
git bisect bad HEAD
```
_git_ will now checkout a commit in the middle of the specified range.
Now, reset and build Hyprland:
```sh
git reset --hard --recurse-submodules
make all
```
...and run the built executable from the TTY `./build/Hyprland`.
Try to reproduce your issue. If you can't (i.e. the bug is not present), go back to the
Hyprland repo and run `git bisect good`. If you can reproduce it, run `git bisect bad`.
_git_ will then checkout another commit and continue the binary search.
If there's a build error, run `git bisect skip`.
Reset, build and install Hyprland again and repeat this step until _git_ identifies the
commit that introduced the bug:
```
[commit hash] is the first bad commit
```
## Building the Wayland stack with ASan
If requested, this is the deepest level of memory issue debugging possible.
_Do this in the tty, with no Hyprland instances running._
Clone hyprland: `git clone --recursive https://github.com/hyprwm/Hyprland`
`make asan`
Reproduce your crash. Hyprland will exit back to the tty.
Now, in either `cwd`, `~` or `./build`, search for file(s) named
`asan.log.XXXXX` where XXXXX is a number.
Zip all of them up and attach to your issue.
## Debugging DRM issues
DRM (Direct Rendering Manager) is the underlying kernel architecture to take a gpu buffer (something
we can render to) and put it on your screen (via the gpu) instead of a window.
Freezes, glitches, and others, can be caused by issues with Hyprland's communication with DRM, the driver
or kernel. In those cases, a DRM log is helpful.
> [!WARNING]
> Please note, these logs are EXTREMELY verbose. Please reproduce your bug(s) ASAP to avoid getting a 1GB log.
```sh
echo 0x19F | sudo tee /sys/module/drm/parameters/debug # enables verbose drm logging
sudo dmesg -C # clears kernel debug logs
dmesg -w > ~/dmesg.log & # writes kernel logs in the background to a file at ~/dmesg.log
Hyprland
# ... repro the issue, then quit hyprland
fg # after this, use CTRL+C to stop writing the logs
echo 0 | sudo tee /sys/module/drm/parameters/debug # disables drm logging, don't forget this to avoid slowdowns
```
After this, _attach_ the `dmesg.log` file.

View File

@@ -0,0 +1,504 @@
---
weight: 11
title: FAQ
---
### Symbol lookup errors
If you are getting an error like:
```
<app>: symbol lookup error: <app>: undefined symbol: <symbol>
```
or
```
<app>: error while loading shared libraries: <lib>: cannot open shared object file: No such file or directory.
```
or sometimes without errors, just crashing at start / randomly
This means that you have built Hyprland yourself and your stack has gotten mismatched. Each hypr* app depends on a bunch of libraries. If you update those libraries, and you don't rebuild the hypr* stack, you will get these errors or crashes.
If you want to avoid these errors altogether, _use packages and don't build yourself_. By building yourself, the responsibility for maintaining this consistency falls on **you**!
When building yourself, you need to _build all hypr* components_, you cannot use some from packages and some from repos.
**For Arch users**: `-git` packages count as building yourself.
The order in which you **must** build the stack is as follows:
```
hyprland-protocols
hyprwayland-scanner
hyprutils
hyprgraphics
hyprlang
hyprcursor
aquamarine
xdg-desktop-portal-hyprland
hyprwire
hyprtoolkit
hyprland
```
Other things, e.g. hyprapps (hyprlock, hyprsunset, ...) can be built in any order
after hyprland.
***Never, under any circumstances***, symbolically link different .so versions together, this will lead to memory bugs and crashes.
I don't care what some random person tells you online. Don't do it.
### My apps are pixelated
This just means they are running through XWayland, which physically cannot scale
by fractional amounts.
To force them to run in native Wayland mode, see
[the Master Tutorial](../Getting-Started/Master-Tutorial/#force-apps-to-use-wayland).
If they can't, see [the XWayland page](../Configuring/XWayland).
### Nothing renders / screen is empty / crash on opening first app
Possible causes:
> Your themes are not set up properly, making apps crash.
Use something like `qt6ct` (Qt) and `nwg-look` (GTK) (\*for GTK you can also set
up themes with envvars) to set up your themes.
> Your PC is very, _very_ old.
In that case, see the [Installation Page](../Getting-Started/Installation)
and try compiling with LEGACY_RENDERER
_For more info about bugs and crashes, see this_
_[wiki page](../Crashes-and-Bugs)_
### My external monitor is blank / doesn't render / receives no signal (laptop)
For Nvidia graphics - This issue appears to be resolved when using Nvidia
Drivers 525.60.11 or later, but it may persist with older drivers.
For systems with limited hardware (Ex. iGPU, USB-C, USB Hubs) - Set `env = AQ_NO_MODIFIERS,1` in your config.
To diagnose if you have the exact problem above you can get a [DRM log](https://wiki.hypr.land/Crashes-and-Bugs/#debugging-drm-issues) and look for
```plain
Requested display configuration exceeds system DDB limitations
```
Outside those, there is a way to fix it that _might_ work for you though:
**Option 1:** Use _only_ the external monitor
By using `AQ_DRM_DEVICES=/dev/dri/card1` (or `card0`) environment variable you can force Hyprland to
use only your dGPU, meaning your laptop's screen will be gone but your external
one will work.
**Option 2:** Use all outputs, at the cost of battery life.
By switching your laptop to only use the dGPU in the BIOS, you _might_ be able
to get everything to work, at the cost of high battery usage.
_Please note these are highly model-specific and might or might not work. If
they don't, you're unfortunately out of luck._
You might try a USB-C to HDMI adapter though, maybe that could route the
external monitor through the iGPU.
### How do I screenshot?
**Option 1:** Install `grim` and `slurp`.
Use a keybind (or execute) `grim -g "$(slurp)"`, and select a region. A screenshot
will pop into your `~/Pictures/` (You can configure grim and slurp, see their
GitHub pages).
If you want those screenshots to go directly to your clipboard, consider using
`wl-copy`, from [`wl-clipboard`](https://github.com/bugaevc/wl-clipboard).
Here's an example binding:
`bind = , Print, exec, grim -g "$(slurp -d)" - | wl-copy` For a more complete
utility, try our own screenshotting utility:
[Grimblast](https://github.com/hyprwm/contrib).
**Option 2:** You can also use hyprshot, more info [here](https://github.com/Gustash/Hyprshot).
**Option 3:** Install `flameshot`.
Flameshot has many built-in features like allowing you to draw with a paintbrush,
add lines, add shapes, etc.
Flameshot was built originally for X and **it has many issues on Wayland** and users
with HiDPI and multi-monitor setups have had mixed experiences with Flameshot.
The options above are smoother and more native to Wayland. If you still want to
use Flameshot, here are some configuration recommendations by users who've found
workarounds.
```ini
# no_anim isn't necessary but animations with these rules might look bad. use at your own discretion.
windowrule = match:class flameshot, no_anim
windowrule = match:class flameshot, float
windowrule = match:class flameshot, move 0 0
windowrule = match:class flameshot, pin
windowrule = match:class flameshot, no_initial_focus
# set this to your leftmost monitor id, otherwise you have to move your cursor to the leftmost monitor
# before executing flameshot
windowrule = match:class flameshot, monitor 1
# ctrl-c to copy from the flameshot gui gives warped images sometimes, but
# setting the env fixes it
bind = ..., exec, XDG_CURRENT_DESKTOP=sway flameshot gui
```
For recording videos, [wf-recorder](https://github.com/ammen99/wf-recorder),
[wl-screenrec](https://github.com/russelltg/wl-screenrec) or
[OBS Studio](https://obsproject.com/) could be used.
### Screenshare / OBS no worky
Check [Screensharing](../Useful-Utilities/Screen-Sharing).
Also install `qt6-wayland` if you plan to use obs.
### How do I change my wallpaper?
See [Wallpapers](../Useful-Utilities/Wallpapers).
### How heavy is this?
Not that much heavier than Xorg. If you want maximum performance, consider
turning off the blur and animations.
### My monitor no worky
Try changing the mode in your config. If your preferred one doesn't work, try a
lower one. A good way to list all modes is to get `wlr-randr` and do a
`wlr-randr --dryrun`
### My monitor has flickering brightness when I turn on VRR
Change the VRR option to `2` (fullscreen), so that it is only used in games.
This happens because the brightness on some monitors can depends on the refresh
rate, and rapidly changing refresh rates (for example, when the screen
momentarily updates after pressing a key) will cause rapid changes in
brightness.
If you want VRR always enabled regardless,
the flickering can be mitigated or even removed by changing the VRR range in your monitor's EDID.
More information in [the ArchWiki](https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID).
### How do I update?
Open a terminal where you cloned the repo.
```bash
git pull
make all && sudo make install
```
If you are using the AUR (hyprland-git) package, you will need to cleanbuild to
update the package. Paru has been problematic with updating before, use Yay.
### How do I screen lock?
Use a Wayland-compatible locking utility using WLR protocols, e.g. `swaylock`.
Be aware that they will not prevent tty-changing using Ctrl-Alt-F1...F7.
### How do I change me mouse cursor?
See [hyprcursor](../Hypr-Ecosystem/hyprcursor)
1. Set the GTK cursor using [nwg-look](https://github.com/nwg-piotr/nwg-look).
2. Add `exec-once=hyprctl setcursor [THEME] [SIZE]` to your config and restart Hyprland.
If using flatpak, run `flatpak override --filesystem=~/.themes:ro --filesystem=~/.icons:ro --user` and put your themes in both `/usr/share/themes` and `~/.themes`, and put your icons and cursors in both `/usr/share/icons` and `~/.icons`.
For Qt applications, Hyprland exports XCURSOR_SIZE as 24, which is the default.
You can overwrite this by exporting XCURSOR_SIZE to a different value with `env`.
You can also try running `gsettings set org.gnome.desktop.interface cursor-theme 'theme-name'` or adding it after `exec-once=` in your config.
If you do not want to install a GTK settings editor, change the config files according to the
[XDG specification (Arch Wiki link)](https://wiki.archlinux.org/title/Cursor_themes#Configuration).
Make sure to also edit `~/.config/gtk-4.0/settings.ini` and `~/.gtkrc-2.0` if _not_ using a tool
(like `nwg-look`).
### GTK Settings no work / whatever
[https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland](https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland)
### My \[program name\] is freezing
Make sure you have a notification daemon running, for example `dunst`. Autostart
it with the `exec-once` keyword.
### Waybar workspaces no worky???
Waybar has a set of caveats or settings that you need to be aware of. See
[Status bars](../Useful-Utilities/Status-Bars) for solutions.
### How do I autostart my favorite apps?
Using the window rules to assign apps to workspaces, you can open a bunch of
applications on various workspaces. The following method will start these apps
silently (i.e. without the flickering from workspace to workspace).
Put the following in your `hyprland.conf`: (example)
```ini
exec-once = [workspace 1 silent] kitty
exec-once = [workspace 1 silent] subl
exec-once = [workspace 3 silent] mailspring
exec-once = [workspace 4 silent] firefox
```
### How do I move my favorite workspaces to a new monitor when I plug it in?
If you want workspaces to automatically go to a monitor upon connection, use the
following:
In hyprland.conf:
```ini
exec-once = handle_monitor_connect.sh
```
where `handle_monitor_connect.sh` is: (example)
```sh {filename="handle_monitor_connect.sh"}
#!/bin/sh
handle() {
case $1 in monitoradded*)
hyprctl dispatch moveworkspacetomonitor "1 1"
hyprctl dispatch moveworkspacetomonitor "2 1"
hyprctl dispatch moveworkspacetomonitor "4 1"
hyprctl dispatch moveworkspacetomonitor "5 1"
esac
}
socat - "UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/${HYPRLAND_INSTANCE_SIGNATURE}/.socket2.sock" | while read -r line; do handle "$line"; done
```
This makes workspaces 1, 2, 4, and 5 go to monitor 1 when connecting it.
Please note this requires `socat` to be installed.
### My tablet no worky??
Use [Open Tablet Driver](https://github.com/OpenTabletDriver/OpenTabletDriver)
to configure your tablet. In the future it will be supported in the config.
Until then, OTD is the way to go.
### Some of my apps take a really long time to open...?
```ini {filename="~/.config/hypr/hyprland.conf"}
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
```
Make sure that your portals launch _after_ this gets executed. For some people,
they might launch before that has happened.
In such cases, a script like this:
```bash
#!/usr/bin/env bash
sleep 4
killall -e xdg-desktop-portal-hyprland
killall xdg-desktop-portal
/usr/lib/xdg-desktop-portal-hyprland &
sleep 4
/usr/lib/xdg-desktop-portal &
```
launched with `exec-once` should fix all issues. Adjust the sleep durations to
taste.
### How do I export envvars for Hyprland?
See [Environment Variables](../Configuring/Environment-variables)
The `env` keyword is used for this purpose. For example:
```ini
env = XDG_CURRENT_DESKTOP,Hyprland
```
### How to disable middle-click paste?
Setting `misc:middle_click_paste` to `false` disables the feature altogether with the exception of some browsers (notably firefox) having a separate built-in way of emulating that feature which has to be disabled within the browser's settings.
### How do I make Hyprland draw as little power as possible on my laptop?
**_Useful Optimizations_**:
- `decoration:blur:enabled = false` and `decoration:shadow:enabled = false` to disable
fancy but battery hungry effects.
- `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is
happening on-screen.
### My apps take a long time to start / can't screenshare
See [The XDPH Page](../Hypr-Ecosystem/xdg-desktop-portal-hyprland/#debugging).
You most likely have multiple portal impls / an impl is failing to launch.
### My screenshot utilities won't work with multiple screens
Some programs like Flameshot (currently) have limited Wayland support, so on most
Wayland compositors, you will have to do a few tweaks. For Hyprland, you can add
these window rules to your config to make these programs work with both of your
screens.
```ini
windowrule = match:title flameshot, float true
windowrule = match:title flameshot, move 0 0
windowrule = match:title flameshot, suppress_event fullscreen
```
### I cannot bind SUPER as my mod key on my laptop
Many laptops have a built-in function to toggle `SUPER` between single key press
mode and hold mode. This is usually indicated by a padlock on the `SUPER` key.
First, install and run `wev`, then press `SUPER`. If you see a key press event
followed by an instant key release event, then it's likely your `SUPER` key is
set to single press mode.
On most laptops, this can be fixed by pressing `FN+SUPER` and verified in `wev`.
You should be able to hold `SUPER` and not see an instant release event. In case
`FN+SUPER` doesn't work, consult your laptop's manual.
### My VM doesn't receive keybinds I have set in Hyprland
This is expected, as Hyprland takes precedence.
A simple fix is to create an empty "passthrough" submap:
```ini
bind = MOD,KEY,submap,passthru
submap = passthru
bind = SUPER,Escape,submap,reset
submap = reset
```
Set `MOD` and `KEY` to desired values.
By pressing the selected combo, you will enter a mode where Hyprland ignores your
keybinds and passes them on to the VM. Pressing `SUPER + Escape` will leave that mode.
### Some of my drop-down/pop-up windows in apps disappear/don't open at cursor position
In some apps like Steam or VSCode, the drop-down windows may disappear if you
hover over them. This can be fixed with window rules.
First, find the title and class of the pop-up window with `hyprctl clients`. You
can try something like `sleep 3 && hyprctl clients` so you have time to open the
pop-up. It should look something like this:
```bash
Window 55d794495400 -> :
...
class: [CLASS here]
title: [TITLE here]
...
```
If the pop-up disappears as you hover over it, you can add to your config:
```ini
windowrule = stay_focused, match:class CLASS, match:title TITLE
```
This has a downside of not being able to click on anything in the main UI until
you've interacted with the pop-up.
If the pop-up disappears immediately, you can use:
```ini
windowrule = min_size 1 1, match:class CLASS, match:title TITLE
```
If the pop-up doesn't open at the cursor position, try the following:
```ini
windowrule = move cursor_x cursor_y, match:class CLASS, match:title TITLE
```
This is required for apps running under xwayland only and there is usually no need
to use the first solution if opening at the cursor position.
### Steam's file picker no worky
On instances where you have a Steam library on another drive that you have to
add, Hyprland's file picker would not normally appear when selecting a directory
from Steam.
Steam has its own file picker, however, it's not functional. Install
`xdg-desktop-portal-gtk` to show the desktop's file picker.
### Workspaces or clients are disappearing or monitor related dispatchers cause crashes
It seems there is a Kernel bug making the system think there is an extra
phantom monitor, that causes all sorts of issues, crashes and weird behaviors
like disappearing workspaces or clients when adding or removing an external
monitor.
First check the list of monitors detected by Hyprland by running:
```ini
hyprctl monitors
```
If you see a monitor that should not be there (usually named `Unknown-1`), you
can work around the issue by adding in your `hyprland.conf`:
```ini
monitor = Unknown-1,disabled
```
### I get a .so file missing error on launch
If you are using a -git package, this is a common occurrence when ABI-breaking updates are done.
_**Do not**_ symlink different .so versions, this will cause crashes!!!
Instead, find all hypr* packages with `-git` you have installed, remove them (possibly remove dependencies of them, too)
and simply install them again.
If using yay, make sure to `CleanBuild` every package. If using paru, manually remove the cache of hypr* packages in `~/.cache/paru`.
If you are not using any -git packages, this is a mistake in your distro's packaging and should be solved there.
### My cursor is a hyprland icon?
This means you have no hyprcursor theme installed, and hyprland failed to find an XCursor theme as well. Install a cursor theme.
### Smart gaps please?
[Here](../Configuring/Workspace-Rules/#smart-gaps).
### Hyprwinwrap is not visible through blurred windows
This is a side effect of the [decoration:blur:new_optimizations](../Configuring/Variables/#blur).
You have two options to resolve it.
1. Set `decoration:blur:new_optimizations` to `false` - This will preserve the exact same appearance, but may have a slight performance cost.
2. Set `decoration:blur:ignore_opacity` to `false` - This will drastically affect the appearance, but should maintain the original performance.
### I can't create Discord binds
You most likely have `env = ELECTRON_OZONE_PLATFORM_HINT, wayland` in your config.
Try running Discord like this `ELECTRON_OZONE_PLATFORM_HINT= discord`.
> [!WARNING]
> Keep in mind that this will run Discord under XWayland.
If it works, navigate to the Discord desktop entry (usually located in `/usr/share/applications/`). Duplicate it and replace `Exec=/usr/bin/discord` with `Exec=env ELECTRON_OZONE_PLATFORM_HINT= /usr/bin/discord`. You can also give it a new name, e.g. `Name=DiscordX`, to avoid confusion as to which is which.
### Fullscreen applications/Steam Games open with secondary monitor's resolution
The issue is likely the default monitor for X11 is not your desired primary monitor, to fix this, do the following:
Add `exec-once=xrandr --output [MONITOR_ID] --primary` to your config, replacing [MONITOR_ID] with your main monitor's ID (e.g. DP-3). You can find your monitor ID by running `hyprctl monitors`.
By adding this to your hyprland config, it will set the default monitor for X11 applications to your main monitor.

View File

@@ -0,0 +1,526 @@
---
weight: 1
title: Installation
---
> [!WARNING]
> Hyprland is not meant to be a full and user-friendly Desktop Environment. In a nutshell, it's a set of
> tools to allow you to create your own Desktop Environment.
>
> Apps, integrations, shells, etc, are **your** responsibility to pick, install and configure.
>
> This wiki is _very_ verbose. It's highly recommended to scour and read the wiki first before
> assuming something is not working or not available.
> [!NOTE]
> NVIDIA GPUs are often not usable out-of-the-box, follow the [Nvidia page](../../Nvidia) after installing
> Hyprland if you plan to use one. Blame NVIDIA for this.
## Distros
We officially run and test Hyprland on Arch and NixOS, and we guarantee Hyprland will work there. For any other distro
(not based on Arch/Nix) you might have varying amounts of success. However,
since Hyprland is extremely bleeding-edge, point release distros like Pop!\_OS, Fedora, Ubuntu, etc.
will have **major** issues running Hyprland. Rolling release distros like openSUSE, Solus ,etc. will likely be fine.
## Installation
Installing Hyprland is very easy. Simply install it with your package manager.
> [!WARNING]
> It is **heavily** recommended you use **what the distro packages for you**, and **not** compiling manually
> or using `-git` packages.
> Hyprland's ecosystem and dependencies are vast and intertwined, and compiling manually will only potentially expose you to outdated,
> or incompatible versions of these dependencies.
>
> If you get `.so` file mismatch / missing errors, it's _entirely your fault_ for doing this!
>
> However, if you are an experienced user and want to beta-test new features, you're more than welcome to run the latest
> git head. Please don't come asking about ".so file missing" errors though!
### Packages
**WARNING:** I do not maintain any packages. If they are broken, try building
from source first.
{{% details title="Arch" closed="true" %}}
Install a tagged release from the arch packages:
```shell
sudo pacman -S hyprland
```
or install from the AUR, which compiles the latest source:
```shell
yay -S hyprland-git
```
Alternatively, install the `hyprland-meta` package to automatically fetch and compile the latest git versions of all components within the hypr* ecosystem.
```shell
yay -S hyprland-meta-git
```
> [!WARNING]
> With `-git` everytime a direct dependency like `hyprutils` has an ABI breaking update you need to recompile Hyprland and all other dependent tools.
> Otherwise you get a ".so not found" error.
If you decide to use the `git` version from the AUR, you can use the [Chaotic Aur](https://aur.chaotic.cx/) to get pre-built binaries.
Be aware that updating dependencies like `hyprutils` might still require you to recompile everything yourself as the Chaotic Aur does not do that automatically.
> [!NOTE]
> You can downgrade easily with [downgrade](https://github.com/archlinux-downgrade/downgrade) to get to a previous -git version.
{{% /details %}}
{{% details title="Nix" closed="true" %}}
Enable Hyprland in your NixOS configuration:
```nix
{
programs.hyprland.enable = true;
}
```
For more details, read the [Nix page](../../Nix).
{{% /details %}}
{{% details title="openSUSE*" closed="true" %}}
Hyprland is part of factory, starting with snapshot 20230411. To install it
simply use zypper
```sh
sudo zypper in hyprland
```
or install the "hyprland" package via YaST2 Software.
For `hyprpm` to recognize it's dependencies, you'll also need to install `hyprland-devel`:
```sh
sudo zypper in hyprland-devel
```
Alternatively, you can also follow the instructions under
["Manual (Manual Build)"](#manual-manual-build) to build Hyprland yourself.
Note: _Hyprland is not available for Leap, as most libraries (and compiler) that
Hyprland needs are too old._
{{% /details %}}
{{% details title="Fedora*" closed="true" %}}
On Fedora 40+, run:
```sh
sudo dnf install hyprland
sudo dnf install hyprland-devel # If you want to build plugins (use hyprpm)
```
Faster updates and additional packages are available in the
[solopasha/hyprland](https://copr.fedorainfracloud.org/coprs/solopasha/hyprland)
Copr repository.
If you are on an older version of Fedora, you can also compile it yourself by
following the instructions
[here](https://github.com/hyprwm/Hyprland/discussions/284)
{{% /details %}}
{{% details title="Debian*" closed="true" %}}
Hyprland recently made it into the SID repository and can be installed with
```sh
sudo apt install hyprland
```
Alternatively, you can also follow the instructions under
["Manual (Manual Build)"](#manual-manual-build) to build Hyprland yourself.
> [!NOTE]
> Hyprland is not available for Bookworm as its packages are too old.
{{% /details %}}
{{% details title="Gentoo*" closed="true" %}}
The hyprland package is available in the main tree:
```sh
emerge --ask gui-wm/hyprland
```
Additional packages like hyprlock, hypridle, xdg-desktop-portal-hyprland,
hyprland-plugins, hyprpaper and hyprpicker are available in the
[GURU](https://wiki.gentoo.org/wiki/Project:GURU) overlay. Community-contributed
scripts are also available in GURU as part of the hyprland-contrib package.
```sh
eselect repository enable guru
emaint sync -r guru
emerge --ask gui-apps/hyprlock
emerge --ask gui-apps/hypridle
emerge --ask gui-libs/xdg-desktop-portal-hyprland
emerge --ask gui-apps/hyprland-plugins
emerge --ask gui-apps/hyprpaper
emerge --ask gui-apps/hyprpicker
emerge --ask gui-wm/hyprland-contrib
```
For USE flags and more details, read the
[Gentoo wiki page](https://wiki.gentoo.org/wiki/Hyprland) about Hyprland.
{{% /details %}}
{{% details title="FreeBSD*" closed="true" %}}
Hyprland and related are in the default repository:
- [hyprland](https://www.freshports.org/x11-wm/hyprland)
- [hyprpaper](https://www.freshports.org/x11/hyprpaper)
- [hyprpicker](https://www.freshports.org/x11/hyprpicker)
- [xdg-desktop-portal-hyprland](https://www.freshports.org/x11/xdg-desktop-portal-hyprland)
- [Other Wayland stuff](https://www.freshports.org/wayland/)
{{% /details %}}
{{% details title="Ubuntu*" closed="true" %}}
> [!WARNING]
> Ubuntu's Hyprland is **extremely** outdated. I do not recommend using the packaged versions at all. Build the entire stack manually instead.
Hyprland made it into the Ubuntu 24.10 Oracular Oriole universe repo and can be installed with
```bash
sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install -y hyprland
```
> [!NOTE]
> NOTE: Above is for Ubuntu 24.10 (Unreleased) version
For installing Hyprland from Source, install first the dependencies below:
```bash
sudo apt install -y meson wget build-essential ninja-build cmake-extras cmake gettext gettext-base fontconfig libfontconfig-dev libffi-dev libxml2-dev libdrm-dev libxkbcommon-x11-dev libxkbregistry-dev libxkbcommon-dev libpixman-1-dev libudev-dev libseat-dev seatd libxcb-dri3-dev libegl-dev libgles2 libegl1-mesa-dev glslang-tools libinput-bin libinput-dev libxcb-composite0-dev libavutil-dev libavcodec-dev libavformat-dev libxcb-ewmh2 libxcb-ewmh-dev libxcb-present-dev libxcb-icccm4-dev libxcb-render-util0-dev libxcb-res0-dev libxcb-xinput-dev libtomlplusplus3 libre2-dev
```
You will also need to build the latest wayland, wayland-protocols, and
libdisplay-info tagged releases from source.
For screensharing, you can also install `xdg-desktop-portal-wlr` or `xdg-desktop-portal-hyprland`
```bash
sudo apt install -y xdg-desktop-portal-wlr
```
_Unfortunately, `xdg-desktop-portal-hyprland` still not in Ubuntu Repo so you have to build it from source_
See
[The xdph GitHub repo's readme](https://github.com/hyprwm/xdg-desktop-portal-hyprland). Refer to
[XDPH](../../Hypr-Ecosystem/xdg-desktop-portal-hyprland) and
[Ubuntu Guide For Installing And Building Hyprland Gist](https://gist.github.com/Vertecedoc4545/3b077301299c20c5b9b4db00f4ca6000)
for more information.
> [!WARNING]
> Please note that since Ubuntu is generally behind with dependencies, it's not
> guaranteed that the build process will work at all. Even if it is, it's likely
> that it will break at some point in the future.
> [!WARNING]
> Always use the latest version of Ubuntu for the most up to date dependencies.
>
> Note: Your mileage may vary, as GDM has some bugs with Hyprland. Check the [Master Tutorial](../Master-Tutorial) for more info.
>
> Refer to the gist if anything fails.
>
> <!-- For some reason uncommenting the line below creates an unwanted <pre><div></pre> in the page. -->
> <!-- -->
{{% /details %}}
{{% details title="Void Linux*" closed="true" %}}
Hyprland is not available from Void Linux's official repositories
due to the void developers being salty and personally disliking our main developer.
However, a [third party repository](https://github.com/Makrennel/hyprland-void)
is available with
[binary packages](https://github.com/Makrennel/hyprland-void/tree/repository-x86_64-glibc)
built in CI by GitHub Actions.
You can add this repository by creating a file such as
`/etc/xbps.d/hyprland-void.conf` with the following contents:
```plain {filename="/etc/xbps.d/hyprland-void.conf"}
repository=https://raw.githubusercontent.com/Makrennel/hyprland-void/repository-x86_64-glibc
```
Then you can install the packages as you would any other:
```sh
sudo xbps-install -S hyprland
sudo xbps-install -S hyprland-devel # If you want to use plugins
sudo xbps-install -S xdg-desktop-portal-hyprland
xbps-query -Rs hypr # This will require you to have already accepted the repository's fingerprint using xbps-install -S
```
More information is available in the
[hyprland-void README](https://github.com/Makrennel/hyprland-void/blob/master/README.md),
including information about how you can
[manually build](https://github.com/Makrennel/hyprland-void?tab=readme-ov-file#manually-building)
Hyprland for Void Linux using the templates provided.
{{% /details %}}
{{% details title="Slackware*" closed="true" %}}
```plain
hyprland-bin (SlackBuilds) - Prebuilt release for Slackware ready for install
```
Hyprland is not installed by default on the current release of Slackware.
For detailed instructions on installing this build see
[here](https://slackbuilds.org/repository/15.0/desktop/hyprland-bin/)
{{% /details %}}
{{% details title="Alpine*" closed="true" %}}
Hyprland is currently available in Alpine's [community repository](https://wiki.alpinelinux.org/wiki/Repositories#Community)
and it is maintained by the community.
The following command will install hyprland and its dependencies.
```plain
apk add hyprland
```
{{% /details %}}
{{% details title="Ximper*" closed="true" %}}
Install from the Sisyphus:
```bash
epmi hyprland
epmi hyprland-devel # If you want to use plugins
```
Ecosystem:
```bash
epmi xdg-desktop-portal-hyprland
epmi hypridle
epmi hyprpaper
epmi hyprpicker
```
{{% /details %}}
{{% details title="Solus*" closed="true" %}}
For Solus, run:
```bash
sudo eopkg install hyprland
```
{{% /details %}}
_**\* Unofficial, no official support is provided. These instructions are
community-driven, and no guarantee is provided for their validity.**_
### Manual
Dependencies:
> [!NOTE]
> Please note that Hyprland uses the C++26 standard, so both your compiler and your
> C++ standard library has to support that (`gcc>=15` or `clang>=19`).
{{% details title="Arch" closed="true" %}}
```plain
yay -S ninja gcc cmake meson libxcb xcb-proto xcb-util xcb-util-keysyms libxfixes libx11 libxcomposite libxrender libxcursor pixman wayland-protocols cairo pango libxkbcommon xcb-util-wm xorg-xwayland libinput libliftoff libdisplay-info cpio tomlplusplus hyprlang-git hyprcursor-git hyprwayland-scanner-git hyprwire-git xcb-util-errors hyprutils-git glaze hyprgraphics-git aquamarine-git re2 hyprland-qtutils-git muparser
```
_(Please make a pull request or open an issue if any packages are missing from
the list)_
{{% /details %}}
{{% details title="openSUSE" closed="true" %}}
```sh
zypper in gcc-c++ git meson cmake "pkgconfig(cairo)" "pkgconfig(egl)" "pkgconfig(gbm)" "pkgconfig(gl)" "pkgconfig(glesv2)" "pkgconfig(libdrm)" "pkgconfig(libinput)" "pkgconfig(libseat)" "pkgconfig(libudev)" "pkgconfig(pango)" "pkgconfig(pangocairo)" "pkgconfig(pixman-1)" "pkgconfig(vulkan)" "pkgconfig(wayland-client)" "pkgconfig(wayland-protocols)" "pkgconfig(wayland-scanner)" "pkgconfig(wayland-server)" "pkgconfig(xcb)" "pkgconfig(xcb-icccm)" "pkgconfig(xcb-renderutil)" "pkgconfig(xkbcommon)" "pkgconfig(xwayland)" "pkgconfig(xcb-errors)" glslang-devel Mesa-libGLESv3-devel tomlplusplus-devel
```
(this should also work on RHEL/Fedora if you remove `Mesa-libGLESv3-devel` and
`pkgconfig(xcb-errors)`)
{{% /details %}}
{{% details title="FreeBSD" closed="true" %}}
```sh
pkg install git pkgconf gmake gcc evdev-proto cmake wayland-protocols wayland libglvnd libxkbcommon libinput cairo pango pixman libxcb
pkg install meson jq hwdata libdisplay-info libliftoff
export CC=gcc CXX=g++ LDFLAGS="-static-libstdc++ -static-libgcc"
```
{{% /details %}}
{{% details title="Ubuntu" closed="true" %}}
refer to the Ubuntu tab above
{{% /details %}}
> [!WARNING]
> Additionally to those, you will also need a few hypr\* dependencies which may or may not be
> packaged for your distro of choice:
>
> - aquamarine
> - hyprlang
> - hyprcursor
> - hyprutils
> - hyprgraphics
> - hyprwayland-scanner (build-only)
### CMake (recommended)
```sh
git clone --recursive https://github.com/hyprwm/Hyprland
cd Hyprland
make all && sudo make install
```
_CMake is always recommended as it's the intended way Hyprland should be
installed._
## Crash on launch
See [Crashes and Bugs](../../Crashes-and-Bugs).
## Custom installation (debug build, etc)
1. cd into the hyprland repo.
2. for debug build:
```bash
make debug
sudo make install
```
3. Any other config: (replace `<PRESET>` with your preset: `release`, `debug`)
```bash
make <PRESET> && sudo cp ./build/Hyprland /usr/bin && sudo cp ./example/hyprland.desktop /usr/share/wayland-sessions
```
## Custom Build flags
To apply custom build flags, you'll have to ditch make.
Supported custom build flags on CMake:
```bash
NO_XWAYLAND - Removes XWayland support
NO_SYSTEMD - Removes systemd dependencies
NO_UWSM - Does not install the hyprland-uwsm.desktop file
NO_HYPRPM - Does not build and install hyprpm
```
Flags can be passed to CMake like this:
```bash
cmake --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release -D<FLAG>:STRING=true -B build
```
Change `<FLAG>` to one of the custom build flags. Multiple flags can be used at
once, by adding more `-D<FLAG_2>:STRING=true`.
The `BUILD_TYPE` can also be changed to `Debug`.
To build, run:
```bash
cmake --build ./build --config Release --target all -j`nproc 2>/dev/null || getconf NPROCESSORS_CONF`
```
If you configured in `Debug`, change the `--config` to `Debug` as well.
To install, run:
```bash
sudo cmake --install ./build
```
## Running In a VM
_YMMV, this is not officially supported._
Read through the
[libvirt Arch wiki page](https://wiki.archlinux.org/title/Libvirt) and get
`libvirt`, `virsh`, and `virt-viewer` setup and installed.
```bash
# Install libvirt and qemu things.
sudo pacman -S libvirt virt-viewer qemu-common
# Add yourself to the libvirt group.
sudo usermod -a -G libvirt USER # Replace 'USER' with your username.
# Enable and start libvirtd.
systemctl enable --now libvirtd
```
Go to the
[arch-boxes gitlab](https://gitlab.archlinux.org/archlinux/arch-boxes/-/packages)
and download the latest arch qemu basic image. You can also download via any of
arch's mirrors.
```bash
curl https://geo.mirror.pkgbuild.com/images/latest/Arch-Linux-x86_64-basic.qcow2 \
-o ~/Downloads/arch-qemu.qcow2 # Or download wherever you want.
```
Create the VM with virsh.
```bash
# Use virt-install (included with libvirt) to install the vm from the image.
virt-install \
--graphics spice,listen=none,gl.enable=yes,rendernode=/dev/dri/renderD128 \
--name hypr-vm \
--os-variant archlinux \
--memory 2048 \
--disk ~/Downloads/arch-qemu.qcow2 \
--import
```
Connect with `virt-viewer`, this will open a `virt-viewer` graphical session on
the tty. The default login is 'arch' for user and 'arch' for password.
> [!WARNING]
> Make sure the --attach flag is used, enabling virgl makes it so that
> we had to disable listen. This means that we can't make a direct TCP/UNIX
> socket connection to the remote display. --attach asks libvirt to provide a
> pre-connected socket to the display.\*
```sh
virt-viewer --attach hypr-vm
```
Finally on the guest follow the instructions above for either
[installing hyprland-git from the aur](#installation) or
[building manually](#manual-manual-build).
> [!WARNING]
> Make sure you install `mesa` as the OpenGL driver. The virgl drivers are
> included in `mesa`.

View File

@@ -0,0 +1,147 @@
---
weight: 2
title: Master tutorial
---
If you are coming to Hyprland for the first time, this is the main tutorial to
read.
This tutorial covers everything you need to get things going. It links to other
pages where necessary.
## Install Hyprland
See [Installation](../Installation) and come back here once you have
successfully installed Hyprland.
Install `kitty` (default terminal emulator). This is available in most distros'
repositories.
## Nvidia?
> [!NOTE]
> If not using an Nvidia card, skip this step.
Please take a look at [The Nvidia page](../../Nvidia) before launching. It has
information regarding the needed environment and tweaks.
## VM?
> [!NOTE]
> If not using a VM, skip this step.
In a VM, make sure you have 3D acceleration enabled in your `virtio` config (or
`virt-manager`) otherwise Hyprland _**will not work**_.
You can also passthru a GPU to make it work.
Please bear in mind 3D acceleration in VMs may be pretty slow.
## Launching Hyprland
Hyprland can be executed by typing `start-hyprland` in your tty.
If you are adventurous and on systemd, you can also try uwsm. Please note uwsm has some issues and for the majority of users, it's recommended to use Hyprland without it.
Uwsm provides additional features such as [xdg-autostart](https://www.freedesktop.org/software/systemd/man/latest/systemd-xdg-autostart-generator.html) support, launching any application as a systemd-unit with `uwsm app` helper, and the ability to enable services for programs that rely on a graphical session and provide such services (e.g waybar). See [uwsm](../../Useful-Utilities/Systemd-start) page for further instructions.
> [!WARNING]
> Do **not** launch Hyprland with `root` permissions (don't `sudo`)
You can see some launch flags by doing `start-hyprland -- -h`, these include setting the
config path, ignoring a check for the above, etc.
Login managers are not officially supported, but here's a short compatibility
list:
- SDDM → Works flawlessly. Install sddm ⩾ 0.20.0 or the
[latest git version](https://github.com/sddm/sddm) (or
[sddm-git](https://aur.archlinux.org/packages/sddm-git) from AUR) to prevent
SDDM bug [1476](https://github.com/sddm/sddm/issues/1476) (90s shutdowns).
- GDM → Works with the caveat of crashing Hyprland on the first launch.
- greetd → Works flawlessly, especially with
[ReGreet](https://github.com/rharish101/ReGreet).
- ly → Works flawlessly.
## DE-like pre-configured setups
Do you want to just get Hyprland pre-configured like a DE,
without making your own configuration from scratch?
Check out the [Preconfigured setups page](../Preconfigured-setups)
to see a few options.
These dotfiles should do everything for you, and have their own tutorials as well.
If you choose to use those, you can skip the next step. However, it's still recommended to read all the points below
it. They'll give you recommended apps, replacements for old X11 software, information about configuring displays,
etc.
## In Hyprland with the default config
You're good to go with your adventure, technically.
Use <key>SUPER</key> + <key>Q</key> to launch kitty. If you wish to choose the
default terminal before you proceed, you can do so in
`~/.config/hypr/hyprland.conf`
([example config](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf)).
If you want the best experience with less hassle googling, keep reading.
## Critical software
See the [Must-have Software page](../../Useful-Utilities/Must-have) for the
crucial things to make Wayland / Hyprland / other apps work correctly.
## Monitors config
See [Configuring Hyprland page](../../Configuring/Monitors) to learn all about
configuring your displays.
## Apps / X11 replacements
See the [Useful Utilities page](../../Useful-Utilities) and the
[Sway wiki page](https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway)
about that. You can also visit the
[Awesome-Hyprland](https://github.com/hyprland-community/awesome-hyprland)
repository for a more comprehensive list.
## Fully configure Hyprland
Head onto the
[Configuring Hyprland page](../../Configuring) to learn all
about configuring Hyprland to your liking.
## Cursors
Cursors are a notorious pain to set up when you don't know how. See
[this FAQ entry on changing your mouse cursor](../../FAQ#how-do-i-change-me-mouse-cursor)
If your cursor does not appear, see
[this FAQ entry on cursor not rendering](../../FAQ#me-cursor-no-render)
## Themes
Since Hyprland is not a fully-fledged Desktop Environment, you will need to use
tools such as `lxappearance` or `nwg-look` (recommended) for GTK, and `hyprqt6engine`
for qt6 apps.
## Force apps to use Wayland
A lot of apps will use Wayland by default. Chromium (and other browsers based on
it, or Electron) don't. You need to pass
`--enable-features=UseOzonePlatform --ozone-platform=wayland` to them or use
`.conf` files where possible. Chromium-based browsers also should have a toggle
in `chrome://flags`. Search for _"ozone"_ and select Wayland. If you are on
NixOS you can also set the environment variable `NIXOS_OZONE_WL=1` in your
configuration.
For most electron apps, you should put the above in
`~/.config/electron-flags.conf`. Note that VSCode is known **not** to work with
it.
A few more environment variables for forcing Wayland mode are documented
[here](../../Configuring/Environment-variables).
You can check whether an app is running in xwayland or not with
`hyprctl clients`.

View File

@@ -0,0 +1,62 @@
---
weight: 3
title: Preconfigured setups
---
Don't want to spend days tinkering with Hyprland to get it just right from scratch, but you'd
rather start from a DE-like setting? You've found the right place.
Here are a few options to consider:
## ML4W
ML4W or My Linux 4 Work, is a great DE-like experience out-of-the-box made by Stephan Raabe.
It includes simple gui settings apps, pre-configured feature-rich panels, a welcome app, and more.
[Website](https://www.ml4w.com/)
[GitHub](https://github.com/mylinuxforwork/dotfiles)
[Youtube](https://www.youtube.com/@mylinuxforwork)
![Image of ML4W dotfiles](https://i.ibb.co/7rxTRrw/395854121-47ed1ae0-a660-46f3-9bf5-917da0d3f675.png)
## JaKooLit
Another great option is installing JaKooLit's dotfiles. They are another feature-rich and very well
maintained option.
JaKooLit provides installation scripts for many distros for their dotfiles, with
many themes to choose from.
[GitHub](https://github.com/JaKooLit/Hyprland-Dots)
[Youtube](https://www.youtube.com/@Ja.KooLit)
![Image of JaKooLit's dotfiles](https://i.ibb.co/7tMsnTv/default-waybar.png)
## end_4
Like material styling? Want a lot of great apps? Don't mind a tiny bit of tinkering? end-4 has you covered.
[GitHub](https://github.com/end-4/dots-hyprland)
![Image of end-4's dotfiles](https://github.com/end-4/dots-hyprland/assets/97237370/5e081770-0f1e-45c4-ad9c-3d19f488cd85)
## HyDE
Prefer something more minimal, clean and aesthetic? Are you a terminal enjoyer?
HyDE dotfiles by HyDE Project are a very popular choice that will suit your needs.
[GitHub](https://github.com/HyDE-Project/HyDE)
![Image of HyDE dotfiles](https://i.ibb.co/W3SYJCc/showcase-2-2412602747.png)
## Omarchy
An opinionated Arch + Hyprland Setup by DHH.
[Website](https://omarchy.org/)
![Image of Omarchy](https://i.ytimg.com/vi/Cft6mZDzIng/maxresdefault.jpg)

View File

@@ -0,0 +1,9 @@
---
weight: 2
title: Getting Started
---
If you are coming to Hyprland for the first time, read the
[Installation](./Installation) page.
After you've installed Hyprland, read the [Master tutorial](./Master-Tutorial).

View File

@@ -0,0 +1,40 @@
---
weight: 4
title: Hypr Ecosystem
---
This wiki section hosts docs for various hypr* projects.
> [!NOTE]
> These docs always target the latest _-git_ branch of respective apps.
## Wiki Pages
Check out the wiki pages for each app, or their GitHub repo.
### User Apps and Utilities
- [hyprpaper](./hyprpaper) | [GitHub](https://github.com/hyprwm/hyprpaper)
- [hyprpicker](./hyprpicker) | [GitHub](https://github.com/hyprwm/hyprpicker)
- [hyprlauncher](./hyprlauncher) | [GitHub](https://github.com/hyprwm/hyprlauncher)
- [hypridle](./hypridle) | [GitHub](https://github.com/hyprwm/hypridle)
- [hyprlock](./hyprlock) | [GitHub](https://github.com/hyprwm/hyprlock)
- [xdg-desktop-portal-hyprland](./xdg-desktop-portal-hyprland) | [GitHub](https://github.com/hyprwm/xdg-desktop-portal-hyprland)
- [hyprsysteminfo](./hyprsysteminfo) | [GitHub](https://github.com/hyprwm/hyprsysteminfo)
- [hyprsunset](./hyprsunset) | [GitHub](https://github.com/hyprwm/hyprsunset)
- [hyprpolkitagent](./hyprpolkitagent) | [GitHub](https://github.com/hyprwm/hyprpolkitagent)
- [hyprland-qt-support](./hyprland-qt-support) | [GitHub](https://github.com/hyprwm/hyprland-qt-support)
- [hyprqt6engine](./hyprqt6engine) | [GitHub](https://github.com/hyprwm/hyprqt6engine)
- [hyprpwcenter](./hyprpwcenter) | [GitHub](https://github.com/hyprwm/hyprpwcenter)
- [hyprshutdown](./hyprshutdown) | [GitHub](https://github.com/hyprwm/hyprshutdown)
### Dev Libraries and Toolkits
- [hyprtoolkit](./hyprtoolkit) | [GitHub](https://github.com/hyprwm/hyprtoolkit)
- [hyprcursor](./hyprcursor) | [GitHub](https://github.com/hyprwm/hyprcursor)
- [hyprutils](./hyprutils) | [GitHub](https://github.com/hyprwm/hyprutils)
- [hyprlang](./hyprlang) | [GitHub](https://github.com/hyprwm/hyprlang)
- [hyprwayland-scanner](./hyprwayland-scanner) | [GitHub](https://github.com/hyprwm/hyprwayland-scanner)
- [aquamarine](./aquamarine) | [GitHub](https://github.com/hyprwm/aquamarine)
- [hyprgraphics](./hyprgraphics) | [GitHub](https://github.com/hyprwm/hyprgraphics)
- [hyprland-guiutils](./hyprland-guiutils) | [GitHub](https://github.com/hyprwm/hyprland-guiutils)

View File

@@ -0,0 +1,26 @@
---
weight: 105
title: aquamarine
---
[aquamarine](https://github.com/hyprwm/aquamarine) is a very light linux rendering backend library.
It is not a replacement or competitor to any other wayland compositor library (e.g. wlroots, libweston), instead implementing only the low-level KMS/DRM/etc rendering backends.
## Configuration
Configuration options are passed via environment variables starting with `AQ_` to an app that uses aquamarine, e.g. Hyprland.
### Variables
| Name | Description |
| --- | --- |
| `AQ_TRACE` | Enables trace (very, very verbose) logging. |
| `AQ_DRM_DEVICES` | A colon-separated list of DRM devices (aka. GPUs) to use. <br> The first will be used as primary. <br> Example: `/dev/dri/card1:/dev/dri/card0`. |
| `AQ_NO_MODIFIERS` | Disables modifiers for DRM buffers. |
| `AQ_MGPU_NO_EXPLICIT` | Disables passing of explicit fences for multi-gpu scanouts |
| `AQ_NO_ATOMIC` | **(HEAVILY NOT RECOMMENDED)** Disable atomic modesetting. |
## Documentation
Documentation will come soon.

View File

@@ -0,0 +1,79 @@
---
weight: 101
title: hyprcursor
---
[hyprcursor](https://github.com/hyprwm/hyprcursor) is a new cursor theme format that has many advantages
over the widely used xcursor.
## Hyprcursor Themes
You will need to obtain those yourself. If you are on the Discord server, see
`#hyprcursor-themes`.
Put your theme(s) in `~/.local/share/icons` or `~/.icons`
> [!WARNING]
> It's not recommended to put cursor themes in system-wide `/usr/share/icons` due
> to potential permission issues.
You can set your theme with envvars, or with `hyprctl setcursor`.
Env:
- `HYPRCURSOR_THEME` controls the theme.
- `HYPRCURSOR_SIZE` controls the cursor size.
example snippet of `hyprland.conf`:
```ini
env = HYPRCURSOR_THEME,MyCursor
env = HYPRCURSOR_SIZE,24
```
## Creating / Porting Themes
Go to the [hyprcursor repo](https://github.com/hyprwm/hyprcursor)
See the `docs/` and `hyprcursor-util/` directories for instructions.
## Important Notes
Although many apps support server-side cursors (e.g. Qt, Chromium, Electron,
Hypr Ecosystem) some apps still don't (e.g. GTK).
Apps that do not support server-side cursors and hyprcursor will still fall back
to XCursor.
For those apps, you need to export `XCURSOR_THEME` and `XCURSOR_SIZE` to a valid
XCursor theme, and run
```sh
gsettings set org.gnome.desktop.interface cursor-theme 'THEME_NAME'
```
for gtk.
If `gsettings` schemas are not available to you (e.g. on NixOS you will get `No schemas installed`), you can run instead:
```sh
dconf write /org/gnome/desktop/interface/cursor-theme "'THEME_NAME'"
```
If the app is a flatpak, run:
```sh
flatpak override --filesystem=~/.themes:ro --filesystem=~/.icons:ro --user
```
and put your themes in both `/usr/share/themes` and `~/.themes`,
also put your icons and XCursors in both `/usr/share/icons` and `~/.icons`.
## I Don't Want to Use hyprcursor
If you don't have any hyprcursor themes installed, Hyprland will fall back to XCursor, and use
whatever you define with `XCURSOR_THEME` and `XCURSOR_SIZE`.
## My Cursor Is a hyprland Icon?
See [FAQ](../../FAQ)

View File

@@ -0,0 +1,7 @@
---
weight: 106
title: hyprgraphics
---
[hyprgraphics](https://github.com/hyprwm/hyprgraphics) is a library providing shared implementations of some utilities relating to graphics
and resources, like loading images or color calculations.

View File

@@ -0,0 +1,109 @@
---
weight: 4
title: hypridle
---
[hypridle](https://github.com/hyprwm/hypridle) is Hyprland's idle management daemon.
## Configuration
Configuration is done via the config file at `~/.config/hypr/hypridle.conf`.
A config file is required; hypridle won't run without one.
To run hypridle at startup, edit `hyprland.conf` and add: `exec-once = hypridle`.
If Hyprland is started with [uwsm](../../Useful-Utilities/Systemd-start), you can use `systemctl --user enable --now hypridle.service`.
### General
Variables in the `general` category:
| Variable | Description | Type | Default |
| --- | --- | --- | --- |
| `lock_cmd` | command to run when receiving a dbus lock event (e.g. `loginctl lock-session`) | string | empty |
| `unlock_cmd` | command to run when receiving a dbus unlock event (e.g. `loginctl unlock-session`) | string | empty |
| `on_lock_cmd` | command to run when the session gets locked by a lock screen app | string | empty |
| `on_unlock_cmd` | command to run when the session gets unlocked by a lock screen app | string | empty |
| `before_sleep_cmd` | command to run when receiving a dbus prepare_sleep event | string | empty |
| `after_sleep_cmd` | command to run when receiving a dbus post prepare_sleep event | string | empty |
| `ignore_dbus_inhibit` | whether to ignore dbus-sent idle inhibit events (e.g. from firefox) | bool | `false` |
| `ignore_systemd_inhibit` | whether to ignore `systemd-inhibit --what=idle` inhibitors | bool | `false` |
| `ignore_wayland_inhibit` | whether to ignore Wayland protocol idle inhibitors | bool | `false` |
| `inhibit_sleep` | sleep inhibition mode: <br> `0`: disable <br> `1`: normal <br> `2`: auto <br> `3`: lock notify | int | `2` |
> [!NOTE]
> The `general:inhibit_sleep` option is used to make sure hypridle can perform certain tasks before the system goes to sleep.
>
> Options:
> - `0` disables sleep inhibition.
> - `1` makes the system wait until hypridle launched `general:before_sleep_cmd`.
> - `2` (auto) selects either `3` or `1` depending on whether hypridle detects if you want to launch hyprlock before sleep.
> - `3` makes your system wait until the session gets locked by a lock screen app. This works with all wayland session-lock apps.
### Listeners
Hypridle uses listeners to define actions on idleness.
Every listener has a _timeout_ (in seconds). After idling for _timeout_ seconds,
`on-timeout` will fire.
When action is resumed after idle, `on-resume` will fire.
Example listener:
```ini
listener {
timeout = 500 # in seconds.
on-timeout = notify-send "You are idle!" # command to run when timeout has passed.
on-resume = notify-send "Welcome back!" # command to run when activity is detected after timeout has fired.
}
```
You can define as many listeners as you want.
Variables in the `listener` category:
| variable | description | type | default |
| --- | --- | --- | --- |
| `timeout` | Idle time in seconds. | int | none, value must be specified |
| `on-timeout` | Command to run when timeout has passed. | string | empty |
| `on-resume` | Command to run when activity is detected after timeout has fired. | string | empty |
| `ignore_inhibit` | Ignore idle inhibitors (of all types) for this rule. | bool | `false` |
### Examples
Full hypridle example with hyprlock:
```ini
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
}
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
}
listener {
timeout = 300 # 5min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 330 # 5.5min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired.
}
listener {
timeout = 1800 # 30min
on-timeout = systemctl suspend # suspend pc
}
```

View File

@@ -0,0 +1,6 @@
---
weight: 107
title: hyprland-guiutils
---
[Hyprland GUI utilities](https://github.com/hyprwm/hyprland-guiutils) (successor to hyprland-qtutils)

View File

@@ -0,0 +1,17 @@
---
weight: 12
title: hyprland-qt-support
---
[hyprland-qt-support](https://github.com/hyprwm/hyprland-qt-support) provides a QML style for hypr* qt6 apps.
## Configuration
The config file is located in `~/.config/hypr/application-style.conf`.
| Variable | Description | Type | Default |
| --- | --- | --- | --- |
| `roundness` | How much to round UI elements. | int \[0 .. 3] | `1` |
| `border_width` | How wide the border should be around UI elements. | int \[0 - 3] | `1` |
| `reduce_motion` | Reduce motion of elements (transitions, hover effects, etc). | bool | `false` |

View File

@@ -0,0 +1,195 @@
---
weight: 103
title: hyprlang
---
[hyprlang](https://github.com/hyprwm/hyprlang) is a library that implements parsing for the hypr configuration language.
## Syntax
### Line Style
Every config line is a command followed by a value.
```ini
COMMAND = VALUE
```
The command can be a variable, or a special keyword (those are defined by the app
you are using).
Variables are like "options", while keywords are like "commands".
Options can be specified only once (if you do it more times, the previous one will be overwritten),
while commands invoke some behavior every time they are defined.
The trailing spaces at the beginning and end of words are not necessary, and are
there only for legibility.
### Categories
Categories can be regular, and "special".
Both are specified in the same way:
```ini
category {
variable = value
}
```
Special categories can have other properties, like for example containing a key:
```ini
special {
key = A
variable = value
}
special {
key = B
variable = value
}
```
This is like defining two "groups", one with the key of A, another with B.
Hyprland for example uses those for per-device configs.
### Defining variables
Variables can be defined like so:
```ini
$VAR = myData
```
Later on, you can use them like so:
```ini
$SUFFIX = -san
$NAME = Jeremy
greeting = Hello, $NAME$SUFFIX.
```
> [!NOTE]
> Spaces around or separating values are not mandatory
### Comments
Comments are started with the `#` character.
If you want to escape it (put an actual `#` and not start a comment) you can use `##`.
It will be turned into a single `#` that _will_ be a part of your line.
### Escaping Errors
If you use plugins, you may want to ignore errors from missing options/keywords
so that you don't get an error bar before they are loaded. To do so, do this:
```ini
# hyprlang noerror true
bind = MOD, KEY, something, amogus
someoption = blah
# hyprlang noerror false
```
### Inline Options
If you want to specify an option inline, without opening and closing a category, use the `:` separator:
```ini
category:variable = value
```
If the category is special and requires a key, you can write:
```ini
category[keyvalue]:variable = value
```
This is the syntax used by `hyprctl keyword`, for example.
### Arithmetic Operations
Since 0.6.3, hyprlang supports _very_ basic arithmetic operations on variables using `{{}}`
You can use `+`, `-`, `*`, or `/`, on only _two_ variables (or constants) are a time.
You _cannot_ nest them, but you can use intermittent variables.
Example:
```ini
$VAR1 = 2
$VAR2 = {{VAR1 + 3}}
$VAR3 = {{VAR2 * 2}}
someVariable = {{VAR3 / 2}}
someVariable2 = VAR3
```
This may throw some errors if done incorrectly. Make sure that:
- you only have two sides to the operation (**NOT** `{{a + b + c}}`, that has three)
- both sides either exist as numeric variables or are numeric themselves
- you have spaces around the operator (**NOT** `{{a+b}}`)
### Arithmetic Escaping
Since 0.6.4, hyprlang allows for escaping arithmetic expressions, e.g.`{{a + b}}`, by prefixing a `\`.
They can be used on any of the starting positions of the expression braces.
Example:
```ini
$VAR = \{{10 + 10}}
bind = MOD, KEY, exec, COMMAND "{\{10 + 10}}"
someVariable = \{\{10 + 10}}
```
This will not evaluate the expression, and instead just assign the raw value you wrote verbatim.
All of the `\` that were used to escape will be removed from the value as well.
So `\{{hello world}}` will turn into `{{hello world}}`, without trying to parse it as an expression.
### Escaping Escapes
Since 0.6.4, you can escape any `\` that would have been used to escape other characters.
For example, if you want to have a `\` before a real expression:
```ini
someVariable = \\{{VAR1 + 10}}
```
If you want to have an `\` before any of the escapable characters:
```ini
someOtherVariable = \\{ hello \\}
```
### Conditionals
Since 0.6.4, you can add conditionals to your configs.
You can make blocks conditional by using the `# hyprlang if` directive.
Some examples:
```ini
# hyprlang if MY_VAR
test = 24
# hyprlang endif
# hyprlang if !MY_VAR
test = 12
# hyprlang endif
```
> [!NOTE] Some important information
> - A variable is `true` if and only if it exists and is not an empty string.
> - Environment variables are supported.
> - Dynamic keywords (with `hyprctl keyword`) will **NOT** re-trigger or un-trigger these blocks.
Changes need to be made to the files directly (or environment) and in the case of the latter, or a hypr* app that doesn't automatically reload its config, a relaunch of the app / `hyprctl reload` (for hl) will be required.
## Developer Documentation
See the documentation at [hyprland.org/hyprlang](https://hyprland.org/hyprlang/).

View File

@@ -0,0 +1,62 @@
---
weight: 3
title: hyprlauncher
---
[hyprlauncher](https://github.com/hyprwm/hyprlauncher) is a multipurpose and versatile launcher / picker for hyprland. It's fast, simple, and provides
various modules.
## Usage
Hyprlauncher is _always_ a daemon. Launching it spawns a daemon that will listen to
requests. If launched with `hyprlauncher -d`, it will not open a window for the first launch.
To open hyprlauncher, just bind `hyprlauncher` to a key.
## Configuration
### Theming
Theme follows your [hyprtoolkit](../hyprtoolkit) theme.
### Config
`~/.config/hypr/hyprlauncher.conf`
Config categories and their values:
#### General
| Option | Description | Type | Default |
| -- | -- | -- | -- |
| `grab_focus` | Whether to force a full keyboard focus grab. | bool | `true` |
#### Cache
| Option | Description | Type | Default |
| -- | -- | -- | -- |
| enabled | Controls whether modules keep a cache of often used entries. <br> That history is stored on your disk, in plain text, in `~/.local/share/hyprlauncher`. | bool | `true` |
#### Finders
Available finders: `math`, `desktop`, `unicode`.
Prefixes can only be one character.
| option | description | type | default |
| -- | -- | -- | -- |
| `default_finder` | Controls the default finder used. | string | `desktop` |
| `desktop_prefix` | Prefix for the desktop finder to be used. | string | empty |
| `unicode_prefix` | Prefix for the unicode finder to be used. | string | `.` |
| `math_prefix` | Prefix for the math finder to be used. | string | `=` |
| `font_prefix` | Prefix for the font finder to be used. | string | `'` |
| `desktop_launch_prefix` | Launch prefix for each desktop app, e.g. `uwsm app -- `. | string | empty |
| `desktop_icons` | Whether to enable desktop icons in the results. | bool | `true` |
#### UI
| option | description | type | default |
| -- | -- | -- | -- |
| window_size | the size of the launcher | vec2 | `400 260` |

View File

@@ -0,0 +1,463 @@
---
weight: 5
title: hyprlock
---
[hyprlock](https://github.com/hyprwm/hyprlock) is a simple, yet fast, multi-threaded and GPU-accelerated screen lock
for Hyprland.
> [!WARNING]
> Hyprlock does not automatically create a config, and without one, hyprlock will _not render anything_.
> But even without a config, your session will get locked and thus Hyprland will cover your session with a black screen.
> You can unlock normally by typing your password followed by hitting Enter, but you won't have any visual feedback.
>
> You can use the example config for a quick start, which can be found [here](https://github.com/hyprwm/hyprlock/blob/main/assets/example.conf).
## Command-line Arguments
See also: `hyprlock --help`.
| argument | description |
| -- | -- |
| `-v` \| `--verbose` | Enable verbose logging |
| `-q` \| `--quiet` | Disable logging |
| `-c` FILE \| `--config` FILE | Specify config file to use |
| `--display` NAME | Specify the wayland display to connect to |
| `--grace` SECONDS | Set grace period in seconds before requiring authentication |
| `--immediate-render` | Do not wait for resources before drawing the background (Same as `general:immediate_render`) |
| `--no-fade-in` | Disable the fade-in animation when the lock screen appears |
| `-V` \| `--version` | Show version information and exit |
| `-h` \| `--help` | Show help and exit |
## Configuration
Configuration is done via the config file at `~/.config/hypr/hyprlock.conf`. This file must exist to run `hyprlock`.
### Variable Types
Hyprlock uses the following types in addition to [Hyprland's variable types](../../Configuring/Variables#Variable_types).
| type | description |
| -- | -- |
| layoutxy | vec2 with an optional `%` suffix, allowing users to specify sizes as percentages of the output size. <br> Floats (e.g. 10.5) are supported, but only have an effect when used with `%`. <br> Raw pixel values will just get rounded. |
### General
Variables in the `general` category:
| Variable | Description | Type | Default |
| -- | -- | -- | -- |
| `hide_cursor` | Hides the cursor instead of making it visible. | bool | `false` |
| `ignore_empty_input` | Skips validation when no password is provided. | bool | `false` |
| `immediate_render` | Makes hyprlock immediately start to draw widgets. <br> Backgrounds will render `background:color` until their `background:path` resource is available. | bool | `false` |
| `text_trim` | Sets if the text should be trimmed, useful to avoid trailing newline in commands output. | bool | `true` |
| `fractional_scaling` | Whether to use fractional scaling. <br> `0`: disabled <br> `1`: enabled <br> `2`: auto | int | `2` |
| `screencopy_mode` | Selects screencopy mode: <br> `0`: gpu accelerated <br> `1`: cpu based (slow) | int | `0` |
| `fail_timeout` | Milliseconds until the ui resets after a failed auth attempt | int | `2000` |
### Authentication
Variables in the `auth` category:
| Variable | Description | Type | Default |
| -- | -- | -- | -- |
| `pam:enabled` | Whether to enable pam authentication. | bool | `true` |
| `pam:module` | Sets the pam module used for authentication. If the module isn't found in `/etc/pam.d`, "su" will be used as a fallback. | str | `hyprlock` |
| `fingerprint:enabled` | Enables parallel fingerprint auth with fprintd. | bool | `false` |
| `fingerprint:ready_message` | Sets the message that will be displayed when fprintd is ready to scan a fingerprint. | str | `(Scan fingerprint to unlock)` |
| `fingerprint:present_message` | Sets the message that will be displayed when a finger is placed on the scanner. | str | `Scanning fingerprint` |
| `fingerprint:retry_delay` | Sets the delay in ms after an unrecognized finger is scanned before another finger can be scanned. | int | `250` |
> [!NOTE]
> At least one enabled authentication method is required.
### Animations
Variables in the `animations` category:
| variable | description | type | default |
| -- | -- | -- | -- |
| enabled | whether to enable animations | bool | `true` |
#### Keywords
The `animation` and `bezier` keywords can be used just like in `hyprland.conf`.
For Example:
```ini
bezier = linear, 1, 1, 0, 0
animation = fade, 1, 1.8, linear
```
Available animations can be found in the [animation tree](#animation-tree).
The optional `STYLE` parameter for the `animation` keyword is currently unused by hyprlock.
Check out Hyprland's [animation documentation](../../Configuring/Animations) for more information.
#### Animation Tree
```txt
global
↳ fade
↳ fadeIn - fade to lockscreen
↳ fadeOut - fade back to the wayland session
↳ inputField
↳ inputFieldColors - fade between colors and gradients
↳ inputFieldFade - fade_on_empty animation
↳ inputFieldWidth - adaptive width animation
↳ inputFieldDots - fade in/out for individual dots in the input field
```
### System Configuration
On Arch Linux, by default, hyprlock integrates with [pambase](https://archlinux.org/packages/?name=pambase) through `pam_faillock.so`, which forces a 10 minute timeout after 3 failed unlocks.
If you would like to change this, refer to the [arch linux wiki](https://wiki.archlinux.org/title/Security#Lock_out_user_after_three_failed_login_attempts) and update the file `/etc/security/faillock.conf` file with parameters `unlock_time`, `fail_interval`, and `deny` as needed.
## Keyboard Shortcuts and Actions
The following keys and key-combinations describe hyprlock's default behaviour:
| input | description |
| -- | -- |
| `ESC` | Clear password buffer |
| `Ctrl + u` | Clear password buffer |
| `Ctrl + Backspace` | Clear password buffer |
## Widgets
The entire configuration of how hyprlock looks is done via widgets.
```ini
widget_name {
monitor =
# further options
}
```
### Monitor Selection
`monitor` is available for all widgets and can be left empty for "all monitors".
It takes the same string that is used to reference monitors in the hyprland configuration.
So either use the portname (e.g. `eDP-1`) or the monitor description (e.g. `desc:Chimei Innolux Corporation 0x150C`).
See [Monitors](../../Configuring/Monitors).
### Variable Substitution
The following variables in widget text options will be substituted.
- `$USER` - username (e.g. linux-user)
- `$DESC` - user description (e.g. Linux User)
- `$TIME` - current time in 24-hour format (e.g. `13:37`)
- `$TIME12` - current time in 12-hour format (e.g. `1:37 PM`)
- `$LAYOUT` - current keyboard layout
- `$ATTEMPTS` - failed authentication attempts
- `$FAIL` - last authentication fail reason
- `$PAMPROMPT` - pam auth last prompt
- `$PAMFAIL` - pam auth last fail reason
- `$FPRINTPROMPT` - fingerprint auth last prompt
- `$FPRINTFAIL` - fingerprint auth last fail reason
## Widget List
### General Remarks
- All rendered text supports
[pango markup](https://docs.gtk.org/Pango/pango_markup.html).
- Additionally hyprlock will parse `<br/>` for your convenience. (That's a
linebreak) Remember to enable linebreaks in your spans with
`allow_breaks="true"`.
- Positioning is done via halign, valign, position, and zindex. Position is an added
offset to the result of alignment.
- halign: `left`, `center`, `right`, `none`. valign: `top`, `center`,
`bottom`, `none`
- zindex: Widgets with larger numbers will be placed above widgets with smaller numbers. All widgets default to 0, except background which defaults to -1.
- All `position` and `size` options can be specified in pixels or as percentages of the output size.
- pixels: `10, 10` or `10px, 10px`
- percentages: `10%, 10.5%`
- mixed: `10%, 5px`
- Supported image formats are png, jpg and webp (no animations though)
### Shadowable
Some widgets are shadowable, meaning they can have a shadow. For those widgets, you get:
| Variable | Description | Type | Default |
| -- | -- | -- | -- |
| `shadow_passes` | Passes for shadow, 0 to disable. | int | `0` |
| `shadow_size` | Size for shadow. | int | `3` |
| `shadow_color` | Shadow color. | color | `rgb(0,0,0)` |
| `shadow_boost` | Boost shadow's opacity. | float | `1.2` |
### Clickable
Some widgets are clickable. Namely `label`, `image` and `shape`.
You can launch arbitrary commands when clicking on them by configuring the following option within the widget:
| variable | description | type | default |
| -- | -- | -- | -- |
| `onclick` | Command to run when clicked. | str | empty |
### Background
Draws a background image or fills with color.
If `path` is empty or missing, will use `color`, otherwise, the image will be used.
If `path` is `screenshot`, a screenshot of your desktop at launch will be used.
| Variable | Description | Type | Default |
|--|--|--|--|
| `monitor` | Monitor to draw on. | str | empty |
| `path` | Image path, `screenshot` or empty to fill with `color`. | str | empty |
| `color` | Fallback background color | color | `rgba(17, 17, 17, 1.0)` |
| `blur_passes` | The amount of passes to perform. <br> `0` disables blurring. | int | `0` |
| `blur_size` | Blur size (distance). | int | `7` |
| `noise` | How much noise to apply. | float | `0.0117` |
| `contrast` | Contrast modulation for blur. | float | `0.8916` |
| `brightness` | Brightness modulation for blur. | float | `0.8172` |
| `vibrancy` | Increase saturation of blurred colors. | float | `0.1696` |
| `vibrancy_darkness` | How strong the effect of vibrancy is on dark areas. | float | `0.05` |
| `reload_time` | Seconds between reloading, `0` to reload with `SIGUSR2`. <br> Ignored if `path` is `screenshot`. | int | `-1` |
| `reload_cmd` | Command to get new path. If empty, old path will be used. | str | empty |
| `crossfade_time` | Cross-fade time in seconds between old and new background on reload. <br> A negative value means no cross-fade. | float | `-1.0` |
| `zindex` | z-index of the widget. | int | `-1` |
> [!NOTE]
> Blur options are taken from hyprland.
> See [Variables/#blur](../../Configuring/Variables/#blur).
{{% details title="Example background" closed="true" %}}
```ini
background {
monitor =
path = screenshot
color = rgba(25, 20, 20, 1.0)
blur_passes = 2
}
```
{{% /details %}}
### Image
&check; Shadowable
&check; Clickable
Draws an image.
If `path` is empty or missing, nothing will be shown.
| Variable | Description | Type | Default |
|--|--|--|--|
| `monitor` | Monitor to draw on | str | _empty_ |
| `path` | Image path | str | _empty_ |
| `size` | Size scale based on the lesser side of the image. | int | `150` |
| `rounding` | Negative values result in a circle. | int | `-1` |
| `border_size` | Border size. | int | `4` |
| `border_color` | Border color. | gradient | `rgba(221, 221, 221, 1.0)` |
| `rotate` | Rotation in degrees, counter-clockwise. | int | `0` |
| `reload_time` | Seconds between reloading, `0` to reload with `SIGUSR2`. | int | `-1` |
| `reload_cmd` | Command to get new path. if empty, old path will be used. don't run "follow" commands like `tail -F`. | str | _empty_ |
| `position` | Position of the image. | layoutxy | `0, 0` |
| `halign` | Horizontal alignment. | str | `center` |
| `valign` | Vertical alignment. | str | `center` |
| `zindex` | z-index of the widget. | int | `0` |
{{% details title="Example image" closed="true" %}}
```ini
image {
monitor =
path = /home/me/cutie.png
size = 150
rounding = 0 # no rounding
position = 0, 200
halign = center
valign = center
}
```
{{% /details %}}
### Shape
&check; Shadowable
&check; Clickable
Draws a shape.
| Variable | Description | Type | Default |
|--|--|--|--|
| `monitor` | Monitor to draw on. | str | _empty_ |
| `size` | Size of the shape. | layoutxy | 100, 100 |
| `color` | Color of the shape. | color | `rgba(17, 17, 17, 1.0)` |
| `rounding` | Negative values result in a circle. | int | `-1` |
| `rotate` | Rotation in degrees, counter-clockwise. | int | `0` |
| `border_size` | Border size. | int | `0` |
| `border_color` | Border color. | gradient | `rgba(0, 207, 230, 1.0)` |
| `xray` | If `true`, make a "hole" in the background (rectangle of specified size, no rotation). | bool | `false` |
| `position` | Position of the shape. | layoutxy | `0, 0` |
| `halign` | Horizontal alignment. | str | `center` |
| `valign` | Vertical alignment. | str | `center` |
| `zindex` | z-index of the widget. | int | `0` |
{{% details title="Example shape" closed="true" %}}
```ini
shape {
monitor =
size = 360, 60
color = rgba(0, 0, 0, 0.0) # no fill
rounding = -1 # circle
border_size = 4
border_color = rgba(0, 207, 230, 1.0)
position = 0, 80
halign = center
valign = center
}
```
{{% /details %}}
### Input Field
&check; Shadowable
Draws a password input field.
| Variable | Description | Type | Default |
|--|--|--|--|
| `monitor` | Monitor to draw on. | str | _empty_ |
| `size` | Size of the input field. | layoutxy | `400, 90` |
| `outline_thickness` | Thickness of the outline. | int | `4` |
| `dots_size` | Size of the dots. [0.2 - 0.8] | float | `0.25` |
| `dots_spacing` | Spacing between dots. [-1.0 - 1.0] | float | `0.15` |
| `dots_center` | Whether to center the dots. Align left otherwise. | bool | `true` |
| `dots_rounding` | Rounding of the dots. | int | `-1` |
| `dots_text_format` | Text character(s) used for the input indicator, rounded rectangles are the default. | str | _empty_ |
| `outer_color` | Border color. | gradient | `rgba(17, 17, 17, 1.0)` |
| `inner_color` | Color of the inner box. | color | `rgba(200, 200, 200, 1.0)` |
| `font_color` | Color of the font. | color | `rgba(10, 10, 10, 1.0)` |
| `font_family` | Font family. | str | `Noto Sans` |
| `fade_on_empty` | Fade the input field when empty. | bool | `true` |
| `fade_timeout` | Milliseconds before `fade_on_empty` is triggered. | int | `2000` |
| `placeholder_text` | Text rendered in the input box when it's empty. | str | `<i>Input Password...</i>` |
| `hide_input` | Render an input indicator similar to swaylock instead of dots when set to `true`. | bool | `false` |
| `hide_input_base_color` | This color's hue is randomly rotated (oklab color space) to get colors for `hide_input`. | color | `rgba(153, 170, 187)` |
| `rounding` | `-1` means complete rounding (circle/oval). | int | `-1` |
| `check_color` | Color accent when waiting for the authentication result. | gradient | `rgba(204, 136, 34, 1.0)` |
| `fail_color` | Color accent when authentication fails. | gradient | `rgba(204, 34, 34, 1.0)` |
| `fail_text` | Text rendered when authentication fails. | str | `<i>$FAIL <b>($ATTEMPTS)</b></i>` |
| `capslock_color` | Color accent when capslock is active. | gradient | _empty_ |
| `numlock_color` | Color accent when numlock is active. | gradient | _empty_ |
| `bothlock_color` | Color accent when both locks are active. | gradient | _empty_ |
| `invert_numlock` | Change color if numlock is off. | bool | `false` |
| `swap_font_color` | Swap font and inner colors on color change events. | bool | `false` |
| `position` | Position of the input field. | layoutxy | `0, 0` |
| `halign` | Horizontal alignment. | str | `center` |
| `valign` | Vertical alignment. | str | `center` |
| `zindex` | z-index of the widget. | int | `0` |
> [!NOTE] **Colors information**
>
> When `outline_thickness` set to `0`, the color of the inner box will be changed instead of the outer.
> Behaviour of `swap_font_color` is as follows:
> - `outline_thickness` is `0`: if set, font color will be swapped with inner one on color change events (e.g. Caps-lock on or password check).
> - `outline_thickness` is not `0`: if set, font and inner colors will be swapped on password check and authentication failure.
> - `swap_font_color` will narrow the accent colors from a gradient to a single color by using the first specified color.
`placeholder_text` and `fail_text` both support [variable substitution](#variable-substitution).
{{% details title="Example input-field" closed="true" %}}
```ini
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
position = 0, -20
halign = center
valign = center
}
```
{{% /details %}}
### Label
&check; Shadowable
&check; Clickable
Draws a label.
| Variable | Description | Type | Default |
|--|--|--|--|
| `monitor` | Monitor to draw on. | str | _empty_ |
| `text` | Text to render. | str | `Sample Text` |
| `text_align` | Multi-line text alignment inside label container. center/right or any value for default left. | str | `center` |
| `color` | Color of the text. | color | `rgba(254, 254, 254, 1.0)` |
| `font_size` | Size of the font. | int |`16` |
| `font_family` | Font family. | str | `Sans` |
| `rotate` | Rotation in degrees, counter-clockwise. | int | `0` |
| `position` | Position of the label. | layoutxy | `0, 0` |
| `halign` | Horizontal alignment. | str | `center` |
| `valign` | Vertical alignment. | str | `center` |
#### Dynamic Labels
The `text` option supports [variable substitution](#variable-substitution) and launching shell commands.
For example:
```ini
text = cmd[update:1000] echo "<span foreground='##ff2222'>$(date)</span>"
```
> [!NOTE]
> - `update:` time is in ms.
> - label can be forcefully updated by specifying `update:<time>:1` or `update:<time>:true` and sending `SIGUSR2` to hyprlock, `<time>` can be `0` in this case.
> - `$ATTEMPTS[<string>]` format can be used to show `<string>` when there are no failed attempts.
You can use pango-markup here. `<string>` can be empty to hide.
> - `$LAYOUT[<str0>,<str1>,...]` format is available to replace indexed layouts.
You can use settings from `hyprland.conf`, e.g. `$LAYOUT[en,ru,de]`.
Also, a single `!` character will hide layout. E.g. `$LAYOUT[!]` will hide default (0 indexed) and show others.
> - `$TIME` and `$TIME12` will use timezone from the TZ environment variable.
If it's not set, the system timezone will be used, falling back to UTC in case of errors.
> - Variables seen above are parsed _before_ the command is ran.
> - **Do not** run commands that never exit. This will hang the `AsyncResourceGatherer` and you won't have a good time.
{{% details title="Example label" closed="true" %}}
```ini
label {
monitor =
text = Hi there, $USER
color = rgba(200, 200, 200, 1.0)
font_size = 25
font_family = Noto Sans
position = 0, 80
halign = center
valign = center
}
```
{{% /details %}}
## User Signals
- `SIGUSR1`: Unlocks hyprlock. For example, you can switch to a another tty and run `pkill -USR1 hyprlock`.
- `SIGUSR2`: Updates labels and images. See above.

View File

@@ -0,0 +1,90 @@
---
weight: 1
title: hyprpaper
---
[hyprpaper](https://github.com/hyprwm/hyprpaper) is a fast, IPC-controlled wallpaper utility for Hyprland.
## Installation
{{% details title="Arch" closed="true" %}}
```sh
pacman -S hyprpaper
```
{{% /details %}}
{{% details title="openSUSE" closed="true" %}}
```sh
zypper install hyprpaper
```
{{% /details %}}
{{% details title="Fedora" closed="true" %}}
```sh
sudo dnf install hyprpaper
```
{{% /details %}}
## Configuration
The config file is located at `~/.config/hypr/hyprpaper.conf`. It is not
required.
### Setting wallpapers
Wallpapers are set as anonymous special categories. Monitor can be left empty for a fallback.
| variable | description | value |
| --- | --- | --- |
| `monitor` | Monitor to display this wallpaper on. If empty, will use this wallpaper as a fallback | monitor ID |
| `path` | Path to the image file | path |
| `fit_mode` | Determines how to display the image. Optional and defaults to `cover` | `contain`\|`cover`\|`tile`\|`fill` |
```ini
wallpaper {
monitor = DP-3
path = ~/myFile.jxl
fit_mode = cover
}
wallpaper {
monitor = DP-2
path = ~/myFile2.jxl
fit_mode = cover
}
# ...
```
### Run at Startup
To run hyprpaper at startup edit `hyprland.conf` and add: `exec-once = hyprpaper`.
If you start Hyprland with [uwsm](../../Useful-Utilities/Systemd-start), you can also use the `systemctl --user enable --now hyprpaper.service` command.
### Misc Options
These should be set outside of the `wallpaper{...}` sections.
| variable | description | type | default |
| --- | --- | --- | --- |
| `splash` | enable rendering of the hyprland splash over the wallpaper | bool | `true` |
| `splash_offset` | how far up should the splash be displayed | float | `20` |
| `splash_opacity` | how opaque the splash is | float | `0.8` |
| `ipc` | whether to enable IPC | bool | `true` |
## IPC
hyprpaper supports IPC via `hyprctl`. You can set wallpapers like so:
```sh
hyprctl hyprpaper wallpaper '[mon], [path], [fit_mode]'
```
`fit_mode` is optional, and `mon` can be empty for a fallback, just like in the config file.

View File

@@ -0,0 +1,25 @@
---
weight: 2
title: hyprpicker
---
[hyprpicker](https://github.com/hyprwm/hyprpicker) is a neat utility for picking a color from your screen on Hyprland.
## Configuration
Doesn't require configuration, only launch flags:
| Flag | Description | Args |
| --- | --- | --- |
| `-a` \| `--autocopy` | Automatically copies the output to the clipboard (requires wl-clipboard) | none |
| `-f` \| `--format=` | Specifies the output format | `cmyk` \| `hex` \| `rgb` \| `hsl` \| `hsv` |
| `-n` \| `--no-fancy` | Disables the "fancy" (aka. colored) outputting | none |
| `-h` \| `--help` | Shows the help message | none |
| `-r` \| `--render-inactive` | Render (freeze) inactive displays | none |
| `-z` \| `--no-zoom` | Disable the zoom lens | none |
| `-q` \| `--quiet` | Disable most logs (leaves errors) | none |
| `-v` \| `--verbose` | Enable more logs | none |
| `-t` \| `--no-fractional` | Disable fractional scaling support | none |
| `-d` \| `--disable-hex-preview` | Disable live preview of Hex code | none |
| `-l` \| `--lowercase-hex` | Outputs the hexcode in lowercase | none |
| `-V` \| `--version` | Print version info | none |

View File

@@ -0,0 +1,25 @@
---
weight: 11
title: hyprpolkitagent
---
[hyprpolkitagent](https://github.com/hyprwm/hyprpolkitagent) is a polkit authentication daemon. It is required for GUI applications to
be able to request elevated privileges.
If it's not available in your distro's repositories, you can either [build it from source](https://github.com/hyprwm/hyprpolkitagent)
or use a different agent, e.g. [KDE's one](https://github.com/KDE/polkit-kde-agent-1/).
## Usage
Add `exec-once = systemctl --user start hyprpolkitagent` to your Hyprland config and restart hyprland.
(obviously change that to whatever you are using if you are not using the hypr one)
If Hyprland is started with [uwsm](../../Useful-Utilities/Systemd-start), you can autostart the polkit agent with the command `systemctl --user enable --now hyprpolkitagent.service`.
On distributions that use a different init system, such as Gentoo, it may be
necessary to use
`exec-once=/usr/lib64/libexec/hyprpolkitagent` instead.
Other possible paths include
`/usr/lib/hyprpolkitagent` and
`/usr/libexec/hyprpolkitagent`.

View File

@@ -0,0 +1,7 @@
---
weight: 14
title: hyprpwcenter
---
[hyprpwcenter](https://github.com/hyprwm/hyprpwcenter) is a GUI control center for pipewire. It allows to
look and confiure nodes, outputs, and adjust the pw graph.

View File

@@ -0,0 +1,39 @@
---
weight: 13
title: hyprqt6engine
---
[hyprqt6engine](https://github.com/hyprwm/hyprqt6engine) provides a theme for QT6 apps. It's a replacement for qt6ct, compatible with KDE Apps / KColorScheme.
## Usage
Install, then set `QT_QPA_PLATFORMTHEME=hyprqt6engine`.
You can set this as `env=` in Hyprland, or in `/etc/environment` for setting it system-wide.
## Configuration
The config file is located in `~/.config/hypr/hyprqt6engine.conf`.
### Theme
category `theme:`
| Variable | Description | Type | Default |
| --- | --- | --- | --- |
| `color_scheme` | The full path to a color scheme. <br> Can be a qt6ct theme, or a KColorScheme. <br> Leave empty for defaults. | string | _empty_ |
| `icon_theme` | Name of an icon theme to use. | string | _empty_ |
| `style` | Widget style to use, e.g. Fusion or kvantum-dark. | string | `Fusion` |
| `font_fixed` | Font family for the fixed width font. | string | `monospace` |
| `font_fixed_size` | Font size for the fixed width font. | int | `11` |
| `font` | Font family for the regular font. | string | `Sans Serif` |
| `font_size` | Font size for the regular font. | int | `11` |
### Misc
category `misc:`
| Variable | Description | Type | Default |
| --- | --- | --- | --- |
| `single_click_activate` | Whether single-clicks should activate, or open. | bool | `true` |
| `menus_have_icons` | Whether context menus should include icons. | bool | `true` |
| `shortcuts_for_context_menus` | Whether context menu options should show their keyboard shortcuts. | bool | `true` |

View File

@@ -0,0 +1,18 @@
---
weight: 15
title: hyprshutdown
---
[hyprshutdown](https://github.com/hyprwm/hyprshutdown) is a graceful shutdown utility. It opens
a GUI and gracefully asks apps to exit, then quits Hyprland. It's the recommended way to exit hyprland,
as otherwise (e.g. `dispatch exit`) apps will die instead of exiting.
## Tips and tricks
If you want to shut the system down, or reboot, instead of logging out, you can do things like this:
```sh
hyprshutdown -t 'Shutting down...' --post-cmd 'shutdown -P 0'
hyprshutdown -t 'Restarting...' --post-cmd 'reboot'
```

View File

@@ -0,0 +1,122 @@
---
weight: 10
title: hyprsunset
---
[hyprsunset](https://github.com/hyprwm/hyprsunset) is a small utility to provide a blue light filter
for your system.
This method is preferred to screen shaders as it will _not_ be captured via recording / screenshots.
hyprsunset also provides a gamma filter, which can be used to
adjust perceived display brightness on monitors that do not
support software control, or to reduce perceived brightness
below the monitor's minimum.
> [!WARNING]
> `hyprsunset` is supported since Hyprland 0.45.0.
## Installation
{{< tabs items="Arch Linux" >}}
{{< tab "Arch Linux" >}}
```sh
pacman -S hyprsunset
```
{{< /tab >}}
{{< /tabs >}}
## Configuration
Configuration is done via the config file at `~/.config/hypr/hyprsunset.conf`.
This file is not required for running hyprsunset, though recommended.
Hyprsunset uses profiles to determine when to change temperature and gamma.
You can define as many profiles as you like.
Each Profile is activated at it's specified time and resets all options set by other profiles.
On startup, hyprsunset will apply the current profile.
For example, when launching hyprsunset with the following example config at 20:00, it will activate the first profile, essentially changing nothing.
Once the clock strikes 21:00, hyprsunset will automatically apply the new profile.
**Example Configuration**
```ini
max-gamma = 150
profile {
time = 7:30
identity = true
}
profile {
time = 21:00
temperature = 5500
gamma = 0.8
}
```
| Variable | Description | Type | Default |
| -- | -- | -- | -- |
| `max-gamma` | The maximum the gamma value can be. <br> Absolute maximum is `200`%. <br> Mostly useful when controlling hyprsunset via IPC. | int | `100` |
### Profile
| Variable | Description | Type | Default |
| -- | -- | -- | -- |
| `time` | The time at which the profile should be activated. <br> Must be in the format {hours}:{minutes} | string | `00:00` |
| `temperature` | The screen temperature. Lower means warmer. | int | `6000` |
| `gamma` | The perceived brightness of the screen. <br> This will allow you to lower the brightness beyond your screen's minimum. | float | `1.0` |
| `identity` | When set, the value of temperature is ignored and the only effect of hyprsunset is the change in apparent brightness by gamma. | bool | `false` |
## Usage
To autostart hyprsunset, add: `exec-once = hyprsunset` to your `hyprland.conf`.
Alternatively, use `systemctl --user enable --now hyprsunset.service` in order to use hyprsunset as a systemd user service.
Hyprsunset can also be controlled by supplying arguments to the command.
By specifying `hyprsunset --temperature 5000` you will override the current active config's temperature setting. This however, will be overridden once a new profile is activated.
For more information on cli arguments, run `hyprsunset --help`
## IPC
`hyprsunset` supports IPC via hyprctl.
Both color temperature and the gamma filter are adjustable:
```sh
# Enable blue-light filter
hyprctl hyprsunset temperature 2500
# Disable blue-light filter
hyprctl hyprsunset identity
# Set gamma to 50%
hyprctl hyprsunset gamma 50
# Increase gamma by 10%
hyprctl hyprsunset gamma +10
# Reset config to current profile
hyprctl hyprsunset reset
# Reset value to current profile
hyprctl hyprsunset reset temperature
hyprctl hyprsunset reset gamma
hyprctl hyprsunset reset identity
# Print current profile
hyprctl hyprsunset profile
```
This can be used by other software to change the temperature throughout the day, or to adjust perceieved
monitor brightness, such as with the following Hyprland keybinds:
```ini
bindel = ,XF86MonBrightnessDown, exec, hyprctl hyprsunset gamma -10
bindel = ,XF86MonBrightnessUp, exec, hyprctl hyprsunset gamma +10
```
> [!WARNING]
> Using the gamma control will degrade color accuracy. If your monitor does support software control, it is highly recommended to use that instead.

View File

@@ -0,0 +1,7 @@
---
weight: 9
title: hyprsysteminfo
---
[hyprsysteminfo](https://github.com/hyprwm/hyprsysteminfo) is a small GUI application to display your system information,
as well as easily copy the hyprland version or system info to your clipboard.

View File

@@ -0,0 +1,33 @@
---
weight: 100
title: hyprtoolkit
---
[hyprtoolkit](https://github.com/hyprwm/hyprtoolkit) is a GUI toolkit for developing applications that run natively on Wayland.
It's specifically made for Hyprland's needs, but will generally run on any Wayland compositor
that supports modern standards.
For developer docs, see [development](./development)
## Configuration
The general toolkit config is at `~/.config/hypr/hyprtoolkit.conf`.
It contains theming and some minor adjustments.
| Variable | Description | Type | Default |
| --- | --- | --- | --- |
| `background` | Background color. | color | `FF181818` |
| `base` | Base color. | color | `FF202020` |
| `text` | Text color. | color | `FFDADADA` |
| `alternate_base` | Alternative base color. | color | `FF272727` |
| `bright_text` | Bright text color. | color | `FFFFDEDE` |
| `accent` | Accent color. | color | `FF00FFCC` |
| `accent_secondary` | Secondary accent color. | color | `FF0099F0` |
| `h1_size` | Font size for H1. | int | `19` |
| `h2_size` | Font size for H2. | int | `15` |
| `h3_size` | Font size for H3. | int | `13` |
| `font_size` | Font size for regular text elements. | int | `11` |
| `small_font_size` | Font size for small text elements. | int | `10` |
| `icon_theme` | Name of the icon theme to use, empty for "the first found". | string | _empty_ |
| `font_family` | Name of the font family to use. | string | `Sans Serif` |
| `font_family_monospace` | Name of the monospace font family to use. | string | `monospace` |

View File

@@ -0,0 +1,138 @@
---
weight: 50
title: Development
---
Hyprtoolkit is a pure C++ toolkit. It relies on modern C++ in the Hyprland style (with
hyprutils, etc).
It's recommended you are familiar with C++ before developing an app.
## Getting Started
_If you prefer living off of examples, see the `tests/` directory in the hyprtoolkit repo._
Start by creating a backend and opening a window:
```cpp
// in this example we are doing this to skip Hyprtoolkit::
using namespace Hyprtoolkit;
auto backend = CBackend::create();
auto window = CWindowBuilder::begin()->appTitle("Hello")->appClass("hyprtoolkit")->commence();
```
this will create (but not yet open) a window handle for you.
Hyprtoolkit is a retained mode toolkit, so you can define your layout with C++ and forget about it.
First thing we need is a background rectangle, by doing this:
```cpp
window->m_rootElement->addChild(CRectangleBuilder::begin()->color([] { return backend->getPalette()->m_colors.background; })->commence());
```
> [!NOTE]
> Remember to always use the palette when possible for your app to adhere to the user's theme.
All elements are under `hyprtoolkit/elements/`, you can browse through them. Let's add a simple layout with
some buttons:
```cpp
auto layout = CColumnLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_PERCENT, {1.F, 1.F}})->commence();
layout->setMargin(3);
window->m_rootElement->addChild(layout);
layout->addChild(CButtonBuilder::begin()
->label("Do something")
->onMainClick([](SP<CButtonElement> el) { std::println("Did something!"); })
->size({CDynamicSize::HT_SIZE_AUTO, CDynamicSize::HT_SIZE_AUTO, {1, 1}})
->commence()
);
layout->addChild(CButtonBuilder::begin()
->label("Do something else")
->onMainClick([](SP<CButtonElement> el) { std::println("Did something else!"); })
->size({CDynamicSize::HT_SIZE_AUTO, CDynamicSize::HT_SIZE_AUTO, {1, 1}})
->commence()
);
```
This adds a column layout (elements are stacked on top of each other) with two buttons. These buttons have automatic sizing, so will fit their contents.
Once you are done, add a close callback, open the window and enter the main loop:
```cpp
window->m_events.closeRequest.listenStatic([w = WP<IWindow>{window}] {
w->close();
backend->destroy();
});
window->open();
backend->enterLoop();
```
## Layout System
The layout system relies on absolute and layout positioning modes. Let's zoom into both:
### Absolute Mode
This happens when the parent of your element is anything but a `ColumnLayout` or a `RowLayout`. Children are positioned within their parent, accoding to their
position mode. You can set it with `setPositionMode` and add offsets with `setAbsolutePosition`.
For example:
- `setPositionMode` with `CENTER` will center the child inside the parent.
- `setPositionMode` with `ABSOLUTE` will make it be in the top left corner.
- Adding `setAbsolutePosition` to the above with `{200, 200}` will move it 200 layout px down and right from the top left corner of the parent.
### Layout Mode
This happens when the parent of your element is a layout. These will attempt to position your child elements. They work similarly to CSS's `flex` and qt's `RowLayout` and `ColumnLayout`,
but will not wrap. If elements overflow and cannot shrink, they will disappear.
RowLayout positions elements next to each other side-by-side, while ColumnLayout does it top-bottom.
### Size
All elements carry a `SizeType`. This tells the layout system how to size the element.
- `ABSOLUTE` takes layout px as size and makes the element rigid.
- `PERCENT` takes a percentage in the form of `(0, 0) - (1, 1)` and will be the size of the parent multiplied by the percentage.
- `AUTO` ignores the passed vector (leave it empty) and instead will always attempt to contain the children\*
> [!NOTE]
> Some elements will force their own sizing, e.g. `Text`.
Leave them `AUTO` to avoid confusion.
## Elements
Most elements are self-explanatory. You can explore their builder functions to see what styling / behavior options they support.
Each element is created with a `Builder` which is there to maintain ABI stability. After you call `->commence()`, you
will get a `SP` to the newly created object.
You can rebuild the object at any time by calling `->rebuild()` and you'll get a builder again.
**Remember to call `commence()` after you are done to apply the changes!**
You do not need to keep the `SP` after adding the element to the tree with `addChild`.
## Other
Other, miscellaneous stuff
### System Icons
Use the `CBackend::systemIcons()` function to obtain a reference to `ISystemIconFactory` which allows
you to query system icons by name.
You can check the obtained result object to see if the icon was found.
Then, you can take that object and slap it into an `ImageElement` to add it to your layout.
### Additional FDs
If you have an app that depends on some other loop, e.g. pipewire, dbus, etc. you need to remember
that hyprtoolkit is strictly single-threaded for layout and rendering.
You cannot edit the layout from another thread.
For this, use `CBackend::addFd()` to add a FD to the loop alongside a function that will be called once the fd
is readable.
This function will be called from the main thread, so you can do whatever you want in there.

View File

@@ -0,0 +1,6 @@
---
weight: 102
title: hyprutils
---
[hyprutils](https://github.com/hyprwm/hyprutils) is a library providing shared implementations of commonly used types across the hypr* ecosystem.

View File

@@ -0,0 +1,9 @@
---
weight: 104
title: hyprwayland-scanner
---
[hyprwayland-scanner](https://github.com/hyprwm/hyprwayland-scanner), also called hw-s, is a utility to generate sources and headers
for wayland protocol specifications.
It is similar to wayland-scanner, but instead of C, it generates neat and safe C++ implementations.

Some files were not shown because too many files have changed in this diff Show More