commit d3ebad2940f5ef2f9c8b31816466ff811717563f from: ale date: Sun Aug 30 20:17:02 2026 UTC Espejo de pantalla para presentar (proyector) + fondo en HDMI - modules/niri.nix: wl-mirror + script present-mirror (toggle). Espeja eDP-1 fullscreen en la pantalla externa para presentar con `slides` mirando el portátil mientras el público ve lo mismo. Captura a nivel compositor, así que funciona con el Kitty Graphics Protocol del fork de slides (tmux no sirve, rompe el protocolo). El destino se autodetecta (primera salida conectada que no sea eDP-1): sirve para HDMI-A-1, DP-1, etc. - modules/niri.nix: dms-wallpaper-watch lanza swaybg sin `-o eDP-1`, así pinta el fondo en TODAS las salidas (antes el monitor externo quedaba sin wallpaper). - niri.kdl: output "HDMI-A-1" con scale 1 (mismo tamaño lógico que eDP-1 -> espejo 1:1 nítido) + bind Mod+Shift+P para present-mirror. 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 ---