From ad4d9127c5dd419f84da2329c60b3f785c068e66 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 5 Mar 2009 11:56:13 -0800 Subject: [PATCH] Don't let one player place the opponent's pieces The program is now aware of a dual-window mode and restricts actions to the window belonging to the current player. --- dvonn-board.c | 3 +++ dvonn.c | 44 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/dvonn-board.c b/dvonn-board.c index 5b7c106..f8f9b93 100644 --- a/dvonn-board.c +++ b/dvonn-board.c @@ -231,9 +231,12 @@ dvonn_board_place (dvonn_board_t *board, board->moves++; + dvonn_board_next_player (board); + if (board->moves == 49) { board->phase = DVONN_PHASE_MOVEMENT; board->moves = 0; + board->player = DVONN_PLAYER_WHITE; } return TRUE; diff --git a/dvonn.c b/dvonn.c index e140016..896edc3 100644 --- a/dvonn.c +++ b/dvonn.c @@ -55,6 +55,9 @@ struct _dvonn_game { int selected_y; PangoFontDescription *font; + + dvonn_bool_t dual_window_mode; + GtkWidget *windows[2]; }; static gboolean @@ -157,6 +160,15 @@ on_button_press_event (GtkWidget *widget, int x, y; char *error; + /* Ignore events from the non-player. (Obviously when we add more + * interaction abilities, we will want to allow those even for the + * non-player---things like quit, etc.). */ + if (game->dual_window_mode && + widget->parent != game->windows[game->board.player]) + { + return TRUE; + } + /* Ignore double and triple clicks. */ if (event->type >= GDK_2BUTTON_PRESS) return TRUE; @@ -428,6 +440,10 @@ dvonn_game_init (dvonn_game_t *game) dvonn_board_init (&game->board); game->font = NULL; + + game->dual_window_mode = 0; + game->windows[0] = NULL; + game->windows[1] = NULL; } static void @@ -490,7 +506,7 @@ dvonn_game_create_view (dvonn_game_t *game) int main (int argc, char *argv[]) { - GtkWidget *window; + GtkWidget *window0, *window1; GdkDisplay *display; GdkScreen *screen; dvonn_game_t game; @@ -500,16 +516,32 @@ main (int argc, char *argv[]) gtk_init (&argc, &argv); /* Create a view for player 1. */ - dvonn_game_create_view (&game); + window0 = dvonn_game_create_view (&game); - /* If Keith has connected to my machine, create a view for him as - * well. */ + /* Ugly little hack to get Xauthority data from keithp. Obviously + * won't work for any other user. + * setenv ("XAUTHORITY", "/home/keithp/.Xauthority", 1); + */ + + /* Also ugly that localhost:10.0 is hard-coded, but this will work + * for many situations--both for when keithp attaches to my + * machine, and for when I connect to anyone's machine and then + * connect back, (assuming I haven't made other X forwardings + * first). + * + * Clearly we'll want some actual UI to select the right thing + * here. + */ display = gdk_display_open ("localhost:10.0"); if (display) { screen = gdk_display_get_default_screen (display); - window = dvonn_game_create_view (&game); - gtk_window_set_screen (GTK_WINDOW (window), screen); + window1 = dvonn_game_create_view (&game); + gtk_window_set_screen (GTK_WINDOW (window1), screen); + + game.dual_window_mode = 1; + game.windows[0] = window0; + game.windows[1] = window1; } gtk_main (); -- 2.43.0