chore: many changes
This commit is contained in:
20
Source/OnDeviceConfig/include/config.hpp
Normal file
20
Source/OnDeviceConfig/include/config.hpp
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* HOC Configurator - Configuration Handler
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
class Config {
|
||||
public:
|
||||
std::string kipPath;
|
||||
bool autoSave;
|
||||
|
||||
Config();
|
||||
|
||||
bool loadConfig();
|
||||
bool saveConfig();
|
||||
bool checkKipExists();
|
||||
bool checkAtmosphereExists();
|
||||
};
|
||||
143
Source/OnDeviceConfig/include/constants.hpp
Normal file
143
Source/OnDeviceConfig/include/constants.hpp
Normal file
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* HOC Configurator - Constants
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
namespace Constants {
|
||||
// Application info
|
||||
constexpr const char* APP_VERSION = "2.0.0";
|
||||
constexpr const char* APP_NAME = "HOC Configurator";
|
||||
constexpr const char* APP_AUTHOR = "Dominatorul";
|
||||
|
||||
// Paths
|
||||
constexpr const char* DEFAULT_KIP_PATH = "sdmc:/atmosphere/kips/loader.kip";
|
||||
constexpr const char* CONFIG_DIR = "sdmc:/config/hoc-configurator";
|
||||
constexpr const char* CONFIG_FILE = "sdmc:/config/hoc-configurator/config.ini";
|
||||
constexpr const char* ATMOSPHERE_PATH = "sdmc:/atmosphere";
|
||||
constexpr const char* SYSTEM_SETTINGS_INI = "sdmc:/atmosphere/config/system_settings.ini";
|
||||
|
||||
// Frequency arrays (in kHz)
|
||||
constexpr uint32_t MARIKO_GPU_FREQS[] = {
|
||||
76800, 153600, 230400, 307200, 384000, 460800, 537600, 614400,
|
||||
691200, 768000, 844800, 921600, 998400, 1075200, 1152000, 1228800,
|
||||
1267200, 1305600, 1344000, 1382400, 1420800, 1459200, 1497600, 1536000
|
||||
};
|
||||
|
||||
constexpr uint32_t ERISTA_GPU_FREQS[] = {
|
||||
76800, 153600, 230400, 307200, 384000, 460800, 537600, 614400,
|
||||
691200, 768000, 844800, 921600, 998400, 1075200
|
||||
};
|
||||
|
||||
constexpr uint32_t CPU_FREQS[] = {
|
||||
1020000, 1122000, 1224000, 1326000, 1428000, 1581000, 1683000,
|
||||
1785000, 1887000, 1963500, 2091000, 2193000, 2295000, 2397000,
|
||||
2499000, 2601000, 2703000, 2805000, 2907000
|
||||
};
|
||||
|
||||
constexpr uint32_t RAM_FREQS[] = {
|
||||
0, 1600000, 1633000, 1666000, 1700000, 1733000, 1766000, 1800000,
|
||||
1833000, 1866000, 1900000, 1933000, 1966000, 2000000, 2033000, 2066000,
|
||||
2100000, 2133000, 2166000, 2200000, 2233000, 2266000, 2300000
|
||||
};
|
||||
|
||||
// Voltage ranges
|
||||
constexpr uint32_t MARIKO_GPU_MIN_VOLT = 480;
|
||||
constexpr uint32_t MARIKO_GPU_MAX_VOLT = 960;
|
||||
constexpr uint32_t MARIKO_GPU_MAX_VMIN = 700;
|
||||
|
||||
constexpr uint32_t ERISTA_GPU_MIN_VOLT = 700;
|
||||
constexpr uint32_t ERISTA_GPU_MAX_VOLT = 1000;
|
||||
constexpr uint32_t ERISTA_GPU_MAX_VMIN = 850;
|
||||
|
||||
constexpr uint32_t MARIKO_CPU_MIN_VMIN = 700;
|
||||
constexpr uint32_t MARIKO_CPU_MAX_VMIN = 750;
|
||||
|
||||
constexpr uint32_t VOLTAGE_STEP = 5;
|
||||
constexpr uint32_t GPU_OFFSET_MAX = 50;
|
||||
|
||||
// Thresholds
|
||||
constexpr uint32_t MARIKO_MEME_THRESHOLD = 1536000;
|
||||
constexpr uint32_t MARIKO_DANGEROUS_GPU_THRESHOLD = 1382400;
|
||||
constexpr uint32_t MARIKO_UNSAFE_GPU_THRESHOLD = 1152000;
|
||||
|
||||
constexpr uint32_t ERISTA_DANGEROUS_GPU_THRESHOLD = 1151000;
|
||||
constexpr uint32_t ERISTA_UNSAFE_GPU_THRESHOLD = 922000;
|
||||
|
||||
// RAM Types
|
||||
const std::string RAM_TYPES[] = {
|
||||
"Samsung AA-MGCL/MGCR",
|
||||
"SK Hynix NEI/NEE/x267",
|
||||
"Micron WT:B",
|
||||
"Micron AUT:B",
|
||||
"Micron WT:F",
|
||||
"Samsung AM-MGCJ",
|
||||
"Micron WT:E",
|
||||
"Samsung AB-MGCL",
|
||||
"SK Hynix NME",
|
||||
"Samsung HB-MGCH"
|
||||
};
|
||||
|
||||
// Fan curve profiles
|
||||
namespace FanProfiles {
|
||||
constexpr const char* V1_ERISTA = "V1_Erista";
|
||||
constexpr const char* V2_MARIKO = "V2_Mariko";
|
||||
constexpr const char* LITE_MARIKO = "Lite_Mariko";
|
||||
constexpr const char* OLED_MARIKO = "OLED_Mariko";
|
||||
}
|
||||
|
||||
// PSM (Battery) options
|
||||
struct PSMOption {
|
||||
const char* name;
|
||||
uint32_t value;
|
||||
};
|
||||
|
||||
constexpr PSMOption PSM_OPTIONS[] = {
|
||||
{"1024mA", 0x400},
|
||||
{"1280mA", 0x500},
|
||||
{"1536mA", 0x600},
|
||||
{"1660mA (Lite Default)", 0x67C},
|
||||
{"1792mA", 0x700},
|
||||
{"2048mA (Default)", 0x800},
|
||||
{"2304mA (UNSAFE)", 0x900},
|
||||
{"2560mA (UNSAFE)", 0xA00},
|
||||
{"2816mA (DANGEROUS)", 0xB00},
|
||||
{"3072mA (DANGEROUS)", 0xC00}
|
||||
};
|
||||
|
||||
// Memory timing presets
|
||||
struct TimingPreset {
|
||||
uint32_t tRCD;
|
||||
uint32_t tRP;
|
||||
uint32_t tRAS;
|
||||
uint32_t tRRD;
|
||||
uint32_t tRFC;
|
||||
uint32_t tRTW;
|
||||
uint32_t tWTR;
|
||||
uint32_t tREFI;
|
||||
};
|
||||
|
||||
// Default timing preset
|
||||
constexpr TimingPreset TIMING_DEFAULT = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
// Samsung AA-MGCL/MGCR presets
|
||||
constexpr TimingPreset TIMING_AAMGCL_CONSERVATIVE = {4, 4, 5, 5, 5, 5, 7, 6};
|
||||
constexpr TimingPreset TIMING_AAMGCL_TIGHT = {4, 4, 8, 6, 5, 7, 8, 6};
|
||||
|
||||
// SK Hynix NEE presets
|
||||
constexpr TimingPreset TIMING_NEE_CONSERVATIVE = {3, 3, 2, 2, 5, 5, 4, 6};
|
||||
constexpr TimingPreset TIMING_NEE_TIGHT = {4, 4, 4, 3, 7, 6, 5, 6};
|
||||
|
||||
// Micron WT:B presets
|
||||
constexpr TimingPreset TIMING_WTB_CONSERVATIVE = {4, 4, 5, 5, 2, 6, 5, 6};
|
||||
constexpr TimingPreset TIMING_WTB_TIGHT = {6, 6, 7, 7, 2, 6, 5, 6};
|
||||
|
||||
// UI Constants
|
||||
constexpr int MAX_VISIBLE_ITEMS = 20;
|
||||
constexpr int MENU_START_Y = 7;
|
||||
constexpr int SCREEN_WIDTH = 80;
|
||||
constexpr int SCREEN_HEIGHT = 45;
|
||||
}
|
||||
94
Source/OnDeviceConfig/include/defaults.hpp
Normal file
94
Source/OnDeviceConfig/include/defaults.hpp
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* HOC Configurator - Default Values
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
|
||||
class KipHandler;
|
||||
|
||||
class Defaults {
|
||||
public:
|
||||
template<typename T>
|
||||
static void initDefaults(T& data) {
|
||||
data.custRev = 0;
|
||||
data.mtcConf = 0;
|
||||
data.commonCpuBoostClock = 1785000;
|
||||
data.commonEmcMemVolt = 1175000;
|
||||
data.eristaCpuMaxVolt = 1235;
|
||||
data.eristaEmcMaxClock = 1862400;
|
||||
data.marikoCpuMaxVolt = 1120;
|
||||
data.marikoEmcMaxClock = 1996800;
|
||||
data.marikoEmcVddqVolt = 600000;
|
||||
data.marikoCpuUV = 0;
|
||||
data.marikoGpuUV = 0;
|
||||
data.eristaCpuUV = 0;
|
||||
data.eristaGpuUV = 0;
|
||||
data.enableMarikoGpuUnsafeFreqs = 0;
|
||||
data.enableEristaGpuUnsafeFreqs = 0;
|
||||
data.enableMarikoCpuUnsafeFreqs = 0;
|
||||
data.enableEristaCpuUnsafeFreqs = 0;
|
||||
data.commonGpuVoltOffset = 0;
|
||||
data.marikoEmcDvbShift = 0;
|
||||
|
||||
// Memory timings
|
||||
data.t1_tRCD = 0;
|
||||
data.t2_tRP = 0;
|
||||
data.t3_tRAS = 0;
|
||||
data.t4_tRRD = 0;
|
||||
data.t5_tRFC = 0;
|
||||
data.t6_tRTW = 0;
|
||||
data.t7_tWTR = 0;
|
||||
data.t8_tREFI = 0;
|
||||
data.mem_burst_latency = 2;
|
||||
|
||||
// Additional voltages
|
||||
data.marikoCpuVmin = 0;
|
||||
data.eristaGpuVmin = 0;
|
||||
data.marikoGpuVmin = 0;
|
||||
data.marikoGpuVmax = 0;
|
||||
|
||||
// Initialize all GPU voltages to 600 (default safe value)
|
||||
data.g_volt_76800 = 600;
|
||||
data.g_volt_153600 = 600;
|
||||
data.g_volt_230400 = 600;
|
||||
data.g_volt_307200 = 600;
|
||||
data.g_volt_384000 = 600;
|
||||
data.g_volt_460800 = 600;
|
||||
data.g_volt_537600 = 600;
|
||||
data.g_volt_614400 = 600;
|
||||
data.g_volt_691200 = 600;
|
||||
data.g_volt_768000 = 600;
|
||||
data.g_volt_844800 = 605;
|
||||
data.g_volt_921600 = 635;
|
||||
data.g_volt_998400 = 665;
|
||||
data.g_volt_1075200 = 695;
|
||||
data.g_volt_1152000 = 730;
|
||||
data.g_volt_1228800 = 760;
|
||||
data.g_volt_1267200 = 785;
|
||||
data.g_volt_1305600 = 800;
|
||||
data.g_volt_1344000 = 0;
|
||||
data.g_volt_1382400 = 0;
|
||||
data.g_volt_1420800 = 0;
|
||||
data.g_volt_1459200 = 0;
|
||||
data.g_volt_1497600 = 0;
|
||||
data.g_volt_1536000 = 0;
|
||||
|
||||
// Erista GPU voltages
|
||||
data.g_volt_e_76800 = 700;
|
||||
data.g_volt_e_153600 = 700;
|
||||
data.g_volt_e_230400 = 700;
|
||||
data.g_volt_e_307200 = 700;
|
||||
data.g_volt_e_384000 = 700;
|
||||
data.g_volt_e_460800 = 700;
|
||||
data.g_volt_e_537600 = 700;
|
||||
data.g_volt_e_614400 = 700;
|
||||
data.g_volt_e_691200 = 700;
|
||||
data.g_volt_e_768000 = 700;
|
||||
data.g_volt_e_844800 = 710;
|
||||
data.g_volt_e_921600 = 740;
|
||||
data.g_volt_e_998400 = 770;
|
||||
data.g_volt_e_1075200 = 800;
|
||||
}
|
||||
};
|
||||
24
Source/OnDeviceConfig/include/ini_header.hpp
Normal file
24
Source/OnDeviceConfig/include/ini_header.hpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
class IniHandler {
|
||||
private:
|
||||
std::string iniPath;
|
||||
std::map<std::string, std::map<std::string, std::string>> sections;
|
||||
|
||||
public:
|
||||
IniHandler(const std::string& path);
|
||||
|
||||
bool load();
|
||||
bool save();
|
||||
|
||||
void setValue(const std::string& section, const std::string& key, const std::string& value);
|
||||
std::string getValue(const std::string& section, const std::string& key, const std::string& defaultValue = "");
|
||||
void removeKey(const std::string& section, const std::string& key);
|
||||
void removeSection(const std::string& section);
|
||||
|
||||
bool sectionExists(const std::string& section);
|
||||
bool keyExists(const std::string& section, const std::string& key);
|
||||
};
|
||||
123
Source/OnDeviceConfig/include/kip_handler.hpp
Normal file
123
Source/OnDeviceConfig/include/kip_handler.hpp
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* HOC Configurator - KIP Handler
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
#include "defaults.hpp"
|
||||
|
||||
class KipHandler {
|
||||
private:
|
||||
std::string kipPath;
|
||||
const uint8_t MAGIC[4] = {'C', 'U', 'S', 'T'};
|
||||
|
||||
struct KipData {
|
||||
uint32_t custRev;
|
||||
uint32_t mtcConf;
|
||||
uint32_t commonCpuBoostClock;
|
||||
uint32_t commonEmcMemVolt;
|
||||
uint32_t eristaCpuMaxVolt;
|
||||
uint32_t eristaEmcMaxClock;
|
||||
uint32_t marikoCpuMaxVolt;
|
||||
uint32_t marikoEmcMaxClock;
|
||||
uint32_t marikoEmcVddqVolt;
|
||||
uint32_t marikoCpuUV;
|
||||
uint32_t marikoGpuUV;
|
||||
uint32_t eristaCpuUV;
|
||||
uint32_t eristaGpuUV;
|
||||
uint32_t enableMarikoGpuUnsafeFreqs;
|
||||
uint32_t enableEristaGpuUnsafeFreqs;
|
||||
uint32_t enableMarikoCpuUnsafeFreqs;
|
||||
uint32_t enableEristaCpuUnsafeFreqs;
|
||||
uint32_t commonGpuVoltOffset;
|
||||
uint32_t marikoEmcDvbShift;
|
||||
|
||||
// Memory timings
|
||||
uint32_t t1_tRCD;
|
||||
uint32_t t2_tRP;
|
||||
uint32_t t3_tRAS;
|
||||
uint32_t t4_tRRD;
|
||||
uint32_t t5_tRFC;
|
||||
uint32_t t6_tRTW;
|
||||
uint32_t t7_tWTR;
|
||||
uint32_t t8_tREFI;
|
||||
uint32_t mem_burst_latency;
|
||||
|
||||
// Additional voltages
|
||||
uint32_t marikoCpuVmin;
|
||||
uint32_t eristaGpuVmin;
|
||||
uint32_t marikoGpuVmin;
|
||||
uint32_t marikoGpuVmax;
|
||||
|
||||
// GPU voltages for each frequency (Mariko)
|
||||
uint32_t g_volt_76800;
|
||||
uint32_t g_volt_153600;
|
||||
uint32_t g_volt_230400;
|
||||
uint32_t g_volt_307200;
|
||||
uint32_t g_volt_384000;
|
||||
uint32_t g_volt_460800;
|
||||
uint32_t g_volt_537600;
|
||||
uint32_t g_volt_614400;
|
||||
uint32_t g_volt_691200;
|
||||
uint32_t g_volt_768000;
|
||||
uint32_t g_volt_844800;
|
||||
uint32_t g_volt_921600;
|
||||
uint32_t g_volt_998400;
|
||||
uint32_t g_volt_1075200;
|
||||
uint32_t g_volt_1152000;
|
||||
uint32_t g_volt_1228800;
|
||||
uint32_t g_volt_1267200;
|
||||
uint32_t g_volt_1305600;
|
||||
uint32_t g_volt_1344000;
|
||||
uint32_t g_volt_1382400;
|
||||
uint32_t g_volt_1420800;
|
||||
uint32_t g_volt_1459200;
|
||||
uint32_t g_volt_1497600;
|
||||
uint32_t g_volt_1536000;
|
||||
|
||||
// GPU voltages for each frequency (Erista)
|
||||
uint32_t g_volt_e_76800;
|
||||
uint32_t g_volt_e_153600;
|
||||
uint32_t g_volt_e_230400;
|
||||
uint32_t g_volt_e_307200;
|
||||
uint32_t g_volt_e_384000;
|
||||
uint32_t g_volt_e_460800;
|
||||
uint32_t g_volt_e_537600;
|
||||
uint32_t g_volt_e_614400;
|
||||
uint32_t g_volt_e_691200;
|
||||
uint32_t g_volt_e_768000;
|
||||
uint32_t g_volt_e_844800;
|
||||
uint32_t g_volt_e_921600;
|
||||
uint32_t g_volt_e_998400;
|
||||
uint32_t g_volt_e_1075200;
|
||||
};
|
||||
|
||||
KipData data;
|
||||
|
||||
public:
|
||||
KipHandler(const std::string& path) : kipPath(path) {
|
||||
// Initialize with defaults
|
||||
Defaults::initDefaults(data);
|
||||
}
|
||||
|
||||
bool readKip();
|
||||
bool writeKip();
|
||||
|
||||
// Getters
|
||||
KipData& getData() { return data; }
|
||||
const KipData& getData() const { return data; }
|
||||
|
||||
// Setters for common values
|
||||
void setCommonCpuBoostClock(uint32_t val) { data.commonCpuBoostClock = val; }
|
||||
void setCommonEmcMemVolt(uint32_t val) { data.commonEmcMemVolt = val; }
|
||||
void setMarikoCpuMaxVolt(uint32_t val) { data.marikoCpuMaxVolt = val; }
|
||||
void setMarikoEmcMaxClock(uint32_t val) { data.marikoEmcMaxClock = val; }
|
||||
void setMarikoEmcVddqVolt(uint32_t val) { data.marikoEmcVddqVolt = val; }
|
||||
|
||||
// Utility
|
||||
std::string getKipPath() const { return kipPath; }
|
||||
void setKipPath(const std::string& path) { kipPath = path; }
|
||||
};
|
||||
91
Source/OnDeviceConfig/include/ui.hpp
Normal file
91
Source/OnDeviceConfig/include/ui.hpp
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* HOC Configurator - UI Handler
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
#include <switch.h>
|
||||
|
||||
// Forward declarations
|
||||
class KipHandler;
|
||||
class ValueEditor;
|
||||
|
||||
enum class EditorType {
|
||||
TOGGLE,
|
||||
FREQUENCY,
|
||||
VOLTAGE,
|
||||
SLIDER,
|
||||
LIST
|
||||
};
|
||||
|
||||
enum class MenuState {
|
||||
MAIN,
|
||||
GPU,
|
||||
CPU,
|
||||
RAM,
|
||||
MISC,
|
||||
ABOUT,
|
||||
SETTINGS
|
||||
};
|
||||
|
||||
class UI {
|
||||
private:
|
||||
MenuState currentState;
|
||||
int selectedIndex;
|
||||
int scrollOffset;
|
||||
std::string statusMessage;
|
||||
std::string kipPath;
|
||||
bool kipLoaded;
|
||||
bool autoSave;
|
||||
KipHandler* kipHandler;
|
||||
ValueEditor* editor;
|
||||
|
||||
const int MAX_VISIBLE_ITEMS = 20;
|
||||
|
||||
void renderMainMenu();
|
||||
void renderGPUMenu();
|
||||
void renderCPUMenu();
|
||||
void renderRAMMenu();
|
||||
void renderMiscMenu();
|
||||
void renderAboutMenu();
|
||||
void renderSettingsMenu();
|
||||
|
||||
void handleMainMenuInput(u64 kDown);
|
||||
void handleGPUMenuInput(u64 kDown);
|
||||
void handleCPUMenuInput(u64 kDown);
|
||||
void handleRAMMenuInput(u64 kDown);
|
||||
void handleMiscMenuInput(u64 kDown);
|
||||
void handleAboutMenuInput(u64 kDown);
|
||||
void handleSettingsMenuInput(u64 kDown);
|
||||
|
||||
void drawHeader();
|
||||
void drawFooter();
|
||||
void drawMenuItem(const std::string& text, bool selected, int y);
|
||||
void drawText(const std::string& text, int x, int y);
|
||||
|
||||
void showValueEditor(const std::string& title, EditorType type, int currentValue,
|
||||
std::function<void(int)> callback,
|
||||
const std::vector<std::string>& options = {},
|
||||
int min = 0, int max = 100, int step = 1);
|
||||
|
||||
public:
|
||||
UI();
|
||||
~UI();
|
||||
|
||||
void render();
|
||||
void handleInput(u64 kDown);
|
||||
|
||||
void setStatus(const std::string& msg) { statusMessage = msg; }
|
||||
void setKipPath(const std::string& path) { kipPath = path; }
|
||||
void setKipLoaded(bool loaded) { kipLoaded = loaded; }
|
||||
void setAutoSave(bool enabled) { autoSave = enabled; }
|
||||
void setKipHandler(KipHandler* handler) { kipHandler = handler; }
|
||||
|
||||
std::string getStatus() const { return statusMessage; }
|
||||
std::string getKipPath() const { return kipPath; }
|
||||
bool isKipLoaded() const { return kipLoaded; }
|
||||
bool isAutoSaveEnabled() const { return autoSave; }
|
||||
};
|
||||
43
Source/OnDeviceConfig/include/value_editor.hpp
Normal file
43
Source/OnDeviceConfig/include/value_editor.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* HOC Configurator - Value Editor
|
||||
* Copyright (C) Dominatorul, Souldbminer
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
#include <switch.h>
|
||||
#include "ui.hpp" // This includes EditorType
|
||||
|
||||
class KipHandler;
|
||||
|
||||
struct EditorConfig {
|
||||
std::string title;
|
||||
EditorType type;
|
||||
int currentValue;
|
||||
int minValue;
|
||||
int maxValue;
|
||||
int step;
|
||||
std::vector<std::string> options;
|
||||
std::function<void(int)> onValueChange;
|
||||
};
|
||||
|
||||
class ValueEditor {
|
||||
private:
|
||||
EditorConfig config;
|
||||
int selectedValue;
|
||||
bool active;
|
||||
|
||||
public:
|
||||
ValueEditor();
|
||||
|
||||
void show(const EditorConfig& cfg);
|
||||
void hide();
|
||||
bool isActive() const { return active; }
|
||||
|
||||
void handleInput(u64 kDown);
|
||||
void render();
|
||||
|
||||
int getSelectedValue() const { return selectedValue; }
|
||||
};
|
||||
Reference in New Issue
Block a user