Busindre » Blog Archive » Gadget de escritorio para notificar cambios en ficheros de logs

Gadget de escritorio para notificar cambios en ficheros de logs

September 25th, 2008 by Busindre

Hace un tiempo dedicamos unos párrafos a presentaros KlogShow, una utilidad escrita en QT encargada de visualizar una terminal sobre nuestro escritorio, mostrando en tiempo real los cambios producidos sobre ficheros de logs (/var/log/*) del sistema. Pues ahora con esta misma funcionalidad pero mucho más simple, queremos enseñaros un minúsculo programa en C + GTK denominado Tailterm, que arranca una consola transparente y sin marcos con la salida del comando "tail -f" de un determinado fichero que pasemos como parámetro.

Tailterm screenshot 1: http://www.busindre.com/archivos/tailterm.png
Tailterm screenshot 2: http://www.busindre.com/archivos/tailterm_kde.jpg

El programa espera como parámetro el fichero que queremos visionar bajo el comando tail -f, encargado de mostrar las últimas lineas de esos archivos en tiempo real, mostrándonos las nuevas lineas que se añadan. La posición por defecto de la terminal, es abajo a la izquierda, no tiene parámetros de configuración por lo que cualquier cambio que queramos realizar debemos indicarlo en el código fuente antes de compilarlo.

Nosotros dejamos dos modificaciones sobre el original, uno que muestra la terminal abajo a la izquierda y otro que sitúa la consola arriba a la derecha. Este último es de especial interés para el que quiera ajustar en el código la ubicación de la terminal en el escritorio, fíjese en los comentarios (//).

Compilar Tailterm:

$ gcc `pkg-config --cflags --libs gtk+-2.0 vte` -o tailterm tailterm.c

Abajo a la izquierda (Descargar)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <gtk/gtk.h>
#include <vte/vte.h>
 
static GtkWidget* window = NULL;
static GtkWidget* term = NULL;
 
void child_exited(VteTerminal *term, gpointer user_data){
    gtk_main_quit();
}
 
void window_init(){
    GdkScreen* screen = gdk_screen_get_default();
    gint width = gdk_screen_get_width(screen);
    gint height = gdk_screen_get_height(screen);
 
    //window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_resizable((GtkWindow*)window, FALSE);
    gtk_window_set_decorated((GtkWindow*)window, FALSE);
    gtk_window_set_skip_taskbar_hint((GtkWindow*)window, TRUE);
    gtk_window_set_skip_pager_hint((GtkWindow*)window, TRUE);
    gtk_window_set_keep_below((GtkWindow*)window, TRUE);
    gtk_window_set_focus_on_map((GtkWindow*)window, FALSE);
    gtk_window_stick((GtkWindow*)window);
   
    gtk_signal_connect(GTK_OBJECT(window), "delete-event",
            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
   
    term = vte_terminal_new();
    vte_terminal_set_size((VteTerminal*)term, 120, 10);
    vte_terminal_set_background_transparent((VteTerminal*)term, TRUE);
    vte_terminal_set_background_saturation((VteTerminal*)term, 1.0);
    vte_terminal_set_font_from_string((VteTerminal*)term, "Monospace 10");
    vte_terminal_set_word_chars((VteTerminal*)term, "-A-Za-z0-9,./?%&#:_");
   
    gtk_signal_connect(GTK_OBJECT(term), "child-exited",
            GTK_SIGNAL_FUNC(child_exited), NULL);
   
    gtk_container_add(GTK_CONTAINER(window), term);
    gtk_window_set_default_size((GtkWindow*)window, width/2, height/6);
    gtk_window_move((GtkWindow*)window, 0, height-(height/6)-26);
    gtk_widget_show(term);
}
 
int main(int argc, char* argv[])
{
    char* cmd = "/usr/bin/tail";
    char* args[] = {"/usr/bin/tail", "-F", "/var/log/syslog", NULL};
    extern char** environ;
 
    if(argc == 2){
        args[2] = argv[1];
    }
   
    gtk_init(&argc, &argv);
    window_init();
 
    vte_terminal_fork_command((VteTerminal*)term, cmd, args, environ,
            "/tmp", FALSE, FALSE, FALSE);
 
    gtk_widget_show(window);
    gtk_main();
   
    return 0;
}

NOTA: Esta modificación difiere en que la consola se muestra un poco más abajo que la generada por el programa original.

Arriba a la derecha (Descargar)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <gtk/gtk.h>
#include <vte/vte.h>
 
static GtkWidget* window = NULL;
static GtkWidget* term = NULL;
 
void child_exited(VteTerminal *term, gpointer user_data){
    gtk_main_quit();
}
 
void window_init(){

   
    //Estos datos deberán modificarse para ajustar la terminal transparente en tu pantalla.
    //anchoVentana: Cuanto mayor sea, la anchura de la terminal más grande será.
    //largoVentana: Son las lineas que tendrá la terminal para visualizar datos (En este caso 10).
    //posXVentana: Posición de la ventana horizontalmente, cuanto mayor sea mas a la derecha estará.
    //posYVentana: Posición de la ventana verticalmente, cuanto mayor sea mas abajo estará.
   
    ///////////////////////////////////Modificar///////////////////////////////
    const int anchoVentana=90, largoVentana=10,posXVentana=715, posYVentana=10;
    ///////////////////////////////////////////////////////////////////////////
   

    GdkScreen* screen = gdk_screen_get_default();   
    gint width = gdk_screen_get_width(screen);
    gint height = gdk_screen_get_height(screen);
 
    //window
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_resizable((GtkWindow*)window, FALSE);
    gtk_window_set_decorated((GtkWindow*)window, FALSE);
    gtk_window_set_skip_taskbar_hint((GtkWindow*)window, TRUE);
    gtk_window_set_skip_pager_hint((GtkWindow*)window, TRUE);
    gtk_window_set_keep_below((GtkWindow*)window, TRUE);
    gtk_window_set_focus_on_map((GtkWindow*)window, FALSE);
    gtk_window_stick((GtkWindow*)window);
   
    gtk_signal_connect(GTK_OBJECT(window), "delete-event",
            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
   
    term = vte_terminal_new();
    vte_terminal_set_size((VteTerminal*)term, anchoVentana, largoVentana);
    vte_terminal_set_background_transparent((VteTerminal*)term, TRUE);
    vte_terminal_set_background_saturation((VteTerminal*)term, 1.0);
    vte_terminal_set_font_from_string((VteTerminal*)term, "Monospace 10");
    vte_terminal_set_word_chars((VteTerminal*)term, "-A-Za-z0-9,./?%&#:_");
   
    gtk_signal_connect(GTK_OBJECT(term), "child-exited",
            GTK_SIGNAL_FUNC(child_exited), NULL);
   
    gtk_container_add(GTK_CONTAINER(window), term);
    gtk_window_set_default_size((GtkWindow*)window, width/2, height/6);
    gtk_window_move((GtkWindow*)window,posXVentana , posYVentana); // ,height-(height/6)-25);
    gtk_widget_show(term);
}
 
int main(int argc, char* argv[])
{
    char* cmd = "/usr/bin/tail";
    char* args[] = {"/usr/bin/tail", "-F", "/var/log/syslog", NULL};
    extern char** environ;
 
    if(argc == 2){
        args[2] = argv[1];
    }
   
    gtk_init(&argc, &argv);
    window_init();
 
    vte_terminal_fork_command((VteTerminal*)term, cmd, args, environ,
            "/tmp", FALSE, FALSE, FALSE);
 
    gtk_widget_show(window);
    gtk_main();
   
    return 0;
}

Posted in Linux |

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.