zellij icon indicating copy to clipboard operation
zellij copied to clipboard

Sixel support broken since v0.40.0

Open Zettexe opened this issue 1 year ago • 9 comments
trafficstars

Basic information

zellij --version: zellij 0.40.0, zellij 0.40.1

stty size: 76 157

uname -av or ver(Windows): Linux zettnet-desktop 6.1.87 #1-NixOS SMP PREEMPT_DYNAMIC Wed Apr 17 09:18:29 UTC 2024 x86_64 GNU/Linux

zellij.log:

INFO   |zellij_client            | 2024-05-23 14:05:30.463 [main      ] [zellij-client/src/lib.rs:178]: Starting Zellij client! 
INFO   |zellij_server            | 2024-05-23 14:05:30.469 [main      ] [zellij-server/src/lib.rs:281]: Starting Zellij server! 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1025]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1025]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1034]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1034]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1045]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1045]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1056]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1056]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1056]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1056]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.472 [server_router] [zellij-server/src/route.rs:1056]: Server not ready, trying to place instruction in retry queue... 
INFO   |zellij_server            | 2024-05-23 14:05:30.472 [main      ] [zellij-server/src/lib.rs:1058]: Compiling plugins using Cranelift 
INFO   |zellij_server::plugins   | 2024-05-23 14:05:30.473 [wasm      ] [zellij-server/src/plugins/mod.rs:200]: Wasm main thread starts 
WARN   |zellij_utils::input::layo| 2024-05-23 14:05:30.474 [wasm      ] [zellij-utils/src/input/layout.rs:105]: Overriding plugin alias 
WARN   |zellij_utils::input::layo| 2024-05-23 14:05:30.474 [wasm      ] [zellij-utils/src/input/layout.rs:105]: Overriding plugin alias 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.474 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.479 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
WARN   |zellij_server::route     | 2024-05-23 14:05:30.481 [server_router] [zellij-server/src/route.rs:1126]: Server ready, retrying sending instruction. 
INFO   |zellij_utils::input::plug| 2024-05-23 14:05:30.482 [async-std/runti] [zellij-utils/src/input/plugins.rs:139]: Plugin 'tab-bar.wasm' exists in the 'PLUGIN DIR' at '/home/zettexe/.local/share/zellij/plugins/' but is being ignored 
INFO   |zellij_utils::input::plug| 2024-05-23 14:05:30.482 [async-std/runti] [zellij-utils/src/input/plugins.rs:139]: Plugin 'status-bar.wasm' exists in the 'PLUGIN DIR' at '/home/zettexe/.local/share/zellij/plugins/' but is being ignored 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.482 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.483 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
INFO   |zellij_server::plugins::p| 2024-05-23 14:05:30.492 [async-std/runti] [zellij-server/src/plugins/plugin_loader.rs:518]: Loaded plugin 'tab-bar' from cache folder at '/home/zettexe/.cache/zellij' in 8.545652ms 
INFO   |zellij_server            | 2024-05-23 14:05:30.492 [async-std/runti] [zellij-server/src/lib.rs:1058]: Compiling plugins using Cranelift 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.504 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.504 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
INFO   |zellij_server::plugins::p| 2024-05-23 14:05:30.509 [async-std/runti] [zellij-server/src/plugins/plugin_loader.rs:518]: Loaded plugin 'status-bar' from cache folder at '/home/zettexe/.cache/zellij' in 23.70576ms 
INFO   |zellij_server            | 2024-05-23 14:05:30.509 [async-std/runti] [zellij-server/src/lib.rs:1058]: Compiling plugins using Cranelift 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.519 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:30.519 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
WARN   |zellij_server::panes::gri| 2024-05-23 14:05:30.570 [screen    ] [zellij-server/src/panes/grid.rs:2436]: Unhandled osc: [[55], [102, 105, 108, 101, 58, 47, 47, 122, 101, 116, 116, 110, 101, 116, 45, 100, 101, 115, 107, 116, 111, 112, 47, 104, 111, 109, 101, 47, 122, 101, 116, 116, 101, 120, 101]] 
WARN   |zellij_server::panes::gri| 2024-05-23 14:05:32.601 [screen    ] [zellij-server/src/panes/grid.rs:3074]: Unhandled esc_dispatch: 92->[] 
INFO   |zellij_server::plugins   | 2024-05-23 14:05:33.522 [wasm      ] [zellij-server/src/plugins/mod.rs:734]: wasm main thread exits 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:33.522 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-05-23 14:05:33.522 [screen    ] [zellij-utils/src/input/layout.rs:1089]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
INFO   |zellij_client            | 2024-05-23 14:05:33.522 [main      ] [zellij-client/src/lib.rs:533]: Bye from Zellij! 
ERROR  |zellij_server::os_input_o| 2024-05-23 14:05:33.522 [screen    ] [zellij-server/src/os_input_output.rs:915]: Failed to apply cached resizes: failed to send message to pty writer 
INFO   |zellij_server::plugins::w| 2024-05-23 14:05:33.522 [wasm      ] [zellij-server/src/plugins/wasm_bridge.rs:282]: Bye from plugin 0 
ERROR  |zellij_server::os_input_o| 2024-05-23 14:05:33.522 [screen    ] [zellij-server/src/os_input_output.rs:904]: Failed to cache resizes: failed to send message to pty writer 
ERROR  |zellij_server::os_input_o| 2024-05-23 14:05:33.522 [screen    ] [zellij-server/src/os_input_output.rs:915]: Failed to apply cached resizes: failed to send message to pty writer 
ERROR  |zellij_utils::errors::not| 2024-05-23 14:05:33.522 [async-std/runti] [zellij-utils/src/errors.rs:652]: Panic occured:
             thread: async-std/runtime
             location: At zellij-server/src/pty.rs:987:30
             message: Program terminates: a fatal error occured

Caused by:
    0: failed to spawn terminals for layout
    1: failed to listen for bytes from PTY
    2: failed to async-send to screen
    3: failed to send message to screen
    4: Originating Thread(s)
       
    5: failed to send message to channel: PtyBytes(
           0,
           [
               13,
               10,
           ],
       ) 
INFO   |zellij_server::plugins::w| 2024-05-23 14:05:33.522 [wasm      ] [zellij-server/src/plugins/wasm_bridge.rs:282]: Bye from plugin 1 

Issue description

v0.40.0 and v0.40.1 are completely unable to render Sixels even if they report as being capable. This is tested in the foot terminal with confirmed working Sixels.

Other relevant information

Additionally I have looked at every version up until v0.31.0 (The version Sixel support was added) and concluded that in every version 0.31.0 -> 0.39.2 Sixels are rendered with twice the height they should and do not get cleared properly as shown in #3173

Zettexe avatar May 23 '24 12:05 Zettexe

I add some things I noticed, in case its helpful:

  1. The issue does not occur the first time zellij is launched. Removing ~/.cache/zellij solves the issue for the next zellij launch.
  2. If you try a few times, even without removing the cache, sometimes it works, randomly. I paste here both a log for when it works and when it doesn't in case it helps. This is zellij 0.40.1.

Working:

INFO   |zellij_client            | 2024-07-08 17:44:48.028 [main      ] [zellij-client/src/lib.rs:178]: Starting Zellij client! 
INFO   |zellij_server            | 2024-07-08 17:44:48.032 [main      ] [zellij-server/src/lib.rs:284]: Starting Zellij server! 
INFO   |zellij_server            | 2024-07-08 17:44:48.086 [main      ] [zellij-server/src/lib.rs:1068]: Compiling plugins using Cranelift 
INFO   |zellij_server::plugins   | 2024-07-08 17:44:48.087 [wasm      ] [zellij-server/src/plugins/mod.rs:203]: Wasm main thread starts 
WARN   |zellij_utils::input::layo| 2024-07-08 17:44:48.088 [wasm      ] [zellij-utils/src/input/layout.rs:105]: Overriding plugin alias 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.089 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.094 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.099 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.100 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
INFO   |zellij_server::plugins::p| 2024-07-08 17:44:48.110 [async-std/runti] [zellij-server/src/plugins/plugin_loader.rs:533]: Loaded plugin 'compact-bar' from cache folder at '/home/prada/.cache/zellij' in 9.852545ms 
INFO   |zellij_server            | 2024-07-08 17:44:48.110 [async-std/runti] [zellij-server/src/lib.rs:1068]: Compiling plugins using Cranelift 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.115 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:44:48.116 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" }

Not working:

INFO   |zellij_client            | 2024-07-08 17:42:22.222 [main      ] [zellij-client/src/lib.rs:178]: Starting Zellij client! 
INFO   |zellij_server            | 2024-07-08 17:42:22.225 [main      ] [zellij-server/src/lib.rs:284]: Starting Zellij server! 
INFO   |zellij_server            | 2024-07-08 17:42:22.279 [main      ] [zellij-server/src/lib.rs:1068]: Compiling plugins using Cranelift 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1037]: Server not ready, trying to place instruction in retry queue... 
INFO   |zellij_server::plugins   | 2024-07-08 17:42:22.280 [wasm      ] [zellij-server/src/plugins/mod.rs:203]: Wasm main thread starts 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1138]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1037]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1037]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1138]: Server ready, retrying sending instruction. 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1037]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1046]: Server not ready, trying to place instruction in retry queue... 
WARN   |zellij_server::route     | 2024-07-08 17:42:22.280 [server_router] [zellij-server/src/route.rs:1138]: Server ready, retrying sending instruction. 
WARN   |zellij_utils::input::layo| 2024-07-08 17:42:22.282 [wasm      ] [zellij-utils/src/input/layout.rs:105]: Overriding plugin alias 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.282 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.287 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.290 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.292 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
INFO   |zellij_server::plugins::p| 2024-07-08 17:42:22.302 [async-std/runti] [zellij-server/src/plugins/plugin_loader.rs:533]: Loaded plugin 'compact-bar' from cache folder at '/home/prada/.cache/zellij' in 8.298075ms 
INFO   |zellij_server            | 2024-07-08 17:42:22.302 [async-std/runti] [zellij-server/src/lib.rs:1068]: Compiling plugins using Cranelift 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.306 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" } 
ERROR  |zellij_utils::input::layo| 2024-07-08 17:42:22.306 [screen    ] [zellij-utils/src/input/layout.rs:1088]: Failed to read layout dir: Os { code: 2, kind: NotFound, message: "No such file or directory" }

In my case, I use Contour and an Alacritty mod with Sixel support.

manueldeprada avatar Jul 08 '24 16:07 manueldeprada

Able to reproduce all mentioned issues, without a cache clear sixels are broken. And they are double height. I'm also using foot.

lypanov avatar Jul 11 '24 08:07 lypanov

Let's try to bump this, it should be a simple regression fix. @imsnif seems to be the Sixel God on zellij

manueldeprada avatar Jul 15 '24 21:07 manueldeprada

My own release bisect shows this breaks with 0.35.0. Anything >= 35 needs a cache clear. I'll dig into which part of the release it was tomorrow.

lypanov avatar Jul 16 '24 21:07 lypanov

My gut instinct on the patch in 0.35.0 that may have caused this seems to be right, at 5235407 the tree is fine, 3a0e56a broken. So https://github.com/zellij-org/zellij/pull/2173 looks like the PR that causes the regression.

This also means that you only need a rm ~/.cache/zellij/zellij-stdin-cache-* rather than a full cache/zellij delete.

Looks like the addition of the cache is causing a race condition when sending the ScreenInstruction TerminalPixelDimensions. When it's correctly sent via a retry from send_to_screen_or_retry_queue! sixels work, however 9 out of 10 times it's not being sent. 10 times out of 10 only one of the expected TerminalPixelDimensions is sent. This frequently hits the fg/bg color resends also.

Will continue to persevere on this but my knowledge of concurrency in Rust is rudimentary.

lypanov avatar Jul 17 '24 07:07 lypanov

Had a bit more time to look into this and looks like route_thread_main is dropping the ScreenInstructions entirely from the retry queue when the retry queue itself is being replayed rather than placing them back on the retry queue. Making the no-brainer-i-don't-know-what-i'm-doing fix causes zellij to hang entirely on startup. Looks like something is keeping a lock during startup and preventing the retry queue from being executed.

Update: No locking just a race condition between session init and the retry queue. Only when session init has completed first do fg/bg/pixel dims get correctly set in the screen.

lypanov avatar Jul 17 '24 11:07 lypanov

Okay had a bit more time to look into this and figured out the obvious reason for the hang (infinite loop). Quick re-trail led me to a fix. Will clean up the patch, and create a PR.

lypanov avatar Jul 17 '24 16:07 lypanov

thanks @lypanov this is great!!

manueldeprada avatar Jul 17 '24 17:07 manueldeprada

If anyone has time to test the above PR/branch and confirm the fix locally, please do so!

lypanov avatar Jul 18 '24 16:07 lypanov

I am on 0.42.2 and still seem to not have image previews in yazi inside zellij.

acrosby avatar Sep 05 '25 12:09 acrosby