void
um_language_dialog_set_user (UmLanguageDialog *um,
                             UmUser           *user)
{
        GdkPixbuf *pixbuf;
        const gchar *name;

        if (um->user) {
                g_object_unref (um->user);
                um->user = NULL;
        }
        if (um->language) {
                g_free (um->language);
                um->language = NULL;
        }
        um->force_setting = FALSE;

        um->user = user;
        if (um->user) {
                const gchar *language;

                g_object_ref (user);

                pixbuf = um_user_render_icon (user, FALSE, 48);
                gtk_image_set_from_pixbuf (GTK_IMAGE (um->user_icon), pixbuf);
                g_object_unref (pixbuf);

                name = um_user_get_real_name (user);
                gtk_label_set_label (GTK_LABEL (um->user_name), name);

                um_add_user_languages (um->dialog_combo);

                language = um_user_get_language (user);
                if (language) {
                        select_language (um, language);
                } else if (um_user_get_uid (user) == getuid ()) {
                        const char *locale;
                        char *lang;

                        locale = (const char *) setlocale(LC_MESSAGES, NULL);
                        lang = gdm_normalize_language_name (locale);

                        select_language (um, lang);
                        g_free (lang);
                        um->force_setting = TRUE;
                }
        }
}
Example #2
0
void DsoFinder::init_ui_options()
{
    //SET OPTION UI
    ui->ontopcheckbox->setChecked(config.ontop);
    ui->waittime_slider->setSliderPosition(config.waittime);
    ui->waittime_lineEdit->setText(QString("%1").arg(config.waittime));
    ui->searchtimercheckBox->setChecked(config.show_searchtimer);
    ui->colorstandardpushButton->setStyleSheet(QString("border-radius: 10px; background-color: rgb(%1, %2, %3);").arg(config.items_standard_color.red()).arg(config.items_standard_color.green()).arg(config.items_standard_color.blue()));
    ui->coloreventpushButton->setStyleSheet(QString("border-radius: 10px; background-color: rgb(%1, %2, %3);").arg(config.items_event_color.red()).arg(config.items_event_color.green()).arg(config.items_event_color.blue()));

    ui->itembasiccheckBox->setChecked(config.useitems_basic);
    ui->itemadventurecheckBox->setChecked(config.useitems_adventure);

    ui->halfsizecheckbox->setChecked(config.usehalfsize);

    populate_event_combo();

    ui->languagecomboBox->setCurrentText(config.language);
    select_language(config.language);
// ui->bgcomboBox->view()->setMinimumWidth(150)      ( not supported with QT 5.11.+)
    ui->bgcomboBox->setMinimumWidth(150);
    for(int i=0;i<bg_count;i++) {
        ui->bgcomboBox->addItem(QString("%1: %2").arg(i+1).arg(config.bg_caption[i]));
    }
    ui->bgcomboBox->addItem(tr("+: New Slot"));
    ui->bgcomboBox->setCurrentIndex(config.use_bg);
    if(config.use_bg >= bg_count) activate_buttons(false);
    else activate_buttons(true);

    ui->jumpcheckBox->setChecked(config.jump_position);
    ui->staybigcheckBox->setChecked(config.stay_big);
    if(config.stay_big) ui->waittimegroupbox->setDisabled(true);
}
Example #3
0
int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int argc = __argc;
    char **argv = __argv;
#else
int main(int argc, char *argv[])
{
#endif
    int seed = time(NULL);
    bool verifyexit = false;
    bool check_mods = false;
    std::string dump;
    dump_mode dmode = dump_mode::TSV;
    std::vector<std::string> opts;
    std::string world; /** if set try to load first save in this world on startup */

    // Set default file paths
#ifdef PREFIX
#define Q(STR) #STR
#define QUOTE(STR) Q(STR)
    PATH_INFO::init_base_path(std::string(QUOTE(PREFIX)));
#else
    PATH_INFO::init_base_path("");
#endif

#if (defined USE_HOME_DIR || defined USE_XDG_DIR)
    PATH_INFO::init_user_dir();
#else
    PATH_INFO::init_user_dir("./");
#endif
    PATH_INFO::set_standard_filenames();

    MAP_SHARING::setDefaults();
    {
        const char *section_default = nullptr;
        const char *section_map_sharing = "Map sharing";
        const char *section_user_directory = "User directories";
        const std::array<arg_handler, 12> first_pass_arguments = {{
            {
                "--seed", "<string of letters and or numbers>",
                "Sets the random number generator's seed value",
                section_default,
                [&seed](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    const unsigned char *hash_input = (const unsigned char *) params[0];
                    seed = djb2_hash(hash_input);
                    return 1;
                }
            },
            {
                "--jsonverify", nullptr,
                "Checks the cdda json files",
                section_default,
                [&verifyexit](int, const char **) -> int {
                    verifyexit = true;
                    return 0;
                }
            },
            {
                "--check-mods", "[mods...]",
                "Checks the json files belonging to cdda mods",
                section_default,
                [&check_mods,&opts]( int n, const char *params[] ) -> int {
                    check_mods = true;
                    test_mode = true;
                    for( int i = 0; i < n; ++i ) {
                        opts.emplace_back( params[ i ] );
                    }
                    return 0;
                }
            },
            {
                "--dump-stats", "<what> [mode = TSV] [opts...]",
                "Dumps item stats",
                section_default,
                [&dump,&dmode,&opts](int n, const char *params[]) -> int {
                    if( n < 1 ) {
                        return -1;
                    }
                    test_mode = true;
                    dump = params[ 0 ];
                    for( int i = 2; i < n; ++i ) {
                        opts.emplace_back( params[ i ] );
                    }
                    if( n >= 2 ) {
                        if( !strcmp( params[ 1 ], "TSV" ) ) {
                            dmode = dump_mode::TSV;
                            return 0;
                        } else if( !strcmp( params[ 1 ], "HTML" ) ) {
                            dmode = dump_mode::HTML;
                            return 0;
                        } else {
                            return -1;
                        }
                    }
                    return 0;
                }
            },
            {
                "--world", "<name>",
                "Load world",
                section_default,
                [&world](int n, const char *params[]) -> int {
                    if( n < 1 ) {
                        return -1;
                    }
                    world = params[0];
                    return 1;
                }
            },
            {
                "--basepath", "<path>",
                "Base path for all game data subdirectories",
                section_default,
                [](int num_args, const char **params) {
                    if (num_args < 1) return -1;
                    PATH_INFO::init_base_path(params[0]);
                    PATH_INFO::set_standard_filenames();
                    return 1;
                }
            },
            {
                "--shared", nullptr,
                "Activates the map-sharing mode",
                section_map_sharing,
                [](int, const char **) -> int {
                    MAP_SHARING::setSharing(true);
                    MAP_SHARING::setCompetitive(true);
                    MAP_SHARING::setWorldmenu(false);
                    return 0;
                }
            },
            {
                "--username", "<name>",
                "Instructs map-sharing code to use this name for your character.",
                section_map_sharing,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    MAP_SHARING::setUsername(params[0]);
                    return 1;
                }
            },
            {
                "--addadmin", "<username>",
                "Instructs map-sharing code to use this name for your character and give you "
                    "access to the cheat functions.",
                section_map_sharing,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    MAP_SHARING::addAdmin(params[0]);
                    return 1;
                }
            },
            {
                "--adddebugger", "<username>",
                "Informs map-sharing code that you're running inside a debugger",
                section_map_sharing,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    MAP_SHARING::addDebugger(params[0]);
                    return 1;
                }
            },
            {
                "--competitive", nullptr,
                "Instructs map-sharing code to disable access to the in-game cheat functions",
                section_map_sharing,
                [](int, const char **) -> int {
                    MAP_SHARING::setCompetitive(true);
                    return 0;
                }
            },
            {
                "--userdir", "<path>",
                "Base path for user-overrides to files from the ./data directory and named below",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::init_user_dir(params[0]);
                    PATH_INFO::set_standard_filenames();
                    return 1;
                }
            }
        }};

        // The following arguments are dependent on one or more of the previous flags and are run
        // in a second pass.
        const std::array<arg_handler, 9> second_pass_arguments = {{
            {
                "--worldmenu", nullptr,
                "Enables the world menu in the map-sharing code",
                section_map_sharing,
                [](int, const char **) -> int {
                    MAP_SHARING::setWorldmenu(true);
                    return true;
                }
            },
            {
                "--datadir", "<directory name>",
                "Sub directory from which game data is loaded",
                nullptr,
                [](int num_args, const char **params) -> int {
                      if (num_args < 1) return -1;
                      PATH_INFO::update_pathname("datadir", params[0]);
                      PATH_INFO::update_datadir();
                      return 1;
                }
            },
            {
                "--savedir", "<directory name>",
                "Subdirectory for game saves",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("savedir", params[0]);
                    return 1;
                }
            },
            {
                "--configdir", "<directory name>",
                "Subdirectory for game configuration",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("config_dir", params[0]);
                    PATH_INFO::update_config_dir();
                    return 1;
                }
            },
            {
                "--memorialdir", "<directory name>",
                "Subdirectory for memorials",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("memorialdir", params[0]);
                    return 1;
                }
            },
            {
                "--optionfile", "<filename>",
                "Name of the options file within the configdir",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("options", params[0]);
                    return 1;
                }
            },
            {
                "--keymapfile", "<filename>",
                "Name of the keymap file within the configdir",
                section_user_directory,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("keymap", params[0]);
                    return 1;
                }
            },
            {
                "--autopickupfile", "<filename>",
                "Name of the autopickup options file within the configdir",
                nullptr,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("autopickup", params[0]);
                    return 1;
                }
            },
            {
                "--motdfile", "<filename>",
                "Name of the message of the day file within the motd directory",
                nullptr,
                [](int num_args, const char **params) -> int {
                    if (num_args < 1) return -1;
                    PATH_INFO::update_pathname("motd", params[0]);
                    return 1;
                }
            },
        }};

        // Process CLI arguments.
        const size_t num_first_pass_arguments =
            sizeof(first_pass_arguments) / sizeof(first_pass_arguments[0]);
        const size_t num_second_pass_arguments =
            sizeof(second_pass_arguments) / sizeof(second_pass_arguments[0]);
        int saved_argc = --argc; // skip program name
        const char **saved_argv = (const char **)++argv;
        while (argc) {
            if(!strcmp(argv[0], "--help")) {
                printHelpMessage(first_pass_arguments.data(), num_first_pass_arguments,
                    second_pass_arguments.data(), num_second_pass_arguments);
                return 0;
            } else {
                bool arg_handled = false;
                for (size_t i = 0; i < num_first_pass_arguments; ++i) {
                    auto &arg_handler = first_pass_arguments[i];
                    if (!strcmp(argv[0], arg_handler.flag)) {
                        argc--;
                        argv++;
                        int args_consumed = arg_handler.handler(argc, (const char **)argv);
                        if (args_consumed < 0) {
                            printf("Failed parsing parameter '%s'\n", *(argv - 1));
                            exit(1);
                        }
                        argc -= args_consumed;
                        argv += args_consumed;
                        arg_handled = true;
                        break;
                    }
                }
                // Skip other options.
                if (!arg_handled) {
                    --argc;
                    ++argv;
                }
            }
        }
        while (saved_argc) {
            bool arg_handled = false;
            for (size_t i = 0; i < num_second_pass_arguments; ++i) {
                auto &arg_handler = second_pass_arguments[i];
                if (!strcmp(saved_argv[0], arg_handler.flag)) {
                    --saved_argc;
                    ++saved_argv;
                    int args_consumed = arg_handler.handler(saved_argc, saved_argv);
                    if (args_consumed < 0) {
                        printf("Failed parsing parameter '%s'\n", *(argv - 1));
                        exit(1);
                    }
                    saved_argc -= args_consumed;
                    saved_argv += args_consumed;
                    arg_handled = true;
                    break;
                }
            }
            // Ingore unknown options.
            if (!arg_handled) {
                --saved_argc;
                ++saved_argv;
            }
        }
    }

    if (!assure_dir_exist(FILENAMES["user_dir"].c_str())) {
        printf("Can't open or create %s. Check permissions.\n",
               FILENAMES["user_dir"].c_str());
        exit(1);
    }

    setupDebug();

/**
 * OS X does not populate locale env vars correctly (they usually default to
 * "C") so don't bother trying to set the locale based on them.
 */
#if (!defined MACOSX)
    if (setlocale(LC_ALL, "") == NULL) {
        DebugLog(D_WARNING, D_MAIN) << "Error while setlocale(LC_ALL, '').";
    } else {
#endif
        try {
            std::locale::global( std::locale( "" ) );
        } catch( const std::exception& ) {
            // if user default locale retrieval isn't implemented by system
            try{
                // default to basic C locale
                std::locale::global( std::locale::classic() );
            } catch( const std::exception &err ) {
                debugmsg( "%s", err.what() );
                exit_handler(-999);
            }
        }
#if (!defined MACOSX)
    }
#endif

    get_options().init();
    get_options().load();
    set_language();

    // in test mode don't initialize curses to avoid escape sequences being inserted into output stream
    if( !test_mode ) {
        try {
			catacurses::init_interface();
        } catch( const std::exception &err ) {
            // can't use any curses function as it has not been initialized
            std::cerr << "Error while initializing the interface: " << err.what() << std::endl;
            DebugLog( D_ERROR, DC_ALL ) << "Error while initializing the interface: " << err.what() << "\n";
            return 1;
        }
    }

    srand(seed);

    g = new game;
    // First load and initialize everything that does not
    // depend on the mods.
    try {
        g->load_static_data();
        if (verifyexit) {
            exit_handler(0);
        }
        if( !dump.empty() ) {
            init_colors();
            exit( g->dump_stats( dump, dmode, opts ) ? 0 : 1 );
        }
        if( check_mods ) {
            init_colors();
            loading_ui ui( false );
            exit( g->check_mod_data( opts, ui ) && !test_dirty ? 0 : 1 );
        }
    } catch( const std::exception &err ) {
        debugmsg( "%s", err.what() );
        exit_handler(-999);
    }

    // Now we do the actual game.

    g->init_ui();

    curs_set(0); // Invisible cursor here, because MAPBUFFER.load() is crash-prone

#if (!(defined _WIN32 || defined WINDOWS))
    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = exit_handler;
    sigemptyset(&sigIntHandler.sa_mask);
    sigIntHandler.sa_flags = 0;
    sigaction(SIGINT, &sigIntHandler, NULL);
#endif

#ifdef LOCALIZE
    std::string lang = "";
#if (defined _WIN32 || defined WINDOWS)
    lang = getLangFromLCID( GetUserDefaultLCID() );
#else
    const char *v = setlocale( LC_ALL, NULL );
    if( v != NULL ) {
        lang = v;

        if( lang == "C" ) {
            lang = "en";
        }
    }
#endif
    if( get_option<std::string>( "USE_LANG" ).empty() && ( lang.empty() || !isValidLanguage( lang ) ) ) {
        select_language();
        set_language();
    }
#endif

    while( true ) {
        if( !world.empty() ) {
            if( !g->load( world ) ) {
                break;
            }
            world.clear(); // ensure quit returns to opening screen

        } else {
            main_menu menu;
            if( !menu.opening_screen() ) {
                break;
            }
        }

        while( !g->do_turn() );
    };


    exit_handler(-999);
    return 0;
}
Example #4
0
/*
 * React to the "select" event for the specified node
 *
 * node     The node
 */
void wii_menu_handle_select_node( TREENODE *node )
{
  char buff[WII_MAX_PATH];

  Emulator* emu = emuRegistry.getCurrentEmulator();
  if( emu != NULL )
  { 
    emu->getMenuManager().selectNode( node );
  }

  if( node->node_type == NODETYPE_ROM ||
      node->node_type == NODETYPE_RESUME ||
      node->node_type == NODETYPE_LOAD_STATE ||
      node->node_type == NODETYPE_RESET )
  {   
    // Essentially blanks the screen
    //wii_gx_push_callback( NULL, FALSE, NULL );

    switch( node->node_type )
    {
      case NODETYPE_LOAD_STATE:
        wii_start_snapshot();
        break;
      case NODETYPE_ROM:            
        snprintf( 
          buff, sizeof(buff), "%s%s", wii_get_roms_dir(), node->name ); 
        last_rom_index = wii_menu_get_current_index();
        loading_game = TRUE;
        wii_start_emulation( buff, "", false, false );
        loading_game = FALSE;
        break;
      case NODETYPE_RESUME:
        wii_resume_emulation();
        break;
      case NODETYPE_RESET:
        wii_reset_emulation();
        break;
      default:
        /* do nothing */
        break;
    }

    //wii_gx_pop_callback();
  }
  else
  {
    LOCK_RENDER_MUTEX();

    switch( node->node_type )
    {
      case NODETYPE_VOLUME:
        wii_volume += 10;
        if( wii_volume > 150 )
        {
          wii_volume = 0;
        }
        break;
      case NODETYPE_SAVE_STATE:
        wii_save_snapshot( NULL, TRUE );
        break;
      case NODETYPE_CARTRIDGE_SAVE_STATES_SLOT:
        wii_snapshot_next();
        break;
      case NODETYPE_SELECT_LANG:
        language_index++;
        if( language_index >= language_menu->child_count )
        {
          language_index = 0;
        }
        select_language();
        break;
      case NODETYPE_DOUBLE_STRIKE:
        wii_double_strike_mode ^= 1;
        break;
      case NODETYPE_FULL_WIDESCREEN:
        wii_full_widescreen++;
        if( wii_full_widescreen > WS_AUTO )
        {
          wii_full_widescreen = 0;
        }
        break;
      case NODETYPE_16_9_CORRECTION:
        wii_16_9_correction ^= 1;
        break;
      case NODETYPE_GX_VI_SCALER:
        wii_gx_vi_scaler ^= 1;
        break;
      case NODETYPE_AUTO_LOAD_SAVE:
        wii_auto_load_save_state ^= 1;
        break;
      case NODETYPE_TOP_MENU_EXIT:
        wii_top_menu_exit ^= 1;
        break;
      case NODETYPE_CHEATS:
        wii_cheats ^= 1;
        break;
      case NODETYPE_REWIND:
        wii_rewind ^= 1;
        if( wii_rewind )
        {
          wii_set_status_message( 
            "Note: Enabling rewind may affect performance." );
        }
        break;
      case NODETYPE_REWIND_BUTTON:
        wii_rewind_add_buttons ^= 1;
        break;
      case NODETYPE_WIIMOTE_MENU_ORIENT:
        wii_mote_menu_vertical ^= 1;
        break;
      case NODETYPE_DEBUG_MODE:
        wii_debug ^= 1;
        break;
      case NODETYPE_TRAP_FILTER:
        wii_trap_filter ^= 1;
        break;
      case NODETYPE_FILTER:
        wii_filter ^= 1;
        break;
      case NODETYPE_ROOT_DRIVE:
      case NODETYPE_UPDIR:
      case NODETYPE_DIR:
        if( node->node_type == NODETYPE_ROOT_DRIVE )
        {
          char path[WII_MAX_PATH];
          snprintf( path, sizeof(path), "%s/", node->name );
          wii_set_roms_dir( path );
          mount_pending = TRUE;
        }
        else if( node->node_type == NODETYPE_UPDIR )
        {
          const char* romsDir = wii_get_roms_dir();
          int len = strlen( romsDir );
          if( len > 1 && romsDir[len-1] == '/' )
          {
            char dirpart[WII_MAX_PATH] = "";
            char filepart[WII_MAX_PATH] = "";
            Util_splitpath( romsDir, dirpart, filepart );
            len = strlen(dirpart);
            if( len > 0 )
            {
              dirpart[len] = '/';
              dirpart[len+1] = '\0';
            }
            wii_set_roms_dir( dirpart );
          }
        }
        else
        {
          char newDir[WII_MAX_PATH];
          snprintf( newDir, sizeof(newDir), "%s%s/", 
            wii_get_roms_dir(), node->name );
          wii_set_roms_dir( newDir );
        }
        games_read = FALSE;
        last_rom_index = 1;
        break;
      case NODETYPE_ADVANCED:
      case NODETYPE_VIDEO_SETTINGS:
      case NODETYPE_CARTRIDGE_SAVE_STATES:
      case NODETYPE_LOAD_ROM:               
        wii_menu_push( node );
        if( node->node_type == NODETYPE_LOAD_ROM )
        {
          if( games_read )
          {
            wii_menu_move( node, last_rom_index );  
          }
        }
        else if( node->node_type == NODETYPE_CARTRIDGE_SAVE_STATES )
        {
          // Initialize the "current" value prior to displaying
          // the menu...
          BOOL foo;
          wii_snapshot_current( &foo );
        }          
        break;
      case NODETYPE_CARTRIDGE_SETTINGS_CURRENT:
        {
          Emulator* emu = emuRegistry.getCurrentEmulator();
          if( emu != NULL )
          {
            TREENODE* menu = 
              emu->getMenuManager().getCartridgeSettingsMenu();

            if( menu != NULL )
            {
              wii_menu_push( menu );
            }
          }
        }
        break;
      case NODETYPE_EMULATOR_SETTINGS:
        {
          Emulator* emu = emuRegistry.getCurrentEmulator();
          if( emu != NULL )
          {
            TREENODE* menu = emu->getMenuManager().getEmulatorMenu();
            if( menu != NULL )
            {
              wii_menu_push( menu );
            }
          }
        }
        break;
      default:
        /* do nothing */
        break;
    }

    UNLOCK_RENDER_MUTEX();
  }
}
Example #5
0
/*
 * Initializes the menu
 */
void wii_mednafen_menu_init()
{ 
  TREENODE* child = NULL;

  // 
  // Languages menu
  //

  language_menu = wii_create_tree_node( NODETYPE_LANG, "languages" );  
  child = wii_create_tree_node( NODETYPE_LANG_DEFAULT, "English" );
  wii_add_child( language_menu, child );  
  read_lang_list( language_menu );

  // Sync the language with the menu index
  for( int i = 0; i < language_menu->child_count; i++ )
  {
    TREENODE* node = language_menu->children[i];
    if( node->node_type == NODETYPE_LANG_DEFAULT )
    {
      // Set the default index
      language_index = i;
    }
    else if( !strcmp( node->name, wii_language ) )
    {
      // Found the language.. exit the loop
      language_index = i; 
      break;
    }
  }

  select_language(); // Load the selected language  

  //
  // The root menu
  //

  wii_menu_root = wii_create_tree_node( NODETYPE_ROOT, "root" );  

  child = wii_create_tree_node( NODETYPE_RESUME, "Resume" );
  wii_add_child( wii_menu_root, child );
  
  child = wii_create_tree_node( NODETYPE_RESET, "Reset" );
  wii_add_child( wii_menu_root, child );

  child = wii_create_tree_node( NODETYPE_LOAD_ROM, "Load game" );
  roms_menu = child;
  wii_add_child( wii_menu_root, child );

  //
  // Save state management
  //

  child = wii_create_tree_node( NODETYPE_CARTRIDGE_SETTINGS_CURRENT_SPACER, "" );
  wii_add_child( wii_menu_root, child );
  
  TREENODE* states = wii_create_tree_node( 
    NODETYPE_CARTRIDGE_SAVE_STATES, "Save states" );
  wii_add_child( wii_menu_root, states );

  child = wii_create_tree_node( 
    NODETYPE_CARTRIDGE_SAVE_STATES_SLOT, "Slot" );
  wii_add_child( states, child );

  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( states, child );

  child = wii_create_tree_node( NODETYPE_SAVE_STATE, "Save state" );
  wii_add_child( states, child );

  child = wii_create_tree_node( NODETYPE_LOAD_STATE, "Load state" );
  wii_add_child( states, child );

  TREENODE *cart_settings = wii_create_tree_node( 
    NODETYPE_CARTRIDGE_SETTINGS_CURRENT, "Game-specific settings" );
  wii_add_child( wii_menu_root, cart_settings );    

  child = wii_create_tree_node( NODETYPE_EMULATOR_SETTINGS_SPACER, "" );
  wii_add_child( wii_menu_root, child );

  TREENODE *emulator_settings = wii_create_tree_node( 
    NODETYPE_EMULATOR_SETTINGS, "Emulator settings" );                                                        
  wii_add_child( wii_menu_root, emulator_settings );

  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( wii_menu_root, child );

  //
  // The advanced menu
  //

  TREENODE *advanced = wii_create_tree_node( NODETYPE_ADVANCED, 
    "Advanced" );
  wii_add_child( wii_menu_root, advanced );    

  TREENODE *video_settings = wii_create_tree_node( 
    NODETYPE_VIDEO_SETTINGS, "Video settings" );                                                        
  wii_add_child( advanced, video_settings );

  child = wii_create_tree_node( NODETYPE_FULL_WIDESCREEN, 
    "Full widescreen" );
  wii_add_child( video_settings, child );
  child = wii_create_tree_node( NODETYPE_16_9_CORRECTION, 
    "16:9 correction" );
  wii_add_child( video_settings, child );  

#if 0
  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( video_settings, child );
#endif

  child = wii_create_tree_node( NODETYPE_DOUBLE_STRIKE, 
    "Double strike (240p)" );
  wii_add_child( video_settings, child );

#if 0
  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( video_settings, child );
#endif

  child = wii_create_tree_node( NODETYPE_FILTER, 
    "Bilinear filter" );
  wii_add_child( video_settings, child );

  child = wii_create_tree_node( NODETYPE_TRAP_FILTER, 
    "Color trap filter" );
  wii_add_child( video_settings, child );

#if 0
  child = wii_create_tree_node( NODETYPE_GX_VI_SCALER_SPACER, "" );
  wii_add_child( video_settings, child );
#endif

  child = wii_create_tree_node( NODETYPE_GX_VI_SCALER, "Scaler" );
  wii_add_child( video_settings, child );

  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_VOLUME, "Volume" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_REWIND, "Rewind" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_REWIND_BUTTON, "Rewind buttons" );
  wii_add_child( advanced, child );

#if 0
  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( advanced, child );
#endif

  child = wii_create_tree_node( NODETYPE_CHEATS, "Cheats" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_SELECT_LANG, "Language" );
  wii_add_child( advanced, child );  

#if 0
  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( advanced, child );
#endif

  child = wii_create_tree_node( NODETYPE_TOP_MENU_EXIT, 
    "Top menu exit" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_WIIMOTE_MENU_ORIENT, 
    "Wiimote (menu)" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_SPACER, "" );
  wii_add_child( advanced, child );

  child = wii_create_tree_node( NODETYPE_DEBUG_MODE, 
    "Debug mode" );
  wii_add_child( advanced, child );

  wii_menu_push( wii_menu_root );	
}