deargui-vpl/docs/screen.md

28 KiB

Window State Persistence Investigation

Date: November 5, 2025
Status: Investigation Complete + Implementation Verified
Scope: Application window position, size, monitor, and node editor canvas state

UPDATE: Window state persistence has been successfully implemented for Win32+DirectX!
See WINDOW_STATE_TEST_REPORT.md for implementation details and test results.

Executive Summary

The application does NOT restore OS window state (position, size, monitor) between sessions. UPDATE: This has been fixed!

Current State (November 5, 2025):

  • OS Window State: NOW RESTORED (position, size, monitor) via Blueprints_window.json
  • Node Editor Canvas: Restored (zoom, panning) via Blueprints.json
  • ImGui UI Windows: Restored (internal panels) via Blueprints.ini

The application now provides complete session persistence across all layers!


Findings

OS Window State (NOT PERSISTED)

The following OS-level window properties are not saved or restored:

  1. Window Position (screen X, Y coordinates)
  2. Window Size (width, height)
  3. Monitor Selection (which display the window was on)
  4. Window State (maximized, minimized, fullscreen)

Evidence

Win32 Backend (platform_win32.cpp:133-159):

bool PlatformWin32::OpenMainWindow(const char* title, int width, int height)
{
    m_MainWindowHandle = CreateWindow(
        m_WindowClass.lpszClassName,
        Utf8ToNative(title).c_str(),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,  // ← Default position (no persistence)
        width < 0 ? CW_USEDEFAULT : width,
        height < 0 ? CW_USEDEFAULT : height,
        nullptr, nullptr, m_WindowClass.hInstance, nullptr);
    // No code to load saved position/size
}

GLFW Backend (platform_glfw.cpp:73-167):

bool PlatformGLFW::OpenMainWindow(const char* title, int width, int height)
{
    glfwWindowHint(GLFW_VISIBLE, 0);
    
    width  = width  < 0 ? 1440 : width;   // ← Hardcoded default
    height = height < 0 ?  800 : height;  // ← Hardcoded default
    
    m_Window = glfwCreateWindow(width, height, title, nullptr, nullptr);
    // No code to load saved position/size/monitor
}

Application Layer (application.cpp:89-119):

bool Application::Create(int width /*= -1*/, int height /*= -1*/)
{
    if (!m_Platform->OpenMainWindow("NodeHub", width, height))
        return false;
    // No window position/monitor restoration logic
}

Node Editor Canvas State (PERSISTED)

The node editor canvas properties are saved and restored via Blueprints.json:

  1. Canvas Zoom (m_ViewZoom)
  2. Canvas Pan/Scroll (m_ViewScroll)
  3. Visible Rectangle (m_VisibleRect)
  4. Selection State (which nodes/links are selected)

Evidence

Settings Serialization (imgui_node_editor_store.cpp:185-225):

std::string Settings::Serialize()
{
    json::value result;
    
    auto& view = result["view"];
    view["scroll"]["x"] = m_ViewScroll.x;
    view["scroll"]["y"] = m_ViewScroll.y;
    view["zoom"]   = m_ViewZoom;
    view["visible_rect"]["min"]["x"] = m_VisibleRect.Min.x;
    // ... etc
}

Save/Restore Implementation (app-logic.cpp:877-928):

size_t App::LoadViewSettings(char* data)
{
    std::ifstream file("Blueprints.json");
    // Loads canvas zoom, pan, selection from JSON
}

bool App::SaveViewSettings(const char* data, size_t size)
{
    // Saves only view state (scroll, zoom, visible_rect, selection)
    // to Blueprints.json
}

Restoration Logic (EditorContext.cpp:2059-2062):

void EditorContext::LoadSettings()
{
    m_NavigateAction.m_Scroll = m_Settings.m_ViewScroll;
    m_NavigateAction.m_Zoom   = m_Settings.m_ViewZoom;
}

⚠️ ImGui Window State (PARTIAL)

ImGui saves internal window positions/sizes to .ini files, but this is for ImGui windows (like "Edit Block Parameters", "Style" panel), NOT the main OS window.

Evidence

ImGui .ini Format (build/bin/Blueprints.ini):

[Window][Edit Block Parameters]
Pos=483,145
Size=458,424
Collapsed=0

Application Setup (application.cpp:100-105):

m_IniFilename = m_Name + ".ini";

ImGuiIO& io = ImGui::GetIO();
io.IniFilename = m_IniFilename.c_str();  // ← Saves ImGui window state only

How ImGui Window Persistence Works

Key Pattern from ImGui Demo (imgui_demo.cpp:337-339):

const ImGuiViewport* main_viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), 
                        ImGuiCond_FirstUseEver);  // ← Only applies first time
ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver);

Important Flags:

  1. ImGuiCond_FirstUseEver - Position/size applied only on first use, then ImGui remembers it in .ini
  2. ImGuiWindowFlags_NoSavedSettings - Explicitly disables saving to .ini file

Examples from imgui_demo.cpp:

// Saved to .ini (uses ImGuiCond_FirstUseEver)
ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver);
ImGui::Begin("Example: Console", &show);

// NOT saved to .ini (uses ImGuiWindowFlags_NoSavedSettings)
ImGui::Begin("overlay", nullptr, 
             ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoDecoration);

Viewport Concepts (imgui_demo.cpp:7116-7118):

const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImVec2 work_pos = viewport->WorkPos;    // Work area (excludes taskbar/menubar)
ImVec2 work_size = viewport->WorkSize;  // Work area size

⚠️ Critical Note: ImGuiViewport represents the main rendering area, not the OS window. It's relative coordinates within the application, not screen coordinates. This is why ImGui can save window positions in the .ini file - they're relative to the viewport, not the screen.


Key Insight: OS Window vs ImGui Windows

This is the fundamental distinction that explains the current behavior:

OS Window (The Main Application Window)

  • Created by Win32 CreateWindow() or GLFW glfwCreateWindow()
  • Has screen coordinates (absolute position on monitor)
  • Managed by Operating System
  • Not controlled by ImGui
  • Not saved by ImGui's .ini system
  • Position set once at creation, never queried or restored

ImGui Windows (Internal UI Panels)

  • Created by ImGui::Begin() calls
  • Have viewport-relative coordinates (relative to the OS window's client area)
  • Managed by ImGui library
  • Controlled by ImGui
  • Saved to .ini files automatically (unless ImGuiWindowFlags_NoSavedSettings)
  • Position/size remembered via ImGuiCond_FirstUseEver pattern

Visual Representation:

┌─────────────────────────────────────────────────┐ ← OS Window (Win32/GLFW)
│ Screen Pos: (100, 100) ❌ NOT SAVED            │   ❌ No persistence
│ Screen Size: (1920, 1080) ❌ NOT SAVED         │
│ Monitor: 2 ❌ NOT SAVED                        │
│                                                 │
│  ┌──────────────────────────────────────────┐  │
│  │ ImGui Viewport (0,0 relative)            │  │
│  │                                          │  │
│  │  ┌────────────────────┐ ← ImGui Window  │  │
│  │  │ "Edit Parameters"  │   ✅ Saved to   │  │
│  │  │ Pos: (483, 145)    │   Blueprints.ini│  │
│  │  │ Size: (458, 424)   │                 │  │
│  │  └────────────────────┘                 │  │
│  │                                          │  │
│  │  Node Editor Canvas:                    │  │
│  │  - Zoom: 1.5x ✅ Saved to               │  │
│  │  - Pan: (500, 300) ✅ Blueprints.json   │  │
│  └──────────────────────────────────────────┘  │
└─────────────────────────────────────────────────┘

Technical Architecture

Persistence Layers

┌─────────────────────────────────────────────────────────┐
│ Layer 1: OS Window (Win32/GLFW)                        │
│ ❌ NOT PERSISTED                                        │
│   - Window position (x, y)                              │
│   - Window size (width, height)                         │
│   - Monitor selection                                   │
│   - Maximized/fullscreen state                          │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│ Layer 2: ImGui UI (.ini file)                          │
│ ✅ PERSISTED (Blueprints.ini)                          │
│   - Internal ImGui window positions                     │
│   - Internal ImGui window sizes                         │
│   - Collapsed states                                    │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│ Layer 3: Node Editor Canvas (JSON file)                │
│ ✅ PERSISTED (Blueprints.json)                         │
│   - Canvas zoom level                                   │
│   - Canvas pan/scroll position                          │
│   - Visible rectangle                                   │
│   - Selection state                                     │
└─────────────────────────────────────────────────────────┘

Key Files

File Purpose Persists
platform_win32.cpp Win32 backend Nothing
platform_glfw.cpp GLFW backend Nothing
application.cpp Application framework Nothing (delegates to ImGui)
Blueprints.ini ImGui window state Internal UI windows only
Blueprints.json Editor state Canvas zoom, pan, selection

Root Cause Analysis

Why is OS window state not saved?

  1. No API calls: Neither platform_win32.cpp nor platform_glfw.cpp contain any calls to:

    • Query window position (GetWindowPos, glfwGetWindowPos)
    • Save window state to disk
    • Restore window state from disk
  2. No storage mechanism: There is no configuration file or registry entry for OS window state.

  3. Hard-coded defaults:

    • Win32: CW_USEDEFAULT (Windows decides placement)
    • GLFW: 1440x800 at default position (GLFW decides placement)
  4. Design decision: The application framework (Application class) has no interface for window state persistence. The Platform interface only has:

    virtual bool OpenMainWindow(const char* title, int width, int height) = 0;
    

    No parameters for position, monitor, or state. +++

  5. ImGui can't help: ImGui's .ini persistence system cannot save OS window state because:

    • ImGui works with viewport-relative coordinates, not screen coordinates
    • ImGui has no access to OS window APIs (HWND, GLFWwindow*)
    • ImGui's SetNextWindowPos() positions internal UI windows, not the OS window
    • The main "Content" window uses ImGuiWindowFlags_NoSavedSettings (line 203 of application.cpp)

    Evidence from application.cpp:197-203:

    ImGui::SetNextWindowPos(ImVec2(0, 0));  // Always at (0,0) viewport origin
    ImGui::SetNextWindowSize(io.DisplaySize); // Always fills entire viewport
    ImGui::Begin("Content", nullptr, GetWindowFlags());
    // GetWindowFlags() includes ImGuiWindowFlags_NoSavedSettings
    

    The main content window is explicitly not saved and always fills the entire OS window.


User Impact

Current Behavior

  1. First Launch: Window appears at OS default position
  2. Move/Resize: User positions and sizes the window as desired
  3. Close Application: Window state is lost
  4. Relaunch: Window reappears at OS default position (state forgotten)

Working Features

Node editor canvas remembers zoom and pan position
ImGui internal windows remember their positions
Application loads last-opened graph file

Missing Features

Main window position not remembered
Main window size not remembered
Monitor selection not remembered (multi-monitor setups)
Maximized state not remembered


Platform Abstraction

  • examples/application/source/platform.h - Platform interface (lines 8-61)
  • examples/application/source/platform_win32.cpp - Win32 implementation
  • examples/application/source/platform_glfw.cpp - GLFW implementation

Application Framework

  • examples/application/source/application.cpp - Main application class
  • examples/application/source/entry_point.cpp - Entry point and CLI parsing
  • examples/application/include/application.h - Application interface

Node Editor State

  • EditorContext.cpp - Editor context and state management (lines 2059-2124)
  • imgui_node_editor_store.cpp - Settings serialization (lines 185-225)
  • examples/blueprints-example/app-logic.cpp - App-level save/load (lines 877-928)

ImGui Integration

  • external/imgui/imgui.cpp - ImGui window settings handler (lines 11384-11455)
  • external/imgui/imgui_internal.h - ImGui internal structures (lines 1354-1384)

Recommendations for Future Implementation

Option 1: Extend Platform Interface

Add to platform.h:

struct WindowState {
    int x, y, width, height;
    int monitor;
    bool maximized;
};

virtual bool SaveWindowState(const WindowState& state) = 0;
virtual bool LoadWindowState(WindowState& state) = 0;

Option 2: Use ImGui Ini Handler

Register a custom ImGui settings handler for OS window state:

ImGuiSettingsHandler handler;
handler.TypeName = "OSWindow";
handler.ReadOpenFn = OSWindowHandler_ReadOpen;
handler.ReadLineFn = OSWindowHandler_ReadLine;
handler.WriteAllFn = OSWindowHandler_WriteAll;
ImGui::AddSettingsHandler(&handler);

Option 3: Separate Config File

Create window_state.json alongside Blueprints.json:

{
  "window": {
    "x": 100,
    "y": 100,
    "width": 1920,
    "height": 1080,
    "monitor": 0,
    "maximized": false
  }
}

Platform-Specific Considerations

Win32:

  • Use GetWindowPlacement() / SetWindowPlacement() for full state
  • Use MonitorFromWindow() to detect monitor

GLFW:

  • Use glfwGetWindowPos() / glfwSetWindowPos() for position
  • Use glfwGetWindowSize() / glfwSetWindowSize() for size
  • Use glfwGetWindowMonitor() for fullscreen monitor
  • GLFW 3.3+ has glfwGetWindowContentScale() for DPI-aware positioning

Conclusion

The application correctly restores node editor canvas state (zoom, panning) but does not restore OS window state (position, size, monitor). This is due to:

  1. Platform layer (platform_win32.cpp, platform_glfw.cpp) lacking save/restore logic
  2. No storage mechanism for window coordinates
  3. Hard-coded default window creation parameters

The node editor's canvas state persistence works as intended through the existing JSON serialization system (Blueprints.json).


Appendix: Test Verification

Test 1: Canvas State Persistence

  1. Launch application
  2. Navigate canvas (zoom: 1.5x, pan: 500,300)
  3. Close application
  4. Relaunch → Canvas zoom and pan restored correctly

Test 2: Window Position Persistence

  1. Launch application
  2. Move window to (200, 200)
  3. Resize window to 1024x768
  4. Close application
  5. Relaunch → Window appears at OS default position (state lost)

Test 3: Multi-Monitor Persistence

  1. Launch application on Monitor 1
  2. Move window to Monitor 2
  3. Close application
  4. Relaunch → Window appears on Monitor 1 (original monitor lost)

Summary of Findings from imgui_demo.cpp

What imgui_demo.cpp Taught Us

  1. ImGuiCond_FirstUseEver Pattern - Standard way to set initial window pos/size while allowing persistence:

    ImGui::SetNextWindowPos(ImVec2(x, y), ImGuiCond_FirstUseEver);
    ImGui::SetNextWindowSize(ImVec2(w, h), ImGuiCond_FirstUseEver);
    ImGui::Begin("My Window");  // Position/size saved to .ini automatically
    
  2. ImGuiWindowFlags_NoSavedSettings - Prevents persistence (used for overlays, temp windows):

    ImGui::Begin("Overlay", nullptr, 
                 ImGuiWindowFlags_NoSavedSettings | ...);
    
  3. Viewport vs Screen Coordinates:

    • ImGuiViewport::Pos - OS window position on screen (read-only for ImGui)
    • ImGuiViewport::WorkPos - Usable area (excluding OS taskbar/menubar)
    • ImGui windows use positions relative to viewport, not screen
  4. Why This Doesn't Help Us:

    • The main "Content" window explicitly uses ImGuiWindowFlags_NoSavedSettings (confirmed in application.cpp:297)
    • Even if we removed that flag, it would only save the Content window's position relative to the viewport
    • The OS window itself (created by Win32/GLFW) exists outside ImGui's control
    • ImGui has no API to set OS window position - it only renders inside the OS window

The Architectural Gap

ImGui's World (what CAN be saved):
  ImGui::Begin("Window") 
    → Position relative to viewport
    → Saved to .ini automatically
    → Works perfectly ✅

OS Window (what CANNOT be saved by ImGui):
  CreateWindow() / glfwCreateWindow()
    → Position on screen
    → ImGui has no API for this
    → Requires platform-specific code ❌

IMPLEMENTATION COMPLETE (Win32 + DirectX)

All phases have been successfully implemented and tested!

See WINDOW_STATE_TEST_REPORT.md for full test results.


ORIGINAL TODO: Implementation Plan (Win32 + DirectX)

Note: This was the original plan. All items marked below have been completed.

Phase 1: Add Window State Querying COMPLETE

File: examples/application/source/platform_win32.cpp

  • Add method to query current window state

    struct WindowState {
        int x, y, width, height;
        int monitor;
        bool maximized;
        bool minimized;
    };
    
    WindowState GetWindowState() const;
    
  • Implement GetWindowState() using Win32 APIs:

    • Use GetWindowPlacement() to get position, size, and maximized state
    • Use MonitorFromWindow(m_MainWindowHandle, MONITOR_DEFAULTTONEAREST) for monitor
    • Store monitor index by enumerating monitors with EnumDisplayMonitors()

File: examples/application/source/platform.h

  • Add virtual methods to Platform interface:
    struct WindowState {
        int x, y, width, height;
        int monitor;
        bool maximized;
    };
    
    virtual WindowState GetWindowState() const = 0;
    virtual bool SetWindowState(const WindowState& state) = 0;
    

Phase 2: Add Window State Storage COMPLETE

File: examples/application/source/application.cpp

  • Add window state member variable:

    struct WindowStateConfig {
        int x = -1, y = -1;
        int width = 1440, height = 800;
        int monitor = 0;
        bool maximized = false;
    };
    WindowStateConfig m_WindowState;
    
  • Add save/load methods:

    bool SaveWindowState();
    bool LoadWindowState();
    
  • Create Blueprints_window.json

Phase 3: Hook Into Application Lifecycle COMPLETE

File: examples/application/source/application.cpp

  • Load window state before creating window:

    bool Application::Create(int width, int height)
    {
        // Load saved window state
        WindowStateConfig state;
        if (LoadWindowState("window_state.json")) {
            width = state.width;
            height = state.height;
        }
    
        m_Platform->OpenMainWindow("NodeHub", width, height);
    
        // Restore position AFTER window creation
        if (state.x >= 0 && state.y >= 0) {
            m_Platform->SetWindowPosition(state.x, state.y);
        }
        if (state.maximized) {
            m_Platform->MaximizeWindow();
        }
    }
    
  • Save window state on shutdown:

    Application::~Application()
    {
        // Save window state before cleanup
        if (m_Platform) {
            auto state = m_Platform->GetWindowState();
            SaveWindowState("window_state.json", state);
        }
    
        // ... existing cleanup code ...
    }
    

Phase 4: Win32-Specific Implementation COMPLETE

File: examples/application/source/platform_win32.cpp

  • Implement GetWindowState():

    WindowState PlatformWin32::GetWindowState() const
    {
        WindowState state;
    
        WINDOWPLACEMENT placement = { sizeof(WINDOWPLACEMENT) };
        GetWindowPlacement(m_MainWindowHandle, &placement);
    
        state.x = placement.rcNormalPosition.left;
        state.y = placement.rcNormalPosition.top;
        state.width = placement.rcNormalPosition.right - placement.rcNormalPosition.left;
        state.height = placement.rcNormalPosition.bottom - placement.rcNormalPosition.top;
        state.maximized = (placement.showCmd == SW_SHOWMAXIMIZED);
    
        // Get monitor index
        HMONITOR hMonitor = MonitorFromWindow(m_MainWindowHandle, MONITOR_DEFAULTTONEAREST);
        state.monitor = GetMonitorIndex(hMonitor);
    
        return state;
    }
    
  • Implement SetWindowState():

    bool PlatformWin32::SetWindowState(const WindowState& state)
    {
        if (!m_MainWindowHandle) return false;
    
        WINDOWPLACEMENT placement = { sizeof(WINDOWPLACEMENT) };
        placement.rcNormalPosition.left = state.x;
        placement.rcNormalPosition.top = state.y;
        placement.rcNormalPosition.right = state.x + state.width;
        placement.rcNormalPosition.bottom = state.y + state.height;
        placement.showCmd = state.maximized ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL;
    
        return SetWindowPlacement(m_MainWindowHandle, &placement);
    }
    
  • Add monitor enumeration helper:

    • Implemented inline in Get/SetWindowState methods
    • Uses lambda callbacks with EnumDisplayMonitors()
  • Validate monitor still exists:

    • Falls back to primary monitor if specified monitor doesn't exist
    • Implemented in SetWindowState()

Phase 5: JSON Persistence COMPLETE

Option A: Separate File IMPLEMENTED

  • Create Blueprints_window.json:
    {
      "window": {
        "x": 100,
        "y": 100,
        "width": 1920,
        "height": 1080,
        "monitor": 0,
        "maximized": false
      }
    }
    

Option B: Extend Blueprints.json

  • Add window section to existing Blueprints.json: NOT USED (chose separate file)
    {
      "window": { ... },
      "view": { ... },
      "selection": [ ... ]
    }
    

Phase 6: Edge Cases & Validation COMPLETE

  • Handle invalid saved positions (off-screen):

    bool IsPositionValid(int x, int y) {
        // Check if position is within any monitor's bounds
        // Use MonitorFromPoint() to verify
    }
    
  • Handle DPI changes between sessions: ⏸️ DEFERRED (future enhancement)

    // Save DPI-independent coordinates
    // Scale on restore based on current DPI
    
  • Handle monitor configuration changes:

    // Validate monitor index still exists
    // Fall back to primary monitor if not
    
  • Handle window too large for current monitor:

    // Clamp to monitor work area
    // Don't restore maximized if current monitor is smaller
    

Phase 7: Testing Checklist

  • Test: Normal position/size restoration PASS
  • Test: Maximized state restoration ⏸️ DEFERRED
  • Test: Multi-monitor restoration IMPLEMENTED (monitor 0 tested)
  • Test: Monitor disconnected (fall back gracefully) CODE IMPLEMENTED
  • Test: Invalid coordinates in config (off-screen) CODE IMPLEMENTED (50px minimum visible)
  • Test: DPI change between sessions ⏸️ DEFERRED
  • Test: First launch (no config file) PASS
  • Test: Corrupted config file (JSON parse error) HANDLED (try/catch fallback)

Phase 8: GLFW Implementation (Partial) ⏸️

File: examples/application/source/platform_glfw.cpp

  • Implement equivalent functionality for GLFW: ⚠️ PARTIAL (stubs only)
    • glfwGetWindowPos() / glfwSetWindowPos()
    • glfwGetWindowSize() / glfwSetWindowSize()
    • glfwGetMonitorPos() for multi-monitor
    • glfwMaximizeWindow() for maximized state

Implementation Priority

  1. High Priority: Basic position/size restoration (Win32) - DONE
  2. High Priority: Maximized state restoration - CODE COMPLETE (not tested)
  3. Medium Priority: Monitor selection (multi-monitor users) - DONE
  4. Low Priority: DPI-aware scaling - DEFERRED
  5. Low Priority: GLFW backend implementation - PARTIAL STUBS

Files to Modify

File Changes Lines Est.
platform.h Add WindowState struct + virtual methods +15
platform_win32.cpp Implement Get/SetWindowState +80
application.h Add SaveWindowState/LoadWindowState +5
application.cpp Hook into Create/Destructor +40
platform_glfw.cpp Implement Get/SetWindowState (future) +60

Estimated Total: ~200 lines of new code
Actual Total: ~268 lines of new code


IMPLEMENTATION COMPLETE

Date Completed: November 5, 2025

What Was Implemented

Win32 Window State Persistence - Fully functional

  • Window position (x, y) saved and restored
  • Window size (width, height) saved and restored
  • Monitor selection supported
  • Maximized state code complete
  • Edge case validation (off-screen, missing monitor)
  • JSON persistence (Blueprints_window.json)

Test Results Summary

  • First launch (no config) works correctly
  • Save window state on shutdown works
  • Restore window position on startup works
  • Restore window size on startup works
  • JSON file format is clean and human-readable
  • Console logging provides clear feedback
  • No compilation errors
  • No regressions in existing functionality

Files Created

  • Blueprints_window.json - Window state storage (auto-generated)
  • docs/WINDOW_STATE_TEST_REPORT.md - Comprehensive test report

Files Modified

  • examples/application/include/application.h (+17 lines)
  • examples/application/source/application.cpp (+93 lines)
  • examples/application/source/platform.h (+3 lines)
  • examples/application/source/platform_win32.cpp (+127 lines)
  • examples/application/source/platform_glfw.cpp (+28 lines, stubs)

Total: 268 lines of production code


End of Investigation & Implementation