Autore: Fabio Di Matteo
Ultima revisione: 23/03/2016 - 10:39
Alcune applicazioni grafiche del mondo *nix offrono la possibilità di essere lanciate e disegnate all'interno di altri programmi. In questo articolo vedremo come lanciare xterm all'interno di una nostra aaplicazione grafica scritta in gtk+2 .
Per rendere la tecnologia il piu' trasparente possibile le Gtk ci forniscono il widget GtkSocket.
main.c
#include <gtk/gtk.h> void onCommand () { gtk_main_quit (); } void destroy (void) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *vbox; GtkWidget *sock; //speciale widget per accogliere la finestra esterna gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); gtk_container_border_width (GTK_CONTAINER (window), 10); button = gtk_button_new_with_label ("Esci"); sock = gtk_socket_new(); //di tipo socket (ingloba finestre esterne) gtk_widget_set_size_request(sock, 500, 200); vbox = gtk_vbox_new (TRUE,1); gtk_box_pack_start(GTK_BOX(vbox), sock, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); //Prelevo il window id del widget "sock" per disegnare xterm in esso GdkNativeWindow id = gtk_socket_get_id(GTK_SOCKET(sock)); //Lancio xterm con l'opzione "-into id" per dirgli che la finestra deve essere inglobata in "sock" gchar* cmd= g_strdup_printf("xterm -fa 'Liberation Mono' -fs 10 -bg black -fg green -into %d",id); g_spawn_command_line_async(cmd, NULL); g_signal_connect (button, "clicked", G_CALLBACK(onCommand), NULL); //Se viene chiuso xterm, allora viene chiusa tutta l'applicazione g_signal_connect(sock, "plug-removed", gtk_main_quit, NULL); gtk_widget_show_all (window); gtk_widget_show (window); gtk_main (); return 0; }
makefile
CPP = gcc OPTS = `pkg-config --cflags --libs gtk+-2.0` all: $(CPP) main.c -o main $(OPTS) clean: rm main
A causa di un baco conosciuto il terminale inglobato dentro la nostra applicazione potrebbe non rispondere ai comandi da tastiera. Per aggirare il baco si puo' aggiungere a .Xresources (nella home) la seguente direttiva: XTerm*allowSendEvents: True
e lanciare il comando xrdb -merge ~/.Xresources
il quale rilegge le preferenze utente di xorg.