From 5b674c8ea65a0810120df084213e00f7229d6990 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 17 Oct 2025 07:47:10 +0200 Subject: [PATCH] fix: Notifier centrado correcto en viewport (F3 letterbox) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problema: - Notificaciones se centraban usando dimensión física de ventana - En modo letterbox (F3 INTEGER/LETTERBOX) aparecían en barras negras - Mismo issue que tenía Help Overlay Causa: - notifier.cpp:165 usaba `window_width_` para calcular centrado - En F3 letterbox: viewport visible < ventana física - Ejemplo: ventana 1920px, viewport 1280px con offset 320px - Resultado: notificación descentrada fuera del área visible Solución: - Obtener viewport con SDL_GetRenderViewport() antes de calcular posición - Usar `viewport.w` en lugar de `window_width_` para centrado - Coordenadas relativas al viewport, printAbsolute() aplica offset automáticamente Código modificado: - notifier.cpp:162-170 - Centrado usando viewport dimensions Resultado: ✅ Notificaciones centradas en área visible (viewport) ✅ No aparecen en barras negras en F3 ✅ Funciona correctamente en ventana, F3 y F4 🤖 Generated with Claude Code Co-Authored-By: Claude --- source/ui/notifier.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/source/ui/notifier.cpp b/source/ui/notifier.cpp index a5f8ffc..cea140a 100644 --- a/source/ui/notifier.cpp +++ b/source/ui/notifier.cpp @@ -159,10 +159,14 @@ void Notifier::render() { int bg_width = text_width + (NOTIFICATION_PADDING * 2); int bg_height = text_height + (NOTIFICATION_PADDING * 2); - // Centrar en la ventana FÍSICA (no usar viewport lógico) - // CRÍTICO: Como renderizamos en píxeles físicos absolutos (bypass de presentación lógica), - // debemos centrar usando dimensiones físicas, no el viewport lógico de SDL - int x = (window_width_ / 2) - (bg_width / 2); + // Obtener viewport actual (en modo letterbox F3 tiene dimensiones más pequeñas) + // CRÍTICO: Centrar usando dimensiones del VIEWPORT, no de la ventana física + // printAbsolute() aplicará el offset del viewport automáticamente + SDL_Rect viewport; + SDL_GetRenderViewport(renderer_, &viewport); + + // Centrar en el viewport (coordenadas relativas al viewport, no absolutas) + int x = (viewport.w / 2) - (bg_width / 2); int y = NOTIFICATION_TOP_MARGIN + static_cast(current_notification_->y_offset); // Renderizar fondo semitransparente (con bypass de presentación lógica)