+/* Something like buff */
+#define LIGHT_SQUARE_COLOR 0.89, 0.70, 0.40
+/* 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;
+}
+