Commit Diff


commit - 7c711b70000038cea46f89bc79cd573274d0db9a
commit + d3ebad2940f5ef2f9c8b31816466ff811717563f
blob - 6db91b424c091f3de637820e0c4f7637c6cf1a1b
blob + 1716f9e51c4c81a7e97e76a3253076b2915f27a7
--- home/ale/niri.kdl
+++ home/ale/niri.kdl
@@ -16,6 +16,17 @@ output "eDP-1" {
     scale 1
 }
 
+// Proyector/TV por HDMI. scale 1 (no el 1.25 que niri autodetecta) para que
+// tenga el MISMO tamaño lógico que eDP-1 -- así el espejo de `present-mirror`
+// (wl-mirror, ver modules/niri.nix) sale 1:1 sin reescalar/emborronar.
+// Posición a la derecha; si querés otra distribución, cambialo desde
+// DMS -> Configuración -> Pantallas (escribe dms/outputs.kdl, incluido más
+// abajo, que gana sobre esto).
+output "HDMI-A-1" {
+    scale 1
+    position x=1920 y=0
+}
+
 // --- Input ---
 input {
     keyboard {
@@ -169,6 +180,10 @@ binds {
     Mod+M { maximize-column; }
     Mod+V { toggle-window-floating; } // el bind que originó toda esta migración
 
+    // Espejar eDP-1 en el proyector HDMI para presentar (script present-mirror
+    // en modules/niri.nix). Volver a pulsar corta el espejo.
+    Mod+Shift+P { spawn "present-mirror"; }
+
     // --- DMS: launcher / control center / settings / lock ---
     // Verbos IPC confirmados contra danklinux.com/docs/dankmaterialshell/keybinds-ipc
     // (lista completa de targets/acciones) y contra distro/nix/niri.nix real
blob - 81884659ed1a6b390cf2a32f319502bed97a3a68
blob + 62656591dcce166728dc61f4f0de25bab3cfce71
--- modules/niri.nix
+++ modules/niri.nix
@@ -61,7 +61,12 @@
           if [ -n "$swaybg_pid" ]; then
             kill "$swaybg_pid" 2>/dev/null || true
           fi
-          ${pkgs.swaybg}/bin/swaybg -o eDP-1 -i "$path" -m fill &
+          # Sin `-o`: swaybg pinta TODAS las salidas conectadas (y las que se
+          # enchufen después) con la misma imagen. Con `-o eDP-1` el monitor
+          # externo por HDMI se quedaba sin fondo -- la superficie propia de
+          # DMS que debería cubrirlo está rota en el escritorio normal (mismo
+          # bug #2299 que motiva este workaround).
+          ${pkgs.swaybg}/bin/swaybg -i "$path" -m fill &
           swaybg_pid=$!
           current="$path"
         fi
@@ -80,6 +85,33 @@
           --include 'session.json' "$statedir" 2>/dev/null || sleep 2
       done
     '')
+
+    # --- Presentar con espejo (proyector) ---
+    # niri NO espeja salidas de forma nativa. wl-mirror captura eDP-1 y la
+    # muestra fullscreen en la pantalla externa: presentás con `slides` (u otra
+    # cosa) mirando el portátil y controlando con el teclado, y el público ve
+    # la misma imagen en el proyector. Funciona con el Kitty Graphics Protocol
+    # del fork de slides (captura a nivel compositor, no del stream de la
+    # terminal -- por eso NO sirve tmux acá). Bind Mod+Shift+P en niri.kdl;
+    # volver a pulsarlo corta el espejo.
+    #
+    # El destino se autodetecta (primera salida conectada que NO sea eDP-1),
+    # así funciona con cualquier proyector/monitor sin importar si el conector
+    # es HDMI-A-1, DP-1 (adaptador USB-C), etc.
+    pkgs.wl-mirror
+    (pkgs.writeShellScriptBin "present-mirror" ''
+      if ${pkgs.procps}/bin/pkill -f 'wl-mirror .*--fullscreen-output'; then
+        exit 0
+      fi
+      target=$(${config.programs.niri.package}/bin/niri msg --json outputs \
+        | ${pkgs.jq}/bin/jq -r 'to_entries[] | select(.key != "eDP-1" and .value.current_mode != null) | .key' \
+        | head -n1)
+      if [ -z "$target" ]; then
+        ${pkgs.libnotify}/bin/notify-send "present-mirror" "No hay pantalla externa conectada" || true
+        exit 1
+      fi
+      exec ${pkgs.wl-mirror}/bin/wl-mirror --fullscreen-output "$target" eDP-1
+    '')
   ];
 
   # --- DankMaterialShell ---