X-Git-Url: https://git.cworth.org/git?p=loa;a=blobdiff_plain;f=loa.c;h=355c66744df9dba359db3b54c2ed2801683b41ce;hp=49b4f16ff63dd2cfc30b5ba2cfa8135a55a8ce2b;hb=HEAD;hpb=8a4f047dec04d825e2074113a7c8f1ba3c602889 diff --git a/loa.c b/loa.c index 49b4f16..355c667 100644 --- a/loa.c +++ b/loa.c @@ -35,6 +35,9 @@ typedef struct { 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 @@ -54,6 +57,63 @@ on_delete_event_quit (GtkWidget *widget, /* 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, @@ -114,6 +174,17 @@ on_expose_event_draw (GtkWidget *widget, 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); } } @@ -129,6 +200,8 @@ loa_game_init (loa_game_t *game) game->layout.width = 0; game->layout.height = 0; + game->has_selected = FALSE; + loa_board_init (&game->board); } @@ -145,7 +218,7 @@ main (int argc, char *argv[]) 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); @@ -157,6 +230,10 @@ main (int argc, char *argv[]) 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 ();