|
|
6e8c62 |
#include <gtk gtk.h=""></gtk>
|
|
|
6e8c62 |
|
|
|
6e8c62 |
#define MAX_LEN 50
|
|
|
6e8c62 |
|
|
|
6e8c62 |
|
|
|
6e8c62 |
GtkWidget *window;
|
|
|
6e8c62 |
int pos = 0;
|
|
|
6e8c62 |
int len = 0;
|
|
|
6e8c62 |
double px[MAX_LEN];
|
|
|
6e8c62 |
double py[MAX_LEN];
|
|
|
6e8c62 |
|
|
|
6e8c62 |
|
|
|
6e8c62 |
gboolean timeout(gpointer data) {
|
|
|
6e8c62 |
--len;
|
|
|
6e8c62 |
if (len < 0) len = 0;
|
|
|
6e8c62 |
gtk_widget_queue_draw(window);
|
|
|
6e8c62 |
return TRUE;
|
|
|
6e8c62 |
}
|
|
|
6e8c62 |
|
|
|
6e8c62 |
gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer data) {
|
|
|
6e8c62 |
cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 1.0);
|
|
|
6e8c62 |
cairo_paint(cr);
|
|
|
6e8c62 |
|
|
|
6e8c62 |
cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
|
|
|
6e8c62 |
cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
|
|
|
6e8c62 |
cairo_move_to(cr, px[pos], py[pos]);
|
|
|
6e8c62 |
for(int i = 1; i < len; ++i) {
|
|
|
6e8c62 |
int p = (MAX_LEN + pos - i) % MAX_LEN;
|
|
|
6e8c62 |
cairo_set_line_width(cr, len - i);
|
|
|
6e8c62 |
cairo_line_to(cr, px[p], py[p]);
|
|
|
6e8c62 |
cairo_stroke(cr);
|
|
|
6e8c62 |
cairo_move_to(cr, px[p], py[p]);
|
|
|
6e8c62 |
}
|
|
|
6e8c62 |
|
|
|
6e8c62 |
return TRUE;
|
|
|
6e8c62 |
}
|
|
|
6e8c62 |
|
|
|
6e8c62 |
gboolean motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) {
|
|
|
6e8c62 |
++pos;
|
|
|
6e8c62 |
++len;
|
|
|
6e8c62 |
if (pos >= MAX_LEN) pos = 0;
|
|
|
6e8c62 |
if (len > MAX_LEN) len = MAX_LEN;
|
|
|
6e8c62 |
px[pos] = event->x;
|
|
|
6e8c62 |
py[pos] = event->y;
|
|
|
6e8c62 |
gtk_widget_queue_draw(window);
|
|
|
6e8c62 |
return TRUE;
|
|
|
6e8c62 |
}
|
|
|
6e8c62 |
|
|
|
6e8c62 |
void activate(GtkApplication* app, gpointer data) {
|
|
|
6e8c62 |
window = gtk_application_window_new(app);
|
|
|
6e8c62 |
g_signal_connect(window, "draw", G_CALLBACK(draw), NULL);
|
|
|
6e8c62 |
g_signal_connect(window, "motion-notify-event", G_CALLBACK(motion), NULL);
|
|
|
6e8c62 |
gtk_widget_add_events(window, GDK_POINTER_MOTION_MASK);
|
|
|
6e8c62 |
gtk_window_set_default_size(GTK_WINDOW(window), 700, 500);
|
|
|
6e8c62 |
gtk_widget_show_all(window);
|
|
|
6e8c62 |
g_timeout_add(100, timeout, NULL);
|
|
|
6e8c62 |
}
|
|
|
6e8c62 |
|
|
|
6e8c62 |
int main(int argc, char **argv) {
|
|
|
6e8c62 |
GtkApplication *application = gtk_application_new(NULL, 0);
|
|
|
6e8c62 |
g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
|
|
|
6e8c62 |
int status = g_application_run(G_APPLICATION(application), argc, argv);
|
|
|
6e8c62 |
g_object_unref(application);
|
|
|
6e8c62 |
return status;
|
|
|
6e8c62 |
}
|