1
0

Compare commits

..

2 Commits

Author SHA1 Message Date
Maksim Totmin
e8b4eafc2e Fix keyboard input on Wayland: use ydotool instead of wtype
- Replace wtype with ydotool as primary keyboard input tool on Wayland
  (wtype had a bug sending ESC instead of correct keys to GUI apps)
- Use 'ydotool type' command for better Wine/game compatibility
- Automatically start ydotoold daemon on startup if available
- Keep wtype as fallback for backward compatibility
- Improve keyboard action support for games running in Wine
2026-06-17 22:19:54 +07:00
Maksim Totmin
1a63da9171 Fix rendering of keys with background only (no icon or label) 2026-06-17 20:28:25 +07:00
3 changed files with 33 additions and 2 deletions

View File

@ -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()

View File

@ -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 {

View File

@ -249,6 +249,13 @@ func (pm *PageManager) renderKey(idx int, k *config.KeyConfig) {
if err := pm.deck.WriteText(idx, k.Label, image.Black, fontName, fontSize); err != nil {
slog.Warn("write text", "error", err)
}
} else if k.Background != "" {
bg, err := parseHexColor(k.Background)
if err == nil {
pm.deck.FillColor(idx, bg.R, bg.G, bg.B)
} else {
slog.Warn("invalid background color", "value", k.Background, "error", err)
}
}
}