diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS
index 503f9ec1fe..dcb97a5e83 100644
--- a/docs/CODEOWNERS
+++ b/docs/CODEOWNERS
@@ -10,17 +10,18 @@
/.ci @crueter
# cmake
-*.cmake @crueter
-*/CMakeLists.txt @crueter
-*.in @crueter
+*.cmake @crueter
+*CMakeLists.txt @crueter
+*.in @crueter
# individual stuff
-/src/web_service @AleksandrPopovich
-/src/dynarmic @Lizzie
-/src/core @Lizzie @Maufeat @PavelBARABANOV @MrPurple666
-/src/core/hle @Maufeat @PavelBARABANOV @SDK-Chan
-/src/*_room @AleksandrPopovich
-/src/video_core @CamilleLaVey @MaranBr @Wildcard @weakboson
+src/web_service @AleksandrPopovich
+src/dynarmic @Lizzie
+src/core @Lizzie @Maufeat @PavelBARABANOV @MrPurple666 @JPikachu
+src/core/hle @Maufeat @PavelBARABANOV @SDK-Chan
+src/core/arm @Lizzie @MrPurple666
+src/*_room @AleksandrPopovich
+src/video_core @CamilleLaVey @MaranBr @Wildcard @weakboson
# Global owners/triage
* @CamilleLaVey @Maufeat @crueter @MrPurple666 @MaranBr @Lizzie
\ No newline at end of file
diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml
index a758e1c7cd..35f7d20198 100644
--- a/src/android/app/src/main/res/values-ar/strings.xml
+++ b/src/android/app/src/main/res/values-ar/strings.xml
@@ -836,13 +836,13 @@
تمتد إلى النافذة
- Dynarmic (بطيء)
+ Dynarmic (JIT)
تنفيذ التعليمات البرمجية الأصلية (NCE)
دقه
غير آمن
- Paranoid (بطيء)
+ Paranoid
الأسهم
diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml
index 2ee0e1783a..1f73df7385 100644
--- a/src/android/app/src/main/res/values-es/strings.xml
+++ b/src/android/app/src/main/res/values-es/strings.xml
@@ -919,13 +919,13 @@
Ajustar a la ventana
- DynARMic (lento)
+ Dynarmic (JIT)
Ejecución nativa de código (NCE)
Preciso
Impreciso
- Paranoico (Lento)
+ Paranoico
Cruceta
diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml
index 79cf5f49e6..fd5c6ae6ca 100644
--- a/src/android/app/src/main/res/values-fa/strings.xml
+++ b/src/android/app/src/main/res/values-fa/strings.xml
@@ -918,13 +918,13 @@
کشش تا پر کردن پنجره
- دینارمیک (کند)
+ Dynarmic (JIT)
اجرای کد اصلی (NCE)
دقیق
ناامن
- بدگمان (کند)
+ بدگمان
کلیدهای جهتی
diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml
index e9df08a4de..97496ef33d 100644
--- a/src/android/app/src/main/res/values-fr/strings.xml
+++ b/src/android/app/src/main/res/values-fr/strings.xml
@@ -967,13 +967,13 @@
Étirer à la fenêtre
- Dynarmic (Lent)
+ Dynarmic (JIT)
Exécution de code natif (NCE)
Précis
Risqué
- Paranoïaque (Lent)
+ Paranoïaque
Pavé directionnel
diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml
index 4e1624a556..359e8dff9a 100644
--- a/src/android/app/src/main/res/values-he/strings.xml
+++ b/src/android/app/src/main/res/values-he/strings.xml
@@ -844,13 +844,13 @@
הרחב לגודל המסך
- דינמי (איטי)
+ דינמי
ביצוע קוד מקורי (NCE)
מדויק
לא בטוח
- פראנואידי (איטי)
+ פראנואידי
D-pad
diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml
index 061ac07388..36157d1578 100644
--- a/src/android/app/src/main/res/values-hu/strings.xml
+++ b/src/android/app/src/main/res/values-hu/strings.xml
@@ -954,13 +954,13 @@
Ablakhoz nyújtás
- Dinamikus (lassú)
+ Dynarmic (JIT)
Natív kód végrehajtás (Native code execution (NCE))
Pontos
Nem biztonságos
- Paranoid (Lassú)
+ Paranoid
D-pad
diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml
index 6e3b64953f..18e881a97b 100644
--- a/src/android/app/src/main/res/values-id/strings.xml
+++ b/src/android/app/src/main/res/values-id/strings.xml
@@ -911,13 +911,13 @@
Merentangkan
- Dynamic (Lambat)
+ Dynarmic (JIT)
Native code execution (NCE)
Akurat
Berbahaya
- Paranoid (Slow)
+ Paranoid
D Pad
diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml
index 179601f182..0a873b04eb 100644
--- a/src/android/app/src/main/res/values-ja/strings.xml
+++ b/src/android/app/src/main/res/values-ja/strings.xml
@@ -834,13 +834,13 @@
画面に合わせる
- Dynarmic (低速)
+ Dynarmic (JIT)
ネイティブコード実行 (NCE)
正確
不安定
- パラノイド (低速)
+ パラノイド
方向ボタン
diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml
index 6f4dd42af2..e598bb1120 100644
--- a/src/android/app/src/main/res/values-ko/strings.xml
+++ b/src/android/app/src/main/res/values-ko/strings.xml
@@ -910,13 +910,13 @@
화면에 맞춤
- Dynarmic (느림)
+ Dynarmic (JIT)
네이티브 코드 실행 (NCE)
정확함
최적화 (안전하지 않음)
- 최적화하지 않음 (느림)
+ 최적화하지 않음
십자키
diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml
index eec3fdf715..5571c2aea4 100644
--- a/src/android/app/src/main/res/values-pt-rBR/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml
@@ -968,13 +968,13 @@ uma tentativa de mapeamento automático
Esticar à janela
- Dynarmic (Lenta)
+ Dynarmic (JIT)
Execução de código nativo (NCE)
Precisa
Não segura
- Paranoica (Lenta)
+ Paranoica
Botões Direcionais
diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml
index d45bf4bfc9..81aa7e92c0 100644
--- a/src/android/app/src/main/res/values-pt-rPT/strings.xml
+++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml
@@ -968,13 +968,13 @@ uma tentativa de mapeamento automático
Esticar à janela
- Dynarmic (Lento)
+ Dynarmic (JIT)
Native code execution (NCE)
Preciso
Inseguro
- Paranoid (Lento)
+ Paranoid
Botões Direcionais
diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml
index 2f7714257f..eee249c44a 100644
--- a/src/android/app/src/main/res/values-ru/strings.xml
+++ b/src/android/app/src/main/res/values-ru/strings.xml
@@ -969,13 +969,13 @@
Растянуть до окна
- Dynarmic (Медленно)
+ Dynarmic (JIT)
Нативное выполнение (NCE)
Точно
Небезопасно
- Параноик (медленно)
+ Параноик
Крестовина
diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml
index e261772fc4..b123757f5a 100644
--- a/src/android/app/src/main/res/values-sr/strings.xml
+++ b/src/android/app/src/main/res/values-sr/strings.xml
@@ -988,13 +988,13 @@
Протезање до прозора
- Динамина (споро)
+ Dynarmic (JIT)
Извођење изворног кода (НЦЕ)
Тачан
Несигуран
- Параноичан (споро)
+ Параноичан
Д-пад
diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml
index bfdc3af3d3..5cf657ef3d 100644
--- a/src/android/app/src/main/res/values-zh-rCN/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml
@@ -961,13 +961,13 @@
拉伸窗口
- 动态编译 (慢速)
+ Dynarmic (JIT)
本机代码执行 (NCE)
高精度
低精度
- 偏执模式 (慢速)
+ 偏执模式
十字方向键
diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml
index e64aaa9a54..f4d690dbaa 100644
--- a/src/android/app/src/main/res/values-zh-rTW/strings.xml
+++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml
@@ -966,13 +966,13 @@
延展視窗
- 動態 (慢)
+ Dynarmic (JIT)
機器碼執行 (NCE)
高精度
低精度
- 不合理 (慢)
+ 不合理
方向鍵
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 2cef5903cb..3b76c0ba79 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -1014,13 +1014,13 @@
Stretch to window
- Dynarmic (Slow)
+ Dynarmic (JIT)
Native code execution (NCE)
Accurate
Unsafe
- Paranoid (Slow)
+ Paranoid
D-pad
diff --git a/src/common/settings.h b/src/common/settings.h
index 8605445837..4d51eb1a44 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -643,6 +643,8 @@ struct Values {
// Linux
SwitchableSetting enable_gamemode{linkage, true, "enable_gamemode", Category::Linux};
+ SwitchableSetting force_x11{linkage, false, "force_x11", Category::Linux};
+ Setting hide_backend_warning_popup{linkage, false, "hide_backend_warning_popup", Category::Linux};
// Controls
InputSetting> players;
diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp
index 4439611d2e..35e76624f4 100644
--- a/src/core/perf_stats.cpp
+++ b/src/core/perf_stats.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: 2017 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -41,7 +44,14 @@ PerfStats::~PerfStats() {
const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::LogDir);
// %F Date format expanded is "%Y-%m-%d"
- const auto filename = fmt::format("{:%F-%H-%M}_{:016X}.csv", *std::localtime(&t), title_id);
+ const auto filename = fmt::format("{}_{:016X}.csv",
+ [&] {
+ std::ostringstream oss;
+ oss << std::put_time(std::localtime(&t), "%F-%H-%M");
+ return oss.str();
+ }(),
+ title_id);
+
const auto filepath = path / filename;
if (Common::FS::CreateParentDir(filepath)) {
diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp
index 4bac8142c3..1723636811 100644
--- a/src/core/reporter.cpp
+++ b/src/core/reporter.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -33,7 +36,9 @@ std::filesystem::path GetPath(std::string_view type, u64 title_id, std::string_v
std::string GetTimestamp() {
const auto time = std::time(nullptr);
- return fmt::format("{:%FT%H-%M-%S}", *std::localtime(&time));
+ std::ostringstream oss;
+ oss << std::put_time(std::localtime(&time), "%FT%H-%M-%S");
+ return oss.str();
}
using namespace nlohmann;
diff --git a/src/qt_common/shared_translation.cpp b/src/qt_common/shared_translation.cpp
index cdc05e60e0..403498a22c 100644
--- a/src/qt_common/shared_translation.cpp
+++ b/src/qt_common/shared_translation.cpp
@@ -451,6 +451,8 @@ std::unique_ptr InitializeTranslations(QObject* parent)
// Linux
INSERT(Settings, enable_gamemode, tr("Enable Gamemode"), QString());
+ INSERT(Settings, force_x11, tr("Force X11 as Graphics Backend"), QString());
+ INSERT(Settings, hide_backend_warning_popup, QString(), QString());
// Ui Debugging
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index d7d4e94ab7..64f5f968a8 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -545,6 +545,10 @@ GMainWindow::GMainWindow(bool has_broken_vulkan)
// Gen keys if necessary
OnCheckFirmwareDecryption();
+#ifdef __unix__
+ OnCheckBackend();
+#endif
+
game_list->LoadCompatibilityList();
// force reload on first load to ensure add-ons get updated
game_list->PopulateAsync(UISettings::values.game_dirs);
@@ -4454,6 +4458,49 @@ void GMainWindow::OnCheckFirmwareDecryption() {
UpdateMenuState();
}
+#ifdef __unix__
+void GMainWindow::OnCheckBackend() {
+ QByteArray qtPlatform = qgetenv("QT_QPA_PLATFORM");
+ bool isWayland = qtPlatform.isEmpty() || qtPlatform == "wayland" || qtPlatform == "wayland-egl";
+
+ if (!isWayland)
+ return;
+
+ const bool currently_hidden = Settings::values.hide_backend_warning_popup.GetValue();
+ if (currently_hidden)
+ return;
+
+ QMessageBox msgbox(this);
+ msgbox.setWindowTitle(tr("Wayland Detected"));
+ msgbox.setText(tr("You are running Eden under Wayland.\n"
+ "Some features may not work correctly.\n"
+ "It is recommended to use X11 for the best compatibility."));
+ msgbox.setIcon(QMessageBox::Warning);
+
+ QPushButton* okButton = msgbox.addButton(tr("Use X11"), QMessageBox::AcceptRole);
+ QPushButton* cancelButton = msgbox.addButton(tr("Continue with Wayland"), QMessageBox::RejectRole);
+ msgbox.setDefaultButton(okButton);
+
+ QCheckBox* cb = new QCheckBox(tr("Don't show again"), &msgbox);
+ cb->setChecked(currently_hidden);
+ msgbox.setCheckBox(cb);
+
+ msgbox.exec();
+
+ const bool hide = cb->isChecked();
+ if (hide != currently_hidden) {
+ Settings::values.hide_backend_warning_popup.SetValue(hide);
+ }
+
+ if (msgbox.clickedButton() == okButton) {
+ Settings::values.force_x11.SetValue(true);
+ QMessageBox::information(this,
+ tr("Restart Required"),
+ tr("Restart Eden to apply the X11 backend."));
+ }
+}
+#endif
+
bool GMainWindow::CheckFirmwarePresence() {
return FirmwareManager::CheckFirmwarePresence(*QtCommon::system.get());
}
@@ -4944,6 +4991,12 @@ int main(int argc, char* argv[]) {
qputenv("DISPLAY", ":0");
}
+ // TODO: (DraVee) Un-alive the guy who wrote this
+ const auto config_path = Common::FS::PathToUTF8String(Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir) / "qt-config.ini");
+ const bool forceX11 = QSettings(QString::fromStdString(config_path), QSettings::IniFormat).value("Linux/force_x11", false).toBool();
+ if (forceX11)
+ qputenv("QT_QPA_PLATFORM", "xcb");
+
// Fix the Wayland appId. This needs to match the name of the .desktop file without the .desktop
// suffix.
QGuiApplication::setDesktopFileName(QStringLiteral("dev.eden_emu.eden"));
diff --git a/src/yuzu/main.h b/src/yuzu/main.h
index e3922759b0..b700d89911 100644
--- a/src/yuzu/main.h
+++ b/src/yuzu/main.h
@@ -411,6 +411,9 @@ private slots:
void OnCreateHomeMenuApplicationMenuShortcut();
void OnCaptureScreenshot();
void OnCheckFirmwareDecryption();
+#ifdef __unix__
+ void OnCheckBackend();
+#endif
void OnLanguageChanged(const QString& locale);
void OnMouseActivity();
bool OnShutdownBegin();