feat(mirada): mover/redimensionar ventanas con el ratón
`Super`+arrastre interactivo en el backend DRM: botón izquierdo mueve
la ventana, botón derecho la redimensiona. Al arrastrarla, la ventana
pasa a flotar — comportamiento estilo dwm.
La verdad geométrica vive en el Cerebro, así que el arrastre viaja
hasta él:
- `mirada-protocol`: nuevo `BodyEvent::WindowFloatTo { id, rect }`.
- `mirada-brain`: `Desktop::on_event` lo atiende — busca el escritorio
de la ventana y la hace flotar en ese rectángulo
(`Workspace::set_floating`). Dos tests nuevos.
- `mirada-compositor`: `DragGrab`/`DragMode` en `App`; `handle_input`
arranca el arrastre con `Super`+botón sobre una ventana
(`keyboard.modifier_state().logo`), traga los botones mientras dura y
lo cierra al soltar. `drag_update` recalcula el rectángulo (mover =
esquina sigue al puntero; redimensionar = esquina inferior-derecha,
con un mínimo de 120 px) y emite `WindowFloatTo`. Durante el arrastre
el puntero no llega al cliente.
De paso, arregla un test de `mirada-link` que construía un
`WindowPlacement` sin los campos `floating`/`fullscreen`.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -101,6 +101,27 @@ struct ManagedWindow {
|
||||
floating: bool,
|
||||
}
|
||||
|
||||
/// Un arrastre de ratón en curso: mueve o redimensiona una ventana.
|
||||
struct DragGrab {
|
||||
/// La ventana que se arrastra.
|
||||
id: u64,
|
||||
/// Mover (`Super`+botón izquierdo) o redimensionar (`Super`+derecho).
|
||||
mode: DragMode,
|
||||
/// Posición del puntero al empezar el arrastre.
|
||||
start_pointer: (f64, f64),
|
||||
/// Rectángulo `(x, y, w, h)` de la ventana al empezar.
|
||||
start_rect: (i32, i32, i32, i32),
|
||||
}
|
||||
|
||||
/// Qué le hace un arrastre a la ventana.
|
||||
#[derive(Clone, Copy)]
|
||||
enum DragMode {
|
||||
/// Reubicar la ventana — la esquina la sigue al puntero.
|
||||
Move,
|
||||
/// Redimensionarla — la esquina inferior-derecha sigue al puntero.
|
||||
Resize,
|
||||
}
|
||||
|
||||
/// El estado global del compositor.
|
||||
struct App {
|
||||
compositor_state: CompositorState,
|
||||
@@ -113,6 +134,8 @@ struct App {
|
||||
pointer: Option<PointerHandle<Self>>,
|
||||
/// Posición del puntero en coordenadas globales.
|
||||
pointer_loc: (f64, f64),
|
||||
/// Arrastre de ventana en curso (mover o redimensionar con el ratón).
|
||||
drag: Option<DragGrab>,
|
||||
|
||||
/// Ventanas gestionadas, en orden de aparición.
|
||||
windows: Vec<ManagedWindow>,
|
||||
@@ -673,6 +696,7 @@ fn build_app() -> Result<Setup, Box<dyn std::error::Error>> {
|
||||
keyboard: None,
|
||||
pointer: None,
|
||||
pointer_loc: (0.0, 0.0),
|
||||
drag: None,
|
||||
windows: Vec::new(),
|
||||
body: BodyState::new(),
|
||||
brain,
|
||||
|
||||
Reference in New Issue
Block a user