diff --git a/README.md b/README.md index d61e3cf..b206347 100644 --- a/README.md +++ b/README.md @@ -361,7 +361,7 @@ clipboard_timeout = "3s" **Injection Backends:** -- **`ydotool`**: Uses ydotool (requires `ydotoold` daemon). Most compatible with Chromium/Electron apps. +- **`ydotool`**: Uses ydotool (requires `ydotoold` daemon for ydotool v1.0.0+). Most compatible with Chromium/Electron apps. - **`wtype`**: Uses wtype for Wayland. May have issues with some Chromium-based apps (known upstream bug). - **`clipboard`**: Copies text to clipboard only. Most reliable, but requires manual paste. @@ -385,7 +385,7 @@ backends = ["ydotool"] **ydotool Setup:** -ydotool requires the `ydotoold` daemon running and access to `/dev/uinput`: +ydotool requires the `ydotoold` daemon running (for ydotool v1.0.0+) and access to `/dev/uinput`: ```bash # Start ydotool daemon (systemd) diff --git a/cmd/hyprvoice/main.go b/cmd/hyprvoice/main.go index 1f6117d..e372f5b 100644 --- a/cmd/hyprvoice/main.go +++ b/cmd/hyprvoice/main.go @@ -314,7 +314,7 @@ func runInteractiveConfig() error { fmt.Println("⌨️ Text Injection Configuration") fmt.Println("--------------------------------") fmt.Println("Backends are tried in order until one succeeds (fallback chain):") - fmt.Println(" - ydotool: Best for Chromium/Electron apps (requires ydotoold daemon)") + fmt.Println(" - ydotool: Best for Chromium/Electron apps (requires ydotoold daemon for ydotool v1.0.0+)") fmt.Println(" - wtype: Native Wayland typing (may fail on some Chromium apps)") fmt.Println(" - clipboard: Copies to clipboard only (most reliable, needs manual paste)") fmt.Println() @@ -621,7 +621,7 @@ func saveConfig(cfg *config.Config) error { clipboard_timeout = "%s" # Timeout for clipboard operations # Backend explanations: -# - "ydotool": Uses ydotool (requires ydotoold daemon running). Most compatible with Chromium/Electron apps. +# - "ydotool": Uses ydotool (requires ydotoold daemon running for ydotool v1.0.0+). Most compatible with Chromium/Electron apps. # - "wtype": Uses wtype for Wayland. May have issues with some Chromium-based apps. # - "clipboard": Copies text to clipboard only (most reliable, but requires manual paste). # diff --git a/internal/config/config.go b/internal/config/config.go index 9ad9e1c..0983b42 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -461,7 +461,7 @@ func SaveDefaultConfig() error { # body = "🔧" # Backend explanations: -# - "ydotool": Uses ydotool (requires ydotoold daemon running). Most compatible with Chromium/Electron apps. +# - "ydotool": Uses ydotool (requires ydotoold daemon running for ydotool v1.0.0+). Most compatible with Chromium/Electron apps. # - "wtype": Uses wtype for Wayland. May have issues with some Chromium-based apps. # - "clipboard": Copies text to clipboard only (most reliable, but requires manual paste). # diff --git a/internal/injection/ydotool.go b/internal/injection/ydotool.go index 0398457..23258be 100644 --- a/internal/injection/ydotool.go +++ b/internal/injection/ydotool.go @@ -25,18 +25,19 @@ func (y *ydotoolBackend) Available() error { return fmt.Errorf("ydotool not found: %w (install ydotool package)", err) } - // Check if ydotoold is running by checking socket - socketPath := y.getSocketPath() - if socketPath == "" { - return fmt.Errorf("ydotoold socket not found - ensure ydotoold is running") - } + // Only check socket if ydotoold exists + if _, err := exec.LookPath("ydotoold"); err == nil { + socketPath := y.getSocketPath() + if socketPath == "" { + return fmt.Errorf("ydotoold socket not found - ensure ydotoold is running") + } - // Try to connect to verify daemon is responsive - conn, err := net.DialTimeout("unix", socketPath, 500*time.Millisecond) - if err != nil { - return fmt.Errorf("ydotoold not responding at %s: %w", socketPath, err) + conn, err := net.DialTimeout("unix", socketPath, 500*time.Millisecond) + if err != nil { + return fmt.Errorf("ydotoold not responding at %s: %w", socketPath, err) + } + conn.Close() } - conn.Close() return nil }