1#include <gtk/gtk.h>
2#include <math.h>
3
4GtkAdjustment *adjustment;
5int cursor_x, cursor_y;
6
7static void
8motion_cb (GtkEventControllerMotion *motion,
9 double x,
10 double y,
11 GtkWidget *widget)
12{
13 float processing_ms = gtk_adjustment_get_value (adjustment);
14 g_usleep (microseconds: processing_ms * 1000);
15
16 cursor_x = x;
17 cursor_y = y;
18 gtk_widget_queue_draw (widget);
19}
20
21static void
22on_draw (GtkDrawingArea *da,
23 cairo_t *cr,
24 int width,
25 int height,
26 gpointer data)
27{
28 cairo_set_source_rgb (cr, red: 1, green: 1, blue: 1);
29 cairo_paint (cr);
30
31 cairo_set_source_rgb (cr, red: 0, green: 0.5, blue: 0.5);
32
33 cairo_arc (cr, xc: cursor_x, yc: cursor_y, radius: 10, angle1: 0, angle2: 2 * M_PI);
34 cairo_stroke (cr);
35}
36
37static void
38quit_cb (GtkWidget *widget,
39 gpointer data)
40{
41 gboolean *done = data;
42
43 *done = TRUE;
44
45 g_main_context_wakeup (NULL);
46}
47
48int
49main (int argc, char **argv)
50{
51 GtkWidget *window;
52 GtkWidget *vbox;
53 GtkWidget *label;
54 GtkWidget *scale;
55 GtkWidget *da;
56 GtkEventController *controller;
57 gboolean done = FALSE;
58
59 gtk_init ();
60
61 window = gtk_window_new ();
62 gtk_window_set_default_size (GTK_WINDOW (window), width: 300, height: 300);
63
64 vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0);
65 gtk_window_set_child (GTK_WINDOW (window), child: vbox);
66
67 da = gtk_drawing_area_new ();
68 gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), draw_func: on_draw, NULL, NULL);
69 gtk_widget_set_vexpand (widget: da, TRUE);
70 gtk_box_append (GTK_BOX (vbox), child: da);
71
72 label = gtk_label_new (str: "Event processing time (ms):");
73 gtk_widget_set_halign (widget: label, align: GTK_ALIGN_CENTER);
74 gtk_box_append (GTK_BOX (vbox), child: label);
75
76 adjustment = gtk_adjustment_new (value: 20, lower: 0, upper: 200, step_increment: 1, page_increment: 10, page_size: 0);
77 scale = gtk_scale_new (orientation: GTK_ORIENTATION_HORIZONTAL, adjustment);
78 gtk_box_append (GTK_BOX (vbox), child: scale);
79
80 controller = gtk_event_controller_motion_new ();
81 g_signal_connect (controller, "motion",
82 G_CALLBACK (motion_cb), da);
83 gtk_widget_add_controller (widget: da, controller);
84
85 g_signal_connect (window, "destroy",
86 G_CALLBACK (quit_cb), &done);
87
88 gtk_widget_show (widget: window);
89 while (!done)
90 g_main_context_iteration (NULL, TRUE);
91
92 return 0;
93}
94

source code of gtk/tests/motion-compression.c