[package] name = "netdesk-viewer" version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true description = "NetDesk native viewer window — GPU-filtered (bilinear) remote-screen rendering with a full TeamViewer/RustDesk-style toolbar, built on eframe + egui (winit + glow). Developed by Akronlogic." [[bin]] name = "netdesk-viewer" path = "src/main.rs" [dependencies] netdesk-core = { path = "../core" } tokio = { workspace = true } anyhow = { workspace = true } # control-protocol payloads (session.info / sys.res) arrive as JSON strings from # the core; parse them in the net thread into clean Rust before the UI sees them. serde_json = { workspace = true } # host-control module (host_ctl.rs) models the shared config.json with derive. serde = { workspace = true } # host-control module: blocking HTTPS (rustls) to the relay /api — account # sign-in / sign-up / sign-out, device list, and /health ping. Enable the # "json" feature for send_json / into_json (tls + gzip are on by default). ureq = { version = "2.10", features = ["json"] } # eframe bundles winit + the GPU backend (glow/OpenGL) + the event loop, and egui # gives us a real toolbar/menus over the remote image. egui TextureOptions::LINEAR # = bilinear GPU filtering = smooth + clear scaling of the decoded frame. eframe = { version = "0.29", default-features = false, features = ["glow", "default_fonts"] } egui = "0.29" # OS clipboard read/write for RustDesk-style clipboard sync (egui can set but not # read the clipboard; arboard does both). Already in the tree via eframe. arboard = "3" # decode the embedded NetDesk logo PNG into pixels (window icon + in-app logo # texture) and encode the live frame to PNG for "Save screenshot". image = { version = "0.25", default-features = false, features = ["png"] } # native OS file-picker for the File transfer panel's "Upload…" button (pick a # local file to send to the host). Sync FileDialog only, so no async runtime # feature is needed; the Linux-backend features are irrelevant on Windows. rfd = { version = "0.15", default-features = false } # pure-Rust QR encoder (Nayuki) for in-app TOTP 2FA enrollment — render the # host's otpauth:// secret as a QR the user scans with an authenticator app. qrcodegen = "1.8" # crisp, consistent icon set (web / copy / folder / lock / power / arrows / …) so # every button shows a real icon instead of a missing-glyph box. Pure-Rust # embedded font (Phosphor), no C build; matches egui 0.29. egui-phosphor = "0.7" # logging for the headless --host diagnostics env_logger = "0.11" # NOTE: remote audio playback ("Play remote computer sound") is implemented in # src/audio.rs (cpal + Opus) but not yet wired in — the libopus build on this # windows-gnu toolchain needs a reliable Opus source (audiopus_sys 0.1.8's build # script mangles extended-length paths). Re-enable cpal + an Opus decoder here # and `mod audio;` in main.rs once that is sorted. # Unified app: the native Rust host engine (capture+encode+SendInput) runs # IN-PROCESS when the user clicks Start Service, so one NetDesk.exe both views # and hosts — no Python. Windows-only (DXGI/MediaFoundation/SendInput live here). [target.'cfg(windows)'.dependencies] netdesk-host = { path = "../host" } # Remote audio playback (src/audio.rs): Opus decode via the vendored libopus # + cpal (WASAPI) output. netdesk-opus = { path = "../opus" } cpal = "0.15"