From 7a5cc562448d1f5688a6cbe387a39a34c0834558 Mon Sep 17 00:00:00 2001 From: Uyanide Date: Mon, 9 Feb 2026 07:26:58 +0100 Subject: [PATCH] fix: kitty #9416 --- config/niri/.config/niri/config/misc.kdl | 2 +- config/scripts/.local/scripts/fzfclip | 329 +++++++++--------- config/scripts/.local/scripts/graphics-query | 37 +- .../scripts/.local/scripts/hypr-sdrbrightness | 43 --- config/scripts/.local/scripts/rofi-emoji | 4 +- config/scripts/.local/scripts/truecolor-test | 2 +- config/scripts/.local/scripts/xdph-nuclear | 13 - config/shell/.config/fish/conf.d/.gitignore | 1 + .../shell/.config/fish/conf.d/10-kitty.fish | 5 + memo/kvm-virtio-accel3D.md | 4 +- 10 files changed, 190 insertions(+), 250 deletions(-) delete mode 100755 config/scripts/.local/scripts/hypr-sdrbrightness delete mode 100755 config/scripts/.local/scripts/xdph-nuclear create mode 100644 config/shell/.config/fish/conf.d/10-kitty.fish diff --git a/config/niri/.config/niri/config/misc.kdl b/config/niri/.config/niri/config/misc.kdl index db5af45..8c18b91 100644 --- a/config/niri/.config/niri/config/misc.kdl +++ b/config/niri/.config/niri/config/misc.kdl @@ -1,7 +1,7 @@ screenshot-path "~/Pictures/Screenshots/niri_screenshot_%Y-%m-%d_%H-%M-%S.png" debug { - render-drm-device "/dev/dri/renderD128" + render-drm-device "/dev/dri/renderD129" } // gestures { diff --git a/config/scripts/.local/scripts/fzfclip b/config/scripts/.local/scripts/fzfclip index b250484..1d93a4e 100755 --- a/config/scripts/.local/scripts/fzfclip +++ b/config/scripts/.local/scripts/fzfclip @@ -3,17 +3,17 @@ # Description: # View and manage clipboard history using fzf, with support for -# image previews in compatible terminals. +# image preview in compatible terminals. # Requirements: # - cliphist # - wl-clipboard # - fzf -# - sixel-query & kgp-query from this repository -# - chafa (for image previews) +# - sixel-query, kgp-query, iterm2-query from this repository +# - chafa (for image preview) # - ffmpegthumbnailer (optional, for video thumbnails) # Credits: # - Original idea and some code adapted from https://github.com/SHORiN-KiWATA/shorinclip -# LICENSE: +# License: # # MIT License # # # # Copyright (c) 2026 shorinkiwata @@ -50,26 +50,26 @@ export C_RESET='\x1b[0m' # Check for terminal graphics support and set environment variables accordingly _check_kitty_icat() { - # workaround for WezTerm - if [ -n "${WEZTERM_EXECUTABLE:-}" ]; then - return 1 - fi - kgp-query + # workaround for WezTerm + if [ -n "${WEZTERM_EXECUTABLE:-}" ]; then + return 1 + fi + kgp-query } _check_sixel() { - # workaround for Zellij - if [ -n "${ZELLIJ_SESSION_NAME:-}" ]; then - return 1 - # same for tmux, unless otherwise configured - elif [ -n "${TMUX:-}" ]; then - return 1 - fi - sixel-query + # workaround for Zellij + if [ -n "${ZELLIJ_SESSION_NAME:-}" ]; then + return 1 + # same for tmux, unless otherwise configured + elif [ -n "${TMUX:-}" ]; then + return 1 + fi + sixel-query } _check_iterm2() { - iterm2-query + iterm2-query } ENABLE_ICAT=0 @@ -78,11 +78,11 @@ ENABLE_ITERM2=0 # Priority: KGP > sixel > iterm2 if _check_kitty_icat; then - export ENABLE_ICAT=1 + export ENABLE_ICAT=1 elif _check_sixel; then - export ENABLE_SIXEL=1 + export ENABLE_SIXEL=1 elif _check_iterm2; then - export ENABLE_ITERM2=1 + export ENABLE_ITERM2=1 fi export ENABLE_ICAT @@ -92,170 +92,170 @@ export ENABLE_ITERM2 # Preview functions _preview_image() { - local file="$1" - if [ "$ENABLE_ICAT" -eq 1 ]; then - printf "\x1b_Ga=d\x1b\\" - chafa -f kitty --animate=off --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" - elif [ "$ENABLE_SIXEL" -eq 1 ]; then - chafa -f sixels --animate=off --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" - elif [ "$ENABLE_ITERM2" -eq 1 ]; then - chafa -f iterm2 --animate=off --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" - else - chafa -f symbols --animate=off --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" - fi + local file="$1" + if [ "$ENABLE_ICAT" -eq 1 ]; then + printf "\x1b_Ga=d\x1b\\" + chafa -f kitty --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" + elif [ "$ENABLE_SIXEL" -eq 1 ]; then + chafa -f sixels --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" + elif [ "$ENABLE_ITERM2" -eq 1 ]; then + chafa -f iterm2 -size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" + else + chafa -f symbols --size="${FZF_PREVIEW_COLUMNS}x${FZF_PREVIEW_LINES}" "$file" + fi } export -f _preview_image _preview_text() { - local content="$1" - if [ "$ENABLE_ICAT" -eq 1 ]; then - printf "\x1b_Ga=d\x1b\\" - fi - echo "$content" | head -n 100 + local content="$1" + if [ "$ENABLE_ICAT" -eq 1 ]; then + printf "\x1b_Ga=d\x1b\\" + fi + echo "$content" | head -n 100 } export -f _preview_text _preview_file() { - path="$1" - path_mime=$(file -b --mime-type "$path") - if [[ $path_mime =~ image ]]; then - _preview_image "$path" - elif [[ "$path_mime" =~ video ]]; then - video_hash=$(echo "$path" | md5sum | cut -d" " -f1) - thumb_file="$CACHE_DIR/$video_hash.png" - if [ ! -f "$thumb_file" ]; then - if command -v ffmpegthumbnailer &>/dev/null;then - ffmpegthumbnailer -i "$path" -o "$thumb_file" -s 480 -t 0 >/dev/null 2>&1 - else - _preview_text "ffmpegthumbnailer not installed, cannot generate thumbnail for video." - fi - fi - if [ -s "$thumb_file" ]; then - _preview_image "$thumb_file" - else - _preview_text "Video: $path (No thumbnail)" - fi - else - _preview_text "$path" - fi + path="$1" + path_mime=$(file -b --mime-type "$path") + if [[ $path_mime =~ image ]]; then + _preview_image "$path" + elif [[ "$path_mime" =~ video ]]; then + video_hash=$(echo "$path" | md5sum | cut -d" " -f1) + thumb_file="$CACHE_DIR/$video_hash.png" + if [ ! -f "$thumb_file" ]; then + if command -v ffmpegthumbnailer &>/dev/null; then + ffmpegthumbnailer -i "$path" -o "$thumb_file" -s 480 -t 0 >/dev/null 2>&1 + else + _preview_text "ffmpegthumbnailer not installed, cannot generate thumbnail for video." + fi + fi + if [ -s "$thumb_file" ]; then + _preview_image "$thumb_file" + else + _preview_text "Video: $path (No thumbnail)" + fi + else + _preview_text "$path" + fi } export -f _preview_file preview() { - entry="$1" + entry="$1" - content=$(echo "$entry" | cut -f2-) - mimeType=$(echo "$entry" | cliphist decode | file -b --mime-type -) - ext=$(echo "$mimeType" | awk -F"/" "{print \$2}") + content=$(echo "$entry" | cut -f2-) + mimeType=$(echo "$entry" | cliphist decode | file -b --mime-type -) + ext=$(echo "$mimeType" | awk -F"/" "{print \$2}") - if [[ $mimeType =~ image ]]; then - img_hash=$(echo "$entry" | cliphist decode | md5sum | cut -d" " -f1) - cache_file="$CACHE_DIR/$img_hash.$ext" - [ -f "$cache_file" ] || echo "$entry" | cliphist decode > "$cache_file" - _preview_image "$cache_file" + if [[ $mimeType =~ image ]]; then + img_hash=$(echo "$entry" | cliphist decode | md5sum | cut -d" " -f1) + cache_file="$CACHE_DIR/$img_hash.$ext" + [ -f "$cache_file" ] || echo "$entry" | cliphist decode >"$cache_file" + _preview_image "$cache_file" - elif [ "$mimeType" = "text/html" ] && echo "$content" | grep -q QQ; then - qq_img_file=$(echo "$entry" | cliphist decode | grep -oP "^/dev/null' EXIT wait_timeout=50 while [[ $(tput cols) -lt 35 || $(tput lines) -lt 25 ]]; do - printf "\rWaiting for terminal size at least 35x25... %d" "$wait_timeout" - sleep 1 - ((wait_timeout--)) - [ "$wait_timeout" -eq 0 ] && exit 1 + printf "\rWaiting for terminal size at least 35x25... %d" "$wait_timeout" + sleep 1 + ((wait_timeout--)) + [ "$wait_timeout" -eq 0 ] && exit 1 done cliphist list | format_clip_list | add_num | fzf \ - --ansi \ - --listen "$FZF_PORT" \ - --bind "ctrl-r:reload($RELOAD_CMD)" \ - --bind "ctrl-x:execute-silent(bash -c 'cliphist delete <<< \"\$1\"' -- {})+reload($RELOAD_CMD)" \ - --prompt="󰅍 > " \ - --header='CTRL-X: Delete | CTRL-R: Reload | ENTER: Paste' \ - --color='header:italic:yellow,prompt:blue,pointer:blue' \ - --info=hidden \ - --no-sort \ - --layout=reverse \ - --with-nth 2.. \ - --delimiter '\t' \ - --preview-window=down:60%,wrap \ - --preview "preview {}" \ - --bind "enter:execute-silent(bash -c 'copy_selection \"\$1\"' -- {})+accept" - + --ansi \ + --listen "$FZF_PORT" \ + --bind "ctrl-r:reload($RELOAD_CMD)" \ + --bind "ctrl-x:execute-silent(bash -c 'cliphist delete <<< \"\$1\"' -- {})+reload($RELOAD_CMD)" \ + --prompt="󰅍 > " \ + --header='CTRL-X: Delete | CTRL-R: Reload | ENTER: Paste' \ + --color='header:italic:yellow,prompt:blue,pointer:blue' \ + --info=hidden \ + --no-sort \ + --layout=reverse \ + --with-nth 2.. \ + --delimiter '\t' \ + --preview-window=down:60%,wrap \ + --preview "preview {}" \ + --bind "enter:execute-silent(bash -c 'copy_selection \"\$1\"' -- {})+accept" diff --git a/config/scripts/.local/scripts/graphics-query b/config/scripts/.local/scripts/graphics-query index a6a623b..8eb7fac 100755 --- a/config/scripts/.local/scripts/graphics-query +++ b/config/scripts/.local/scripts/graphics-query @@ -1,24 +1,20 @@ #!/usr/bin/env bash # Description: -# Query terminal capabilities for graphics support, including: -# - Kitty Graphics Protocol (KGP) -# - iTerm2 inline images -# - Sixel graphics -# This script will print three lines of output: -# SUPPORT_KGP=1 or 0 -# SUPPORT_ITERM2=1 or 0 -# SUPPORT_SIXEL=1 or 0 +# Query terminal capabilities for graphics support using escape sequences, +# without relying on environment variables or external tools. # # Usage: +# This script will print 1 or more of the following strings to stdout, depending +# on the detected capabilities: +# - "kitty" if Kitty's terminal Graphics Protocol is supported +# - "iterm" if iTerm2's inline image support is detected +# - "sixels" if Sixel graphics support is detected # Do NOT source this script directly, as it will modify the terminal state # and print its result directly to stdout. -# Instead, use command substitution to capture the output, for example: -# eval "$(graphics-query)" -# or parse the output manually. # # See also: -# - kgp-query: specifically checks for Kitty Graphics Protocol support +# - kgp-query: specifically checks for Kitty's terminal Graphics Protocol support # - iterm2-query: specifically checks for iTerm2 inline image support # - sixel-query: specifically checks for Sixel graphics support @@ -43,9 +39,11 @@ stty -echo -icanon min 1 time 0 printf "%s%s%s" "$ITERM2_QUERY_CODE" "$KGP_QUERY_CODE" "$FENCE_CODE" > /dev/tty -response="" support_kgp=0 support_iterm2=0 +support_sixel=0 + +response="" while true; do IFS= read -r -N 1 -t 0.3 char || { [ -z "$char" ] && break @@ -70,7 +68,6 @@ while true; do fi done -support_sixel=0 if [[ "$response" =~ $'\x1b'\[\?([0-9;]*)c ]]; then params="${BASH_REMATCH[1]}" @@ -85,19 +82,13 @@ if [[ "$response" =~ $'\x1b'\[\?([0-9;]*)c ]]; then fi if [ "$support_kgp" -eq 1 ]; then - echo "SUPPORT_KGP=1" -else - echo "SUPPORT_KGP=0" + echo "kitty" fi if [ "$support_iterm2" -eq 1 ]; then - echo "SUPPORT_ITERM2=1" -else - echo "SUPPORT_ITERM2=0" + echo "iterm" fi if [ "$support_sixel" -eq 1 ]; then - echo "SUPPORT_SIXEL=1" -else - echo "SUPPORT_SIXEL=0" + echo "sixels" fi diff --git a/config/scripts/.local/scripts/hypr-sdrbrightness b/config/scripts/.local/scripts/hypr-sdrbrightness deleted file mode 100755 index 8dbd354..0000000 --- a/config/scripts/.local/scripts/hypr-sdrbrightness +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# Description: -# Adjust the SDR brightness setting in Hyprland's monitor configuration file. -# Useful for adjusting brightness when HDR is enabled. - -import sys -import os - -if __name__ == "__main__": - if len(sys.argv) != 2: - new_brightness = 1 - else: - try: - new_brightness = float(sys.argv[1]) - if new_brightness < 1 or new_brightness > 1.5: - raise ValueError() - except Exception as e: - new_brightness = 1 - - print(f"Setting SDR brightness to: {new_brightness}\n") - - config_path = os.path.expanduser("~/.config/hypr/hyprland/monitors.conf") - if not os.path.exists(config_path): - print(f"Configuration file {config_path} does not exist.") - sys.exit(1) - - with open(config_path, 'r') as file: - lines = file.readlines() - for line in lines: - if "sdrbrightness" in line: - old_line = line.strip() - new_line = f" sdrbrightness = {new_brightness}\n" - lines[lines.index(line)] = new_line - print(f"Updated: {old_line} to {new_line.strip()}\n") - break - - with open(config_path, 'w') as file: - file.writelines(lines) - - print(f"New {config_path} content: \n") - with open(config_path, 'r') as file: - print(file.read()) diff --git a/config/scripts/.local/scripts/rofi-emoji b/config/scripts/.local/scripts/rofi-emoji index 5394400..715e52c 100755 --- a/config/scripts/.local/scripts/rofi-emoji +++ b/config/scripts/.local/scripts/rofi-emoji @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Description: # Quick snippet for rofi + emoji + wl-copy @@ -1887,4 +1887,4 @@ AH↗️HA↘️HA↗️HA↘️HA↗️HA↘️HA↗️HA↘️ pekora arrows h 🔀 git commit message merge 🔖 git commit message release ⬆️ git commit message upgrade -⬇️ git commit message downgrade \ No newline at end of file +⬇️ git commit message downgrade diff --git a/config/scripts/.local/scripts/truecolor-test b/config/scripts/.local/scripts/truecolor-test index 9735442..c6e0202 100755 --- a/config/scripts/.local/scripts/truecolor-test +++ b/config/scripts/.local/scripts/truecolor-test @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Based on: https://gist.github.com/XVilka/8346728 awk -v term_cols="${width:-$(tput cols || echo 80)}" 'BEGIN{ diff --git a/config/scripts/.local/scripts/xdph-nuclear b/config/scripts/.local/scripts/xdph-nuclear deleted file mode 100755 index 4c12c58..0000000 --- a/config/scripts/.local/scripts/xdph-nuclear +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# Description: -# Restart xdg-desktop-portal and xdg-desktop-portal-hyprland to fix screen sharing issues. -# From hyprland documentation. - -sleep 1 -killall -e xdg-desktop-portal-hyprland -killall -e xdg-desktop-portal-wlr -killall xdg-desktop-portal -/usr/lib/xdg-desktop-portal-hyprland -v & -sleep 2 -/usr/lib/xdg-desktop-portal & diff --git a/config/shell/.config/fish/conf.d/.gitignore b/config/shell/.config/fish/conf.d/.gitignore index 8d13d63..6de1e5b 100644 --- a/config/shell/.config/fish/conf.d/.gitignore +++ b/config/shell/.config/fish/conf.d/.gitignore @@ -2,6 +2,7 @@ !.gitignore !05-done.fish !10-env.fish +!10-kitty.fish !10-niri-env.fish !10-sshs.fish !50-prompt.fish diff --git a/config/shell/.config/fish/conf.d/10-kitty.fish b/config/shell/.config/fish/conf.d/10-kitty.fish new file mode 100644 index 0000000..2a84d3b --- /dev/null +++ b/config/shell/.config/fish/conf.d/10-kitty.fish @@ -0,0 +1,5 @@ +# Workaround: https://github.com/kovidgoyal/kitty/issues/9416 +if test "$TERM" = "xterm-kitty"; and kitty --version | grep -q "0.45.0" + set -xg TERM "xterm-256color" + set -xg TERMINFO "/usr/share/terminfo" +end diff --git a/memo/kvm-virtio-accel3D.md b/memo/kvm-virtio-accel3D.md index 985bdc0..e1fcc64 100644 --- a/memo/kvm-virtio-accel3D.md +++ b/memo/kvm-virtio-accel3D.md @@ -1,3 +1,5 @@ +> 本篇内容**完全**由 Gemini 生成,虽未验证其准确性,但确实能工作,遂记录于此。 + 这是一个关于 **Linux (Arch) 宿主机** + **Linux (Gentoo) 客户机** 在 KVM/QEMU 环境下启用 **Virtio-GPU 3D 加速** 遇到黑屏问题的**非完整**排查与解决记录。 ## What @@ -21,7 +23,6 @@ ``` - **现象**: - - 虚拟机启动后黑屏,无法进入图形界面。 - SSH 连接正常,系统内核正常运行。 - SPICE 窗口内能看到鼠标光标(表示连接建立),但无画面。 @@ -92,7 +93,6 @@ sudo systemctl restart libvirtd 在 Gentoo Guest 内部,确保驱动栈完整。 1. **Portage 配置** ( 或其他位置): - - `/etc/portage/make.conf` ```conf