Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
D

driftwm

> 编程语言
Open source

A trackpad-first infinite canvas Wayland compositor.

1.6K stars0 likes0 views
WebsiteGitHub

About

A trackpad-first infinite canvas Wayland compositor.

A trackpad-first infinite canvas Wayland compositor.

Primary repository: GitHub · Mirror: Codeberg

https://github.com/user-attachments/assets/155511a6-0a6e-4681-9061-21be1e93e02a Traditional window managers arrange windows to fit your screen. Stacking compositors do so by piling windows on top of each other; tiling compositors do so by squeezing them to fit and utilizing workspaces. `driftwm` is an infinite-canvas compositor: windows live at their native size on an infinite 2D canvas, and your display is a camera viewing it. When two windows come close, they snap together, forming implicit groups that can be moved, resized, and viewed together. No tiling, no workspaces, window overlaps happen only on purpose. Designed with laptops in mind: navigation and window management are trackpad-first; the infinite canvas makes the most of a small screen. Built on [smithay](https://github.com/Smithay/smithay). Inspired by [vxwm](https://codeberg.org/wh1tepearl/vxwm); borrows implementation details from [niri](https://github.com/YaLTeR/niri). > [!WARNING] > This is experimental software, primarily built with AI. ## Features ### Pan & zoom https://github.com/user-attachments/assets/97c2ff83-acfa-40ec-ae02-b16ad9a47318 Infinite 2D canvas with viewport panning, zoom, and scroll momentum. A quick flick carries the viewport smoothly until friction stops it. Pan & zoom bindings | Input | Action | Context | | ------------------ | ----------------- | --------- | | 3-finger swipe | Pan viewport | anywhere | | Trackpad scroll | Pan viewport | on-canvas | | `Mod` + LMB drag | Pan viewport | anywhere | | `Mod+Ctrl` + arrow | Pan viewport | — | | 2-finger pinch | Zoom | on-canvas | | 3-finger pinch | Zoom | anywhere | | Mouse wheel | Zoom | on-canvas | | `Mod` + scroll | Zoom at cursor | anywhere | | `Mod+=` / `Mod+-` | Zoom in / out | — | | `Mod+0` / `Mod+Z` | Reset zoom to 1.0 | — | ### Window navigation https://github.com/user-attachments/assets/ab80b545-817d-4d9f-beea-d332b3bb3dfa Jump to the nearest window in any direction. MRU cycling (`Alt-Tab`) with hold-to-commit. Zoom-to-fit shows all windows at once. Configurable _anchors_ act as navigation targets for directional jumps even with no window there — useful for areas with pinned widgets. _Bookmarks_: named canvas spots the camera jumps straight to. Navigation bindings | Input | Action | | ---------------------------- | ------------------------------------------ | | 4-finger swipe | Jump to nearest window (natural direction) | | `Mod+Ctrl` + LMB drag | Jump to nearest window (natural direction) | | `Mod` + arrow | Jump to nearest window in direction | | `Alt-Tab` / `Alt-Shift-Tab` | Cycle windows (MRU) | | 4-finger pinch in / `Mod+W` | Zoom-to-fit (overview) | | 4-finger pinch out / `Mod+A` | Home toggle (origin and back) | | 4-finger hold / `Mod+C` | Center focused window | | `Mod+1-4` | Jump to bookmarked canvas position | | `Mod+Shift+1-4` | Save the current position as that bookmark | All 4-finger navigation gestures also work as `Mod` + 3-finger for smaller trackpads. ### Snapping https://github.com/user-attachments/assets/6bfc3458-664f-4746-a176-18f40337d94d Move window with 3-finger doubletap-swipe or `Alt` + drag. Resize with `Alt` + 3-finger swipe. Snapping kicks in as edges approach each other. Drag past the viewport edge and the canvas auto-pans. **Snapped windows form a cluster.** Neighbors stay visible at your view's edge for spatial context, and `Shift` + any move/resize/fit action acts on the whole cluster. Shuffle a layout in one drag, resize a row of panes proportionally, or scope an overview to just the cluster (`Mod+Shift+W`). No explicit grouping to manage. > [!TIP] > While dragging a window, keyboard shortcuts still work. Use `Mod+1-4` > to jump to a bookmark or `Mod+A` to go home — your held window comes with you. Fit-window (`Mod+M`) is the maximize analogue — centers the viewport, resets zoom to 1.0, and resizes the window to fill the screen. Toggle again to restore. Fullscreen (`Mod+F`) fills the screen with the focused window until any canvas action — launching an app, navigating — exits it. Snapping & window bindings | Input | Action | | ----------------------------------------- | ----------------------------- | | 3-finger doubletap-swipe | Move window | | `Alt` + LMB drag | Move window | | `Alt+Shift` + LMB drag | Move snapped windows | | `Alt` + 3-finger swipe | Resize window | | `Alt+Shift` + 3-finger swipe | Resize snapped window | | `Alt` + RMB drag | Resize window | | `Alt` + MMB click / `Mod+M` | Fit window (maximize/restore) | | `Alt+Shift` + MMB click / `Mod+Shift+M` | Fit snapped window | | `Mod` + 4-finger pinch in / `Mod+Shift+W` | Zoom-to-fit snapped windows | | `Alt` + 2-finger pinch in/out | Fit window | | `Alt` + 3-finger pinch in/out | Toggle fullscreen | | `Mod` + MMB click / `Mod+F` | Toggle fullscreen | | `Mod+Shift` + arrow | Nudge window (default 20px) | ### Touchscreen https://github.com/user-attachments/assets/35316541-ad39-4c36-95ab-4093bd48c172 Everything works by touch too: pan and zoom the canvas, jump between windows, and move or resize windows — even whole window groups — exactly as you would on a trackpad. Touch gestures | Input | Action | Context | | ------------------------ | --------------------------- | --------- | | 1-finger swipe | Pan viewport | on-canvas | | 2-finger swipe | Pan viewport | on-canvas | | 3-finger swipe | Pan viewport | anywhere | | 2-finger pinch | Zoom | on-canvas | | 3-finger pinch | Zoom | anywhere | | 4-finger swipe | Jump to nearest window | anywhere | | 4-finger pinch in / out | Zoom-to-fit / home toggle | anywhere | | 3-finger tap | Center window | anywhere | | 3-finger double-tap | Fit window | on-window | | 3-finger doubletap-swipe | Move window (hold: cluster) | on-window | | 3-finger hold-swipe | Resize window | on-window | ### Infinite background https://github.com/user-attachments/assets/b1581182-5e21-45c8-8559-99ab54bb5093 https://github.com/user-attachments/assets/fb1cd5a1-242c-45d7-b302-952a15aaa24d The background is part of the canvas — it scrolls and zooms with the viewport, not stuck to the screen. Five modes: - **`default`** — the built-in dot grid, what you get with no configuration. - **`shader`** — procedural GLSL, animated or static, optionally sampling an image via `texture`. See [docs/shaders.md](docs/shaders.md) to write your own. Bundled shaders live in `extras/wallpapers/{static,animated,textured}/`. - **`tile`** — PNG/JPG (single texture, tiled infinitely), or a tiled pyramidal TIFF for [gigapixel wallpapers](docs/gigapixel-wallpapers.md). Set `mirror_tile = true` to mirror-fold a non-seamless image so it tiles without seams (kaleidoscope look). - **`wallpaper`** — single image scaled to cover the viewport, aspect-preserving (does not scroll/zoom) — a classic desktop wallpaper. - **`none`** — no built-in background, so an external `wlr-layer-shell` wallpaper daemon (`swaybg`, `swww`, `mpvpaper` for live video) becomes the wallpaper instead. ```toml [background] type = "shader" path = "~/.config/driftwm/bg.glsl" # texture = "~/Pictures/img.jpg" # if it's a texture-based shader # Or: type = "tile", path = "~/Pictures/tile.png" # Or: type = "tile", path = "~/Pictures/world.tif" # pyramidal TIFF # Or: type = "wallpaper", path = "~/Pictures/wallpaper.jpg" # Or: type = "none" # external wallpaper daemon (swaybg/mpvpaper/…) ``` ### Window rules https://github.com/user-attachments/assets/e30e3821-1e84-4f6e-be60-adcb0ee58d3c Match windows by `app_id` and/or `title` (glob patterns) and control position, size, decorations, blur, opacity, key pass-through, and placement — fields combine freely. Two special placement modes: **`widget = true`** fixes a window to the canvas (immovable, below normal windows, out of Alt-Tab — clocks, trays, and layer-shell surfaces like waybar); **`pinned_to_screen = true`** fixes it to the screen instead, so it ignores pan/zoom and floats above normal windows (Picture-in-Picture, call toolbars) — toggleable live with `Mod+T`. ```toml # Frosted-glass terminal [[window_rules]] app_id = "Alacritty" opacity = 0.85 blur = true # Desktop widget — pinned to the canvas, borderless [[window_rules]] app_id = "my-clock" position = [50, 50] widget = true decoration = "none" ``` > [!TIP] > To find a window's `app_id` or `title`, run `driftwm msg state` — it lists > every open window with its app ID, title, position, and size. See [docs/window-rules.md](docs/window-rules.md) for more details. ### Multi-monitor https://github.com/user-attachments/assets/3f6cc3a8-a4ed-4d78-80fc-d5a92478c48f Multiple monitors are independent viewports on the same canvas. An outline on each monitor shows where the other monitors' viewports are. Cursor crosses between monitors freely; dragged windows teleport to the target viewport's canvas position. Multi-monitor bindings | Input | Action | | ----------------- | ------------------------------ | | `Mod+Alt` + arrow | Send window to adjacent output | ### Panels, docks & taskbars https://github.com/user-attachments/assets/31c235e6-baae-4843-bb43-aca749e41f04 Layer shell surfaces (waybar, fuzzel, mako) work as expected. Docks and taskbars see every window — click one and the viewport pans to it and centers it. Bookmarks are exported as workspaces over `ext-workspace-v1` — bars that support it can list them and click to jump. It's an export for tooling, not real workspaces; driftwm is still one canvas. ### Window suspend & session restore https://github.com/user-attachments/assets/a91d92bd-55af-4646-8be8-81f35f8f38ca Close a window and leave a placeholder behind instead of losing it: `suspend-window` swaps the window for a compositor-drawn stand-in at the same canvas spot — press `Enter` or click its name to bring the app right back, in the same place. `suspend_on_close` does this automatically for every client-initiated close. `[session].restore_windows` keeps your whole canvas saved as you work and restores it (dormant, nothing auto-launches) on the next start, with `restore_camera` bringing each output's view back too. See [docs/session.md](docs/session.md). ### Everything else - New wind

GitHub Issues· 0 open

View all on GitHub

No open issues yet, or sync has not completed.

Highlights

  • •default — the built-in dot grid, what you get with no configuration.
  • •wallpaper — single image scaled to cover the viewport, aspect-preserving (does not scroll/zoom) — a classic desktop wallpaper.
  • •none — no built-in background, so an external wlr-layer-shell wallpaper daemon (swaybg, swww, mpvpaper for live video) becomes the wallpaper instead.
  • •New wind

> Tags

Rustcompositorgesturesinfinite-canvaslinux

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言