Jak utworzyć skrót, który wykonuje polecenie xdotool w celu symulacji naciśnięcia klawisza?


11

Próbuję symulować naciśnięcie klawisza multimediów przy użyciu niestandardowego skrótu.

Do tej pory udało mi się uzyskać potrzebną symulację za pomocą polecenia:

xdotool key XF86AudioPlay

Działa idealnie, wstrzymuje lub uruchamia odtwarzacz muzyki przy każdym uruchomieniu.

Problem pojawia się podczas próby uruchomienia go jako skrótu.

Najpierw próbowałem uruchomić alias z niestandardowym skrótem, ale to nie zadziałało.

Jak wyjaśniono w tym pytaniu :

Polecenia uruchamiane przez powiązania klawiatury nie są analizowane przez powłokę. Najlepszym rozwiązaniem jest utworzenie katalogu bin w katalogu domowym.

Następnie utworzyłem sugerowany skrypt i nadałem mu nazwę simplay:

#!/bin/sh
xdotool key XF86AudioPlay

Znajduje się w folderze bin, który jest częścią tego PATH, działa dobrze i można go uruchomić z dowolnego miejsca.

Podczas próby utworzenia niestandardowego skrótu nie udało mi się go uruchomić, konfiguracja jest następująca:

Name: test
Command: simplay

Shortcut: Ctrl+Alt+R

Po dokładniejszych poszukiwaniach znalazłem inny sposób wykonania skrótu:

gnome-terminal -e simplay

Wypróbowałem to na terminalu i zauważyłem, że podczas jego wykonywania szybko otworzy nowe okno terminala, uruchomi proces potomny, zatrzyma muzykę i natychmiast zamknie okno.

Zmieniłem polecenie na skrócie i po jego naciśnięciu zauważyłem to samo zachowanie otwierające terminal i natychmiast zamykające się, ale tym razem proces potomny nie wstrzymał muzyki, co sprawia, że ​​myślę, że skrypt został wywołany przy wszystkich moich poprzednich próbach ale jakoś nie jest w stanie wykonać.

Jak mogę rozwiązać ten problem zgodnie z Twoją wiedzą?

Odpowiedzi:


12

Problem

Skrót jest wykonywany w tym samym czasie, co naciśnięcie symulowanego klawisza

Jeśli uruchomisz polecenie, symulując naciśnięcie klawisza, wywoływane za pomocą ... innego naciśnięcia klawisza, faktycznie symulujesz trzecie naciśnięcie klawisza, które jest kombinacją obu :)

Rozwiązać

Musisz uniemożliwić uruchomienie skrótu w tym samym czasie, co naciśnięcie symulowanego klawisza, innymi słowy, dodaj opóźnienie:

/bin/bash -c "sleep 1 && xdotool key XF86AudioPlay"

Dodaj to polecenie do skrótu i ​​powinno działać.

Uwaga

Oczywiście możesz zagrać trochę z wartością in sleep 1, aby ustawić najlepszą wartość, która będzie wygodna, w zależności od tego, jak „lepka” kombinacja jest naciskana. sleep 0.5może równie dobrze zrobić i sprawić, by skrót działał szybciej.


8

Możesz także użyć polecenia bezpośrednio w definicji skrótu, więc nie musisz tworzyć dla niego samodzielnego skryptu.

Zamiast korzystać z obejścia „uśpienia 1”, możesz użyć --clearmodifiersflagi, tzn. Niestandardowy skrót wyglądałby następująco:

Name: test
Command: xdotool key --clearmodifiers XF86AudioPlay

Shortcut: Ctrl+Alt+R

Dla mnie działa to podczas mapowania skrótów do Super+F9.


Czy powyższy fragment kodu ma być plikiem? Jeśli tak, to czy musisz umieścić go w określonym miejscu lub uruchomić określone polecenie, aby zaimplementować skrót?
JellicleCat

1
Fragment jest tylko opisem używanego skrótu. W Ubuntu możesz tworzyć własne skróty w ustawieniach klawiatury. Jednak od tamtej pory zaktualizowałem moją wersję Ubuntu i teraz jestem w stanie bezpośrednio mapować akcję „Graj (lub graj / pauza)” na wybraną kombinację klawiszy, która okazuje się bardziej niezawodna niż używanie xdotool.
Jan

Jeszcze lepiej niż --clearmodifiers jest wydanie „klucza” dla skrótu, którego używasz do wywoływania skryptu. Nieznaczną wadą jest to, że musisz zaktualizować skrypt, jeśli zmienisz skrót klawiszowy, aby wywołać skrypt.
wanad

1

Alternatywą (dla lepszej wydajności) sleep 1 && xdotool ...jest użycie xdotool do zwolnienia klawiszy skrótu. Nieco dłuższe, ale możesz także użyć

/bin/bash -c "xdotool keyup R Alt_L Ctrl_L && xdotool key XF86AudioPlay"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.