LINUX.ORG.RU

Проблемы с xdotool

 ,


0

1

Имеется следующий код:

#!/bin/bash
teeworlds "connect $1" >/dev/null &
sleep 0.2
TEEID=$(xdotool getwindowfocus)
while :
do
    ACTION=$(shuf -i 1-4 -n 1)
    case $ACTION in
    1) xdotool key --window $TEEID "q" ;;
    2) xdotool keyup --window $TEEID "d" && 
    xdotool keyup --window $TEEID "a" &&
    xdotool keydown --window $TEEID "d" ;;
    3) xdotool keyup --window $TEEID "d" && 
    xdotool keyup --window $TEEID "a" && 
    xdotool keydown --window $TEEID "a" ;;
    4) xdotool key --window $TEEID "space" ;;
    esac
    sleep 0.1
    if ! xdotool search --class teeworlds | grep $TEEID >/dev/null
    then break; fi
done
Собственно, он посылает определенные клавиши (в случайном порядке) в игру с задержкой на 0.1 сек. Все бы ничего, но иногда, при манипуляциях с окнами (свернуть, открыть, открыть игру в фул в другом окне) сбивается скрипт и выдает примерно следующее:
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  15 (X_QueryTree)
  Resource id in failed request:  0xc6ea37
  Serial number of failed request:  1144
  Current serial number in output stream:  1144
0xc6ea37 - не тот id окна, что находится в TEEID, это точно. Тем не менее, иногда все работает довольно долго и без ошибок. Вопрос следующий: откуда он берет такой id, если переменная его не содержит? К слову, если намеренно запустить xdotool с неправильным id, то ошибка вместо X_QueryTree будет уже X_SendEvent, только вот мне это ничего не дает. Прошу помочь

Я полагаю, что эту ошибку выдает «xdotool search». Ведь именно он начинает искать окно по иерархии (всей вообще, начиная от root window) и наверняка вызывает XQueryTree.

if ! xdotool search --class teeworlds | grep $TEEID >/dev/null

Представляешь, да? Во-первых, ограничь глубину поиска (там есть опции - maxdepth, по-моему). Во-вторых, сделай до первого обнаружения поиск (тоже есть опция). Очень дорогая операция. Или подумай над другим способом. А проблема в том, скорее всего, что какое-то окно в иерархии (необязательно top level) успело исчезнуть, пока до него пришла очередь. Вот и ошибка.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 7 )
#!/bin/bash -x
anonymous ()
Ответ на: комментарий от Zubok

Заменил на более лаконичное:

if [ $? -eq 1 ]; then break; fi
Все отлично работает, хоть 8 сразу запускай) Спасибо)

butylka ()
Ответ на: комментарий от Zubok

Да не, это скрипт недобота для tee сервера, чтобы его наполнить по-быстрому хотя бы на четверть, а то на почти пустой никто не заходит. Затем уже, когда более менее игроков накопилось, я сворачиваю скрипт, чтобы места освободились.

butylka ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.