Programación de una terminal gráfica en 10 min.

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.

3 thoughts on “Programación de una terminal gráfica en 10 min.

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *