hzeller / timg

A terminal image and video viewer.
GNU General Public License v2.0
1.91k stars 73 forks source link

Auto detect for Ghostty doesn't work #121

Closed RGBCube closed 9 months ago

RGBCube commented 9 months ago

Ghostty supports the kitty graphics protocol, but timg does not detect it by default.

Here is my env:

key value
CMD_DURATION_MS 16
COLORTERM truecolor
CURRENT_FILE /home/nixos/.cache/starship/init.nu
DBUS_SESSION_BUS_ADDRESS unix:path=/run/user/1000/bus
DIRS_LIST [/home/nixos]
DIRS_POSITION 0
DISPLAY :0
EDITOR hx
ENV_CONVERSIONS {PATH: {from_string: <Closure 1380>, to_string: <Closure 1382>}}
FILE_PWD /home/nixos/.cache/starship
GHOSTTY_RESOURCES_DIR /nix/store/2m1rj6mba5cph6d1zjd588hldi9wym8d-ghostty-0.1.0/share
GIO_EXTRA_MODULES /nix/store/bhynrw9xbvgwhs0xc61wm7c5iwhbph4j-dconf-0.40.0-lib/lib/gio/modules
GREETD_SOCK /run/greetd-1204.sock
GTK_A11Y none
GTK_PATH /home/nixos/.nix-profile/lib/gtk-2.0:/home/nixos/.nix-profile/lib/gtk-3.0:/home/nixos/.nix-profile/lib/gtk-4.0:/nix/profile/lib/gtk-2.0:/nix/profile/lib/gtk-3.0:/nix/profile/lib/gtk-4.0:/home/nixos/.local/state/nix/profile/lib/gtk-2.0:/home/nixos/.local/state/nix/profile/lib/gtk-3.0:/home/nixos/.local/state/nix/profile/lib/gtk-4.0:/etc/profiles/per-user/nixos/lib/gtk-2.0:/etc/profiles/per-user/nixos/lib/gtk-3.0:/etc/profiles/per-user/nixos/lib/gtk-4.0:/nix/var/nix/profiles/default/lib/gtk-2.0:/nix/var/nix/profiles/default/lib/gtk-3.0:/nix/var/nix/profiles/default/lib/gtk-4.0:/run/current-system/sw/lib/gtk-2.0:/run/current-system/sw/lib/gtk-3.0:/run/current-system/sw/lib/gtk-4.0
HOME /home/nixos
HYPRLAND_CMD /etc/profiles/per-user/nixos/bin/Hyprland
HYPRLAND_INSTANCE_SIGNATURE 37d7a8c64dfabfe81330c819c24fd6b13b292194_1701842861
INFOPATH /home/nixos/.nix-profile/info:/home/nixos/.nix-profile/share/info:/nix/profile/info:/nix/profile/share/info:/home/nixos/.local/state/nix/profile/info:/home/nixos/.local/state/nix/profile/share/info:/etc/profiles/per-user/nixos/info:/etc/profiles/per-user/nixos/share/info:/nix/var/nix/profiles/default/info:/nix/var/nix/profiles/default/share/info:/run/current-system/sw/info:/run/current-system/sw/share/info
LANG en_US.UTF-8
LAST_EXIT_CODE 1
LC_ADDRESS tr_TR.UTF-8
LC_IDENTIFICATION tr_TR.UTF-8
LC_MEASUREMENT tr_TR.UTF-8
LC_MONETARY tr_TR.UTF-8
LC_NAME tr_TR.UTF-8
LC_NUMERIC tr_TR.UTF-8
LC_PAPER tr_TR.UTF-8
LC_TELEPHONE tr_TR.UTF-8
LC_TIME tr_TR.UTF-8
LESSKEYIN_SYSTEM /nix/store/fczp2895xddx33fzjr9yhfv9dxnbhiyr-lessconfig
LESSOPEN /nix/store/78c2l3d5rrmpwddwdr7shwkz4nl6p868-lesspipe-2.10/bin/lesspipe.sh %s
LIBEXEC_PATH /home/nixos/.nix-profile/libexec:/nix/profile/libexec:/home/nixos/.local/state/nix/profile/libexec:/etc/profiles/per-user/nixos/libexec:/nix/var/nix/profiles/default/libexec:/run/current-system/sw/libexec
LOCALE_ARCHIVE /run/current-system/sw/lib/locale/locale-archive
LOGNAME nixos
LOG_ANSI {CRITICAL: , ERROR: , WARNING: , INFO: , DEBUG: }
LOG_LEVEL {CRITICAL: 50, ERROR: 40, WARNING: 30, INFO: 20, DEBUG: 10}
LOG_PREFIX {CRITICAL: CRT, ERROR: ERR, WARNING: WRN, INFO: INF, DEBUG: DBG}
LOG_SHORT_PREFIX {CRITICAL: C, ERROR: E, WARNING: W, INFO: I, DEBUG: D}
MANPAGER bat --plain --language man
MOZ_ENABLE_WAYLAND 1
NIXPKGS_CONFIG /etc/nix/nixpkgs-config.nix
NIX_LD /run/current-system/sw/share/nix-ld/lib/ld.so
NIX_LD_LIBRARY_PATH /run/current-system/sw/share/nix-ld/lib
NIX_PATH nixpkgs=/nix/store/7adgvk5zdfq4pwrhsm3n9lzypb12gw0g-source
NIX_PROFILES /run/current-system/sw /nix/var/nix/profiles/default /etc/profiles/per-user/nixos /home/nixos/.local/state/nix/profile /nix/profile /home/nixos/.nix-profile
NIX_USER_PROFILE_DIR /nix/var/nix/profiles/per-user/nixos
NO_AT_BRIDGE 1
NU_LOG_DATE_FORMAT %Y-%m-%dT%H:%M:%S%.3f
NU_LOG_FORMAT %ANSI_START%%DATE% %LEVEL% %MSG%%ANSI_STOP%
NU_VERSION 0.87.1
PAGER bat --plain
PATH [/run/wrappers/bin, /home/nixos/.nix-profile/bin, /nix/profile/bin, /home/nixos/.local/state/nix/profile/bin, /etc/profiles/per-user/nixos/bin, /nix/var/nix/profiles/default/bin, /run/current-system/sw/bin, /nix/store/1alqjnr40dsk7cl15l5sn5y2zdxidc1v-binutils-wrapper-2.40/bin, /nix/store/lvx8bvn5lc6aqjq2jalnq7xc9lhqbpzg-pciutils-3.10.0/bin]
PROMPT_COMMAND <Closure 1450>
PROMPT_COMMAND_RIGHT <Closure 1455>
PROMPT_INDICATOR
PROMPT_INDICATOR_VI_INSERT
PROMPT_INDICATOR_VI_NORMAL
PROMPT_MULTILINE_INDICATOR ∙
PWD /home/nixos
QTWEBKIT_PLUGIN_PATH /home/nixos/.nix-profile/lib/mozilla/plugins/:/nix/profile/lib/mozilla/plugins/:/home/nixos/.local/state/nix/profile/lib/mozilla/plugins/:/etc/profiles/per-user/nixos/lib/mozilla/plugins/:/nix/var/nix/profiles/default/lib/mozilla/plugins/:/run/current-system/sw/lib/mozilla/plugins/
SHELL /run/current-system/sw/bin/nu
SHLVL 0
SSH_ASKPASS
STARSHIP_SESSION_KEY PyoCTLeOIPDgozbU
STARSHIP_SHELL nu
TERM xterm-ghostty
TERMINAL ghostty
TERMINFO /nix/store/2m1rj6mba5cph6d1zjd588hldi9wym8d-ghostty-0.1.0/share/terminfo
TERMINFO_DIRS /home/nixos/.nix-profile/share/terminfo:/nix/profile/share/terminfo:/home/nixos/.local/state/nix/profile/share/terminfo:/etc/profiles/per-user/nixos/share/terminfo:/nix/var/nix/profiles/default/share/terminfo:/run/current-system/sw/share/terminfo
TERM_PROGRAM ghostty
TERM_PROGRAM_VERSION 0.1.0
TZDIR /etc/zoneinfo
USER nixos
WAYLAND_DISPLAY wayland-1
XCURSOR_PATH /home/nixos/.icons:/home/nixos/.local/share/icons:/home/nixos/.nix-profile/share/icons:/home/nixos/.nix-profile/share/pixmaps:/nix/profile/share/icons:/nix/profile/share/pixmaps:/home/nixos/.local/state/nix/profile/share/icons:/home/nixos/.local/state/nix/profile/share/pixmaps:/etc/profiles/per-user/nixos/share/icons:/etc/profiles/per-user/nixos/share/pixmaps:/nix/var/nix/profiles/default/share/icons:/nix/var/nix/profiles/default/share/pixmaps:/run/current-system/sw/share/icons:/run/current-system/sw/share/pixmaps
XCURSOR_SIZE 24
XDG_BACKEND wayland
XDG_CONFIG_DIRS /etc/xdg:/home/nixos/.nix-profile/etc/xdg:/nix/profile/etc/xdg:/home/nixos/.local/state/nix/profile/etc/xdg:/etc/profiles/per-user/nixos/etc/xdg:/nix/var/nix/profiles/default/etc/xdg:/run/current-system/sw/etc/xdg
XDG_CURRENT_DESKTOP Hyprland
XDG_DATA_DIRS /nix/store/mayav6shqg7nbwhj0m4vhfb243ym677l-desktops/share:/home/nixos/.nix-profile/share:/nix/profile/share:/home/nixos/.local/state/nix/profile/share:/etc/profiles/per-user/nixos/share:/nix/var/nix/profiles/default/share:/run/current-system/sw/share
XDG_DESKTOP_PORTAL_DIR /nix/store/9j8hqsnymhgmzm1dqdjk72a6qwh502gf-xdg-portals/share/xdg-desktop-portal/portals
XDG_RUNTIME_DIR /run/user/1000
XDG_SEAT seat0
XDG_SESSION_CLASS user
XDG_SESSION_ID 3
XDG_SESSION_TYPE wayland
XDG_VTNR 1
_ /etc/profiles/per-user/nixos/bin/ghostty
_JAVA_AWT_WM_NONREPARENTING 1
__ETC_PROFILE_DONE 1
__NIXOS_SET_ENVIRONMENT_DONE 1
hzeller commented 9 months ago

Where do I find the terminal to test ? https://search.nixos.org/packages?channel=unstable&query=ghostty does not yield anything

RGBCube commented 9 months ago

Where do I find the terminal to test ? search.nixos.org/packages?channel=unstable&query=ghostty does not yield anything

It is currently in closed beta, but you can ask @mitchellh for an invite.

But I can test for you if you'd like, does timg not check env vars for this anyway?

hzeller commented 9 months ago

Usually, timg uses a terminal query directly, the equivalent of doing the following in the shell:

echo -e "\033[>q"

Environment variables are typically avoided and only used as fallback in some cases for terminals that don't provide that query.

mitchellh commented 9 months ago

I haven’t looked at the source for this project and I’m typing from mobile so I apologize for anything brief or mistaken.

@RGBCube the documented way (by Kitty) to check for graphics protocol support is to query it: https://sw.kovidgoyal.net/kitty/graphics-protocol/#querying-support-and-available-transmission-mediums I assume this project probably does this but like I said I’m on mobile and haven’t checked.

It’s also very possible Ghosttys kitty graphics protocol has bugs. We have many testers using the image protocol but there’s a lot of configurability in the protocol so it’s possible some aspects are wrong.

@hzeller i am happy to give you an invite if you’re interested but I’ll also look into this myself.

hzeller commented 9 months ago

I am not using the Kitty graphical query anymore as it turns out that that messes up other terminals. So that is why timg is using the regular terminal query to figure out the name and version of a terminal (\033[>q)- that is typically implemented by all terminals.

For testing, yes I'd be interested for an invite and to compile ghostty myself to see.

mitchellh commented 9 months ago

I am not using the Kitty graphical query anymore as it turns out that that messes up other terminals.

Yikes, which terminals? I know Terminal.app spews garbage for DCS sequences but wasn't sure what others.

So that is why timg is using the regular terminal query to figure out the name and version of a terminal (\033[>q)- that is typically implemented by all terminals.

Ah, well this is Ghostty's result (including the control characters for the response)

^[P>|ghostty 0.1.0-main+571170c5^[\⏎

For testing, yes I'd be interested for an invite and to compile ghostty myself to see.

Sent you an invite. Please feel free to join our Discord if you'd like where you can talk to me directly if you have any issues/questions: https://discord.gg/ghostty

hzeller commented 9 months ago

Alright, added detection. Ghostty now displays images automatically in Kitty format without need to specify the -pk option. (I was pleased that ghostty came already with all the nix flake configuration that it was a breeze to compile!)

Simple images and grid seems to work, but animations not yet, possibly due to the flipbuffer technique that timg is using.

In animations, timg creates two IDs which are then used for the even/odd images of an animation essentially for double-buffering. First image is sent with first ID, second image with second ID, third image with first ID and so on.

However it seems that ghostty is not updating images when it comes with an already known ID, so the animation looks like it stops after the second frame. So to fix, if the terminal gets a Kitty image with an ID it already has seen, it should update it.

Should I file and issue @mitchellh or can you take it from there ?

mitchellh commented 9 months ago

Oh thanks! I'll file an issue and CC you. I'm pretty confident that we are updating the internal state but we're not updating the GPU texture due to some caching on the ID.