1 | #include <gtk/gtk.h> |
2 | #include <math.h> |
3 | |
4 | GtkAdjustment *adjustment; |
5 | int cursor_x, cursor_y; |
6 | |
7 | static void |
8 | motion_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 | |
21 | static void |
22 | on_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 | |
37 | static void |
38 | quit_cb (GtkWidget *widget, |
39 | gpointer data) |
40 | { |
41 | gboolean *done = data; |
42 | |
43 | *done = TRUE; |
44 | |
45 | g_main_context_wakeup (NULL); |
46 | } |
47 | |
48 | int |
49 | main (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 | |