summaryrefslogtreecommitdiff
path: root/src/citra_qt
diff options
context:
space:
mode:
Diffstat (limited to 'src/citra_qt')
-rw-r--r--src/citra_qt/CMakeLists.txt4
-rw-r--r--src/citra_qt/config.cpp10
-rw-r--r--src/citra_qt/debugger/callstack.cpp12
-rw-r--r--src/citra_qt/debugger/registers.cpp8
-rw-r--r--src/citra_qt/game_list.cpp18
-rw-r--r--src/citra_qt/main.cpp31
-rw-r--r--src/citra_qt/main.h1
-rw-r--r--src/citra_qt/main.ui9
8 files changed, 66 insertions, 27 deletions
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 747ad5519..bbf6ae001 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -72,7 +72,9 @@ else()
endif()
if (APPLE)
- add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS})
+ set(MACOSX_ICON "../../dist/citra.icns")
+ set_source_files_properties(${MACOSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+ add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS} ${MACOSX_ICON})
set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
else()
add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp
index 1f4981ce1..8e247ff5c 100644
--- a/src/citra_qt/config.cpp
+++ b/src/citra_qt/config.cpp
@@ -62,6 +62,11 @@ void Config::ReadValues() {
qt_config->beginGroup("Miscellaneous");
Settings::values.log_filter = qt_config->value("log_filter", "*:Info").toString().toStdString();
qt_config->endGroup();
+
+ qt_config->beginGroup("Debugging");
+ Settings::values.use_gdbstub = qt_config->value("use_gdbstub", false).toBool();
+ Settings::values.gdbstub_port = qt_config->value("gdbstub_port", 24689).toInt();
+ qt_config->endGroup();
}
void Config::SaveValues() {
@@ -97,6 +102,11 @@ void Config::SaveValues() {
qt_config->beginGroup("Miscellaneous");
qt_config->setValue("log_filter", QString::fromStdString(Settings::values.log_filter));
qt_config->endGroup();
+
+ qt_config->beginGroup("Debugging");
+ qt_config->setValue("use_gdbstub", Settings::values.use_gdbstub);
+ qt_config->setValue("gdbstub_port", Settings::values.gdbstub_port);
+ qt_config->endGroup();
}
void Config::Reload() {
diff --git a/src/citra_qt/debugger/callstack.cpp b/src/citra_qt/debugger/callstack.cpp
index d45eed179..793944639 100644
--- a/src/citra_qt/debugger/callstack.cpp
+++ b/src/citra_qt/debugger/callstack.cpp
@@ -29,18 +29,16 @@ CallstackWidget::CallstackWidget(QWidget* parent): QDockWidget(parent)
void CallstackWidget::OnDebugModeEntered()
{
- ARM_Interface* app_core = Core::g_app_core;
-
- u32 sp = app_core->GetReg(13); //stack pointer
- u32 ret_addr, call_addr, func_addr;
+ // Stack pointer
+ const u32 sp = Core::g_app_core->GetReg(13);
Clear();
int counter = 0;
for (u32 addr = 0x10000000; addr >= sp; addr -= 4)
{
- ret_addr = Memory::Read32(addr);
- call_addr = ret_addr - 4; //get call address???
+ const u32 ret_addr = Memory::Read32(addr);
+ const u32 call_addr = ret_addr - 4; //get call address???
if (Memory::GetPointer(call_addr) == nullptr)
break;
@@ -60,7 +58,7 @@ void CallstackWidget::OnDebugModeEntered()
// Pre-compute the left-shift and the prefetch offset
i_offset <<= 2;
i_offset += 8;
- func_addr = call_addr + i_offset;
+ const u32 func_addr = call_addr + i_offset;
callstack_model->setItem(counter, 0, new QStandardItem(QString("0x%1").arg(addr, 8, 16, QLatin1Char('0'))));
callstack_model->setItem(counter, 1, new QStandardItem(QString("0x%1").arg(ret_addr, 8, 16, QLatin1Char('0'))));
diff --git a/src/citra_qt/debugger/registers.cpp b/src/citra_qt/debugger/registers.cpp
index 6100d67c5..1bd0bfebc 100644
--- a/src/citra_qt/debugger/registers.cpp
+++ b/src/citra_qt/debugger/registers.cpp
@@ -59,16 +59,14 @@ RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) {
}
void RegistersWidget::OnDebugModeEntered() {
- ARM_Interface* app_core = Core::g_app_core;
-
- if (app_core == nullptr)
+ if (!Core::g_app_core)
return;
for (int i = 0; i < core_registers->childCount(); ++i)
- core_registers->child(i)->setText(1, QString("0x%1").arg(app_core->GetReg(i), 8, 16, QLatin1Char('0')));
+ core_registers->child(i)->setText(1, QString("0x%1").arg(Core::g_app_core->GetReg(i), 8, 16, QLatin1Char('0')));
for (int i = 0; i < vfp_registers->childCount(); ++i)
- vfp_registers->child(i)->setText(1, QString("0x%1").arg(app_core->GetVFPReg(i), 8, 16, QLatin1Char('0')));
+ vfp_registers->child(i)->setText(1, QString("0x%1").arg(Core::g_app_core->GetVFPReg(i), 8, 16, QLatin1Char('0')));
UpdateCPSRValues();
UpdateVFPSystemRegisterValues();
diff --git a/src/citra_qt/game_list.cpp b/src/citra_qt/game_list.cpp
index dade3c212..1f8d69a03 100644
--- a/src/citra_qt/game_list.cpp
+++ b/src/citra_qt/game_list.cpp
@@ -80,7 +80,7 @@ void GameList::DonePopulating()
void GameList::PopulateAsync(const QString& dir_path, bool deep_scan)
{
if (!FileUtil::Exists(dir_path.toStdString()) || !FileUtil::IsDirectory(dir_path.toStdString())) {
- LOG_ERROR(Frontend, "Could not find game list folder at %s", dir_path.toLatin1().data());
+ LOG_ERROR(Frontend, "Could not find game list folder at %s", dir_path.toLocal8Bit().data());
return;
}
@@ -119,13 +119,14 @@ void GameList::LoadInterfaceLayout(QSettings& settings)
void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, bool deep_scan)
{
- const auto callback = [&](const std::string& directory,
- const std::string& virtual_name) -> int {
+ const auto callback = [&](unsigned* num_entries_out,
+ const std::string& directory,
+ const std::string& virtual_name) -> bool {
std::string physical_name = directory + DIR_SEP + virtual_name;
if (stop_processing)
- return -1; // A negative return value breaks the callback loop.
+ return false; // Breaks the callback loop.
if (deep_scan && FileUtil::IsDirectory(physical_name)) {
AddFstEntriesToGameList(physical_name, true);
@@ -135,11 +136,11 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, bool d
Loader::FileType guessed_filetype = Loader::GuessFromExtension(filename_extension);
if (guessed_filetype == Loader::FileType::Unknown)
- return 0;
+ return true;
Loader::FileType filetype = Loader::IdentifyFile(physical_name);
if (filetype == Loader::FileType::Unknown) {
LOG_WARNING(Frontend, "File %s is of indeterminate type and is possibly corrupted.", physical_name.c_str());
- return 0;
+ return true;
}
if (guessed_filetype != filetype) {
LOG_WARNING(Frontend, "Filetype and extension of file %s do not match.", physical_name.c_str());
@@ -152,9 +153,10 @@ void GameListWorker::AddFstEntriesToGameList(const std::string& dir_path, bool d
});
}
- return 0; // We don't care about the found entries
+ return true;
};
- FileUtil::ScanDirectoryTreeAndCallback(dir_path, callback);
+
+ FileUtil::ForeachDirectoryEntry(nullptr, dir_path, callback);
}
void GameListWorker::run()
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index bf010a2ba..144f11117 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -44,6 +44,7 @@
#include "core/settings.h"
#include "core/system.h"
#include "core/arm/disassembler/load_symbol_map.h"
+#include "core/gdbstub/gdbstub.h"
#include "core/loader/loader.h"
#include "video_core/video_core.h"
@@ -143,6 +144,11 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
game_list->LoadInterfaceLayout(settings);
+ ui.action_Use_Gdbstub->setChecked(Settings::values.use_gdbstub);
+ SetGdbstubEnabled(ui.action_Use_Gdbstub->isChecked());
+
+ GDBStub::SetServerPort(static_cast<u32>(Settings::values.gdbstub_port));
+
ui.action_Use_Hardware_Renderer->setChecked(Settings::values.use_hw_renderer);
SetHardwareRendererEnabled(ui.action_Use_Hardware_Renderer->isChecked());
@@ -175,6 +181,7 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
connect(ui.action_Stop, SIGNAL(triggered()), this, SLOT(OnStopGame()));
connect(ui.action_Use_Hardware_Renderer, SIGNAL(triggered(bool)), this, SLOT(SetHardwareRendererEnabled(bool)));
connect(ui.action_Use_Shader_JIT, SIGNAL(triggered(bool)), this, SLOT(SetShaderJITEnabled(bool)));
+ connect(ui.action_Use_Gdbstub, SIGNAL(triggered(bool)), this, SLOT(SetGdbstubEnabled(bool)));
connect(ui.action_Single_Window_Mode, SIGNAL(triggered(bool)), this, SLOT(ToggleWindowMode()));
connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog()));
@@ -201,7 +208,7 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
show();
- game_list->PopulateAsync(settings.value("gameListRootDir").toString(), settings.value("gameListDeepScan").toBool());
+ game_list->PopulateAsync(settings.value("gameListRootDir", ".").toString(), settings.value("gameListDeepScan", false).toBool());
QStringList args = QApplication::arguments();
if (args.length() >= 2) {
@@ -240,7 +247,7 @@ void GMainWindow::OnDisplayTitleBars(bool show)
}
void GMainWindow::BootGame(const std::string& filename) {
- LOG_INFO(Frontend, "Citra starting...\n");
+ LOG_INFO(Frontend, "Citra starting...");
// Shutdown previous session if the emu thread is still active...
if (emu_thread != nullptr)
@@ -355,7 +362,7 @@ void GMainWindow::UpdateRecentFiles() {
}
void GMainWindow::OnGameListLoadFile(QString game_path) {
- BootGame(game_path.toLatin1().data());
+ BootGame(game_path.toLocal8Bit().data());
}
void GMainWindow::OnMenuLoadFile() {
@@ -367,7 +374,7 @@ void GMainWindow::OnMenuLoadFile() {
settings.setValue("romsPath", QFileInfo(filename).path());
StoreRecentFile(filename);
- BootGame(filename.toLatin1().data());
+ BootGame(filename.toLocal8Bit().data());
}
}
@@ -379,7 +386,7 @@ void GMainWindow::OnMenuLoadSymbolMap() {
if (!filename.isEmpty()) {
settings.setValue("symbolsPath", QFileInfo(filename).path());
- LoadSymbolMap(filename.toLatin1().data());
+ LoadSymbolMap(filename.toLocal8Bit().data());
}
}
@@ -400,7 +407,7 @@ void GMainWindow::OnMenuRecentFile() {
QString filename = action->data().toString();
QFileInfo file_info(filename);
if (file_info.exists()) {
- BootGame(filename.toLatin1().data());
+ BootGame(filename.toLocal8Bit().data());
StoreRecentFile(filename); // Put the filename on top of the list
} else {
// Display an error message and remove the file from the list.
@@ -443,10 +450,22 @@ void GMainWindow::OnOpenHotkeysDialog() {
void GMainWindow::SetHardwareRendererEnabled(bool enabled) {
VideoCore::g_hw_renderer_enabled = enabled;
+
+ Config config;
+ Settings::values.use_hw_renderer = enabled;
+ config.Save();
+}
+
+void GMainWindow::SetGdbstubEnabled(bool enabled) {
+ GDBStub::ToggleServer(enabled);
}
void GMainWindow::SetShaderJITEnabled(bool enabled) {
VideoCore::g_shader_jit_enabled = enabled;
+
+ Config config;
+ Settings::values.use_shader_jit = enabled;
+ config.Save();
}
void GMainWindow::ToggleWindowMode() {
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 6d27ce6a9..f6d429cd9 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -99,6 +99,7 @@ private slots:
void OnConfigure();
void OnDisplayTitleBars(bool);
void SetHardwareRendererEnabled(bool);
+ void SetGdbstubEnabled(bool);
void SetShaderJITEnabled(bool);
void ToggleWindowMode();
diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui
index 997597642..1e8a07cfb 100644
--- a/src/citra_qt/main.ui
+++ b/src/citra_qt/main.ui
@@ -75,6 +75,7 @@
<addaction name="separator"/>
<addaction name="action_Use_Hardware_Renderer"/>
<addaction name="action_Use_Shader_JIT"/>
+ <addaction name="action_Use_Gdbstub"/>
<addaction name="action_Configure"/>
</widget>
<widget class="QMenu" name="menu_View">
@@ -170,6 +171,14 @@
<string>Use Shader JIT</string>
</property>
</action>
+ <action name="action_Use_Gdbstub">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Use Gdbstub</string>
+ </property>
+ </action>
<action name="action_Configure">
<property name="text">
<string>Configure ...</string>