惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
J
Java Code Geeks
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
IT之家
IT之家
博客园_首页
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
B
Blog
U
Unit 42
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
博客园 - 聂微东
腾讯CDC
A
About on SuperTechFans

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Putting your live windows on an infinite canvas: the "par...
Batuhan Demirbilek · 2026-06-14 · via DEV Community

Batuhan Demirbilek

The problem

Alt-tab and multiple monitors are how we've juggled windows for 30 years. I wanted something spatial: zoom out, see every window at once; zoom into one, work in it for real; zoom back out. Like a map for your desktop.

On Linux there's niri and driftwm (they're compositors). On Windows you can't replace the compositor — so the question was: can you do this on top of Windows, with the real windows, in a single exe?

Attempt 1 (and why it fails)

The naive idea: capture every window, hide the originals off-screen, and draw the captures on a fullscreen surface. When the user "dives" into one, show the real window again.

This breaks immediately. The moment a window is fully occluded or moved off the visible desktop, DWM stops compositing it — Windows.Graphics.Capture then returns black or stale frames. Your beautiful canvas fills with black tiles.

The park & swap trick

The fix is to never fully hide a window:

  1. Each window is captured with Windows.Graphics.Capture (FreeThreaded frame pool, poll-based) into a persistent D3D11 texture.
  2. The window is "parked" in a 2px-tall visible strip at the bottom of the primary monitor. 2px is enough that DWM keeps compositing it, so the capture stays live — but it's invisible behind the canvas.
  3. The canvas is a borderless fullscreen D3D11 swapchain. Each window is a 1:1-pixel textured quad placed in world space; pan/zoom is just a camera transform. A D2D/DWrite overlay draws labels, a world-anchored dot grid, the minimap, docks.
  4. When you zoom past a threshold (or double-click), the real HWND is moved onto its quad's screen rect and given focus. Now you're typing into the actual window — no input simulation, no proxying. Pull back (a thumb-button press) and it returns to the park strip.

So there are two states per window: parked (you see its live texture on the canvas) and swapped-in (you see and use the real window). The transition is a SetWindowPos.

Things that bit me

  • IsBorderRequired(false) and the borderless-capture path black out capture on some Windows builds — removed.
  • CopySubresourceRegion with content-sized copies + a drain-to-newest loop also produced black tiles; a single TryGetNextFrame + full CopyResource is the proven path.
  • Added a constant-buffer field the pixel shader reads, but only bound the cbuffer to the vertex stage — every tile came out alpha=0 (invisible). If a shader stage reads a cbuffer, bind it to that stage.

Result

A single 559 KB exe (statically linked, no .NET/redist), ~3300 lines in one translation unit. Idle-throttled so it doesn't cook the GPU. It has grown search-and-fly, sticky notes, a minimap, an app launcher, named workspaces.

Demo + download: https://github.com/13auth/spatial-canvas

Happy to answer questions about the capture/compositing pipeline.