icat kitten: When catting multiple images display the images in input order

Fixes #9413
This commit is contained in:
Kovid Goyal
2026-01-24 14:16:54 +05:30
parent 19d632f3fc
commit be0dd00606
4 changed files with 39 additions and 4 deletions

View File

@@ -200,6 +200,8 @@ Detailed list of changes
- Linux: Fix a regression in 0.40 that caused horizontal alignment for emoji to - Linux: Fix a regression in 0.40 that caused horizontal alignment for emoji to
be incorrect in some cases (:iss:`9395`) be incorrect in some cases (:iss:`9395`)
- icat kitten: When catting multiple images display the images in input order (:iss:`9413`)
0.45.0 [2025-12-24] 0.45.0 [2025-12-24]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -7,6 +7,7 @@ import (
"math" "math"
"os" "os"
"runtime" "runtime"
"slices"
"strconv" "strconv"
"strings" "strings"
"sync/atomic" "sync/atomic"
@@ -256,7 +257,8 @@ func main(cmd *cli.Command, o *Options, args []string) (rc int, err error) {
return 1, fmt.Errorf("The --place option can only be used with a single image, not %d", len(items)) return 1, fmt.Errorf("The --place option can only be used with a single image, not %d", len(items))
} }
files_channel = make(chan input_arg, len(items)) files_channel = make(chan input_arg, len(items))
for _, ia := range items { for i, ia := range items {
ia.index = i
files_channel <- ia files_channel <- ia
} }
num_of_items = len(items) num_of_items = len(items)
@@ -320,8 +322,10 @@ func main(cmd *cli.Command, o *Options, args []string) (rc int, err error) {
use_unicode_placeholder = true use_unicode_placeholder = true
} }
base_id := uint32(opts.ImageId) base_id := uint32(opts.ImageId)
for num_of_items > 0 { expecting_input_sequence_number := 0
imgd := <-output_channel pending := make([]*image_data, 0, num_of_items)
do_one := func(imgd *image_data) {
if base_id != 0 { if base_id != 0 {
imgd.image_id = base_id imgd.image_id = base_id
base_id++ base_id++
@@ -341,6 +345,26 @@ func main(cmd *cli.Command, o *Options, args []string) (rc int, err error) {
} }
} }
} }
for num_of_items > 0 {
imgd := <-output_channel
if imgd.input_sequence_number == expecting_input_sequence_number {
do_one(imgd)
expecting_input_sequence_number++
} else {
pending = append(pending, imgd)
index, _ := slices.BinarySearchFunc(pending, imgd.input_sequence_number, func(x *image_data, n int) int {
return x.input_sequence_number - n
})
pending = slices.Insert(pending, index, imgd)
}
for len(pending) > 0 && pending[0].input_sequence_number == expecting_input_sequence_number {
do_one(pending[0])
pending = pending[1:]
}
}
if len(pending) > 0 {
}
keep_going.Store(false) keep_going.Store(false)
if opts.Hold { if opts.Hold {
fmt.Print("\r") fmt.Print("\r")

View File

@@ -28,6 +28,7 @@ type input_arg struct {
arg string arg string
value string value string
is_http_url bool is_http_url bool
index int
} }
func is_http_url(arg string) bool { func is_http_url(arg string) bool {
@@ -113,6 +114,7 @@ type image_data struct {
width_cells, height_cells int width_cells, height_cells int
use_unicode_placeholder bool use_unicode_placeholder bool
passthrough_mode passthrough_type passthrough_mode passthrough_type
input_sequence_number int
// for error reporting // for error reporting
err error err error
@@ -293,7 +295,7 @@ func process_arg(arg input_arg) {
case "magick": case "magick":
dopts = append(dopts, imaging.Backends(imaging.MAGICK_IMAGE)) dopts = append(dopts, imaging.Backends(imaging.MAGICK_IMAGE))
} }
imgd := image_data{source_name: arg.value} imgd := image_data{source_name: arg.value, input_sequence_number: arg.index}
dopts = append(dopts, imaging.ResizeCallback(func(w, h int) (int, int) { dopts = append(dopts, imaging.ResizeCallback(func(w, h int) (int, int) {
imgd.canvas_width, imgd.canvas_height = w, h imgd.canvas_width, imgd.canvas_height = w, h
set_basic_metadata(&imgd) set_basic_metadata(&imgd)

View File

@@ -261,6 +261,13 @@ class TestMouse(BaseTest):
scroll(x=2.6, up=False) scroll(x=2.6, up=False)
self.ae(sel(), '3') self.ae(sel(), '3')
release() release()
# fractional scrolling
init()
s.fractional_scroll(-0.5)
press()
move(x=3.6, q='1234')
release(x=3.6)
self.ae(sel(), '1234')
# extending selections # extending selections
init() init()