feat(mirada): multi-monitor real — cada salida tesela su escritorio
El Desktop deja de teselar sólo la salida primaria. Cada Output muestra
un escritorio virtual distinto y relayout() las tesela todas en un solo
Place que cubre todas las pantallas.
- Output { id, rect, workspace }; focused_output reemplaza al índice
global active. active_index() = el escritorio de la salida enfocada.
- OutputAdded asigna el primer escritorio libre; OutputRemoved deja sus
ventanas en su escritorio y reajusta el foco. reflow_outputs() las
recoloca en fila.
- SwitchWorkspace actúa sobre la salida enfocada; si el escritorio
pedido ya lo muestra otra salida, las intercambia (invariante: un
escritorio se ve en una salida como mucho).
- DesktopAction::FocusOutputNext (Super+o) mueve el foco entre
monitores. El foco del teclado es único — relayout() lo unifica a la
ventana enfocada de la salida enfocada.
Verificado end-to-end con headless-ctl (ahora 2 salidas).
mirada-brain 52->58 tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -29,9 +29,10 @@ fn main() {
|
||||
};
|
||||
eprintln!("Cerebro headless · control en {}", path.display());
|
||||
|
||||
// Una pantalla y tres ventanas de muestra.
|
||||
// Dos pantallas y tres ventanas de muestra.
|
||||
let mut desktop = Desktop::new();
|
||||
desktop.on_event(BodyEvent::OutputAdded { id: 0, width: 1920, height: 1080 });
|
||||
desktop.on_event(BodyEvent::OutputAdded { id: 1, width: 1920, height: 1080 });
|
||||
for id in 1..=3 {
|
||||
desktop.on_event(BodyEvent::WindowOpened {
|
||||
id,
|
||||
@@ -93,10 +94,21 @@ fn main() {
|
||||
fn print_state(d: &Desktop) {
|
||||
let ws = d.active_workspace();
|
||||
eprintln!(
|
||||
" escritorio {} · {:?} (maestra {:.0}%) · foco {:?}",
|
||||
" activo: escritorio {} · {:?} (maestra {:.0}%) · foco {:?}",
|
||||
d.active_index() + 1,
|
||||
ws.params().mode,
|
||||
ws.params().master_ratio * 100.0,
|
||||
d.focused_window(),
|
||||
);
|
||||
for (i, o) in d.outputs().iter().enumerate() {
|
||||
let mark = if i == d.focused_output() { '*' } else { ' ' };
|
||||
eprintln!(
|
||||
" {mark} salida {} {}×{} @ x{} → escritorio {}",
|
||||
o.id,
|
||||
o.rect.w,
|
||||
o.rect.h,
|
||||
o.rect.x,
|
||||
o.workspace + 1,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user