]> git.notmuchmail.org Git - dvonn/blobdiff - dvonn.c
Add support for dual-display mode
[dvonn] / dvonn.c
diff --git a/dvonn.c b/dvonn.c
index 1442923c0acf27243f9ce42fc6de2766abb453bf..e14001658fc3d1a6d7c3d6a101d874f6b2cc1ece 100644 (file)
--- a/dvonn.c
+++ b/dvonn.c
@@ -72,6 +72,8 @@ on_delete_event_quit (GtkWidget  *widget,
 /* Something like buff */
 #define BACKGROUND_COLOR 0.89, 0.70, 0.40
 
+#define RED_RING_COLOR 0.8, 0.2, 0.2
+
 /* Relative to a unit square. */
 #define RING_OUTER_RADIUS 0.4
 #define RING_INNER_RADIUS 0.2
@@ -155,6 +157,17 @@ on_button_press_event (GtkWidget   *widget,
     int x, y;
     char *error;
 
+    /* Ignore double and triple clicks. */
+    if (event->type >= GDK_2BUTTON_PRESS)
+       return TRUE;
+
+    /* Right-click means pass, (yes, it would be better to add some
+     * actual UI elements... */
+    if (event->button == 3) {
+       dvonn_board_pass (&game->board);
+       return TRUE;
+    }
+
     x = event->x;
     y = event->y;
     layout_device_to_board (layout, &x, &y);
@@ -183,12 +196,14 @@ on_button_press_event (GtkWidget  *widget,
     }
 
     if (! game->has_selected) {
-       if (game->board.cells[x][y].type == game->board.player) {
-           game->has_selected = TRUE;
-           game->selected_x = x;
-           game->selected_y = y;
-           dvonn_game_update_windows (game);
-       }
+       if (game->board.cells[x][y].type == game->board.player &&
+           ! dvonn_board_cell_surrounded (&game->board, x, y))
+           {
+                   game->has_selected = TRUE;
+                   game->selected_x = x;
+                   game->selected_y = y;
+                   dvonn_game_update_windows (game);
+           }
        return TRUE;
     }
 
@@ -350,6 +365,14 @@ on_expose_event_draw (GtkWidget            *widget,
            cairo_translate(cr,
                            x + (y - DVONN_BOARD_Y_SIZE/2) / 2.0,
                            M_SQRT1_2 * y);
+           if (cell.contains_red && cell.type != DVONN_CELL_RED) {
+               cairo_new_sub_path (cr);
+               cairo_arc (cr, 0.5, 0.5,
+                          (RING_INNER_RADIUS + RING_OUTER_RADIUS)/2.0,
+                          0, 2 * M_PI);
+               cairo_set_source_rgb (cr, RED_RING_COLOR);
+               cairo_fill (cr);
+           }
            ring_path (cr);
            switch (cell.type) {
            case DVONN_CELL_WHITE:
@@ -359,7 +382,7 @@ on_expose_event_draw (GtkWidget             *widget,
                cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
                break;
            case DVONN_CELL_RED:
-               cairo_set_source_rgb (cr, 0.8, 0.2, 0.2); /* red */
+               cairo_set_source_rgb (cr, RED_RING_COLOR);
                break;
            case DVONN_CELL_EMPTY:
            default:
@@ -375,10 +398,10 @@ on_expose_event_draw (GtkWidget           *widget,
            }
            cairo_fill (cr);
 
-           if (game->board.cells[x][y].height) {
+           if (game->board.cells[x][y].height > 1) {
                PangoLayout *height;
                cairo_move_to (cr,
-                              0.5 - 0.8 * RING_INNER_RADIUS * cos (M_PI_4),
+                              0.5 - 0.7 * RING_INNER_RADIUS * cos (M_PI_4),
                               0.5 - 1.2 * RING_INNER_RADIUS * sin (M_PI_4));
                height = _create_layout_printf (cr, game->font, "%d",
                                                game->board.cells[x][y].height);
@@ -417,7 +440,7 @@ view_init (view_t *view, dvonn_game_t *game, GtkWidget *window)
     view->layout.height = 0;
 }
 
-static void
+static GtkWidget*
 dvonn_game_create_view (dvonn_game_t *game)
 {
     view_t *view;
@@ -460,20 +483,34 @@ dvonn_game_create_view (dvonn_game_t *game)
                      G_CALLBACK (on_button_press_event), view);
 
     gtk_widget_show_all (window);
+
+    return window;
 }
 
 int
 main (int argc, char *argv[])
 {
+    GtkWidget *window;
+    GdkDisplay *display;
+    GdkScreen *screen;
     dvonn_game_t game;
 
     dvonn_game_init (&game);
 
     gtk_init (&argc, &argv);
 
-    /* Create two views of the game (one for each player) */
-    dvonn_game_create_view (&game);
+    /* Create a view for player 1. */
     dvonn_game_create_view (&game);
+
+    /* If Keith has connected to my machine, create a view for him as
+     * well. */
+    setenv ("XAUTHORITY", "/home/keithp/.Xauthority", 1);
+    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);
+    }
     
     gtk_main ();