|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to MaxPane will be documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/). |
| 6 | + |
| 7 | +## [1.3.0] - 2026-03-03 |
| 8 | + |
| 9 | +### Changed |
| 10 | +- **Renamed project**: ReDockIt → **MaxPane** — all source, docs, CMake, actions, ExtState keys, RPP chunk tags updated. |
| 11 | + |
| 12 | +### Added |
| 13 | +- **Diagonal grid lines** in empty panes — subtle 45° lines on the pane background, disappear when a window is captured. |
| 14 | + |
| 15 | +### Fixed |
| 16 | +- **Pane background color** — captured windows (WS_CHILD) have no own background and inherited the parent's dark color. Fixed by setting `COLOR_PANE_BG = RGB(172,172,172)` as a neutral light gray. |
| 17 | +- **DoRelease toggle for Actions window** — closing the Actions tab via [x] left REAPER's toggle state on (checkmark stayed). Root cause: SWELL destroys the NSWindow when a window becomes WS_CHILD, so `g_Main_OnCommand` couldn't find the window and opened a new one. Fix: `SetParent(nullptr)` to restore the NSWindow before toggling. |
| 18 | +- **Hint text color** — "Click header to assign a window" was white on light gray after the background color fix. Changed to `RGB(80,80,80)`. |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## [1.2.0] - 2026-03-02 |
| 23 | + |
| 24 | +### Added |
| 25 | +- **Pane menu button (▼)** — 16 px button at the right edge of every tab bar. Left-click opens the pane context menu (same as right-click). Hit-test returns `-2`; hover highlights the button. |
| 26 | +- `CalcTabBarLayout` shared helper — single source of truth for tab geometry used by `DrawTabBar`, `TabHitTest`, and `IsOnTabCloseButton`. |
| 27 | +- `GetTabRect` helper — returns the screen rect for a given tab index; used for targeted invalidation on color change. |
| 28 | +- `ExpandRect` static helper (both `container.cpp` and `container_input.cpp`) — in-place RECT union, skips empty src/dst to prevent dirty-rect corruption. |
| 29 | + |
| 30 | +### Changed |
| 31 | +- **Targeted `InvalidateRect`** — hover/drag operations now invalidate only the affected rect instead of the full window: |
| 32 | + - Splitter hover: union of old + new splitter rect |
| 33 | + - Tab/menu-button hover: union of old + new item rect via `GetTabRect` / inline button rect |
| 34 | + - Drag highlight change: union of old + new highlight pane rect |
| 35 | + - Drag cancel/end: source tab bar + old highlight pane rect |
| 36 | + - Tab color change: only that tab's rect via `GetTabRect` |
| 37 | + - Timer hover timeout: cached old hover rects only |
| 38 | +- Tab area now reserves `PANE_MENU_BTN_WIDTH` (16 px) on the right for the menu button; tabs shrink accordingly. |
| 39 | + |
| 40 | +### Fixed |
| 41 | +- **`TabHitTest` x-bounds regression** — the menu-button check (`x >= paneRect.right - 16`) was firing for clicks *outside* the pane's x range (e.g. in the adjacent right-side pane), causing the pane context menu to appear instead of tab interactions. Fix: check `x < paneRect.left || x >= paneRect.right` before the menu-button test. |
| 42 | +- `ExpandRect` now guards against empty `src` rect (`{0,0,0,0}`) in both call-sites, preventing the dirty rect from expanding into origin unnecessarily. |
| 43 | + |
| 44 | +### Removed |
| 45 | +- Scroll arrows (`<` / `>`) for tab overflow — tabs shrink when a pane is narrow (original behaviour). `m_tabScrollOffset`, `TAB_SCROLL_ARROW_WIDTH`, `TAB_OVERFLOW_THRESHOLD` removed. |
| 46 | + |
| 47 | +--- |
| 48 | + |
| 49 | +## [1.1.0] - 2026-03-02 |
| 50 | + |
| 51 | +### Added |
| 52 | +- Splitter hover highlights (white bar on mouseover) |
| 53 | +- Tab hover highlights (lighten effect on mouseover) |
| 54 | +- Per-project state persistence via RPP files (`project_config_extension_t`) |
| 55 | +- `StateAccessor` abstraction for polymorphic state I/O (global, project, RPP) |
| 56 | + |
| 57 | +### Fixed |
| 58 | +- Workspace switch rendering: blank/artifact windows (e.g. Routing Matrix) after switching back |
| 59 | +- Frameless floating windows when closing tabs via [x] |
| 60 | +- Windows reappearing floating after REAPER restart despite being closed |
| 61 | +- Shutdown lifecycle: proper toggle state check, reparent-before-toggle sequence |
| 62 | +- Quit interception via hookcommand for reliable state save on macOS/Windows |
| 63 | +- RepositionAll repaint: `SWP_FRAMECHANGED` + `InvalidateRect` after pane resize |
| 64 | + |
| 65 | +### Changed |
| 66 | +- Simplified to global docker model (removed per-project visibility switching) |
| 67 | +- RPP state I/O now uses synchronous `project_config_extension_t` (replaced deferred timer) |
| 68 | +- `LoadWorkspace` uses `ReleaseAll(false)` for smoother workspace transitions |
| 69 | +- `DoCapture` forces frame recalculation via `SWP_FRAMECHANGED` |
| 70 | + |
| 71 | +## [1.0.1] - 2026-03-01 |
| 72 | + |
| 73 | +### Fixed |
| 74 | +- **Startup deadlock**: REAPER could hang when loading a project with MaxPane docked. The capture queue now defers `Main_OnCommand` calls during `LoadState()` to avoid calling REAPER APIs while the project is still loading. |
| 75 | + |
| 76 | +### Changed |
| 77 | +- Replaced raw `new`/`delete` with `std::unique_ptr` for safer resource management |
| 78 | +- Replaced all `strncpy` calls with `safe_strncpy` helper for consistent null-termination |
| 79 | +- Extracted magic numbers (colors, geometry, timing) into named constants in `config.h` |
| 80 | +- Merged duplicate `FindWindowEnumProc`/`FindChildWindowEnumProc` into single function |
| 81 | +- Debug logging is now conditional on `CMAKE_BUILD_TYPE=Debug` (no longer always enabled) |
| 82 | +- Added `-Wshadow` and `-Wconversion` compiler warnings |
| 83 | + |
| 84 | +### Removed |
| 85 | +- Dead code: unused `BuildLists()` and `IsAnyCaptured()` methods |
| 86 | + |
| 87 | +## [1.0.0] - 2025-03-01 |
| 88 | + |
| 89 | +### Added |
| 90 | +- Native C++ REAPER extension (no script dependencies) |
| 91 | +- Binary split tree layout engine with up to 16 panes |
| 92 | +- Tabbed window management with drag-and-drop between panes |
| 93 | +- 14 known REAPER windows with one-click capture |
| 94 | +- Arbitrary window capture (including ReaImGui scripts) |
| 95 | +- Dock frame detection for ReaImGui windows |
| 96 | +- Async capture queue with retry logic |
| 97 | +- Named workspaces (save/restore complete layouts) |
| 98 | +- Favorites system with persistent action command strings |
| 99 | +- Tab color palette (8 colors) |
| 100 | +- 5 built-in layout presets |
| 101 | +- Auto-open on REAPER startup (configurable) |
| 102 | +- Full state persistence via REAPER ExtState |
| 103 | +- Dockable container (integrates with REAPER's docker system) |
| 104 | +- Context menus for panes and tabs |
| 105 | +- Capture-by-click mode |
| 106 | +- Conditional debug logging (Debug builds only) |
| 107 | +- Cross-platform architecture via WDL/SWELL |
0 commit comments