Esta noche he configurado gnome-terminal para que no interprete ALT+1, ALT+2… para cambiar entre los diferentes tabuladores con terminales y usaré ALT+derecha, ALT+izquierda para desplazarme. De esta forma puedo tener varios BitchX con Luna sin que interfieran las combinaciones de tecla, esto es muchisimo más comodo que tener varias terminales separadas.
La cuestión es que me he preguntado, ¿será muy dificil programar una aplicación GTK que muestre una ventana con una terminal? Así que me he hecho algunas búsquedas por google dando con libvte, esta librería de gnome ya trae un widget terminal. Apoyandome en el API de Gnome he conseguido hacer un mini programa en unos 10 minutos que crea una ventana conteniendo una terminal que ejecuta BitchX + Luna (tengo configurado BitchX para que ejecute automáticamente mi script Luna).
Os pongo el código por si alguien quiere curiosear:
terminal.c
#include <gtk/gtk.h> #include <vte/vte.h> // Callback de salida void the_end (VteTerminal *vteterminal,gpointer user_data) { gtk_main_quit(); // Terminamos el programa } int main(int argc, char *argv[]) { GtkWindow *win; VteTerminal *term; PangoFontDescription *font; char *arguments[3]; // Inicialización GTK gtk_set_locale (); gtk_init (&argc, &argv); // Ventana win = GTK_WINDOW(gtk_window_new (GTK_WINDOW_TOPLEVEL)); gtk_window_maximize(win); g_signal_connect (GTK_OBJECT(win), "delete-event", G_CALLBACK (the_end), NULL); g_signal_connect (GTK_OBJECT(win), "destroy", G_CALLBACK (the_end), NULL); // Objeto terminal, hacemos que ejecute 'BitchX -N' term = VTE_TERMINAL(vte_terminal_new()); arguments[0] = malloc(sizeof(char)*10); arguments[1] = malloc(sizeof(char)*10); arguments[2] = NULL; snprintf(arguments[0], 10, "BitchX"); snprintf(arguments[1], 10, "-N"); vte_terminal_fork_command(term, "BitchX", arguments, NULL, NULL, FALSE, TRUE, TRUE); // Cuando termine el BitchX tratar la señal g_signal_connect (GTK_OBJECT(term), "child-exited", G_CALLBACK (the_end), NULL); //La ventana esta maximizada, no es necesario establecer tamaño de la terminal //vte_terminal_set_size(term, 100,43); // Fuente de la terminal: Andale Mono, 12 font = pango_font_description_new(); pango_font_description_set_size(font, 12*PANGO_SCALE); pango_font_description_set_family(font, "ANDALE MONO"); vte_terminal_set_font(term, font); // Añadimos terminal a la ventana gtk_container_add (GTK_CONTAINER (win), GTK_WIDGET(term)); gtk_widget_show_all(GTK_WIDGET(win)); // Loop infinito gtk_main(); }
Makefile
terminal: terminal.c gcc -o terminal terminal.c `pkg-config --cflags --libs gtk+-2.0 vte` clean: rm -f terminal
Para compilar basta con ejecutar ‘make’ o ‘gcc -o terminal terminal.c `pkg-config –cflags –libs gtk+-2.0 vte`’ lo que nos generará un ejecutable llamado terminal que podemos llamar con ‘./terminal’. Me impresiono que con tan poco código y tan poco tiempo tuviese eso en marcha 🙂
Los que no teneis BitchX instalado cambiad:
vte_terminal_fork_command(term, "BitchX", arguments, NULL, NULL, FALSE, TRUE, TRUE);
por
vte_terminal_fork_command(term, NULL, NULL, NULL, NULL, FALSE, TRUE, TRUE);
y os ejecutará la shell del usuario.
estuve viendo tu coigo, y me parece bueno.
yo quiero hacer algo parecido:
Quiero tener una instancia de un gnome terminal en una aplicacion mia, y poder usarla como si estuviera usando el mismo gnome terminal.
por favor me seria de mucha utilidad tu ayuda.
Gracias, hace tiempo andaba buscando algo similar.
Y si no es molestia, pregunto; Seria muy difícil añadir un menu tipo Gui, para disparar comandos hacia la terminal?
Por ejemplo, que dispare un ‘ls -l’ via menu, y lo muestre en el texto. Seria genial poder recuperar fuentes de ascii que todos tenemos del año la pera y dispararlas con un Gui. Al fin y al cabo, los sistema híbridos ascii-ventanas son muy prácticos!
gracias de antemano,
Esteve
Siento no poder ayudarte, hace tiempo que estuve jugando con este tema y ya no lo tengo nada por la mano.
Saludos!