/* 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; }
/* 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; }
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; }