From ea640398f9d2a28a8807e618ab79c5b6a7960d00 Mon Sep 17 00:00:00 2001
From: WaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com>
Date: Sun, 6 Sep 2020 21:59:35 +0100
Subject: Add support for fullscreen hotkey (#748)

---
 src/frontend/qt_sdl/InputConfigDialog.cpp |  6 ++++--
 src/frontend/qt_sdl/InputConfigDialog.h   |  2 +-
 src/frontend/qt_sdl/PlatformConfig.cpp    |  2 ++
 src/frontend/qt_sdl/PlatformConfig.h      |  1 +
 src/frontend/qt_sdl/main.cpp              | 17 +++++++++++++++++
 src/frontend/qt_sdl/main.h                |  4 ++++
 6 files changed, 29 insertions(+), 3 deletions(-)

(limited to 'src/frontend/qt_sdl')

diff --git a/src/frontend/qt_sdl/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfigDialog.cpp
index 81baa65..2292441 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.cpp
+++ b/src/frontend/qt_sdl/InputConfigDialog.cpp
@@ -54,6 +54,7 @@ const int hk_general[] =
     HK_Reset,
     HK_FastForward,
     HK_FastForwardToggle,
+    HK_FullscreenToggle,
     HK_Lid,
     HK_Mic,
 };
@@ -64,6 +65,7 @@ const char* hk_general_labels[] =
     "Reset",
     "Fast forward",
     "Toggle FPS limit",
+    "Toggle Fullscreen",
     "Close/open lid",
     "Microphone",
 };
@@ -86,7 +88,7 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new
         addonsJoyMap[i] = Config::HKJoyMapping[hk_addons[i]];
     }
 
-    for (int i = 0; i < 6; i++)
+    for (int i = 0; i < 7; i++)
     {
         hkGeneralKeyMap[i] = Config::HKKeyMapping[hk_general[i]];
         hkGeneralJoyMap[i] = Config::HKJoyMapping[hk_general[i]];
@@ -94,7 +96,7 @@ InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new
 
     populatePage(ui->tabInput, 12, dskeylabels, keypadKeyMap, keypadJoyMap);
     populatePage(ui->tabAddons, 2, hk_addons_labels, addonsKeyMap, addonsJoyMap);
-    populatePage(ui->tabHotkeysGeneral, 6, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap);
+    populatePage(ui->tabHotkeysGeneral, 7, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap);
 
     int njoy = SDL_NumJoysticks();
     if (njoy > 0)
diff --git a/src/frontend/qt_sdl/InputConfigDialog.h b/src/frontend/qt_sdl/InputConfigDialog.h
index de57414..95e0532 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.h
+++ b/src/frontend/qt_sdl/InputConfigDialog.h
@@ -64,7 +64,7 @@ private:
 
     int keypadKeyMap[12],   keypadJoyMap[12];
     int addonsKeyMap[2],    addonsJoyMap[2];
-    int hkGeneralKeyMap[6], hkGeneralJoyMap[6];
+    int hkGeneralKeyMap[7], hkGeneralJoyMap[7];
 };
 
 
diff --git a/src/frontend/qt_sdl/PlatformConfig.cpp b/src/frontend/qt_sdl/PlatformConfig.cpp
index 4468d0e..c2d40c4 100644
--- a/src/frontend/qt_sdl/PlatformConfig.cpp
+++ b/src/frontend/qt_sdl/PlatformConfig.cpp
@@ -110,6 +110,7 @@ ConfigEntry PlatformConfigFile[] =
     {"HKKey_Reset",               0, &HKKeyMapping[HK_Reset],               -1, NULL, 0},
     {"HKKey_FastForward",         0, &HKKeyMapping[HK_FastForward],         -1, NULL, 0},
     {"HKKey_FastForwardToggle",   0, &HKKeyMapping[HK_FastForwardToggle],   -1, NULL, 0},
+    {"HKKey_FullscreenToggle",    0, &HKKeyMapping[HK_FullscreenToggle],    -1, NULL, 0},
     {"HKKey_SolarSensorDecrease", 0, &HKKeyMapping[HK_SolarSensorDecrease], -1, NULL, 0},
     {"HKKey_SolarSensorIncrease", 0, &HKKeyMapping[HK_SolarSensorIncrease], -1, NULL, 0},
 
@@ -119,6 +120,7 @@ ConfigEntry PlatformConfigFile[] =
     {"HKJoy_Reset",               0, &HKJoyMapping[HK_Reset],               -1, NULL, 0},
     {"HKJoy_FastForward",         0, &HKJoyMapping[HK_FastForward],         -1, NULL, 0},
     {"HKJoy_FastForwardToggle",   0, &HKJoyMapping[HK_FastForwardToggle],   -1, NULL, 0},
+    {"HKJoy_FastForwardToggle",   0, &HKJoyMapping[HK_FullscreenToggle],    -1, NULL, 0},
     {"HKJoy_SolarSensorDecrease", 0, &HKJoyMapping[HK_SolarSensorDecrease], -1, NULL, 0},
     {"HKJoy_SolarSensorIncrease", 0, &HKJoyMapping[HK_SolarSensorIncrease], -1, NULL, 0},
 
diff --git a/src/frontend/qt_sdl/PlatformConfig.h b/src/frontend/qt_sdl/PlatformConfig.h
index 9deee7f..ca03d80 100644
--- a/src/frontend/qt_sdl/PlatformConfig.h
+++ b/src/frontend/qt_sdl/PlatformConfig.h
@@ -29,6 +29,7 @@ enum
     HK_Reset,
     HK_FastForward,
     HK_FastForwardToggle,
+    HK_FullscreenToggle,
     HK_SolarSensorDecrease,
     HK_SolarSensorIncrease,
     HK_MAX
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index f8cdd24..9d2a2ca 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -266,6 +266,7 @@ EmuThread::EmuThread(QObject* parent) : QThread(parent)
     connect(this, SIGNAL(windowEmuPause()), mainWindow->actPause, SLOT(trigger()));
     connect(this, SIGNAL(windowEmuReset()), mainWindow->actReset, SLOT(trigger()));
     connect(this, SIGNAL(screenLayoutChange()), mainWindow->panel, SLOT(onScreenLayoutChanged()));
+    connect(this, SIGNAL(windowFullscreenToggle()), mainWindow, SLOT(onFullscreenToggled()));
 
     if (mainWindow->hasOGL) initOpenGL();
 }
@@ -364,6 +365,8 @@ void EmuThread::run()
 
         if (Input::HotkeyPressed(HK_Pause)) emit windowEmuPause();
         if (Input::HotkeyPressed(HK_Reset)) emit windowEmuReset();
+        
+        if (Input::HotkeyPressed(HK_FullscreenToggle)) emit windowFullscreenToggle();
 
         if (GBACart::CartInserted && GBACart::HasSolarSensor)
         {
@@ -1878,6 +1881,20 @@ void MainWindow::onTitleUpdate(QString title)
     setWindowTitle(title);
 }
 
+void MainWindow::onFullscreenToggled()
+{
+    if (!mainWindow->isFullScreen()) 
+    {
+        mainWindow->showFullScreen(); 
+        mainWindow->menuBar()->hide();
+    }
+    else
+    {
+        mainWindow->showNormal();
+        mainWindow->menuBar()->show();
+    }
+}
+
 void MainWindow::onEmuStart()
 {
     // TODO: make savestates work in DSi mode!!
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index cad30d6..6ae5122 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -69,6 +69,8 @@ signals:
     void windowLimitFPSChange();
 
     void screenLayoutChange();
+    
+    void windowFullscreenToggle();
 
 private:
     volatile int EmuStatus;
@@ -229,6 +231,8 @@ private slots:
     void onEmuStop();
 
     void onUpdateVideoSettings(bool glchange);
+    
+    void onFullscreenToggled();
 
 private:
     void createScreenPanel();
-- 
cgit v1.2.3


From f2fa52f26ceb1f385d58e57ab26ca7d5349978d2 Mon Sep 17 00:00:00 2001
From: RSDuck <rsduck@users.noreply.github.com>
Date: Fri, 11 Sep 2020 03:08:06 +0200
Subject: add functionality to import savefiles

---
 src/NDS.cpp                  |  5 +++++
 src/NDS.h                    |  2 ++
 src/NDSCart.cpp              |  6 ++++++
 src/NDSCart.h                |  2 ++
 src/frontend/FrontendUtil.h  |  3 +++
 src/frontend/Util_ROM.cpp    | 15 +++++++++++++++
 src/frontend/qt_sdl/main.cpp | 41 +++++++++++++++++++++++++++++++++++++++++
 src/frontend/qt_sdl/main.h   |  2 ++
 8 files changed, 76 insertions(+)

(limited to 'src/frontend/qt_sdl')

diff --git a/src/NDS.cpp b/src/NDS.cpp
index 20f149a..90149ad 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -1124,6 +1124,11 @@ void MicInputFrame(s16* data, int samples)
     return SPI_TSC::MicInputFrame(data, samples);
 }
 
+int ImportSRAM(u8* data, u32 length)
+{
+    return NDSCart::ImportSRAM(data, length);
+}
+
 
 void Halt()
 {
diff --git a/src/NDS.h b/src/NDS.h
index 91bfd1c..046d84b 100644
--- a/src/NDS.h
+++ b/src/NDS.h
@@ -211,6 +211,8 @@ void SetLidClosed(bool closed);
 
 void MicInputFrame(s16* data, int samples);
 
+int ImportSRAM(u8* data, u32 length);
+
 void ScheduleEvent(u32 id, bool periodic, s32 delay, void (*func)(u32), u32 param);
 void CancelEvent(u32 id);
 
diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp
index 6abfc7c..5710213 100644
--- a/src/NDSCart.cpp
+++ b/src/NDSCart.cpp
@@ -1034,6 +1034,12 @@ void RelocateSave(const char* path, bool write)
     NDSCart_SRAM::RelocateSave(path, write);
 }
 
+int ImportSRAM(const u8* data, u32 length)
+{
+    memcpy(NDSCart_SRAM::SRAM, data, std::min(length, NDSCart_SRAM::SRAMLength));
+    return length - NDSCart_SRAM::SRAMLength;
+}
+
 void ResetCart()
 {
     // CHECKME: what if there is a transfer in progress?
diff --git a/src/NDSCart.h b/src/NDSCart.h
index a759c15..9fe916d 100644
--- a/src/NDSCart.h
+++ b/src/NDSCart.h
@@ -48,6 +48,8 @@ void DecryptSecureArea(u8* out);
 bool LoadROM(const char* path, const char* sram, bool direct);
 void RelocateSave(const char* path, bool write);
 
+int ImportSRAM(const u8* data, u32 length);
+
 void ResetCart();
 
 void WriteROMCnt(u32 val);
diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h
index d30c4e1..caac9f0 100644
--- a/src/frontend/FrontendUtil.h
+++ b/src/frontend/FrontendUtil.h
@@ -100,6 +100,9 @@ bool SaveState(const char* filename);
 // undo the latest savestate load
 void UndoStateLoad();
 
+// imports savedata from an external file. Returns the difference between the filesize and the SRAM size
+int ImportSRAM(const char* filename);
+
 // enable or disable cheats
 void EnableCheats(bool enable);
 
diff --git a/src/frontend/Util_ROM.cpp b/src/frontend/Util_ROM.cpp
index 716ed04..f61c3e3 100644
--- a/src/frontend/Util_ROM.cpp
+++ b/src/frontend/Util_ROM.cpp
@@ -588,6 +588,21 @@ void UndoStateLoad()
     }
 }
 
+int ImportSRAM(const char* filename)
+{
+    FILE* file = fopen(filename, "rb");
+    fseek(file, 0, SEEK_END);
+    u32 size = ftell(file);
+    u8* importData = new u8[size];
+    rewind(file);
+    fread(importData, size, 1, file);
+    fclose(file);
+
+    int diff = NDS::ImportSRAM(importData, size);
+    delete[] importData;
+    return diff;
+}
+
 void EnableCheats(bool enable)
 {
     CheatsOn = enable;
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index 9d2a2ca..1900998 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -1052,6 +1052,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
         actUndoStateLoad->setShortcut(QKeySequence(Qt::Key_F12));
         connect(actUndoStateLoad, &QAction::triggered, this, &MainWindow::onUndoStateLoad);
 
+        actImportSavefile = menu->addAction("Import savefile");
+        connect(actImportSavefile, &QAction::triggered, this, &MainWindow::onImportSavefile);
+
         menu->addSeparator();
 
         actQuit = menu->addAction("Quit");
@@ -1220,6 +1223,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
         actLoadState[i]->setEnabled(false);
     }
     actUndoStateLoad->setEnabled(false);
+    actImportSavefile->setEnabled(false);
 
     actPause->setEnabled(false);
     actReset->setEnabled(false);
@@ -1618,6 +1622,41 @@ void MainWindow::onUndoStateLoad()
     OSD::AddMessage(0, "State load undone");
 }
 
+void MainWindow::onImportSavefile()
+{
+    if (!RunningSomething) return;
+
+    emuThread->emuPause();
+    QString path = QFileDialog::getOpenFileName(this,
+                                            "Select savefile",
+                                            Config::LastROMFolder,
+                                            "Savefiles (*.sav *.bin *.dsv);;Any file (*.*)");
+
+    if (!path.isEmpty())
+    {
+        if (QMessageBox::warning(this,
+                        "Emulation will be reset and data overwritten",
+                        "The emulation will be reset and the current savefile overwritten.",
+                        QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
+        {
+            int res = Frontend::Reset();
+            if (res != Frontend::Load_OK)
+            {
+                QMessageBox::critical(this, "melonDS", "Reset failed\n" + loadErrorStr(res));
+            }
+            else
+            {
+                int diff = Frontend::ImportSRAM(path.toStdString().c_str());
+                if (diff > 0)
+                    OSD::AddMessage(0, "Trimmed savefile");
+                else if (diff < 0)
+                    OSD::AddMessage(0, "Savefile shorter than SRAM");
+            }
+        }
+    }
+    emuThread->emuUnpause();
+}
+
 void MainWindow::onQuit()
 {
     QApplication::quit();
@@ -1923,6 +1962,7 @@ void MainWindow::onEmuStart()
     actPause->setChecked(false);
     actReset->setEnabled(true);
     actStop->setEnabled(true);
+    actImportSavefile->setEnabled(true);
 
     actSetupCheats->setEnabled(true);
 }
@@ -1937,6 +1977,7 @@ void MainWindow::onEmuStop()
         actLoadState[i]->setEnabled(false);
     }
     actUndoStateLoad->setEnabled(false);
+    actImportSavefile->setEnabled(false);
 
     actPause->setEnabled(false);
     actReset->setEnabled(false);
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 6ae5122..978df9e 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -195,6 +195,7 @@ private slots:
     void onSaveState();
     void onLoadState();
     void onUndoStateLoad();
+    void onImportSavefile();
     void onQuit();
 
     void onPause(bool checked);
@@ -247,6 +248,7 @@ public:
     QAction* actSaveState[9];
     QAction* actLoadState[9];
     QAction* actUndoStateLoad;
+    QAction* actImportSavefile;
     QAction* actQuit;
 
     QAction* actPause;
-- 
cgit v1.2.3


From 697730240394cd9fedcf7924f29ffa625fc784fd Mon Sep 17 00:00:00 2001
From: RSDuck <rsduck@users.noreply.github.com>
Date: Wed, 30 Sep 2020 23:58:42 +0200
Subject: make OpenGL renderer a build option mostly meant for the Switch port

---
 CMakeLists.txt                              |  6 ++++++
 src/CMakeLists.txt                          | 31 ++++++++++++++++++++---------
 src/GPU.cpp                                 | 13 ++++++++++--
 src/GPU.h                                   |  2 ++
 src/GPU2D.cpp                               |  2 ++
 src/GPU3D.cpp                               |  6 ++++++
 src/GPU3D.h                                 |  2 ++
 src/frontend/qt_sdl/VideoSettingsDialog.cpp |  4 ++++
 src/frontend/qt_sdl/main.cpp                | 12 +++++++++++
 9 files changed, 67 insertions(+), 11 deletions(-)

(limited to 'src/frontend/qt_sdl')

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6729e73..8b8d699 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -50,6 +50,12 @@ else()
 	option(ENABLE_LTO "Enable link-time optimization" OFF)
 endif()
 
+option(ENABLE_OGLRENDERER "Enable OpenGL renderer" ON)
+
+if (ENABLE_OGLRENDERER)
+    add_definitions(-DOGLRENDERER_ENABLED)
+endif()
+
 if (CMAKE_BUILD_TYPE STREQUAL Debug)
 	add_compile_options(-Og)
 endif()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8839fc2..d6c3897 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -26,17 +26,12 @@ add_library(core STATIC
 	FIFO.h
 	GBACart.cpp
 	GPU.cpp
-	GPU_OpenGL.cpp
-	GPU_OpenGL_shaders.h
 	GPU2D.cpp
 	GPU3D.cpp
-	GPU3D_OpenGL.cpp
-	GPU3D_OpenGL_shaders.h
 	GPU3D_Soft.cpp
 	melonDLDI.h
 	NDS.cpp
 	NDSCart.cpp
-	OpenGLSupport.cpp
 	Platform.h
 	ROMList.h
 	RTC.cpp
@@ -52,6 +47,16 @@ add_library(core STATIC
 	xxhash/xxhash.c
 )
 
+if (ENABLE_OGLRENDERER)
+	target_sources(core PRIVATE
+		GPU_OpenGL.cpp
+		GPU_OpenGL_shaders.h
+		GPU3D_OpenGL.cpp
+		GPU3D_OpenGL_shaders.h
+		OpenGLSupport.cpp
+	)
+endif()
+
 if (ENABLE_JIT)
 	enable_language(ASM)
 
@@ -95,8 +100,16 @@ if (ENABLE_JIT)
 	endif()
 endif()
 
-if (WIN32)
-	target_link_libraries(core ole32 comctl32 ws2_32 opengl32)
+if (ENABLE_OGLRENDERER)
+	if (WIN32)
+		target_link_libraries(core ole32 comctl32 ws2_32 opengl32)
+	else()
+		target_link_libraries(core GL EGL)
+	endif()
 else()
-	target_link_libraries(core GL EGL)
-endif()
+	if (WIN32)
+		target_link_libraries(core ole32 comctl32 ws2_32)
+	else()
+		target_link_libraries(core)
+	endif()
+endif()
\ No newline at end of file
diff --git a/src/GPU.cpp b/src/GPU.cpp
index 29867db..7989750 100644
--- a/src/GPU.cpp
+++ b/src/GPU.cpp
@@ -280,6 +280,7 @@ void AssignFramebuffers()
 
 void InitRenderer(int renderer)
 {
+#ifdef OGLRENDERER_ENABLED
     if (renderer == 1)
     {
         if (!GLCompositor::Init())
@@ -292,8 +293,8 @@ void InitRenderer(int renderer)
             renderer = 0;
         }
     }
-
-    if (renderer == 0)
+    else
+#endif
     {
         GPU3D::SoftRenderer::Init();
     }
@@ -308,11 +309,13 @@ void DeInitRenderer()
     {
         GPU3D::SoftRenderer::DeInit();
     }
+#ifdef OGLRENDERER_ENABLED
     else
     {
         GPU3D::GLRenderer::DeInit();
         GLCompositor::DeInit();
     }
+#endif
 }
 
 void ResetRenderer()
@@ -321,11 +324,13 @@ void ResetRenderer()
     {
         GPU3D::SoftRenderer::Reset();
     }
+#ifdef OGLRENDERER_ENABLED
     else
     {
         GLCompositor::Reset();
         GPU3D::GLRenderer::Reset();
     }
+#endif
 }
 
 void SetRenderSettings(int renderer, RenderSettings& settings)
@@ -364,11 +369,13 @@ void SetRenderSettings(int renderer, RenderSettings& settings)
     {
         GPU3D::SoftRenderer::SetRenderSettings(settings);
     }
+#ifdef OGLRENDERER_ENABLED
     else
     {
         GLCompositor::SetRenderSettings(settings);
         GPU3D::GLRenderer::SetRenderSettings(settings);
     }
+#endif
 }
 
 
@@ -1055,7 +1062,9 @@ void StartScanline(u32 line)
             GPU2D_B->VBlank();
             GPU3D::VBlank();
 
+#ifdef OGLRENDERER_ENABLED
             if (Accelerated) GLCompositor::RenderFrame();
+#endif
         }
         else if (VCount == 144)
         {
diff --git a/src/GPU.h b/src/GPU.h
index c7d25ec..1564ef7 100644
--- a/src/GPU.h
+++ b/src/GPU.h
@@ -437,6 +437,7 @@ void SetDispStat(u32 cpu, u16 val);
 
 void SetVCount(u16 val);
 
+#ifdef OGLRENDERER_ENABLED
 namespace GLCompositor
 {
 
@@ -450,6 +451,7 @@ void RenderFrame();
 void BindOutputTexture();
 
 }
+#endif
 
 }
 
diff --git a/src/GPU2D.cpp b/src/GPU2D.cpp
index 7964aa4..7774c65 100644
--- a/src/GPU2D.cpp
+++ b/src/GPU2D.cpp
@@ -949,6 +949,7 @@ void GPU2D::VBlankEnd()
     //OBJMosaicY = 0;
     //OBJMosaicYCount = 0;
 
+#ifdef OGLRENDERER_ENABLED
     if (Accelerated)
     {
         if ((Num == 0) && (CaptureCnt & (1<<31)) && (((CaptureCnt >> 29) & 0x3) != 1))
@@ -956,6 +957,7 @@ void GPU2D::VBlankEnd()
             GPU3D::GLRenderer::PrepareCaptureFrame();
         }
     }
+#endif
 }
 
 
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index 5ccacf4..74debfe 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -2528,13 +2528,19 @@ void VBlank()
 void VCount215()
 {
     if (GPU::Renderer == 0) SoftRenderer::RenderFrame();
+#ifdef OGLRENDERER_ENABLED
     else                    GLRenderer::RenderFrame();
+#endif
 }
 
 u32* GetLine(int line)
 {
     if (GPU::Renderer == 0) return SoftRenderer::GetLine(line);
+#ifdef OGLRENDERER_ENABLED
     else                    return GLRenderer::GetLine(line);
+#else
+    return NULL;
+#endif
 }
 
 
diff --git a/src/GPU3D.h b/src/GPU3D.h
index 71f069d..c69adde 100644
--- a/src/GPU3D.h
+++ b/src/GPU3D.h
@@ -139,6 +139,7 @@ u32* GetLine(int line);
 
 }
 
+#ifdef OGLRENDERER_ENABLED
 namespace GLRenderer
 {
 
@@ -154,6 +155,7 @@ u32* GetLine(int line);
 void SetupAccelFrame();
 
 }
+#endif
 
 }
 
diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.cpp b/src/frontend/qt_sdl/VideoSettingsDialog.cpp
index 971fee7..1397ccd 100644
--- a/src/frontend/qt_sdl/VideoSettingsDialog.cpp
+++ b/src/frontend/qt_sdl/VideoSettingsDialog.cpp
@@ -50,6 +50,10 @@ VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(
     connect(grp3DRenderer, SIGNAL(buttonClicked(int)), this, SLOT(onChange3DRenderer(int)));
     grp3DRenderer->button(Config::_3DRenderer)->setChecked(true);
 
+#ifndef OGLRENDERER_ENABLED
+    ui->rb3DOpenGL->setEnabled(false);
+#endif
+
     ui->cbGLDisplay->setChecked(Config::ScreenUseGL != 0);
 
     ui->cbVSync->setChecked(Config::ScreenVSync != 0);
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index 1900998..e0c12e3 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -49,7 +49,9 @@
 
 #include "NDS.h"
 #include "GBACart.h"
+#ifdef OGLRENDERER_ENABLED
 #include "OpenGLSupport.h"
+#endif
 #include "GPU.h"
 #include "SPU.h"
 #include "Wifi.h"
@@ -336,13 +338,17 @@ void EmuThread::run()
     videoSettings.Soft_Threaded = Config::Threaded3D != 0;
     videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor;
 
+#ifdef OGLRENDERER_ENABLED
     if (hasOGL)
     {
         oglContext->makeCurrent(oglSurface);
         videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0;
     }
     else
+#endif
+    {
         videoRenderer = 0;
+    }
 
     GPU::InitRenderer(videoRenderer);
     GPU::SetRenderSettings(videoRenderer, videoSettings);
@@ -396,13 +402,17 @@ void EmuThread::run()
                 if (hasOGL != mainWindow->hasOGL)
                 {
                     hasOGL = mainWindow->hasOGL;
+#ifdef OGLRENDERER_ENABLED
                     if (hasOGL)
                     {
                         oglContext->makeCurrent(oglSurface);
                         videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0;
                     }
                     else
+#endif
+                    {
                         videoRenderer = 0;
+                    }
                 }
                 else
                     videoRenderer = hasOGL ? Config::_3DRenderer : 0;
@@ -923,12 +933,14 @@ void ScreenPanelGL::paintGL()
     int frontbuf = GPU::FrontBuffer;
     glActiveTexture(GL_TEXTURE0);
 
+#ifdef OGLRENDERER_ENABLED
     if (GPU::Renderer != 0)
     {
         // hardware-accelerated render
         GPU::GLCompositor::BindOutputTexture();
     }
     else
+#endif
     {
         // regular render
         glBindTexture(GL_TEXTURE_2D, screenTexture);
-- 
cgit v1.2.3


From 0d845c9e69e19046f351ce396da8eec150243387 Mon Sep 17 00:00:00 2001
From: Valeri <v19930312@gmail.com>
Date: Thu, 1 Oct 2020 14:44:09 +0300
Subject: Random minor fixes (#757)

* Fix incorrect/questionable assert() usage

Originally reported by https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2159000700,
but also includes a bunch of other fixes.

* Fix some `printf` warnings

Rule https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2160310550

* Remove useless check

It is never passed thanks to `if (num_in < 1) {...; return}` before
Rule https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2154840804

* Add missing header guard, rename other to avoid conflicts

Rule https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2163210746

* Make DSi_SDDevice destructor virtual

Rule https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2158670642

* Use thread-safe localtime_r, assign `time` result directly

Rule https://lgtm.com/projects/g/Arisotura/melonDS/?mode=tree&ruleFocus=2154840805

* Fix MinGW build

It needs _POSIX_THREAD_SAFE_FUNCTIONS to export `localtime_r`
---
 src/ARMJIT_A64/ARMJIT_Compiler.h          |  6 ++---
 src/ARMJIT_A64/ARMJIT_LoadStore.cpp       |  4 +--
 src/ARMJIT_Compiler.h                     |  7 +++++-
 src/ARMJIT_RegisterCache.h                |  3 ++-
 src/ARMJIT_x64/ARMJIT_ALU.cpp             |  7 +++---
 src/ARMJIT_x64/ARMJIT_Compiler.h          |  6 ++---
 src/ARMJIT_x64/ARMJIT_LoadStore.cpp       |  4 +--
 src/Config.cpp                            |  2 +-
 src/DSi_SD.h                              |  2 +-
 src/RTC.cpp                               | 41 ++++++++++++++++---------------
 src/frontend/qt_sdl/InputConfigDialog.cpp |  2 +-
 src/frontend/qt_sdl/main.cpp              |  1 -
 12 files changed, 46 insertions(+), 39 deletions(-)

(limited to 'src/frontend/qt_sdl')

diff --git a/src/ARMJIT_A64/ARMJIT_Compiler.h b/src/ARMJIT_A64/ARMJIT_Compiler.h
index 0e7d54c..af7497a 100644
--- a/src/ARMJIT_A64/ARMJIT_Compiler.h
+++ b/src/ARMJIT_A64/ARMJIT_Compiler.h
@@ -1,5 +1,5 @@
-#ifndef ARMJIT_COMPILER_H
-#define ARMJIT_COMPILER_H
+#ifndef ARMJIT_A64_COMPILER_H
+#define ARMJIT_A64_COMPILER_H
 
 #include "../ARM.h"
 #include "../ARMJIT.h"
@@ -266,4 +266,4 @@ public:
 
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
index 14aa847..86e257a 100644
--- a/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
+++ b/src/ARMJIT_A64/ARMJIT_LoadStore.cpp
@@ -42,7 +42,7 @@ s64 Compiler::RewriteMemAccess(u64 pc)
         return patch.PatchOffset;
     }
     printf("this is a JIT bug! %08x\n", __builtin_bswap32(*(u32*)pc));
-    assert(false);
+    abort();
 }
 
 bool Compiler::Comp_MemLoadLiteral(int size, bool signExtend, int rd, u32 addr)
@@ -807,4 +807,4 @@ void Compiler::T_Comp_LDMIA_STMIA()
     }
 }
 
-}
\ No newline at end of file
+}
diff --git a/src/ARMJIT_Compiler.h b/src/ARMJIT_Compiler.h
index 513c103..25a0210 100644
--- a/src/ARMJIT_Compiler.h
+++ b/src/ARMJIT_Compiler.h
@@ -1,3 +1,6 @@
+#ifndef ARMJIT_COMPILER_H
+#define ARMJIT_COMPILER_H
+
 #if defined(__x86_64__)
 #include "ARMJIT_x64/ARMJIT_Compiler.h"
 #elif defined(__aarch64__)
@@ -9,4 +12,6 @@
 namespace ARMJIT
 {
 extern Compiler* JITCompiler;
-}
\ No newline at end of file
+}
+
+#endif
diff --git a/src/ARMJIT_RegisterCache.h b/src/ARMJIT_RegisterCache.h
index feb2d35..b11255e 100644
--- a/src/ARMJIT_RegisterCache.h
+++ b/src/ARMJIT_RegisterCache.h
@@ -61,7 +61,8 @@ public:
             }
         }
 
-        assert("Welp!");
+        printf("this is a JIT bug! LoadRegister failed\n");
+        abort();
     }
 
     void PutLiteral(int reg, u32 val)
diff --git a/src/ARMJIT_x64/ARMJIT_ALU.cpp b/src/ARMJIT_x64/ARMJIT_ALU.cpp
index 24d22ed..511b3b1 100644
--- a/src/ARMJIT_x64/ARMJIT_ALU.cpp
+++ b/src/ARMJIT_x64/ARMJIT_ALU.cpp
@@ -209,7 +209,8 @@ void Compiler::A_Comp_Arith()
         Comp_ArithTriOp(&Compiler::AND, rd, rn, op2, carryUsed, sFlag|opSymmetric|opInvertOp2);
         break;
     default:
-        assert("unimplemented");
+        printf("this is a JIT bug! %04x\n", op);
+        abort();
     }
 
     if (CurInstr.A_Reg(12) == 15)
@@ -566,7 +567,7 @@ OpArg Compiler::Comp_RegShiftImm(int op, int amount, OpArg rm, bool S, bool& car
         return R(RSCRATCH);
     }
 
-    assert(false);
+    abort();
 }
 
 void Compiler::T_Comp_ShiftImm()
@@ -779,4 +780,4 @@ void Compiler::T_Comp_RelAddr()
         MOV(32, rd, Imm32((R15 & ~2) + offset));
 }
 
-}
\ No newline at end of file
+}
diff --git a/src/ARMJIT_x64/ARMJIT_Compiler.h b/src/ARMJIT_x64/ARMJIT_Compiler.h
index 9a64d09..3e900c3 100644
--- a/src/ARMJIT_x64/ARMJIT_Compiler.h
+++ b/src/ARMJIT_x64/ARMJIT_Compiler.h
@@ -1,5 +1,5 @@
-#ifndef ARMJIT_COMPILER_H
-#define ARMJIT_COMPILER_H
+#ifndef ARMJIT_X64_COMPILER_H
+#define ARMJIT_X64_COMPILER_H
 
 #include "../dolphin/x64Emitter.h"
 
@@ -252,4 +252,4 @@ public:
 
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/ARMJIT_x64/ARMJIT_LoadStore.cpp b/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
index 1be6608..8b4e8fe 100644
--- a/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
+++ b/src/ARMJIT_x64/ARMJIT_LoadStore.cpp
@@ -39,7 +39,7 @@ s32 Compiler::RewriteMemAccess(u64 pc)
         return patch.Offset;
     }
 
-    printf("this is a JIT bug %x\n", pc);
+    printf("this is a JIT bug %llx\n", pc);
     abort();
 }
 
@@ -819,4 +819,4 @@ void Compiler::T_Comp_LDMIA_STMIA()
         ADD(32, rb, Imm8(offset));
 }
 
-}
\ No newline at end of file
+}
diff --git a/src/Config.cpp b/src/Config.cpp
index 2c5fd2c..8bda9ae 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -169,7 +169,7 @@ void Save()
         if (entry->Type == 0)
             fprintf(f, "%s=%d\n", entry->Name, *(int*)entry->Value);
         else
-            fprintf(f, "%s=%s\n", entry->Name, entry->Value);
+            fprintf(f, "%s=%s\n", entry->Name, (char*)entry->Value);
 
         entry++;
     }
diff --git a/src/DSi_SD.h b/src/DSi_SD.h
index 30da6c7..43f5a98 100644
--- a/src/DSi_SD.h
+++ b/src/DSi_SD.h
@@ -103,7 +103,7 @@ class DSi_SDDevice
 {
 public:
     DSi_SDDevice(DSi_SDHost* host) { Host = host; IRQ = false; }
-    ~DSi_SDDevice() {}
+    virtual ~DSi_SDDevice() {}
 
     virtual void Reset() = 0;
 
diff --git a/src/RTC.cpp b/src/RTC.cpp
index ba51dff..aff3dd3 100644
--- a/src/RTC.cpp
+++ b/src/RTC.cpp
@@ -16,6 +16,9 @@
     with melonDS. If not, see http://www.gnu.org/licenses/.
 */
 
+// Required by MinGW to enable localtime_r in time.h
+#define _POSIX_THREAD_SAFE_FUNCTIONS
+
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
@@ -125,31 +128,29 @@ void ByteIn(u8 val)
 
             case 0x20:
                 {
-                    time_t timestamp;
-                    struct tm* timedata;
-                    time(&timestamp);
-                    timedata = localtime(&timestamp);
-
-                    Output[0] = BCD(timedata->tm_year - 100);
-                    Output[1] = BCD(timedata->tm_mon + 1);
-                    Output[2] = BCD(timedata->tm_mday);
-                    Output[3] = BCD(timedata->tm_wday);
-                    Output[4] = BCD(timedata->tm_hour);
-                    Output[5] = BCD(timedata->tm_min);
-                    Output[6] = BCD(timedata->tm_sec);
+                    time_t timestamp = time(NULL);
+                    struct tm timedata;
+                    localtime_r(&timestamp, &timedata);
+
+                    Output[0] = BCD(timedata.tm_year - 100);
+                    Output[1] = BCD(timedata.tm_mon + 1);
+                    Output[2] = BCD(timedata.tm_mday);
+                    Output[3] = BCD(timedata.tm_wday);
+                    Output[4] = BCD(timedata.tm_hour);
+                    Output[5] = BCD(timedata.tm_min);
+                    Output[6] = BCD(timedata.tm_sec);
                 }
                 break;
 
             case 0x60:
                 {
-                    time_t timestamp;
-                    struct tm* timedata;
-                    time(&timestamp);
-                    timedata = localtime(&timestamp);
-
-                    Output[0] = BCD(timedata->tm_hour);
-                    Output[1] = BCD(timedata->tm_min);
-                    Output[2] = BCD(timedata->tm_sec);
+                    time_t timestamp = time(NULL);
+                    struct tm timedata;
+                    localtime_r(&timestamp, &timedata);
+
+                    Output[0] = BCD(timedata.tm_hour);
+                    Output[1] = BCD(timedata.tm_min);
+                    Output[2] = BCD(timedata.tm_sec);
                 }
                 break;
 
diff --git a/src/frontend/qt_sdl/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfigDialog.cpp
index 2292441..522b16c 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.cpp
+++ b/src/frontend/qt_sdl/InputConfigDialog.cpp
@@ -228,7 +228,7 @@ void KeyMapButton::keyPressEvent(QKeyEvent* event)
 {
     if (!isChecked()) return QPushButton::keyPressEvent(event);
 
-    printf("KEY PRESSED = %08X %08X | %08X %08X %08X\n", event->key(), event->modifiers(), event->nativeVirtualKey(), event->nativeModifiers(), event->nativeScanCode());
+    printf("KEY PRESSED = %08X %08X | %08X %08X %08X\n", event->key(), (int)event->modifiers(), event->nativeVirtualKey(), event->nativeModifiers(), event->nativeScanCode());
 
     int key = event->key();
     int mod = event->modifiers();
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index e0c12e3..3a735fb 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -115,7 +115,6 @@ void audioCallback(void* data, Uint8* stream, int len)
     if (num_in < len_in-margin)
     {
         int last = num_in-1;
-        if (last < 0) last = 0;
 
         for (int i = num_in; i < len_in-margin; i++)
             ((u32*)buf_in)[i] = ((u32*)buf_in)[last];
-- 
cgit v1.2.3


From f8c4bf6db140f590f2cf781e9da67ed208bd47f5 Mon Sep 17 00:00:00 2001
From: kyandora <71771686+kyandora@users.noreply.github.com>
Date: Wed, 7 Oct 2020 01:33:11 +0200
Subject: save microphone hotkeys (#781)

---
 src/frontend/qt_sdl/InputConfigDialog.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/frontend/qt_sdl')

diff --git a/src/frontend/qt_sdl/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfigDialog.cpp
index 522b16c..9f08731 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.cpp
+++ b/src/frontend/qt_sdl/InputConfigDialog.cpp
@@ -179,7 +179,7 @@ void InputConfigDialog::on_InputConfigDialog_accepted()
         Config::HKJoyMapping[hk_addons[i]] = addonsJoyMap[i];
     }
 
-    for (int i = 0; i < 6; i++)
+    for (int i = 0; i < 7; i++)
     {
         Config::HKKeyMapping[hk_general[i]] = hkGeneralKeyMap[i];
         Config::HKJoyMapping[hk_general[i]] = hkGeneralJoyMap[i];
-- 
cgit v1.2.3


From dc46da0e24666c67c1780b24e58151d31d8ba34c Mon Sep 17 00:00:00 2001
From: Madhav Kanbur <abcdjdj@gmail.com>
Date: Tue, 13 Oct 2020 11:02:58 +0530
Subject: Input : Treat numpad keys as keypresses

Typically, modifiers are masked out of keypresses to distinguish
between hotkeys and keypresses. This patch prevents the numpad
modifier from getting masked out in KeyPress() and KeyRelease().

Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
---
 src/frontend/qt_sdl/Input.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

(limited to 'src/frontend/qt_sdl')

diff --git a/src/frontend/qt_sdl/Input.cpp b/src/frontend/qt_sdl/Input.cpp
index 84d20ad..11b64cc 100644
--- a/src/frontend/qt_sdl/Input.cpp
+++ b/src/frontend/qt_sdl/Input.cpp
@@ -98,7 +98,9 @@ int GetEventKeyVal(QKeyEvent* event)
 void KeyPress(QKeyEvent* event)
 {
     int keyHK = GetEventKeyVal(event);
-    int keyKP = keyHK & ~event->modifiers();
+    int keyKP = keyHK;
+    if (event->modifiers() != Qt::KeypadModifier)
+        keyKP &= ~event->modifiers();
 
     for (int i = 0; i < 12; i++)
         if (keyKP == Config::KeyMapping[i])
@@ -112,7 +114,9 @@ void KeyPress(QKeyEvent* event)
 void KeyRelease(QKeyEvent* event)
 {
     int keyHK = GetEventKeyVal(event);
-    int keyKP = keyHK & ~event->modifiers();
+    int keyKP = keyHK;
+    if (event->modifiers() != Qt::KeypadModifier)
+        keyKP &= ~event->modifiers();
 
     for (int i = 0; i < 12; i++)
         if (keyKP == Config::KeyMapping[i])
-- 
cgit v1.2.3