====== 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.