<?xml version="1.0" encoding="UTF-8"?> <openbox_config> <resistance> (...) </resistance> <focus> (...) </focus> <placement> (...) </placement> <theme> (...) </theme> <desktops> (...) </desktops> <resize> (...) </resize> <margins> (...) </margins> <dock> (...) </dock> <keyboard> (...) </keyboard> <mouse> (...) </mouse> <menu> (...) </menu> <applications> (...) </applications> </openbox_config>La sección que me interesa es <keyboard> , que está dentro de <openbox_config> .
Dentro del elemento <keyboard> hay varios elementos <keybind> . Algunos ejemplos:
<keyboard>
<keybind key="C-A-Left">
<action name="DesktopLeft"><dialog>no</dialog><wrap>no</wrap></action>
</keybind>
<keybind key="W-F1">
<action name="Desktop"><desktop>1</desktop></action>
</keybind>
<keybind key="W-d">
<action name="ToggleShowDesktop"/>
</keybind>
<keybind key="A-Escape">
<action name="Lower"/>
<action name="FocusToBottom"/>
<action name="Unfocus"/>
</keybind>
<keybind key="W-e">
<action name="Execute">
<startupnotify>
<enabled>true</enabled>
<name>Konqueror</name>
</startupnotify>
<command>kfmclient openProfile filemanagement</command>
</action>
</keybind>
<keybind key="C-A-Tab">
<action name="NextWindow">
<panels>true</panels>
<desktop>true</desktop>
<dialog>true</dialog>
<bar>true</bar>
<raise>false</raise>
<allDesktops>false</allDesktops>
<linear>false</linear>
<finalactions>
<action name="Focus" />
<action name="Raise" />
<action name="Unshade" />
</finalactions>
</action>
</keybind>
</keyboard>
Los KeyBind pueden tener uno o varios elementos <action> o <keybind> dentro.
Un <keybind> dentro de otro <keybind> es llamado keychain ("cadena de teclas").
<action name="DesktopLeft"><dialog>no</dialog><wrap>no</wrap></action>Esta Action tiene 2 parámetros ( <dialog> y <wrap> ), y es del tipo "DesktopLeft"
Algunas Action también tienen un elemento <finalactions> . Dentro de este elemento se guarda una lista de Actions que serán ejecutadas después de ejecutar la Action principal.
<wrap>no</wrap>
<desktop>1</desktop>
<command>kfmclient openProfile filemanagement</command>
<startupnotify>
<enabled>true</enabled>
<wmclass>window class</wmclass>
<name>start network services</name>
<icon>/usr/share/icons/Crux/24x24/places/network.png</icon>
</startupnotify>
<finalactions>
<action name="Focus" />
<action name="Raise" />
<action name="Unshade" />
</finalactions>
Bueno, ahora que terminamos de analizar la estructura del archivo de configuración de openbox, empezaremos a analizar el diseño del programa.
La clase Container está definida en el archivo "Container.cpp". Esta clase tiene métodos para insertar elementos, removerlos, especificar un nombre para el Container, y especificar un tipo de dato para cada elemento contenido. Veamos un poco de código de ejemplo:
Container *keybind;
Container *action;
Parameter *dialog;
dialog = new Parameter("dialog", FALSE); //Crear un parámetro <dialog>false</dialog>
action = new Container(); //Crear un Container que represente una Action
action->setName( (void*) "DesktopLeft" ); //Definir el tipo de Action
action->insertElement(TIPO_PARAMETRO, (void*) dialog); //Insertar el parámetro dentro de la Action
keybind = new Container(); //Crear un KeyBind
keybind->setName( (void*) "C-A-Left" ); //especificar la propiedad key="C-A-Left" (El método setName() es útil para esto)
keybind->insertElement(TIPO_ACTION, (void*) action ); //Insertar la acción dentro del keybind
NOTAS:
Todos los AdaptedContainers disponen del método writeXML() . Este método escribe la configuración en formato XML en un archivo.
Todos los AdaptedContainers (excepto Keyboard) se desasocian de su elemento padre cuando son destruidos.
Las clases derivadas de AdaptedContainer son:
Para crear un objeto de esta clase, se necesita pasar como argumento al constructor una ruta al archivo de configuración. Por ejemplo:
Keyboard *k = new Keyboard((char*)"/home/user/.config/openbox/rc.xml");El Keyboard leerá el archivo de configuración y creará automáticamente todos los objetos KeyBind hijos.
Si el objeto fue creado automáticamente por un Keyboard, creará automáticamente todos sus Action y keychains hijos.
También puede ser creado especificando su tipo:
KeyBind *keybind = new KeyBind("C-F3", parent); //Ejemplo
Si fue creado automáticamente por un KeyBind, creará automáticamente sus parámetros y su FinalActionsList.
Además, puede crearse una instancia especificando su tipo y padre:
Action *action = new Action("Close", parent ); //Example
Si el objeto fue creado automáticamente por un Action, creará automáticamente todos sus Action hijos.
También, es posible crear uno vacío:
action->finalActionsList = new FinalActionsList();
Parameter(char *name_, char *value_, Container *parent_); //Parámetro de texto Parameter(char *name_, int value_, Container *parent_); //Parámetro numérico Parameter(char *name_, EdgeType value_, Container *parent_); //Parámetro eje Parameter(char *name_, Boolean value_, Container *parent_); //Parámetro booleano Parameter(xmlDocPtr doc, xmlNodePtr node, Container *parent_); //Este constructor es llamado al crear una Action automáticamenteComo los AdaptedContainer, los Parameter disponen del método writeXML(), y al ser eliminados, se remueven a si mismos de su padre en el árbol XML.
Nota: Los Parameters y FinalActionsList no disponen de su respectiva clase Drawing porque no son mostrados en la ventana principal del programa. Sin embargo, pueden ser manejados desde una ventana Editor .
GUI_KeyboardDrawing::GUI_KeyboardDrawing(Keyboard *keyboard_, GtkWidget *embedIn);
Cuando se crea un GUI_KeyboardDrawing, automáticamente se crean sus GUI_KeyBindDrawings hijos, y se guardan en el Container subKeyBindDrawings.
Cuando un objeto de clase GUI_KeyBindDrawing es creado, este crea automáticamente todos sus objetos GUI_KeyBindDrawings (keychains) y GUI_ActionDrawings hijos, y los guarda en los Container subKeyBindDrawings y subActionDrawings.
Cuando un GUI_KeyBindDrawing es destruido, destruye también a sus Drawings hijos, su KeyBind y su Editor, y se remueve a si mismo de su Drawing padre (GUI_KeyboardDrawing, o GUI_KeyBindDrawing, si es una keychain)
Cuando un GUI_ActionDrawing es destruido, destruye también a sus Drawings hijos, su Action y su Editor, y se remueve a si mismo de su Drawing padre (GUI_KeyBindDrawing, o GUI_ActionEditor si es una FinalAction )
Los Editores son clases que sirven para editar un KeyBind (la combinación de teclas) o una Action (Sus parámetros y lista de acciones finales). Cuando la ventana de un editor es cerrada, el KeyBind o Action es actualizado. Sus constructores necesitan un Drawing como argumento.
Hay dos clases Editor:
Para entender el formato del array, veamos la siguiente linea de ejemplo, extraída del archivo:
{"SendToDesktop", "Send the window to another desktop", "N desktop 1| B follow T", "desktop: Desktop number| follow: Change to desktop", NULL},
Un caracter '|' seguido por un espacio en blanco, es un separador.
Se usa NULL para dejar un campo sin definir. (Como en el ejemplo)