#include static GtkWidget *draw_area; static GtkWidget *hruler; static GtkWidget *vruler; static int num_events; static int num_paints; static int xpos, ypos; static int old_timestamp = 0; static guint refresh_timeout_id = 0; #define FRAMES_PER_SECOND 60 #define MSECS_BETWEEN_UPDATES (1000 / FRAMES_PER_SECOND) static void refresh_rulers (int x, int y) { gtk_ruler_set_range (GTK_RULER (hruler), 0, draw_area->allocation.width, x, 10); gtk_ruler_set_range (GTK_RULER (vruler), 0, draw_area->allocation.height, y, 10); num_paints++; } static gboolean refresh_timeout_cb (gpointer data) { refresh_rulers (xpos, ypos); refresh_timeout_id = 0; return FALSE; } static gboolean draw_area_motion_notify_event_cb (GtkWidget *widget, GdkEventMotion *event, gpointer data) { int new_timestamp; xpos = event->x; ypos = event->y; new_timestamp = event->time; if (new_timestamp > old_timestamp + MSECS_BETWEEN_UPDATES) { if (refresh_timeout_id != 0) { g_source_remove (refresh_timeout_id); refresh_timeout_id = 0; } refresh_rulers (xpos, ypos); } else { if (refresh_timeout_id == 0) refresh_timeout_id = g_timeout_add (MSECS_BETWEEN_UPDATES, refresh_timeout_cb, NULL); } old_timestamp = new_timestamp; num_events++; return TRUE; } static gboolean timeout_cb (gpointer data) { g_print ("events: %d\tpaints: %d\n", num_events, num_paints); return TRUE; } int main (int argc, char **argv) { GtkWidget *window; GtkWidget *table; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); table = gtk_table_new (2, 2, FALSE); gtk_container_add (GTK_CONTAINER (window), table); draw_area = gtk_drawing_area_new (); gtk_widget_add_events (draw_area, GDK_POINTER_MOTION_MASK); gtk_table_attach (GTK_TABLE (table), draw_area, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); g_signal_connect (draw_area, "motion-notify-event", G_CALLBACK (draw_area_motion_notify_event_cb), NULL); hruler = gtk_hruler_new (); gtk_table_attach (GTK_TABLE (table), hruler, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); vruler = gtk_vruler_new (); gtk_table_attach (GTK_TABLE (table), vruler, 0, 1, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0); num_events = num_paints = 0; xpos = ypos = 0; g_timeout_add (1000, timeout_cb, NULL); gtk_widget_show_all (window); gtk_main (); return 0; }