Bitácora
← Blog

Arreglar los menús contextuales de DaVinci Resolve en Hyprland

Arreglar los menús contextuales de DaVinci Resolve en Hyprland

En mi equipo, los menús contextuales y ventanas de diálogo de DaVinci Resolve no respondían al clic del ratón. Al hacer clic derecho sobre un clip, o al abrir Normalize Audio o Render, el menú aparecía pero ningún clic seleccionaba nada. Lo curioso: con las flechas ↑/↓ del teclado sí funcionaba.

No era un ratón roto ni un fallo de Resolve en sí, sino un problema conocido entre DaVinci Resolve (cliente XWayland/Qt) y Hyprland.

El síntoma

Acción Resultado
Clic en una opción del menú contextual ❌ No hace nada
Clic en los botones de un diálogo ❌ No hace nada
Flechas ↑/↓ + Enter ✅ Funciona

Aquí las flechas sí funcionan porque Xwayland mantiene un grab de teclado, pero no de puntero.

La causa

Los menús y diálogos de Resolve son ventanas flotantes transitorias. Al abrirse, pierden el foco, y si la ventana no tiene el foco, Hyprland no le entrega los eventos del ratón. Por eso el teclado responde (va al grab de X) pero el puntero no.

La solución: forzar el foco con stayfocused

Hyprland permite aplicar reglas de ventana por clase o etiqueta. La solución de la comunidad (foros de Blackmagic, Omarchy) es:

  1. Etiquetar las ventanas flotantes de Resolve.
  2. Aplicarles stayfocused, que fuerza el foco mientras la ventana esté visible.

Config en formato Lua (hyprland.lua)

Mi configuración usa el formato Lua nativo de Hyprland (0.55+), donde las reglas se declaran con hl.window_rule({ ... }). Añadí esto:

-- DaVinci Resolve (XWayland): sus menús contextuales y diálogos flotantes
-- pierden el foco al abrirse, por lo que el clic del ratón no los registra
-- (solo responden las flechas arriba/abajo). Se etiquetan y se fuerza el
-- foco con "stayfocused" para que el puntero vuelva a funcionar.
hl.window_rule({
    name  = "resolve-popup-tag",
    match = { class = "^(resolve)$", float = true },
    tag   = "+drpopup",
})

hl.window_rule({
    name         = "resolve-popup-focus",
    match        = { tag = "drpopup" },
    stay_focused = true,
    border_size  = 0,
    no_shadow    = true,
    rounding     = 0,
    opaque       = true,
})

⚠️ En la API Lua no existe el efecto no_border. Para quitar el borde se usa border_size = 0.

Equivalente en el formato antiguo (hyprland.conf)

Si usas hyprlang en lugar de Lua:

windowrulev2 = tag +drpopup, class:^(resolve)$, floating:1
windowrulev2 = stayfocused, tag:drpopup

Aplicar los cambios

hyprctl reload

Comprobar que las ventanas de Resolve siguen intactas (la principal debe seguir en tiling y sin etiquetas):

hyprctl -j clients | grep -i resolve

Si aún no funciona

Dos ajustes de respaldo, también en Hyprland:

Entorno donde lo probé

Nota: por si te lo encuentras, hay un problema distinto de menús en Hyprland relacionado con tablets gráficas (issue #3004); este no era el caso.

Conclusión

El ratón “no funcionaba” en Resolve porque los popups perdían el foco al abrirse. Con una etiqueta y stayfocused vuelven a recibir los clics, sin tocar nada de Resolve. Es una de esas correcciones que se hacen una vez en la config del compositor y te olvidas del problema.