From a9ad452c27bdc501e596475ff4a652e2e04a3f47 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Jan 19 2019 16:07:33 +0000 Subject: c gtk3: mouse-maze --- diff --git a/c/gtk3/mouse-maze/maze.png b/c/gtk3/mouse-maze/maze.png new file mode 100644 index 0000000..ee691d5 Binary files /dev/null and b/c/gtk3/mouse-maze/maze.png differ diff --git a/c/gtk3/mouse-maze/maze2.png b/c/gtk3/mouse-maze/maze2.png new file mode 100644 index 0000000..48084a9 Binary files /dev/null and b/c/gtk3/mouse-maze/maze2.png differ diff --git a/c/gtk3/mouse-maze/mousemaze.c b/c/gtk3/mouse-maze/mousemaze.c new file mode 100644 index 0000000..32d06d7 --- /dev/null +++ b/c/gtk3/mouse-maze/mousemaze.c @@ -0,0 +1,72 @@ +#include + +gboolean play = FALSE; +GtkWidget *image; +GtkWidget *label; + + +gboolean motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) { + if (play) { + int x = (int)event->x; + int y = (int)event->y; + + GdkPixbuf *pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image)); + guchar *pixels = gdk_pixbuf_get_pixels(pixbuf); + int stride = gdk_pixbuf_get_rowstride(pixbuf); + guint pixel = *(guint*)(pixels + y*stride + sizeof(guint)*x); + + if (pixel == 0xff000000) { + gtk_label_set_text(GTK_LABEL(label), "You looooze"); + play = FALSE; + } else + if (pixel == 0xff00ffff) { + gtk_label_set_text(GTK_LABEL(label), "You WIN!!!"); + play = FALSE; + } + } + return TRUE; +} + +void clicked(GtkButton *button, gpointer data) { + gtk_label_set_text(GTK_LABEL(label), "Play"); + play = TRUE; +} + +void activate(GtkApplication* app, gpointer data) { + GtkWidget *window = gtk_application_window_new(app); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + gtk_container_add(GTK_CONTAINER(window), hbox); + + GtkWidget *event_box = gtk_event_box_new(); + g_signal_connect(event_box, "motion-notify-event", G_CALLBACK(motion), NULL); + gtk_widget_add_events(event_box, GDK_POINTER_MOTION_MASK); + gtk_container_add(GTK_CONTAINER(hbox), event_box); + + // required image format is 8-bit RGBA + image = gtk_image_new_from_file("maze.png"); + gtk_container_add(GTK_CONTAINER(event_box), image); + + GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + gtk_container_add(GTK_CONTAINER(hbox), vbox); + + GtkWidget *button = gtk_button_new_with_label("Start"); + g_signal_connect(button, "clicked", G_CALLBACK(clicked), NULL); + gtk_widget_set_size_request(button, 150, 20); + gtk_container_add(GTK_CONTAINER(vbox), button); + + label = gtk_label_new("--"); + gtk_container_add(GTK_CONTAINER(vbox), label); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *application = gtk_application_new(NULL, 0); + g_signal_connect(application, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(application), argc, argv); + g_object_unref(application); + return status; +} +