-/* grrobot - Ricochet Robot using GTK+, libxsvg, and Cairo
+/* grrobot - Ricochet Robot using GTK+, libsvg-cairo, and cairo
*
* Copyright © 2003 Carl Worth
*
GtkWidget *window;
grr_board_view_t *board_view;
GtkWidget *message_entry;
- GtkWidget *bid_entry;
GtkTextBuffer *message_buffer;
GtkWidget *message_view;
fprintf (stderr, "Error during rr_client_next_notice: %s\n",
rr_status_str (status));
gtk_main_quit ();
+ return;
}
if (!notice) {
fprintf (stderr, "Missing notice\n");
continue;
}
-
+
switch (notice->type) {
case RR_NOTICE_USER:
grr_game_printf (game,
here. */
game->state = RR_GAMESTATE_NEW;
+ grr_board_view_set_timer (game->board_view, 60.0);
grr_game_print (game, "\nNew round!");
rr_board_set_goal_target (board, notice->u.target);
gtk_widget_queue_draw (GTK_WIDGET (game->window));
notice->u.number);
break;
case RR_NOTICE_ACTIVE:
+ grr_board_view_zap_timer (game->board_view);
grr_game_printf (game, "\nUser %s now active to demonstrate solution in %d moves.",
notice->u.bid.username,
notice->u.bid.number);
break;
case RR_NOTICE_TIMER:
- grr_game_printf (game, "\nTime remaining: %d seconds.",
- notice->u.number);
+ grr_board_view_set_timer (game->board_view,
+ notice->u.number);
+ grr_board_view_start_timer (game->board_view);
break;
case RR_NOTICE_POSITION:
{
GdkEventKey *event,
grr_game_t *game)
{
- if (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (game->message_entry))
- || GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (game->bid_entry))
- ) {
+ if (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (game->message_entry))) {
if (event->keyval == GDK_Escape) {
gtk_entry_set_text (GTK_ENTRY (game->message_entry), "");
- gtk_entry_set_text (GTK_ENTRY (game->bid_entry), "");
gtk_widget_grab_focus (GTK_WIDGET (game->message_view));
-
return TRUE;
} else {
- return FALSE;
+ if ((event->state & GDK_CONTROL_MASK) == 0)
+ return FALSE;
+ }
+ }
+
+ if (event->state & GDK_CONTROL_MASK) {
+ switch (event->keyval) {
+ case GDK_N:
+ case GDK_n:
+ case GDK_T:
+ case GDK_t:
+ grr_game_next (game);
+ return TRUE;
+ case GDK_P:
+ case GDK_p:
+ grr_game_pass (game);
+ return TRUE;
+ case GDK_Z:
+ case GDK_z:
+ grr_game_zap (game);
+ return TRUE;
+ case GDK_B:
+ case GDK_b:
+ grr_board_view_set_active_robot (game->board_view, RR_ROBOT_BLUE);
+ return TRUE;
+ case GDK_G:
+ case GDK_g:
+ grr_board_view_set_active_robot (game->board_view, RR_ROBOT_GREEN);
+ return TRUE;
+ case GDK_R:
+ case GDK_r:
+ grr_board_view_set_active_robot (game->board_view, RR_ROBOT_RED);
+ return TRUE;
+ case GDK_Y:
+ case GDK_y:
+ grr_board_view_set_active_robot (game->board_view, RR_ROBOT_YELLOW);
+ return TRUE;
+ case GDK_Q:
+ case GDK_q:
+ if (event->state & GDK_CONTROL_MASK) {
+ gtk_main_quit ();
+ }
+ return TRUE;
}
}
switch (event->keyval) {
- case GDK_N:
- case GDK_n:
- case GDK_T:
- case GDK_t:
- grr_game_next (game);
- break;
- case GDK_P:
- case GDK_p:
- grr_game_pass (game);
- break;
- case GDK_Z:
- case GDK_z:
- grr_game_zap (game);
- break;
- case GDK_B:
- case GDK_b:
- grr_board_view_set_active_robot (game->board_view, RR_ROBOT_BLUE);
- break;
- case GDK_G:
- case GDK_g:
- grr_board_view_set_active_robot (game->board_view, RR_ROBOT_GREEN);
- break;
- case GDK_R:
- case GDK_r:
- grr_board_view_set_active_robot (game->board_view, RR_ROBOT_RED);
- break;
- case GDK_Y:
- case GDK_y:
- grr_board_view_set_active_robot (game->board_view, RR_ROBOT_YELLOW);
- break;
+ case GDK_BackSpace:
+ grr_board_view_undo (game->board_view);
+ return TRUE;
case GDK_Up:
grr_board_view_move_active (game->board_view, RR_DIRECTION_NORTH);
- break;
+ return TRUE;
case GDK_Right:
grr_board_view_move_active (game->board_view, RR_DIRECTION_EAST);
- break;
+ return TRUE;
case GDK_Down:
grr_board_view_move_active (game->board_view, RR_DIRECTION_SOUTH);
- break;
+ return TRUE;
case GDK_Left:
grr_board_view_move_active (game->board_view, RR_DIRECTION_WEST);
- break;
- case GDK_BackSpace:
- grr_board_view_undo (game->board_view);
- break;
- case GDK_0:
- case GDK_1:
- case GDK_2:
- case GDK_3:
- case GDK_4:
- case GDK_5:
- case GDK_6:
- case GDK_7:
- case GDK_8:
- case GDK_9:
- {
- int pos = -1;
- const gchar *key = gdk_keyval_name (event->keyval);
- gtk_widget_grab_focus (GTK_WIDGET (game->bid_entry));
- gtk_editable_insert_text (GTK_EDITABLE (game->bid_entry),
- key, strlen (key), &pos);
- gtk_editable_set_position (GTK_EDITABLE (game->bid_entry), -1);
- }
- break;
- case GDK_space:
- case GDK_slash:
- gtk_widget_grab_focus (GTK_WIDGET (game->message_entry));
- if (event->keyval == GDK_slash) {
- int pos = -1;
- gtk_editable_insert_text (GTK_EDITABLE (game->message_entry),
- "/", 1, &pos);
- gtk_editable_set_position (GTK_EDITABLE (game->message_entry), -1);
- }
- break;
- case GDK_Q:
- case GDK_q:
- if (event->state & GDK_CONTROL_MASK) {
- gtk_main_quit ();
- }
- break;
+ return TRUE;
+ case GDK_Control_L:
+ case GDK_Control_R:
+ return TRUE;
}
- return TRUE;
+ gtk_widget_grab_focus (GTK_WIDGET (game->message_entry));
+ return FALSE;
}
/* XXX: Messy, messy. I can't seem to make up my mind whether client
if (game->state == RR_GAMESTATE_SHOW)
rr_client_pass (game->client);
else
- rr_client_revoke (game->client);
+ rr_client_abandon (game->client);
}
static void
if (game->client == NULL)
return;
- if (game->state == RR_GAMESTATE_DONE)
- rr_client_turn (game->client);
- else
- rr_client_abandon (game->client);
+ rr_client_turn (game->client);
}
static void
grr_game_next (game);
}
-static void
-grr_game_bid_entry_callback (GtkWidget *widget,
- grr_game_t *game)
-{
- const gchar *bid_text;
- char *end;
- long bid;
-
- if (game->client == NULL)
- return;
-
- bid_text = gtk_entry_get_text (GTK_ENTRY (game->bid_entry));
-
- if (bid_text && bid_text[0]) {
- bid = strtol (bid_text, &end, 10);
- if (*end != '\0' && ! isspace (*end)) {
- grr_game_printf (game, "\nInvalid bid value: %s", bid_text);
- } else {
- if (bid == 0)
- rr_client_revoke (game->client);
- else
- rr_client_bid (game->client, bid);
- }
- }
-
- gtk_entry_set_text (GTK_ENTRY (game->bid_entry), "");
- gtk_widget_grab_focus (GTK_WIDGET (game->message_view));
-}
-
static void
grr_game_message_entry_callback (GtkWidget *widget,
grr_game_t *game)
rr_status_t status;
const gchar *entry_text;
char **response;
+ char *end;
+ long bid;
int i;
if (game->client == NULL)
entry_text = gtk_entry_get_text (GTK_ENTRY (game->message_entry));
if (entry_text && entry_text[0]) {
- if (entry_text[0] == '/') {
+ bid = strtol (entry_text, &end, 10);
+ if (*end == '\0' || isspace (*end)) {
+ if (bid == 0)
+ rr_client_revoke (game->client);
+ else
+ rr_client_bid (game->client, bid);
+ } else if (entry_text[0] == '/') {
status = rr_client_request (game->client, entry_text + 1, &response);
if (status) {
grr_game_printf (game, "\nERROR: %s.", rr_status_str (status));
GtkWidget *window;
GtkWidget *message_view;
GtkWidget *message_entry;
- GtkWidget *bid_entry;
- GtkWidget *bid_button;
GtkWidget *pass_button;
GtkWidget *zap_button;
GtkWidget *next_button;
(gpointer) game);
}
gtk_widget_show (hbox);
-
+
hbox = gtk_hbox_new (FALSE, 1);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
{
- bid_button = gtk_button_new_with_label ("Bid:");
- gtk_box_pack_start (GTK_BOX (hbox), bid_button,
- FALSE, FALSE, 1);
- gtk_widget_show (bid_button);
- g_signal_connect (G_OBJECT (bid_button), "clicked",
- G_CALLBACK (grr_game_bid_entry_callback),
- (gpointer) game);
-
- game->bid_entry = gtk_entry_new ();
- bid_entry = game->bid_entry;
- gtk_entry_set_max_length (GTK_ENTRY (bid_entry), 3);
- gtk_entry_set_width_chars (GTK_ENTRY (bid_entry), 4);
- gtk_box_pack_start (GTK_BOX (hbox), bid_entry,
- FALSE, FALSE, 0);
- gtk_widget_show (bid_entry);
- g_signal_connect (G_OBJECT (bid_entry), "activate",
- G_CALLBACK (grr_game_bid_entry_callback),
- (gpointer) game);
-
pass_button = gtk_button_new_with_label ("Pass");
gtk_box_pack_start (GTK_BOX (hbox), pass_button,
FALSE, FALSE, 1);