feat(mirada): nmaster, promover a maestra y smart gaps (estilo dwm)
Tanda de funciones de tiling WM, toda pura (mirada-layout/brain), sin tocar el protocolo: - nmaster: LayoutParams.master_count — cuántas ventanas van en el área maestra. MasterStack y CenteredMaster apilan N maestras; sin pila, las maestras llenan la pantalla. Acciones inc-master/dec-master (Super+, Super+.), acotadas 1..9. - Promover a maestra: Workspace::promote_focused lleva la ventana enfocada al puesto 0. Acción promote-to-master (Super+Return). - Smart gaps: una sola ventana se tesela a sangre, sin margen. combo_string del compositor canoniza ahora teclas con nombre (Return, Tab, F5, flechas…) vía xkb::keysym_get_name, no sólo caracteres imprimibles — sin eso Super+Return no sería un atajo expresable. Cableado en keymap por defecto, HUD de mirada y mirada-ctl. Verificado end-to-end con headless-ctl. mirada-layout 26->30, mirada-brain 39->41. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -51,6 +51,11 @@ impl Workspace {
|
||||
self.params.master_ratio = ratio;
|
||||
}
|
||||
|
||||
/// Ajusta cuántas ventanas van en el área maestra (`nmaster`).
|
||||
pub fn set_master_count(&mut self, count: usize) {
|
||||
self.params.master_count = count;
|
||||
}
|
||||
|
||||
/// Añade una ventana y la enfoca. Si ya estaba, sólo la enfoca.
|
||||
pub fn add(&mut self, window: WindowId) {
|
||||
if let Some(i) = self.windows.iter().position(|&w| w == window) {
|
||||
@@ -125,6 +130,17 @@ impl Workspace {
|
||||
}
|
||||
}
|
||||
|
||||
/// Lleva la ventana enfocada al primer puesto del orden de teselado
|
||||
/// (la posición maestra); el foco la acompaña. No hace nada si ya es
|
||||
/// la primera o el escritorio está vacío.
|
||||
pub fn promote_focused(&mut self) {
|
||||
if self.focus > 0 && self.focus < self.windows.len() {
|
||||
let w = self.windows.remove(self.focus);
|
||||
self.windows.insert(0, w);
|
||||
self.focus = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// Resuelve la geometría: el rectángulo de cada ventana dentro de
|
||||
/// `screen`, en orden de teselado.
|
||||
pub fn layout(&self, screen: Rect) -> Vec<(WindowId, Rect)> {
|
||||
@@ -220,6 +236,21 @@ mod tests {
|
||||
assert_eq!(w.windows(), &[1, 2, 3]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn promote_brings_the_focused_window_to_the_front() {
|
||||
let mut w = ws();
|
||||
for id in [1, 2, 3] {
|
||||
w.add(id);
|
||||
}
|
||||
w.focus_window(3);
|
||||
w.promote_focused();
|
||||
assert_eq!(w.windows(), &[3, 1, 2]);
|
||||
assert_eq!(w.focused(), Some(3));
|
||||
// Promover la que ya es maestra no hace nada.
|
||||
w.promote_focused();
|
||||
assert_eq!(w.windows(), &[3, 1, 2]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn layout_pairs_each_window_with_a_rect() {
|
||||
let mut w = ws();
|
||||
|
||||
Reference in New Issue
Block a user