More work on porting transfer kitten

This commit is contained in:
Kovid Goyal
2023-06-05 20:05:40 +05:30
parent a72825fe83
commit 955f812a6b
2 changed files with 36 additions and 6 deletions

View File

@@ -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)
}

View File

@@ -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
}