[Commit] grrobot/src grr_board_view.c, 1.16, 1.17 grr_board_view.h,
1.12, 1.13 grrobot.c, 1.17, 1.18
Carl Worth
commit at keithp.com
Tue Nov 11 07:51:55 PST 2003
Committed by: cworth
Update of /local/src/CVS/grrobot/src
In directory home.keithp.com:/tmp/cvs-serv15556/src
Modified Files:
grr_board_view.c grr_board_view.h grrobot.c
Log Message:
* src/grrobot.c (grr_game_read_notices): Exit cleanly: need to
return control to Gtk+ so that gtk_main_quit has a chance to do
its job.
(grr_game_read_notices): Track changes in grr_board_view timer
API.
(grr_game_key_press_callback): Eliminate bid_entry text box and
bid button. Instead, a bare number in the message_entry will
result in a bid.
(grr_game_key_press_callback): Change several keybindings to
require a control modifier: C-N=Next turn, C-P=Pass, C-Z=Zap timer
and C-RGBY for robot selection. Now, no keybindings should
interfere with simple text messages.
(grr_game_pass): "Pass" button now issues "abandon" instead of
"revoke" when not in show mode.
(grr_game_next): "Next Turn" button now only issues turn never
"abandon", so there's no longer a problem when two users both hit
the "Next Turn" button.
* src/grr_board_view.c (grr_board_view_decrement_timer): Make the
"Zap timer" feature animate the fast clock rather than just
snapping.
(grr_board_view_start_timer):
(grr_board_view_stop_timer):
(grr_board_view_set_timer): Cleaner timer API: set, start, and
stop.
Index: grr_board_view.c
===================================================================
RCS file: /local/src/CVS/grrobot/src/grr_board_view.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- grr_board_view.c 10 Nov 2003 15:45:45 -0000 1.16
+++ grr_board_view.c 11 Nov 2003 15:51:53 -0000 1.17
@@ -134,6 +134,7 @@
view->time = 60.0;
view->drift_correct = 0.0;
view->timer = 0;
+ view->zap_time = 0.0;
view->cell_width = 0;
view->cell_height = 0;
@@ -696,7 +697,7 @@
gtk_widget_queue_draw_area (GTK_WIDGET (view), x, y, view->cell_width, view->cell_height);
}
-#define TIMER_INTERVAL_MS 100
+#define TIMER_INTERVAL_MS 100.0
static void
grr_board_view_refresh_timer (grr_board_view_t *view)
@@ -721,19 +722,29 @@
view->time -= TIMER_INTERVAL_MS / 1000.0;
view->time += view->drift_correct;
+ if (view->zap_time) {
+ view->time -= view->zap_time;
+ view->zap_time += 1.0;
+ }
+
grr_board_view_refresh_timer (view);
+ if (view->time < 0) {
+ grr_board_view_stop_timer (view);
+ return FALSE;
+ }
+
return TRUE;
}
void
-grr_board_view_start_timer (grr_board_view_t *view, double time)
+grr_board_view_set_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;
+ /* Correct any drift within the next 10 seconds, or half the
+ remaining time --- whichever is less. */
if (time >= 20.0)
correction_time = 10.0;
else
@@ -741,12 +752,21 @@
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);
+ view->drift_correct = 0.0;
+ view->zap_time = 0.0;
}
}
void
+grr_board_view_start_timer (grr_board_view_t *view)
+{
+ if (view->timer)
+ return;
+
+ 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)
@@ -755,15 +775,17 @@
gtk_timeout_remove (view->timer);
view->timer = 0;
view->time = 0.0;
+ view->drift_correct = 0.0;
+ view->zap_time = 0.0;
grr_board_view_refresh_timer (view);
}
void
-grr_board_view_reset_timer (grr_board_view_t *view)
+grr_board_view_zap_timer (grr_board_view_t *view)
{
- grr_board_view_stop_timer (view);
+ view->zap_time = 4;
- view->time = 60.0;
- view->drift_correct = 0.0;
+ grr_board_view_refresh_timer (view);
}
+
Index: grr_board_view.h
===================================================================
RCS file: /local/src/CVS/grrobot/src/grr_board_view.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- grr_board_view.h 10 Nov 2003 15:45:45 -0000 1.12
+++ grr_board_view.h 11 Nov 2003 15:51:53 -0000 1.13
@@ -68,6 +68,7 @@
guint8 button;
double time;
+ double zap_time;
double drift_correct;
guint timer;
@@ -106,13 +107,16 @@
grr_board_view_mark_damage (grr_board_view_t *view, int i, int j);
void
-grr_board_view_start_timer (grr_board_view_t *view, double time);
+grr_board_view_set_timer (grr_board_view_t *view, double time);
+
+void
+grr_board_view_start_timer (grr_board_view_t *view);
void
grr_board_view_stop_timer (grr_board_view_t *view);
void
-grr_board_view_reset_timer (grr_board_view_t *view);
+grr_board_view_zap_timer (grr_board_view_t *view);
void
grr_board_view_transform_pixel_to_cell (grr_board_view_t *view,
Index: grrobot.c
===================================================================
RCS file: /local/src/CVS/grrobot/src/grrobot.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- grrobot.c 10 Nov 2003 15:45:45 -0000 1.17
+++ grrobot.c 11 Nov 2003 15:51:53 -0000 1.18
@@ -46,7 +46,6 @@
GtkWidget *window;
grr_board_view_t *board_view;
GtkWidget *message_entry;
- GtkWidget *bid_entry;
GtkTextBuffer *message_buffer;
GtkWidget *message_view;
@@ -230,6 +229,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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
@@ -530,41 +505,14 @@
}
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)
@@ -573,7 +521,13 @@
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 @@
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 @@
(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);
More information about the Commit
mailing list