MC, 14:14 środa, 07.03.2012 r.
Ilustracja do artykułu: XMacro - Czyli odpowiedź na pytanie jak tworzyć makra na systemach Linux

XMacro - Czyli odpowiedź na pytanie jak tworzyć makra na systemach Linux

Makra, czyli skrypty wykonywane przez jakiś program, które symulują działania użytkownika komputera typu przenoszenia kursora myszy, wciskanie przycisków itp., od czas do czasu mogą się okazać przydatne. Z tego powodu chciałbym zaprezentować dziś program XMacro, który umożliwi nam tworzenie (nagrywanie) i wykonywanie zdefiniowanych przez nas makr, w systemach linuksowych.

Gdzie znajdziemy program XMacro?

Program XMacro jest gotów do pobrania ze strony producenta (XMacro) ale również znajduje się w repozytoriach, dlatego możemy go pobrać za pomocą polecenia:
sudo apt-get install xmacro
(analogicznie dla aptitude)
Po zainstalowaniu tego pakietu staną się nam dostępne 4 programy, z którym najbardziej istotne są dwa: xmacroplay oraz xmacrorec.

Do czego te programu służą?

Jak same nazwy skazują, dzięki tym programom możemy makro stworzyć (nagrać) oraz wykonać. Gdy zechcemy makro nagrać, poproszeni zostaniemy o wskazanie klawisza, którego wciśnięcie przerwie nagrywanie. Myślę, że dobrze jest się zastosować do rady twórców programu i wybrać klawisz Escape, chyba że akurat planujemy go użyć w makrze. Ja jednak nagrywania makr nie polecam (o tym dlaczego tak sądzę napiszę w końcowych uwagach). Skupmy się dlatego na wykonywaniu makra. Program xmacroplay wymaga wskazania urządzenia, na którym ma wykonywać odpowiednie operacje. Zazwyczaj będzie to nasz własny komputer, więc podamy parametr :0. Z kolei akcje do wykonania czytane są ze standardowego wejścia, więc albo przekierujemy na wejście plik z komendami, albo połączymy strumień wejścia xmacroplay ze strumieniem wyjścia polecenia cat, który wyświetli zawartość pliku z komendami. Jak komu wygodniej, a wygląda to tak:
xmacroplay :0 < plik_z_poleceniami_do_wykonania
lub
cat plik_z_poleceniami_do_wykonania | xmacroplay :0

Jakie mamy dostępne polecenia do wykonania?

Cytując stronę autora, mamy do wyboru następujące polecenia:

Delay [sec]		- delays the program with [sec] secundums
ButtonPress [n]		- sends a ButtonPress event with button [n]
			  this emulates the pressing of the mouse button [n]
ButtonRelease [n]	- sends a ButtonRelease event with button [n]
			  this emulates the releaseing of the mouse button [n]
MotionNotify [x] [y]	- sends a MotionNotify event
			  this emulates the movment of the mouse 
KeyCodePress [kc]	- sends a KeyPress event with the keycode [kc]
			  in this case you must know the keycodes of the
			  remote server
KeyCodeRelease [kc]	- sends a KeyRelease event with the keycode [kc]
			  in this case you must know the keycodes of the
			  remote server
KeySymPress [ks]	- sends a KeyPress event with the keysym [ks]
			  converted to the appropriate keycode on the remote
			  server
KeySymRelease [ks]	- sends a KeyRelease event with the keysym [ks]
			  converted to the appropriate keycode on the remote
			  server
KeySym [ks]		- send both KeyPress and KeyRelease events with the
			  keysym [ks] converted to the appropriate keycode
			  on the remote server
KeyStrPress [ksname]	- sends a KeyPress event with the keysym name
			  [ksname] converted to the appropriate keycode on
			  the remote server; standard KeySym names are
			  obtained from [X11/keysymdef.h] by removing
			  the XK_ prefix from each name.
KeyStrRelease [ksname]	- sends a KeyRelease event with the keysym name
			  [ksname] converted to the appropriate keycode on
			  the remote server; standard KeySym names are
			  obtained from [X11/keysymdef.h] by removing
			  the XK_ prefix from each name.
KeyStr [ksname]		- sends both KeyPress and KeyRelease events with the
			  keysym name [ksname] converted to the appropriate
			  keycode on the remote server; standard KeySym
			  names are obtained from [X11/keysymdef.h] by
			  removing the XK_ prefix from each name.
String [max. 1024 long string]
			- Sends the string as single characters converted to
			  KeyPress and KeyRelease events based on a
			  character table in chartbl.h (currently only
			  Latin1 is used...)

Jak widać są to najbardziej podstawowe komendy, dzięki którym możemy budować nasze makra.

To może jakiś przykład?

W internecie można znaleźć kilka różnych przykładowych skryptów do xmacro. Ja również zamieszczam tutaj swój przykład, choć znacznie prostszy i bezużyteczny, w sensie przydatności wykonywanych przez niego operacji. Ale jest prosty bo takie jest zamierzenie ;) Obejmuje on tylko operacje na kursorze myszy, więc nie wymaga żadnych specjalnych warunków, żeby zobaczyć jego działanie. Chodzi w tym przykładzie głównie o to, żeby zobaczyć jak ma wyglądać przykładowy plik z poleceniami.
# Taniec kursora myszy

Delay 3 # opóźnienie w sekundach
MotionNotify 100 100 # przeniesienie kursora w pozycję (100,100)
Delay 1
MotionNotify 200 100
Delay 1
MotionNotify 100 200
Delay 1
MotionNotify 200 200
Delay 1
MotionNotify 150 150
Delay 1
MotionNotify 400 100
Delay 1
MotionNotify 500 100
Delay 1
MotionNotify 400 200
Delay 1
MotionNotify 500 200
Delay 1
MotionNotify 450 150
Delay 1
MotionNotify 100 400
Delay 1
MotionNotify 200 400
Delay 1
MotionNotify 100 500
Delay 1
MotionNotify 200 500
Delay 1
MotionNotify 150 450
Delay 1
MotionNotify 400 400
Delay 1
MotionNotify 500 400
Delay 1
MotionNotify 400 500
Delay 1
MotionNotify 500 500
Delay 1
MotionNotify 450 450
Delay 1
MotionNotify 300 300

Uwagi końcowe

Dobrze, więc teraz kilka uwag. Dlaczego nie polecam nagrywania makr, a raczej preferuję ręczne ich pisanie? Raz, że xmacrorec nie jest w stanie w 100% wyłapać operacji, które robimy, a dwa, że znajdzie się w makrze również wiele operacji pośrednich. Czyli... i tak trzeba będzie go ręcznie edytować, żeby działało jak trzeba i z przyzwoitą wydajnością. Druga sprawa to fakt, że korzystając z xmacrorec udało mi się stracić kontrolę nad systemem (stał się głuchy i nieczuły na moje działania). Nie mogłem nawet przejść do innej powłoki, żeby zabić proces programu xmacrorec. Także summa summarum - odradzam.

Kolejną rzeczą jest to, że zawsze warto dać jakieś opóźnienie na początku skryptu makra (Delay), żeby mieć czas przygotować mu środowisko do pracy. To samo dotyczy odstępów czasowych między wykonywanymi zadaniami. Czasem po prostu dobrze żeby istniały.

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: