dlatego
Mirasy z #bash #linux #programowanie (problem ze skryptem + #pytaniedoeksperta )
Próbuję zrobić prosty skrypt, który będzie w tylko konkretnym oknie klikał myszką w 1 punkcie co 1 sekundę:

while true
do
xdotool search --name "Abcde xyxy xyxy" mousemove 500 100 click 1
sleep 1
done

(mam to w pliku "skrypt.sh", który odpalam z konsoli komendą "sh skrypt.sh")

Powyższy skrypt nie działa do końca dobrze, bo:
- jeżeli na oknie z nazwą "Abcde xyxy xyxy" pojawi się inne okno, które będzie zasłaniać koordynaty 500 100, to będzie klikać na tym nowym oknie.

Jak poprawić, żeby:
1. koordynaty dotyczyły tylko danego okna ("Abcde xyxy xyxy"), a nie całego ekranu (wychodzi na to, że tak jest teraz)?
2. skrypt pauzował się przy zmienie aktywnego okna ("Abcde xyxy xyxy") na inne (np. poprzez Alt+Tab)?
3. Sam początek nazwy okna "Abcde " jest zawsze taki sam, ale czasem (po paru dniach) dalsza część jest inna. Można jakoś użyć w skrypcie samego początku "Abdce " z jakimś myczkiem zastępującym dalszą część nazwy, żeby nie musieć aktualizować nazwy okna w skrypcie?
4. W ogóle jest taka możliwość, żeby klikało w zminimalizowanym oknie i można było normalnie działać myszką w innym oknie? (z tego co się orientowałem, to chyba nie ma takiej opcji)

(Wiem, że chyba można zamiast "search --name [nazwa]" użyć "--window [ID]", ale musiałbym często sprawdzać ID okna (po ponownym włączeniu) i podmieniać w pliku ze skryptem, więc no wygodniej byłoby z nazwą jak opisałem wyżej)

[operuję na Xubuntu 20.04.3 LTS]
0
  • Najlepsze
  • Wszystkie komentarze
dlatego
@kajak98: ok ( ͡º ͜ʖ͡º)
1
BArtus
@dlatego: nie nie musiał byś, znajdź okno i zapisz id do zmiennej żeby później użyć go do generowania eventów. Poza tym --search dział z regexami więc wystarczy ci początek nazwy okna. ¯\_(ツ)_/¯

while() {
id=$(xdotool search --name "Abcde .*")
xdotool --window "$id" mousemove 500 100 click 1
1
BArtus
@dlatego: możesz też pobawić się z autokey, choć to pewnie overkill
https://linuxhint.com/autokey_automate_linux_games/
1
BArtus
@dlatego:
2. Dodaj check w pętli porównujący z id aktualnie wybranego okna.

if [ "$(xdotool getwindowfocus)" -eq "id" ]; then
xdotool --window "$id" mousemove 500 100 click 1
fi
1
BArtus
@dlatego: 4. Da się, trzeba odpalić program przez xvfb i do xdotool dodać nr wirtualnego ekranu.


#!/usr/bin/env bash
save=$DISPLAY
1
BArtus
@dlatego: ad4. Jak potrzebujesz podglądu na żywo to zamiast xvfb trzeba użyć Xephyr
1
BArtus
co sekundę zwraca w konsoli dokładnie taki błąd (bez względu na to, które okno mam sfokusowane):

5: [: Illegal number: id


No tu to powinieneś sam ogarnąć ( ͡~ ͜ʖ ͡°) brakuje $ przed id więc zamiast zmiennej masz
1
kajak98
@dlatego: bardzo prosze mnie zawołać, bo mnie to zainteresowało... osobiście nie pomoge ale chętnie się dowiem xD
0
PortowySzczur
@dlatego: manuale kolega czyta? nie wiem czy pomogę ale te opcje wydają się być tym o co pytasz

$ man xdotool

...

--window window

Send keystrokes to a specific window id. You can use
0
dlatego
@dlatego: manuale kolega czyta? nie wiem czy pomogę


@PortowySzczur: czytałem i odniosłem się do tego na końcu

(Wiem, że chyba można zamiast "search --name [nazwa]" użyć "--window [ID]", ale musiałbym często sprawdzać ID okna (po ponownym włączeniu) i podmieniać w pliku ze skryptem, więc no wygodniej byłoby z nazwą jak opisałem wyżej)
0
dlatego
@BArtus: ok dzięki! ( ͡° ͜ʖ ͡°)

Więc problemy nr 1. i nr 3. są rozwiązane. Nr 4. z tym skryptem dalej nie klika w zminimalizowanym/niesfokusowanym oknie (czego się w sumie spodziewałem, no ale widocznie się nie da z tą aplikacją).

A jest przynajmniej sposób na nr 2. - żeby skrypt pauzował się jeśli zmienię np. Alt-Tabem okno (na którym klika) na inne? Bo jak
0
BArtus
@dlatego: i jak, zrobiłeś?
0
dlatego
@BArtus: chwilowo nie mam dostępu do lapka z tym, ale dam znać jak zrobię (i dzięki jeszcze raz!)
0
dlatego
2. Dodaj check w pętli porównujący z id aktualnie wybranego okna.


if [ "$(xdotool getwindowfocus)" -eq "id" ]; then

xdotool --window "$id" mousemove 500 100 click 1

fi


@
0