From 139d6e2818fcbc69a5a4ed7550e6439ab0e07c57 Mon Sep 17 00:00:00 2001 From: Daniel Nouri Date: Mon, 14 Jul 2025 13:57:45 +0200 Subject: Fix clipboard on Wayland systems (#941) Co-authored-by: Daniel Nouri --- packages/tui/internal/clipboard/clipboard_linux.go | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'packages/tui') diff --git a/packages/tui/internal/clipboard/clipboard_linux.go b/packages/tui/internal/clipboard/clipboard_linux.go index 5fdc1e7ad..101906395 100644 --- a/packages/tui/internal/clipboard/clipboard_linux.go +++ b/packages/tui/internal/clipboard/clipboard_linux.go @@ -13,6 +13,7 @@ import ( "context" "fmt" "log/slog" + "os" "os/exec" "strings" "sync" @@ -44,7 +45,7 @@ var ( writeImg: []string{"xsel", "--clipboard", "--input"}, }, { - name: "wl-clipboard", + name: "wl-copy", readCmd: []string{"wl-paste", "-n"}, writeCmd: []string{"wl-copy"}, readImg: []string{"wl-paste", "-t", "image/png", "-n"}, @@ -66,14 +67,23 @@ func initialize() error { return nil // Already initialized } - // Check which clipboard tool is available - for i, tool := range clipboardTools { - cmd := exec.Command("which", tool.name) - if err := cmd.Run(); err == nil { - clipboardTools[i].available = true - if selectedTool < 0 { - selectedTool = i - slog.Debug("Clipboard tool found", "tool", tool.name) + order := []string{"xclip", "xsel", "wl-copy"} + if os.Getenv("WAYLAND_DISPLAY") != "" { + order = []string{"wl-copy", "xclip", "xsel"} + } + + for _, name := range order { + for i, tool := range clipboardTools { + if tool.name == name { + cmd := exec.Command("which", tool.name) + if err := cmd.Run(); err == nil { + clipboardTools[i].available = true + if selectedTool < 0 { + selectedTool = i + slog.Debug("Clipboard tool found", "tool", tool.name) + } + } + break } } } -- cgit v1.2.3