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:
@@ -403,12 +403,13 @@ fn combo_string(mods: &ModifiersState, sym: Keysym) -> Option<String> {
|
||||
let name = if key == " " {
|
||||
"space".to_string()
|
||||
} else {
|
||||
// ¿Es un único carácter imprimible? Entonces la tecla es ese carácter.
|
||||
let mut chars = key.chars();
|
||||
let c = chars.next()?;
|
||||
if chars.next().is_some() || !c.is_ascii_graphic() {
|
||||
return None;
|
||||
match (chars.next(), chars.next()) {
|
||||
(Some(c), None) if c.is_ascii_graphic() => c.to_ascii_lowercase().to_string(),
|
||||
// Si no, una tecla con nombre: Return, Tab, Up, F5…
|
||||
_ => named_key(sym)?,
|
||||
}
|
||||
c.to_ascii_lowercase().to_string()
|
||||
};
|
||||
let mut combo = String::new();
|
||||
if mods.logo {
|
||||
@@ -427,6 +428,17 @@ fn combo_string(mods: &ModifiersState, sym: Keysym) -> Option<String> {
|
||||
Some(combo)
|
||||
}
|
||||
|
||||
/// El nombre canónico de una tecla especial — `Return`, `Tab`, `Up`,
|
||||
/// `F5`… `None` si xkb no le da un nombre razonable.
|
||||
fn named_key(sym: Keysym) -> Option<String> {
|
||||
let name = xkb::keysym_get_name(sym);
|
||||
if name.is_empty() || name == "NoSymbol" || name.starts_with("0x") {
|
||||
None
|
||||
} else {
|
||||
Some(name)
|
||||
}
|
||||
}
|
||||
|
||||
/// Despacha los callbacks de frame de un árbol de superficies: avisa a
|
||||
/// cada cliente de que puede dibujar el siguiente cuadro.
|
||||
fn send_frames_surface_tree(surface: &WlSurface, time: u32) {
|
||||
|
||||
Reference in New Issue
Block a user