@@ -139,37 +139,37 @@ impl Display for DisplayErrSource<'_> {
139139
140140pub async fn display_kitty_images < ' es > (
141141 display : KittyDisplay < ' _ > ,
142- ev_stream : & ' es mut EventStream
142+ ev_stream : & ' es mut EventStream ,
143+ last_z_index : & mut i32
143144) -> Result < ( ) , DisplayErr < ' es > > {
144145 let images = match display {
145146 KittyDisplay :: NoChange => return Ok ( ( ) ) ,
146- KittyDisplay :: DisplayImages ( _ ) | KittyDisplay :: ClearImages => {
147- run_action (
147+ KittyDisplay :: ClearImages =>
148+ return run_action (
148149 Action :: Delete ( DeleteConfig {
149150 effect : ClearOrDelete :: Clear ,
150151 which : WhichToDelete :: All
151152 } ) ,
152153 ev_stream
153154 )
154155 . await
155- . map_err ( |e| DisplayErr :: empty ( "Couldn't clear previous images" , e) ) ?;
156-
157- let KittyDisplay :: DisplayImages ( images) = display else {
158- return Ok ( ( ) ) ;
159- } ;
160-
161- images
162- }
156+ . map_err ( |e| DisplayErr :: empty ( "Couldn't clear previous images" , e) )
157+ . map ( |_: Option < ImageId > | ( ) ) ,
158+ KittyDisplay :: DisplayImages ( imgs) => imgs
163159 } ;
164160
161+ let new_z_index = last_z_index. wrapping_add_unsigned ( 1 ) ;
162+
165163 let mut err = Ok :: < ( ) , ( SmallVec < [ usize ; 2 ] > , DisplayErrSource < ' es > ) > ( ( ) ) ;
166164 for KittyReadyToDisplay {
167165 img,
168166 page_num,
169167 pos,
170- display_loc
168+ mut display_loc
171169 } in images
172170 {
171+ display_loc. z_index = new_z_index;
172+
173173 let config = DisplayConfig {
174174 location : display_loc,
175175 cursor_movement : CursorMovementPolicy :: DontMove ,
@@ -199,24 +199,21 @@ pub async fn display_kitty_images<'es>(
199199 } ;
200200 std:: mem:: swap ( image, & mut fake_image) ;
201201
202- let res = run_action (
202+ run_action (
203203 Action :: TransmitAndDisplay {
204204 image : fake_image,
205205 config,
206206 placement_id : None
207207 } ,
208208 ev_stream
209209 )
210- . await ;
211-
212- match res {
213- Ok ( Some ( img_id) ) => {
214- * img = MaybeTransferred :: Transferred ( img_id) ;
215- Ok ( ( ) )
216- }
217- Ok ( None ) => Err ( ( page_num, DisplayErrSource :: KittageReturnedNoId ) ) ,
218- Err ( e) => Err ( ( page_num, DisplayErrSource :: Transmission ( e) ) )
219- }
210+ . await
211+ . map_err ( DisplayErrSource :: Transmission )
212+ . and_then ( |img_id| {
213+ img_id
214+ . map ( |id| * img = MaybeTransferred :: Transferred ( id) )
215+ . ok_or ( DisplayErrSource :: KittageReturnedNoId )
216+ } )
220217 }
221218 MaybeTransferred :: Transferred ( image_id) => run_action (
222219 Action :: Display {
@@ -229,22 +226,37 @@ pub async fn display_kitty_images<'es>(
229226 . await
230227 // don't need the return id 'cause we already know it
231228 . map ( |_: Option < ImageId > | ( ) )
232- . map_err ( |e| ( page_num , DisplayErrSource :: Transmission ( e ) ) )
229+ . map_err ( DisplayErrSource :: Transmission )
233230 } ;
234231
235232 log:: debug!( "this_err is {this_err:#?}" ) ;
236233
237- if let Err ( ( id , e ) ) = this_err {
234+ if let Err ( e ) = this_err {
238235 match err. as_mut ( ) {
239- Ok ( ( ) ) => err = Err ( ( SmallVec :: from ( [ id ] . as_slice ( ) ) , e) ) ,
240- Err ( ( v, _) ) => v. push ( id )
236+ Ok ( ( ) ) => err = Err ( ( SmallVec :: from ( [ page_num ] . as_slice ( ) ) , e) ) ,
237+ Err ( ( v, _) ) => v. push ( page_num )
241238 }
242239 }
243240 }
244241
245- err. map_err ( |( failed_pages, source) | DisplayErr {
246- failed_pages,
247- user_facing_err : "Couldn't transfer image to the terminal" ,
248- source
249- } )
242+ let z_idxes_to_remove = * last_z_index;
243+ * last_z_index = new_z_index;
244+
245+ match err {
246+ Err ( ( failed_pages, source) ) => Err ( DisplayErr {
247+ failed_pages,
248+ user_facing_err : "Couldn't transfer image to the terminal" ,
249+ source
250+ } ) ,
251+ Ok ( ( ) ) => run_action (
252+ Action :: Delete ( DeleteConfig {
253+ effect : ClearOrDelete :: Clear ,
254+ which : WhichToDelete :: PlacementsWithZIndex ( z_idxes_to_remove)
255+ } ) ,
256+ ev_stream
257+ )
258+ . await
259+ . map_err ( |e| DisplayErr :: empty ( "Couldn't clear previously-sent images" , e) )
260+ . map ( |_| ( ) )
261+ }
250262}
0 commit comments