đ Phase 13.1.c â curseur souris : conversion HIDâpixel
Bug B.1 13.1.b rĂ©solu : ps2d sous Redox+QEMU dĂ©livre les coords absolues du pointer dans 0..65535 (16-bit virtuel HID), pas en pixels Ă©cran. Notre PointerMotion faisait une assignation directe â clamp permanent Ă (width-1, height-1) â cursor coincĂ© bas-droite, hit_test toujours None. Fix : conversion fixed-point x*screen_w/65536 (algo orbital upstream, cf orbital/src/scheme.rs:1583). Le clamp_cursor de 13.1.b reste comme garde-fou pour valeurs hors-spec. Validation runtime : curseur suit fidĂšlement la souris dans toute l'aire Ă©cran 1280Ă800, clics en (370,239), (522,303), (746,175), (1260,142), etc. Plus jamais de (1279,799) systĂ©matique. Bonus DX : filtre tracing par dĂ©faut « info,cursor=debug » pour Ă©viter d'avoir Ă taper RUST_LOG complexe dans la fenĂȘtre QEMU graphique (pas de copier-coller). Instrumentation `target="cursor"` laissĂ©e en place pour debug futur des Ă©vĂ©nements pointer. Bug B.2 (page fault ion) non traitĂ©, reste Ă reporter upstream. Leyoda 2026 â GPLv3
This commit is contained in:
parent
18391c85f7
commit
58ef6a85c2
3 changed files with 188 additions and 3 deletions
152
docs/phase13-1-c-cursor.md
Normal file
152
docs/phase13-1-c-cursor.md
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
# Phase 13.1.c â Curseur souris : conversion HIDâpixel
|
||||
|
||||
> Document produit le 2026-05-16, suite de
|
||||
> [`phase13-1-b-observations.md`](phase13-1-b-observations.md).
|
||||
>
|
||||
> **Scope** : isoler et corriger le bug B.1 listé en 13.1.b ⠫ curseur
|
||||
> software ne suit pas la souris correctement, reste coincé en bas-droite
|
||||
> de l'écran à `(width-1, height-1)` ». Diagnostic via instrumentation
|
||||
> ciblée, fix conforme à l'algo d'orbital upstream, validation runtime.
|
||||
>
|
||||
> **Verdict** : â
**13.1.c validĂ©e** â le curseur suit fidĂšlement la
|
||||
> souris, les coordonnées de clic sont dans la plage écran.
|
||||
|
||||
## Cause racine
|
||||
|
||||
Sous Redox + QEMU, `ps2d` délivre les coords absolues du pointer dans
|
||||
un **espace virtuel 16-bit (0..65535)**, pas en pixels écran. Notre
|
||||
branche `PointerMotion` faisait une assignation directe :
|
||||
|
||||
```rust
|
||||
self.cursor_x = *x; // x â 0..65535 â cursor_x â 0..65535
|
||||
```
|
||||
|
||||
Le `clamp_cursor()` ajoutĂ© en 13.1.b saturait alors Ă `screen_w - 1` Ă
|
||||
chaque event â cursor coincĂ© en bas-droite. Le bug B.1 13.1.b n'Ă©tait
|
||||
pas une dérive de deltas accumulés mais une **mauvaise interprétation de
|
||||
l'unité d'entrée**.
|
||||
|
||||
## Diagnostic
|
||||
|
||||
Instrumentation `tracing::debug!(target: "cursor", ...)` ajoutée dans les
|
||||
deux branches motion de `WaylandFrontend::forward_input` pour logger les
|
||||
valeurs brutes reçues. Avec `RUST_LOG=info,cursor=debug` (devenu le filtre
|
||||
par défaut de `init_tracing`), une session de tests motion délibérés a
|
||||
révélé :
|
||||
|
||||
```
|
||||
DEBUG cursor: ABS x=61642 y=15564 screen=1280x800
|
||||
DEBUG cursor: ABS x=50174 y=20970 screen=1280x800
|
||||
DEBUG cursor: ABS x=43006 y=23592 screen=1280x800
|
||||
DEBUG cursor: ABS x=42084 y=23918 screen=1280x800
|
||||
```
|
||||
|
||||
Valeurs maximales observĂ©es â 62000 / 24000 sur Ă©cran 1280Ă800, ratio
|
||||
~50à pour x et ~30à pour y. HypothÚse 16-bit confirmée par la doc
|
||||
upstream orbital :
|
||||
|
||||
```
|
||||
// orbital/src/scheme.rs:1576
|
||||
// ps2d gives us absolute mouse events with x and y in the range 0..65535.
|
||||
```
|
||||
|
||||
## Fix
|
||||
|
||||
Conversion fixed-point en pixel via la mĂȘme formule qu'orbital
|
||||
(`orbital/src/scheme.rs:1583-1586`) :
|
||||
|
||||
```rust
|
||||
let scaled_x = ((*x as i64) * (self.screen_w as i64)) / 65536;
|
||||
let scaled_y = ((*y as i64) * (self.screen_h as i64)) / 65536;
|
||||
self.cursor_x = scaled_x as i32;
|
||||
self.cursor_y = scaled_y as i32;
|
||||
self.clamp_cursor(); // garde-fou pour valeurs hors-spec
|
||||
```
|
||||
|
||||
Diviseur `65536` (pas `65535`) volontaire â fixed-point 16-bit, donne
|
||||
`max output = screen - 1` quand `input = 65535`. Cohérent avec
|
||||
l'arithmétique d'orbital.
|
||||
|
||||
Le `clamp_cursor` ajouté en 13.1.b reste utile comme garde-fou (si un
|
||||
device sort de la plage 0..65535) mais ne masque plus le bug principal.
|
||||
|
||||
## Validation runtime
|
||||
|
||||
Test sur Ă©cran 1280Ă800 (fenĂȘtre QEMU graphique, aprĂšs reboot Redox
|
||||
frais). Mouvement délibéré de la souris du coin haut-gauche au coin
|
||||
bas-droit en passant par le centre. Logs filtrés :
|
||||
|
||||
```
|
||||
DEBUG cursor: ABS x=18994 y=19660 â pixel (370,239) screen=1280x800 â haut-gauche
|
||||
DEBUG cursor: ABS x=33176 y=33094 â pixel (647,403) screen=1280x800 â centre
|
||||
DEBUG cursor: ABS x=64560 y=11714 â pixel (1260,142) screen=1280x800 â haut-droit
|
||||
DEBUG cursor: ABS x=37476 y=33176 â pixel (731,404) screen=1280x800 â retour centre
|
||||
```
|
||||
|
||||
Coordonnées pixel cohérentes avec la position physique de la souris,
|
||||
toutes dans la plage `0..1279 Ă 0..799`. Pas de saturation au coin.
|
||||
|
||||
Clics au passage :
|
||||
|
||||
```
|
||||
DEBUG redox_wl_wayland_frontend: left-click @ (522, 303) â hit_test = None
|
||||
DEBUG redox_wl_wayland_frontend: left-click @ (746, 175) â hit_test = None
|
||||
DEBUG redox_wl_wayland_frontend: left-click @ (370, 239) â hit_test = None
|
||||
```
|
||||
|
||||
`hit_test = None` attendu : aucun client n'était lancé pendant ce test.
|
||||
Les coords sont en revanche bien dans l'espace écran et pourront matcher
|
||||
un toplevel quand un client tournera.
|
||||
|
||||
## Bonus DX (developer experience)
|
||||
|
||||
Type pénible de taper `RUST_LOG=info,redox_wl_wayland_frontend::cursor=debug`
|
||||
dans la fenĂȘtre QEMU graphique (pas de copier-coller possible).
|
||||
Modification du filtre par défaut dans `init_tracing` :
|
||||
|
||||
```rust
|
||||
EnvFilter::new("info,cursor=debug")
|
||||
```
|
||||
|
||||
Tu tapes juste `redox-wl-compositor`, tu vois les traces cursor sans
|
||||
spam des ticks. Override toujours possible via `RUST_LOG=` au launch.
|
||||
|
||||
## Sous-bug B.2 (page fault ion) â non traitĂ©
|
||||
|
||||
Reste documenté pour follow-up upstream. Repro fiable :
|
||||
1. Lancer un job background Wayland (`redox-wl-real-client-simple-window &`)
|
||||
2. Tuer le compositor avant que le client n'exit (`Ctrl+Q` sans avoir
|
||||
pressé ESC d'abord)
|
||||
3. ion crashe avec page fault `0x70`
|
||||
|
||||
Ă reporter sur `gitlab.redox-os.org/redox-os/ion`. Hors scope du compositor.
|
||||
|
||||
## CritĂšre de fin 13.1.c
|
||||
|
||||
> Le curseur software du compositor suit fidÚlement les déplacements
|
||||
> souris dans toute l'aire de la fenĂȘtre QEMU graphique, sans saturer
|
||||
> à un bord, sans dérive monotone. Les coordonnées de clic sont dans
|
||||
> la plage écran et `hit_test` peut matcher une surface visible.
|
||||
|
||||
**â
ValidĂ© 2026-05-16.** Conversion HIDâpixel alignĂ©e sur l'algo
|
||||
upstream d'orbital, instrumentation laissée en place pour debug futur.
|
||||
|
||||
## Fichiers modifiés
|
||||
|
||||
```
|
||||
crates/redox-wl-wayland-frontend/src/lib.rs # Conversion 0..65535 â pixels Ă©cran dans PointerMotion
|
||||
# Traces tracing target="cursor"
|
||||
crates/redox-wl-compositor/src/main.rs # Filtre tracing par défaut "info,cursor=debug"
|
||||
docs/phase13-1-c-cursor.md # ce document
|
||||
```
|
||||
|
||||
## Limites connues
|
||||
|
||||
- `PointerMotionRelative` (deltas relatifs) reste instrumenté mais n'a
|
||||
jamais été observé sous QEMU PS/2 + qemu-xhci. Si un jour Redox passe
|
||||
Ă de la souris purement relative, on aura un second `set_screen_size`
|
||||
+ clamp Ă valider.
|
||||
- L'aspect ratio entre l'espace HID 65536ÂČ et l'Ă©cran 1280Ă800 n'est
|
||||
pas carrĂ© (1.6 vs 1) â la prĂ©cision diagonale peut sembler lĂ©gĂšrement
|
||||
décalée. Strictement OK pour 13.1.c, à observer en 13.2+ avec un
|
||||
vrai client graphique qui dessine sous le curseur (drag, drawing).
|
||||
LoadingâŠ
Add table
Add a link
Reference in a new issue