|
|
daba5d |
#include <gtk gtk.h=""></gtk>
|
|
|
daba5d |
|
|
|
daba5d |
|
|
|
daba5d |
const double pi = 3.141592653589793;
|
|
|
daba5d |
|
|
|
daba5d |
GtkWidget *window;
|
|
|
daba5d |
GtkWidget *fixed;
|
|
|
daba5d |
GtkWidget *shape;
|
|
|
daba5d |
gboolean play = TRUE;
|
|
|
daba5d |
gboolean hidden = FALSE;
|
|
|
daba5d |
|
|
|
daba5d |
int x = 58;
|
|
|
daba5d |
int y = 75;
|
|
|
daba5d |
double mouse_x = 0.0;
|
|
|
daba5d |
double mouse_y = 0.0;
|
|
|
daba5d |
|
|
|
daba5d |
|
|
|
daba5d |
gboolean timeout(gpointer data) {
|
|
|
daba5d |
if (play) {
|
|
|
daba5d |
int w, h;
|
|
|
daba5d |
gtk_widget_get_size_request(shape, &w, &h);
|
|
|
daba5d |
|
|
|
daba5d |
if (x + w/2 < mouse_x) x += 5;
|
|
|
daba5d |
if (x + w/2 > mouse_x) x -= 5;
|
|
|
daba5d |
if (y + h/2 < mouse_y) y += 5;
|
|
|
daba5d |
if (y + h/2 > mouse_y) y -= 5;
|
|
|
daba5d |
|
|
|
daba5d |
gtk_fixed_move(GTK_FIXED(fixed), shape, x, y);
|
|
|
daba5d |
}
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean restart_timeout(gpointer data) {
|
|
|
daba5d |
play = TRUE;
|
|
|
daba5d |
gdk_window_set_cursor(gtk_widget_get_window(window), NULL);
|
|
|
daba5d |
gtk_widget_queue_draw(shape);
|
|
|
daba5d |
return FALSE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean shape_draw(GtkWidget *widget, cairo_t *cr, gpointer data) {
|
|
|
daba5d |
int w, h;
|
|
|
daba5d |
gtk_widget_get_size_request(widget, &w, &h);
|
|
|
daba5d |
|
|
|
daba5d |
cairo_set_source_rgba(cr, 0, 0, 1, 1);
|
|
|
daba5d |
cairo_fill(cr);
|
|
|
daba5d |
|
|
|
daba5d |
cairo_arc(cr, 10, 10, 10, -pi, -pi/2);
|
|
|
daba5d |
cairo_line_to(cr, w-10, 0);
|
|
|
daba5d |
cairo_arc(cr, w-10, 10, 10, -pi/2, 0);
|
|
|
daba5d |
cairo_line_to(cr, w, h-10);
|
|
|
daba5d |
cairo_arc(cr, w-10, h-10, 10, 0, pi/2);
|
|
|
daba5d |
cairo_line_to(cr, 10, h);
|
|
|
daba5d |
cairo_arc(cr, 10, h-10, 10, pi/2, pi);
|
|
|
daba5d |
cairo_line_to(cr, 0, 10);
|
|
|
daba5d |
|
|
|
daba5d |
if (play) cairo_set_source_rgba(cr, 1, 1, 1, 1);
|
|
|
daba5d |
else cairo_set_source_rgba(cr, 1, 0, 0, 1);
|
|
|
daba5d |
cairo_fill_preserve(cr);
|
|
|
daba5d |
|
|
|
daba5d |
cairo_set_source_rgba(cr, 0, 0, 0, 1);
|
|
|
daba5d |
cairo_stroke(cr);
|
|
|
daba5d |
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean shape_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) {
|
|
|
daba5d |
play = FALSE;
|
|
|
daba5d |
|
|
|
daba5d |
GdkCursor *cursor = gdk_cursor_new_from_name(gtk_widget_get_display(widget), "none");
|
|
|
daba5d |
gdk_window_set_cursor(gtk_widget_get_window(window), cursor);
|
|
|
daba5d |
g_object_unref(cursor);
|
|
|
daba5d |
|
|
|
daba5d |
gtk_widget_queue_draw(shape);
|
|
|
daba5d |
g_timeout_add(500, restart_timeout, NULL);
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean window_motion(GtkWidget *widget, GdkEventMotion *event, gpointer data) {
|
|
|
daba5d |
if (!hidden) {
|
|
|
daba5d |
mouse_x = event->x;
|
|
|
daba5d |
mouse_y = event->y;
|
|
|
daba5d |
}
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean shelter_enter(GtkWidget *widget, GdkEvent *event, gpointer data) {
|
|
|
daba5d |
hidden = TRUE;
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
gboolean shelter_leave(GtkWidget *widget, GdkEvent *event, gpointer data) {
|
|
|
daba5d |
hidden = FALSE;
|
|
|
daba5d |
return TRUE;
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
void activate(GtkApplication* app, gpointer data) {
|
|
|
daba5d |
window = gtk_application_window_new(app);
|
|
|
daba5d |
g_signal_connect(window, "motion-notify-event", G_CALLBACK(window_motion), NULL);
|
|
|
daba5d |
gtk_widget_add_events(window, GDK_POINTER_MOTION_MASK);
|
|
|
daba5d |
gtk_window_set_default_size(GTK_WINDOW(window), 700, 500);
|
|
|
daba5d |
|
|
|
daba5d |
fixed = gtk_fixed_new();
|
|
|
daba5d |
gtk_container_add(GTK_CONTAINER(window), fixed);
|
|
|
daba5d |
|
|
|
daba5d |
shape = gtk_drawing_area_new();
|
|
|
daba5d |
g_signal_connect(shape, "draw", G_CALLBACK(shape_draw), NULL);
|
|
|
daba5d |
g_signal_connect(shape, "motion-notify-event", G_CALLBACK(shape_motion), NULL);
|
|
|
daba5d |
gtk_widget_add_events(shape, GDK_POINTER_MOTION_MASK);
|
|
|
daba5d |
gtk_widget_set_size_request(shape, 86, 61);
|
|
|
daba5d |
gtk_fixed_put(GTK_FIXED(fixed), shape, x, y);
|
|
|
daba5d |
|
|
|
daba5d |
GtkWidget *button1 = gtk_button_new_with_label("Sweet Home");
|
|
|
daba5d |
g_signal_connect(button1, "enter-notify-event", G_CALLBACK(shelter_enter), NULL);
|
|
|
daba5d |
g_signal_connect(button1, "leave-notify-event", G_CALLBACK(shelter_leave), NULL);
|
|
|
daba5d |
gtk_widget_add_events(button1, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
|
|
|
daba5d |
gtk_widget_set_size_request(button1, 249, 154);
|
|
|
daba5d |
gtk_fixed_put(GTK_FIXED(fixed), button1, 48, 296);
|
|
|
daba5d |
|
|
|
daba5d |
GtkWidget *button2 = gtk_button_new_with_label("Another Safe Place");
|
|
|
daba5d |
g_signal_connect(button2, "enter-notify-event", G_CALLBACK(shelter_enter), NULL);
|
|
|
daba5d |
g_signal_connect(button2, "leave-notify-event", G_CALLBACK(shelter_leave), NULL);
|
|
|
daba5d |
gtk_widget_add_events(button2, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
|
|
|
daba5d |
gtk_widget_set_size_request(button2, 216, 131);
|
|
|
daba5d |
gtk_fixed_put(GTK_FIXED(fixed), button2, 344, 131);
|
|
|
daba5d |
|
|
|
daba5d |
gtk_widget_show_all(window);
|
|
|
daba5d |
|
|
|
daba5d |
g_timeout_add(10, timeout, NULL);
|
|
|
daba5d |
}
|
|
|
daba5d |
|
|
|
daba5d |
int main(int argc, char **argv) {
|
|
|
daba5d |
GtkApplication *application = gtk_application_new(NULL, 0);
|
|
|
daba5d |
g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
|
|
|
daba5d |
int status = g_application_run(G_APPLICATION(application), argc, argv);
|
|
|
daba5d |
g_object_unref(application);
|
|
|
daba5d |
return status;
|
|
|
daba5d |
}
|
|
|
daba5d |
|