Indice

Inglobare finestre di altri programmi nelle nostre applicazioni Gtk

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.

Codice

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

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.