diff options
| author | theimpostor <sahirhoda@gmail.com> | 2023-07-13 08:31:57 -0500 |
|---|---|---|
| committer | theimpostor <sahirhoda@gmail.com> | 2023-07-13 08:31:57 -0500 |
| commit | f5f03ff3b3abdead67580677c4ba2742f0bdcc0b (patch) | |
| tree | 57c0336936f886c573e15a9843964bdfb0089652 /main.go | |
| parent | 09705bb0313861ee16c40a4bb39a131edbb09761 (diff) | |
WIP adding paste support
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 116 |
1 files changed, 100 insertions, 16 deletions
@@ -5,9 +5,12 @@ import ( "encoding/base64" "flag" "fmt" + "github.com/gdamore/tcell/v2" "io" "log" "os" + "syscall" + // "golang.org/x/sys/unix" ) func encode(fname string, encoder io.WriteCloser) { @@ -41,27 +44,108 @@ With no arguments, will read from stdin. fmt.Fprintf(flag.CommandLine.Output(), template, os.Args[0]) } + pasteFlag := flag.Bool("paste", false, "paste operation") + flag.Parse() - if len(flag.Args()) > 0 { - fnames = flag.Args() + if !*pasteFlag { + // copy + if len(flag.Args()) > 0 { + fnames = flag.Args() + } else { + fnames = []string{"-"} + } + + // Open buffered output, using default max OSC52 length as buffer size + out := bufio.NewWriterSize(os.Stdout, 1000000) + + // Start OSC52 + fmt.Fprintf(out, "\033]52;c;") + + b64 := base64.NewEncoder(base64.StdEncoding, out) + for _, fname := range fnames { + encode(fname, b64) + } + b64.Close() + + // End OSC52 + fmt.Fprintf(out, "\a") + + out.Flush() } else { - fnames = []string{"-"} - } + // paste - // Open buffered output, using default max OSC52 length as buffer size - out := bufio.NewWriterSize(os.Stdout, 1000000) + // Start OSC52 + fmt.Printf("\033]52;c;?\a") - // Start OSC52 - fmt.Fprintf(out, "\033]52;c;") + readFunc := func() (data []byte) { + var err error + tty, err := tcell.NewDevTty() + if err != nil { + fmt.Fprintln(os.Stderr, "ERROR: tcell.NewDevTty:", err) + return + } + defer func() { + if err = tty.Drain(); err != nil { + fmt.Fprintln(os.Stderr, "Drain error:", err) + } + if err = tty.Stop(); err != nil { + fmt.Fprintln(os.Stderr, "Drain error:", err) + } + if err = tty.Close(); err != nil { + fmt.Fprintln(os.Stderr, "Drain error:", err) + } + }() + if err = tty.Start(); err != nil { + fmt.Fprintln(os.Stderr, "Start error:", err) + } - b64 := base64.NewEncoder(base64.StdEncoding, out) - for _, fname := range fnames { - encode(fname, b64) - } - b64.Close() + ttyReader := bufio.NewReader(tty) + data, err = ttyReader.ReadBytes('\a') + if err != nil && err != syscall.EAGAIN { + fmt.Fprintln(os.Stderr, "Read error:", err) + return + } + return + } + buf := readFunc() + // fmt.Fprintln(os.Stderr, "Read", len(buf), "bytes") + fmt.Fprintf(os.Stderr, "Read %d bytes, %x\n", len(buf), buf) + // fmt.Fprintln(os.Stderr, "Read:", string(buf[:])) + + // tty, err := os.OpenFile("/dev/tty", os.O_RDONLY, 0) + // if err != nil { + // fmt.Fprintln(os.Stderr, "Error opening /dev/tty:", err) + // return + // } + // defer tty.Close() - // End OSC52 - fmt.Fprintf(out, "\a") + // // set nonblocking + // err = unix.SetNonblock(int(tty.Fd()), true) + // if err != nil { + // fmt.Fprintln(os.Stderr, "Error setting nonblock:", err) + // return + // } - out.Flush() + // // Create a byte slice to read into + // buf := make([]byte, 1) + + // for { + // // Try to read + // n, err := tty.Read(buf) + // if err != nil && err != syscall.EAGAIN { + // fmt.Fprintln(os.Stderr, "Read error:", err) + // return + // } + + // // If we got some data, print it + // if n > 0 { + // fmt.Fprintln(os.Stderr, "Read:", string(buf[:n])) + + // if buf[0] == byte('\a') { + // fmt.Fprintln(os.Stderr, "END") + // break + // } + // } + // } + } } |
