X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=src%2Fgrrobot.c;fp=src%2Fgrrobot.c;h=386a1637956a275586cdb1dfd502349c2729534f;hb=94802efc6fe8481ba43c379b57a038d6d415ce4d;hp=8df5b9815d9da75615c0f9ac690830007e1f2fa6;hpb=7ee31401a35405ee700c8fab563cecc9f43db3a1;p=grrobot diff --git a/src/grrobot.c b/src/grrobot.c index 8df5b98..386a163 100644 --- a/src/grrobot.c +++ b/src/grrobot.c @@ -46,7 +46,6 @@ typedef struct grr_game { GtkWidget *window; grr_board_view_t *board_view; GtkWidget *message_entry; - GtkWidget *bid_entry; GtkTextBuffer *message_buffer; GtkWidget *message_view; @@ -230,6 +229,7 @@ grr_game_read_notices (grr_game_t *game) 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"); @@ -273,7 +273,7 @@ grr_game_read_notices (grr_game_t *game) here. */ game->state = RR_GAMESTATE_NEW; - grr_board_view_reset_timer (game->board_view); + 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)); @@ -339,14 +339,15 @@ grr_game_read_notices (grr_game_t *game) notice->u.number); break; case RR_NOTICE_ACTIVE: - grr_board_view_stop_timer (game->board_view); + 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_board_view_start_timer (game->board_view, - 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: { @@ -372,104 +373,81 @@ grr_game_key_press_callback (GtkWidget *widget, 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 @@ -484,7 +462,7 @@ grr_game_pass (grr_game_t *game) if (game->state == RR_GAMESTATE_SHOW) rr_client_pass (game->client); else - rr_client_revoke (game->client); + rr_client_abandon (game->client); } static void @@ -502,10 +480,7 @@ grr_game_next (grr_game_t *game) 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 @@ -529,35 +504,6 @@ grr_game_next_callback (GtkWidget *widget, 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) @@ -565,6 +511,8 @@ grr_game_message_entry_callback (GtkWidget *widget, rr_status_t status; const gchar *entry_text; char **response; + char *end; + long bid; int i; if (game->client == NULL) @@ -573,7 +521,13 @@ grr_game_message_entry_callback (GtkWidget *widget, 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)); @@ -663,8 +617,6 @@ grr_game_start_gui (grr_game_t *game, const char *user) GtkWidget *window; GtkWidget *message_view; GtkWidget *message_entry; - GtkWidget *bid_entry; - GtkWidget *bid_button; GtkWidget *pass_button; GtkWidget *zap_button; GtkWidget *next_button; @@ -742,29 +694,10 @@ grr_game_start_gui (grr_game_t *game, const char *user) (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);