static void sync_init_gtk(SyncStatus *status, gpointer parent) { char *id; char *caption; status->progresswin = progress_window_new(GTK_WINDOW(parent), _("Synchronizing Journal")); status->label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(status->label), 0, 0); status->stage = 0; show_status_stage(status); status->progress = gtk_progress_bar_new(); gtk_widget_show(status->label); gtk_widget_show(status->progress); progress_window_pack(PROGRESS_WINDOW(status->progresswin), status->label); progress_window_pack(PROGRESS_WINDOW(status->progresswin), status->progress); gtk_widget_show(status->progresswin); }
/* launch following the commandline prepared by play_game, playback_game and record_game then test if the game is launched, detect error and update game status */ void launch_emulation (MameRomEntry *rom, const gchar *options) { FILE *xmame_pipe; gchar line [BUFFER_SIZE]; gchar *p, *p2; gfloat done = 0; gint nb_loaded = 0; gint num_roms; GList *extra_output = NULL; gboolean error_rom, error_mame; /* Error with the load */ gboolean warning_rom; /* Warning with the load */ ProgressWindow *progress_window; #ifdef ENABLE_JOYSTICK gboolean usejoyingui; joystick_close (joydata); joydata = NULL; #endif g_object_get (rom, "num-roms", &num_roms, NULL); /* FIXME Progress of loading ROMs is not reported in newer versions of MAME (e.g. SDLMame), so there is no way of updating a progress window */ progress_window = progress_window_new (TRUE); progress_window_set_title (progress_window, _("Loading %s:"), mame_rom_entry_get_list_name (rom)); progress_window_show (progress_window); gtk_widget_hide (MainWindow); /* need to use printf otherwise, with GMAMEUI_DEBUG, we dont see the complete command line */ GMAMEUI_DEBUG ("Message: running command %s\n", options); xmame_pipe = popen (options, "r"); GMAMEUI_DEBUG (_("Loading %s:"), mame_rom_entry_get_gamename (rom)); /* Loading */ /* XMAME loads the ROM first and then prepares the display. We watch the pipe during the ROM loading until we reach "done.", which is XMAME's way of indicating the ROM has loaded. Errors with particular ROMs are not displayed until after "done.", which is why we have two clauses looking for NOT FOUND below */ /* The following are examples of output lines from MAME: sv02.bin NOT FOUND (SDLMAME) WARNING: the game might not run correctly. (SDLMAME) mcu.bin NOT FOUND (NO GOOD DUMP KNOWN) (XMAME) s92-23c NOT FOUND (XMAME) ERROR: required files are missing, the game cannot be run. SDL found mode:720x450x32 (XMAME - SDL) XMAME generates the following output which can be parsed: loading rom 0: epr11282.a4 loading rom 1: epr11280.a1 info: sysdep_mixer: using oss plugin OSD: Info: Ideal mode for this game = 384x225 SVGAlib: Info: Found videomode 640x400x32 svgalib: Failed to initialize mouse */ error_rom = error_mame = warning_rom = FALSE; while (fgets (line, BUFFER_SIZE, xmame_pipe)) { /* remove the last \n */ for (p = line; (*p && (*p != '\n')); p++); *p = '\0'; GMAMEUI_DEBUG ("xmame: %s", line); if (!strncmp (line,"loading", 7)) { /* Only works with XMAME */ /* xmame: loading rom 16: s92_18.bin */ nb_loaded++; /*search for the : */ for (p = line; (*p && (*p != ':')); p++); p = p + 2; for (p2 = p; (*p2 && (*p2 != '\n')); p2++); p2 = '\0'; done = (gfloat) (nb_loaded / num_roms); progress_window_set_value (progress_window, done); progress_window_set_text (progress_window, p); } else if (!g_ascii_strncasecmp (line, "Ignoring", 8)) { /* Ignore any errors starting with 'Ignoring' */ continue; } else if (g_str_has_suffix (line, "NOT FOUND")) { /* Catch errors relating to missing ROMs (SDLMAME catches them here) */ error_rom = TRUE; extra_output = g_list_append (extra_output, g_strdup (line)); } else if (g_str_has_suffix (line, "(NO GOOD DUMP KNOWN)")) { /* Catch errors relating to best available ROMs (SDLMAME catches them here) */ warning_rom = TRUE; } /* XMAME writes "done." to the command line once the ROMs have been loaded, but before they are checked and before the display is prepared. SDLMAME doesn't do this */ if (!strncmp (line, "done", 4)) break; while (gtk_events_pending ()) gtk_main_iteration (); } progress_window_destroy (progress_window); while (gtk_events_pending ()) gtk_main_iteration (); /* Parse the output and check for errors */ while (fgets (line, BUFFER_SIZE, xmame_pipe)) { for (p = line; (*p && (*p != '\n')); p++); *p = '\0'; GMAMEUI_DEBUG ("xmame: %s", line); if (!strncmp (line, "X Error", 7) || /* X11 mode not found*/ !strncmp (line, "GLERROR", 7) || /* OpenGL initialization errors */ !strncmp (line, "SDL: Unsupported", 16) || !strncmp (line, "Unable to start", 15) || !strncmp (line, "svgalib: ", 9)) /* XMAME SVGA */ { GMAMEUI_DEBUG (_("Error with MAME graphics creation: %s"), line); error_mame = TRUE; extra_output = g_list_append (extra_output, g_strdup (line)); } else if (g_str_has_suffix (line, "NOT FOUND")) { /* Catch errors relating to missing ROMs (XMAME catches them here) */ error_rom = TRUE; extra_output = g_list_append (extra_output, g_strdup (line)); } else if (g_str_has_suffix (line, "(NO GOOD DUMP KNOWN)")) { /* Catch errors relating to best available ROMs (XMAME catches them here) */ warning_rom = TRUE; } } extra_output = glist_remove_duplicates (extra_output); pclose (xmame_pipe); if (error_rom || error_mame) { /* There was an error during the load. Create a dialog to present the errors */ GtkWidget *dialog; gchar *title = NULL; gchar *secmessage = NULL; if (error_rom) { title = g_strdup (_("GMAMEUI could not load the ROM")); secmessage = g_strdup (_("The following ROMs were not found:\n")); } else if (error_mame) { title = g_strdup (_("MAME did not start successfully")); secmessage = g_strdup (_("The following errors were reported:\n")); } GMAMEUI_DEBUG ("error during load"); GList *node; for (node = g_list_first (extra_output); node; node = node->next) { secmessage = g_strconcat (secmessage, node->data, "\n", NULL); } dialog = gmameui_dialog_create (ERROR, NULL, title); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), secmessage); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); g_free (title); g_free (secmessage); } /* Update game information */ mame_rom_entry_rom_played (rom, warning_rom, error_rom); g_list_foreach (extra_output, (GFunc)g_free, NULL); g_list_free (extra_output); gtk_widget_show (MainWindow); /* Update the ROM with the times played or status if there was any error */ mame_gamelist_view_update_game_in_list (main_gui.displayed_list, rom); #ifdef ENABLE_JOYSTICK gchar *joystick_device; g_object_get (main_gui.gui_prefs, "usejoyingui", &usejoyingui, "joystick-name", &joystick_device, NULL); if (usejoyingui) joydata = joystick_new (joystick_device); g_free (joystick_device); #endif }