Added ability to change username & language code in the settings ui. Added IProfile::Get and SET::GetLanguageCode for libnx tests (#851)
This commit is contained in:
		| @@ -10,6 +10,7 @@ | ||||
| #include "core/hle/service/acc/acc_su.h" | ||||
| #include "core/hle/service/acc/acc_u0.h" | ||||
| #include "core/hle/service/acc/acc_u1.h" | ||||
| #include "core/settings.h" | ||||
|  | ||||
| namespace Service::Account { | ||||
|  | ||||
| @@ -31,13 +32,14 @@ struct ProfileBase { | ||||
| }; | ||||
| static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase structure has incorrect size"); | ||||
|  | ||||
| // TODO(ogniK): Generate a real user id based on username, md5(username) maybe? | ||||
| static constexpr u128 DEFAULT_USER_ID{1ull, 0ull}; | ||||
|  | ||||
| class IProfile final : public ServiceFramework<IProfile> { | ||||
| public: | ||||
|     explicit IProfile(u128 user_id) : ServiceFramework("IProfile"), user_id(user_id) { | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, nullptr, "Get"}, | ||||
|             {0, &IProfile::Get, "Get"}, | ||||
|             {1, &IProfile::GetBase, "GetBase"}, | ||||
|             {10, nullptr, "GetImageSize"}, | ||||
|             {11, nullptr, "LoadImage"}, | ||||
| @@ -46,14 +48,36 @@ public: | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void Get(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||
|         ProfileBase profile_base{}; | ||||
|         profile_base.user_id = user_id; | ||||
|         if (Settings::values.username.size() > profile_base.username.size()) { | ||||
|             std::copy_n(Settings::values.username.begin(), profile_base.username.size(), | ||||
|                         profile_base.username.begin()); | ||||
|         } else { | ||||
|             std::copy(Settings::values.username.begin(), Settings::values.username.end(), | ||||
|                       profile_base.username.begin()); | ||||
|         } | ||||
|  | ||||
|         IPC::ResponseBuilder rb{ctx, 16}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushRaw(profile_base); | ||||
|     } | ||||
|  | ||||
|     void GetBase(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_WARNING(Service_ACC, "(STUBBED) called"); | ||||
|  | ||||
|         // TODO(Subv): Retrieve this information from somewhere. | ||||
|         ProfileBase profile_base{}; | ||||
|         profile_base.user_id = user_id; | ||||
|         profile_base.username = {'y', 'u', 'z', 'u'}; | ||||
|  | ||||
|         if (Settings::values.username.size() > profile_base.username.size()) { | ||||
|             std::copy_n(Settings::values.username.begin(), profile_base.username.size(), | ||||
|                         profile_base.username.begin()); | ||||
|         } else { | ||||
|             std::copy(Settings::values.username.begin(), Settings::values.username.end(), | ||||
|                       profile_base.username.begin()); | ||||
|         } | ||||
|         IPC::ResponseBuilder rb{ctx, 16}; | ||||
|         rb.Push(RESULT_SUCCESS); | ||||
|         rb.PushRaw(profile_base); | ||||
|   | ||||
| @@ -652,7 +652,8 @@ void IApplicationFunctions::GetDesiredLanguage(Kernel::HLERequestContext& ctx) { | ||||
|     // TODO(bunnei): This should be configurable | ||||
|     IPC::ResponseBuilder rb{ctx, 4}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.Push(static_cast<u64>(Service::Set::LanguageCode::EN_US)); | ||||
|     rb.Push( | ||||
|         static_cast<u64>(Service::Set::GetLanguageCodeFromIndex(Settings::values.language_index))); | ||||
|     LOG_DEBUG(Service_AM, "called"); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -8,6 +8,7 @@ | ||||
| #include "core/hle/kernel/client_port.h" | ||||
| #include "core/hle/kernel/client_session.h" | ||||
| #include "core/hle/service/set/set.h" | ||||
| #include "core/settings.h" | ||||
|  | ||||
| namespace Service::Set { | ||||
|  | ||||
| @@ -31,6 +32,10 @@ constexpr std::array<LanguageCode, 17> available_language_codes = {{ | ||||
|     LanguageCode::ZH_HANT, | ||||
| }}; | ||||
|  | ||||
| LanguageCode GetLanguageCodeFromIndex(size_t index) { | ||||
|     return available_language_codes.at(index); | ||||
| } | ||||
|  | ||||
| void SET::GetAvailableLanguageCodes(Kernel::HLERequestContext& ctx) { | ||||
|     ctx.WriteBuffer(available_language_codes); | ||||
|  | ||||
| @@ -49,9 +54,17 @@ void SET::GetAvailableLanguageCodeCount(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_SET, "called"); | ||||
| } | ||||
|  | ||||
| void SET::GetLanguageCode(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::ResponseBuilder rb{ctx, 4}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.Push(static_cast<u64>(available_language_codes[Settings::values.language_index])); | ||||
|  | ||||
|     LOG_DEBUG(Service_SET, "called {}", Settings::values.language_index); | ||||
| } | ||||
|  | ||||
| SET::SET() : ServiceFramework("set") { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "GetLanguageCode"}, | ||||
|         {0, &SET::GetLanguageCode, "GetLanguageCode"}, | ||||
|         {1, &SET::GetAvailableLanguageCodes, "GetAvailableLanguageCodes"}, | ||||
|         {2, nullptr, "MakeLanguageCode"}, | ||||
|         {3, &SET::GetAvailableLanguageCodeCount, "GetAvailableLanguageCodeCount"}, | ||||
|   | ||||
| @@ -28,6 +28,7 @@ enum class LanguageCode : u64 { | ||||
|     ZH_HANS = 0x00736E61482D687A, | ||||
|     ZH_HANT = 0x00746E61482D687A, | ||||
| }; | ||||
| LanguageCode GetLanguageCodeFromIndex(size_t idx); | ||||
|  | ||||
| class SET final : public ServiceFramework<SET> { | ||||
| public: | ||||
| @@ -35,6 +36,7 @@ public: | ||||
|     ~SET() = default; | ||||
|  | ||||
| private: | ||||
|     void GetLanguageCode(Kernel::HLERequestContext& ctx); | ||||
|     void GetAvailableLanguageCodes(Kernel::HLERequestContext& ctx); | ||||
|     void GetAvailableLanguageCodeCount(Kernel::HLERequestContext& ctx); | ||||
| }; | ||||
|   | ||||
| @@ -112,6 +112,8 @@ static const std::array<const char*, NumAnalogs> mapping = {{ | ||||
| struct Values { | ||||
|     // System | ||||
|     bool use_docked_mode; | ||||
|     std::string username; | ||||
|     int language_index; | ||||
|  | ||||
|     // Controls | ||||
|     std::array<std::string, NativeButton::NumButtons> buttons; | ||||
|   | ||||
| @@ -105,6 +105,8 @@ void Config::ReadValues() { | ||||
|  | ||||
|     qt_config->beginGroup("System"); | ||||
|     Settings::values.use_docked_mode = qt_config->value("use_docked_mode", false).toBool(); | ||||
|     Settings::values.username = qt_config->value("username", "yuzu").toString().toStdString(); | ||||
|     Settings::values.language_index = qt_config->value("language_index", 1).toInt(); | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Miscellaneous"); | ||||
| @@ -214,6 +216,8 @@ void Config::SaveValues() { | ||||
|  | ||||
|     qt_config->beginGroup("System"); | ||||
|     qt_config->setValue("use_docked_mode", Settings::values.use_docked_mode); | ||||
|     qt_config->setValue("username", QString::fromStdString(Settings::values.username)); | ||||
|     qt_config->setValue("language_index", Settings::values.language_index); | ||||
|     qt_config->endGroup(); | ||||
|  | ||||
|     qt_config->beginGroup("Miscellaneous"); | ||||
|   | ||||
| @@ -4,9 +4,10 @@ | ||||
|  | ||||
| #include <QMessageBox> | ||||
| #include "core/core.h" | ||||
| #include "core/settings.h" | ||||
| #include "ui_configure_system.h" | ||||
| #include "yuzu/configuration/configure_system.h" | ||||
| #include "yuzu/ui_settings.h" | ||||
| #include "yuzu/main.h" | ||||
|  | ||||
| static const std::array<int, 12> days_in_month = {{ | ||||
|     31, | ||||
| @@ -38,6 +39,8 @@ ConfigureSystem::~ConfigureSystem() {} | ||||
|  | ||||
| void ConfigureSystem::setConfiguration() { | ||||
|     enabled = !Core::System::GetInstance().IsPoweredOn(); | ||||
|     ui->edit_username->setText(QString::fromStdString(Settings::values.username)); | ||||
|     ui->combo_language->setCurrentIndex(Settings::values.language_index); | ||||
| } | ||||
|  | ||||
| void ConfigureSystem::ReadSystemSettings() {} | ||||
| @@ -45,6 +48,9 @@ void ConfigureSystem::ReadSystemSettings() {} | ||||
| void ConfigureSystem::applyConfiguration() { | ||||
|     if (!enabled) | ||||
|         return; | ||||
|     Settings::values.username = ui->edit_username->text().toStdString(); | ||||
|     Settings::values.language_index = ui->combo_language->currentIndex(); | ||||
|     Settings::Apply(); | ||||
| } | ||||
|  | ||||
| void ConfigureSystem::updateBirthdayComboBox(int birthmonth_index) { | ||||
|   | ||||
| @@ -38,7 +38,7 @@ | ||||
|            </sizepolicy> | ||||
|           </property> | ||||
|           <property name="maxLength"> | ||||
|            <number>10</number> | ||||
|            <number>32</number> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
| @@ -164,7 +164,7 @@ | ||||
|           </item> | ||||
|           <item> | ||||
|            <property name="text"> | ||||
|             <string>Simplified Chinese (简体中文)</string> | ||||
|             <string>Chinese</string> | ||||
|            </property> | ||||
|           </item> | ||||
|           <item> | ||||
| @@ -187,6 +187,31 @@ | ||||
|             <string>Russian (Русский)</string> | ||||
|            </property> | ||||
|           </item> | ||||
|            <item> | ||||
|              <property name="text"> | ||||
|                <string>Taiwanese</string> | ||||
|              </property> | ||||
|            </item> | ||||
|            <item> | ||||
|              <property name="text"> | ||||
|                <string>British English</string> | ||||
|              </property> | ||||
|            </item> | ||||
|            <item> | ||||
|              <property name="text"> | ||||
|                <string>Canadian French</string> | ||||
|              </property> | ||||
|            </item> | ||||
|            <item> | ||||
|              <property name="text"> | ||||
|                <string>Latin American Spanish</string> | ||||
|              </property> | ||||
|            </item> | ||||
|            <item> | ||||
|              <property name="text"> | ||||
|                <string>Simplified Chinese</string> | ||||
|              </property> | ||||
|            </item> | ||||
|           <item> | ||||
|            <property name="text"> | ||||
|             <string>Traditional Chinese (正體中文)</string> | ||||
|   | ||||
| @@ -164,6 +164,16 @@ use_virtual_sd = | ||||
| # 1: Yes, 0 (default): No | ||||
| use_docked_mode = | ||||
|  | ||||
| # Sets the account username, max length is 32 characters | ||||
| # yuzu (default) | ||||
| username = | ||||
|  | ||||
| # Sets the systems language index | ||||
| # 0: Japanese, 1: English (default), 2: French, 3: German, 4: Italian, 5: Spanish, 6: Chinese, | ||||
| # 7: Korean, 8: Dutch, 9: Portuguese, 10: Russian, 11: Taiwanese, 12: British English, 13: Canadian French, | ||||
| # 14: Latin American Spanish, 15: Simplified Chinese, 16: Traditional Chinese | ||||
| language_index = | ||||
|  | ||||
| # The system region that yuzu will use during emulation | ||||
| # -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan | ||||
| region_value = | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 David
					David