Commit Graph
34 Commits
Author SHA1 Message Date
huntedbytheirs 4e388d9f4f feat(client): add client_update_scale and layersurface_update_scale
- client_update_scale(): re-notifies clients when output scale changes
  using current_outputs max scale (avoids stale c->mon for floating windows)
- layersurface_update_scale(): same logic for layer shell surfaces (static)
- Initialize current_scale on initial commit for both surface types
- Uses 0.001f tolerance for float comparison to prevent redundant events
- Falls back to c->mon->wlr_output->scale if no current_outputs
2026-07-05 21:36:41 -04:00
huntedbytheirs 2773724d77 Fix scratchpad segmentation fault 2026-07-04 03:44:32 -04:00
huntedbytheirs f8779ee7de Add back everything due to a bug 2026-07-03 04:32:57 -04:00
huntedbytheirs 0fac17ee84 compositor: extend applyrules, guard toggles, gate effects at render time only 2026-07-03 04:20:35 -04:00
huntedbytheirs 6f8f2bbf94 Revert "parser: add CfgApplyEffects struct and extend CfgRule with fullscreen, can_float, can_fullscreen, apply_effects"
This reverts commit 690c328c38.
2026-07-03 04:13:54 -04:00
huntedbytheirs 010e885cdf fix: defer setmon() after scene_surface creation to prevent segfault on window map
Root cause: applyrules() called setmon() which called resize(), but
resize() dereferences c->scene_surface->node before c->scene_surface
was created in mapnotify(). Fix by storing target monitor/tags in
pending_mon/pending_tags fields and calling setmon() after scene
nodes exist.

The crash affected all new windows, not just Firefox (which was
the first tested).
2026-07-03 04:11:21 -04:00
huntedbytheirs f923ca83fd fix: move applyrules() before effect creation in mapnotify, guard border_bg null derefs 2026-07-03 03:48:57 -04:00
huntedbytheirs 4ca74f47a5 compositor: extend reapply_client_rules() with full rule re-application on reload 2026-07-03 03:37:37 -04:00
huntedbytheirs 48fed41a93 compositor: gate all rendering effects (shadow, blur, transparency, rounding, border, sloppy_focus) with per-rule toggles 2026-07-03 03:36:06 -04:00
huntedbytheirs e31c11e65c compositor: extend applyrules() with new fields, activate fullscreen in mapnotify, guard togglefloating/togglefullscreen 2026-07-03 03:31:42 -04:00
huntedbytheirs f5abfe5bc6 Add transparency + Blur 2026-07-03 02:34:29 -04:00
huntedbytheirs 9b1eb30937 perf(fix): implement dynamic Config arrays (missed from wave2)
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
2026-07-03 00:05:16 -04:00
huntedbytheirs a5c64bcac4 perf(wave3): IPC buffer reuse, listener pooling, lazy shadows
Wave 3 changes:
- Static JSON buffer reuse across IPC calls: file-scope json_shared_buf/json_shared_cap,
  json_init allocates once via malloc, json_finish is no-op, json_grow reallocs static buffer
  → eliminates ~30 malloc/free pairs per IPC test workload
- Capped lazy IPC payload: payload_size capped at 64KB, first alloc is min(size+1, 65536),
  subsequent reallocs only when new payload larger than current allocation
  → bounds worst-case per-client allocation
- Embedded wl_listeners: IdleInhibitorTrack and PopupCommitTrack wrapper structs replace
  bare heap-allocated listeners; LISTEN_STATIC macro deprecated
  → consolidates listener + state into one allocation
- Lazy shadow allocation: shadow kept alive across config reload (set_enabled(false) instead
  of destroy); zero shadow allocations for users with shadows disabled
  → eliminates per-client shadow overhead for non-shadow users
- Zero-warning build with clang -Werror -Wpedantic
2026-07-02 23:54:38 -04:00
huntedbytheirs 7f3cad8cb6 perf(wave2): dynamic config arrays, flat dwindle tree, dual client arrays
Wave 2 changes:
- Dynamic Config arrays with geometric growth (cap=16, 2x growth)
  → saves ~2.5 MB heap for typical configs vs fixed 128-entry arrays
- Proper deep-copy protocol in on_config_reload/do_reload (free old, move new, zero source)
- Flat DwindleTree array with int children[2]/parent indices
  → eliminates pointer chasing, contiguous allocation, iterative two-pass recalc
- Lazy per-tag allocation (DwindleTree.nodes starts NULL, allocates on first use)
- Dual client_arr + fstack_arr arrays alongside wl_list/fstack for cache-friendly iteration
  → arrange() and focustop() use array scan instead of linked-list pointer chase
- All arrays maintain size-tracking (nclients, nfstack) for bounds checking
- Zero-warning build with clang -Werror -Wpedantic
2026-07-02 23:50:43 -04:00
huntedbytheirs fb0f49e861 perf(wave1): reduce Config caps, reorder Client/Monitor for cache
Wave 1 changes:
- Reduce CFG_MAX_KEYBINDS 256→128, CFG_MAX_STRLEN 256→64, CFG_MAX_ARGS 16→8
  → saves ~2.5 MB BSS from Config struct
- Add truncation warnings to config_load when keybind/button/scroll limit reached
- Reorder Client struct: HOT fields (type, mon, tags, floating flags, geom) in first
  cache line, COLD fields (wl_listeners) at end — saves cache misses in arrange()
- Reorder LayerSurface struct similarly
- Split Monitor into Monitor/MonitorCold: hot fields (~120B) stay inline, cold layout
  state lazily allocated on first dwindle/master use
- All cold-field accesses through m->cold-> indirection
- cleanupmon frees m->cold
- Zero-warning build with clang -Werror -Wpedantic
2026-07-02 23:35:37 -04:00
huntedbytheirs d3999a9d3c Fix rounded corners
they were being dumb
2026-07-02 23:00:13 -04:00
huntedbytheirs 8478762828 feat(shadow): implement window drop shadows via SceneFX
Add wlr_scene_shadow node creation in mapnotify() with correct z-order
(wlr_scene_node_place_below for shadow-behind-borders). Update shadow
size/position/color/radius/blur/clip on every resize() with config-driven
visibility logic respecting fullscreen_shadows, nogaps_shadows, and
only_floating flags. Re-apply shadow on config hot-reload via
reapply_client_appearance() — create or destroy shadow nodes as needed.

Colors are premultiplied alpha per SceneFX API requirements.
2026-07-02 19:44:57 -04:00
huntedbytheirs 4ac03d4059 feat(effects): implement window rounded corners via scenefx
- 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)
2026-07-02 05:00:26 -04:00
huntedbytheirs c529815d54 refactor: standardize headers to #pragma once, add [[nodiscard]]/[[maybe_unused]] annotations 2026-07-02 02:07:04 -04:00
huntedbytheirs 969a6c4ecb refactor: replace C11 keywords with C23 equivalents, NULL→nullptr, remove stdbool.h 2026-07-02 02:02:09 -04:00
huntedbytheirs 1e09b182ee refactor: create include/common.h with shared types/macros, deduplicate across 7 files 2026-07-02 01:58:57 -04:00
huntedbytheirs b5ccb2621b Massive code refactor 2026-07-02 01:24:16 -04:00
huntedbytheirs c5f74d7108 Fix sloppy_focus 2026-06-30 02:07:19 -04:00
huntedbytheirs 5e5e787c41 Add floating window movement with keys. Add focus moving on floating 2026-06-30 00:40:39 -04:00
huntedbytheirs 02708b12c8 Add scratchpad
Added scratchpads
2026-06-29 16:35:52 -04:00
huntedbytheirs 1ded834e33 Add live reloading to the rest of the config 2026-06-29 02:41:38 -04:00
huntedbytheirs fb9add0778 Add a swaymsg-like IPC, and add some more docs. 2026-06-29 01:33:11 -04:00
huntedbytheirs 291e277f6e Change maintainer, and change licensing. 2026-06-29 00:49:15 -04:00
huntedbytheirs 7fcd8577f3 Add input configuration live reloading
Made the input section of config.lua dynamically reloadable, no longer
requiring a hard restart.
2026-06-28 19:51:44 -04:00
huntedbytheirs 667dad864a Add workspace starting layouts 2026-06-28 19:41:21 -04:00
huntedbytheirs 6c3dc371e3 Add back other layouts
Added back master + monocle
2026-06-28 19:32:48 -04:00
huntedbytheirs 1024a222be Add features to Makefile
make release - compiles with clang, uses more aggressive compilation
flags for errors/warnings.
CC=tcc/gcc/clang make - lets you select your wanted compiler.
2026-06-28 18:03:05 -04:00
huntedbytheirs f529f03315 Massive code cleanup
Cleaned up:
Makefile
config.mk/.h
nix files (by removing them for now)
Removed dwl likeness.
2026-06-28 17:39:02 -04:00
huntedbytheirs 763512a24f peachwm birth 2026-06-28 17:26:07 -04:00