{"id":96,"date":"2004-05-04T01:24:52","date_gmt":"2004-05-03T23:24:52","guid":{"rendered":"http:\/\/www.marblestation.com\/blog\/?p=96"},"modified":"2012-04-26T23:12:07","modified_gmt":"2012-04-26T21:12:07","slug":"programacin-de-una-terminal-grfica-en-10-min","status":"publish","type":"post","link":"https:\/\/www.marblestation.com\/?p=96","title":{"rendered":"Programaci\u00f3n de una terminal gr\u00e1fica en 10 min."},"content":{"rendered":"<p>Esta noche he configurado gnome-terminal para que no interprete ALT+1, ALT+2&#8230; para cambiar entre los diferentes tabuladores con terminales y usar\u00e9 ALT+derecha, ALT+izquierda para desplazarme. De esta forma puedo tener varios BitchX con <a href=\"http:\/\/www.marblestation.com\/aplicaciones\/\">Luna<\/a> sin que interfieran las combinaciones de tecla, esto es muchisimo m\u00e1s comodo que tener varias terminales separadas.<\/p>\n<p>La cuesti\u00f3n es que me he preguntado, \u00bfser\u00e1 muy dificil programar una aplicaci\u00f3n GTK que muestre una ventana con una terminal? As\u00ed que me he hecho algunas b\u00fasquedas por google dando con <a href=\"http:\/\/developer.gnome.org\/doc\/API\/2.0\/vte\/index.html\">libvte<\/a>, esta librer\u00eda de gnome ya trae un widget terminal. Apoyandome en el <a href=\"http:\/\/developer.gnome.org\/doc\/API\/\">API de Gnome<\/a> 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\u00e1ticamente mi script Luna).<\/p>\n<p>Os pongo el c\u00f3digo por si alguien quiere curiosear:<br \/>\n<!--more--><\/p>\n<p><b>terminal.c<\/b><\/p>\n<pre class=\"brush:c\">\r\n#include &#60;gtk\/gtk.h>\r\n#include &#60;vte\/vte.h>\r\n\r\n\/\/ Callback de salida\r\nvoid the_end (VteTerminal *vteterminal,gpointer user_data) {\r\n  gtk_main_quit();  \/\/ Terminamos el programa\r\n}\r\n\r\nint main(int argc, char *argv[]) {\r\n  GtkWindow *win;\r\n  VteTerminal *term;\r\n  PangoFontDescription *font;\r\n  char *arguments[3];\r\n\r\n  \/\/ Inicializaci\u00f3n GTK\r\n  gtk_set_locale ();\r\n  gtk_init (&argc, &argv);\r\n\r\n  \/\/ Ventana\r\n  win = GTK_WINDOW(gtk_window_new (GTK_WINDOW_TOPLEVEL));\r\n  gtk_window_maximize(win);\r\n  g_signal_connect (GTK_OBJECT(win), \"delete-event\", G_CALLBACK (the_end), NULL);\r\n  g_signal_connect (GTK_OBJECT(win), \"destroy\", G_CALLBACK (the_end), NULL);\r\n\r\n  \/\/ Objeto terminal, hacemos que ejecute 'BitchX -N'\r\n  term = VTE_TERMINAL(vte_terminal_new());\r\n  arguments[0] = malloc(sizeof(char)*10);\r\n  arguments[1] = malloc(sizeof(char)*10);\r\n  arguments[2] = NULL;\r\n  snprintf(arguments[0], 10, \"BitchX\");\r\n  snprintf(arguments[1], 10, \"-N\");\r\n  vte_terminal_fork_command(term, \"BitchX\", arguments, NULL, NULL, FALSE, TRUE, TRUE);\r\n  \/\/ Cuando termine el BitchX tratar la se\u00f1al\r\n  g_signal_connect (GTK_OBJECT(term), \"child-exited\", G_CALLBACK (the_end), NULL);\r\n\r\n\r\n  \/\/La ventana esta maximizada, no es necesario establecer tama\u00f1o de la terminal\r\n  \/\/vte_terminal_set_size(term, 100,43);\r\n\r\n  \/\/ Fuente de la terminal: Andale Mono, 12\r\n  font = pango_font_description_new();\r\n  pango_font_description_set_size(font, 12*PANGO_SCALE);\r\n  pango_font_description_set_family(font, \"ANDALE MONO\");\r\n  vte_terminal_set_font(term, font);\r\n\r\n  \/\/ A\u00f1adimos terminal a la ventana\r\n  gtk_container_add (GTK_CONTAINER (win), GTK_WIDGET(term));\r\n  gtk_widget_show_all(GTK_WIDGET(win));\r\n\r\n  \/\/ Loop infinito\r\n  gtk_main();                                                                                                                                          \r\n}\r\n<\/pre>\n<p><b>Makefile<\/b><\/p>\n<pre class=\"brush:bash\">\r\nterminal: terminal.c\r\n  gcc -o terminal terminal.c `pkg-config --cflags --libs gtk+-2.0 vte`\r\n                                                                                                                                          \r\nclean:\r\n  rm -f terminal\r\n<\/pre>\n<p>Para compilar basta con ejecutar &#8216;make&#8217; o &#8216;gcc -o terminal terminal.c `pkg-config &#8211;cflags &#8211;libs gtk+-2.0 vte`&#8217; lo que nos generar\u00e1 un ejecutable llamado terminal que podemos llamar con &#8216;.\/terminal&#8217;. Me impresiono que con tan poco c\u00f3digo y tan poco tiempo tuviese eso en marcha \ud83d\ude42<\/p>\n<p>Los que no teneis BitchX instalado cambiad:<\/p>\n<pre class=\"brush:c\">\r\n  vte_terminal_fork_command(term, \"BitchX\", arguments, NULL, NULL, FALSE, TRUE, TRUE);\r\n<\/pre>\n<p>por<\/p>\n<pre class=\"brush:c\">\r\n  vte_terminal_fork_command(term, NULL, NULL, NULL, NULL, FALSE, TRUE, TRUE);\r\n<\/pre>\n<p>y os ejecutar\u00e1 la shell del usuario.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta noche he configurado gnome-terminal para que no interprete ALT+1, ALT+2&#8230; para cambiar entre los diferentes tabuladores con terminales y usar\u00e9 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\u00e1s comodo que tener varias terminales separadas. La cuesti\u00f3n es que &hellip; <a href=\"https:\/\/www.marblestation.com\/?p=96\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Programaci\u00f3n de una terminal gr\u00e1fica en 10 min.<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,6],"tags":[],"class_list":["post-96","post","type-post","status-publish","format-standard","hentry","category-espanyol","category-tecnologia"],"_links":{"self":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/96","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=96"}],"version-history":[{"count":3,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/96\/revisions"}],"predecessor-version":[{"id":1989,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/96\/revisions\/1989"}],"wp:attachment":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=96"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=96"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}