====== Inglobare finestre di altri programmi nelle nostre applicazioni Gtk ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//23/03/2016 - 10:39//** \\ \\
{{:programmazione:gtk:xtermembed0.png?300|}} \\
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 [[https://developer.gnome.org/gtk2/stable/GtkSocket.html|GtkSocket]].
===== Codice =====
**main.c**
#include
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
===== Xterm non risponde agli eventi da tastiera ? =====
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.