Commit graph

22 commits

Author SHA1 Message Date
Till Wegmueller
a189c2f51b Add keyboard and pointer input handling via Smithay seat
Initialize keyboard and pointer on the Wayland seat at startup, and
route Winit input events (keyboard, pointer motion, button, scroll)
through process_input_event to the Smithay seat so clients can receive
input. Click-to-focus raises the clicked window and sets keyboard focus.
2026-04-04 18:51:22 +02:00
Till Wegmueller
cbfc6e95df Add rendering pipeline for client surfaces via OutputDamageTracker
- Create render module using Smithay's desktop::space::render_output
  for damage-tracked frame rendering to the Winit backend window
- Store backend and damage_tracker in CalloopData so the Winit event
  callback can trigger rendering on Redraw events
- Send initial xdg toplevel configure on first commit so clients can
  begin drawing
- Send frame callbacks after each render so clients schedule redraws
2026-04-04 18:45:31 +02:00
Till Wegmueller
50c8f68906 Wire up Winit backend and calloop event loop for wrsrvd
Initialize WinitGraphicsBackend with GlesRenderer, create a virtual
Output matching the window size, set up a Wayland listening socket via
ListeningSocketSource, and run the main event loop through calloop with
WinitEventLoop as an event source. The compositor now opens a window
and accepts Wayland client connections.
2026-04-04 18:38:38 +02:00
Till Wegmueller
383e91addf Split Wayland protocol handlers into dedicated modules
Move handler trait impls and delegate macros from state.rs into
handlers/{compositor,xdg_shell,input,output}.rs. Flesh out
CompositorHandler::commit with on_commit_buffer_handler and
XdgShellHandler::new_toplevel with window mapping. Add DataDeviceHandler,
SelectionHandler, ClientDndGrabHandler, and ServerDndGrabHandler impls
with DataDeviceState in the WayRay struct. State.rs now contains only
the struct definition and constructor.
2026-04-04 18:30:32 +02:00
Till Wegmueller
1f44288bce Add WayRay compositor state struct with Smithay subsystems
Define the central WayRay state struct holding all Smithay subsystem
states (compositor, xdg_shell, shm, seat, output, space, clock) and
wire Display creation into main.rs. Includes minimal handler trait
impls and delegate macros needed to compile; these will be expanded
and moved to a handlers module in Task 4.
2026-04-04 18:26:03 +02:00
Till Wegmueller
2d68ab6e8d Add tracing and miette error infrastructure to wrsrvd 2026-04-04 18:20:52 +02:00
Till Wegmueller
4e08dfb5a9 Set up Cargo workspace with four crates
Workspace: wrsrvd, wrclient, wayray-protocol, wradm under crates/.
Smithay configured with default-features=false, portable features only.
Implements ADR-007 project structure.
2026-04-04 18:16:53 +02:00
Till Wegmueller
e55df6306d Add Phase 0 foundation implementation plan
Detailed 9-task plan covering workspace scaffold, Smithay compositor,
Wayland protocol handlers, Winit backend, rendering, input handling,
and framebuffer capture with ExportMem.
2026-04-04 18:08:32 +02:00
Till Wegmueller
f3f584e8a7
Add article: WayRay as a modern successor to Sun Ray
Long-form article for the project website covering SunRay history,
why it mattered, what went wrong, and how WayRay modernizes every
aspect: QUIC transport, content-adaptive encoding, smartphone
proximity tokens, pluggable window management, federation, protocol
gateways, and illumos as primary platform.
2026-03-29 17:08:48 +02:00
Till Wegmueller
f702cbf4e7
Add ADR-016: GPU pipeline future-proofing for cloud gaming
Ensure today's CPU-first design doesn't block a future zero-copy
GPU encoding path (DMA-BUF → VAAPI/NVENC, sub-5ms encode latency).

Key design constraints:
- FrameSource enum: Cpu and DmaBuf variants (build Cpu now, DmaBuf later)
- FrameEncoder trait: accepts both, encoder picks preferred source
- Pipelined render→encode→send (no synchronous blocking)
- Adaptive frame cadence: OnDamage (desktop) vs Fixed (gaming)
- Damage tracking forks: pixel diff for CPU, Wayland hints for GPU

No GPU code built now -- just trait interfaces that preserve the path.
2026-03-29 13:29:32 +02:00
Till Wegmueller
643c4f042d
Rename binaries to illumos-style short names
Follow illumos CLI naming conventions (zoneadm, svcadm, dladm):

  wayray-server           → wrsrvd
  wayray-client           → wrclient
  wayray-ctl              → wradm
  wayray-greeter          → wrlogin
  wayray-session-launcher → wrsessd
  wayray-gateway          → wrgw
  wayray-wm-floating      → wr-wm-floating
  wayray-wm-tiling        → wr-wm-tiling

Updated across all 23 documentation files, ADRs, book pages,
roadmap, and CLAUDE.md. Added binary name table to CLAUDE.md.
2026-03-29 00:34:19 +01:00
Till Wegmueller
c32ed5531d
Add ADR-015: Virtual desktops, RDP integration, and protocol gateways
Three-tier RDP integration:
- Tier 1: FreeRDP as Wayland app (works today)
- Tier 2: FreeRDP RAIL mode (seamless Windows apps in WM)
- Tier 3: Protocol gateway (VPN + RDP + seamless, managed service)

Protocol gateway handles full lifecycle: VPN tunnel establishment,
RDP session start, RAIL window translation to foreign surfaces.
Each gateway in isolated network namespace/zone. Connection profiles
per customer with security policies (clipboard, file transfer, etc.)

Protocol-agnostic adapter trait supports RDP, VNC, SPICE, SSH X11,
and WayRay federation as pluggable remote protocol sources.

Includes "maintenance engineer's day" scenario showing multi-customer
workflow with virtual desktops, gateway connections persisting across
session suspend/resume, and cross-site mobility.
2026-03-29 00:31:00 +01:00
Till Wegmueller
204c200bc9
Add direct remote access scenario and token-based server routing
When at a friend's or customer's site, the client connects directly
to the user's own server over the internet -- no local server involved,
no federation needed. The thin client is just a screen + network.

- ADR-014: Add scenarios 4b/4c (friend's house, BYOD on-site),
  server selection UI, three-category taxonomy (direct remote,
  federation, sandboxing)
- ADR-013: BLE beacon payload now includes server address so the
  phone tells any terminal where to find the user's desktop
2026-03-29 00:08:34 +01:00
Till Wegmueller
8653c01518
Add ADR-014: Federation and foreign surface integration
Unified mechanism for two related problems:
- Federation: windows from remote WayRay servers appear in local
  desktop (B2B invites, cross-org app sharing, visiting consultants)
- Sandboxing: windows from isolated local environments (illumos zones,
  containers) appear alongside trusted local windows

Three display modes:
- Desktop-in-desktop (full remote session in a window)
- Merged windows (seamless per-window integration with local WM)
- App embedding (future: subsurface portal)

Trust-level visual indicators (Local/Trusted/Sandboxed/Untrusted),
input isolation per trust level, B2B invite flow, server-to-server
mutual TLS federation, and OIDC-based dynamic trust chains.

Same ForeignWindow protocol for both remote (QUIC) and local (Unix
socket) sources. illumos zones as natural sandboxing primitive.
2026-03-29 00:03:51 +01:00
Till Wegmueller
141f8220d7
Update ADR-013: NFC charging pad as smart card reader
Add wireless charging pad mode -- phone on Qi pad acts as smart card
in a reader slot. NFC provides crisp insert/remove semantics without
RSSI ambiguity. Combined NFC+BLE mode for heartbeat during brief
NFC interrupts. Configurable per-deployment: centimeter range (pad)
vs meter range (pocket) vs combined.
2026-03-28 23:28:55 +01:00
Till Wegmueller
7db68df21f
Add ADR-013: Smartphone as BLE proximity token
Phone acts as wireless smart card -- walk up to terminal, session
appears; walk away, session suspends. No insertion, works from pocket.

- BLE beacon with encrypted rotating session token
- RSSI-based proximity detection with configurable thresholds
- Anti-flapping timers: T_attach (2s) and T_detach (10s)
- Security: HMAC timestamps, token rotation, optional NFC tap
- Companion app (Android/iOS): one-time OIDC setup, background BLE
- Implements same TokenProvider trait as smart cards (ADR-004)
- NFC as explicit complement, WiFi/mDNS as software fallback
2026-03-28 23:25:54 +01:00
Till Wegmueller
a04c04a22c
Add ADR-012: Cloud authentication via OAuth/OIDC greeter
The greeter bridges cloud identity to local user context:
- Device Authorization Grant (RFC 8628) as recommended flow
  for thin clients (QR code, no browser needed on server)
- Authorization Code with PKCE as alternative
- Claims-to-user mapping (IdP sub/email/groups -> local uid/gids)
- Auto-provisioning on first login (useradd, ZFS home dataset)
- Pluggable auth architecture (local, OIDC, smart card, Kerberos)
- Ephemeral pre-auth session for greeter display
- Session launcher interface unchanged regardless of auth method
2026-03-28 23:17:54 +01:00
Till Wegmueller
f005dccd67
Update ADR-011: Add bare-metal framebuffer backend (Tier 0)
illumos has /dev/fb0 via the gfxp_bitmap driver on UEFI GOP systems,
exposing the classic SunOS fbio(4I) interface. Userspace can mmap the
framebuffer and write pixels directly -- proven by xf86-video-illumosfb.

New four-tier architecture:
- Tier 0: Bare-metal /dev/fb0 (illumos fbio + Linux fbdev). No X11.
- Tier 1: X11 SHM (portable fallback, also dev mode)
- Tier 2: Loopback shared memory (co-located optimization)
- Tier 3: DRM/KMS (Linux, rare illumos)

Includes implementation sketch with SIMD non-temporal stores for
write-combining memory (SSE2/AVX2/AVX-512 runtime selection).
2026-03-28 22:43:40 +01:00
Till Wegmueller
4e31f172fb
Add ADR-011: Local display mode for illumos workstations
WayRay must work as a local desktop compositor, not just remote.
Three-tier approach:

- Tier 1: Custom X11 SHM backend (PixmanRenderer + XShmPutImage).
  Works on any illumos system with X11, even VESA-only GPUs.
- Tier 2: Loopback optimization for co-located server+client,
  shared memory buffer ring skipping encode/decode entirely.
- Tier 3: DRM/KMS backend for Linux or accelerated illumos GPUs.

Same compositor core, different output backend. Validated by
cocoa-way (Smithay on macOS) using the same headless+present pattern.
2026-03-28 21:47:55 +01:00
Till Wegmueller
a373ea1c41
Add greeter/session-launch architecture, clarify scope boundary
WayRay is a compositor, not a DE or login system. GNOME/KDE cannot
run on WayRay (they ARE compositors). The desktop is composed from
independent Wayland clients (pluggable WM + panel + launcher + apps).

- ADR-010: Greeter as Wayland client, external session launcher
  handles PAM/user env (like greetd for Sway)
- Clarify scope: WayRay owns compositor session + token binding,
  not user auth, home dirs, or environment setup
- Update roadmap with greeter phase and session.toml config
- Update architecture overview with scope boundary section
2026-03-28 21:35:18 +01:00
Till Wegmueller
167c6c17c6
Add project documentation, architecture decisions, and usage book
Comprehensive documentation for WayRay, a SunRay-like thin client
Wayland compositor targeting illumos and Linux:

- CLAUDE.md: project context and conventions
- docs/ai/plans: 6-phase implementation roadmap
- docs/ai/adr: 9 architecture decision records (Smithay, QUIC,
  frame encoding, session management, rendering, audio, project
  structure, illumos support, pluggable window management)
- docs/architecture: system architecture overview with diagrams
- docs/protocols: WayRay wire protocol specification
- book/: mdbook user guide (introduction, concepts, server/client
  guides, admin, development)
- RESEARCH.md: deep research on remote display protocols
2026-03-28 20:47:16 +01:00
Till Wegmueller
a82d60b835
Initial commit
Signed-off-by: Till Wegmueller <toasterson@gmail.com>
2026-03-28 18:53:00 +01:00