diff --git a/action.go b/action.go index c9aad41..7512a45 100644 --- a/action.go +++ b/action.go @@ -232,6 +232,9 @@ func deckBuiltinAction(action string, deck *Deck) error { func keyboardTool() string { if os.Getenv("WAYLAND_DISPLAY") != "" { + if _, err := exec.LookPath("ydotool"); err == nil { + return "ydotool" + } if _, err := exec.LookPath("wtype"); err == nil { return "wtype" } @@ -264,6 +267,8 @@ func execKeyboard(a *config.Action) error { } switch tool { + case "ydotool": + return execYDOTool(keys) case "wtype": return execWType(parts) case "xdotool": @@ -300,6 +305,14 @@ func execXDoTool(keys string) error { return cmd.Run() } +func execYDOTool(keys string) error { + // Use 'type' command instead of 'key' for better compatibility with Wine/games on Wayland + cmd := exec.Command("ydotool", "type", keys) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + func (pm *PageManager) PageNames() []string { pm.mu.RLock() defer pm.mu.RUnlock() diff --git a/daemon.go b/daemon.go index cbd7cb9..0f42bc0 100644 --- a/daemon.go +++ b/daemon.go @@ -289,8 +289,19 @@ func Run(ctx context.Context, cfg *config.Config, opts RunOptions) error { func checkKeyboardTool() { if os.Getenv("WAYLAND_DISPLAY") != "" { - if _, err := exec.LookPath("wtype"); err != nil { - slog.Warn("keyboard actions require wtype on Wayland — install it (e.g. apk add wtype) and restart") + // On Wayland, prefer ydotool over wtype + if _, err := exec.LookPath("ydotool"); err == nil { + // Start ydotoold daemon if not already running + cmd := exec.Command("ydotoold") + cmd.Stdout = nil + cmd.Stderr = nil + // Run in background, don't wait + _ = cmd.Start() + slog.Info("ydotoold daemon started for keyboard input") + } else if _, err := exec.LookPath("wtype"); err == nil { + slog.Warn("ydotool not found, falling back to wtype — consider installing ydotool for better Wayland support (e.g. apk add ydotool)") + } else { + slog.Warn("keyboard actions require ydotool or wtype on Wayland — install one (e.g. apk add ydotool) and restart") } } else { if _, err := exec.LookPath("xdotool"); err != nil {