Un Rule File, letteralmente file di regole, è un file di testo che contiene le azioni da intraprendere in occorrenza di un determinato evento. La sintassi delle singole linee è la seguente:
evento = azione {,azione}
Un file di regole è diviso in due sezioni. La prima contiene il nome del programma come da linea di comando ed il tipo di servizio che fornisce. Il nome del programma deve essere compreso tra "<>", mentre il tipo di servizio deve essere compreso tra "()". Ad esempio per il programma "mc" (il midnight commander), potremo avere una prima sezione del tipo:
<mc>
(Gestione File.)
La seconda sezione contiene le linee "evento-azioni", divise per Domini. Un dominio è un "macro-stato" del programma. Ad un programma con menu, potrei associare un dominio ad ogni voce del menu. Per cambiare dominio posso usare l'azione "go", che ha la seguente sintassi:
go(dominio)
Non c'è comunque una regola fissa per associare stati del programma a domini nel file di regole. Si possono avere cosi` più file di regole diversi che descrivono lo stesso programma. Un dominio è dichiarato dal suo nome, compreso tra parentesi quadre. Sempre per l'esempio del midnight commander, potrei avere un dominio [First_Screen] cosi`composto:
[First_Screen]
Fn9 = go(high_menu)
Fn4 = go(Edit)
Fn5 = Check_if(39, 8, C), SayText(Premi return per copiare il file), go(copy)
K_DOWN = SayHighlighted(3, 25)
K_UP = SayHighlighted(3, 27)
K_TAB = Pause(1), SayHighlighted(3, 27)
#ci sono anche i commenti...
Le regole evento-azione definiscono le azioni da intraprendere all'occorrenza di un certo evento. Potrei, ad esempio, associare alla pressione del tasto "Enter", la lettura di "Confermi l'uscita?". Per fare questo, dovrei aggiungere una riga del tipo: "K_ENTER = SayText(Confermi l'uscita?)".
Gli eventi riconosciuti dal sistema sono:
In aggiunta c'è un evento "di sistema" e non generato dall'utente: EXT. L'evento "EXT" permette di controllare periodicamente se sullo schermo, in una determinata posizione è presente un dato carattere. In caso positivo intraprende le azioni corrispondenti. La sua sintassi è:
EXT( x, y, char) = azione {,azione}
Dove "x" e "y" sono le coordinate del carattere "char", sullo schermo. L'evento EXT è utile in tutti quei casi in cui l'applicazione presenta degli eventi asincroni. Per esempio nel caso in cui, durante la copia di un file, si può presentare un pop-up di errore. In questo caso basterà aggiungere una linea, per controllare se sullo schermo è presente uno dei caratteri del pop-up. Nel caso del Rule File del midnight commander, ci possono essere delle linee come le seguenti:
[copy]
K_ENTER = Pause(2), go(check_copy_error)
ESC = go(First_Screen)
[check_copy_error]
EXT( 39, 10, E) = SayText(Errore!!! premi un tasto per continuare), go(press_key)
Le azioni attualmente presenti nel sistema sono:
A queste azioni, altre ne possono essere aggiunte "dinamicamente" al sistema, attraverso dei moduli. Per aggiungere un nuovo modulo, con nuove azioni, basta aggiungere una riga al file "rules/modules", del tipo:
pathname/nomemodulo = nomeAzione
Volendo aggiungere, ad esempio, un modulo "Prova.a" presente nella directory "modules", che contiene l'azione "helloWorld()", basta aggiungere una riga a "rules/modules":
modules/Prova.a = helloWorld()
Bisogna poi far aggiornare lo stato di Middleware, mandandogli un segnale HUP, con un comando tipo "killall -HUP middleware".