From 172eb56fee0b6bde698e72be2bca55a90fe81ce9 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Wed, 8 Jul 2026 12:25:04 -0300 Subject: steam deck nice version --- build.zig | 51 +++- docs/design.typ | 2 +- docs/helix-keys.md | 17 +- shaders/crt.frag.glsl | 39 +++ shaders/crt.vert.glsl | 9 + src/crt.zig | 43 +++ src/deck.zig | 157 ++++++++++ src/gui.zig | 298 ++++++++++++++++--- src/pardes.zig | 28 +- src/tty.zig | 1 - test/deck/buttons.zon | 81 ++++++ test/deck/lpad-swipe.zon | 163 +++++++++++ test/deck/replay.zig | 116 ++++++++ test/deck/rpad-drag.zon | 223 ++++++++++++++ test/deck/schema.zig | 70 +++++ test/deck/triggers.zon | 576 +++++++++++++++++++++++++++++++++++++ test/hxdiff.zig | 32 +-- test/snapshots/argv.golden | 6 +- test/snapshots/boot.golden | 4 +- test/snapshots/chordcut.golden | 26 +- test/snapshots/cursorline.golden | 8 +- test/snapshots/dump.golden | 2 +- test/snapshots/dump.snap | 4 +- test/snapshots/edit.golden | 4 +- test/snapshots/exec-bigdrag.golden | 2 +- test/snapshots/exec.golden | 8 +- test/snapshots/fileedit.golden | 6 +- test/snapshots/fsearch.golden | 20 +- test/snapshots/ghostty-mid.golden | 2 +- test/snapshots/hscroll.golden | 10 +- test/snapshots/images.golden | 8 +- test/snapshots/layout-close.golden | 10 +- test/snapshots/layout-open.golden | 10 +- test/snapshots/load.golden | 4 +- test/snapshots/load.snap | 4 +- test/snapshots/look-center.golden | 6 +- test/snapshots/look-dir.golden | 2 +- test/snapshots/look-file.golden | 4 +- test/snapshots/lookloaded.golden | 6 +- test/snapshots/modal.golden | 24 +- test/snapshots/respawn.golden | 2 +- test/snapshots/restore.golden | 4 +- test/snapshots/restore.snap | 8 +- test/snapshots/scroll.golden | 12 +- test/snapshots/scrolloff.golden | 14 +- test/snapshots/selarg.golden | 6 +- test/snapshots/shrinktag.golden | 10 +- test/snapshots/splitparent.golden | 8 +- test/snapshots/syntax.golden | 8 +- test/snapshots/tag.golden | 10 +- test/snapshots/theme.golden | 12 +- test/snapshots/tty.golden | 6 +- test/snapshots/ttyclick.golden | 8 +- test/snapshots/ttyfollow.golden | 6 +- test/snapshots/ttylook.golden | 18 +- test/snapshots/ttyonly.golden | 4 +- test/snapshots/tutor.golden | 2 +- test/snapshots/winch.golden | 4 +- test/snapshots/windowops.golden | 24 +- test/snapshots/yankpaste.golden | 93 ++++++ test/snapshots/yankpaste.snap | 28 ++ 61 files changed, 2100 insertions(+), 273 deletions(-) create mode 100644 shaders/crt.frag.glsl create mode 100644 shaders/crt.vert.glsl create mode 100644 src/crt.zig create mode 100644 src/deck.zig create mode 100644 test/deck/buttons.zon create mode 100644 test/deck/lpad-swipe.zon create mode 100644 test/deck/replay.zig create mode 100644 test/deck/rpad-drag.zon create mode 100644 test/deck/schema.zig create mode 100644 test/deck/triggers.zon create mode 100644 test/snapshots/yankpaste.golden create mode 100644 test/snapshots/yankpaste.snap diff --git a/build.zig b/build.zig index d0b4496e..a387db9e 100644 --- a/build.zig +++ b/build.zig @@ -5,7 +5,17 @@ pub const TreeSitterGrammars = enum { disabled, minimal, full }; const GhosttyArtifact = enum { ghostty, lib }; pub fn build(b: *std.Build) void { - const target = b.standardTargetOptions(.{}); + // Default target is the Steam Deck (deckcap's trick): x86_64 linux-gnu + // with the glibc version pinned low, so a binary built on a rolling- + // release host runs on SteamOS — a native build references the host's + // newer versioned libm/libc symbols and dies with "GLIBC_2.4x not found" + // on the deck. Override with -Dtarget= as usual. + const target = b.standardTargetOptions(.{ .default_target = .{ + .cpu_arch = .x86_64, + .os_tag = .linux, + .abi = .gnu, + .glibc_version = .{ .major = 2, .minor = 38, .patch = 0 }, + } }); const requested_optimize = b.standardOptimizeOption(.{}); const platform = b.option(Platform, "platform", "which shell to build (tty, gui, web)") orelse .tty; const static = b.option(bool, "static", "statically link") orelse false; @@ -284,10 +294,16 @@ pub fn build(b: *std.Build) void { // the SPIR-V compiled at build time from shaders/*.glsl — or, on web, the // GL ES shader sources compiled at runtime by WebGL. if (platform == .gui or platform == .web) { + // sanitize_c MUST stay off: zig cc's UBSan (on for C in Debug AND + // ReleaseSafe) traps hidapi's mismatched fn-pointer calls the moment + // a HID gamepad is enumerated — SDL_Init SIGILLs on the deck itself + // (ud2 in SDL_hid_set_nonblocking_REAL); headless boxes never see it. + // SDL3 always statically linked (like deckcap): the gui binary must + // only need system libc/libm — never a shared libSDL3. const sdl_dep = if (emscripten_include) |include| - b.lazyDependency("sdl", .{ .target = target, .optimize = optimize, .system_include_path = include }) + b.lazyDependency("sdl", .{ .target = target, .optimize = optimize, .sanitize_c = .off, .preferred_linkage = .static, .system_include_path = include }) else - b.lazyDependency("sdl", .{ .target = target, .optimize = optimize }); + b.lazyDependency("sdl", .{ .target = target, .optimize = optimize, .sanitize_c = .off, .preferred_linkage = .static }); if (sdl_dep) |dep| { const sdl_lib = dep.artifact("SDL3"); if (libc_file) |f| sdl_lib.setLibCFile(f); @@ -326,6 +342,12 @@ pub fn build(b: *std.Build) void { root_mod.addAnonymousImport("overlay.frag.spv", .{ .root_source_file = compileGlsl(b, "shaders/overlay.frag.glsl", "fragment", "overlay.frag.spv"), }); + root_mod.addAnonymousImport("crt.vert.spv", .{ + .root_source_file = compileGlsl(b, "shaders/crt.vert.glsl", "vertex", "crt.vert.spv"), + }); + root_mod.addAnonymousImport("crt.frag.spv", .{ + .root_source_file = compileGlsl(b, "shaders/crt.frag.glsl", "fragment", "crt.frag.spv"), + }); } } @@ -436,7 +458,28 @@ pub fn build(b: *std.Build) void { .optimize = optimize, .root_source_file = b.path("src/modal.zig"), }) }); - b.step("unit-test", "run the modal.zig unit tests").dependOn(&b.addRunArtifact(unit).step); + const unit_step = b.step("unit-test", "run the modal.zig + crt.zig + deck replay unit tests"); + unit_step.dependOn(&b.addRunArtifact(unit).step); + // crt.zig is pure std — the mouse-mapping-vs-shader-formula test + const crt_test = b.addTest(.{ .root_module = b.createModule(.{ + .target = target, + .optimize = optimize, + .root_source_file = b.path("src/crt.zig"), + }) }); + unit_step.dependOn(&b.addRunArtifact(crt_test).step); + // deck.zig is pure std too; replay.zig drives it with slices of real + // Steam Deck recordings (test/deck/*.zon, deckcap capture format) + const deck_test = b.addTest(.{ .root_module = b.createModule(.{ + .target = target, + .optimize = optimize, + .root_source_file = b.path("test/deck/replay.zig"), + }) }); + deck_test.root_module.addImport("deck", b.createModule(.{ + .target = target, + .optimize = optimize, + .root_source_file = b.path("src/deck.zig"), + })); + unit_step.dependOn(&b.addRunArtifact(deck_test).step); } } diff --git a/docs/design.typ b/docs/design.typ index 382063cd..dc94219a 100644 --- a/docs/design.typ +++ b/docs/design.typ @@ -216,7 +216,7 @@ click-and-type; terminals get splice runs (shift right, never overwrite; absolute-row anchored), files get real edits. tty: raw pty forwarding (Ctrl-key toggle, default Ctrl-b, `--tty-toggle`), mouse still usable, promptClickMove on entry, prompts visible (hidden in the other modes via -OSC 133). `p` pastes from system clipboard (OSC 52 request/reply); yank +OSC 133). `p` pastes the yank register; yank mirrors out via OSC 52. *Tag.* Live prefix (mode indicator, cwd or path) + editable tail with the diff --git a/docs/helix-keys.md b/docs/helix-keys.md index 4a077c2c..3a73cf25 100644 --- a/docs/helix-keys.md +++ b/docs/helix-keys.md @@ -32,7 +32,7 @@ layer: gap offsets + ranges over the flat text). Differential harness: `x`/`X`, terminal `n`/`N` (lookStep) and file `n`/`N` (searchStep) set EXPLICIT ones. `d`/`c`/`y`/`~`/… act on the active selection either way — that is the point of the model. The pardes-specific chords - (normal-mode Enter look / Tab execute, the clipboard-`p` intercept) + (normal-mode Enter look / Tab execute) act on EXPLICIT selections only and fall back to the word under the cursor when the selection is implicit motion residue. Mode is reported "select" ONLY while `v` extend mode is on (helix keeps mode normal for @@ -82,7 +82,7 @@ with a reason in `test/hxcases/waivers.jsonl`. | `c` | change (delete + insert mode); linewise selections open a fresh indented line | same shape as `d` | helix-verified | | `y` | yank selection; bare cursor yanks the 1-wide selection (char under cursor) | line-yank vim-ism removed (phase 5); yank keeps selection AND cursor (helix). Also emits `set_clipboard` (OSC 52 out) | helix-verified | | `u` / `U` | undo / redo | restores the pre-edit selection (helix); snapshot granularity, no `Alt-u`/`Alt-U` history walking (skipped) | helix-verified | -| `p` (normal) | **async system-clipboard paste**: emits `get_clipboard`, reply arrives as `Event.paste` → sets yank register → pastes | pardes-specific plumbing; placement is helix semantics (B). hxdiff verifies it end-to-end through a fake clipboard that round-trips the yank | helix-verified | +| `p` (normal) | paste the core's yank register after the selection | helix default-register semantics; yank still mirrors OUT via OSC 52 (`set_clipboard`) but `p` never reads the system clipboard back — most terminals refuse the OSC 52 read, which left `p` a silent no-op | helix-verified | | `Esc` (normal) | cancel pending prefix / exit select mode; the selection is KEPT | helix Esc does not collapse selections; never drops to tty mode | helix-verified | | `Esc` (insert) | back to normal mode, cursor right after the insertion (no vim left-step) | | helix-verified | | `Enter` (normal) | acme **look** chord: EXPLICIT selection, else file-ish word under cursor | pardes-specific, keep (helix normal-mode Enter unbound). Covers helix `gf`. Implicit motion residue falls back to the cursor word | pardes-specific | @@ -106,8 +106,7 @@ rule (typed runs only) — same as `d`/`c` today. Phase 2 state added to `Pane`: `count` (accumulator, capped 0xffff), `pending2` (m-mode sub-key), `pending_ch` (mr's ``), `find_op`/`find_ch` (Alt-. repeat). `pending` also holds `m` `[` `]` and the char-arg ops -`f F t T r`. `Pardes.paste_before` carries `P` across the clipboard round -trip. New pure text math in modal.zig (`findChar`, `matchBracket`, +`f F t T r`. New pure text math in modal.zig (`findChar`, `matchBracket`, `paragraphFwd/Bwd`, textobject/surround ranges, `replaceRange/Chars`, `changeCase`, `joinLine`, `indentLines`, `adjustNumber`, `deleteSpan`, `advanceBy`) with inline tests; `zig build unit-test` runs them. @@ -146,8 +145,8 @@ trip. New pure text math in modal.zig (`findChar`, `matchBracket`, | `Ctrl-a` / `Ctrl-x` | increment / decrement the decimal int under the cursor by count | helix-style: under the cursor only (no vim forward scan), `-` handled, i64 saturating, zero-padding width preserved (phase 5); cursor to the last digit, selection kept; terminals: no-op | helix-verified (phase 5) | | `Alt-d` | delete without yanking | `normalDelete(yank=false)` | helix-verified (phase 5) | | `Alt-c` | change without yanking | **skipped (phase 2)**: the pardes `Alt-c` window op (move pane to fresh column, any mode) wins — it's load-bearing global UX and the parent contract forbids touching it. `Alt-d` + `i` covers the behavior. Corpus-covered and waived (`alt-c-window-op`) | waived (phase 5) | -| `P` | paste before | same async clipboard round trip as `p`: `Pardes.paste_before` stashes the intent, the `Event.paste` reply consumes it | helix-verified (phase 5) | -| `p`/`P` semantics | yank ending `\n` pastes as whole lines below/above the SELECTION's line span; else inline at the selection's outer edge. The paste (× count) becomes the selection, head on its last char (helix) | terminals keep the run-splice-at-cursor path (before/after collapses). Still not pty-snap-testable (the snapshot harness never answers OSC 52), but hxdiff verifies it end-to-end via its fake clipboard | helix-verified (phase 5) | +| `P` | paste before | same yank-register path as `p` | helix-verified (phase 5) | +| `p`/`P` semantics | yank ending `\n` pastes as whole lines below/above the SELECTION's line span; else inline at the selection's outer edge. The paste (× count) becomes the selection, head on its last char (helix) | terminals keep the run-splice-at-cursor path (before/after collapses). Pinned by yankpaste.snap and the hxdiff yp cases | helix-verified (phase 5) | ### Selection manipulation @@ -212,7 +211,7 @@ text. | Key(s) | Helix behavior | Reason | | --- | --- | --- | | `?`, `*`, `Alt-*` | rsearch / selection-as-pattern | search — pardes has its own `/` n N (grep-based, kept as-is); helix regex search machinery not wanted | -| `Space` mode, all rows (`f F e . b j g G k s S d D r a h ' w c C Alt-c p P y Y R / ?`) | pickers, LSP actions, clipboard menu, global search, palette | pickers/space-mode; clipboard already covered by pardes normal-`p` + OSC 52 yank | +| `Space` mode, all rows (`f F e . b j g G k s S d D r a h ' w c C Alt-c p P y Y R / ?`) | pickers, LSP actions, clipboard menu, global search, palette | pickers/space-mode; clipboard: yank mirrors out via OSC 52, `p` pastes the register | | Popup `Ctrl-u`/`Ctrl-d`, Completion menu, Signature help tables | LSP popups | LSP | | Picker table (all rows), Prompt table (all rows) | picker / prompt internals | pickers — pardes' tag line is its own one-line editor | | `gn` `gp` `ga` `gm` | next/prev/alternate buffer | buffer nav — pardes panes aren't a buffer list | @@ -272,9 +271,7 @@ Files (all in `test/hxcases/`): `alt-c-window-op` (the pardes window op deliberately shadows helix change-noyank). - `test/hxdiff.zig` builds `pardes-hxdiff`, which drives the sans-IO core - headlessly at 80x24 (22 body rows, matching helix's 22 text rows) with - a fake clipboard that round-trips the yank register (so `y`/`p` - differential-test end-to-end despite the async OSC 52 plumbing). + headlessly at 80x24 (22 body rows, matching helix's 22 text rows). Run it: diff --git a/shaders/crt.frag.glsl b/shaders/crt.frag.glsl new file mode 100644 index 00000000..1c9b15a8 --- /dev/null +++ b/shaders/crt.frag.glsl @@ -0,0 +1,39 @@ +#version 450 + +// The Crt builtin's post-process, one pass, fully static (no animation, no +// glitches). Screen point cc shows the scene at uv' = cc*(1 + BARREL*r2), +// and src/crt.zig maps mouse input through that same transform — keep them +// equal or clicks drift near the edges. + +layout(set = 2, binding = 0) uniform sampler2D u_scene; + +layout(location = 0) out vec4 o_col; + +const float BARREL = 0.012; // barrel curvature; MUST match src/crt.zig barrel +const float VIGNETTE = 0.07; // corner darkening: *= 1 - VIGNETTE*r2^2 +const vec2 PHOSPHOR = vec2(2.0, 2.0); // uv quantize cell in scene px (~1/7 of a glyph cell) +const float SCAN = 0.15; // scanline depth, one raised-cosine band per PHOSPHOR.y rows +const float CHROMA = 0.001; // R/B radial sample offset, grows toward the edges +const float BLOOM = 0.4; // bright-pass neighbor glow added back +const float BLOOM_MIN = 0.5; // channel level where the bright pass starts +const float LIFT = 1.08; // output brightness lift (offsets scan+vignette losses) + +void main() { + vec2 size = vec2(textureSize(u_scene, 0)); + vec2 cc = gl_FragCoord.xy / size * 2.0 - 1.0; + float r2 = dot(cc, cc); + vec2 uv = cc * (1.0 + BARREL * r2) * 0.5 + 0.5; + vec3 col = vec3(0.0); + if (all(greaterThanEqual(uv, vec2(0.0))) && all(lessThanEqual(uv, vec2(1.0)))) { + vec2 q = (floor(uv * size / PHOSPHOR) + 0.5) * PHOSPHOR / size; + vec2 ca = cc * (CHROMA * r2); + col = vec3(texture(u_scene, q + ca).r, texture(u_scene, q).g, texture(u_scene, q - ca).b); + vec2 px = PHOSPHOR / size; + vec3 nb = texture(u_scene, q + vec2(px.x, 0.0)).rgb + texture(u_scene, q - vec2(px.x, 0.0)).rgb + + texture(u_scene, q + vec2(0.0, px.y)).rgb + texture(u_scene, q - vec2(0.0, px.y)).rgb; + col += max(nb * 0.25 - BLOOM_MIN, 0.0) * BLOOM; + } + col *= 1.0 - VIGNETTE * r2 * r2; + col *= 1.0 - SCAN * (0.5 + 0.5 * cos(gl_FragCoord.y * 6.2831853 / PHOSPHOR.y)); + o_col = vec4(col * LIFT, 1.0); +} diff --git a/shaders/crt.vert.glsl b/shaders/crt.vert.glsl new file mode 100644 index 00000000..4e15fcdf --- /dev/null +++ b/shaders/crt.vert.glsl @@ -0,0 +1,9 @@ +#version 450 + +// CRT post-process pass: one fullscreen triangle from gl_VertexIndex, no +// vertex buffer. The fragment shader derives uv from gl_FragCoord. + +void main() { + vec2 p = vec2(float((gl_VertexIndex << 1) & 2), float(gl_VertexIndex & 2)); + gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0); +} diff --git a/src/crt.zig b/src/crt.zig new file mode 100644 index 00000000..9cf81593 --- /dev/null +++ b/src/crt.zig @@ -0,0 +1,43 @@ +//! The Crt builtin's screen geometry, shared between the gui shell's input +//! mapping and its shader: crt.frag.glsl shows the scene point +//! uv' = cc*(1 + barrel*r2) at screen point cc, so a physical mouse position +//! must pass through the SAME forward transform before it becomes a cell. +//! Pure std, so the unit-test step can pin it against the shader formula. + +const std = @import("std"); + +/// MUST match BARREL in shaders/crt.frag.glsl +pub const barrel: f32 = 0.012; + +pub const Point = struct { x: f32, y: f32 }; + +/// physical window pixels -> the scene pixels the shader displays there, +/// clamped to the window. The shader's phosphor quantization and chromatic +/// offset displace at most a few pixels — well under a cell — and are +/// ignored here. +pub fn map(x: f32, y: f32, w: f32, h: f32) Point { + const ccx = x / w * 2.0 - 1.0; + const ccy = y / h * 2.0 - 1.0; + const s = 1.0 + barrel * (ccx * ccx + ccy * ccy); + return .{ + .x = std.math.clamp((ccx * s + 1.0) * 0.5 * w, 0, w - 1), + .y = std.math.clamp((ccy * s + 1.0) * 0.5 * h, 0, h - 1), + }; +} + +test "map matches the shader's barrel formula" { + // center is a fixed point + try std.testing.expectApproxEqAbs(@as(f32, 500), map(500, 250, 1000, 500).x, 0.001); + try std.testing.expectApproxEqAbs(@as(f32, 250), map(500, 250, 1000, 500).y, 0.001); + // corners: cc=(±1,±1), r2=2, scale 1.024 pushes past the tube -> clamped + try std.testing.expectEqual(@as(f32, 0), map(0, 0, 1000, 500).x); + try std.testing.expectEqual(@as(f32, 0), map(0, 0, 1000, 500).y); + try std.testing.expectEqual(@as(f32, 999), map(1000, 500, 1000, 500).x); + try std.testing.expectEqual(@as(f32, 499), map(1000, 500, 1000, 500).y); + // (100,100) of 1000x500: cc=(-0.8,-0.6), r2=1.0, s=1.012 -> + // cc'=(-0.8096,-0.6072) -> (95.2, 98.2) + try std.testing.expectApproxEqAbs(@as(f32, 95.2), map(100, 100, 1000, 500).x, 0.01); + try std.testing.expectApproxEqAbs(@as(f32, 98.2), map(100, 100, 1000, 500).y, 0.01); + // (900,250): cc=(0.8,0), r2=0.64, s=1.00768 -> x'=903.072 + try std.testing.expectApproxEqAbs(@as(f32, 903.072), map(900, 250, 1000, 500).x, 0.01); +} diff --git a/src/deck.zig b/src/deck.zig new file mode 100644 index 00000000..365c420c --- /dev/null +++ b/src/deck.zig @@ -0,0 +1,157 @@ +//! Steam Deck controls -> editor input, as a pure state machine: gui.zig +//! feeds SDL gamepad events in and applies the returned actions (cursor +//! moves, synthetic clicks, wheel ticks, keys, rumble), so the whole +//! mapping replays off-device from deckcap recordings (test/deck/). +//! +//! Layout: right pad moves the pointer (relative, laptop-touchpad-style), +//! left pad scrolls, R2 = select (button 1), L2 = execute (button 2), +//! L1 = look (button 3), dpad down/up = n/N, A = Enter, Y = Tab; execute +//! and look presses also request a brief rumble ack. + +const std = @import("std"); + +// SDL_GamepadButton / SDL_GamepadAxis / touchpad indices (SDL3), verified +// against real deck recordings (test/deck/*.zon) and the pinned SDL's +// hidapi deck driver (touchpad 0 = left pad, 1 = right pad). +pub const BTN_A = 0; // SOUTH +pub const BTN_Y = 3; // NORTH +pub const BTN_L1 = 9; // LEFT_SHOULDER +pub const BTN_DPAD_UP = 11; +pub const BTN_DPAD_DOWN = 12; +pub const AXIS_L2 = 4; // LEFT_TRIGGER, analog 0..32767 +pub const AXIS_R2 = 5; // RIGHT_TRIGGER +pub const PAD_LEFT = 0; +pub const PAD_RIGHT = 1; + +/// feel knobs: a full-pad finger sweep covers this many screen pixels +/// (the deck's screen is 1280x800) / this many wheel ticks +pub const POINTER_SCALE: f32 = 600.0; +pub const SCROLL_SCALE: f32 = 24.0; +/// the pinned SDL 3.4.4 deck driver skips upstream's pad-Y negation, so +/// touch y arrives 0 = pad bottom; flip this when the sdl dep is bumped +pub const PAD_Y_SIGN: f32 = -1.0; +// analog triggers click at 30% and release at 20%: the gap keeps a value +// hovering near one threshold from chattering press/release pairs +pub const TRIG_PRESS: i16 = 9830; +pub const TRIG_RELEASE: i16 = 6553; + +pub const Input = union(enum) { + button: struct { idx: u8, down: bool }, + axis: struct { idx: u8, value: i16 }, + touch: struct { pad: u8, phase: enum { down, motion, up }, x: f32, y: f32 }, +}; + +pub const Click = enum { select, execute, look }; // mouse buttons 1/2/3 +pub const Keytap = enum { n, cap_n, enter, tab }; + +pub const Action = union(enum) { + move: struct { dx: f32, dy: f32 }, // pointer delta in screen pixels + click: struct { which: Click, down: bool }, + wheel: i32, // whole ticks, positive = wheel_down + key: Keytap, + rumble, +}; + +pub const Deck = struct { + rpad_on: bool = false, + rpad_x: f32 = 0, + rpad_y: f32 = 0, + lpad_on: bool = false, + lpad_y: f32 = 0, + scroll: f32 = 0, // fractional wheel ticks carried between motions + l2_held: bool = false, + r2_held: bool = false, + look_held: bool = false, + + pub fn feed(d: *Deck, in: Input, out: *[2]Action) usize { + var n: usize = 0; + switch (in) { + .button => |b| switch (b.idx) { + BTN_A => if (b.down) { + out[0] = .{ .key = .enter }; + n = 1; + }, + BTN_Y => if (b.down) { + out[0] = .{ .key = .tab }; + n = 1; + }, + BTN_DPAD_UP => if (b.down) { + out[0] = .{ .key = .cap_n }; + n = 1; + }, + BTN_DPAD_DOWN => if (b.down) { + out[0] = .{ .key = .n }; + n = 1; + }, + BTN_L1 => { + d.look_held = b.down; + out[0] = .{ .click = .{ .which = .look, .down = b.down } }; + n = 1; + if (b.down) { + out[1] = .rumble; + n = 2; + } + }, + else => {}, + }, + .axis => |a| { + if (a.idx != AXIS_L2 and a.idx != AXIS_R2) return 0; + const held = if (a.idx == AXIS_L2) &d.l2_held else &d.r2_held; + const which: Click = if (a.idx == AXIS_L2) .execute else .select; + if (!held.* and a.value >= TRIG_PRESS) { + held.* = true; + out[0] = .{ .click = .{ .which = which, .down = true } }; + n = 1; + if (which == .execute) { + out[1] = .rumble; + n = 2; + } + } else if (held.* and a.value <= TRIG_RELEASE) { + held.* = false; + out[0] = .{ .click = .{ .which = which, .down = false } }; + n = 1; + } + }, + .touch => |t| switch (t.pad) { + PAD_RIGHT => switch (t.phase) { + // a fresh touch only re-anchors — deltas start from the + // landing point, so the pointer never jumps to it + .down => { + d.rpad_on = true; + d.rpad_x = t.x; + d.rpad_y = t.y; + }, + .motion => if (d.rpad_on) { + out[0] = .{ .move = .{ + .dx = (t.x - d.rpad_x) * POINTER_SCALE, + .dy = (t.y - d.rpad_y) * PAD_Y_SIGN * POINTER_SCALE, + } }; + n = 1; + d.rpad_x = t.x; + d.rpad_y = t.y; + }, + .up => d.rpad_on = false, + }, + PAD_LEFT => switch (t.phase) { + .down => { + d.lpad_on = true; + d.lpad_y = t.y; + }, + .motion => if (d.lpad_on) { + d.scroll += (t.y - d.lpad_y) * PAD_Y_SIGN * SCROLL_SCALE; + d.lpad_y = t.y; + const ticks: i32 = @intFromFloat(d.scroll); + if (ticks != 0) { + d.scroll -= @floatFromInt(ticks); + out[0] = .{ .wheel = ticks }; + n = 1; + } + }, + .up => d.lpad_on = false, + }, + else => {}, + }, + } + return n; + } +}; diff --git a/src/gui.zig b/src/gui.zig index d9ddb280..aba4f7a2 100644 --- a/src/gui.zig +++ b/src/gui.zig @@ -18,6 +18,8 @@ const vaxis = @import("vaxis"); // test modes only: the stdin escape-seq parser const ghostty_vt = @import("ghostty-vt"); // 256-color palette for .index cells const pardes = @import("pardes.zig"); const look = @import("look.zig"); +const deck = @import("deck.zig"); +const crt = @import("crt.zig"); const is_emscripten = builtin.os.tag == .emscripten; @@ -48,6 +50,8 @@ const vert_spv = if (is_emscripten) "" else @embedFile("ui.vert.spv"); const frag_spv = if (is_emscripten) "" else @embedFile("ui.frag.spv"); const overlay_vert_spv = if (is_emscripten) "" else @embedFile("overlay.vert.spv"); const overlay_frag_spv = if (is_emscripten) "" else @embedFile("overlay.frag.spv"); +const crt_vert_spv = if (is_emscripten) "" else @embedFile("crt.vert.spv"); +const crt_frag_spv = if (is_emscripten) "" else @embedFile("crt.frag.spv"); // web: GL ES shader SOURCES, compiled by WebGL at init (no SPIR-V there) const vert_glsl_es = if (is_emscripten) @embedFile("ui.vert.es.glsl") else ""; const frag_glsl_es = if (is_emscripten) @embedFile("ui.frag.es.glsl") else ""; @@ -60,13 +64,37 @@ const embedded_dump = if (is_emscripten) @embedFile("embedded.dump.zon") else "" const bg_default = [3]u8{ 18, 18, 18 }; const fg_default = [3]u8{ 204, 204, 204 }; +// the plan9 arrow cursor, bytes verbatim from 9front /sys/src/9/port/ +// devmouse.c (Cursor arrow, 16x16 MSB-first): clr is the white outline, set +// the black ink, offset {-1,-1} puts the hot point at (1,1) in the bitmap. +// SDL_CreateCursor's scheme: data=1,mask=1 black; data=0,mask=1 white; +// mask=0 transparent — so data = set and mask = set|clr. +const p9_arrow_clr = [32]u8{ + 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x02, 0x80, 0x0C, + 0x80, 0x10, 0x80, 0x10, 0x80, 0x08, 0x80, 0x04, + 0x80, 0x02, 0x80, 0x01, 0x80, 0x02, 0x8C, 0x04, + 0x92, 0x08, 0x91, 0x10, 0xA0, 0xA0, 0xC0, 0x40, +}; +const p9_arrow_set = [32]u8{ + 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, 0xF0, + 0x7F, 0xE0, 0x7F, 0xE0, 0x7F, 0xF0, 0x7F, 0xF8, + 0x7F, 0xFC, 0x7F, 0xFE, 0x7F, 0xFC, 0x73, 0xF8, + 0x61, 0xF0, 0x60, 0xE0, 0x40, 0x40, 0x00, 0x00, +}; +const p9_arrow_mask = blk: { + var m: [32]u8 = undefined; + for (&m, p9_arrow_set, p9_arrow_clr) |*b, s, cl| b.* = s | cl; + break :blk m; +}; + // web: glyphs raster at 1.5x and the canvas backs at CSS×1.5 so text stays // sharp on scaled canvases (the prototype's -Dweb-render-scale, which never // shipped non-default — hardcoded here instead of a build option). const web_render_scale: f32 = 1.5; -const atlas_w: u32 = if (is_emscripten) 2048 else 1024; -const atlas_h: u32 = if (is_emscripten) 2048 else 1024; +// 2048 fits ~2500 glyphs at the 2x native cell (~20x40); web needs it too +const atlas_w: u32 = 2048; +const atlas_h: u32 = 2048; const Slot = struct { u: u32, v: u32 }; const max_touch_points: usize = 16; @@ -370,6 +398,7 @@ const Gui = struct { swapchain_format: c.SDL_GPUTextureFormat, pipeline: *c.SDL_GPUGraphicsPipeline, overlay_pipeline: *c.SDL_GPUGraphicsPipeline, + crt_pipeline: *c.SDL_GPUGraphicsPipeline, atlas_tex: *c.SDL_GPUTexture, atlas_sampler: *c.SDL_GPUSampler, atlas_xfer: *c.SDL_GPUTransferBuffer, @@ -400,6 +429,12 @@ const Gui = struct { live_ctrl: bool = false, live_alt: bool = false, + // Crt builtin: the scene renders into this texture, then a fullscreen + // CRT pass warps it onto the real target + scene_tex: ?*c.SDL_GPUTexture = null, + scene_tex_w: u32 = 0, + scene_tex_h: u32 = 0, + // PARDES_TEST frame capture (render into an offscreen target, dump PPM) capture: bool = false, capture_dir: []const u8 = "", @@ -414,6 +449,7 @@ const Gui = struct { pad_x: f32 = 0, pad_y: f32 = 0, pad_scroll: f32 = 0, + deck: deck.Deck = .{}, // web: WebGL2 handles (plain GL ints) + the CPU-side instance staging gl_program: c_uint = 0, @@ -480,6 +516,12 @@ fn runNative(init: std.process.Init, opts_in: pardes.Options) !void { log.err("SDL_CreateWindow: {s}", .{c.SDL_GetError()}); return error.SdlInit; }; + if (c.SDL_CreateCursor(&p9_arrow_set, &p9_arrow_mask, 16, 16, 1, 1)) |cur| { + _ = c.SDL_SetCursor(cur); + } else log.err("SDL_CreateCursor: {s}", .{c.SDL_GetError()}); + // fullscreen deck use: keep the pointer inside the window. Absolute + // coords stay (no relative mode — clicks need positions). + if (!test_mode) _ = c.SDL_SetWindowMouseGrab(window, true); const device = c.SDL_CreateGPUDevice(c.SDL_GPU_SHADERFORMAT_SPIRV, true, null) orelse { log.err("SDL_CreateGPUDevice: {s}", .{c.SDL_GetError()}); return error.SdlInit; @@ -515,7 +557,7 @@ fn runNative(init: std.process.Init, opts_in: pardes.Options) !void { log.err("ui_font_new failed", .{}); return error.FontInit; }; - const px: f32 = 18.0; + const px: f32 = 27.0; const scale = c.ui_font_scale_for_height(font, px); var cw: c_int = 10; var chh: c_int = 20; @@ -556,6 +598,7 @@ fn runNative(init: std.process.Init, opts_in: pardes.Options) !void { const pipeline = try makePipeline(device, swapchain_format); const overlay_pipeline = try makeOverlayPipeline(device, swapchain_format); + const crt_pipeline = try makeCrtPipeline(device, swapchain_format); const overlay_buffer_size: u32 = @intCast(max_overlay_vertices * @sizeOf(OverlayVertex)); var ovb_info = c.SDL_GPUBufferCreateInfo{ .usage = c.SDL_GPU_BUFFERUSAGE_VERTEX, .size = overlay_buffer_size, .props = 0 }; @@ -575,6 +618,7 @@ fn runNative(init: std.process.Init, opts_in: pardes.Options) !void { .swapchain_format = swapchain_format, .pipeline = pipeline, .overlay_pipeline = overlay_pipeline, + .crt_pipeline = crt_pipeline, .atlas_tex = atlas_tex, .atlas_sampler = atlas_sampler, .atlas_xfer = atlas_xfer, @@ -713,7 +757,7 @@ fn runNative(init: std.process.Init, opts_in: pardes.Options) !void { // 7. render _ = frame_arena.reset(.retain_capacity); const surface = try core.render(frame_arena.allocator()); - renderFrame(&g, gpa, surface) catch |err| log.err("render: {t}", .{err}); + renderFrame(&g, gpa, surface, core.crt_on) catch |err| log.err("render: {t}", .{err}); } } @@ -805,6 +849,7 @@ fn runWeb(opts_in: pardes.Options) !void { .swapchain_format = undefined, .pipeline = undefined, .overlay_pipeline = undefined, + .crt_pipeline = undefined, .atlas_tex = undefined, .atlas_sampler = undefined, .atlas_xfer = undefined, @@ -1033,12 +1078,21 @@ const StdinFeed = struct { f.fill = len - seq_start; break; }; - if (parseFinger(body[0..end])) |finger| { + if (parseFinger(body[0..end])) |finger_in| { + var finger = finger_in; if (g) |gp| { var wpw: c_int = 0; var wph: c_int = 0; _ = c.SDL_GetWindowSizeInPixels(gp.window, &wpw, &wph); - handleFinger(&gp.touch, core, finger, @floatFromInt(@max(wpw, 1)), @floatFromInt(@max(wph, 1)), @floatFromInt(gp.cell_w), @floatFromInt(gp.cell_h)); + const win_w: f32 = @floatFromInt(@max(wpw, 1)); + const win_h: f32 = @floatFromInt(@max(wph, 1)); + if (core.crt_on) { + // touch points are physical: same CRT mapping as the mouse + const m = crt.map(finger.x * win_w, finger.y * win_h, win_w, win_h); + finger.x = m.x / win_w; + finger.y = m.y / win_h; + } + handleFinger(&gp.touch, core, finger, win_w, win_h, @floatFromInt(gp.cell_w), @floatFromInt(gp.cell_h)); } else { handleFinger(&grid_touch, core, finger, @floatFromInt(core.screen_w), @floatFromInt(core.screen_h), 1, 1); } @@ -1249,6 +1303,9 @@ fn dispatch(g: *Gui, core: *pardes.Pardes, sev: *const c.SDL_Event) void { const m = sev.motion; g.mouse_x = m.x; g.mouse_y = m.y; + // pad cursor continues from wherever the pointer last was + g.pad_x = m.x; + g.pad_y = m.y; // drag = motion with a button held (selection extension keys off it) const held: ?pardes.Mouse.Button = if ((m.state & c.SDL_BUTTON_LMASK) != 0) .left @@ -1306,6 +1363,12 @@ fn dispatch(g: *Gui, core: *pardes.Pardes, sev: *const c.SDL_Event) void { var win_h: f32 = @floatFromInt(@max(ph, 1)); var fcw: f32 = @floatFromInt(g.cell_w); var fch: f32 = @floatFromInt(g.cell_h); + if (!is_emscripten and core.crt_on) { + // touch points are physical too: same CRT mapping as the mouse + const m = crt.map(finger.x * win_w, finger.y * win_h, win_w, win_h); + finger.x = m.x / win_w; + finger.y = m.y / win_h; + } if (is_emscripten) { // remap normalized coords into the letterboxed grid so the // shared two-finger machine's cell math stays exact @@ -1333,22 +1396,104 @@ fn dispatch(g: *Gui, core: *pardes.Pardes, sev: *const c.SDL_Event) void { g.gamepad = null; } }, - c.SDL_EVENT_GAMEPAD_BUTTON_DOWN, c.SDL_EVENT_GAMEPAD_BUTTON_UP => { - const down = sev.type == c.SDL_EVENT_GAMEPAD_BUTTON_DOWN; - const col = pixelCell(g.pad_x, g.cell_w); - const row = pixelCell(g.pad_y, g.cell_h); - const button: pardes.Mouse.Button = switch (sev.gbutton.button) { - c.SDL_GAMEPAD_BUTTON_SOUTH => .left, // A - c.SDL_GAMEPAD_BUTTON_EAST => .right, // B - c.SDL_GAMEPAD_BUTTON_NORTH => .middle, // Y - c.SDL_GAMEPAD_BUTTON_LEFT_SHOULDER => .wheel_up, - c.SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER => .wheel_down, - else => return, + // deck.zig maps buttons/triggers/trackpads to pointer, clicks, + // wheel, keys and rumble; this arm just applies its actions + c.SDL_EVENT_GAMEPAD_BUTTON_DOWN, + c.SDL_EVENT_GAMEPAD_BUTTON_UP, + c.SDL_EVENT_GAMEPAD_AXIS_MOTION, + c.SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, + c.SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, + c.SDL_EVENT_GAMEPAD_TOUCHPAD_UP, + => { + const in: deck.Input = switch (sev.type) { + c.SDL_EVENT_GAMEPAD_BUTTON_DOWN, c.SDL_EVENT_GAMEPAD_BUTTON_UP => .{ .button = .{ + .idx = sev.gbutton.button, + .down = sev.gbutton.down, + } }, + c.SDL_EVENT_GAMEPAD_AXIS_MOTION => .{ .axis = .{ + .idx = sev.gaxis.axis, + .value = sev.gaxis.value, + } }, + else => .{ .touch = .{ + .pad = @intCast(std.math.clamp(sev.gtouchpad.touchpad, 0, 255)), + .phase = switch (sev.type) { + c.SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN => .down, + c.SDL_EVENT_GAMEPAD_TOUCHPAD_UP => .up, + else => .motion, + }, + .x = sev.gtouchpad.x, + .y = sev.gtouchpad.y, + } }, + }; + var acts: [2]deck.Action = undefined; + for (acts[0..g.deck.feed(in, &acts)]) |act| switch (act) { + .move => |mv| { + var pw: c_int = 0; + var ph: c_int = 0; + _ = c.SDL_GetWindowSizeInPixels(g.window, &pw, &ph); + // pad_x/pad_y stay PHYSICAL; mouseCell applies the CRT + // mapping once at cell conversion, never into the pad + const old = mouseCell(g, core, g.pad_x, g.pad_y); + g.pad_x = std.math.clamp(g.pad_x + mv.dx, 0, @as(f32, @floatFromInt(@max(pw, 1))) - 1); + g.pad_y = std.math.clamp(g.pad_y + mv.dy, 0, @as(f32, @floatFromInt(@max(ph, 1))) - 1); + // the SDL cursor (plan9 arrow) rides along, so the pad + // cursor and a hardware mouse are one visible pointer + c.SDL_WarpMouseInWindow(g.window, g.pad_x, g.pad_y); + const mc = mouseCell(g, core, g.pad_x, g.pad_y); + if (mc.col == old.col and mc.row == old.row) continue; + // moving with a click held drags, so selections stretch + const held: ?pardes.Mouse.Button = if (g.deck.r2_held) + .left + else if (g.deck.l2_held) + .middle + else if (g.deck.look_held) + .right + else + null; + core.update(.{ .mouse = .{ + .button = held orelse .none, + .kind = if (held != null) .drag else .motion, + .col = mc.col, + .row = mc.row, + } }); + }, + .click => |ck| { + const mc = mouseCell(g, core, g.pad_x, g.pad_y); + core.update(.{ .mouse = .{ + .button = switch (ck.which) { + .select => .left, + .execute => .middle, + .look => .right, + }, + .kind = if (ck.down) .press else .release, + .col = mc.col, + .row = mc.row, + } }); + }, + .wheel => |ticks| { + const mc = mouseCell(g, core, g.pad_x, g.pad_y); + var left = ticks; + while (left != 0) { + left += if (ticks > 0) -1 else 1; + core.update(.{ .mouse = .{ + .button = if (ticks > 0) .wheel_down else .wheel_up, + .kind = .press, + .col = mc.col, + .row = mc.row, + } }); + } + }, + .key => |k| core.update(.{ .key = switch (k) { + .n => .{ .cp = 'n', .text = "n" }, + .cap_n => .{ .cp = 'N', .text = "N" }, + .enter => .{ .cp = pardes.Key.enter }, + .tab => .{ .cp = pardes.Key.tab }, + } }), + // a brief gentle ack for execute/look, not a buzz + .rumble => if (g.gamepad) |pad| { + _ = c.SDL_RumbleGamepad(pad, 0x4000, 0x4000, 80); + }, }; - switch (button) { - .wheel_up, .wheel_down => if (down) core.update(.{ .mouse = .{ .button = button, .kind = .press, .col = col, .row = row } }), - else => core.update(.{ .mouse = .{ .button = button, .kind = if (down) .press else .release, .col = col, .row = row } }), - } }, else => {}, } @@ -1396,9 +1541,24 @@ fn pixelCellF(px: f32, cell: f32) u16 { } /// mouse coords → cell. Native windows are pixel-exact; web SDL reports CSS -/// points into a letterboxed canvas backed at web_render_scale. +/// points into a letterboxed canvas backed at web_render_scale. With the Crt +/// builtin on, the physical point first maps to the scene point the shader +/// displays there (crt.map) — this is the one physical→logical spot shared +/// by the real mouse and the deck's virtual cursor. fn mouseCell(g: *const Gui, core: *const pardes.Pardes, x: f32, y: f32) struct { col: u16, row: u16 } { - if (!is_emscripten) return .{ .col = pixelCell(x, g.cell_w), .row = pixelCell(y, g.cell_h) }; + if (!is_emscripten) { + var mx = x; + var my = y; + if (core.crt_on) { + var pw: c_int = 0; + var ph: c_int = 0; + _ = c.SDL_GetWindowSizeInPixels(g.window, &pw, &ph); + const m = crt.map(mx, my, @floatFromInt(@max(pw, 1)), @floatFromInt(@max(ph, 1))); + mx = m.x; + my = m.y; + } + return .{ .col = pixelCell(mx, g.cell_w), .row = pixelCell(my, g.cell_h) }; + } var pw: c_int = 0; var ph: c_int = 0; _ = c.SDL_GetWindowSizeInPixels(g.window, &pw, &ph); @@ -1427,22 +1587,23 @@ fn pollGamepad(g: *Gui, core: *pardes.Pardes) void { const deadzone: f32 = 8000; const ax: f32 = @floatFromInt(c.SDL_GetGamepadAxis(pad, c.SDL_GAMEPAD_AXIS_LEFTX)); const ay: f32 = @floatFromInt(c.SDL_GetGamepadAxis(pad, c.SDL_GAMEPAD_AXIS_LEFTY)); - const old_col = pixelCell(g.pad_x, g.cell_w); - const old_row = pixelCell(g.pad_y, g.cell_h); - // full tilt ≈ one cell-height per frame; ~60fps makes that a brisk glide - const speed: f32 = @floatFromInt(g.cell_h); + const old = mouseCell(g, core, g.pad_x, g.pad_y); + // full tilt ≈ 0.4 cell-heights per frame: a gentle, aimable glide + const speed: f32 = @as(f32, @floatFromInt(g.cell_h)) * 0.4; if (@abs(ax) > deadzone) g.pad_x = std.math.clamp(g.pad_x + ax / 32767.0 * speed, 0, win_w - 1); if (@abs(ay) > deadzone) g.pad_y = std.math.clamp(g.pad_y + ay / 32767.0 * speed, 0, win_h - 1); - const col = pixelCell(g.pad_x, g.cell_w); - const row = pixelCell(g.pad_y, g.cell_h); - if (col != old_col or row != old_row) - core.update(.{ .mouse = .{ .button = .none, .kind = .motion, .col = col, .row = row } }); + // only on actual stick movement — an unconditional per-frame warp would + // pin the pointer and fight any hardware mouse + if (@abs(ax) > deadzone or @abs(ay) > deadzone) c.SDL_WarpMouseInWindow(g.window, g.pad_x, g.pad_y); + const mc = mouseCell(g, core, g.pad_x, g.pad_y); + if (mc.col != old.col or mc.row != old.row) + core.update(.{ .mouse = .{ .button = .none, .kind = .motion, .col = mc.col, .row = mc.row } }); const ry: f32 = @floatFromInt(c.SDL_GetGamepadAxis(pad, c.SDL_GAMEPAD_AXIS_RIGHTY)); if (@abs(ry) > deadzone) g.pad_scroll += ry / 32767.0 * 0.15; while (@abs(g.pad_scroll) >= 1.0) { const button: pardes.Mouse.Button = if (g.pad_scroll < 0) .wheel_up else .wheel_down; g.pad_scroll += if (g.pad_scroll < 0) 1.0 else -1.0; - core.update(.{ .mouse = .{ .button = button, .kind = .press, .col = col, .row = row } }); + core.update(.{ .mouse = .{ .button = button, .kind = .press, .col = mc.col, .row = mc.row } }); } } @@ -1524,15 +1685,6 @@ fn drainEffects( defer gpa.free(z); _ = c.SDL_SetClipboardText(z.ptr); }, - .get_clipboard => { - if (g == null) continue; - // synchronous, unlike the tty's OSC 52 round-trip: reply is a paste - const t = c.SDL_GetClipboardText(); - defer c.SDL_free(t); - var tlen: usize = 0; - while (t[tlen] != 0) : (tlen += 1) {} - if (tlen > 0) core.update(.{ .paste = t[0..tlen] }); - }, .quit => {}, }; } @@ -1570,9 +1722,8 @@ fn drainEffectsWeb(core: *pardes.Pardes, gpa: std.mem.Allocator, g: *Gui) void { }, // look on a URL → a new tab .open_link => |url| openLinkWeb(gpa, url.slice()), - // nothing to spawn/write/resize/save/dump into; get_clipboard would - // need an async permission round-trip — all no-ops - .spawn, .write, .resize_pty, .save_file, .write_dump, .get_clipboard, .quit => {}, + // nothing to spawn/write/resize/save/dump into — all no-ops + .spawn, .write, .resize_pty, .save_file, .write_dump, .quit => {}, }; } @@ -1595,7 +1746,7 @@ fn openLinkWeb(gpa: std.mem.Allocator, url: []const u8) void { // render: Surface → instanced quads → SDL GPU // ===================================================================== -fn renderFrame(g: *Gui, gpa: std.mem.Allocator, surface: *pardes.Surface) !void { +fn renderFrame(g: *Gui, gpa: std.mem.Allocator, surface: *pardes.Surface, crt_on: bool) !void { const cmd = c.SDL_AcquireGPUCommandBuffer(g.device) orelse return; var sw: u32 = 0; var sh: u32 = 0; @@ -1624,6 +1775,11 @@ fn renderFrame(g: *Gui, gpa: std.mem.Allocator, surface: *pardes.Surface) !void const win_w: f32 = @floatFromInt(sw); const win_h: f32 = @floatFromInt(sh); + // Crt on: the scene pass lands in an offscreen texture, then a second + // pass draws it through the CRT shader onto the real target + if (crt_on) try ensureSceneTexture(g, sw, sh); + const scene: *c.SDL_GPUTexture = if (crt_on) g.scene_tex.? else target; + const overlay_count = buildTouchOverlay(g, sw, sh); if (overlay_count != 0) uploadOverlayGpu(g, cmd, overlay_count); @@ -1631,7 +1787,7 @@ fn renderFrame(g: *Gui, gpa: std.mem.Allocator, surface: *pardes.Surface) !void if (cells != 0) try ensureVbuf(g, cells); var color_target = std.mem.zeroes(c.SDL_GPUColorTargetInfo); - color_target.texture = target; + color_target.texture = scene; color_target.clear_color = .{ .r = @as(f32, @floatFromInt(bg_default[0])) / 255.0, .g = @as(f32, @floatFromInt(bg_default[1])) / 255.0, @@ -1688,6 +1844,19 @@ fn renderFrame(g: *Gui, gpa: std.mem.Allocator, surface: *pardes.Surface) !void c.SDL_EndGPURenderPass(rp); } + if (crt_on) { + var crt_target = std.mem.zeroes(c.SDL_GPUColorTargetInfo); + crt_target.texture = target; + crt_target.load_op = c.SDL_GPU_LOADOP_DONT_CARE; + crt_target.store_op = c.SDL_GPU_STOREOP_STORE; + const rp = c.SDL_BeginGPURenderPass(cmd, &crt_target, 1, null); + c.SDL_BindGPUGraphicsPipeline(rp, g.crt_pipeline); + const samp_binding = c.SDL_GPUTextureSamplerBinding{ .texture = g.scene_tex.?, .sampler = g.atlas_sampler }; + c.SDL_BindGPUFragmentSamplers(rp, 0, &samp_binding, 1); + c.SDL_DrawGPUPrimitives(rp, 3, 1, 0, 0); + c.SDL_EndGPURenderPass(rp); + } + if (g.capture) return captureFrame(g, gpa, cmd, target, sw, sh); _ = c.SDL_SubmitGPUCommandBuffer(cmd); } @@ -1904,6 +2073,26 @@ fn makeOverlayPipeline(device: *c.SDL_GPUDevice, color_format: c.SDL_GPUTextureF return c.SDL_CreateGPUGraphicsPipeline(device, &info) orelse error.GpuCreate; } +// the CRT pass: a fullscreen triangle sampling the scene texture, no vertex +// buffers at all (positions from gl_VertexIndex) +fn makeCrtPipeline(device: *c.SDL_GPUDevice, color_format: c.SDL_GPUTextureFormat) !*c.SDL_GPUGraphicsPipeline { + const vs = try makeShader(device, crt_vert_spv, c.SDL_GPU_SHADERSTAGE_VERTEX, 0); + defer c.SDL_ReleaseGPUShader(device, vs); + const fs = try makeShader(device, crt_frag_spv, c.SDL_GPU_SHADERSTAGE_FRAGMENT, 1); + defer c.SDL_ReleaseGPUShader(device, fs); + + var col_desc = c.SDL_GPUColorTargetDescription{ .format = color_format, .blend_state = std.mem.zeroes(c.SDL_GPUColorTargetBlendState) }; + var info = std.mem.zeroes(c.SDL_GPUGraphicsPipelineCreateInfo); + info.vertex_shader = vs; + info.fragment_shader = fs; + info.primitive_type = c.SDL_GPU_PRIMITIVETYPE_TRIANGLELIST; + info.rasterizer_state.fill_mode = c.SDL_GPU_FILLMODE_FILL; + info.rasterizer_state.cull_mode = c.SDL_GPU_CULLMODE_NONE; + info.multisample_state.sample_count = c.SDL_GPU_SAMPLECOUNT_1; + info.target_info = .{ .color_target_descriptions = &col_desc, .num_color_targets = 1 }; + return c.SDL_CreateGPUGraphicsPipeline(device, &info) orelse error.GpuCreate; +} + fn makeShader(device: *c.SDL_GPUDevice, code: []const u8, stage: c.SDL_GPUShaderStage, n_samplers: u32) !*c.SDL_GPUShader { var info = std.mem.zeroes(c.SDL_GPUShaderCreateInfo); info.code = code.ptr; @@ -2054,6 +2243,23 @@ fn makeGlShader(kind: c_uint, source: []const u8) !c_uint { // PARDES_TEST frame capture: download the render target, write latest.ppm // ===================================================================== +fn ensureSceneTexture(g: *Gui, width: u32, height: u32) !void { + if (g.scene_tex != null and g.scene_tex_w == width and g.scene_tex_h == height) return; + if (g.scene_tex) |t| c.SDL_ReleaseGPUTexture(g.device, t); + var info = std.mem.zeroes(c.SDL_GPUTextureCreateInfo); + info.type = c.SDL_GPU_TEXTURETYPE_2D; + info.format = g.swapchain_format; + info.usage = c.SDL_GPU_TEXTUREUSAGE_COLOR_TARGET | c.SDL_GPU_TEXTUREUSAGE_SAMPLER; + info.width = width; + info.height = height; + info.layer_count_or_depth = 1; + info.num_levels = 1; + info.sample_count = c.SDL_GPU_SAMPLECOUNT_1; + g.scene_tex = c.SDL_CreateGPUTexture(g.device, &info) orelse return error.GpuCreate; + g.scene_tex_w = width; + g.scene_tex_h = height; +} + fn ensureCaptureTexture(g: *Gui, width: u32, height: u32) !void { if (g.capture_tex != null and g.capture_tex_w == width and g.capture_tex_h == height) return; if (g.capture_tex) |t| c.SDL_ReleaseGPUTexture(g.device, t); diff --git a/src/pardes.zig b/src/pardes.zig index 994b0785..f6c0a09c 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -36,7 +36,7 @@ pub const PREFIX_W: u16 = 5; /// above/below the cursor (clamped at file boundaries and short panes) const scroll_off = 3; -pub const topbar_str = "Kill Newcol Tutor Debug Colors NextColor Dump"; +pub const topbar_str = "Kill Newcol Tutor Debug Colors NextColor Crt Dump"; const pane_builtins_str = "Del"; const file_pane_builtins_str = "Save Del"; const pane_tail = " " ++ pane_builtins_str; @@ -44,7 +44,7 @@ const file_pane_tail = " " ++ file_pane_builtins_str; // Builtins: executing the name (middle-click / Tab) runs the action through the // ONE dispatcher (onSelect + actOnSelection), no matter where the name appears. -const SelectAction = enum { none, send, newcol, delcol, del, save, tutor, kill, debug, colors, nextcolor, dump, restore }; +const SelectAction = enum { none, send, newcol, delcol, del, save, tutor, kill, debug, colors, nextcolor, crt, dump, restore }; const Builtin = struct { name: []const u8, action: SelectAction }; const builtins = [_]Builtin{ .{ .name = "Kill", .action = .kill }, @@ -53,6 +53,7 @@ const builtins = [_]Builtin{ .{ .name = "Debug", .action = .debug }, .{ .name = "Colors", .action = .colors }, .{ .name = "NextColor", .action = .nextcolor }, + .{ .name = "Crt", .action = .crt }, .{ .name = "Dump", .action = .dump }, .{ .name = "Restore", .action = .restore }, .{ .name = "Save", .action = .save }, @@ -355,9 +356,6 @@ pub const Effect = union(enum) { write_dump, /// the yank register changed; the shell reads it off the core (OSC 52 out) set_clipboard, - /// a normal-mode `p` wants the system clipboard; the shell requests it and - /// the reply comes back as Event.paste - get_clipboard, quit, fn Buf(comptime n: usize) type { @@ -709,6 +707,9 @@ pub const Pardes = struct { theme_idx: usize = 0, colors_on: bool = true, show_debug: bool = false, + /// the Crt builtin's CRT post-process, rendered by the gui shell only + /// (the tty and web shells never read it) + crt_on: bool = false, /// kitty graphics support, reported by the shell (image panes fall back /// to the petscii matcher without it) kitty_ok: bool = false, @@ -732,9 +733,6 @@ pub const Pardes = struct { /// modal yank register (gpa-owned); a yank also mirrors out to the system /// clipboard via the set_clipboard effect. yank: ?[]u8 = null, - /// a normal-mode `P` is in flight: the next Event.paste pastes BEFORE - /// (the get_clipboard round trip carries no argument) - paste_before: bool = false, /// the last serialized dump (gpa-owned), read by the write_dump effect dump_out: ?[]u8 = null, /// where the shell wrote the last dump (shell reports back after @@ -971,10 +969,9 @@ pub const Pardes = struct { .key => |key| p.handleKey(key), .mouse => |m| p.handleMouse(m), .paste => |bytes| { - // the OSC 52 system-clipboard reply for a normal-mode `p`/`P` + // a shell-level paste (bracketed/SDL): load the register, paste p.setYank(bytes); - if (p.panes[p.active]) |pane| p.normalPaste(pane, p.paste_before); - p.paste_before = false; + if (p.panes[p.active]) |pane| p.normalPaste(pane, false); }, .pinch => |scale| p.ov_pinch_scale = scale, .touch_scroll => |delta| p.ov_touch_scroll_delta = delta, @@ -1285,13 +1282,13 @@ pub const Pardes = struct { p.tagInsertKey(pane, key); return; } - // normal-mode `p`/`P` paste the SYSTEM clipboard: an async OSC 52 - // round trip — request here, the reply arrives later as Event.paste. + // normal-mode `p`/`P` paste the core's yank register directly (helix: + // the default register, NOT the system clipboard — most terminals + // refuse the OSC 52 read, so a round trip would never come back). // Skipped while a prefix waits for its char argument (f/r/m and // friends take `p` literally). if (pane.mode == .normal and pane.pending == 0 and (is(key, 'p') or is(key, 'P'))) { - p.paste_before = is(key, 'P'); - p.emit(.get_clipboard); + p.normalPaste(pane, is(key, 'P')); return; } switch (pane.mode) { @@ -4350,6 +4347,7 @@ pub const Pardes = struct { .debug => p.show_debug = !p.show_debug, .colors => p.colors_on = !p.colors_on, .nextcolor => p.theme_idx = (p.theme_idx + 1) % themes.len, + .crt => p.crt_on = !p.crt_on, .dump => p.dumpState() catch {}, .restore => { var it = std.mem.tokenizeAny(u8, std.mem.trim(u8, txt, " \t\r\n"), " \t"); diff --git a/src/tty.zig b/src/tty.zig index a2ea6462..1342ef6f 100644 --- a/src/tty.zig +++ b/src/tty.zig @@ -365,7 +365,6 @@ fn drainEffects( // mirror the core's yank register out via OSC 52 if (core.yank) |y| vx.copyToSystemClipboard(tty.writer(), y, gpa) catch {}; }, - .get_clipboard => vx.requestSystemClipboard(tty.writer()) catch {}, .quit => {}, }; } diff --git a/test/deck/buttons.zon b/test/deck/buttons.zon new file mode 100644 index 00000000..8b3ae7f8 --- /dev/null +++ b/test/deck/buttons.zon @@ -0,0 +1,81 @@ +.{ .version = 1, .events = .{ +.{.t=3700753450,.pad=2,.ev=.{.button=.{.idx=10,.down=true}}}, +.{.t=3900818994,.pad=2,.ev=.{.button=.{.idx=10,.down=false}}}, +.{.t=3956546622,.pad=2,.ev=.{.button=.{.idx=9,.down=true}}}, +.{.t=4123264775,.pad=2,.ev=.{.button=.{.idx=9,.down=false}}}, +.{.t=4930702402,.pad=2,.ev=.{.button=.{.idx=8,.down=true}}}, +.{.t=5145495294,.pad=2,.ev=.{.button=.{.idx=8,.down=false}}}, +.{.t=5256748340,.pad=2,.ev=.{.button=.{.idx=7,.down=true}}}, +.{.t=5467530268,.pad=2,.ev=.{.button=.{.idx=7,.down=false}}}, +.{.t=6756403713,.pad=2,.ev=.{.button=.{.idx=2,.down=true}}}, +.{.t=6911854483,.pad=2,.ev=.{.button=.{.idx=2,.down=false}}}, +.{.t=7211860980,.pad=2,.ev=.{.button=.{.idx=3,.down=true}}}, +.{.t=7389532087,.pad=2,.ev=.{.button=.{.idx=3,.down=false}}}, +.{.t=8133944867,.pad=2,.ev=.{.button=.{.idx=3,.down=true}}}, +.{.t=8289426557,.pad=2,.ev=.{.button=.{.idx=3,.down=false}}}, +.{.t=9089438184,.pad=2,.ev=.{.button=.{.idx=5,.down=true}}}, +.{.t=9234016011,.pad=2,.ev=.{.button=.{.idx=2,.down=true}}}, +.{.t=9356447170,.pad=2,.ev=.{.button=.{.idx=2,.down=false}}}, +.{.t=9500690066,.pad=2,.ev=.{.button=.{.idx=5,.down=false}}}, +.{.t=10234132592,.pad=2,.ev=.{.button=.{.idx=5,.down=true}}}, +.{.t=10389693142,.pad=2,.ev=.{.button=.{.idx=2,.down=true}}}, +.{.t=10500635738,.pad=2,.ev=.{.button=.{.idx=2,.down=false}}}, +.{.t=10600562571,.pad=2,.ev=.{.button=.{.idx=5,.down=false}}}, +.{.t=11211884827,.pad=2,.ev=.{.button=.{.idx=3,.down=true}}}, +.{.t=11333789807,.pad=2,.ev=.{.button=.{.idx=3,.down=false}}}, +.{.t=11622673840,.pad=2,.ev=.{.button=.{.idx=3,.down=true}}}, +.{.t=11778210450,.pad=2,.ev=.{.button=.{.idx=3,.down=false}}}, +.{.t=12056066449,.pad=2,.ev=.{.button=.{.idx=0,.down=true}}}, +.{.t=12200470216,.pad=2,.ev=.{.button=.{.idx=0,.down=false}}}, +.{.t=13122626673,.pad=2,.ev=.{.button=.{.idx=1,.down=true}}}, +.{.t=13256318175,.pad=2,.ev=.{.button=.{.idx=1,.down=false}}}, +.{.t=30877608417,.pad=2,.ev=.{.button=.{.idx=13,.down=true}}}, +.{.t=30932947265,.pad=2,.ev=.{.button=.{.idx=13,.down=false}}}, +.{.t=31188916557,.pad=2,.ev=.{.button=.{.idx=14,.down=true}}}, +.{.t=31344392047,.pad=2,.ev=.{.button=.{.idx=14,.down=false}}}, +.{.t=31355303161,.pad=2,.ev=.{.button=.{.idx=11,.down=true}}}, +.{.t=31377574308,.pad=2,.ev=.{.button=.{.idx=11,.down=false}}}, +.{.t=31377580618,.pad=2,.ev=.{.button=.{.idx=11,.down=true}}}, +.{.t=31533158438,.pad=2,.ev=.{.button=.{.idx=11,.down=false}}}, +.{.t=31599806330,.pad=2,.ev=.{.button=.{.idx=12,.down=true}}}, +.{.t=31699701622,.pad=2,.ev=.{.button=.{.idx=14,.down=true}}}, +.{.t=31699711442,.pad=2,.ev=.{.button=.{.idx=12,.down=false}}}, +.{.t=31833163995,.pad=2,.ev=.{.button=.{.idx=14,.down=false}}}, +.{.t=31844214668,.pad=2,.ev=.{.button=.{.idx=11,.down=true}}}, +.{.t=31933218167,.pad=2,.ev=.{.button=.{.idx=11,.down=false}}}, +.{.t=31944106321,.pad=2,.ev=.{.button=.{.idx=13,.down=true}}}, +.{.t=31944118861,.pad=2,.ev=.{.button=.{.idx=13,.down=false}}}, +.{.t=32577585424,.pad=2,.ev=.{.button=.{.idx=7,.down=true}}}, +.{.t=32777404849,.pad=2,.ev=.{.button=.{.idx=7,.down=false}}}, +.{.t=32932893939,.pad=2,.ev=.{.button=.{.idx=8,.down=true}}}, +.{.t=33122371409,.pad=2,.ev=.{.button=.{.idx=8,.down=false}}}, +.{.t=34899667922,.pad=2,.ev=.{.button=.{.idx=10,.down=true}}}, +.{.t=35143908581,.pad=2,.ev=.{.button=.{.idx=10,.down=false}}}, +.{.t=35143918751,.pad=2,.ev=.{.button=.{.idx=9,.down=true}}}, +.{.t=35299532711,.pad=2,.ev=.{.button=.{.idx=9,.down=false}}}, +.{.t=36188307687,.pad=2,.ev=.{.button=.{.idx=10,.down=true}}}, +.{.t=36351697335,.pad=2,.ev=.{.button=.{.idx=9,.down=true}}}, +.{.t=36399712574,.pad=2,.ev=.{.button=.{.idx=10,.down=false}}}, +.{.t=36521680424,.pad=2,.ev=.{.button=.{.idx=10,.down=true}}}, +.{.t=36543814231,.pad=2,.ev=.{.button=.{.idx=9,.down=false}}}, +.{.t=36688528867,.pad=2,.ev=.{.button=.{.idx=10,.down=false}}}, +.{.t=38810548641,.pad=2,.ev=.{.button=.{.idx=8,.down=true}}}, +.{.t=38988265258,.pad=2,.ev=.{.button=.{.idx=8,.down=false}}}, +.{.t=39421485428,.pad=2,.ev=.{.button=.{.idx=7,.down=true}}}, +.{.t=39521563760,.pad=2,.ev=.{.button=.{.idx=8,.down=true}}}, +.{.t=39543869347,.pad=2,.ev=.{.button=.{.idx=7,.down=false}}}, +.{.t=39654975672,.pad=2,.ev=.{.button=.{.idx=8,.down=false}}}, +.{.t=40199575307,.pad=2,.ev=.{.button=.{.idx=0,.down=true}}}, +.{.t=40388115109,.pad=2,.ev=.{.button=.{.idx=0,.down=false}}}, +.{.t=40810375225,.pad=2,.ev=.{.button=.{.idx=2,.down=true}}}, +.{.t=40976868838,.pad=2,.ev=.{.button=.{.idx=2,.down=false}}}, +.{.t=41032455046,.pad=2,.ev=.{.button=.{.idx=3,.down=true}}}, +.{.t=41243668724,.pad=2,.ev=.{.button=.{.idx=3,.down=false}}}, +.{.t=42565700760,.pad=2,.ev=.{.button=.{.idx=2,.down=true}}}, +.{.t=42743538487,.pad=2,.ev=.{.button=.{.idx=2,.down=false}}}, +.{.t=43676697498,.pad=2,.ev=.{.button=.{.idx=5,.down=true}}}, +.{.t=43932510879,.pad=2,.ev=.{.button=.{.idx=5,.down=false}}}, +.{.t=43943745523,.pad=2,.ev=.{.button=.{.idx=1,.down=true}}}, +.{.t=44021582808,.pad=2,.ev=.{.button=.{.idx=1,.down=false}}}, +.{.t=44599100514,.pad=2,.ev=.{.button=.{.idx=1,.down=true}}}, +} } diff --git a/test/deck/lpad-swipe.zon b/test/deck/lpad-swipe.zon new file mode 100644 index 00000000..33a17751 --- /dev/null +++ b/test/deck/lpad-swipe.zon @@ -0,0 +1,163 @@ +.{ .version = 1, .events = .{ +.{.t=28555347100,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.29483032,.y=0.24435425,.pressure=0.0022583008}}}, +.{.t=28555355490,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2937622,.y=0.24847412,.pressure=0.0015563965}}}, +.{.t=28566662333,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2920227,.y=0.25350952,.pressure=0.00048828125}}}, +.{.t=28566669273,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.up,.x=0.28912354,.y=0.25863647,.pressure=0}}}, +.{.t=28633190705,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.down,.x=0.26437378,.y=0.44036865,.pressure=0.0008239746}}}, +.{.t=28644226129,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2635193,.y=0.44857788,.pressure=0.0008239746}}}, +.{.t=28644235079,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26348877,.y=0.4538269,.pressure=0.0015563965}}}, +.{.t=28644241049,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26272583,.y=0.45950317,.pressure=0.003692627}}}, +.{.t=28655363472,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26229858,.y=0.46218872,.pressure=0.0047912598}}}, +.{.t=28655373032,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26153564,.y=0.46594238,.pressure=0.005493164}}}, +.{.t=28666533886,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2607727,.y=0.46810913,.pressure=0.008026123}}}, +.{.t=28666541736,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26037598,.y=0.46969604,.pressure=0.00982666}}}, +.{.t=28666544986,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26004028,.y=0.47079468,.pressure=0.010894775}}}, +.{.t=28677510399,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25985718,.y=0.47192383,.pressure=0.011962891}}}, +.{.t=28677516759,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25924683,.y=0.47277832,.pressure=0.013061523}}}, +.{.t=28677520229,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25894165,.y=0.47366333,.pressure=0.01449585}}}, +.{.t=28688736483,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25906372,.y=0.47409058,.pressure=0.015197754}}}, +.{.t=28688747523,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25872803,.y=0.47351074,.pressure=0.013061523}}}, +.{.t=28688752063,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25827026,.y=0.4732666,.pressure=0.013397217}}}, +.{.t=28699780696,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2581787,.y=0.47317505,.pressure=0.014129639}}}, +.{.t=28699788576,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25759888,.y=0.47305298,.pressure=0.014831543}}}, +.{.t=28699792416,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25787354,.y=0.47280884,.pressure=0.01449585}}}, +.{.t=28711058720,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25784302,.y=0.47225952,.pressure=0.013763428}}}, +.{.t=28711073040,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25738525,.y=0.472229,.pressure=0.014129639}}}, +.{.t=28722312593,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25720215,.y=0.4717102,.pressure=0.013763428}}}, +.{.t=28722328533,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2572937,.y=0.47213745,.pressure=0.012329102}}}, +.{.t=28722335123,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2576294,.y=0.4721985,.pressure=0.01449585}}}, +.{.t=28733104547,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25784302,.y=0.4718933,.pressure=0.013763428}}}, +.{.t=28733113157,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2571411,.y=0.472229,.pressure=0.013763428}}}, +.{.t=28733116517,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.256958,.y=0.47235107,.pressure=0.010894775}}}, +.{.t=28744542840,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25598145,.y=0.47323608,.pressure=0.011962891}}}, +.{.t=28744554360,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25558472,.y=0.47372437,.pressure=0.012329102}}}, +.{.t=28744558310,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25463867,.y=0.47329712,.pressure=0.013061523}}}, +.{.t=28755164615,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2541809,.y=0.4736023,.pressure=0.013397217}}}, +.{.t=28755173055,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2536316,.y=0.47485352,.pressure=0.013397217}}}, +.{.t=28766369408,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2527771,.y=0.4749756,.pressure=0.011962891}}}, +.{.t=28766376998,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2524109,.y=0.47543335,.pressure=0.011962891}}}, +.{.t=28766380848,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2518921,.y=0.4761963,.pressure=0.011962891}}}, +.{.t=28777479342,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25073242,.y=0.4764099,.pressure=0.013397217}}}, +.{.t=28777487702,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24984741,.y=0.4772644,.pressure=0.015197754}}}, +.{.t=28777491542,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24942017,.y=0.47872925,.pressure=0.015563965}}}, +.{.t=28788858885,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24816895,.y=0.47982788,.pressure=0.016296387}}}, +.{.t=28788869705,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.247406,.y=0.48181152,.pressure=0.016998291}}}, +.{.t=28788873665,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24645996,.y=0.48260498,.pressure=0.015563965}}}, +.{.t=28800073548,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2456665,.y=0.48516846,.pressure=0.01663208}}}, +.{.t=28800082148,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24414062,.y=0.48757935,.pressure=0.018432617}}}, +.{.t=28800086718,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2437439,.y=0.48986816,.pressure=0.019165039}}}, +.{.t=28810881362,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2432251,.y=0.49273682,.pressure=0.017730713}}}, +.{.t=28810890602,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24337769,.y=0.4951172,.pressure=0.018432617}}}, +.{.t=28822223135,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24224854,.y=0.49868774,.pressure=0.018066406}}}, +.{.t=28822236725,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2409668,.y=0.5030823,.pressure=0.018432617}}}, +.{.t=28822243035,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24002075,.y=0.5093689,.pressure=0.017364502}}}, +.{.t=28833221849,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23800659,.y=0.52023315,.pressure=0.017364502}}}, +.{.t=28833234799,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23648071,.y=0.5312195,.pressure=0.018066406}}}, +.{.t=28833241859,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23449707,.y=0.54260254,.pressure=0.018432617}}}, +.{.t=28844533292,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23208618,.y=0.5539551,.pressure=0.019165039}}}, +.{.t=28844544902,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22930908,.y=0.5640869,.pressure=0.020599365}}}, +.{.t=28844549012,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22769165,.y=0.5701294,.pressure=0.022399902}}}, +.{.t=28855315576,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22613525,.y=0.57528687,.pressure=0.023468018}}}, +.{.t=28855325516,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22503662,.y=0.5812073,.pressure=0.02420044}}}, +.{.t=28866614540,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22335815,.y=0.5848694,.pressure=0.02420044}}}, +.{.t=28866626480,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22390747,.y=0.5887146,.pressure=0.024536133}}}, +.{.t=28866629910,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22283936,.y=0.59265137,.pressure=0.024536133}}}, +.{.t=28877415724,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22262573,.y=0.59625244,.pressure=0.025268555}}}, +.{.t=28877428004,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22128296,.y=0.6008606,.pressure=0.025268555}}}, +.{.t=28888551597,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2204895,.y=0.60409546,.pressure=0.025268555}}}, +.{.t=28888564767,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21896362,.y=0.61083984,.pressure=0.025634766}}}, +.{.t=28888571967,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21774292,.y=0.6156006,.pressure=0.025970459}}}, +.{.t=28899744701,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21542358,.y=0.62112427,.pressure=0.02633667}}}, +.{.t=28899757861,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21438599,.y=0.62576294,.pressure=0.027435303}}}, +.{.t=28899764601,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21298218,.y=0.63223267,.pressure=0.027069092}}}, +.{.t=28910731865,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21209717,.y=0.63708496,.pressure=0.02633667}}}, +.{.t=28910746485,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21133423,.y=0.6419983,.pressure=0.02670288}}}, +.{.t=28921990138,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21032715,.y=0.64730835,.pressure=0.027435303}}}, +.{.t=28922004158,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2090149,.y=0.65237427,.pressure=0.027069092}}}, +.{.t=28922010498,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20770264,.y=0.6588135,.pressure=0.02670288}}}, +.{.t=28932967412,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20559692,.y=0.6654968,.pressure=0.025970459}}}, +.{.t=28932979792,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20404053,.y=0.67285156,.pressure=0.025634766}}}, +.{.t=28932983492,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20187378,.y=0.6821594,.pressure=0.024536133}}}, +.{.t=28944345285,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19940186,.y=0.6911926,.pressure=0.02420044}}}, +.{.t=28944363135,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19662476,.y=0.703949,.pressure=0.022033691}}}, +.{.t=28944369185,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19250488,.y=0.71707153,.pressure=0.02130127}}}, +.{.t=28955070939,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.18859863,.y=0.7327881,.pressure=0.020599365}}}, +.{.t=28955080209,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.18469238,.y=0.7469177,.pressure=0.018798828}}}, +.{.t=28966644072,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.1803894,.y=0.76065063,.pressure=0.018066406}}}, +.{.t=28966660132,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17681885,.y=0.7729492,.pressure=0.019165039}}}, +.{.t=28966666102,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17303467,.y=0.78430176,.pressure=0.01953125}}}, +.{.t=28977523276,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17047119,.y=0.79385376,.pressure=0.019165039}}}, +.{.t=28977533506,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16790771,.y=0.8000183,.pressure=0.019866943}}}, +.{.t=28977538756,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16583252,.y=0.8055115,.pressure=0.018798828}}}, +.{.t=28988801809,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16448975,.y=0.8109131,.pressure=0.01953125}}}, +.{.t=28988815059,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16299438,.y=0.81552124,.pressure=0.02130127}}}, +.{.t=28988820159,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16275024,.y=0.8183899,.pressure=0.02166748}}}, +.{.t=29000005933,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16235352,.y=0.8191223,.pressure=0.022399902}}}, +.{.t=29000020133,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16220093,.y=0.820343,.pressure=0.023468018}}}, +.{.t=29000023943,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16268921,.y=0.8208618,.pressure=0.023834229}}}, +.{.t=29010879647,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.1618042,.y=0.82214355,.pressure=0.025634766}}}, +.{.t=29010893477,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16238403,.y=0.82196045,.pressure=0.02633667}}}, +.{.t=29022239700,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16329956,.y=0.82180786,.pressure=0.027069092}}}, +.{.t=29022255010,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16305542,.y=0.8227539,.pressure=0.027069092}}}, +.{.t=29022260530,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16360474,.y=0.8215027,.pressure=0.02670288}}}, +.{.t=29033423863,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16390991,.y=0.8215637,.pressure=0.02670288}}}, +.{.t=29033439393,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16513062,.y=0.820282,.pressure=0.02633667}}}, +.{.t=29033446553,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16571045,.y=0.82003784,.pressure=0.027069092}}}, +.{.t=29044100787,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16552734,.y=0.81985474,.pressure=0.024536133}}}, +.{.t=29044110747,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16653442,.y=0.8192444,.pressure=0.023468018}}}, +.{.t=29044114927,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16690063,.y=0.81710815,.pressure=0.023101807}}}, +.{.t=29055305531,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16772461,.y=0.81536865,.pressure=0.022766113}}}, +.{.t=29055315751,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16854858,.y=0.81365967,.pressure=0.022399902}}}, +.{.t=29066613054,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.16940308,.y=0.811615,.pressure=0.02166748}}}, +.{.t=29066629614,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17041016,.y=0.80908203,.pressure=0.02130127}}}, +.{.t=29066636804,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17147827,.y=0.8067322,.pressure=0.02130127}}}, +.{.t=29077513018,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17288208,.y=0.8036804,.pressure=0.019165039}}}, +.{.t=29077525768,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17391968,.y=0.8003235,.pressure=0.015197754}}}, +.{.t=29077531158,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17553711,.y=0.7965088,.pressure=0.014831543}}}, +.{.t=29088910511,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17697144,.y=0.7913208,.pressure=0.015563965}}}, +.{.t=29088924801,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17819214,.y=0.78622437,.pressure=0.01449585}}}, +.{.t=29088930391,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.17999268,.y=0.7813721,.pressure=0.013397217}}}, +.{.t=29100047575,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.18148804,.y=0.7752991,.pressure=0.014129639}}}, +.{.t=29100061535,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.1831665,.y=0.76898193,.pressure=0.014129639}}}, +.{.t=29100068045,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.184906,.y=0.7624817,.pressure=0.013763428}}}, +.{.t=29111067488,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.18692017,.y=0.7561035,.pressure=0.013061523}}}, +.{.t=29111083948,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.18884277,.y=0.7487488,.pressure=0.01449585}}}, +.{.t=29122288972,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19082642,.y=0.7409973,.pressure=0.01449585}}}, +.{.t=29122305542,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19223022,.y=0.73428345,.pressure=0.014831543}}}, +.{.t=29122313342,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19274902,.y=0.7257385,.pressure=0.014831543}}}, +.{.t=29133328146,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19299316,.y=0.714447,.pressure=0.015197754}}}, +.{.t=29133345356,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.1928711,.y=0.7018738,.pressure=0.01449585}}}, +.{.t=29133350306,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19335938,.y=0.6808777,.pressure=0.014831543}}}, +.{.t=29144200749,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19464111,.y=0.65582275,.pressure=0.014831543}}}, +.{.t=29144216579,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19668579,.y=0.63186646,.pressure=0.01449585}}}, +.{.t=29144223419,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.19927979,.y=0.6045227,.pressure=0.013763428}}}, +.{.t=29154998954,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20211792,.y=0.57891846,.pressure=0.0126953125}}}, +.{.t=29155006203,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20501709,.y=0.551239,.pressure=0.0126953125}}}, +.{.t=29166393667,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.20880127,.y=0.5248718,.pressure=0.012329102}}}, +.{.t=29166404147,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21270752,.y=0.499115,.pressure=0.013397217}}}, +.{.t=29166409197,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.21655273,.y=0.47366333,.pressure=0.013763428}}}, +.{.t=29177500380,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2204895,.y=0.45114136,.pressure=0.0101623535}}}, +.{.t=29177510970,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.22451782,.y=0.4290161,.pressure=0.0101623535}}}, +.{.t=29177516230,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2286377,.y=0.40975952,.pressure=0.0101623535}}}, +.{.t=29188832983,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23208618,.y=0.39212036,.pressure=0.010528564}}}, +.{.t=29188846483,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23532104,.y=0.375885,.pressure=0.007293701}}}, +.{.t=29188851103,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.23809814,.y=0.35943604,.pressure=0.009460449}}}, +.{.t=29200021967,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24072266,.y=0.34292603,.pressure=0.011260986}}}, +.{.t=29200037067,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24298096,.y=0.32809448,.pressure=0.011962891}}}, +.{.t=29200042877,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24493408,.y=0.3138733,.pressure=0.010528564}}}, +.{.t=29210884631,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24728394,.y=0.29989624,.pressure=0.012329102}}}, +.{.t=29221881625,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.24908447,.y=0.2866516,.pressure=0.011962891}}}, +.{.t=29221891355,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.250885,.y=0.2755432,.pressure=0.010528564}}}, +.{.t=29221896615,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.252594,.y=0.26571655,.pressure=0.011962891}}}, +.{.t=29233293918,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25378418,.y=0.2571106,.pressure=0.0126953125}}}, +.{.t=29233306418,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25476074,.y=0.24942017,.pressure=0.0126953125}}}, +.{.t=29233312238,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25534058,.y=0.24307251,.pressure=0.011260986}}}, +.{.t=29244359261,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25610352,.y=0.23760986,.pressure=0.0101623535}}}, +.{.t=29244375081,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25680542,.y=0.23291016,.pressure=0.0101623535}}}, +.{.t=29244383211,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25750732,.y=0.22824097,.pressure=0.0101623535}}}, +.{.t=29255381715,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25823975,.y=0.22570801,.pressure=0.007659912}}}, +.{.t=29255392615,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.25909424,.y=0.2234497,.pressure=0.007293701}}}, +.{.t=29266740458,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.2599182,.y=0.22180176,.pressure=0.006225586}}}, +.{.t=29266753748,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26089478,.y=0.22140503,.pressure=0.0051574707}}}, +.{.t=29266758978,.pad=2,.ev=.{.touch=.{.touchpad=0,.finger=0,.phase=.motion,.x=0.26275635,.y=0.22149658,.pressure=0.0033569336}}}, +} } diff --git a/test/deck/replay.zig b/test/deck/replay.zig new file mode 100644 index 00000000..90f46486 --- /dev/null +++ b/test/deck/replay.zig @@ -0,0 +1,116 @@ +//! Replays slices of real Steam Deck recordings (deckcap .zon captures) +//! through src/deck.zig and checks the aggregate actions, so the deck +//! control mapping is exercised without the device. + +const std = @import("std"); +const deck = @import("deck"); +const schema = @import("schema.zig"); + +const Tally = struct { + moves: u32 = 0, + dx: f32 = 0, + dy: f32 = 0, + max_step: f32 = 0, // largest single-motion |dx| or |dy| + click_down: [3]u32 = @splat(0), // indexed by deck.Click + click_up: [3]u32 = @splat(0), + wheel: i32 = 0, + keys: [4]u32 = @splat(0), // indexed by deck.Keytap + rumbles: u32 = 0, +}; + +fn replay(src: [:0]const u8) !Tally { + const gpa = std.testing.allocator; + const rec = try schema.parse(gpa, src); + defer schema.free(gpa, rec); + var d: deck.Deck = .{}; + var tally: Tally = .{}; + for (rec.events) |ev| { + const in: deck.Input = switch (ev.ev) { + .button => |b| .{ .button = .{ .idx = b.idx, .down = b.down } }, + .axis => |a| .{ .axis = .{ .idx = a.idx, .value = a.value } }, + .touch => |t| .{ .touch = .{ .pad = t.touchpad, .phase = switch (t.phase) { + .down => .down, + .motion => .motion, + .up => .up, + }, .x = t.x, .y = t.y } }, + else => continue, + }; + var acts: [2]deck.Action = undefined; + for (acts[0..d.feed(in, &acts)]) |act| switch (act) { + .move => |mv| { + tally.moves += 1; + tally.dx += mv.dx; + tally.dy += mv.dy; + tally.max_step = @max(tally.max_step, @max(@abs(mv.dx), @abs(mv.dy))); + }, + .click => |ck| if (ck.down) { + tally.click_down[@intFromEnum(ck.which)] += 1; + } else { + tally.click_up[@intFromEnum(ck.which)] += 1; + }, + .wheel => |ticks| tally.wheel += ticks, + .key => |k| tally.keys[@intFromEnum(k)] += 1, + .rumble => tally.rumbles += 1, + }; + } + return tally; +} + +test "right-pad drag moves the pointer, fresh touches don't jump" { + const t = try replay(@embedFile("rpad-drag.zon")); + // 4 strokes whose within-stroke finger travel sums to (-0.0209, -0.1853) + // in SDL pad coords; the pointer must move exactly that, scaled (and + // down-screen for the falling y, via PAD_Y_SIGN). The touch-to-touch + // gaps (~ +0.17 in x) must NOT leak in: a missing fresh-touch re-anchor + // would drag dx positive by ~0.17 * POINTER_SCALE. + try std.testing.expect(t.moves > 100); + try std.testing.expectApproxEqAbs(-0.020874 * deck.POINTER_SCALE, t.dx, 1.0); + try std.testing.expectApproxEqAbs(-0.185333 * deck.PAD_Y_SIGN * deck.POINTER_SCALE, t.dy, 1.0); + // and no single motion teleports the cursor + try std.testing.expect(t.max_step < 0.05 * deck.POINTER_SCALE); + try std.testing.expectEqual(0, t.wheel); + try std.testing.expectEqual(0, t.rumbles); +} + +test "trigger pull+release clicks exactly once each" { + const t = try replay(@embedFile("triggers.zon")); + // one R2 pull (select) and one L2 pull (execute), each an analog ramp + // through dozens of intermediate values, interleaved with ~500 stick + // axis events: hysteresis must yield exactly one click apiece, only + // the execute pull rumbles, and the sticks produce nothing + try std.testing.expectEqual(1, t.click_down[@intFromEnum(deck.Click.select)]); + try std.testing.expectEqual(1, t.click_up[@intFromEnum(deck.Click.select)]); + try std.testing.expectEqual(1, t.click_down[@intFromEnum(deck.Click.execute)]); + try std.testing.expectEqual(1, t.click_up[@intFromEnum(deck.Click.execute)]); + try std.testing.expectEqual(0, t.click_down[@intFromEnum(deck.Click.look)]); + try std.testing.expectEqual(1, t.rumbles); + try std.testing.expectEqual(0, t.moves); +} + +test "left-pad swipe scrolls" { + const t = try replay(@embedFile("lpad-swipe.zon")); + // one swipe: SDL y falls 0.2189 within the stroke -> floor(0.2189 * + // SCROLL_SCALE) = 5 wheel-down ticks. The slice opens with orphan + // motions and an orphan up from an earlier touch (mid-touch startup), + // which must be ignored — and the left pad must never move the pointer. + try std.testing.expectEqual(5, t.wheel); + try std.testing.expectEqual(0, t.moves); + try std.testing.expectEqual(0, t.rumbles); +} + +test "buttons: dpad n/N, A Enter, Y Tab, L1 look + rumble" { + const t = try replay(@embedFile("buttons.zon")); + // every button press of a real all-buttons sweep: dpad-down x1, + // dpad-up x3, A x2, Y x5, L1 x3; the other buttons map to nothing + try std.testing.expectEqual(1, t.keys[@intFromEnum(deck.Keytap.n)]); + try std.testing.expectEqual(3, t.keys[@intFromEnum(deck.Keytap.cap_n)]); + try std.testing.expectEqual(2, t.keys[@intFromEnum(deck.Keytap.enter)]); + try std.testing.expectEqual(5, t.keys[@intFromEnum(deck.Keytap.tab)]); + try std.testing.expectEqual(3, t.click_down[@intFromEnum(deck.Click.look)]); + try std.testing.expectEqual(3, t.click_up[@intFromEnum(deck.Click.look)]); + try std.testing.expectEqual(3, t.rumbles); + try std.testing.expectEqual(0, t.click_down[@intFromEnum(deck.Click.select)]); + try std.testing.expectEqual(0, t.click_down[@intFromEnum(deck.Click.execute)]); + try std.testing.expectEqual(0, t.moves); + try std.testing.expectEqual(0, t.wheel); +} diff --git a/test/deck/rpad-drag.zon b/test/deck/rpad-drag.zon new file mode 100644 index 00000000..20dea6ef --- /dev/null +++ b/test/deck/rpad-drag.zon @@ -0,0 +1,223 @@ +.{ .version = 1, .events = .{ +.{.t=1557743788,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.down,.x=0.48794556,.y=0.3156128,.pressure=0.0004272461}}}, +.{.t=1557747308,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.49105835,.y=0.31570435,.pressure=0.0015563965}}}, +.{.t=1568667061,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.49325562,.y=0.31576538,.pressure=0.004638672}}}, +.{.t=1568677161,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.49591064,.y=0.31585693,.pressure=0.0035095215}}}, +.{.t=1568682171,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.4988098,.y=0.31588745,.pressure=0.0026855469}}}, +.{.t=1579851545,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.50076294,.y=0.31607056,.pressure=0.004638672}}}, +.{.t=1579859265,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.50289917,.y=0.31637573,.pressure=0.0063171387}}}, +.{.t=1579863375,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5050354,.y=0.31655884,.pressure=0.008026123}}}, +.{.t=1590959349,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.50717163,.y=0.31655884,.pressure=0.0063171387}}}, +.{.t=1590970369,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.50927734,.y=0.31698608,.pressure=0.0040893555}}}, +.{.t=1590975739,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5108948,.y=0.31750488,.pressure=0.0038146973}}}, +.{.t=1601902982,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5126953,.y=0.31808472,.pressure=0.005218506}}}, +.{.t=1601911482,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.51400757,.y=0.318573,.pressure=0.0066223145}}}, +.{.t=1613345665,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.51571655,.y=0.31878662,.pressure=0.007171631}}}, +.{.t=1613352235,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.51660156,.y=0.31936646,.pressure=0.0068969727}}}, +.{.t=1613356725,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5178528,.y=0.3199463,.pressure=0.0066223145}}}, +.{.t=1624412039,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5187378,.y=0.3206787,.pressure=0.0057678223}}}, +.{.t=1624425589,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.52023315,.y=0.32138062,.pressure=0.0043640137}}}, +.{.t=1624432009,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5215454,.y=0.3218689,.pressure=0.0040893555}}}, +.{.t=1635289123,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5227356,.y=0.3222351,.pressure=0.0018310547}}}, +.{.t=1635297503,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.52371216,.y=0.3229065,.pressure=0.0026855469}}}, +.{.t=1635301553,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5246887,.y=0.3234558,.pressure=0.002105713}}}, +.{.t=1646425097,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.52545166,.y=0.323761,.pressure=0.0007019043}}}, +.{.t=1646433957,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.up,.x=0.5263977,.y=0.3241577,.pressure=0}}}, +.{.t=1657611170,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.down,.x=0.52749634,.y=0.32489014,.pressure=0.0004272461}}}, +.{.t=1657620700,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.up,.x=0.52893066,.y=0.32543945,.pressure=0}}}, +.{.t=2568455904,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.down,.x=0.71746826,.y=0.4960022,.pressure=0.0026855469}}}, +.{.t=2568464274,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.72143555,.y=0.49996948,.pressure=0.0032348633}}}, +.{.t=2568468384,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.72436523,.y=0.5033264,.pressure=0.004638672}}}, +.{.t=2579442397,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7271118,.y=0.5065918,.pressure=0.0066223145}}}, +.{.t=2579450697,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.73065186,.y=0.51031494,.pressure=0.008850098}}}, +.{.t=2579455357,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7350464,.y=0.5145569,.pressure=0.010253906}}}, +.{.t=2590631621,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.74017334,.y=0.51916504,.pressure=0.012512207}}}, +.{.t=2590639051,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7455139,.y=0.52420044,.pressure=0.014190674}}}, +.{.t=2601728264,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7537842,.y=0.5307617,.pressure=0.01727295}}}, +.{.t=2601737594,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.76501465,.y=0.5390625,.pressure=0.017852783}}}, +.{.t=2601745184,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7758789,.y=0.54782104,.pressure=0.017578125}}}, +.{.t=2612868798,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.78726196,.y=0.55740356,.pressure=0.018676758}}}, +.{.t=2612877548,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.79766846,.y=0.56655884,.pressure=0.016998291}}}, +.{.t=2612881858,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8077698,.y=0.57421875,.pressure=0.016174316}}}, +.{.t=2624096121,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.81689453,.y=0.5804138,.pressure=0.0184021}}}, +.{.t=2624103861,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8230896,.y=0.58462524,.pressure=0.017578125}}}, +.{.t=2624108371,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8291321,.y=0.58810425,.pressure=0.016448975}}}, +.{.t=2635100225,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8328247,.y=0.5901184,.pressure=0.015594482}}}, +.{.t=2635107345,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.835022,.y=0.59017944,.pressure=0.016174316}}}, +.{.t=2635111905,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.83724976,.y=0.5899353,.pressure=0.016174316}}}, +.{.t=2646151229,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8390808,.y=0.5890198,.pressure=0.014770508}}}, +.{.t=2646160149,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8404541,.y=0.58709717,.pressure=0.014190674}}}, +.{.t=2657358812,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8408203,.y=0.58535767,.pressure=0.016448975}}}, +.{.t=2657364952,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8411865,.y=0.5831604,.pressure=0.015045166}}}, +.{.t=2657368602,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.84106445,.y=0.5809021,.pressure=0.0184021}}}, +.{.t=2668497496,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.84155273,.y=0.5791321,.pressure=0.018676758}}}, +.{.t=2668503176,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.84198,.y=0.5767517,.pressure=0.0184021}}}, +.{.t=2679574619,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8413696,.y=0.5749817,.pressure=0.01727295}}}, +.{.t=2679583429,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8410034,.y=0.57302856,.pressure=0.015594482}}}, +.{.t=2679588959,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8402405,.y=0.57077026,.pressure=0.016998291}}}, +.{.t=2690585493,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.83987427,.y=0.5680237,.pressure=0.017578125}}}, +.{.t=2690591573,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8392639,.y=0.5658264,.pressure=0.016998291}}}, +.{.t=2701710277,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8384094,.y=0.56329346,.pressure=0.015045166}}}, +.{.t=2701715427,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8366089,.y=0.5602722,.pressure=0.012512207}}}, +.{.t=2701719287,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8343506,.y=0.55578613,.pressure=0.013641357}}}, +.{.t=2712932260,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8309326,.y=0.5510254,.pressure=0.012512207}}}, +.{.t=2712941600,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8270569,.y=0.54504395,.pressure=0.013641357}}}, +.{.t=2712946870,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.82263184,.y=0.53845215,.pressure=0.012786865}}}, +.{.t=2724074464,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8186035,.y=0.5309448,.pressure=0.012237549}}}, +.{.t=2724081034,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8176575,.y=0.5210266,.pressure=0.011383057}}}, +.{.t=2724085114,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8161926,.y=0.5109863,.pressure=0.010253906}}}, +.{.t=2735041467,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.81481934,.y=0.49887085,.pressure=0.008575439}}}, +.{.t=2735049697,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8135681,.y=0.48706055,.pressure=0.0066223145}}}, +.{.t=2735053437,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8110962,.y=0.47451782,.pressure=0.0066223145}}}, +.{.t=2746200461,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8079529,.y=0.46011353,.pressure=0.008300781}}}, +.{.t=2746207531,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8046875,.y=0.44818115,.pressure=0.008850098}}}, +.{.t=2757301144,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.8004761,.y=0.4363098,.pressure=0.010253906}}}, +.{.t=2757308574,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.796051,.y=0.4248352,.pressure=0.009979248}}}, +.{.t=2757312724,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.79104614,.y=0.4133911,.pressure=0.013366699}}}, +.{.t=2775948317,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.78637695,.y=0.4032898,.pressure=0.012237549}}}, +.{.t=2775958817,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.78131104,.y=0.39471436,.pressure=0.015045166}}}, +.{.t=2775962507,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7763977,.y=0.38796997,.pressure=0.016723633}}}, +.{.t=2775966007,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.77178955,.y=0.38198853,.pressure=0.018127441}}}, +.{.t=2775969667,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.76724243,.y=0.37753296,.pressure=0.019805908}}}, +.{.t=2779448262,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7628784,.y=0.37338257,.pressure=0.018127441}}}, +.{.t=2790559265,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.75909424,.y=0.36990356,.pressure=0.020935059}}}, +.{.t=2790566225,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.75512695,.y=0.36654663,.pressure=0.021484375}}}, +.{.t=2801688299,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7513733,.y=0.36395264,.pressure=0.020385742}}}, +.{.t=2801695099,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7475891,.y=0.36190796,.pressure=0.020385742}}}, +.{.t=2801697739,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.74487305,.y=0.35958862,.pressure=0.020385742}}}, +.{.t=2812906962,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.74191284,.y=0.3572998,.pressure=0.022888184}}}, +.{.t=2812918202,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7388611,.y=0.35458374,.pressure=0.022338867}}}, +.{.t=2812924662,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7357178,.y=0.35250854,.pressure=0.021209717}}}, +.{.t=2824054786,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7324829,.y=0.3503418,.pressure=0.021484375}}}, +.{.t=2824059786,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7289429,.y=0.3484497,.pressure=0.022888184}}}, +.{.t=2824063716,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.72506714,.y=0.34591675,.pressure=0.022613525}}}, +.{.t=2835063039,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7218323,.y=0.34277344,.pressure=0.02319336}}}, +.{.t=2835070099,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7174072,.y=0.34020996,.pressure=0.020080566}}}, +.{.t=2835075929,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.71273804,.y=0.33743286,.pressure=0.020080566}}}, +.{.t=2846116163,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7079773,.y=0.3343506,.pressure=0.018676758}}}, +.{.t=2846123943,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7023926,.y=0.33081055,.pressure=0.019805908}}}, +.{.t=2857453356,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6963806,.y=0.32598877,.pressure=0.019805908}}}, +.{.t=2857460036,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6892395,.y=0.32144165,.pressure=0.020935059}}}, +.{.t=2857466116,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6821289,.y=0.31661987,.pressure=0.018127441}}}, +.{.t=2868624580,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6739197,.y=0.31192017,.pressure=0.018676758}}}, +.{.t=2868632160,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6664429,.y=0.3072815,.pressure=0.018981934}}}, +.{.t=2868637550,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6587219,.y=0.30307007,.pressure=0.017578125}}}, +.{.t=2879637654,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.65133667,.y=0.29888916,.pressure=0.017852783}}}, +.{.t=2879646144,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6444702,.y=0.29452515,.pressure=0.017852783}}}, +.{.t=2879653574,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6372986,.y=0.29092407,.pressure=0.016174316}}}, +.{.t=2890493398,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6305542,.y=0.28729248,.pressure=0.016448975}}}, +.{.t=2890500368,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.62493896,.y=0.28427124,.pressure=0.016448975}}}, +.{.t=2901904031,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6192627,.y=0.28234863,.pressure=0.015594482}}}, +.{.t=2901913451,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.61428833,.y=0.27990723,.pressure=0.014190674}}}, +.{.t=2901920201,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6097412,.y=0.277771,.pressure=0.013641357}}}, +.{.t=2913077524,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6056824,.y=0.27627563,.pressure=0.013641357}}}, +.{.t=2913084054,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6019287,.y=0.27560425,.pressure=0.012512207}}}, +.{.t=2913088274,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5984192,.y=0.27441406,.pressure=0.011657715}}}, +.{.t=2924138128,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.59536743,.y=0.27404785,.pressure=0.011962891}}}, +.{.t=2924146018,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5923767,.y=0.27398682,.pressure=0.013641357}}}, +.{.t=2924151648,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5900574,.y=0.2736206,.pressure=0.013366699}}}, +.{.t=2935179332,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5883484,.y=0.27407837,.pressure=0.014465332}}}, +.{.t=2935187861,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5866394,.y=0.27478027,.pressure=0.01586914}}}, +.{.t=2935191171,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.58551025,.y=0.2756958,.pressure=0.015045166}}}, +.{.t=2946370475,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5841675,.y=0.27648926,.pressure=0.01727295}}}, +.{.t=2946379375,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5830078,.y=0.27764893,.pressure=0.0184021}}}, +.{.t=2957467849,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5821533,.y=0.278656,.pressure=0.01953125}}}, +.{.t=2957477449,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5817566,.y=0.28030396,.pressure=0.016998291}}}, +.{.t=2957483529,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.58148193,.y=0.28225708,.pressure=0.015319824}}}, +.{.t=2968627182,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5809021,.y=0.2843933,.pressure=0.01586914}}}, +.{.t=2968643772,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.580719,.y=0.28659058,.pressure=0.014190674}}}, +.{.t=2979684996,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5805969,.y=0.28967285,.pressure=0.013641357}}}, +.{.t=2979694336,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.58026123,.y=0.29241943,.pressure=0.010559082}}}, +.{.t=2979699086,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.57995605,.y=0.29571533,.pressure=0.008575439}}}, +.{.t=2990715289,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.57958984,.y=0.29934692,.pressure=0.010253906}}}, +.{.t=2990723719,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5793457,.y=0.30322266,.pressure=0.008300781}}}, +.{.t=3002153093,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5791931,.y=0.30700684,.pressure=0.0060424805}}}, +.{.t=3002161152,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5791931,.y=0.3117981,.pressure=0.0060424805}}}, +.{.t=3002165632,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.57958984,.y=0.3164673,.pressure=0.00491333}}}, +.{.t=3012982186,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5806885,.y=0.3215027,.pressure=0.0068969727}}}, +.{.t=3012991236,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5819702,.y=0.32669067,.pressure=0.0057678223}}}, +.{.t=3012998166,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5845032,.y=0.3322754,.pressure=0.007446289}}}, +.{.t=3024201460,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5869446,.y=0.33740234,.pressure=0.008026123}}}, +.{.t=3024208990,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.59017944,.y=0.34225464,.pressure=0.009155273}}}, +.{.t=3024211980,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.5932617,.y=0.34698486,.pressure=0.012237549}}}, +.{.t=3035025244,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.59643555,.y=0.3517456,.pressure=0.013366699}}}, +.{.t=3035031374,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6001282,.y=0.35601807,.pressure=0.016998291}}}, +.{.t=3035034874,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.60409546,.y=0.3600464,.pressure=0.019805908}}}, +.{.t=3046541367,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.60775757,.y=0.36398315,.pressure=0.022338867}}}, +.{.t=3046548887,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.61169434,.y=0.36740112,.pressure=0.022613525}}}, +.{.t=3057532891,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6154785,.y=0.37051392,.pressure=0.025146484}}}, +.{.t=3057540471,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6194763,.y=0.37329102,.pressure=0.025421143}}}, +.{.t=3057545781,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6232605,.y=0.3761902,.pressure=0.026000977}}}, +.{.t=3068735374,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.62753296,.y=0.3789673,.pressure=0.025421143}}}, +.{.t=3068748304,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6313782,.y=0.3816223,.pressure=0.024017334}}}, +.{.t=3068754594,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.63513184,.y=0.38391113,.pressure=0.023742676}}}, +.{.t=3079554878,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6390991,.y=0.38616943,.pressure=0.023468018}}}, +.{.t=3079563518,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6433716,.y=0.38833618,.pressure=0.02178955}}}, +.{.t=3079568338,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.64767456,.y=0.39031982,.pressure=0.02319336}}}, +.{.t=3090741042,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.65234375,.y=0.3919983,.pressure=0.02319336}}}, +.{.t=3090749882,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.65689087,.y=0.39379883,.pressure=0.021209717}}}, +.{.t=3101724975,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6610718,.y=0.39520264,.pressure=0.022888184}}}, +.{.t=3101732005,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.66574097,.y=0.39642334,.pressure=0.021484375}}}, +.{.t=3101735255,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6701355,.y=0.3973999,.pressure=0.019805908}}}, +.{.t=3113361458,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6748352,.y=0.39767456,.pressure=0.0206604}}}, +.{.t=3113368498,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.67944336,.y=0.39797974,.pressure=0.022613525}}}, +.{.t=3113372028,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6838379,.y=0.39785767,.pressure=0.022338867}}}, +.{.t=3123796833,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6879883,.y=0.3970642,.pressure=0.01953125}}}, +.{.t=3123803053,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.69177246,.y=0.39624023,.pressure=0.018127441}}}, +.{.t=3123806563,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.69555664,.y=0.39569092,.pressure=0.016998291}}}, +.{.t=3134998596,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.69888306,.y=0.3942871,.pressure=0.016998291}}}, +.{.t=3135007066,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7023926,.y=0.39257812,.pressure=0.017578125}}}, +.{.t=3135011336,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7060852,.y=0.39056396,.pressure=0.017578125}}}, +.{.t=3146195970,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7102051,.y=0.38861084,.pressure=0.015594482}}}, +.{.t=3146202620,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.715271,.y=0.386261,.pressure=0.014190674}}}, +.{.t=3157408853,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7234802,.y=0.38327026,.pressure=0.01586914}}}, +.{.t=3157418073,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.730896,.y=0.38006592,.pressure=0.01586914}}}, +.{.t=3157423313,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.73880005,.y=0.37652588,.pressure=0.016448975}}}, +.{.t=3168334437,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.74557495,.y=0.37350464,.pressure=0.017578125}}}, +.{.t=3168341357,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.75097656,.y=0.37020874,.pressure=0.016723633}}}, +.{.t=3168344697,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7561035,.y=0.36791992,.pressure=0.013916016}}}, +.{.t=3179518520,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.75982666,.y=0.36517334,.pressure=0.013061523}}}, +.{.t=3179524910,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7633362,.y=0.3623352,.pressure=0.013061523}}}, +.{.t=3179530860,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.765625,.y=0.35949707,.pressure=0.013641357}}}, +.{.t=3190702424,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7669678,.y=0.3564453,.pressure=0.012786865}}}, +.{.t=3190710904,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.76849365,.y=0.3536682,.pressure=0.011383057}}}, +.{.t=3201886237,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7687378,.y=0.35095215,.pressure=0.010559082}}}, +.{.t=3201895897,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7681885,.y=0.34838867,.pressure=0.009155273}}}, +.{.t=3201900097,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7668457,.y=0.34570312,.pressure=0.009155273}}}, +.{.t=3212919591,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7654724,.y=0.34277344,.pressure=0.008850098}}}, +.{.t=3212927311,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7631836,.y=0.34002686,.pressure=0.0066223145}}}, +.{.t=3212932591,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7612915,.y=0.3373413,.pressure=0.0040893555}}}, +.{.t=3224127654,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7590027,.y=0.33529663,.pressure=0.0043640137}}}, +.{.t=3224134564,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7567444,.y=0.33319092,.pressure=0.0024108887}}}, +.{.t=3224138834,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7541809,.y=0.3307495,.pressure=0.00491333}}}, +.{.t=3234961798,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.75216675,.y=0.32843018,.pressure=0.0038146973}}}, +.{.t=3234967628,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7489929,.y=0.32583618,.pressure=0.0038146973}}}, +.{.t=3234971398,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7467346,.y=0.32296753,.pressure=0.005218506}}}, +.{.t=3246367272,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7436218,.y=0.32019043,.pressure=0.0043640137}}}, +.{.t=3246376701,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7402649,.y=0.3173523,.pressure=0.0038146973}}}, +.{.t=3257870675,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.73721313,.y=0.31466675,.pressure=0.0018310547}}}, +.{.t=3257881104,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7336731,.y=0.31219482,.pressure=0.0024108887}}}, +.{.t=3257886264,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.73062134,.y=0.3100891,.pressure=0.0015563965}}}, +.{.t=3268291019,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.72720337,.y=0.30807495,.pressure=0.0007019043}}}, +.{.t=3268298969,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7241516,.y=0.30593872,.pressure=0.0015563965}}}, +.{.t=3268303569,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7213135,.y=0.30371094,.pressure=0.0035095215}}}, +.{.t=3279746522,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.71810913,.y=0.302063,.pressure=0.002960205}}}, +.{.t=3279757542,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.7147217,.y=0.30056763,.pressure=0.00491333}}}, +.{.t=3279762862,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.71087646,.y=0.29907227,.pressure=0.00491333}}}, +.{.t=3290574016,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.70751953,.y=0.29745483,.pressure=0.0040893555}}}, +.{.t=3290581596,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.70376587,.y=0.29592896,.pressure=0.0040893555}}}, +.{.t=3301750300,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6994934,.y=0.2951355,.pressure=0.0038146973}}}, +.{.t=3301760370,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6951904,.y=0.29397583,.pressure=0.005218506}}}, +.{.t=3301767410,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6905823,.y=0.29284668,.pressure=0.00491333}}}, +.{.t=3312951293,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.685791,.y=0.29266357,.pressure=0.0068969727}}}, +.{.t=3312959893,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.68136597,.y=0.29257202,.pressure=0.005493164}}}, +.{.t=3312965373,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6772461,.y=0.29229736,.pressure=0.0068969727}}}, +.{.t=3324079267,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.672699,.y=0.29318237,.pressure=0.004638672}}}, +.{.t=3324090337,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.66882324,.y=0.294281,.pressure=0.004638672}}}, +.{.t=3324095997,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.66537476,.y=0.29525757,.pressure=0.004638672}}}, +.{.t=3335061800,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6620178,.y=0.2966919,.pressure=0.002960205}}}, +.{.t=3335068160,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6590576,.y=0.29788208,.pressure=0.0007019043}}}, +.{.t=3335073750,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.up,.x=0.6562805,.y=0.29956055,.pressure=0}}}, +.{.t=3390587188,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.down,.x=0.6447449,.y=0.33596802,.pressure=0.0007019043}}}, +.{.t=3390593138,.pad=2,.ev=.{.touch=.{.touchpad=1,.finger=0,.phase=.motion,.x=0.6447754,.y=0.3406067,.pressure=0.0035095215}}}, +} } diff --git a/test/deck/schema.zig b/test/deck/schema.zig new file mode 100644 index 00000000..782c829a --- /dev/null +++ b/test/deck/schema.zig @@ -0,0 +1,70 @@ +//! deckcap's capture format (schema.zig v1), trimmed to the types + parse +//! the replay test needs. The .zon slices beside this file are windows cut +//! from real Steam Deck recordings made with deckcap. + +const std = @import("std"); + +pub const Recording = struct { + version: u32 = 1, + events: []const Event = &.{}, +}; + +pub const Event = struct { + /// Nanoseconds since SDL init (SDL_Event.common.timestamp). + t: u64, + /// SDL joystick instance id the event came from. + pad: u32, + ev: Payload, + + pub const Payload = union(enum) { + added: Added, + removed: void, + button: Button, + axis: Axis, + gyro: Imu, + accel: Imu, + touch: Touch, + }; + + pub const Added = struct { + name: []const u8, + vendor: u16, + product: u16, + gyro_hz: f32, + accel_hz: f32, + touchpads: u8, + }; + pub const Button = struct { + /// SDL_GamepadButton index. + idx: u8, + down: bool, + }; + pub const Axis = struct { + /// SDL_GamepadAxis index (sticks + triggers). + idx: u8, + value: i16, + }; + pub const Imu = struct { + x: f32, + y: f32, + z: f32, + st: u64, + }; + pub const Touch = struct { + touchpad: u8, + finger: u8, + phase: enum { down, motion, up }, + /// Normalized 0..1. + x: f32, + y: f32, + pressure: f32, + }; +}; + +pub fn parse(gpa: std.mem.Allocator, src: [:0]const u8) error{ OutOfMemory, ParseZon }!Recording { + return std.zon.parse.fromSliceAlloc(Recording, gpa, src, null, .{}); +} + +pub fn free(gpa: std.mem.Allocator, rec: Recording) void { + std.zon.parse.free(gpa, rec); +} diff --git a/test/deck/triggers.zon b/test/deck/triggers.zon new file mode 100644 index 00000000..ad5f7656 --- /dev/null +++ b/test/deck/triggers.zon @@ -0,0 +1,576 @@ +.{ .version = 1, .events = .{ +.{.t=3100837937,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3100845387,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3100845387,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1441}}}, +.{.t=3100845387,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3100849157,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3100849157,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1411}}}, +.{.t=3100849157,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3111923010,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3111923010,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1529}}}, +.{.t=3111923010,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3111936310,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3111936310,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1323}}}, +.{.t=3111941850,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1558}}}, +.{.t=3111941850,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3123013224,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3123013224,.pad=2,.ev=.{.axis=.{.idx=1,.value=-1294}}}, +.{.t=3123013224,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3123021794,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3123021794,.pad=2,.ev=.{.axis=.{.idx=1,.value=-941}}}, +.{.t=3123021794,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3134267607,.pad=2,.ev=.{.axis=.{.idx=5,.value=0}}}, +.{.t=3134267607,.pad=2,.ev=.{.axis=.{.idx=5,.value=214}}}, +.{.t=3134267607,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3134267607,.pad=2,.ev=.{.axis=.{.idx=1,.value=-647}}}, +.{.t=3134277137,.pad=2,.ev=.{.axis=.{.idx=5,.value=2674}}}, +.{.t=3134277137,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3134277137,.pad=2,.ev=.{.axis=.{.idx=1,.value=-500}}}, +.{.t=3134280727,.pad=2,.ev=.{.axis=.{.idx=5,.value=5436}}}, +.{.t=3134280727,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3134280727,.pad=2,.ev=.{.axis=.{.idx=1,.value=-206}}}, +.{.t=3134280727,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3146260210,.pad=2,.ev=.{.axis=.{.idx=5,.value=8198}}}, +.{.t=3146260210,.pad=2,.ev=.{.axis=.{.idx=0,.value=-774}}}, +.{.t=3146260210,.pad=2,.ev=.{.axis=.{.idx=1,.value=-176}}}, +.{.t=3146260210,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3146270520,.pad=2,.ev=.{.axis=.{.idx=5,.value=11211}}}, +.{.t=3146270520,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3146270520,.pad=2,.ev=.{.axis=.{.idx=1,.value=-29}}}, +.{.t=3146274870,.pad=2,.ev=.{.axis=.{.idx=5,.value=13671}}}, +.{.t=3146274870,.pad=2,.ev=.{.axis=.{.idx=1,.value=86}}}, +.{.t=3146274870,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3156416215,.pad=2,.ev=.{.axis=.{.idx=5,.value=16432}}}, +.{.t=3156416215,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3156416215,.pad=2,.ev=.{.axis=.{.idx=1,.value=288}}}, +.{.t=3156416215,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3156435465,.pad=2,.ev=.{.axis=.{.idx=5,.value=18893}}}, +.{.t=3156435465,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3156435465,.pad=2,.ev=.{.axis=.{.idx=1,.value=462}}}, +.{.t=3156441825,.pad=2,.ev=.{.axis=.{.idx=5,.value=21504}}}, +.{.t=3156441825,.pad=2,.ev=.{.axis=.{.idx=1,.value=491}}}, +.{.t=3156441825,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3167440508,.pad=2,.ev=.{.axis=.{.idx=5,.value=23915}}}, +.{.t=3167440508,.pad=2,.ev=.{.axis=.{.idx=1,.value=664}}}, +.{.t=3167440508,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3167449678,.pad=2,.ev=.{.axis=.{.idx=5,.value=26224}}}, +.{.t=3167449678,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3167449678,.pad=2,.ev=.{.axis=.{.idx=1,.value=779}}}, +.{.t=3167449678,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3178634312,.pad=2,.ev=.{.axis=.{.idx=5,.value=28384}}}, +.{.t=3178634312,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3178634312,.pad=2,.ev=.{.axis=.{.idx=1,.value=837}}}, +.{.t=3178634312,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3178646332,.pad=2,.ev=.{.axis=.{.idx=5,.value=30593}}}, +.{.t=3178646332,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3178646332,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3178651472,.pad=2,.ev=.{.axis=.{.idx=5,.value=32702}}}, +.{.t=3178651472,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3189737565,.pad=2,.ev=.{.axis=.{.idx=5,.value=32766}}}, +.{.t=3189737565,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=3189737565,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3189748175,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3189751215,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=3189751215,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3200899959,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3200909349,.pad=2,.ev=.{.axis=.{.idx=0,.value=-774}}}, +.{.t=3200909349,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=3200914229,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3200914229,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=3200914229,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3212027402,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3212027402,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3212027402,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3212033902,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3222960156,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=3222960156,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3222967916,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3222967916,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=3222967916,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=3234186130,.pad=2,.ev=.{.axis=.{.idx=0,.value=-857}}}, +.{.t=3234186130,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=3234186130,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3234194710,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3234194710,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=3234194710,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3234198480,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3234198480,.pad=2,.ev=.{.axis=.{.idx=1,.value=1097}}}, +.{.t=3245272663,.pad=2,.ev=.{.axis=.{.idx=1,.value=1126}}}, +.{.t=3245272663,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3245280873,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3245280873,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3245284263,.pad=2,.ev=.{.axis=.{.idx=1,.value=1097}}}, +.{.t=3245284263,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3256351647,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3256351647,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3256361897,.pad=2,.ev=.{.axis=.{.idx=1,.value=1126}}}, +.{.t=3256361897,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3256366557,.pad=2,.ev=.{.axis=.{.idx=0,.value=-857}}}, +.{.t=3267453910,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3267461450,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3267461450,.pad=2,.ev=.{.axis=.{.idx=1,.value=1097}}}, +.{.t=3267461450,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3278671394,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3278679494,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3278679494,.pad=2,.ev=.{.axis=.{.idx=1,.value=1126}}}, +.{.t=3278679494,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3278684284,.pad=2,.ev=.{.axis=.{.idx=1,.value=1097}}}, +.{.t=3289747017,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3289757957,.pad=2,.ev=.{.axis=.{.idx=0,.value=-774}}}, +.{.t=3289757957,.pad=2,.ev=.{.axis=.{.idx=1,.value=1068}}}, +.{.t=3289757957,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3289764977,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3289764977,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3300894251,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3300894251,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3300904161,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3300904161,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3300908771,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3312130554,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3312130554,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3312130554,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3312142164,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3312145624,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3312145624,.pad=2,.ev=.{.axis=.{.idx=1,.value=1068}}}, +.{.t=3312145624,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3323185928,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3323185928,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3323197438,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3334415941,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3334415941,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3334428191,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3334428191,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3334433441,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3345319335,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3345319335,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3345329665,.pad=2,.ev=.{.axis=.{.idx=0,.value=-774}}}, +.{.t=3345329665,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3345329665,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3345334835,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3356434069,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3356434069,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3356434069,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3356449919,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3356449919,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3356449919,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3367716072,.pad=2,.ev=.{.axis=.{.idx=0,.value=-857}}}, +.{.t=3367716072,.pad=2,.ev=.{.axis=.{.idx=1,.value=1068}}}, +.{.t=3367728332,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3367728332,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3367728332,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3367733692,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3367733692,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3367733692,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3378615526,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3389836929,.pad=2,.ev=.{.axis=.{.idx=0,.value=-774}}}, +.{.t=3389836929,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=3389836929,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3389847129,.pad=2,.ev=.{.axis=.{.idx=5,.value=31648}}}, +.{.t=3389847129,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3389847129,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3389852719,.pad=2,.ev=.{.axis=.{.idx=5,.value=29137}}}, +.{.t=3389852719,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3401186593,.pad=2,.ev=.{.axis=.{.idx=5,.value=26074}}}, +.{.t=3401186593,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3401194003,.pad=2,.ev=.{.axis=.{.idx=5,.value=23262}}}, +.{.t=3401194003,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3401194003,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=3401194003,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=3401198713,.pad=2,.ev=.{.axis=.{.idx=5,.value=20349}}}, +.{.t=3401198713,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3411932407,.pad=2,.ev=.{.axis=.{.idx=5,.value=17587}}}, +.{.t=3411932407,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3411932407,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=3411941077,.pad=2,.ev=.{.axis=.{.idx=5,.value=15127}}}, +.{.t=3411941077,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3411941077,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3411944947,.pad=2,.ev=.{.axis=.{.idx=5,.value=12617}}}, +.{.t=3411944947,.pad=2,.ev=.{.axis=.{.idx=0,.value=-829}}}, +.{.t=3411944947,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=3411944947,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3423178470,.pad=2,.ev=.{.axis=.{.idx=5,.value=10307}}}, +.{.t=3423178470,.pad=2,.ev=.{.axis=.{.idx=0,.value=-802}}}, +.{.t=3423178470,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=3423187080,.pad=2,.ev=.{.axis=.{.idx=5,.value=8298}}}, +.{.t=3423187080,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=3423187080,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3434307174,.pad=2,.ev=.{.axis=.{.idx=5,.value=6340}}}, +.{.t=3434307174,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=3434315334,.pad=2,.ev=.{.axis=.{.idx=5,.value=4532}}}, +.{.t=3434315334,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3434318744,.pad=2,.ev=.{.axis=.{.idx=5,.value=2975}}}, +.{.t=3434318744,.pad=2,.ev=.{.axis=.{.idx=1,.value=866}}}, +.{.t=3445336427,.pad=2,.ev=.{.axis=.{.idx=5,.value=1067}}}, +.{.t=3445336427,.pad=2,.ev=.{.axis=.{.idx=1,.value=635}}}, +.{.t=3445344507,.pad=2,.ev=.{.axis=.{.idx=4,.value=446}}}, +.{.t=3445344507,.pad=2,.ev=.{.axis=.{.idx=5,.value=0}}}, +.{.t=3445344507,.pad=2,.ev=.{.axis=.{.idx=1,.value=346}}}, +.{.t=3445344507,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=3445348567,.pad=2,.ev=.{.axis=.{.idx=4,.value=1854}}}, +.{.t=3445348567,.pad=2,.ev=.{.axis=.{.idx=1,.value=-59}}}, +.{.t=3456475621,.pad=2,.ev=.{.axis=.{.idx=4,.value=3310}}}, +.{.t=3456475621,.pad=2,.ev=.{.axis=.{.idx=1,.value=-176}}}, +.{.t=3456475621,.pad=2,.ev=.{.axis=.{.idx=3,.value=997}}}, +.{.t=3456483971,.pad=2,.ev=.{.axis=.{.idx=4,.value=4436}}}, +.{.t=3456483971,.pad=2,.ev=.{.axis=.{.idx=1,.value=-441}}}, +.{.t=3456487161,.pad=2,.ev=.{.axis=.{.idx=4,.value=5891}}}, +.{.t=3456487161,.pad=2,.ev=.{.axis=.{.idx=1,.value=-558}}}, +.{.t=22900269279,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=22900269279,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=22900269279,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=22900282319,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22900282319,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=22900282319,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22900282319,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22900288339,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=22900288339,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=22900288339,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=22911078513,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22911078513,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=22911078513,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22911090183,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=22922174447,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22922174447,.pad=2,.ev=.{.axis=.{.idx=2,.value=-527}}}, +.{.t=22922174447,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=22922182927,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=22922182927,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=22922182927,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=22922182927,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22922186907,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22933453380,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22933463530,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22933463530,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=22933463530,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=22933463530,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=22933469520,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=22933469520,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22933469520,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22944601464,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=22944601464,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=22944613874,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22944613874,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22944613874,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22944619754,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22955633677,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=22955633677,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=22955633677,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=22955633677,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=22955647207,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22955647207,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=22955647207,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=22955647207,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=22955652047,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22955652047,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22966619841,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22966619841,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22966628121,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=22966628121,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=22977745245,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22977745245,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=22977745245,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=22977745245,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=22977753905,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22977753905,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22977753905,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=22977757525,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=22988922908,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22988922908,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=22988936008,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=22988936008,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=22988940638,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=22988940638,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23000140672,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23000140672,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=23000152872,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23000152872,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23000152872,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23000152872,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23000158442,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23000158442,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23000158442,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23011247285,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23011247285,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23011247285,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23011260265,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23011260265,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23011260265,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23022366569,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23022366569,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23022366569,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=23022366569,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=23022380099,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23022380099,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23022385329,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23022385329,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23033207513,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23033207513,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23033215483,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23033215483,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23033215483,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23033215483,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23033219653,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23044563226,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23044563226,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23044563226,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23044572856,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23044572856,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23044576806,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23044576806,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23044576806,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23055818709,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23055818709,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23055828779,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23055828779,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23055828779,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23055832789,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1410}}}, +.{.t=23055832789,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23066680603,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23066680603,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23066680603,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23066690143,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23066690143,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23066690143,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23066690143,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23077703397,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23077703397,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23077703397,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23077711687,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23077711687,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23077711687,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23077715567,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23077715567,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23077715567,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23077715567,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23088844720,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23088844720,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23088844720,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=23088844720,.pad=2,.ev=.{.axis=.{.idx=3,.value=1148}}}, +.{.t=23088853270,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23088853270,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23088853270,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23088856830,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23088856830,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23088856830,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23100184994,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23100184994,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23100184994,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23100197834,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23100202044,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23100202044,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23100202044,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23111316337,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23111328087,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23111328087,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23122579831,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23122579831,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=23122579831,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23122592031,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23122592031,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23122595681,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23122595681,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23122595681,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23133201565,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23133205635,.pad=2,.ev=.{.axis=.{.idx=4,.value=728}}}, +.{.t=23133205635,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23133205635,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23144628108,.pad=2,.ev=.{.axis=.{.idx=4,.value=3169}}}, +.{.t=23144628108,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23144628108,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23144628108,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23144628108,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23144640728,.pad=2,.ev=.{.axis=.{.idx=4,.value=6314}}}, +.{.t=23144640728,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23144640728,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23144640728,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23144644338,.pad=2,.ev=.{.axis=.{.idx=4,.value=10679}}}, +.{.t=23144644338,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23144644338,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23144644338,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23155757852,.pad=2,.ev=.{.axis=.{.idx=4,.value=16500}}}, +.{.t=23155757852,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23155757852,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23155767512,.pad=2,.ev=.{.axis=.{.idx=4,.value=23682}}}, +.{.t=23155767512,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23155767512,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23155773302,.pad=2,.ev=.{.axis=.{.idx=4,.value=32084}}}, +.{.t=23155773302,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23166856095,.pad=2,.ev=.{.axis=.{.idx=4,.value=32766}}}, +.{.t=23166856095,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23166856095,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23166869315,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23166869315,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23177937079,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23177937079,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23177947099,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23177947099,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23177950979,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23177950979,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23177950979,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23188909763,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23188909763,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23188919373,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23188919373,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23188923533,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23188923533,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23188923533,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23188923533,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23200341706,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23200341706,.pad=2,.ev=.{.axis=.{.idx=1,.value=924}}}, +.{.t=23200341706,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23200357446,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23200360546,.pad=2,.ev=.{.axis=.{.idx=1,.value=866}}}, +.{.t=23200360546,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23211356329,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1493}}}, +.{.t=23211356329,.pad=2,.ev=.{.axis=.{.idx=1,.value=895}}}, +.{.t=23211356329,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23211369469,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23211369469,.pad=2,.ev=.{.axis=.{.idx=1,.value=808}}}, +.{.t=23211369469,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23211369469,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23222496653,.pad=2,.ev=.{.axis=.{.idx=1,.value=722}}}, +.{.t=23222496653,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23222496653,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23222508723,.pad=2,.ev=.{.axis=.{.idx=1,.value=664}}}, +.{.t=23222508723,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23222508723,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23222512923,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23222512923,.pad=2,.ev=.{.axis=.{.idx=1,.value=693}}}, +.{.t=23222512923,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23233616896,.pad=2,.ev=.{.axis=.{.idx=1,.value=404}}}, +.{.t=23233616896,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23233628876,.pad=2,.ev=.{.axis=.{.idx=1,.value=462}}}, +.{.t=23233628876,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23233628876,.pad=2,.ev=.{.axis=.{.idx=3,.value=1118}}}, +.{.t=23233634716,.pad=2,.ev=.{.axis=.{.idx=1,.value=375}}}, +.{.t=23233634716,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23244703810,.pad=2,.ev=.{.axis=.{.idx=1,.value=404}}}, +.{.t=23244703810,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23244703810,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23244716710,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23244716710,.pad=2,.ev=.{.axis=.{.idx=1,.value=288}}}, +.{.t=23244716710,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23244722470,.pad=2,.ev=.{.axis=.{.idx=1,.value=317}}}, +.{.t=23255891634,.pad=2,.ev=.{.axis=.{.idx=1,.value=260}}}, +.{.t=23255891634,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23255903964,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1410}}}, +.{.t=23255903964,.pad=2,.ev=.{.axis=.{.idx=1,.value=144}}}, +.{.t=23255903964,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23255909564,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23255909564,.pad=2,.ev=.{.axis=.{.idx=1,.value=115}}}, +.{.t=23266911057,.pad=2,.ev=.{.axis=.{.idx=4,.value=30723}}}, +.{.t=23266911057,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23266911057,.pad=2,.ev=.{.axis=.{.idx=1,.value=86}}}, +.{.t=23266924047,.pad=2,.ev=.{.axis=.{.idx=4,.value=27437}}}, +.{.t=23266924047,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23266924047,.pad=2,.ev=.{.axis=.{.idx=1,.value=115}}}, +.{.t=23266924047,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23278235081,.pad=2,.ev=.{.axis=.{.idx=4,.value=24292}}}, +.{.t=23278235081,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23278235081,.pad=2,.ev=.{.axis=.{.idx=1,.value=29}}}, +.{.t=23278246901,.pad=2,.ev=.{.axis=.{.idx=4,.value=21053}}}, +.{.t=23278246901,.pad=2,.ev=.{.axis=.{.idx=1,.value=57}}}, +.{.t=23278246901,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23278246901,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23278254110,.pad=2,.ev=.{.axis=.{.idx=4,.value=17814}}}, +.{.t=23278254110,.pad=2,.ev=.{.axis=.{.idx=1,.value=86}}}, +.{.t=23278254110,.pad=2,.ev=.{.axis=.{.idx=2,.value=-498}}}, +.{.t=23278254110,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23289217094,.pad=2,.ev=.{.axis=.{.idx=4,.value=14341}}}, +.{.t=23289217094,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1465}}}, +.{.t=23289217094,.pad=2,.ev=.{.axis=.{.idx=1,.value=144}}}, +.{.t=23289217094,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23289217094,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23289231434,.pad=2,.ev=.{.axis=.{.idx=4,.value=11384}}}, +.{.t=23289231434,.pad=2,.ev=.{.axis=.{.idx=1,.value=57}}}, +.{.t=23289236534,.pad=2,.ev=.{.axis=.{.idx=4,.value=8708}}}, +.{.t=23289236534,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1438}}}, +.{.t=23289236534,.pad=2,.ev=.{.axis=.{.idx=1,.value=0}}}, +.{.t=23300340478,.pad=2,.ev=.{.axis=.{.idx=4,.value=6126}}}, +.{.t=23300340478,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23300350538,.pad=2,.ev=.{.axis=.{.idx=4,.value=4014}}}, +.{.t=23300350538,.pad=2,.ev=.{.axis=.{.idx=1,.value=86}}}, +.{.t=23300354158,.pad=2,.ev=.{.axis=.{.idx=4,.value=2465}}}, +.{.t=23300354158,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1410}}}, +.{.t=23300354158,.pad=2,.ev=.{.axis=.{.idx=1,.value=288}}}, +.{.t=23311366832,.pad=2,.ev=.{.axis=.{.idx=4,.value=634}}}, +.{.t=23311366832,.pad=2,.ev=.{.axis=.{.idx=1,.value=462}}}, +.{.t=23311366832,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23311379542,.pad=2,.ev=.{.axis=.{.idx=4,.value=0}}}, +.{.t=23311379542,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1355}}}, +.{.t=23311379542,.pad=2,.ev=.{.axis=.{.idx=1,.value=779}}}, +.{.t=23311379542,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23322638775,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1272}}}, +.{.t=23322638775,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23322638775,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23322649765,.pad=2,.ev=.{.axis=.{.idx=0,.value=-1051}}}, +.{.t=23322649765,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23322649765,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23322654995,.pad=2,.ev=.{.axis=.{.idx=0,.value=-885}}}, +.{.t=23322654995,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23333351109,.pad=2,.ev=.{.axis=.{.idx=0,.value=-691}}}, +.{.t=23333351109,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23333359049,.pad=2,.ev=.{.axis=.{.idx=0,.value=-553}}}, +.{.t=23333359049,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23333362519,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23333362519,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23333362519,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23344695372,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23344706662,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23344706662,.pad=2,.ev=.{.axis=.{.idx=1,.value=953}}}, +.{.t=23344711982,.pad=2,.ev=.{.axis=.{.idx=0,.value=-553}}}, +.{.t=23344711982,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23355868326,.pad=2,.ev=.{.axis=.{.idx=0,.value=-498}}}, +.{.t=23355868326,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23355878956,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23355878956,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23355878956,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23355878956,.pad=2,.ev=.{.axis=.{.idx=3,.value=1087}}}, +.{.t=23355884866,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23355884866,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23355884866,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23366942749,.pad=2,.ev=.{.axis=.{.idx=0,.value=-553}}}, +.{.t=23366952219,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23366952219,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23366952219,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23366952219,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23378047613,.pad=2,.ev=.{.axis=.{.idx=0,.value=-553}}}, +.{.t=23378047613,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23378064723,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23378064723,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23378064723,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23388957907,.pad=2,.ev=.{.axis=.{.idx=0,.value=-553}}}, +.{.t=23388957907,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23388957907,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23388957907,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23388967217,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23388967217,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23388970117,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23388970117,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23388970117,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23388970117,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23400316180,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23400325960,.pad=2,.ev=.{.axis=.{.idx=0,.value=-580}}}, +.{.t=23400325960,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23400325960,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23400330510,.pad=2,.ev=.{.axis=.{.idx=0,.value=-525}}}, +.{.t=23400330510,.pad=2,.ev=.{.axis=.{.idx=1,.value=981}}}, +.{.t=23400330510,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23411327274,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23411337364,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23411337364,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23422593127,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23422593127,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23422603997,.pad=2,.ev=.{.axis=.{.idx=2,.value=-410}}}, +.{.t=23422603997,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23422607677,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23422607677,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23433465571,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23433465571,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +.{.t=23433473571,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23433473571,.pad=2,.ev=.{.axis=.{.idx=2,.value=-469}}}, +.{.t=23433473571,.pad=2,.ev=.{.axis=.{.idx=3,.value=1057}}}, +.{.t=23444613485,.pad=2,.ev=.{.axis=.{.idx=1,.value=1039}}}, +.{.t=23444623255,.pad=2,.ev=.{.axis=.{.idx=2,.value=-439}}}, +.{.t=23444626645,.pad=2,.ev=.{.axis=.{.idx=1,.value=1010}}}, +.{.t=23444626645,.pad=2,.ev=.{.axis=.{.idx=3,.value=1027}}}, +} } diff --git a/test/hxdiff.zig b/test/hxdiff.zig index 62638e23..2170961e 100644 --- a/test/hxdiff.zig +++ b/test/hxdiff.zig @@ -30,9 +30,7 @@ // text always ends in one, so this restores byte-for-byte comparability. // Keys are helix notation: printables verbatim, // -// . The clipboard round-trips through a fake: -// set_clipboard stores the core's yank register, get_clipboard answers with -// Event.paste, so y-then-p behaves like a live session. +// . const std = @import("std"); const libc = std.c; const pardes = @import("pardes"); @@ -182,9 +180,8 @@ fn runCase(arena: std.mem.Allocator, case: Case) !Result { // greeting. Live-session contract: sizes arrive as the first resize event. const core = try pardes.Pardes.init(gpa, .{ .tty_only = true }); defer core.deinit(); - var clip: []const u8 = ""; core.update(.{ .resize = .{ .cols = 80, .rows = 24 } }); - pump(core, arena, &clip); + pump(core); if (std.mem.eql(u8, case.pane, "file")) { _ = try core.hxOpenFileContent(case.text); @@ -196,13 +193,13 @@ fn runCase(arena: std.mem.Allocator, case: Case) !Result { try cooked.append(arena, ch); } core.update(.{ .output = .{ .pane = 0, .bytes = cooked.items } }); - pump(core, arena, &clip); + pump(core); // leave tty mode the way a live session does: Ctrl-, // then park the cursor at (0,0) — the helix harness's initial // Selection::single(0,1) equivalent (a live exit would leave the // modal cursor tracking the shell cursor below the output) core.update(.{ .key = .{ .cp = core.opts.tty_toggle, .ctrl = true } }); - pump(core, arena, &clip); + pump(core); if (core.panes[core.active]) |pane| { pane.cur_row = 0; pane.cur_col = 0; @@ -273,7 +270,7 @@ fn runCase(arena: std.mem.Allocator, case: Case) !Result { ki += 1; } core.update(.{ .key = key }); - pump(core, arena, &clip); + pump(core); } // one contract result line off the active pane's final state @@ -313,21 +310,10 @@ fn runCase(arena: std.mem.Allocator, case: Case) !Result { }; } -/// Drain queued effects. The fake clipboard: set_clipboard snapshots the -/// core's yank register, get_clipboard answers with Event.paste — the async -/// OSC 52 round trip of a live shell, collapsed to a synchronous reply. -/// Everything else (spawn, write, resize_pty, ...) is ignored: no real pty. -fn pump(core: *pardes.Pardes, arena: std.mem.Allocator, clip: *[]const u8) void { - while (true) { - var want_paste = false; - while (core.nextEffect()) |eff| switch (eff) { - .set_clipboard => clip.* = if (core.yank) |y| (arena.dupe(u8, y) catch "") else "", - .get_clipboard => want_paste = true, - else => {}, - }; - if (!want_paste) return; - core.update(.{ .paste = clip.* }); - } +/// Drain queued effects, all ignored (spawn, write, resize_pty, ...): no +/// real pty, and p/P read the core's own yank register. +fn pump(core: *pardes.Pardes) void { + while (core.nextEffect()) |_| {} } fn readFileAlloc(arena: std.mem.Allocator, path: []const u8) ![]u8 { diff --git a/test/snapshots/argv.golden b/test/snapshots/argv.golden index 76aa776a..f758c4d8 100644 --- a/test/snapshots/argv.golden +++ b/test/snapshots/argv.golden @@ -1,5 +1,5 @@ == snap noargs grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/argv/cwd Del | $ echo ARGV''TTY | ARGVTTY @@ -30,7 +30,7 @@ | | == snap filearg grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/argv/cwd/notes.txt Save Del NOR /tmp/pardes-snap/argv/cwd Del | 3 line 3 | 4 line 4 notes.txt zmarker.txt @@ -61,7 +61,7 @@ | | == snap dirarg grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/argv/cwd/sub Del | | inside.txt diff --git a/test/snapshots/boot.golden b/test/snapshots/boot.golden index 8f9129a9..17047ab6 100644 --- a/test/snapshots/boot.golden +++ b/test/snapshots/boot.golden @@ -1,5 +1,5 @@ == snap boot grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/boot/cwd Del | | hello.txt @@ -30,7 +30,7 @@ | | == style boot -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-34 #969696,#2c2a3e, 35-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-99 d,d, |3: 0-1 d,#525252, 2-99 d,d, diff --git a/test/snapshots/chordcut.golden b/test/snapshots/chordcut.golden index 41194c76..480e7383 100644 --- a/test/snapshots/chordcut.golden +++ b/test/snapshots/chordcut.golden @@ -1,5 +1,5 @@ == snap opened grid=60x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 line 2 f.txt g.txt @@ -30,7 +30,7 @@ | | == snap cut grid=60x30 cursor=7,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2 f.txt g.txt @@ -61,7 +61,7 @@ | | == snap copied grid=60x30 cursor=10,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2 f.txt g.txt @@ -92,7 +92,7 @@ | | == snap pointpaste grid=60x30 cursor=16,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2 f.txt g.txt @@ -123,7 +123,7 @@ | | == snap replaced grid=60x30 cursor=11,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2 f.txt g.txt @@ -154,7 +154,7 @@ | | == snap cancelexec grid=60x30 cursor=25,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2echo B''OO g.txt f.txt g.txt @@ -185,7 +185,7 @@ | | == snap execafter grid=60x30 cursor=25,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2echo B''OO g.txt f.txt g.txt @@ -216,7 +216,7 @@ | | == snap cancellook grid=60x30 cursor=25,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2echo B''OO g.txt f.txt g.txt @@ -247,7 +247,7 @@ | | == snap lookafter grid=60x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 |╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ f.txt g.txt @@ -278,7 +278,7 @@ | | == style chordsel -|0: 0-44 #969696,#2c2a3e, 45-59 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-59 d,#2c2a3e, |1: 0-1 d,#383c54, 2-29 #969696,#2c2a3e, 30-31 d,#383c54, 32-59 #969696,#2c2a3e, |2: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-29 d,d, 30-31 d,#525252, 32-59 d,d, |3: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-29 d,d, 30-31 d,#525252, 32-59 d,d, @@ -309,7 +309,7 @@ |28: 0-1 d,#525252, 2-29 d,d, 30-31 d,#525252, 32-59 d,d, |29: 0-1 d,#525252, 2-29 d,d, 30-31 d,#525252, 32-59 d,d, == style clickdismiss -|0: 0-44 #969696,#2c2a3e, 45-59 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-59 d,#2c2a3e, |1: 0-1 d,#383c54, 2-29 #969696,#2c2a3e, 30-31 d,#383c54, 32-59 #969696,#2c2a3e, |2: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-29 d,d, 30-31 d,#525252, 32-59 d,d, |3: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-29 d,d, 30-31 d,#525252, 32-59 d,d, @@ -340,7 +340,7 @@ |28: 0-1 d,#525252, 2-29 d,d, 30-31 d,#525252, 32-59 d,d, |29: 0-1 d,#525252, 2-29 d,d, 30-31 d,#525252, 32-59 d,d, == snap ttyprobe grid=60x30 cursor=12,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2echo B''OO g.txt f.txt g.txt @@ -371,7 +371,7 @@ | | == snap ttyprompt grid=60x30 cursor=8,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/chordcu NOR /tmp/pardes-snap/chordcu | 1 line 1 | 2 2echo B''OO g.txt f.txt g.txt diff --git a/test/snapshots/cursorline.golden b/test/snapshots/cursorline.golden index 2902e41f..aa07ca12 100644 --- a/test/snapshots/cursorline.golden +++ b/test/snapshots/cursorline.golden @@ -1,5 +1,5 @@ == snap top grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/cursorline/cwd/cur.txt Save NOR /tmp/pardes-snap/cursorline/cwd Del | 1 line 1 | 2 line 2 cur.txt @@ -30,7 +30,7 @@ | | == style top -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-90 #969696,#2c2a3e, 91-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #969696,#2c2a3e, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -61,7 +61,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == snap down3 grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/cursorline/cwd/cur.txt Save NOR /tmp/pardes-snap/cursorline/cwd Del | 1 line 1 | 2 line 2 cur.txt @@ -92,7 +92,7 @@ | | == style down3 -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-90 #969696,#2c2a3e, 91-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/dump.golden b/test/snapshots/dump.golden index 9527f838..ffaf3735 100644 --- a/test/snapshots/dump.golden +++ b/test/snapshots/dump.golden @@ -4,7 +4,7 @@ .version = 1, .screen = .{ .cols = 100, .rows = 30 }, .active = 0, - .topbar = "Kill Newcol Tutor Debug Colors NextColor Dump", + .topbar = "Kill Newcol Tutor Debug Colors NextColor Crt Dump", .theme = "dark", .columns = .{ .{ .weight = 1, .panes = .{ 0, 1 } }, .{ .weight = 1, .panes = .{2} } }, .panes = .{ diff --git a/test/snapshots/dump.snap b/test/snapshots/dump.snap index 79a17954..12b2fad0 100644 --- a/test/snapshots/dump.snap +++ b/test/snapshots/dump.snap @@ -12,7 +12,7 @@ text typed-marker key esc settle 700 stable 400 5000 -press middle 43 1 -release middle 43 1 +press middle 47 1 +release middle 47 1 settle 800 snapfile dump /tmp/pardes-dump.zon diff --git a/test/snapshots/edit.golden b/test/snapshots/edit.golden index 1e253388..6815dbd6 100644 --- a/test/snapshots/edit.golden +++ b/test/snapshots/edit.golden @@ -1,5 +1,5 @@ == snap inserted grid=100x30 cursor=4,9 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/edit/cwd Del NOR /tmp/pardes-snap/edit/cwd Del | | e.txt e.txt @@ -30,7 +30,7 @@ | | == style inserted -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-34 #969696,#2c2a3e, 35-49 d,#2c2a3e, 50-51 d,#383c54, 52-84 #969696,#2c2a3e, 85-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/exec-bigdrag.golden b/test/snapshots/exec-bigdrag.golden index 1d5df56b..5ea48200 100644 --- a/test/snapshots/exec-bigdrag.golden +++ b/test/snapshots/exec-bigdrag.golden @@ -1,5 +1,5 @@ == snap alive grid=200x60 cursor=104,37 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/exec-bigdrag/cwd Del NOR /tmp/pardes-snap/exec-bigdrag/cwd Del | bash: line: command not found | big.txt diff --git a/test/snapshots/exec.golden b/test/snapshots/exec.golden index 01464fd9..5f1470c9 100644 --- a/test/snapshots/exec.golden +++ b/test/snapshots/exec.golden @@ -1,5 +1,5 @@ == snap exec grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/exec/cwd Del NOR /tmp/pardes-snap/exec/cwd Del | | e.txt e.txt @@ -30,7 +30,7 @@ | | == snap kept grid=100x30 cursor=6,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/exec/cwd Del NOR /tmp/pardes-snap/exec/cwd Del | ZZARG | ./c.sh e.txt @@ -61,7 +61,7 @@ | | == snap chord grid=100x30 cursor=6,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/exec/cwd Del NOR /tmp/pardes-snap/exec/cwd Del | ZZARG | ./c.sh e.txt @@ -92,7 +92,7 @@ | | == snap deleted grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/exec/cwd Del NOR /tmp/pardes-snap/exec/cwd Del | | e.txt e.txt diff --git a/test/snapshots/fileedit.golden b/test/snapshots/fileedit.golden index 13d6835a..8028f8f0 100644 --- a/test/snapshots/fileedit.golden +++ b/test/snapshots/fileedit.golden @@ -1,5 +1,5 @@ == snap edited grid=100x30 cursor=17,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fileedit/cwd/f.txt Save Del NOR /tmp/pardes-snap/fileedit/cwd Del | 1 liEDIT''MEne 1 | 2 line 2 f.txt @@ -30,7 +30,7 @@ | | == snap deleted grid=100x30 cursor=7,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fileedit/cwd/f.txt Save Del NOR /tmp/pardes-snap/fileedit/cwd Del | 1 liEDIT''MEne 1 | 2 line 3 f.txt @@ -61,7 +61,7 @@ | | == snap undone grid=100x30 cursor=13,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fileedit/cwd/f.txt Save Del NOR /tmp/pardes-snap/fileedit/cwd Del | 1 liEDIT''MEne 1 | 2 line 2 f.txt diff --git a/test/snapshots/fsearch.golden b/test/snapshots/fsearch.golden index 9b287277..a634755a 100644 --- a/test/snapshots/fsearch.golden +++ b/test/snapshots/fsearch.golden @@ -1,5 +1,5 @@ == snap opened grid=120x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 1 l1 | 2 MARK a g.txt @@ -30,7 +30,7 @@ | | == snap typing grid=120x30 cursor=55,1 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/fsearch/cwd/g.txt Save Del /MARK NOR /tmp/pardes-snap/fsearch/cwd Del | 1 l1 | 2 MARK a g.txt @@ -61,7 +61,7 @@ | | == snap results grid=120x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 1 l1 | 2 MARK a g.txt @@ -92,7 +92,7 @@ | | == snap first grid=120x30 cursor=7,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 1 l1 | 2 MARK a g.txt @@ -123,7 +123,7 @@ | | == style first -|0: 0-44 #969696,#2c2a3e, 45-119 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-119 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-48 #969696,#2c2a3e, 49-59 d,#2c2a3e, 60-61 d,#383c54, 62-97 #969696,#2c2a3e, 98-119 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-59 d,d, 60-61 d,#525252, 62-119 d,d, |3: 0-1 d,#525252, 2-6 #969696,#2c2a3e, 7-59 d,d, 60-61 d,#525252, 62-119 d,d, @@ -154,7 +154,7 @@ |28: 0-1 d,#525252, 2-59 d,d, 60-61 d,#525252, 62-119 d,d, |29: 0-1 d,#525252, 2-59 d,d, 60-61 d,#525252, 62-119 d,d, == snap second grid=120x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 3 l3 | 4 l4 g.txt @@ -185,7 +185,7 @@ | | == snap third grid=120x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 7 l7 | 8 l8 g.txt @@ -216,7 +216,7 @@ | | == snap back grid=120x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 3 l3 | 4 l4 g.txt @@ -247,7 +247,7 @@ | | == snap cancel grid=120x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 3 l3 | 4 l4 g.txt @@ -278,7 +278,7 @@ | | == snap nomatch grid=120x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/fsearch/cwd/g.txt Save Del NOR /tmp/pardes-snap/fsearch/cwd Del | 3 l3 | 4 l4 g.txt diff --git a/test/snapshots/ghostty-mid.golden b/test/snapshots/ghostty-mid.golden index 929549c6..402e2b46 100644 --- a/test/snapshots/ghostty-mid.golden +++ b/test/snapshots/ghostty-mid.golden @@ -1,5 +1,5 @@ == snap ghostty-mid grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ghostty-mid/cwd Del NOR /tmp/pardes-snap/ghostty-mid/cwd Del | ZZPAD | ./g.sh g.txt diff --git a/test/snapshots/hscroll.golden b/test/snapshots/hscroll.golden index 3eed48f8..788d468f 100644 --- a/test/snapshots/hscroll.golden +++ b/test/snapshots/hscroll.golden @@ -1,5 +1,5 @@ == snap opened grid=60x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/hscroll NOR /tmp/pardes-snap/hscroll | 1 short1 END_A_MARKER_WAY | wide.txt @@ -30,7 +30,7 @@ | | == snap wheeled grid=60x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/hscroll NOR /tmp/pardes-snap/hscroll | 1 ND_A_MARKER_WAY_OUT_RIG | wide.txt @@ -61,7 +61,7 @@ | | == snap clamped grid=60x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/hscroll NOR /tmp/pardes-snap/hscroll | 1 short1 END_A_MARKER_WAY | wide.txt @@ -92,7 +92,7 @@ | | == snap dollar grid=60x30 cursor=26,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/hscroll NOR /tmp/pardes-snap/hscroll | 1 padpadpadpadpad_TAIL | wide.txt @@ -123,7 +123,7 @@ | | == snap zero grid=60x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/hscroll NOR /tmp/pardes-snap/hscroll | 1 short1 END_A_MARKER_WAY | wide.txt diff --git a/test/snapshots/images.golden b/test/snapshots/images.golden index ae12bedf..89e40241 100644 --- a/test/snapshots/images.golden +++ b/test/snapshots/images.golden @@ -1,5 +1,5 @@ == snap img-open grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | img /tmp/pardes-snap/images/cwd/pic.ppm Petscii NOR /tmp/pardes-snap/images/cwd Del | 🬝🬂 | 🬝🬂█ pic.ppm @@ -30,7 +30,7 @@ | | == style img-open -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#2a2a2a, 2-19 d,d, 20-29 #ffffff,#ffffff, 30-31 #ffffff,#6c5eb5, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-19 d,d, 20-27 #ffffff,#ffffff, 28-29 #ffffff,#6c5eb5, 30-30 #352879,#ffffff, 31-31 #352879,#352879, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -61,7 +61,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == style term-palette -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#2a2a2a, 2-19 d,d, 20-29 #ffffff,#ffffff, 30-31 #ffffff,#6c5eb5, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-19 d,d, 20-27 #ffffff,#ffffff, 28-29 #ffffff,#6c5eb5, 30-30 #352879,#ffffff, 31-31 #352879,#352879, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -92,7 +92,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == style no-ascii -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#2a2a2a, 2-19 d,d, 20-29 #ffffff,#ffffff, 30-31 #ffffff,#6c5eb5, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-19 d,d, 20-27 #ffffff,#ffffff, 28-29 #ffffff,#6c5eb5, 30-30 #352879,#ffffff, 31-31 #352879,#352879, 32-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/layout-close.golden b/test/snapshots/layout-close.golden index b54b765b..cddcd0c4 100644 --- a/test/snapshots/layout-close.golden +++ b/test/snapshots/layout-close.golden @@ -1,5 +1,5 @@ == snap built grid=140x40 cursor=4,16 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del | | marker.txt marker.txt @@ -40,7 +40,7 @@ | | == snap altc grid=140x40 cursor=98,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del | | marker.txt marker.txt marker.txt @@ -81,7 +81,7 @@ | | == snap del grid=140x40 cursor=98,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del | | marker.txt marker.txt marker.txt @@ -122,7 +122,7 @@ | | == snap exit grid=140x40 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del | | marker.txt marker.txt marker.txt @@ -163,7 +163,7 @@ | | == snap colclose grid=140x40 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-close/cwd Del NOR /tmp/pardes-snap/layout-close/cwd Del | | marker.txt marker.txt diff --git a/test/snapshots/layout-open.golden b/test/snapshots/layout-open.golden index c0690d3c..2a1d462a 100644 --- a/test/snapshots/layout-open.golden +++ b/test/snapshots/layout-open.golden @@ -1,5 +1,5 @@ == snap before grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-open/cwd Del NOR /tmp/pardes-snap/layout-open/cwd Del | | sub sub @@ -30,7 +30,7 @@ | | == snap altn-left grid=100x30 cursor=4,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-open/cwd Del NOR /tmp/pardes-snap/layout-open/cwd Del | | sub sub @@ -61,7 +61,7 @@ | | == snap altn-right grid=100x30 cursor=54,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-open/cwd Del NOR /tmp/pardes-snap/layout-open/cwd Del | | sub sub @@ -92,7 +92,7 @@ | | == snap file-open grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-open/cwd/sub/f.txt S NOR /tmp/pardes-snap/layout-open/cwd Del | 1 echo 'TTY'OK | NOR /tmp/pardes-snap/layout-open/cwd Del sub @@ -123,7 +123,7 @@ | | == snap ttydir grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/layout-open/cwd/sub/f.txt S NOR /tmp/pardes-snap/layout-open/cwd Del | 1 echo 'TTY'OK | NOR /tmp/pardes-snap/layout-open/cwd Del sub diff --git a/test/snapshots/load.golden b/test/snapshots/load.golden index 5ca1bfc8..09562ba2 100644 --- a/test/snapshots/load.golden +++ b/test/snapshots/load.golden @@ -1,5 +1,5 @@ == snap loaded grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/load/cwd Del NOR /tmp/pardes-snap/load/cwd Del | | LOADMARK d.txt @@ -30,7 +30,7 @@ | | == style loaded -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-34 #969696,#2c2a3e, 35-49 d,#2c2a3e, 50-51 d,#383c54, 52-84 #969696,#2c2a3e, 85-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/load.snap b/test/snapshots/load.snap index c2e89837..45ddb683 100644 --- a/test/snapshots/load.snap +++ b/test/snapshots/load.snap @@ -17,8 +17,8 @@ stable 600 8000 wheel up 10 8 wheel up 10 8 stable 500 8000 -press middle 43 1 -release middle 43 1 +press middle 47 1 +release middle 47 1 settle 800 start 30 100 -l /tmp/pardes-dump.zon wait 8000 LOADMARK diff --git a/test/snapshots/look-center.golden b/test/snapshots/look-center.golden index 67ef9a71..c3073dec 100644 --- a/test/snapshots/look-center.golden +++ b/test/snapshots/look-center.golden @@ -1,5 +1,5 @@ == snap center-open grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/look-center/cwd/big.txt Sav NOR /tmp/pardes-snap/look-center/cwd Del | 97 line 97 | 98 line 98 big.txt @@ -30,7 +30,7 @@ | | == snap center-dedup grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/look-center/cwd/big.txt Sav NOR /tmp/pardes-snap/look-center/cwd Del | 147 line 147 | 148 line 148 big.txt @@ -61,7 +61,7 @@ | | == snap center-clamp grid=100x30 cursor=7,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/look-center/cwd/big.txt Sav NOR /tmp/pardes-snap/look-center/cwd Del | 1 line 1 | 2 line 2 big.txt diff --git a/test/snapshots/look-dir.golden b/test/snapshots/look-dir.golden index ccd6b9e9..8dcb072b 100644 --- a/test/snapshots/look-dir.golden +++ b/test/snapshots/look-dir.golden @@ -1,5 +1,5 @@ == snap dir-open grid=100x30 cursor=4,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/look-dir/cwd Del NOR /tmp/pardes-snap/look-dir/cwd Del | | sub top.txt sub top.txt diff --git a/test/snapshots/look-file.golden b/test/snapshots/look-file.golden index e3d40b84..32b1e8b4 100644 --- a/test/snapshots/look-file.golden +++ b/test/snapshots/look-file.golden @@ -1,5 +1,5 @@ == snap file-open grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/look-file/cwd/big.txt Save NOR /tmp/pardes-snap/look-file/cwd Del | 37 line 37 | 38 line 38 big.txt @@ -30,7 +30,7 @@ | | == style file-open -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-89 #969696,#2c2a3e, 90-99 d,#2c2a3e, |2: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/lookloaded.golden b/test/snapshots/lookloaded.golden index af90b0ef..7885edf4 100644 --- a/test/snapshots/lookloaded.golden +++ b/test/snapshots/lookloaded.golden @@ -1,5 +1,5 @@ == snap file-open grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/lookloaded/cwd/big.txt Save NOR /tmp/pardes-snap/lookloaded/cwd Del | 37 line 37 | 38 line 38 big.txt @@ -30,7 +30,7 @@ | | == snap removed grid=100x30 cursor=4,10 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/lookloaded/cwd/big.txt Save NOR /tmp/pardes-snap/lookloaded/cwd Del | 37 line 37 | 38 line 38 big.txt @@ -61,7 +61,7 @@ | | == snap look-noFS grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/lookloaded/cwd/big.txt Save NOR /tmp/pardes-snap/lookloaded/cwd Del | 7 line 7 | 8 line 8 big.txt diff --git a/test/snapshots/modal.golden b/test/snapshots/modal.golden index dfe34130..57b68c99 100644 --- a/test/snapshots/modal.golden +++ b/test/snapshots/modal.golden @@ -1,5 +1,5 @@ == snap top grid=100x30 cursor=2,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -30,7 +30,7 @@ | | == snap moved grid=100x30 cursor=5,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -61,7 +61,7 @@ | | == snap xsel grid=100x30 cursor=15,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -92,7 +92,7 @@ | | == style xsel -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-35 #969696,#2c2a3e, 36-49 d,#2c2a3e, 50-51 d,#383c54, 52-85 #969696,#2c2a3e, 86-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -123,7 +123,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == snap xsel2 grid=100x30 cursor=15,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -154,7 +154,7 @@ | | == snap yanked grid=100x30 cursor=15,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -185,7 +185,7 @@ | | == snap vsel grid=100x30 cursor=16,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -216,7 +216,7 @@ | | == style vsel -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-35 #969696,#2c2a3e, 36-49 d,#2c2a3e, 50-51 d,#383c54, 52-85 #969696,#2c2a3e, 86-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -247,7 +247,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == snap typed grid=100x30 cursor=2,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -278,7 +278,7 @@ | | == snap undone grid=100x30 cursor=16,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -309,7 +309,7 @@ | | == snap redone grid=100x30 cursor=2,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt @@ -340,7 +340,7 @@ | | == snap bottom grid=100x30 cursor=2,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/modal/cwd Del NOR /tmp/pardes-snap/modal/cwd Del | | words.txt words.txt diff --git a/test/snapshots/respawn.golden b/test/snapshots/respawn.golden index 2e5e1552..e1296136 100644 --- a/test/snapshots/respawn.golden +++ b/test/snapshots/respawn.golden @@ -1,5 +1,5 @@ == snap respawn grid=100x30 cursor=4,8 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/respawn/cwd Del NOR /tmp/pardes-snap/respawn/cwd Del | | diff --git a/test/snapshots/restore.golden b/test/snapshots/restore.golden index 6b8c4d7e..45665327 100644 --- a/test/snapshots/restore.golden +++ b/test/snapshots/restore.golden @@ -1,5 +1,5 @@ == snap dumped grid=100x30 cursor=4,5 -|Kill Newcol Tutor Debug Colors NextColor Dump Restore /tmp/pardes-dump.zon +|Kill Newcol Tutor Debug Colors NextColor Crt Dump Restore /tmp/pardes-dump.zon | TTY /tmp/pardes-snap/restore/cwd Del | $ ls | $ echo KEEP''ME @@ -30,7 +30,7 @@ | | == snap restored grid=100x30 cursor=4,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/restore/cwd Del | $ ls | $ echo KEEP''ME diff --git a/test/snapshots/restore.snap b/test/snapshots/restore.snap index 815edc55..a035b4a6 100644 --- a/test/snapshots/restore.snap +++ b/test/snapshots/restore.snap @@ -11,15 +11,15 @@ text echo KEEP''ME key enter wait 8000 KEEPME stable 700 10000 -press middle 42 1 -release middle 42 1 +press middle 46 1 +release middle 46 1 stable 700 10000 snap dumped text echo GONE''SOON key enter wait 8000 GONESOON stable 700 10000 -press middle 48 1 -release middle 48 1 +press middle 52 1 +release middle 52 1 stable 900 15000 snap restored diff --git a/test/snapshots/scroll.golden b/test/snapshots/scroll.golden index 971f9659..01edb45f 100644 --- a/test/snapshots/scroll.golden +++ b/test/snapshots/scroll.golden @@ -1,5 +1,5 @@ == snap bottom grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scroll/cwd Del NOR /tmp/pardes-snap/scroll/cwd Del | 188 | 189 s.txt @@ -30,7 +30,7 @@ | | == snap wheel3 grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scroll/cwd Del NOR /tmp/pardes-snap/scroll/cwd Del | 185 | 186 s.txt @@ -61,7 +61,7 @@ | | == snap gutter-up grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scroll/cwd Del NOR /tmp/pardes-snap/scroll/cwd Del | 178 | 179 s.txt @@ -92,7 +92,7 @@ | | == snap gutter-down grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scroll/cwd Del NOR /tmp/pardes-snap/scroll/cwd Del | 180 | 181 s.txt @@ -123,7 +123,7 @@ | | == snap wheel-down grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scroll/cwd Del NOR /tmp/pardes-snap/scroll/cwd Del | 181 | 182 s.txt @@ -154,7 +154,7 @@ | | == style wheel-down -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-36 #969696,#2c2a3e, 37-49 d,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#2a2a2a, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#2a2a2a, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/scrolloff.golden b/test/snapshots/scrolloff.golden index f2165a10..9252b755 100644 --- a/test/snapshots/scrolloff.golden +++ b/test/snapshots/scrolloff.golden @@ -1,5 +1,5 @@ == snap top grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 1 line 1 | 2 line 2 g.txt @@ -30,7 +30,7 @@ | | == snap edge grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 3 line 3 | 4 line 4 g.txt @@ -61,7 +61,7 @@ | | == snap scrolled1 grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 4 line 4 | 5 line 5 g.txt @@ -92,7 +92,7 @@ | | == snap jdown grid=100x30 cursor=7,5 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 8 line 8 | 9 line 9 g.txt @@ -123,7 +123,7 @@ | | == snap end grid=100x30 cursor=7,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 36 line 36 | 37 line 37 g.txt @@ -154,7 +154,7 @@ | | == snap kup grid=100x30 cursor=7,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 30 line 30 | 31 line 31 g.txt @@ -185,7 +185,7 @@ | | == snap top2 grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/scrolloff/cwd/g.txt Save De NOR /tmp/pardes-snap/scrolloff/cwd Del | 1 line 1 | 2 line 2 g.txt diff --git a/test/snapshots/selarg.golden b/test/snapshots/selarg.golden index 664962a3..e8c3dc03 100644 --- a/test/snapshots/selarg.golden +++ b/test/snapshots/selarg.golden @@ -1,5 +1,5 @@ == snap kept grid=100x30 cursor=6,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/selarg/cwd Del NOR /tmp/pardes-snap/selarg/cwd Del | ZZARG ZZVEE ./c.sh | @@ -30,7 +30,7 @@ | | == snap crosspane grid=100x30 cursor=6,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/selarg/cwd Del NOR /tmp/pardes-snap/selarg/cwd Del | ZZARG ZZVEE ./c.sh | @@ -61,7 +61,7 @@ | | == snap vselarg grid=100x30 cursor=12,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/selarg/cwd Del NOR /tmp/pardes-snap/selarg/cwd Del | ZZARG ZZVEE ./c.sh | diff --git a/test/snapshots/shrinktag.golden b/test/snapshots/shrinktag.golden index 83379db7..031f15ef 100644 --- a/test/snapshots/shrinktag.golden +++ b/test/snapshots/shrinktag.golden @@ -1,5 +1,5 @@ == snap before grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/shrinktag/cwd Del NOR /tmp/pardes-snap/shrinktag/cwd Del | | w.txt w.txt @@ -30,7 +30,7 @@ | | == snap shrunk grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/shrinktag/cwd Del NOR /tmp/pardes-snap/shrinktag/cwd Del | NOR /tmp/pardes-snap/shrinktag/cwd Del | w.txt @@ -61,7 +61,7 @@ | | == snap move-preview grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/shrinktag/cwd Del NOR /tmp/pardes-snap/shrinktag/cwd Del | NOR /tmp/pardes-snap/shrinktag/cwd Del | w.txt @@ -92,7 +92,7 @@ | | == snap restored grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/shrinktag/cwd Del NOR /tmp/pardes-snap/shrinktag/cwd Del | | w.txt w.txt @@ -123,7 +123,7 @@ | | == snap bottom-shrunk grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/shrinktag/cwd Del NOR /tmp/pardes-snap/shrinktag/cwd Del | | w.txt w.txt diff --git a/test/snapshots/splitparent.golden b/test/snapshots/splitparent.golden index b838cdad..f9b50eda 100644 --- a/test/snapshots/splitparent.golden +++ b/test/snapshots/splitparent.golden @@ -1,5 +1,5 @@ == snap shrunk grid=100x30 cursor=4,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/splitparent/cwd Del NOR /tmp/pardes-snap/splitparent/cwd Del | NOR /tmp/pardes-snap/splitparent/cwd Del | @@ -30,7 +30,7 @@ | | == snap swap-parent grid=100x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/splitparent/cwd Del NOR /tmp/pardes-snap/splitparent/cwd Del | NOR /tmp/pardes-snap/splitparent/cwd Del | @@ -61,13 +61,13 @@ | | == snap tallest grid=100x5 cursor=54,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/splitparent/cwd Del NOR /tmp/pardes-snap/splitparent/cwd Del | NOR /tmp/pardes-snap/splitparent/cwd Del | NOR /tmp/pardes-snap/splitparent/cwd Del NOR /tmp/pardes-snap/splitparent/cwd Del | == snap regrown grid=100x30 cursor=54,18 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/splitparent/cwd Del NOR /tmp/pardes-snap/splitparent/cwd Del | NOR /tmp/pardes-snap/splitparent/cwd Del | diff --git a/test/snapshots/syntax.golden b/test/snapshots/syntax.golden index f6d673a3..29118688 100644 --- a/test/snapshots/syntax.golden +++ b/test/snapshots/syntax.golden @@ -1,5 +1,5 @@ == snap zig-open grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/syntax/cwd/demo.zig Save De NOR /tmp/pardes-snap/syntax/cwd Del | 1 const std = @import("std"); // greet | 2 pub fn main() void { demo.zig @@ -30,7 +30,7 @@ | | == style zig-open -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #969696,#2c2a3e, 7-18 d,d, 19-25 #cc70d8,d,b 26-26 d,d, 27-31 #8ab87a,d, 32-34 d,d, 35-42 #f0f0f0,d,b 43-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-10 d,d, 11-12 #cc70d8,d,b 13-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -61,7 +61,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == style colors-off -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #969696,#2c2a3e, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-49 d,d, 50-51 d,#525252, 52-99 d,d, @@ -92,7 +92,7 @@ |28: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |29: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, == style colors-on -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-49 #969696,#2c2a3e, 50-51 d,#383c54, 52-86 #969696,#2c2a3e, 87-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-6 #969696,#2c2a3e, 7-18 d,d, 19-25 #cc70d8,d,b 26-26 d,d, 27-31 #8ab87a,d, 32-34 d,d, 35-42 #f0f0f0,d,b 43-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-6 #5a5a5a,d, 7-10 d,d, 11-12 #cc70d8,d,b 13-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/tag.golden b/test/snapshots/tag.golden index 2765c044..0c86024e 100644 --- a/test/snapshots/tag.golden +++ b/test/snapshots/tag.golden @@ -1,5 +1,5 @@ == snap tag-focus grid=100x30 cursor=34,1 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/tag/cwd Del NOR /tmp/pardes-snap/tag/cwd Del | | t.txt t.txt @@ -30,7 +30,7 @@ | | == snap tag-typed grid=100x30 cursor=40,1 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/tag/cwd Del t.txt NOR /tmp/pardes-snap/tag/cwd Del | | t.txt t.txt @@ -61,7 +61,7 @@ | | == snap tag-del grid=100x30 cursor=36,1 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/tag/cwd Del t NOR /tmp/pardes-snap/tag/cwd Del | | t.txt t.txt @@ -92,7 +92,7 @@ | | == snap tag-exit grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/tag/cwd Del t.txt NOR /tmp/pardes-snap/tag/cwd Del | | t.txt t.txt @@ -123,7 +123,7 @@ | | == snap tag-look grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/tag/cwd/t.txt Save Del NOR /tmp/pardes-snap/tag/cwd Del | 1 x | t.txt diff --git a/test/snapshots/theme.golden b/test/snapshots/theme.golden index 5435eee4..39dc800a 100644 --- a/test/snapshots/theme.golden +++ b/test/snapshots/theme.golden @@ -1,5 +1,5 @@ == snap acme grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/theme/cwd Del NOR /tmp/pardes-snap/theme/cwd Del | | t.txt t.txt @@ -30,7 +30,7 @@ | | == style acme -|0: 0-44 #000000,#eaffff, 45-99 d,#eaffff, +|0: 0-48 #000000,#eaffff, 49-99 d,#eaffff, |1: 0-1 d,#6e4fd0, 2-35 #000000,#eaffff, 36-49 d,#eaffff, 50-51 d,#383c54, 52-85 #000000,#eaffff, 86-99 d,#eaffff, |2: 0-1 d,#ffffea, 2-49 #000000,#ffffea, 50-51 d,#ffffea, 52-99 #000000,#ffffea, |3: 0-1 d,#ffffea, 2-49 #000000,#ffffea, 50-51 d,#ffffea, 52-99 #000000,#ffffea, @@ -61,7 +61,7 @@ |28: 0-1 d,#ffffea, 2-49 #000000,#ffffea, 50-51 d,#ffffea, 52-99 #000000,#ffffea, |29: 0-1 d,#ffffea, 2-49 #000000,#ffffea, 50-51 d,#ffffea, 52-99 #000000,#ffffea, == snap colors-off grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/theme/cwd Del NOR /tmp/pardes-snap/theme/cwd Del | | t.txt t.txt @@ -92,7 +92,7 @@ | | == style colors-off -|0: 0-44 #000000,#eaffff, 45-99 d,#eaffff, +|0: 0-48 #000000,#eaffff, 49-99 d,#eaffff, |1: 0-1 d,#6e4fd0, 2-35 #000000,#eaffff, 36-49 d,#eaffff, 50-51 d,#383c54, 52-85 #000000,#eaffff, 86-99 d,#eaffff, |2: 0-99 d,#ffffea, |3: 0-1 d,#ffffea, 2-6 #000000,#ffffea, 7-51 d,#ffffea, 52-56 #000000,#ffffea, 57-99 d,#ffffea, @@ -123,7 +123,7 @@ |28: 0-99 d,#ffffea, |29: 0-99 d,#ffffea, == snap dark-again grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/theme/cwd Del NOR /tmp/pardes-snap/theme/cwd Del | | t.txt t.txt @@ -154,7 +154,7 @@ | | == style dark-again -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-35 #969696,#2c2a3e, 36-49 d,#2c2a3e, 50-51 d,#383c54, 52-85 #969696,#2c2a3e, 86-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, |3: 0-1 d,#525252, 2-49 d,d, 50-51 d,#525252, 52-99 d,d, diff --git a/test/snapshots/tty.golden b/test/snapshots/tty.golden index 63e4a760..d4cbb360 100644 --- a/test/snapshots/tty.golden +++ b/test/snapshots/tty.golden @@ -1,5 +1,5 @@ == snap tty-on grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/tty/cwd Del NOR /tmp/pardes-snap/tty/cwd Del | $ ls | m.txt m.txt @@ -30,7 +30,7 @@ | | == snap tty-echo grid=100x30 cursor=4,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/tty/cwd Del NOR /tmp/pardes-snap/tty/cwd Del | $ ls | m.txt m.txt @@ -61,7 +61,7 @@ | | == snap tty-off grid=100x30 cursor=4,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/tty/cwd Del NOR /tmp/pardes-snap/tty/cwd Del | | m.txt m.txt diff --git a/test/snapshots/ttyclick.golden b/test/snapshots/ttyclick.golden index a02ed2b5..752d6221 100644 --- a/test/snapshots/ttyclick.golden +++ b/test/snapshots/ttyclick.golden @@ -1,5 +1,5 @@ == snap tty-bodyclick grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/ttyclick/cwd Del NOR /tmp/pardes-snap/ttyclick/cwd Del | $ ls | probe.txt probe.txt @@ -30,7 +30,7 @@ | | == snap tty-tagedit grid=100x30 cursor=39,1 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/ttyclick/cwd Del NOR /tmp/pardes-snap/ttyclick/cwd Del | | probe.txt probe.txt @@ -61,7 +61,7 @@ | | == snap tty-tagexit grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/ttyclick/cwd Del NOR /tmp/pardes-snap/ttyclick/cwd Del | $ ls | probe.txt probe.txt @@ -92,7 +92,7 @@ | | == snap ins-bodyclick grid=100x30 cursor=11,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | INS /tmp/pardes-snap/ttyclick/cwd Del NOR /tmp/pardes-snap/ttyclick/cwd Del | | probe.txt probe.txt diff --git a/test/snapshots/ttyfollow.golden b/test/snapshots/ttyfollow.golden index 6142159f..b9fc8af0 100644 --- a/test/snapshots/ttyfollow.golden +++ b/test/snapshots/ttyfollow.golden @@ -1,5 +1,5 @@ == snap held-pre grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttyfollow/cwd Del NOR /tmp/pardes-snap/ttyfollow/cwd Del | 185 | 186 s.txt @@ -30,7 +30,7 @@ | | == snap held-post grid=100x30 cursor=54,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttyfollow/cwd Del TTY /tmp/pardes-snap/ttyfollow/cwd Del | 185 $ ls | 186 s.txt @@ -61,7 +61,7 @@ | | == snap tty-follows grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/ttyfollow/cwd Del TTY /tmp/pardes-snap/ttyfollow/cwd Del | 288 $ ls | 289 s.txt diff --git a/test/snapshots/ttylook.golden b/test/snapshots/ttylook.golden index 1233118d..e8d12f5f 100644 --- a/test/snapshots/ttylook.golden +++ b/test/snapshots/ttylook.golden @@ -1,5 +1,5 @@ == snap tok1 grid=120x30 cursor=2,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -30,7 +30,7 @@ | | == style tok1 -|0: 0-44 #969696,#2c2a3e, 45-119 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-119 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-37 #969696,#2c2a3e, 38-59 d,#2c2a3e, 60-61 d,#383c54, 62-97 #969696,#2c2a3e, 98-119 d,#2c2a3e, |2: 0-1 d,#525252, 2-59 d,d, 60-61 d,#525252, 62-119 d,d, |3: 0-1 d,#525252, 2-8 #d8c8a8,#4a3a1e, 9-59 d,d, 60-61 d,#525252, 62-119 d,d, @@ -61,7 +61,7 @@ |28: 0-1 d,#525252, 2-59 d,d, 60-61 d,#525252, 62-119 d,d, |29: 0-1 d,#525252, 2-59 d,d, 60-61 d,#525252, 62-119 d,d, == snap tok2 grid=120x30 cursor=11,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -92,7 +92,7 @@ | | == snap tokback grid=120x30 cursor=2,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -123,7 +123,7 @@ | | == snap insert grid=120x30 cursor=2,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | nnbig.txt plain.txt sub big.txt plain.txt sub @@ -154,7 +154,7 @@ | | == snap tok3 grid=120x30 cursor=22,3 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -185,7 +185,7 @@ | | == snap diropen grid=120x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -216,7 +216,7 @@ | | == snap noop grid=120x30 cursor=4,7 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd Del NOR /tmp/pardes-snap/ttylook/cwd Del | | big.txt plain.txt sub big.txt plain.txt sub @@ -247,7 +247,7 @@ | | == snap fileopen grid=120x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/ttylook/cwd/big.txt Save Del NOR /tmp/pardes-snap/ttylook/cwd Del | 1 line 1 | NOR /tmp/pardes-snap/ttylook/cwd Del big.txt plain.txt sub diff --git a/test/snapshots/ttyonly.golden b/test/snapshots/ttyonly.golden index f8722061..7d877255 100644 --- a/test/snapshots/ttyonly.golden +++ b/test/snapshots/ttyonly.golden @@ -1,5 +1,5 @@ == snap ttyonly grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/ttyonly/cwd Del | $ echo TTY''ONLY | TTYONLY @@ -30,7 +30,7 @@ | | == style ttyonly -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#6e4fd0, 2-37 #969696,#2c2a3e, 38-99 d,#2c2a3e, |2: 0-1 d,#525252, 2-99 d,d, |3: 0-1 d,#525252, 2-99 d,d, diff --git a/test/snapshots/tutor.golden b/test/snapshots/tutor.golden index d4c5d644..7f7139dc 100644 --- a/test/snapshots/tutor.golden +++ b/test/snapshots/tutor.golden @@ -1,5 +1,5 @@ == snap tutor grid=100x30 cursor=7,2 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /Tutor Save Del NOR /tmp/pardes-snap/tutor/cwd Del | 1 | 2 PARDES TUTOR diff --git a/test/snapshots/winch.golden b/test/snapshots/winch.golden index f0b1277b..a3926e6f 100644 --- a/test/snapshots/winch.golden +++ b/test/snapshots/winch.golden @@ -1,5 +1,5 @@ == snap storm grid=100x30 cursor=4,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/winch/cwd Del NOR /tmp/pardes-snap/winch/cwd Del | $ ls | $ for i in $(seq 600); do kill -WINCH $PPID; don @@ -30,7 +30,7 @@ | | == snap resized grid=106x34 cursor=4,6 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | TTY /tmp/pardes-snap/winch/cwd Del NOR /tmp/pardes-snap/winch/cwd Del | $ ls | $ for i in $(seq 600); do kill -WINCH $PPID; done; diff --git a/test/snapshots/windowops.golden b/test/snapshots/windowops.golden index a7750e33..c6282d58 100644 --- a/test/snapshots/windowops.golden +++ b/test/snapshots/windowops.golden @@ -1,5 +1,5 @@ == snap hover-v grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del ╎ NOR /tmp/pardes-snap/windowops/cwd Del | ╎ | w.txt ╎ w.txt @@ -30,7 +30,7 @@ | ╎ | ╎ == snap hover-h grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -61,7 +61,7 @@ | | == snap border-drag grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd De╎ NOR /tmp/pardes-snap/windowops/cwd Del | ╎ | w.txt ╎ w.txt @@ -92,7 +92,7 @@ | ╎ | ╎ == snap border-done grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd De╎ NOR /tmp/pardes-snap/windowops/cwd Del | ╎ | w.txt ╎ w.txt @@ -123,7 +123,7 @@ | ╎ | ╎ == snap hborder-done grid=100x30 cursor=4,4 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -154,7 +154,7 @@ | | == snap move-preview grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -185,7 +185,7 @@ | | == snap moved grid=100x30 cursor=4,15 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -216,7 +216,7 @@ | | == snap altn grid=100x30 cursor=4,19 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -247,7 +247,7 @@ | | == snap focus-left grid=100x30 cursor=4,19 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt @@ -278,7 +278,7 @@ | | == snap debug-on grid=100x30 cursor=4,19 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowo╭────────────────────────────╮ | │pardes resizes=1 │ | w.txt w.txt │terms 4 cols 2 │ @@ -309,7 +309,7 @@ | | == style debug-on -|0: 0-44 #969696,#2c2a3e, 45-99 d,#2c2a3e, +|0: 0-48 #969696,#2c2a3e, 49-99 d,#2c2a3e, |1: 0-1 d,#383c54, 2-39 #969696,#2c2a3e, 40-41 d,#383c54, 42-69 #969696,#2c2a3e, 70-99 d,d, |2: 0-1 d,#525252, 2-39 d,d, 40-41 d,#525252, 42-70 d,d, 71-87 #969696,d, 88-98 d,#2a2a2a, 99-99 d,d, |3: 0-1 d,#525252, 2-39 d,d, 40-41 d,#525252, 42-70 d,d, 71-85 #969696,d, 86-98 d,#2a2a2a, 99-99 d,d, @@ -340,7 +340,7 @@ |28: 0-1 d,#525252, 2-39 d,d, 40-41 d,#525252, 42-99 d,d, |29: 0-1 d,#525252, 2-39 d,d, 40-41 d,#525252, 42-99 d,d, == snap debug-off grid=100x30 cursor=4,19 -|Kill Newcol Tutor Debug Colors NextColor Dump +|Kill Newcol Tutor Debug Colors NextColor Crt Dump | NOR /tmp/pardes-snap/windowops/cwd Del NOR /tmp/pardes-snap/windowops/cwd Del | | w.txt w.txt diff --git a/test/snapshots/yankpaste.golden b/test/snapshots/yankpaste.golden new file mode 100644 index 00000000..6961b70a --- /dev/null +++ b/test/snapshots/yankpaste.golden @@ -0,0 +1,93 @@ +== snap linewise-below grid=100x30 cursor=13,5 +|Kill Newcol Tutor Debug Colors NextColor Crt Dump +| NOR /tmp/pardes-snap/yankpaste/cwd/f.txt Save De NOR /tmp/pardes-snap/yankpaste/cwd Del +| 1 line 1 +| 2 line 2 f.txt +| 3 line 3 +| 4 line 2 +| 5 line 4 +| 6 line 5 +| 7 +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +== snap linewise-above grid=100x30 cursor=13,6 +|Kill Newcol Tutor Debug Colors NextColor Crt Dump +| NOR /tmp/pardes-snap/yankpaste/cwd/f.txt Save De NOR /tmp/pardes-snap/yankpaste/cwd Del +| 1 line 1 +| 2 line 2 f.txt +| 3 line 3 +| 4 line 2 +| 5 line 4 +| 6 line 2 +| 7 line 4 +| 8 line 5 +| 9 +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +== snap charwise-inline grid=100x30 cursor=10,2 +|Kill Newcol Tutor Debug Colors NextColor Crt Dump +| NOR /tmp/pardes-snap/yankpaste/cwd/f.txt Save De NOR /tmp/pardes-snap/yankpaste/cwd Del +| 1 liline 1 +| 2 line 2 f.txt +| 3 line 3 +| 4 line 2 +| 5 line 4 +| 6 line 2 +| 7 line 4 +| 8 line 5 +| 9 +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/test/snapshots/yankpaste.snap b/test/snapshots/yankpaste.snap new file mode 100644 index 00000000..38ca6e3b --- /dev/null +++ b/test/snapshots/yankpaste.snap @@ -0,0 +1,28 @@ +# y -> p round-trips through the core's own yank register (regression: p used +# to request the SYSTEM clipboard via OSC 52, which plain terminals — and this +# harness — never answer, so paste silently no-oped). Pins helix placement: +# a linewise yank (x) pastes as whole lines below (p) / above (P), a charwise +# yank (v) splices inline after the selection. +lines f.txt 5 +start 30 100 f.txt +wait 8000 Kill Newcol +wait 8000 line 5 +stable 700 20000 +# linewise: x-select line 2, yank, move down, paste below line 3 +press left 8 4 +release left 8 4 +stable 400 5000 +key x y j p +stable 400 5000 +snap linewise-below +# P from the pasted line: its copy lands above +key x y P +stable 400 5000 +snap linewise-above +# charwise: v-select two chars of line 1, yank, paste splices after them +press left 8 3 +release left 8 3 +stable 400 5000 +key v l y p +stable 400 5000 +snap charwise-inline -- cgit v1.3