inotify_rm_watch() generates IN_IGNORED events into the inotify
queue, which immediately triggers another watch_dispatch() call,
which calls inotify_rm_watch() again, generating another IN_IGNORED
ad infinitum. This pegs the CPU and makes input laggy on every
config reload.
Fix by removing inotify_rm_watch() entirely. inotify_add_watch()
alone handles both cases:
- Same inode: modifies the existing watch (no event generated)
- New inode (delete-and-recreate): creates a new watch; old watch
on the unlinked inode generates a single IN_IGNORED (one-shot,
not a loop)
The dynamic Config array conversion (Todo 2.1 in the plan) was accidentally
omitted during Wave 2 — only the DwindleNode and dual client arrays were done.
This commit implements the missing work:
- Convert Config keybinds/buttons/scrolls from fixed-size arrays
(keybinds[128]) to pointer+count+cap (keybinds, nkeybinds, keybinds_cap)
- config_load allocates with ecalloc(16) for each array, doubles on overflow
- on_config_reload and do_reload use deep-copy protocol:
free old arrays → *newcfg → zero source pointers
- sizeof(Config): ~250 KB → ~28 KB (latest measurement)
- Zero-warning build
Remove 'static' from parse_color_hex() in parser.c and add a public
declaration to parser.h so src/peachwm.c can call it for shadow color
conversion. No changes to function body.
- Parse effects.windows.rounded/rounding from Lua config
- Add CfgEffectsWindows and CfgEffects structs to Config
- Switch to fx_renderer_create for scenefx support
- Replace 5 wlr/types/wlr_scene.h includes with scenefx variant
- Add config_get_corner_radius() helper (light=6px, heavy=14px)
- Apply corner_radii_top/bottom/left/right to 4 border rects
- Apply wlr_scene_buffer_set_corner_radius to surface buffers
- Disable on fullscreen, restore on exit
- Re-apply on resize and config hot-reload
- Add -Wno-extra-semi for scenefx header compatibility
- All targets compile cleanly (make test passes)