X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=src%2Fgrr_board_view.c;h=8d85988f0cb2c414a19b94bded0d72b11454bec9;hb=7ee31401a35405ee700c8fab563cecc9f43db3a1;hp=66a261732e7f02793b21a5f1bca6a091b54b9d19;hpb=ef3b9b45ab4b9ac1638b21cbb049ebeba99629ae;p=grrobot diff --git a/src/grr_board_view.c b/src/grr_board_view.c index 66a2617..8d85988 100644 --- a/src/grr_board_view.c +++ b/src/grr_board_view.c @@ -130,6 +130,9 @@ grr_board_view_init (grr_board_view_t *view) view->client = NULL; view->button = 0; + + view->time = 60.0; + view->drift_correct = 0.0; view->timer = 0; view->cell_width = 0; @@ -481,6 +484,28 @@ grr_board_view_expose (GtkWidget *widget, cairo_fill (xrs); grr_icon_draw (view->target_icon[rr_target_idx (goal_target)], xrs); cairo_restore (xrs); + + /* Draw clock */ + if (view->time < 60.0) { + cairo_save (xrs); + cairo_new_path (xrs); + cairo_move_to (xrs, + (double) view->board_width / 2 * view->cell_width, + (double) view->board_height / 2 * view->cell_height); + cairo_arc (xrs, + (double) view->board_width / 2 * view->cell_width, + (double) view->board_height / 2 * view->cell_height, + .9 * view->cell_width, + - M_PI_2, + 2 * M_PI * (60.0 - view->time) / 60.0 - M_PI_2); + cairo_close_path (xrs); + + cairo_set_rgb_color (xrs, 0.0, 0.0, 0.0); + cairo_set_alpha (xrs, 0.5); + cairo_fill (xrs); + + cairo_restore (xrs); + } } /* Draw walls */ @@ -670,3 +695,75 @@ grr_board_view_mark_damage (grr_board_view_t *view, int i, int j) grr_board_view_transform_cell_to_pixel (view, i, j, &x, &y); gtk_widget_queue_draw_area (GTK_WIDGET (view), x, y, view->cell_width, view->cell_height); } + +#define TIMER_INTERVAL_MS 100 + +static void +grr_board_view_refresh_timer (grr_board_view_t *view) +{ + int x, y; + + grr_board_view_transform_cell_to_pixel (view, + view->board_width / 2 - 1, + view->board_height / 2 -1, + &x, &y); + gtk_widget_queue_draw_area (GTK_WIDGET (view), + x, y, + 2 * view->cell_width, + 2 * view->cell_height); +} + +static gboolean +grr_board_view_decrement_timer (void *widget) +{ + grr_board_view_t *view = widget; + + view->time -= TIMER_INTERVAL_MS / 1000.0; + view->time += view->drift_correct; + + grr_board_view_refresh_timer (view); + + return TRUE; +} + +void +grr_board_view_start_timer (grr_board_view_t *view, double time) +{ + /* XXX: It would be good to adjust the clock for latency somewhere... */ + /* Correct any drift within the next 10 seconds, or half the + remaining time --- whichever is less. */ + if (view->timer) { + double correction_time; + if (time >= 20.0) + correction_time = 10.0; + else + correction_time = time / 2.0; + view->drift_correct = (time - view->time) / (correction_time * TIMER_INTERVAL_MS); + } else { + view->time = time; + + view->timer = gtk_timeout_add (TIMER_INTERVAL_MS, grr_board_view_decrement_timer, view); + } +} + +void +grr_board_view_stop_timer (grr_board_view_t *view) +{ + if (view->timer == 0) + return; + + gtk_timeout_remove (view->timer); + view->timer = 0; + view->time = 0.0; + + grr_board_view_refresh_timer (view); +} + +void +grr_board_view_reset_timer (grr_board_view_t *view) +{ + grr_board_view_stop_timer (view); + + view->time = 60.0; + view->drift_correct = 0.0; +}