diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f8afaeb328..998c73543a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -94,6 +94,10 @@ if (MSVC AND NOT CXX_CLANG) /wd4324 # 'struct_name': structure was padded due to __declspec(align()) /wd4201 # nonstandard extension used : nameless struct/union /wd4702 # unreachable code (when used with LTO) + + $<$:/GS-> # No stack buffer overflow checks + /Gy # Enable function level linking + /GR- # Disable run time type information ) if (NOT CXX_CLANG) @@ -108,15 +112,14 @@ if (MSVC AND NOT CXX_CLANG) add_compile_options(/QIntel-jcc-erratum) endif() - # /GS- - No stack buffer overflow checks - add_compile_options("$<$:/GS->") - set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE) set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) else() if (NOT MSVC) add_compile_options( -fwrapv + -fno-rtti # Disable RTTI + -pipe ) endif() diff --git a/src/common/settings_common.h b/src/common/settings_common.h index 653ce17b89..bbc16f52ec 100644 --- a/src/common/settings_common.h +++ b/src/common/settings_common.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -162,7 +162,7 @@ public: /** * @returns A unique identifier for the Setting's internal data type. */ - [[nodiscard]] virtual std::type_index TypeId() const = 0; + [[nodiscard]] virtual std::string_view TypeId() const = 0; /** * Returns true if the Setting's internal data type is an enum. diff --git a/src/common/settings_setting.h b/src/common/settings_setting.h index 9af2cebde0..076aceef29 100644 --- a/src/common/settings_setting.h +++ b/src/common/settings_setting.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -220,8 +220,14 @@ public: * * @returns the type_index of the setting's type */ - [[nodiscard]] std::type_index TypeId() const override final { - return std::type_index(typeid(Type)); + [[nodiscard]] std::string_view TypeId() const override final { + if constexpr (std::is_same_v) { + return "string"; + } else if constexpr (std::is_same_v) { + return "bool"; + } else { + return "other"; + } } [[nodiscard]] constexpr u32 EnumIndex() const override final { diff --git a/src/core/hle/service/cmif_serialization.h b/src/core/hle/service/cmif_serialization.h index 39f4905f67..4d32c6cd6b 100644 --- a/src/core/hle/service/cmif_serialization.h +++ b/src/core/hle/service/cmif_serialization.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -444,9 +444,9 @@ void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) { const bool _is_domain = _mgr ? _mgr->IsDomain() : false; ASSERT_MSG(!_is_domain, "Non-domain reply used on domain session\n" - "Service={} (type={})\nTIPC={} CmdType={} Cmd=0x{:08X}\n" + "Service={} (TIPC={} CmdType={} Cmd=0x{:08X}\n" "HasDomainHeader={} DomainHandlers={}\nDesc={}", - t.GetServiceName(), typeid(T).name(), ctx.IsTipc(), + t.GetServiceName(), ctx.IsTipc(), static_cast(ctx.GetCommandType()), static_cast(ctx.GetCommand()), ctx.HasDomainMessageHeader(), _mgr ? static_cast(_mgr->DomainHandlerCount()) : 0u, ctx.Description()); diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp index 2d76a774f6..b663ac51ee 100644 --- a/src/yuzu/configuration/shared_widget.cpp +++ b/src/yuzu/configuration/shared_widget.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -505,7 +505,7 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu RequestType request, float multiplier, Settings::BasicSetting* other_setting, const QString& suffix) { created = true; - const auto type = setting.TypeId(); + const auto type_id = setting.TypeId(); QHBoxLayout* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); @@ -514,10 +514,8 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu other_setting = setting.PairedSetting(); } - const bool require_checkbox = - other_setting != nullptr && other_setting->TypeId() == typeid(bool); - - if (other_setting != nullptr && other_setting->TypeId() != typeid(bool)) { + const bool require_checkbox = other_setting != nullptr && other_setting->TypeId() == "bool"; + if (other_setting != nullptr && other_setting->TypeId() != "bool") { LOG_WARNING( Frontend, "Extra setting \"{}\" specified but is not bool, refusing to create checkbox for it.", @@ -572,16 +570,27 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu } if (require_checkbox) { - QWidget* lhs = - CreateCheckBox(other_setting, label, checkbox_serializer, checkbox_restore_func, touch); + QWidget* lhs = CreateCheckBox(other_setting, label, checkbox_serializer, checkbox_restore_func, touch); layout->addWidget(lhs, 1); - } else if (setting.TypeId() != typeid(bool)) { + } else if (type_id != "bool") { QLabel* qt_label = CreateLabel(label); layout->addWidget(qt_label, 1); } - if (setting.TypeId() == typeid(bool)) { + if (type_id == "bool") { data_component = CreateCheckBox(&setting, label, serializer, restore_func, touch); + } else if (type_id == "string") { + switch (request) { + case RequestType::Default: + case RequestType::LineEdit: + data_component = CreateLineEdit(serializer, restore_func, touch); + break; + case RequestType::ComboBox: + data_component = CreateCombobox(serializer, restore_func, touch); + break; + default: + UNIMPLEMENTED(); + } } else if (setting.IsEnum()) { if (request == RequestType::RadioGroup) { data_component = CreateRadioGroup(serializer, restore_func, touch); @@ -629,18 +638,6 @@ void Widget::SetupComponent(const QString& label, std::function& load_fu default: UNIMPLEMENTED(); } - } else if (type == typeid(std::string)) { - switch (request) { - case RequestType::Default: - case RequestType::LineEdit: - data_component = CreateLineEdit(serializer, restore_func, touch); - break; - case RequestType::ComboBox: - data_component = CreateCombobox(serializer, restore_func, touch); - break; - default: - UNIMPLEMENTED(); - } } if (data_component == nullptr) {