1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
package clipper
import (
"fmt"
"os/exec"
)
type Clipboard interface {
// Init initializes the clipboard and returns an error if it is not
// accessible
Init() error
// ReadAll returns the contents of the clipboard register 'reg'
ReadAll(reg string) ([]byte, error)
// WriteAll writes 'p' to the clipboard register 'reg'
WriteAll(reg string, p []byte) error
}
const (
RegClipboard = "clipboard"
RegPrimary = "primary"
)
type ErrInvalidReg struct {
Reg string
}
func (e *ErrInvalidReg) Error() string {
return fmt.Sprintf("invalid register: %s", e.Reg)
}
func verify(clip Clipboard, cmds ...string) error {
for _, cmd := range cmds {
if _, err := exec.LookPath(cmd); err != nil {
// command not installed
return err
}
}
_, err := clip.ReadAll(RegClipboard)
if err == nil {
// reading clipboard worked
return nil
}
// reading could fail if the clipboard has no contents, so check if writing
// works in that case
return clip.WriteAll(RegClipboard, []byte{})
}
func write(cmd *exec.Cmd, p []byte) error {
in, err := cmd.StdinPipe()
if err != nil {
return err
}
if err := cmd.Start(); err != nil {
return err
}
if _, err := in.Write(p); err != nil {
return err
}
in.Close()
return cmd.Wait()
}
|