/* gcc `pkg-config gtk+-2.0 --libs --cflags` -o timetext timetext.c */
#include <gtk/gtk.h>

static int n_draws = 0;
static gdouble total_seconds = 0.0;

static gboolean
expose_event1_cb (GtkWidget      *widget,
                  GdkEventExpose *event,
                  GTimer         *timer)
{
        g_timer_start (timer);

        return FALSE;
}

static gboolean
expose_event2_cb (GtkWidget      *widget,
                  GdkEventExpose *event,
                  GTimer         *timer)
{
        g_timer_stop (timer);

        n_draws++;
        total_seconds += g_timer_elapsed (timer, NULL);

        return FALSE;
}

static gboolean
idle (GtkWidget *widget)
{
        gtk_widget_queue_draw (widget);

        return TRUE;
}

int
main (int argc, char **argv)
{
        GtkWidget *window, *box, *label;
        GTimer *timer;

        gtk_init (&argc, &argv);

        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        box = gtk_vbox_new (FALSE, 0);
        gtk_container_add (GTK_CONTAINER (window), box);

        label = gtk_label_new ("This is a pretty long string with some accented chars: Jõe ääres");

        timer = g_timer_new ();
        g_signal_connect (label,
                          "expose-event",
                          G_CALLBACK (expose_event1_cb),
                          timer);
        g_signal_connect_after (label,
                                "expose-event",
                                G_CALLBACK (expose_event2_cb),
                                timer);
        gtk_box_pack_start_defaults (GTK_BOX (box), label);

        gtk_widget_show_all (window);

        g_idle_add ((GSourceFunc) idle, label);

        g_timeout_add (60000, (GSourceFunc) gtk_main_quit, NULL);

        gtk_main ();

        g_print ("Drawn label %d times. Average time spent drawing (in seconds): %lf\n", n_draws, total_seconds / n_draws);

        return 0;
}
