Gtk2::GoBoard - high quality goban widget with sound


   use Games::Go::SimpleBoard;

   my $goboard = newe Games::Go::SimpleBoard;

   use Gtk2::GoBoard;

   my $gtkboard = new Gtk2::GoBoard size => 19;

   # update board, makes a copy
   $gtkboard->set_board ($goboard);

   # advanced: enable stone curser for black player, showing
   # only valid moves
   $gtkboard->set (cursor => sub {
      my ($mark, $x, $y) = @_;

      $mark |= MARK_GRAYED | MARK_B
         if $goboard->is_valid_move (COLOUR_WHITE,
                                     $x, $y,
                                     $ruleset == RULESET_NEW_ZEALAND);


   # button-release and -press events pass board coordinates
   $gtkboard->signal_connect (button_release => sub {
      my ($button, $x, $y) = @_;



This is the very first "true" Gtk2 widget written in Perl.

The Gtk2::GoBoard class works like any other widget, see the SYNOPSIS for short examples of the available methods, and the App::IGS and KGS modules for usage examples.

Please supply a more descriptive description :)


In addition to a graphical board widget, this module has some rudimentary support for sounds.

Playing sounds required the Audio::Play module. If it isn't installed, sounds will silently not being played. The module intentionally doesn't depend on Audio::Play as it isn't actively maintained anymore and fails to install cleanly.

Note that Audio::Play is broken on 64-bit platforms, which the author knows about for half a decade now, but apparently can't be bothered to fix. The symptoms are that it cannot load the soundfile and will silently result in - silence.

$board->set_board ($games_go_simpleboard)

Sets the new board position to display from the current position stored in the Games::Go::SimpleBoard object.

Gtk2::GoBoard::play_sound "name"

Play the sound with the give name. Currently supported names are:

   alarm connect gamestart info move outoftime pass resign ring warning

If the Audio::Play module cannot be loaded, the function will silently fail. If an unsupported sound name is used, the function might croak or might silently fail.

This function forks a sound-server to play the sound(s) on first use.


This program should get you started. It creates a board with some markings, enables a cursor callback that shows a transparent black stone, and after a click, marks the position with a circle and disables the cursor.

   use Gtk2 -init;
   use Games::Go::SimpleBoard;
   use Gtk2::GoBoard;

   my $game = new Games::Go::SimpleBoard 9;

   # show off some markings
   $game->{board}[0][0] = MARK_B;
   $game->{board}[1][1] = MARK_GRAY_B | MARK_SMALL_W;
   $game->{board}[2][2] = MARK_W | MARK_TRIANGLE;
   $game->{board}[1][2] = MARK_B | MARK_LABEL;
   $game->{label}[1][2] = "198";
   $game->{board}[0][2] = MARK_W | MARK_LABEL;
   $game->{label}[0][2] = "AWA";

   # create a spot where black cannot put a stone
   $game->{board}[17][0] = MARK_W;
   $game->{board}[17][1] = MARK_W;
   $game->{board}[18][1] = MARK_W;

   my $board = new Gtk2::GoBoard;
   $board->set_board ($game);

   Gtk2::GoBoard::play_sound "gamestart"; # ping

   # enable cursor for black, till click
   $board->set (cursor => sub {
      my ($mark, $x, $y) = @_;

      $mark |= MARK_GRAYED | MARK_B
         if $game->is_valid_move (COLOUR_BLACK, $x, $y);


   # on press, set a mark and disable cursor
   $board->signal_connect (button_release => sub {
      my ($board, $button, $x, $y) = @_;

      $game->{board}[$x][$y] |= MARK_CIRCLE;
      $board->set_board ($game); # force update

      Gtk2::GoBoard::play_sound "move"; # play click sound

      $board->set (cursor => undef); # disable cursor

   my $w = new Gtk2::Window "toplevel";
   $w->set_default_size (450, 450);
   $w->add ($board);

   main Gtk2;


Marc Lehmann <>


App::IGS, Games::Go::SimpleBoard, AnyEvent::IGS, KGS.