Pointer: move an output with a press, a movement and a release (#11) master
Closes #5. ## What the change gives A user presses the pointer on an output in the map, moves the pointer, and releases it. The output follows the pointer and aligns with the outputs near it. The `Shift` key with the pointer makes an accurate movement with no snap operation. A press outside of every output moves nothing. ## The window `Viewport` in `crates/dynamonix-tui/src/canvas.rs` is the linear window between the logical plane and the cells of the terminal. `to_cell` and `to_logical` are its two directions, and a property test with 256 groups of random values states their law: a cell that comes from a position gives that position again, inside the error of one cell. The drawing gives the window to the state. A press therefore finds the output in the picture that the user sees, and not in a computation that can differ from it. ## The hold The pointer drives the same `Drag` as the keys, through the same snap function with the same threshold. A `Grip` adds two values that only the pointer needs: the offset of the pointer inside the output, so the output does not jump to the pointer, and the state before the hold. The release records that state, so the whole movement of one hold makes one history step, and one `u` removes it. A press with no release first records the hold before it, so no movement leaves the history. The interface asks the terminal for the events of the pointer at the start, and stops that request when the program stops. ## Checks `cargo fmt --all --check`, `cargo clippy --workspace --all-targets --locked -- -D warnings`, and `cargo test --workspace --locked` all pass. The suite holds 236 tests, 19 of them new. The release build passes. The tests need no terminal and no compositor. The only line that moves in `Cargo.lock` gives `proptest` to the tests of `dynamonix-tui`, and that package was already in the graph. Reviewed-on: https://git.devtechnica.com/sreedev/dynamonix/pulls/11