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