typedef struct {
layout_t layout;
loa_board_t board;
+ loa_bool_t has_selected;
+ int selected_x;
+ int selected_y;
} loa_game_t;
static gboolean
/* Something like mahogany */
#define DARK_SQUARE_COLOR 0.26, 0.02, 0.01
+static gboolean
+on_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ loa_game_t *game = user_data;
+ layout_t *layout = &game->layout;
+ int x, y;
+ char *error;
+
+ x = (event->x - layout->x_offset) / layout->cell_size;
+ y = (event->y - layout->y_offset) / layout->cell_size;
+
+ if (! game->has_selected) {
+ if (game->board.cells[x][y] == game->board.player) {
+ game->has_selected = TRUE;
+ game->selected_x = x;
+ game->selected_y = y;
+ gtk_widget_queue_draw (widget);
+ }
+ return TRUE;
+ }
+
+ /* Do nothing for out-of-bounds clicks */
+ if (x < 0 || x >= LOA_BOARD_SIZE ||
+ y < 0 || y >= LOA_BOARD_SIZE)
+ {
+ return TRUE;
+ }
+
+ if (x == game->selected_x &&
+ y == game->selected_y)
+ {
+ game->has_selected = FALSE;
+ gtk_widget_queue_draw (widget);
+ return TRUE;
+ }
+
+ if (loa_board_move (&game->board,
+ game->selected_x, game->selected_y,
+ x, y, &error))
+ {
+ game->has_selected = FALSE;
+ gtk_widget_queue_draw (widget);
+ return TRUE;
+ } else {
+ printf ("Illegal move %c%d%c%d: %s\n",
+ 'a' + game->selected_x,
+ LOA_BOARD_SIZE - game->selected_y,
+ 'a' + x,
+ LOA_BOARD_SIZE - y,
+ error);
+ }
+
+ return TRUE;
+}
+
static gboolean
on_expose_event_draw (GtkWidget *widget,
GdkEventExpose *event,
cairo_set_source_rgb (cr, DARK_SQUARE_COLOR);
cairo_stroke (cr);
}
+ if (game->has_selected &&
+ x == game->selected_x &&
+ y == game->selected_y)
+ {
+ cairo_arc (cr,
+ layout->cell_size / 2.0, layout->cell_size / 2.0,
+ layout->cell_size / 2.5,
+ 0, 2 * M_PI);
+ cairo_set_source_rgba (cr, 0.2, 0.2, 1.0, 0.4);
+ cairo_fill (cr);
+ }
cairo_restore (cr);
}
}
game->layout.width = 0;
game->layout.height = 0;
+ game->has_selected = FALSE;
+
loa_board_init (&game->board);
}
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size (GTK_WINDOW (window), 100, 100);
+ gtk_window_set_default_size (GTK_WINDOW (window), 256, 256);
g_signal_connect (window, "delete-event",
G_CALLBACK (on_delete_event_quit), NULL);
g_signal_connect (drawing_area, "expose-event",
G_CALLBACK (on_expose_event_draw), &game);
+ gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK);
+ g_signal_connect (drawing_area, "button-press-event",
+ G_CALLBACK (on_button_press_event), &game);
+
gtk_widget_show_all (window);
gtk_main ();