Wpis z mikrobloga

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]
dlatego - Mirasy z #bash #linux #programowanie (problem ze skryptem + #pytaniedoekspe...

źródło: comment_1637263262KOA43oliGM8GAPM132lJdQ.jpg

Pobierz
  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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)
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@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
  • Odpowiedz
@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
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@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
  • Odpowiedz
via Wykop Mobilny (Android)
  • 1
@dlatego: 4. Da się, trzeba odpalić program przez xvfb i do xdotool dodać nr wirtualnego ekranu.


#!/usr/bin/env bash
save=$DISPLAY
  • Odpowiedz
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


@
  • Odpowiedz
@BArtus: albo w sumie nie zawracaj sobie tym głowy, jeśli to może być problematyczne. Najwyżej będę się starał konsolę trzymać mniej więcej w obszarze klikania, żeby po powrocie do niej alt-tabem klikało na niej - a tam już ctrl+c zatrzymam skrypt
(odnośnie 4. punktu jeszcze nie kombinowałem)
  • Odpowiedz
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
  • Odpowiedz
( ͡~ ͜ʖ ͡°) brakuje $


@BArtus: ooomg faktycznie () działa już elegancko, dzięki :D

A z tym fajnym skryptem na xvfb jeszcze muszę poogarniać, dam znać ( ͡° ͜ʖ ͡°) Dzięki mistrzu!
  • Odpowiedz