Servidor GTK - GTK-server
| Autor (es) original (es) | Peter van Eerten |
|---|---|
| Desarrollador (es) | Peter van Eerten |
| Versión inicial | 2003 |
| Lanzamiento estable | 2.4.5 / 30 de junio de 2019
|
| Sistema operativo | Multiplataforma |
| Licencia | Licencia pública general GNU |
| Sitio web | www |
GTK-server es un proyecto de código abierto publicado bajo la Licencia Pública General GNU . El proyecto del servidor GTK tiene como objetivo llevar la programación de la interfaz gráfica de usuario a cualquier lenguaje interpretado utilizando el kit de herramientas GIMP ( GTK ) o XForms .
Filosofía
El servidor GTK proporciona una interfaz orientada a la transmisión a GTK . Si el servidor GTK se compila como un binario independiente, permite cinco interfaces diferentes: stdin, fifo ( canalización con nombre ), ipc ( cola de mensajes ), tcp o udp. Cualquier lenguaje interpretado o shellscript con capacidades de E / S puede iniciar el servidor GTK con un argumento que especifique el tipo de interfaz y puede comenzar a enviar llamadas a funciones GTK en formato S-Expression . Después de cada solicitud, el servidor GTK devuelve un resultado, dependiendo del tipo de función GTK invocada.
Si el servidor GTK se compila como un objeto compartido , exporta la función 'gtk', que primero debe importarse en el programa cliente. Después de eso, el programa cliente puede comenzar a enviar llamadas de función GTK en formato S-Expression como argumento para la función 'gtk' importada.
Antes de que el servidor GTK pueda ejecutar funciones GTK, debe leer un archivo de configuración en el que se describen los prototipos de las funciones GTK. Desde la versión 2.2.3, esto también se puede hacer sobre la marcha, lo que permite que el servidor GTK se ejecute sin un archivo de configuración.
Implementación
La implementación del servidor GTK conduce a las siguientes consideraciones.
- El acceso a funciones ajenas solo es posible cuando las bibliotecas a las que se accede se crean con un lenguaje de programación no orientado a objetos como C o Pascal. Las bibliotecas creadas con C ++, por ejemplo, utilizan la modificación de nombres para unificar funciones sobrecargadas . Esto significa que el nombre de función real en una biblioteca de C ++ no se puede conocer una vez que se ha compilado la biblioteca compartida. Por tanto, no se puede acceder a las funciones de dicha biblioteca. Por lo tanto, no se puede acceder a bibliotecas como wxWidgets , el kit de herramientas Qt , FLTK que están programadas en C ++, con el concepto de servidor GTK.
- La biblioteca GTK fue implementado en el lenguaje de programación C . Dado que C es un lenguaje de programación fuertemente tipado , el programa interpretado necesita conocer el tipo de argumentos y el tipo de valor de retorno para cada función GTK durante el tiempo de ejecución. Estos se pueden definir sobre la marcha o en un archivo de configuración, que es analizado por el servidor GTK durante el inicio. Sin embargo, el servidor GTK no conoce las funciones reales que serán utilizadas por el programa cliente interpretado, por lo que para el servidor GTK todos los argumentos y valores de retorno para cada función GTK son tipos de variables.
Esto conduce a un problema para la implementación, porque las funciones GTK y los argumentos correspondientes y los valores de retorno no se pueden codificar en el binario del servidor GTK.
La forma de resolver esto es mediante el uso de una interfaz de función ajena . Actualmente, cuatro interfaces de función extranjera externos están soportados por GTK-servidor: libffi , FFCALL, C / Invoke y dyncall. Una de estas bibliotecas debería estar disponible en el sistema de destino para poder compilar el servidor GTK con éxito.
Ejemplo
El siguiente script de KornShell inicia el servidor GTK en modo stdin y crea una ventana simple con un botón de salida:
#!/bin/ksh
# Start GTK-server
gtk-server -stdin |&
# Communicate with GTK-server and assign function
function gtk { print -p $1; read -p GTK; }
function define { $2 "$3"; eval $1="$GTK"; }
# Setup GUI
gtk "gtk_init NULL NULL"
define WINDOW gtk "gtk_window_new 0"
gtk "gtk_window_set_title $WINDOW 'Korn GTK-server demo'"
gtk "gtk_window_set_default_size $WINDOW 400 200"
define TABLE gtk "gtk_table_new 10 10 1"
gtk "gtk_container_add $WINDOW $TABLE"
define BUTTON gtk "gtk_button_new_with_label 'Click to Quit'"
gtk "gtk_table_attach_defaults $TABLE $BUTTON 5 9 5 9"
gtk "gtk_widget_show_all $WINDOW"
# Mainloop
until [[ $EVENT = $BUTTON || $EVENT = $WINDOW ]]
do
define EVENT gtk "gtk_server_callback wait"
done
# Exit GTK-server
gtk "gtk_server_exit"
Ventajas y limitaciones
Aunque GTK estaba destinado a utilizarse con el lenguaje de programación C , ahora es posible utilizar GTK desde cualquier lenguaje interpretado sin cambiar la implementación real del intérprete. Además, se puede acceder a GTK 1.x, GTK2.xy GTK 3.x. Opcionalmente, se puede usar cualquier otra biblioteca compartida, como bibliotecas relacionadas con OpenGL , Poppler , Mozilla , pero también libc , sqlite y una biblioteca de música como MikMod .
Cuando se usa el servidor GTK como un binario independiente, inevitablemente crea un proceso adicional en la lista de procesos. Además, un programa cliente no puede acceder a las funciones GTK definidas como macro.