A read-only mirror of https://github.com/hyprwm/hyprlang
Find a file
John Mylchreest 0567ba7607
core/parser: correctly match keyed special categories by value being set (#89)
When parsing multiple special category blocks with different key values,
the second block would incorrectly overwrite the first instead of creating
a separate category entry.

Root cause:
When parsing a block like:

    wallpaper {
        monitor =
        path = /path/image.png
    }
    wallpaper {
        monitor = DP-1
        path = /path/image.png
    }

1. After closing the first block, `currentSpecialKey` resets to ""
2. When parsing `monitor = DP-1` in the second block, the code looks
   for an existing category where key value == currentSpecialKey ("")
3. The first category's key value IS "", so it matches incorrectly
4. The second block overwrites the first, leaving only one category

The fix:
When looking for an existing category to reuse, check what field we're
parsing:
- If parsing the KEY field itself, match by the VALUE being set
- If parsing other fields, match by currentSpecialKey (existing behavior)

This ensures `monitor = DP-1` looks for a category with `monitor == "DP-1"`,
not `monitor == ""`, allowing empty string keys to work correctly alongside
non-empty keys.

This bug affects any hyprlang consumer using keyed special categories where
empty string is a valid key value (e.g., hyprpaper's wallpaper category
with `monitor =` for default/wildcard).
2026-01-04 13:38:00 +01:00
.github/workflows ci/arch: add gtest 2025-11-13 15:59:41 +00:00
include core: add changeRootPath for CConfig 2025-11-27 15:46:35 +00:00
nix core: Move to hyprutils for util functions (#48) 2024-06-08 23:24:12 +02:00
src core/parser: correctly match keyed special categories by value being set (#89) 2026-01-04 13:38:00 +01:00
tests core/parser: correctly match keyed special categories by value being set (#89) 2026-01-04 13:38:00 +01:00
.clang-format initial commit 2023-12-28 20:38:01 +01:00
.clang-tidy clang-tidy: fix some errors (#70) 2025-04-22 23:23:39 +02:00
.gitignore API: add a templated config value wrapper 2024-12-13 20:48:06 +00:00
CMakeLists.txt parser: add support for basic arithmetic 2025-05-07 17:50:22 +01:00
COPYRIGHT repo: add COPYRIGHT file 2024-03-04 22:28:50 +00:00
flake.lock nix: use gcc15 (#79) 2025-06-05 18:51:22 +01:00
flake.nix nix: use gcc15 (#79) 2025-06-05 18:51:22 +01:00
hyprlang-docs CI: deploy docs (#2) 2023-12-30 15:15:36 +01:00
hyprlang.pc.in use CMAKE_INSTALL_FULL_LIBDIR in pkgconfig instead of hardcoded lib 2024-01-09 17:20:04 +02:00
LICENSE Relicense hyprlang to lgpl 3 (#27) 2024-03-03 00:10:20 +00:00
README.md README: update docs link (#81) 2025-07-27 16:28:12 +03:00
VERSION version: bump to 0.6.7 2025-12-01 18:07:10 +00:00

hyprlang

The hypr configuration language is an extremely efficient, yet easy to work with, configuration language for linux applications.

It's user-friendly, easy to grasp, and easy to implement.

Building and installation

Building is done via CMake:

cmake --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr -S . -B ./build
cmake --build ./build --config Release --target hyprlang -j`nproc 2>/dev/null || getconf _NPROCESSORS_CONF`

Install with:

sudo cmake --install ./build

Example config

bakery {
    counter_color = rgba(ee22eeff)          # color by rgba()
    door_color = rgba(122, 176, 91, 0.1)    # color by rgba()
    dimensions = 10 20                      # vec2
    employees = 3                           # int
    average_time_spent = 8.13               # float
    hackers_password = 0xDEADBEEF           # int, as hex

    # nested categories
    secrets {
        password = hyprland                 # string
    }
}

# variable
$NUM_ORDERS = 3

cakes {
    number = $NUM_ORDERS                    # use a variable
    colors = red, green, blue               # string
}

# keywords, invoke your own handler with the parameters
add_baker = Jeremy, 26, Warsaw
add_baker = Andrew, 21, Berlin
add_baker = Koichi, 18, Morioh

Docs

Visit wiki.hypr.land/Hypr-Ecosystem/hyprlang/ to see the documentation.

Example implementation

For an example implementation, take a look at the tests/ directory.