From 955f812a6ba1f6611cc7aa6ffdbd5315b3014c38 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 5 Jun 2023 20:05:40 +0530 Subject: [PATCH] More work on porting transfer kitten --- kittens/transfer/main.go | 2 +- kittens/transfer/send.go | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/kittens/transfer/main.go b/kittens/transfer/main.go index dbc2afcea..a35fc767b 100644 --- a/kittens/transfer/main.go +++ b/kittens/transfer/main.go @@ -55,7 +55,7 @@ func main(cmd *cli.Command, opts *Options, args []string) (rc int, err error) { return 1, fmt.Errorf("Must specify at least one file to transfer") } if opts.Direction == "send" { - err = send_main(opts, args) + err, rc = send_main(opts, args) } else { err = receive_main(opts, args) } diff --git a/kittens/transfer/send.go b/kittens/transfer/send.go index e47cb149e..3b92e67a1 100644 --- a/kittens/transfer/send.go +++ b/kittens/transfer/send.go @@ -1016,6 +1016,13 @@ func (self *SendHandler) abort_transfer(delay ...time.Duration) { }) } +func (self *SendHandler) on_resize(old_size, new_size loop.ScreenSize) error { + if self.progress_drawn { + self.refresh_progress(0) + } + return nil +} + func (self *SendHandler) on_key_event(ev *loop.KeyEvent) error { if self.quit_after_write_code > -1 { return nil @@ -1049,10 +1056,10 @@ func (self *SendHandler) on_interrupt() { self.abort_transfer() } -func send_loop(opts *Options, files []*File) (err error) { +func send_loop(opts *Options, files []*File) (err error, rc int) { lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors) if err != nil { - return + return err, 1 } handler := &SendHandler{ @@ -1067,8 +1074,13 @@ func send_loop(opts *Options, files []*File) (err error) { handler.manager.file_done = handler.on_file_done lp.OnInitialize = func() (string, error) { + lp.SetCursorVisible(false) return "", handler.initialize() } + lp.OnFinalize = func() string { + lp.SetCursorVisible(true) + return "" + } ftc_code := strconv.Itoa(kitty.FileTransferCode) lp.OnEscapeCode = func(et loop.EscapeCodeType, payload []byte) error { if et == loop.OSC { @@ -1086,19 +1098,37 @@ func send_loop(opts *Options, files []*File) (err error) { } lp.OnText = handler.on_text lp.OnKeyEvent = handler.on_key_event + lp.OnResize = handler.on_resize + + err = lp.Run() + if err != nil { + return err, 1 + } + if lp.DeathSignalName() != "" { + lp.KillIfSignalled() + return + } + if len(handler.failed_files) > 0 { + fmt.Fprintf(os.Stderr, "Transfer of %d out of %d files failed\n", len(handler.failed_files), len(handler.manager.files)) + for _, f := range handler.failed_files { + fmt.Println(handler.ctx.BrightRed(f.display_name)) + fmt.Println(` `, f.err_msg) + } + rc = 1 + } return } -func send_main(opts *Options, args []string) (err error) { +func send_main(opts *Options, args []string) (err error, rc int) { fmt.Println("Scanning files…") files, err := files_for_send(opts, args) if err != nil { - return err + return err, 1 } fmt.Printf("Found %d files and directories, requesting transfer permission…", len(files)) fmt.Println() - err = send_loop(opts, files) + err, rc = send_loop(opts, files) return }