Журнал LinuxFormat - перейти на главную

LXF154:Xdotool

Материал из Linuxformat
Перейти к: навигация, поиск

Ав­то­ма­ти­за­ция Пре­вра­ща­ем слож­ные ма­ни­пу­ля­ции мы­шью в про­стые скрип­ты

Содержание

Xdotool: Скрип­ты для мы­ши

Лю­бую за­да­чу, ис­пол­няе­мую по­сред­ст­вом пе­ре­дви­жения и на­жа­тий мы­шью, мож­но вы­полнить с по­мо­щью скрип­та и xdotool, до­ка­зы­ва­ет Майк Сон­дерс. Бы­ли вре­ме­на, когда нас уве­ря­ли, что ком­пь­ю­те­ры об­лег­чат нам жизнь. Они, мол, ав­то­ма­ти­зи­ру­ют все под­ряд, а от нас для по­лу­чения по­тря­саю­щих ре­зуль­та­тов по­тре­бу­ет­ся са­мый ми­зер уси­лий. Ка­лен­дарь на стене Ба­шен LXF го­во­рит, что это офи­ци­аль­ное Бу­ду­щее (™) на­сту­пи­ло; и да­ле­ко ли мы уе­ха­ли? Увы, мы все еще тра­тим ку­чу вре­мени на пе­ре­дви­жение пла­сти­ко­вой шту­ко­ви­ны для пе­ре­ме­щения кур­со­ра на эк­ране, что­бы ткнуть на неудоб­ные мел­кие икон­ки. Не­смот­ря на все дости­жения техно­ло­гий гра­фи­че­­ско­­го ин­тер­фей­са за мно­гие го­ды, мы по-преж­нему тра­тим слиш­ком мно­го вре­мени на щелч­ки мы­шью для вы­полнения за­дач.

Но ре­шение есть, и оно зна­чи­тель­но по­вы­сит про­из­во­ди­тель­ность к кон­цу на­ше­го уро­ка. На­зы­ва­ет­ся оно xdotool, и, в со­от­вет­ст­вии с опи­санием ав­то­ра, «ими­ти­ру­ет ввод с кла­виа­ту­ры и мы­ши». Конеч­но, са­мо по се­бе это зву­чит не очень ин­те­рес­но, но да­вай­те ду­мать об этом так: это ин­ст­ру­мент команд­ной стро­ки, ко­то­рый дей­ст­ву­ет как вир­ту­аль­ная кла­виа­ту­ра и мышь, по­зво­ляя объ­е­динить ко­ман­ды управ­ления гра­фи­че­­ским ин­тер­фей­сом при­ло­жений. Мож­но дви­гать кур­сор мы­ши, от­прав­лять дис­плею щелч­ки, вы­би­рать за­дан­ные ок­на и да­же пе­ре­ме­щать ок­на ме­ж­ду ра­бо­чи­ми сто­ла­ми. В конеч­ном сче­те, это по­зво­лит со­брать за­да­чи, тре­бую­щие суе­ты с мы­шью и кла­виа­ту­рой, в еди­ный скрипт.


Итак, нач­нем

Ско­рее все­го, па­ке­т xdotool досту­пен в ре­по­зи­то­рии ва­ше­го ди­ст­ри­бу­ти­ва; ес­ли нет – возь­ми­те его с www.semicomplete.com/projects/xdotool. За­ви­си­мо­сти – это обыч­ные биб­лио­те­ки X, и их не долж­но быть труд­но уста­но­вить. Ус­та­но­вив его, от­крой­те ок­но тер­ми­на­ла и на­ве­ди­те ука­за­тель мы­ши на эле­мент при­ло­жения: ме­ню Ре­дак­ти­ро­вать. Но – не на­жи­май­те! Вме­сто это­го вве­ди­те в тер­ми­на­ле:

xdotool click 1

И – вуа­ля, ме­ню Ре­дак­ти­ро­вать от­кры­ва­ет­ся, как ес­ли бы вы ре­аль­но на­жа­ли кноп­ку мы­ши. Здесь xdotool от­прав­ля­ет сиг­нал на­жа­тия на X Window System (основ­ной гра­фи­че­­ский слой ра­бо­че­го сто­ла Linux), а это воз­мож­но по­то­му, что X был раз­ра­бо­тан с боль­шой гиб­ко­стью. Он мыс­лит ши­ро­ко и зна­ет, что щел­кать мож­но не толь­ко мы­шью: та­кие со­бы­тия мо­гут быть вы­зва­ны тач­па­дом, сен­сор­ным эк­ра­ном, гра­фи­че­­ским план­ше­том и дру­ги­ми уст­рой­ст­ва­ми. И он доста­точ­но смыш­лен, что­бы принимать «син­те­ти­че­­ские» щелч­ки, вы­полнен­ные про­грам­мой ти­па xdotool.

Так вот, это очень про­стой при­мер, но он уже на­шел при­менение. На­при­мер, мно­гие лю­ди стра­да­ют мы­шеч­ной бо­лью, осо­бен­но вы­зван­ной ра­бо­той с мы­шью. Ис­поль­зуя xdotool, мож­но на­стро­ить ок­ру­жение ра­бо­че­го сто­ла или окон­но­го менед­же­ра так, что ма­ло­ис­поль­зуе­мый ключ (на­при­мер, об­рат­ный штрих) за­пуска­ет при­ве­ден­ную ко­ман­ду, тем са­мым по­зво­ляя пе­ре­ме­щать мышь пра­вой ру­кой, а на­жи­мать ле­вой, раз­де­лив на­груз­ку. Об­ра­ти­те внимание, что но­мер 1 в ко­ман­де от­но­сит­ся здесь к кла­ви­ше мы­ши: 1 – ле­вая, 2 – сред­няя и 3 — пра­вая. Вы мо­же­те так­же ис­поль­зо­вать 4 для про­крут­ки вверх вир­ту­аль­но­го ко­ле­са мы­ши, а 5 – для про­крут­ки вниз.

По­про­бу­ем что-нибудь чуть по­сложнее. xdotool по­зво­ля­ет пе­ре­ме­щать ука­за­тель мы­ши по эк­ра­ну, ис­поль­зуя ко­ман­ду mousemove. На язы­ке сис­те­мы X Window, эк­ран на­чи­на­ет­ся с верх­него ле­во­го уг­ла с ко­ор­ди­на­та­ми X и Y (го­ри­зон­таль­ной и вер­тикаль­ной) 0 и 0. Ес­ли раз­ре­шение эк­ра­на 1024 × 768, то па­ра­мет­ры для верхней пра­вой ко­ор­ди­на­ты – 1023 (X) и 0 (Y), пра­вой нижней – 1023 (X) и 767 (Y), и т. д.

Пе­ре­мес­тим-ка мы ука­за­тель мы­ши на кноп­ку глав­но­го ме­ню на ра­бо­чем сто­ле и на­жмем на него, что­бы от­крыть. Рас­клад­ка ва­ше­го ра­бо­че­го сто­ла мо­жет от­ли­чать­ся, так что вам нуж­но бу­дет под­пра­вить ко­ор­ди­на­ты, но в на­шем слу­чае – Xubuntu, с глав­ным ме­ню в верхней ле­вой час­ти эк­ра­на. По­про­буй­те сле­дую­щую ко­ман­ду:

xdotool mousemove 0 0 click 1

Здесь вы ви­ди­те, что мы объ­е­динили ко­ман­ды вме­сте – у нас есть mousemove, затем сле­ду­ют ко­ор­ди­на­ты X и Y, а по­том ле­вая кноп­ка мы­ши. Это от­кры­ва­ет глав­ное ме­ню. Мы на пу­ти к ав­то­ма­ти­за­ции на­ше­го ра­бо­че­го сто­ла! Кое-что, од­на­ко, нуж­но иметь в ви­ду. xdotool про­сто всле­пую вы­пол­ня­ет по­сле­до­ва­тель­ность дей­ст­вий, и не в курсе, яв­ля­ет­ся ли это щелч­ком на чем-то ре­аль­ном. Знае­те ли вы, за­пуская свою Linux-ма­ши­ну – а за­груз­ка глав­но­го ме­ню или за­груз­чи­ка про­грам­мы мо­жет за­нять несколь­ко се­кунд – когда за­гру­жа­ют­ся икон­ки и ре­сур­сы? Так вот, эти за­держ­ки мо­гут вли­ять на ко­ман­ду xdotool. Очень за­ман­чи­во на­чать опи­сы­вать чу­дес­ные ком­би­на­ция­ми дви­жений и щелч­ков, но ес­ли что-то в ва­шей сис­те­ме по­че­му-ли­бо при­тор­мо­зит­ся, все мо­жет сле­теть с син­хрониза­ции.


На­при­мер, на на­шей ма­шине мы хо­тим ав­то­ма­ти­зи­ро­вать про­цесс по­лу­чения со­стояния за­ряд­ки. Как пра­ви­ло, это вклю­ча­ет пе­ре­ме­щение мы­ши на зна­чок ак­ку­му­ля­то­ра в сис­тем­ном лотке,
(thumbnail)
На про­стей­шем уров­не, xdotool по­зво­ля­ет вы­пол­нять от­дель­ные дей­ст­вия, та­кие как вир­ту­аль­ное на­жа­тие мы­шью.
щел­чок пра­вой кноп­кой мы­ши и вы­бор зна­чения Уров­ня за­ря­да ак­ку­му­ля­то­ра в кон­тек­ст­ном ме­ню. Мы мог­ли бы сле­пить ку­чу раз­лич­ных команд xdotool в од­ну стро­ку, что­бы до­бить­ся это­го, но что про­изой­дет, ес­ли сис­те­ма за­ня­та, и кон­тек­ст­ное ме­ню не поя­вит­ся сра­зу? Зна­чит, нуж­но до­ба­вить ко­ман­ды про­стоя ме­ж­ду об­ра­щения­ми xdotool. Вот наш скрипт, ко­то­рый так­же вклю­ча­ет несколь­ко но­вых функ­ций:
  1. !/bin/bash

xdotool mousemove --sync 1000 10

xdotool click 3

sleep 1

xdotool mousemove_relative --sync 0 80

xdotool click 1


Мы со­хранили это в ви­де batinfo.sh в /usr/bin, так что мо­жем при­менить на­строй­ки кла­виа­ту­ры Xfce и при­вя­зать ком­би­на­цию кла­виш (Ctrl + Alt + B) к за­пуску это­го скрип­та. Боль­шин­ст­во ра­бо­чих сто­лов и окон­ных менед­же­ров по­зво­ля­ют ас­со­ции­ро­вать ком­би­на­ции кла­виш с ко­ман­да­ми – на­при­мер, для за­пуска ок­на тер­ми­на­ла; по­это­му вы долж­ны быть в со­стоянии сде­лать нечто по­доб­ное в ва­шей сис­те­ме.

Итак, рас­смот­рим, как это ра­бо­та­ет. На­ша икон­ка Управ­ление пи­танием на­хо­дит­ся в верхней панели, бли­же к пра­вой час­ти эк­ра­на. Пу­тем про­вер­ки мы уста­но­ви­ли, что мышь для на­хо­ж­дения над ним долж­на быть на 1000 по оси X и 10 по оси Y. Об­ра­ти­те внимание на оп­цию --sync в ко­ман­де mousemove: она го­во­рит, что мы про­сим X Window System пе­ре­мес­тить мышь, но по­до­ж­дать, по­ка не вернет­ся со­об­щение с под­твер­ждением, что этот шаг был успеш­ным. Так что в прин­ци­пе, это хо­ро­шая идея – ис­поль­зо­вать --sync.

За­тем мы де­ла­ем щел­чок пра­вой кноп­кой мы­ши, что­бы от­крыть кон­тек­ст­ное ме­ню, но остав­ля­ем се­кун­ду на вре­мя от­кли­ка, при по­мо­щи ко­ман­ды sleep 1. Это да­ет нам немно­го вре­мени, ес­ли сис­те­ма за­ня­та – на­при­мер, ес­ли про­ис­хо­дит за­груз­ка па­ке­та об­нов­лений в фо­но­вом ре­жи­ме. Кон­тек­ст­ное ме­ню мгно­вен­но мо­жет не ото­бра­зить­ся, так как про­цес­сор и же­ст­кий диск за­ня­ты. По­это­му мы ждем се­кун­ду, что­бы дать Xfce шанс сде­лать свою ра­бо­ту. (Воз­мож­но, в ва­шей кон­крет­ной сис­те­ме вы за­хо­ти­те сменить этот па­ра­метр на две-три се­кун­ды, ес­ли ва­ша ма­ши­на час­то за­гру­же­на.)

Да­лее, там поя­ви­лась но­вая ко­ман­да: mousemove_relative. Как сле­ду­ет из на­звания, она про­сто пе­ре­ме­ща­ет ука­за­тель от­но­си­тель­но те­ку­щей по­зи­ции, а не в аб­со­лют­ное по­ло­жение на эк­ране. В на­шем слу­чае ин­фор­ма­ция по уров­ню за­ряд­ки в кон­тек­ст­ном ме­ню на­хо­дит­ся на 80 пик­се­лей вниз от то­го, где мы ак­ти­ви­ро­ва­ли ме­ню, так что мы дви­жем­ся к этой точ­ке. Это да­ет нам до­полнитель­ную гиб­кость: ес­ли мы ку­да-нибудь пе­ре­двинем икон­ку за­ря­да ак­ку­му­ля­то­ра, нуж­но бу­дет из­менить толь­ко пер­вую ко­ман­ду mousemove, так как все осталь­ное останет­ся по от­но­ше­нию к ней прежним.

Про­дви­ну­тые при­ме­не­ния

Спо­соб­ность xdotool на­жать на кноп­ку по за­про­грам­ми­ро­ван­ным ко­ор­ди­на­там – это здо­ро­во, но не так уж по­лез­но, ес­ли пе­ред вы­полнением на­ших дей­ст­вий ок­но нуж­но ак­ти­ви­ро­вать вруч­ную.

До­пустим, у вас есть от­лич­ный му­зыкаль­ный про­иг­ры­ва­тель, ко­то­рый всегда ра­бо­та­ет в фо­но­вом ре­жи­ме, а иногда всплы­ва­ет как ок­но для вы­полнения опе­ра­ции (на­при­мер, пе­ре­клю­чения на дру­гой плей-лист). Не­ко­то­рые ме­диа-при­ло­жения допускают управ­ление ими из команд­ной стро­ки, что по­зво­ля­ет ото­бра­жать ком­би­на­ции кла­виш в окне менед­же­ра ко­ман­ды, но это сред­ст­во есть не у всех. Вме­сто то­го, что­бы ка­ж­дый раз вруч­ную за­пускать ваш ме­диа-плей­ер, а за­тем скрипт xdotool (про­ще сра­зу на­жать вруч­ную), мож­но ве­леть xdotool ав­то­ма­ти­че­­ски пе­ре­клю­чать­ся на со­от­вет­ст­вую­щие ок­на с по­мо­щью команд search и windowactivate.

На­при­мер, мы толь­ко что от­кры­ли ме­диа-плей­ер Parole на на­шем ра­бо­чем сто­ле и оста­ви­ли его ра­бо­тать в фо­но­вом ре­жи­ме,

(thumbnail)
С по­мо­щью не­сколь­ких mousemove-по­доб­ных ко­манд мож­но соз­дать ро­бо­та, ри­сую­ще­го Мо­ну Ли­зу.

по­ка мы занима­емся своим делом в тер­ми­на­ле. Мы вве­дем ко­ман­ду

xdotool Parole “Firefox” windowactivate

Это за­ста­вит Parole вый­ти на пе­редний план. По­про­буй­те это на сво­ей ма­шине, за­менив Parole на что-нибудь. Здесь xdotool ра­бо­та­ет с окон­ным менед­же­ром, что­бы най­ти оп­ре­де­лен­ные ок­на – он ищет пер­вое ок­но со сло­вом “Parole” в на­звании. Вы мо­же­те за­менить это лю­бым дру­гим, а ес­ли сов­па­дения нет, ниче­го не про­изой­дет.

Конеч­но, ок­но Parole мог­ло быть в лю­бом мес­те эк­ра­на, и по­это­му мы не мо­жем на­чать на­шу се­рию на­жа­тий на оп­ре­де­лен­ном мес­те. На­до на­вес­ти кур­сор мы­ши на Parole и на­чать ра­бо­тать от­ту­да.

Как вы уже дога­да­лись, ав­то­ры xdotool по­ду­ма­ли об этом, так что...

xdotool search “Parole” windowactivate --sync mousemove --window %1 0 0

Най­дя и ак­ти­ви­ро­вав ок­но Parole, мы вы­пол­ня­ем ко­ман­ду mousemove, но на сей раз на мес­те ок­на 1 из ре­зуль­та­тов по­ис­ка (т. е. пер­вого ок­на, в за­го­лов­ке ко­то­ро­го есть Parole – дру­гие вам, ве­ро­ят­но, никогда не по­на­до­бят­ся).

Мы пе­ре­во­дим кур­сор в точ­ку 0 0 – это ко­ор­ди­на­ты X и Y для верхнего ле­во­го уг­ла ок­на. От­лич­но! Те­перь мож­но пи­сать скрипт, ис­поль­зую­щий сме­щение ко­ор­ди­нат от дан­ной точ­ки, на­жа­тия кно­пок, от­кры­тие ме­ню, при же­лании – про­вер­ку флаж­ков, неза­ви­си­мо от то­го, где пер­во­на­чаль­но бы­ло ок­но про­грам­мы.

Ес­ли вам нуд­но, что ва­ши ок­на разбросаны в про­из­воль­ных мес­тах, xdotool пе­ре­ме­стит их за вас. По­про­буй­те ко­ман­ду

xdotool search “Parole” windowactivate --sync windowmove 100 200

Она най­дет Parole и пе­ре­мес­тит его ок­на на 100 пик­се­лей по ши­рине эк­ра­на и на 200 вниз. Вы мо­же­те вы­нуть часть windowactivate --sync и осу­ще­ст­в­лять пе­ре­дви­жение в фо­но­вом ре­жи­ме, ес­ли хо­ти­те. А мож­но из­мененить раз­ме­ры ок­на:

xdotool search “Parole” windowsize 500 200

Это на­хо­дит Parole и из­ме­ня­ет его до 500 пик­се­лей в ши­ри­ну, 200 по вы­со­те. Вы да­же мо­же­те пе­ре­мес­тить ок­но на дру­гое ра­бо­чее ме­сто / вир­ту­аль­ный ра­бо­чий стол та­ким об­ра­зом:

xdotool search “Parole” set_desktop_for_window 0

Про­сто из­мените чис­ло в кон­це за­ви­си­мо­сти на тре­буе­мый ра­бо­чий стол. От­ме­тим, что в ти­пич­ной манере про­грам­ми­ро­вания, 0 – это пер­вый ра­бо­чий стол, 1 – вто­рой, и т. д.

Что за дви­жения, чу­вак

Щелч­ки ис­пол­ня­ют­ся хо­ро­шо; ну, а ес­ли мы хо­тим вы­полнить опе­ра­цию, где кноп­ка мы­ши всегда удер­жи­ва­ет­ся, та­кую как щелк­нуть-и-пе­ре­та­щить?

К сча­стью, xdotool по­зво­ля­ет и это, пред­ла­гая бо­лее универ­саль­ную аль­тер­на­ти­ву – ко­ман­ду click: mousedown и mouseup. Да­вай­те по­про­бу­ем это, за­пустив GIMP, вы­брав в ме­ню Файл > Соз­дать и соз­дав но­вый ри­су­нок с раз­ме­ром по умол­чанию (за­го­ло­вок его ок­на дол­жен со­дер­жать «Без на­звания»).

Вы­бе­ри­те ин­ст­ру­мент Ка­ран­даш из ок­на Панель ин­ст­ру­мен­тов GIMP, а за­тем от­крой­те тер­ми­нал и вве­ди­те сле­дую­щий текст в фай­ле под на­званием test.sh:

xdotool search “Untitled” windowactivate --sync mousemove --window %1 100 100

sleep 0.5

xdotool mousedown 1

sleep 0.5

xdotool mousemove_relative --sync 200 200

sleep 0.5

xdotool mouseup 1


(thumbnail)
Про­смот­ри­те страницу помощи (“man xdotool”), чтобы получить список всех доступных операций.
Пи­ши­те нам по ад­ре­су letters@linuxformat.ru с ва­шим скрип­том, и мы опуб­ли­ку­ем вы­бор­ку из них на оче­ред­ном LXFDVD.



Здесь мы ак­ти­ви­зи­ру­ем ок­но хол­ста GIMP и пе­ре­хо­дим в точ­ку 100, 100 (X, Y) внут­ри него. За­тем мы уста­нав­ли­ва­ем ле­вую кноп­ку мы­ши вниз, дви­га­ем мышь по диа­го­на­ли вниз-впра­во на 100 пик­се­лей в ка­ж­дом на­прав­лении, а за­тем уста­нав­ли­ва­ем кноп­ку мы­ши вверх. Дру­ги­ми сло­ва­ми, мы соз­да­ли ро­бо­та, ко­то­рый ри­су­ет диа­го­наль­ную линию – см. эк­ран­ный снимок на пре­ды­ду­щей странице. Как и в дру­гих при­ме­рах, мы здесь вклю­чи­ли несколь­ко команд пау­зы, что­бы не об­го­нять ра­бо­ту окон­но­го менед­же­ра или об­ра­бот­ку в GIMP. (Ес­ли ва­ша ма­ши­на осо­бен­но про­из­во­ди­тель­на, из­мените пе­рио­ды ожи­дания от пол­се­кун­ды до 0,1.)

По­ды­то­жим: на на­шем уро­ке мы изу­чи­ли раз­лич­ные спо­со­бы взаи­мо­дей­ст­вия с гра­фи­че­­ским ин­тер­фей­сом – пе­ре­ме­щение мы­ши, от­прав­ка вир­ту­аль­ных щелч­ков и пе­ре­ме­щений и по­иск кон­крет­но­го ок­на.

Со­бе­ри­те эти дей­ст­вия вме­сте, изу­чи­те по­боль­ше воз­мож­но­стей на странице ру­ко­во­дства xdotool, и вы смо­же­те ав­то­ма­ти­зи­ро­вать прак­ти­че­­ски все на ра­бо­чем сто­ле, вы­сво­бо­див вре­мя на бо­лее важ­ные ве­щи. Эй, кто хо­чет сыг­рать во Frozen Bubble?


Персональные инструменты
купить
подписаться
Яндекс.Метрика