Original author(s) | Peter van Eerten |
---|---|
Developer(s) | Peter van Eerten |
Initial release | 2003 |
Stable release | 2.4.5
/ June 30, 2019 |
Operating system | Cross-platform |
License | GNU General Public License |
Website | www |
GTK-server is an open-source project released under the GNU General Public License. The GTK-server project aims to bring Graphical User Interface programming to any interpreted language using the GIMP Tool Kit (GTK) or XForms.
The GTK-server provides a stream-oriented interface to GTK. If the GTK-server is compiled as a standalone binary, it allows five different interfaces: stdin, fifo (named pipe), ipc (message queue), tcp or udp. Any interpreted language or shellscript with I/O capabilities can start the GTK-server with an argument specifying the type of interface, and can start sending GTK function calls in S-Expression format. After each request, the GTK-server returns a result, depending on the type of GTK function invoked.
If the GTK-server is compiled as a shared object, it exports the function 'gtk', which must be imported in the client program first. After that, the client program can start sending GTK function calls in S-Expression format as argument to the imported 'gtk' function.
Before the GTK-server actually can execute GTK functions, it has to read a configuration file in which the prototypes of the GTK functions are described. Since version 2.2.3 this also can be done on-the-fly, allowing the GTK-server to run without configuration file.
Implementing the GTK-server leads to the following considerations.
This leads to a problem for the implementation, because the GTK functions and the corresponding arguments and return values cannot be hardcoded into the GTK-server binary.
The way to resolve this is by using a foreign function interface. Currently, four external foreign function interfaces are supported by GTK-server: libFFI, FFCALL, C/Invoke and DynCall. One of these libraries should be available on the target system, in order to compile the GTK-server successfully.
The following KornShell script starts the GTK-server in stdin mode, and creates a simple window with an exit button:
#!/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 = $WINDOW do define EVENT gtk "gtk_server_callback wait" done # Exit GTK-server gtk "gtk_server_exit"
Although GTK was meant to be used with the C programming language, it is now possible to use GTK from any interpreted language without changing the actual implementation of the interpreter. Also, GTK 1.x, GTK2.x and GTK 3.x can be reached. Optionally, any other shared library can be used, like OpenGL related libraries, Poppler, Mozilla, but also libc, sqlite and a music library like MikMod.
When using the GTK-server as a standalone binary, it inevitably creates an additional process in the processlist. Also, GTK functions defined as a macro cannot be reached by a client program.
This article uses only URLs for external sources. (2021) (Learn how and when to remove this template message) |
This article does not cite any external source. HandWiki requires at least one external source. See citing external sources. (2021) (Learn how and when to remove this template message) |