From 24344598e9387716595c95598f1c4caa0888408a Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 15 Aug 2026 19:22:38 +0900 Subject: [PATCH 1/2] fix: prevent black lock screen on dual-GPU system - AQ_DRM_DEVICES=/dev/dri/card0 forces Aquamarine to use only the Intel iGPU, avoiding EGL_BAD_MATCH errors from the NVIDIA RTX 3060 after VT/DPMS cycles (page-flip lockups, black display) - lock.sh: guard against duplicate hyprlock instances (second instance steals surfaces, leaves screen black) - lid-close.sh: same guard for laptop - wake-display.sh: conditional DPMS cycle (only when display is off) to restore hyprlock surfaces without flicker - unstick-display.sh: emergency recovery script for tty3 --- hypr/hypridle.conf | 17 +++++++++++++---- hypr/hyprland.conf | 7 ++++++- hypr/scripts/lid-close.sh | 2 +- hypr/scripts/lock.sh | 4 ++++ hypr/scripts/unstick-display.sh | 25 +++++++++++++++++++++++++ hypr/scripts/wake-display.sh | 20 ++++++++++++++++++++ 6 files changed, 69 insertions(+), 6 deletions(-) create mode 100755 hypr/scripts/unstick-display.sh create mode 100755 hypr/scripts/wake-display.sh diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf index 7651c98..334d8b2 100644 --- a/hypr/hypridle.conf +++ b/hypr/hypridle.conf @@ -2,7 +2,10 @@ general { inhibit_sleep = 3 lock_cmd = pidof hyprlock || ~/.config/hypr/scripts/lock.sh before_sleep_cmd = loginctl lock-session - after_sleep_cmd = hyprctl dispatch dpms on + # Cycle dpms off/on after resume: forces Hyprland to recreate the hyprlock + # surfaces and re-grant them keyboard focus, which is otherwise lost after + # suspend (hyprlock shows the clock but ignores typing until a dpms cycle) + after_sleep_cmd = hyprctl dispatch dpms off && sleep 1 && hyprctl dispatch dpms on } # Step 1: Dim monitor at 115 sec idle (warning that it will lock soon) @@ -33,13 +36,19 @@ listener { # Both together ensure the screen is fully off visually and electrically # When the user becomes active again, restore display - on-resume = hyprctl dispatch dpms on && ddcutil setvcp 10 100 && wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 + # + # Cycles DPMS only if the display was actually turned off (avoids flicker + # when the user returns before step 3 fires). Needed because otherwise + # hyprlock surfaces may lose focus after a dpms off cycle + # (same issue covered in after_sleep_cmd above). + on-resume = ~/.config/hypr/scripts/wake-display.sh # Explanation: - # - hyprctl dispatch dpms on → ensures the display is powered on by the compositor + # - wake-display.sh checks if dpms is off; only then does a dpms off/on + # cycle to force Hyprland to recreate hyprlock surfaces # - ddcutil setvcp 10 100 → restores monitor brightness to full # - # Both together guarantee the screen wakes reliably on all monitors + # Both together guarantee the screen wakes reliably } # Step 4: Suspend system after 30 min idle diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf index 33b22e1..e1e9037 100644 --- a/hypr/hyprland.conf +++ b/hypr/hyprland.conf @@ -15,6 +15,11 @@ env = HYPRCURSOR_SIZE,24 env = QT_QPA_PLATFORMTHEME,qt5ct env = HYPRSHOT_DIR,Screenshots +# Force Aquamarine to use only the Intel iGPU for display. +# The NVIDIA RTX 3060 is also present but causes EGL_BAD_MATCH errors and page-flip +# lockups after VT/DPMS cycles (multi-GPU buffer ownership fights). +env = AQ_DRM_DEVICES,/dev/dri/card0 + ################ ### MONITORS ### ################ @@ -187,7 +192,7 @@ input { kb_layout = us,se,kr kb_variant = dvorak,dvorak, kb_model = - kb_options = grp:win_space_toggle,grp:alt_r_toggle + kb_options = grp:win_space_toggle,grp:toggle kb_rules = follow_mouse = 0 diff --git a/hypr/scripts/lid-close.sh b/hypr/scripts/lid-close.sh index c27238b..e728bbd 100755 --- a/hypr/scripts/lid-close.sh +++ b/hypr/scripts/lid-close.sh @@ -2,7 +2,7 @@ pkill -x dim hyprctl switchxkblayout all 0 wpctl set-mute @DEFAULT_AUDIO_SINK@ 1 -hyprlock --no-fade-in & +pidof hyprlock || hyprlock --no-fade-in & hyprctl dispatch dpms off wait wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 diff --git a/hypr/scripts/lock.sh b/hypr/scripts/lock.sh index af3fe06..9e6c744 100755 --- a/hypr/scripts/lock.sh +++ b/hypr/scripts/lock.sh @@ -1,4 +1,8 @@ #!/bin/bash + +# Prevent multiple hyprlock instances (second instance breaks the lock screen) +pidof hyprlock && exit 0 + hyprctl switchxkblayout all 0 fcitx5-remote -s keyboard-us-dvorak wpctl set-mute @DEFAULT_AUDIO_SINK@ 1 diff --git a/hypr/scripts/unstick-display.sh b/hypr/scripts/unstick-display.sh new file mode 100755 index 0000000..67db667 --- /dev/null +++ b/hypr/scripts/unstick-display.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Recovery script for when Hyprland display goes black after lock/sleep. +# This resets the display pipeline without killing your session. +# Run from another TTY (Ctrl+Alt+F3). + +export XDG_RUNTIME_DIR=/run/user/$(id -u) + +# Find the Hyprland instance signature from the socket directory +SIGNATURE=$(ls "$XDG_RUNTIME_DIR/hypr/" 2>/dev/null | head -1) + +if [ -z "$SIGNATURE" ]; then + echo "Could not find Hyprland socket. Is Hyprland running?" + exit 1 +fi + +export HYPRLAND_INSTANCE_SIGNATURE=$SIGNATURE + +echo "Resetting display pipeline..." + +pkill hyprlock 2>/dev/null +hyprctl dispatch dpms off +sleep 1 +hyprctl dispatch dpms on + +echo "Done. Switch back to Hyprland (Ctrl+Alt+F2)." diff --git a/hypr/scripts/wake-display.sh b/hypr/scripts/wake-display.sh new file mode 100755 index 0000000..3bd789e --- /dev/null +++ b/hypr/scripts/wake-display.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# hypridle step 3 on-resume — wake display after idle off. +# Cycles DPMS only if the display was actually turned off (avoids flicker +# when the user returns before step 3 fires). + +SIGNATURE=$(ls "$XDG_RUNTIME_DIR/hypr/" 2>/dev/null | head -1) +export HYPRLAND_INSTANCE_SIGNATURE=$SIGNATURE +export XDG_RUNTIME_DIR=/run/user/$(id -u) + +DPMS=$(hyprctl monitors 2>/dev/null | grep dpmsStatus | awk '{print $2}') + +if [ "$DPMS" = "0" ]; then + # Display was off — cycle DPMS to force re-creation of hyprlock surfaces + hyprctl dispatch dpms off + sleep 1 +fi + +hyprctl dispatch dpms on +ddcutil setvcp 10 100 +wpctl set-mute @DEFAULT_AUDIO_SINK@ 0 From 4e8a6fad37cf5df28bff8987e26b8dfacb6bf450 Mon Sep 17 00:00:00 2001 From: Jeena Date: Sat, 15 Aug 2026 19:22:41 +0900 Subject: [PATCH 2/2] chore: update fcitx5 config --- fcitx5/conf/cached_layouts | 20 ++++++++++++++++++++ fcitx5/conf/notifications.conf | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/fcitx5/conf/cached_layouts b/fcitx5/conf/cached_layouts index 31f4ab3..2b83c26 100644 --- a/fcitx5/conf/cached_layouts +++ b/fcitx5/conf/cached_layouts @@ -413,6 +413,11 @@ Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, IBM/Lenovo Thi Language=pt Label="br (thinkpad)" +[keyboard-br-thinkpad_nodeadkeys] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, IBM/Lenovo ThinkPad, no dead keys)" +Language=pt +Label="br (thinkpad_nodeadkeys)" + [keyboard-br-nativo-epo] Description="Keyboard - Portuguese (Brazil) - Esperanto (Brazil, Nativo)" Language=eo @@ -528,6 +533,11 @@ Description="Keyboard - Polish - Polish (Colemak-DH ISO)" Language=pl Label="pl (colemak_dh)" +[keyboard-pl-colemak_dh_ortho] +Description="Keyboard - Polish - Polish (Colemak-DH Ortholinear)" +Language=pl +Label="pl (colemak_dh_ortho)" + [keyboard-pl-sun_type6] Description="Keyboard - Polish - Polish (Sun Type 6/7)" Language=pl @@ -1483,6 +1493,11 @@ Description="Keyboard - Burmese - Burmese (Zawgyi)" Language=my Label="my-zwg (zawgyi)" +[keyboard-mm-mara] +Description="Keyboard - Burmese - Mara" +Language=mrh +Label="mrh (mara)" + [keyboard-mm-mnw] Description="Keyboard - Burmese - Mon" Language=mnw @@ -3508,6 +3523,11 @@ Description="Keyboard - Indian - Malayalam (Poorna, extended InScript)" Language=ml Label="ml (mal_poorna)" +[keyboard-in-mara] +Description="Keyboard - Indian - Mara" +Language=mrh +Label="mrh (mara)" + [keyboard-in-mni] Description="Keyboard - Indian - Manipuri (Meitei)" Language=mni diff --git a/fcitx5/conf/notifications.conf b/fcitx5/conf/notifications.conf index 6e7d1b9..774de37 100644 --- a/fcitx5/conf/notifications.conf +++ b/fcitx5/conf/notifications.conf @@ -1,3 +1,3 @@ -# Hidden Notifications -HiddenNotifications= +[HiddenNotifications] +0=wayland-diagnose-other