Skip to content

b451c/MaxPane

MaxPane

License: MIT Latest Release Platform

Nested docker layouts for REAPER — a native C++ extension that lets you build custom multi-pane workspaces with tabbed windows, drag-and-drop, and instant workspace switching.

MaxPane

Capture any REAPER window — Media Explorer, FX Browser, Mixer, Actions, or even ReaImGui scripts — into a single tiling container with resizable split panes and tabbed panels.


Features

  • Flexible split layouts — Split panes horizontally or vertically to any depth (up to 16 panes). Drag splitter bars to resize on the fly.
  • Tabbed windows — Multiple windows per pane, with tab bar. Click tabs to switch, drag tabs between panes. Each tab bar has a ▼ menu button for quick access to the pane context menu.
  • 15 known REAPER windows — One-click capture for Mixer, Track Manager, Routing Matrix, Media Explorer, FX Browser, Project Bay, Region Manager, Region Render Matrix, Actions, Undo History, Navigator, Big Clock, Video, Performance Meter, Virtual MIDI Keyboard.
  • Arbitrary window capture — Grab any open REAPER window, including third-party ReaImGui scripts (ReaMD, etc.), via the "Open Windows" submenu or click-to-capture mode.
  • Workspaces — Save and restore complete layout snapshots (tree structure + captured windows) with a single click.
  • Favorites — Pin frequently used windows for quick access across sessions.
  • Tab colors — Color-code tabs with 8 palette colors for visual organization.
  • Layout presets — Quick-start with 5 built-in layouts: Two Columns, Left + Right Split, Three Columns, 2x2 Grid, Top + Bottom Split.
  • Solo/maximize pane — Temporarily expand any pane to fill the entire container. Toggle via context menu or keyboard shortcut. Layout is fully restored when exiting solo.
  • Tab reorder — Drag tabs left/right within the same pane to rearrange their order.
  • Keyboard shortcuts — Five REAPER actions (Next/Prev Tab, Next/Prev Pane, Solo Toggle) bindable via Actions dialog.
  • Splitter double-click — Double-click any splitter to reset it to 50/50.
  • Hover highlights — Visual feedback on splitter bars and tabs when hovered.
  • Per-project state — Layout is saved inside each .RPP project file, so different projects can have different MaxPane configurations.
  • Persistent state — Layout, captured windows, favorites, and workspaces survive REAPER restarts.
  • Auto-open on startup — Optionally restore MaxPane automatically when REAPER launches.
  • Dockable — The container itself docks into REAPER's native docker system.
  • Zero dependencies — Pure C++ extension using REAPER SDK + WDL/SWELL. No scripts, no ReaImGui, no js_ReaScriptAPI required.

Screenshots

Create grid layout Assign windows to panes Recall workspace
Create grid Assign windows Recall workspace

MaxPane layout

Installation

ReaPack (recommended)

  1. In REAPER, go to Extensions > ReaPack > Import repositories...
  2. Paste this URL:
    https://raw.githubusercontent.com/b451c/MaxPane/main/index.xml
    
  3. Go to Extensions > ReaPack > Browse packages, search for MaxPane.
  4. Right-click > Install, then restart REAPER.

ReaPack will automatically notify you of future updates.

Manual install

  1. Download the binary for your platform from the Releases page.
  2. Copy it to your REAPER resource path:
Platform Path
macOS ~/Library/Application Support/REAPER/UserPlugins/
Windows %APPDATA%\REAPER\UserPlugins\
Linux ~/.config/REAPER/UserPlugins/
  1. Restart REAPER.
  2. Open via Actions > MaxPane: Open Container, or assign a keyboard shortcut.

Build from source

See Building below.

Usage

  1. Open MaxPane — Run the action "MaxPane: Open Container" from REAPER's Actions menu.
  2. Right-click any pane header, or click the ▼ button at the right of any tab bar, to open the pane context menu.
  3. Choose a window from the Known Windows list, or browse Open Windows for any visible REAPER window.
  4. Split panes via the context menu (Split Left/Right or Split Top/Bottom).
  5. Drag tabs between panes to rearrange, or within the same pane to reorder.
  6. Solo a pane via right-click > Solo Pane to temporarily maximize it. Right-click > Exit Solo to restore.
  7. Right-click a tab to close it, move it, color it, or add it to Favorites.
  8. Save a workspace via right-click > Workspaces > Save Current.
  9. Drag splitter bars to resize panes. Double-click a splitter to reset to 50/50.
  10. Bind keyboard shortcuts — In REAPER's Actions dialog, search for "MaxPane" to find Next/Prev Tab, Next/Prev Pane, and Solo Toggle.

Building

Prerequisites

  • CMake 3.15+
  • C++17 compiler (Clang on macOS, GCC on Linux, MSVC on Windows)
  • REAPER SDK — clone into cpp/sdk/:
    git clone https://github.com/justinfrankel/reaper-sdk.git cpp/sdk
  • WDL — clone into cpp/WDL/:
    git clone https://github.com/justinfrankel/WDL.git cpp/WDL

Compile and install (macOS)

cd cpp/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
cp reaper_maxpane.dylib ~/Library/Application\ Support/REAPER/UserPlugins/

Compile and install (Linux)

cd cpp/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
cp reaper_maxpane.so ~/.config/REAPER/UserPlugins/

Compile and install (Windows)

cd cpp/build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
copy Release\reaper_maxpane.dll "%APPDATA%\REAPER\UserPlugins\"

Debug build

Debug builds enable verbose logging to /tmp/maxpane_debug.log:

cmake .. -DCMAKE_BUILD_TYPE=Debug
make

Requirements

  • REAPER 7.0+ (tested on 7.62)
  • macOS arm64 (Apple Silicon) and x86_64 (Intel)
  • Windows x64
  • Linux x86_64

Architecture

cpp/src/
  main.cpp                  Entry point, API imports, action registration
  container.h               Container class declaration, shared structs (TabBarLayout, DragState, …)
  container.cpp             Lifecycle, DlgProc, context menus, OnTimer, OnPaneMenuButtonClick
  container_paint.cpp       OnPaint, DrawTabBar (rendering only)
  container_input.cpp       Mouse events, tab hit-testing, drag-and-drop, CalcTabBarLayout, GetTabRect
  container_state.cpp       SaveState, LoadState, ApplyPaneState, workspace save/load/delete
  split_tree.h/cpp          Binary tree layout engine (split/merge/drag/recalculate)
  window_manager.h/cpp      Window capture via SetParent, tab management (close/move/reposition)
  capture_queue.h/cpp       Async window capture with retry + dock frame detection
  favorites_manager.h/cpp   Persistent favorites with action command strings
  workspace_manager.h/cpp   State save/restore, named workspace snapshots
  context_menu.h/cpp        Context menu construction (pane + tab menus)
  config.h                  Constants: colors, geometry, timing, window definitions
  project_state.h/cpp       RPP chunk I/O (project_config_extension_t callbacks)
  state_accessor.h          Polymorphic StateAccessor for global/project/RPP state
  globals.h/cpp             REAPER API function pointers, safe_strncpy, helpers
  debug.h                   Conditional debug logging (Debug builds only)

The extension works by reparenting REAPER windows (via SetParent) into a custom container dialog. The container uses a binary split tree for layout, with each leaf node representing a pane that holds tabbed windows. Global state is persisted via REAPER's ExtState API; per-project state is saved inside .RPP files via project_config_extension_t.

Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

Support

If you find MaxPane useful, consider supporting its development:

License

MIT — Copyright (c) 2025–2026 b451c

Links

About

Nested docker layouts for REAPER — tiling window manager with tabs, workspaces, and drag-and-drop

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors