+static gboolean
+grr_game_key_press_callback (GtkWidget *widget,
+ GdkEventKey *event,
+ grr_game_t *game)
+{
+ if (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (game->command_entry))) {
+ if (event->keyval == GDK_Escape) {
+ gtk_entry_set_text (GTK_ENTRY (game->command_entry), "");
+ gtk_widget_grab_focus (GTK_WIDGET (game->message_view));
+
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+
+ switch (event->keyval) {
+ 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_Up:
+ grr_board_view_move_active (game->board_view, RR_DIRECTION_NORTH);
+ break;
+ case GDK_Right:
+ grr_board_view_move_active (game->board_view, RR_DIRECTION_EAST);
+ break;
+ case GDK_Down:
+ grr_board_view_move_active (game->board_view, RR_DIRECTION_SOUTH);
+ break;
+ 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_space:
+ case GDK_slash:
+ gtk_widget_grab_focus (GTK_WIDGET (game->command_entry));
+ if (event->keyval == GDK_slash) {
+ int pos = -1;
+ gtk_editable_insert_text (GTK_EDITABLE (game->command_entry),
+ "/", 1, &pos);
+ gtk_editable_set_position (GTK_EDITABLE (game->command_entry), -1);
+ }
+ break;
+ case GDK_Q:
+ case GDK_q:
+ if (event->state & GDK_CONTROL_MASK) {
+ gtk_exit (0);
+ }
+ break;
+ }
+
+ return TRUE;
+}
+