about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-09-25 14:59:52 +0200
committerbptato <nincsnevem662@gmail.com>2024-09-25 14:59:52 +0200
commit2426863e1853f1d97762f3e48f0858730bc0405a (patch)
tree93143bed08f24edc2c19639112d44ad8dbf2043e
parent1c9277343140effcc9eee8845757afd1eed4f4bd (diff)
downloadchawan-2426863e1853f1d97762f3e48f0858730bc0405a.tar.gz
pager: make image ordering deterministic
ensure that images are shown in the order buffer sent them
-rw-r--r--src/local/pager.nim3
-rw-r--r--src/local/term.nim7
-rw-r--r--todo2
3 files changed, 7 insertions, 5 deletions
diff --git a/src/local/pager.nim b/src/local/pager.nim
index e8034af7..62ac610c 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -640,6 +640,7 @@ proc loadCachedImage(pager: Pager; container: Container; image: PosBitmap;
 
 proc initImages(pager: Pager; container: Container) =
   var newImages: seq[CanvasImage] = @[]
+  var redrawNext = false # redraw images if a new one was loaded before
   for image in container.images:
     var erry = 0
     var offx = 0
@@ -664,7 +665,7 @@ proc initImages(pager: Pager; container: Container) =
     let canvasImage = pager.term.loadImage(cached.data, container.process,
       imageId, image.x - container.fromx, image.y - container.fromy,
       image.width, image.height, image.x, image.y, pager.bufWidth,
-      pager.bufHeight, erry, offx, dispw, cached.transparent)
+      pager.bufHeight, erry, offx, dispw, cached.transparent, redrawNext)
     if canvasImage != nil:
       newImages.add(canvasImage)
   pager.term.clearImages(pager.bufHeight)
diff --git a/src/local/term.nim b/src/local/term.nim
index 3f38193b..d8ab5f53 100644
--- a/src/local/term.nim
+++ b/src/local/term.nim
@@ -758,12 +758,12 @@ proc checkImageDamage*(term: Terminal; maxh: int) =
               term.lineDamage[y] = mx
 
 proc loadImage*(term: Terminal; data: Blob; pid, imageId, x, y, width, height,
-    rx, ry, maxw, maxh, erry, offx, dispw: int; transparent: bool):
-    CanvasImage =
+    rx, ry, maxw, maxh, erry, offx, dispw: int; transparent: bool;
+    redrawNext: var bool): CanvasImage =
   if (let image = term.findImage(pid, imageId, rx, ry, width, height, erry,
         offx, dispw); image != nil):
     # reuse image on screen
-    if image.x != x or image.y != y:
+    if image.x != x or image.y != y or redrawNext:
       # only clear sixels; with kitty we just move the existing image
       if term.imageMode == imSixel:
         term.clearImage(image, maxh)
@@ -788,6 +788,7 @@ proc loadImage*(term: Terminal; data: Blob; pid, imageId, x, y, width, height,
     transparent: transparent
   )
   if term.positionImage(image, x, y, maxw, maxh):
+    redrawNext = true
     return image
   # no longer on screen
   return nil
diff --git a/todo b/todo
index 21e78282..aaadd53a 100644
--- a/todo
+++ b/todo
@@ -67,9 +67,9 @@ layout engine:
 - overflow
 - partial layout, layout caching
 - iframe
+- z order
 - writing-mode, grid, ruby, ... (i.e. cool new stuff)
 images:
-- z order
 - animation
 man:
 - add a DOM -> man page converter so that we do not depend on pandoc