class Tictactoe : GtkVBox {

  class TTTButton : GtkToggleButton {
    Tictactoe owner;

    TTTButton new(owner) {
      Tictactoe owner;

      this.owner = owner;
      this.set_usize(20, 20);
      return this;
    }

    function void toggled() {
      owner.toggle;
    }
  }

  TTTButton buttons[int][int];

  Tictactoe new() {
    GtkTable table;
    TTTButton button;
    int i, j;

    table = new GtkTable(3, 3, TRUE);
    this.add(table);
    table.show;

    for (i = 0; i < 3; i = i + 1) {
      for (j = 0; j < 3; j = j + 1) {
	button = new TTTButton(this);
	table.attach_defaults(button, i, i + 1, j, j + 1);
	button.show;
	this.buttons[i][j] = button;
      }
    }

    return this;
  }

  function void clear() {
    int i, j;

    for (i = 0; i < 3; i = i + 1) {
      for (j = 0; j < 3; j = j + 1) {
	# gtk_signal_handler_block_by_data(this.buttons[i][j], ttt);
	buttons[i][j].active = FALSE;
	# gtk_signal_handler_unblock_by_data(this.buttons[i][j], ttt);
      }
    }
  }

  function void toggle() {
    put "Yay!";
    this.clear;
  }
}

class TTTWindow : GtkWindow {
  function void destroy() {
    exit;
  }
}

begin {
  TTTWindow win;
  Tictactoe ttt;

  win = new TTTWindow(GTK_WINDOW_TOPLEVEL, "Aspect Frame");
  win.border_width = 10;

  ttt = new Tictactoe;

  win.add(ttt);
  ttt.show;
  win.show;
}
