summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Nouri <[email protected]>2025-07-14 13:57:45 +0200
committerGitHub <[email protected]>2025-07-14 06:57:45 -0500
commit139d6e2818fcbc69a5a4ed7550e6439ab0e07c57 (patch)
tree9593ba528a5da522d8783896de3de3a39bda1e25
parent06554efdf455d33b2831a5142ea0c6eb01308352 (diff)
downloadopencode-139d6e2818fcbc69a5a4ed7550e6439ab0e07c57.tar.gz
opencode-139d6e2818fcbc69a5a4ed7550e6439ab0e07c57.zip
Fix clipboard on Wayland systems (#941)
Co-authored-by: Daniel Nouri <daniel@redhotcar>
-rw-r--r--packages/tui/internal/clipboard/clipboard_linux.go28
-rw-r--r--packages/web/src/content/docs/docs/troubleshooting.mdx2
2 files changed, 20 insertions, 10 deletions
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
}
}
}
diff --git a/packages/web/src/content/docs/docs/troubleshooting.mdx b/packages/web/src/content/docs/docs/troubleshooting.mdx
index 234c7cce1..bb4f906ee 100644
--- a/packages/web/src/content/docs/docs/troubleshooting.mdx
+++ b/packages/web/src/content/docs/docs/troubleshooting.mdx
@@ -115,4 +115,4 @@ Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
export DISPLAY=:99.0
```
-opencode will automatically detect and use the first available clipboard tool in order of preference: `xclip`, `xsel`, then `wl-clipboard`.
+opencode will detect if you're using Wayland and prefer `wl-clipboard`, otherwise it will try to find clipboard tools in order of: `xclip` and `xsel`.