25 Commits
Author SHA1 Message Date
Nikolai NechaevandGitHub a1b9dc0e8c config: Add cursor:warp_on_monitor_change (#15844)
Allow to control cursor warping when switching to a workspace
on a different monitor.
2026-08-15 17:17:59 +02:00
Nikolai NechaevandGitHub 05819c4ad6 tests: prefer SPAWN_KITTY over Tests::spawn_kitty in tests (#15754)
* tests: Recommend using macros instead of Tests::{spawnKitty,spawnLayerKitty}

* tests: Replace `Tests::spawnKitty` with `SPAWN_KITTY` where possible
2026-08-09 00:20:47 +02:00
Nikolai NechaevandGitHub 225e018cea CI: fix codeownersplus status comment spam (#15597) 2026-07-25 12:17:04 +01:00
Nikolai NechaevandGitHub 37b02954ec compositor: allow to request focusing windows behind fullscreen (#14942)
* window: Refactor isInputBlocked methods

* compositor: Allow to request focusing windows behind fullscreen

* hyprtester: Unknown option is an error
2026-07-03 21:22:35 +02:00
Nikolai NechaevandGitHub 420f112bc6 ci: add code owners via codeowners-plus (#15261) 2026-07-02 23:19:02 +02:00
Nikolai NechaevandGitHub 9262367c00 CI: do not auto-comment on PRs from contributors (#15183) 2026-06-19 17:21:16 +01:00
Nikolai NechaevandGitHub 7dcdb8d792 hyprtester: misc bug fixes & refactorings (#15025)
* hyprtester: Refactor includes +minor

Minor local improvements:

- Move `Colors`, which are always used with `NLog`, to Log.hpp;

- Remove unused includes, sort some includes (not all; this should
  maybe automated with `clang-format`);

- Apply linter's suggestion(s);

- Replace hacky `#undef`s in hyprtester's main with a single flag macro.

* hyprtester: Misc hyprtester framework improvements

- Fix `CALL_SUBTEST` to use `FAIL_TEST`/`LOG_OK` to ensure correct values
  of `.failed` and `.just_failed`;

- Change macro parameter `name` to `NAME` to avoid possible collisions;

- Cosmetic improvements

* hyprtester: Structure test groups + misc improvements

Improve tests storage and grouping logic.

Miscellaneous improvements and clean ups in main.cpp.

Restore a mistakenly dropped TODO.

* hyprtester: Use more conventional cmd-line parsing for test names
2026-06-12 15:34:42 +01:00
Nikolai NechaevandGitHub f5ef95f269 hyprtester: Fix some failing tests terminating early (#14969)
The tests of the form:
```
EXPECT(SOMETHING);  // Fails
ASSERT(SOMETHING ELSE);  // Succeeds
EXPECT(MORE);  // Succeeds
```
should run till the end and then be considered failed
(since the first expection failed).

Due to a bug, they would terminate after the successful `ASSERT`,
if a previous `EXPECT` had failed. Fixed that.
2026-06-04 13:25:35 +01:00
Nikolai NechaevandGitHub 93b83c19f3 meta/lua: Gestures can accept a lua function (#14649) 2026-05-17 17:59:08 +01:00
Nikolai NechaevandGitHub 45ffaee093 tests: Fix more tests failing on CI (#14159)
* tests: Relax color management requirements in the colors test

This continues the work from d4dd299 (#14142):
- Fixes a missed check assuming a fixed value for `colorManagementPreset`
- Stricten checks to require that the expected keywords are present as json keys

* tests: Refactor `Tests::getAttribute` (was `Tests::getWindowAttribute`)

- Improve ergonomics by consistently handling attribute name;
- Remove 'window' from the function name, since it is compatible with
  other responses too;
- Document the function.

* tests: Fix solitary test assuming it knows the complete set of blockers

The test was failing on the CI because new blockers appeared,
which were not expected by the text. Fix the test, so that it
just checks the set of expected blockers is a subset of actual
blockers
2026-04-29 18:32:06 +01:00
Nikolai NechaevandGitHub d4c6ff434c hyprtester: minor refactoring/restructure (#14154)
* hyprtester: Minor misc fixes

- Use `std::filesystem::path` instead of `std::string` in some places;
- Use `std::ranges::sort`, as suggested by clang-tidy;
- Reset colors at the end of every log line;
- Give more specific error messages in main.

* hyprtester: Fix a bug in `hyprlandAlive()`

Successful standard library calls are permitted to (and do) modify the
value of `errno` arbitrarily. Checking the value of `errno` only makes
sense when the library function returns an error. So, the correct
condition of a successful signal delivery is that the call to `kill`
returns 0.

Btw, given the possible other error values of `kill(2)`, should we even
consider `errno` at all?

* hyprtester: Restructure main

Split main's `main()` into multiple functions, separate responsibilities
more cleanly.

Add default values for cmd-line options to the help message.

* hyprtester: Remove redundant path canonicalization

* hyprtester: Run unified clean up code before every test

* tests: Use RAII for clients in client tests

Turn clients in client tests into classes. Constructors
initialize, destructors deinitialize.

Not only is it better design when entities (clients) are
modeled as classes, keeping all the methods connected,
this also ensures the tests perform their custom cleanup.

This will be especially important when we introduce early
termination on failure into the tests.

* hyprtester: Rewrite the testing framework!

- Implement a new test definition system used via the `TEST_CASE` and
  `SUBTEST` macros.

- Adds `ASSERT*` and reimplements `EXPECT*` macros. The former now
  terminate the test immediately. Also add some new macros, such as
  `FAIL_TEST`.

- Move existing tests to the new system. For trivial cases, break
  existing test functions down to multiple test cases.

- For non-trivial cases and a few other possible improvements, leave
  TODOs.

* tests: Use `EXPECT*` instead of `ASSERT*` in some places

`ASSERT*` macros terminate the test as soon as they fail. They are
appropriate to use when, if something fails, the rest of the test
does not make sense and more error messages from failing checks will
just pollute the output.

`EXPECT*` macros mark the test as failed but its execution continues.
It makes sense to use them when error messages from the following checks
in the test may be useful for someone who will be reading the log.

I changed some uses of `ASSERT*` in main tests to `EXPECT*`. But I was
not reading tests very carefully, so maybe I was wrong in some places.
My rule of thumb was:
- Checks that ensure that a kitty opens / a certain set/number of
  windows exists are fatal;
- A series of checks, especially on the same string returned by
  `Hyprland`, are non-fatal;
- Checks in tests with tightly coupled steps (i.e., do this, check,
  do this with the result of the previous step, check, etc) are fatal.
2026-04-28 11:17:12 +01:00
Nikolai NechaevandGitHub ff459f4a2a groups: fix movewindoworgroup when moving from group to group (#14086)
* Add test for movewindowgroup

* groups: Fix `movewindoworgroup` moving into group

Fixes `CKeybindManager::moveWindowIntoGroup` to
remove a window from a group before attempting
to add it to another group. Addresses #13843.

But the animation of moving a window from a group
into another group now looks weird: as if the
whole target group is being moved.
2026-04-16 17:54:04 +01:00
Nikolai NechaevandGitHub bc5bd8970e compositor: When processing fullscreen states, only use effective mode where necessary (#13607)
Simplify the compositor fullscreen state processing: use the complete
fullscreen mode value except when the effective fullscreen mode value
is needed.

Fixes #13041.
2026-03-10 10:09:47 +00:00
Nikolai NechaevandGitHub 8a12d6cf7e algo/dwindle: Respect force_split when moving windows to workspaces (#13038)
Respect `dwindle:force_split` not only when mapping new windows,
but also when moving windows to workspaces.

Fixes #13009.
2026-03-10 10:04:21 +00:00
Nikolai NechaevandGitHub 42f0a6005b keybinds: Remove removed keybinds (#13605)
There seems to be no reason for them to remain.

But if they are kept, no notification appears to warn
a user that a dispatcher used in their config is no
longer valid. The config remains valid, but the bindings
do not work anymore.
2026-03-06 16:33:08 +00:00
Nikolai NechaevandGitHub eb0480ba0d tests: Test the no_focus_on_activate window rule (#13015) 2026-01-18 15:22:33 +01:00
Nikolai NechaevandGitHub ca99e8228c internal/start: More careful signal handling (#12573)
- Take out signal set up into a subroutine;

- Use `sigaction` instead of `signal` for consistent behavior across UNIX platforms;

- Enable a warning when a signal handler set up fails;

- Don't do anything to SIGKILL, since it cannot be handled.
2025-12-07 17:53:24 +00:00
Nikolai NechaevandGitHub 76ac655c9e CI: add the start PR label for start-hyprland (#12574) 2025-12-07 10:49:12 +00:00
Nikolai NechaevandGitHub 222dbe99d0 keybinds: fix previous workspace remembering (#12399)
* swipe: Fix previous workspace remembering in workspace gesture

Fixes a bug that previous workspace does not exist after swiping to a workspace

* tests: Test that `workspace previous` works after workspace gesture

* moveActiveToWorkspace: remember previous workspace unconditionally
2025-12-05 20:43:30 +00:00
Nikolai NechaevandGitHub 40d8fa8491 compositor: Configurable behavior when window to be focused conflicts with fullscreen (#12033)
Renames `misc:new_window_takes_over_fullscreen` into
`misc:on_focus_under_fullscreen` and implements the following behavior:

- By default, when a tiling window is being focused on a workspace where
  a fullscreen/maximized window exists, respect
  the `misc:on_focus_under_fullscreen` config variable.
2025-11-25 22:44:26 +00:00
Nikolai NechaevandGitHub da31e82aab internal: prevent early exit processes from being zombies (#11995)
Prevent `exec`/`exec-once` processes which terminate very early
(before Hyprland declares that it does not want to reap zombies)
from getting stuck as zombie processes.
2025-10-10 17:03:34 +02:00
Nikolai NechaevandGitHub 4f3dd1ddb4 config: fix gesture dispatcher parsing with whitespaces (#11784)
* config: fix gesture dispatcher parsing with whitespaces

Some dispatcher functions (e.g., `moveFocusTo`) expect the given string to be
stripped of whitepsaces.

This fixes `gesture` line parsing: rather than calling dispatcher functions
with the original string, we reuse words parsed by `CConstVarList` and join
them with a comma.

* tests/gestures: Add a test for `movecursortocorner`
2025-09-26 15:49:07 +02:00
Nikolai NechaevandGitHub 29b103c376 exec: Spawn processes as direct children (#11735)
* exec: Spawn processes as direct children

Spawn processes as children rather than grandchildren.
This way, spawned processes may track Hyprland's state
by watching their parent, either directly or indirectly
(e.g., Linux's `PR_SET_PDEATH_SIG`).

Fixes #11728

* tests/exec: Add the test on process spawning

Add a test that ensures that:
- A spawned process remains a direct child of Hyprland;
- Upon termination, the process does not become a zombie.
2025-09-23 19:32:48 +02:00
Nikolai NechaevandMihai Fufezan 22c8bc9b9b CI/Nix: Allow running CI in forks
Rather than hardcoding the repository name in the workflow file,
use a context value. This allows running workflows in forks.
2025-09-22 12:30:39 +03:00
Nikolai NechaevandGitHub 41dad38177 config: fix multi-argument gesture dispatcher parsing (#11721)
* config: Fix multi-argument gesture dispatchers parsing

The `dispatcher` gesture handler used to only handle
the first argument to the dispatcher, while some dispatchers
(e.g., `sendshortcut`) want multiple arguments.

This fixes `ConfigManager` to handle all the arguments
provided to the dispatcher gesture handler.

Fixes #11684.

* test/gestures: Add a test for a gesture with a multi-argument dispatcher

* test/gestures: Factor out `waitForWindowCount`

Reduce code duplication in the gestures test.
2025-09-20 17:57:49 +02:00