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
@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 "WINDOW STACK"

references like "%1" and "%@" here. If there is a window stack,

then "%1" is the default, otherwise the current window is used.

selectwindow

Get the window id (for a client) by clicking on it.
@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)
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
sleep 1
}

A co do klikanie w zminimalizowanych, niesfokusowanych okanach to zależy od programu, często takie zdarzenia są odrzucane np. przez chromium, dodatkowo
@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 klika
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
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
export DISPLAY=:44
case "$1" in
start) Xvfb $DISPLAY & ;;
run) ./program & ;;
xdo) xdotool mousemove 500 100 click 1
show)
xwd -root | xwud -display $save & ;;
stop) ps auxww | grep "Xvfb $DISPLAY" | awk '{print $2}' | xargs kill ;;
all) DISPLAY=$save; $0 start; $0 calc; sleep
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


@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
(5. linia jest z "if [ "$(xdotool getwindowfocus)" -eq "id" ]; then")
@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)
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 porównanie do stringa.

Powinno być:

if [ "$(xdotool getwindowfocus)" -eq "$id" ]; then
xdotool --window "$id" mousemove 500 100 click 1
fi

Masz tu automata na xvfb którego
( ͡~ ͜ʖ ͡°) 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!