From f7cc27f88d4dee7b18055ccbb37b993a3ef5f470 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Wed, 5 Jun 2024 17:43:21 -0400 Subject: [PATCH] Improve generic UNIX clipboard clearing logic --- src/backend/copyUNIXGeneric.go | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/backend/copyUNIXGeneric.go b/src/backend/copyUNIXGeneric.go index 50db16e..f88c48f 100644 --- a/src/backend/copyUNIXGeneric.go +++ b/src/backend/copyUNIXGeneric.go @@ -48,26 +48,30 @@ func copyField(executableName, copySubject string) { func clipClear(oldContents string) { time.Sleep(30 * time.Second) - var envSet bool // track whether environment variables are set - var platform bool // track clipboard platform, false for Wayland, true for X11 - var cmd *exec.Cmd - // determine whether to use wl-copy (Wayland) or xclip (X11) + // determine clipboard tool to use (wl-clipboard VS xclip) + var envSet bool + var cmdClear, cmdPaste *exec.Cmd if _, envSet = os.LookupEnv("WAYLAND_DISPLAY"); envSet { - cmd = exec.Command("wl-paste") + cmdClear = exec.Command("wl-copy", "-c") + cmdPaste = exec.Command("wl-paste") } else if _, envSet = os.LookupEnv("DISPLAY"); envSet { - cmd = exec.Command("xclip", "-o", "-sel", "c") - platform = true + cmdClear = exec.Command("xclip", "-i", "/dev/null", "-sel", "c") + cmdPaste = exec.Command("xclip", "-o", "-sel", "c") + } else { + fmt.Println(AnsiError + "Clipboard platform could not be determined - neither $WAYLAND_DISPLAY nor $DISPLAY are set" + AnsiReset) + os.Exit(1) } - newContents, _ := cmd.Output() + // read current clipboard contents + newContents, err := cmdPaste.Output() + if err != nil { + fmt.Println(AnsiError + "Failed to read clipboard contents: " + err.Error() + AnsiReset) + os.Exit(1) + } + + // clear clipboard if contents have not been modified if oldContents == strings.TrimRight(string(newContents), "\r\n") { - switch platform { - case false: - cmd = exec.Command("wl-copy", "-c") - case true: - cmd = exec.Command("xclip", "-i", "/dev/null", "-sel", "c") - } - err := cmd.Run() + err = cmdClear.Run() if err != nil { fmt.Println(AnsiError + "Failed to clear clipboard: " + err.Error() + AnsiReset) os.Exit(1)