#include <gtk/gtk.h>
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;
}