Example #1
0
/* tries opening a file in a temporary win structure, and displays errors if unable */
int
board_load_popup (window_board_t *win, int append, char *filename)
{
	int i;
	int ret = 0;
	window_board_t *win1 = calloc (1, sizeof (window_board_t));

	if (board_load (win1, filename)) {
		if (append) {
			int n = win->n_boards;
			for (i = 0; i < win1->n_boards; i++)
				board_window_append_board (win, win1->boards[i]);
			if (win->n_boards > n) /* set to first new board */
				win->cur = n;
		} else {
			MOVE_PTR (win->filename, win1->filename);
			MOVE_PTR (win->title, win1->title);
			MOVE_PTR (win->subtitle, win1->subtitle);
			MOVE_PTR (win->team1, win1->team1);
			MOVE_PTR (win->team2, win1->team2);

			for (i = 0; i < win->n_boards; i++)
				if (win->boards[i])
					board_free (win->boards[i]);
			win->boards = win1->boards;
			win->n_boards = win1->n_boards;
			win->n_boards_alloc = win1->n_boards_alloc;
			win->cur = 0;
		}

		card_window_update(win->boards[win->cur]->dealt_cards);
		show_board(win->boards[win->cur], REDRAW_FULL);
		recently_used_add (filename);

		ret = 1;
	} else {
		GtkWidget *error = gtk_message_dialog_new (GTK_WINDOW (win->window),
				GTK_DIALOG_DESTROY_WITH_PARENT,
				GTK_MESSAGE_ERROR,
				GTK_BUTTONS_CLOSE,
				_("Error loading file '%s': %s"),
				filename, g_strerror (errno));
		gtk_dialog_run (GTK_DIALOG (error));
		gtk_widget_destroy (error);
	}

	TRY_FREE (win1->filename);
	TRY_FREE (win1->title);
	TRY_FREE (win1->subtitle);
	TRY_FREE (win1->team1);
	TRY_FREE (win1->team2);
	free (win1);

	return ret;
}
Example #2
0
/* gets called for target widget */
static void
card_drag_drop (HandDisplay *handdisp, int card, int on_card, int *to_seat)
{
	PROTECT_BEGIN;
	board *b = CUR_BOARD;
	printf("Dropped: %s on seat %c.\n", card_string(card), "WNES"[*to_seat - 1]);
	if (on_card >= 0)
		printf("Dropped on: %s.\n", card_string(on_card));

	if (b->dealt_cards[card] && b->dealt_cards[card] == *to_seat) /* card didn't move */
		PROTECT_RETURN;

	if (b->dealt_cards[card] && !b->cards[card]) {
		board_statusbar(_("Card is in play and cannot be moved"));
		PROTECT_RETURN;
	}

	seat from_seat = b->dealt_cards[card];
	if (on_card >= 0) { /* exchange 2 cards */
		if (b->dealt_cards[on_card] && !b->cards[on_card]) {
			board_statusbar(_("Card is in play and cannot be exchanged"));
			PROTECT_RETURN;
		}

		remove_card(b, *to_seat, on_card);
		if (from_seat) {
			remove_card(b, from_seat, card);
			add_card(b, from_seat, on_card);
		}
		add_card(b, *to_seat, card);
	} else { /* move single card */
		if (b->hand_cards[*to_seat-1] == 13) {
			board_statusbar(_("Hand has already 13 cards"));
			PROTECT_RETURN;
		}

		if (from_seat)
			remove_card(b, from_seat, card);
		add_card(b, *to_seat, card);
	}
	b->par_score = -1;
	invalidate_dd_scores (b);

	board_statusbar(NULL);
	card_window_update(b->dealt_cards);
	show_board(b, REDRAW_HANDS | REDRAW_PAR);
	PROTECT_END;
}
Example #3
0
int
main (int argc, char *argv[])
{
#ifdef ENABLE_NLS
  bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
  textdomain (GETTEXT_PACKAGE);
#endif

  gtk_set_locale ();
  gtk_init (&argc, &argv);

  init_solve();
  srand(time(NULL));

  win = malloc(sizeof(window_board_t));
  char *xml_file = NULL;

  int i;
  for (i = 0; i < sizeof (xml_files); i++) {
	  struct stat buf;
	  if (stat (xml_files[i], &buf) != -1) {
		  xml_file = xml_files[i];
		  g_debug ("Using interface file %s\n", xml_file);
		  break;
	  }
  }
  if (! xml_file) {
	  fprintf (stderr, _("Could not find interface definition file: %s\n"), "tenace.ui");
	  exit (1);
  }

  GError *error = NULL;
  win->builder = gtk_builder_new ();
  if (! gtk_builder_add_from_file (win->builder, xml_file, &error)) {
	  g_warning (_("Could not load builder file: %s"), error->message);
	  g_error_free (error);
	  exit (1);
  }

  gtk_builder_connect_signals (win->builder, NULL);

  board_window_init (win);
  read_config (win);
  board_window_apply_style (win);

  if (argc > 1) {
	char *fname = argv[1];
	if (! g_path_is_absolute (argv[1])) {
		char *cwd = g_get_current_dir ();
		fname = g_build_filename (cwd, argv[1], NULL);
		g_free (cwd);
	}
	if (! board_load (win, fname)) {
		if (errno == EMEDIUMTYPE) {
			perror (fname);
			puts (_("Hint: tenace can only read files in .lin format"));
		} else
			perror (fname);
		exit (1);
	}
	recently_used_add (fname);
	if (! g_path_is_absolute (argv[1]))
		g_free (fname);
  } else {
	board_window_append_board (win, NULL);
	deal_random (win->boards[0]); /* show a random deal on startup */
  }

  show_board(win->boards[0], REDRAW_FULL);
  card_window_update(win->boards[0]->dealt_cards);

  gtk_main ();
  write_config (win);
  return 0;
}