diff options
| author | 2015-04-16 18:35:09 -0400 | |
|---|---|---|
| committer | 2015-05-01 18:26:58 -0400 | |
| commit | 762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf (patch) | |
| tree | 74ac7be2a6f1b3dfd09986b598844440af9e2f8f /src | |
| parent | Merge pull request #717 from linkmauve/useless-auto (diff) | |
| download | yuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.tar.gz yuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.tar.xz yuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.zip | |
Qt: Move EmuThread ownership from render window to main window.
Diffstat (limited to 'src')
| -rw-r--r-- | src/citra_qt/bootmanager.cpp | 27 | ||||
| -rw-r--r-- | src/citra_qt/bootmanager.h | 14 | ||||
| -rw-r--r-- | src/citra_qt/debugger/disassembler.cpp | 18 | ||||
| -rw-r--r-- | src/citra_qt/debugger/disassembler.h | 6 | ||||
| -rw-r--r-- | src/citra_qt/main.cpp | 55 | ||||
| -rw-r--r-- | src/citra_qt/main.h | 6 |
6 files changed, 57 insertions, 69 deletions
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index b81bd6167..50c8fed1e 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include "common/common.h" | 11 | #include "common/common.h" |
| 12 | #include "bootmanager.h" | 12 | #include "bootmanager.h" |
| 13 | #include "main.h" | ||
| 13 | 14 | ||
| 14 | #include "core/core.h" | 15 | #include "core/core.h" |
| 15 | #include "core/settings.h" | 16 | #include "core/settings.h" |
| @@ -30,6 +31,7 @@ EmuThread::EmuThread(GRenderWindow* render_window) : | |||
| 30 | filename(""), exec_cpu_step(false), cpu_running(false), | 31 | filename(""), exec_cpu_step(false), cpu_running(false), |
| 31 | stop_run(false), render_window(render_window) | 32 | stop_run(false), render_window(render_window) |
| 32 | { | 33 | { |
| 34 | connect(this, SIGNAL(started()), render_window, SLOT(moveContext())); | ||
| 33 | } | 35 | } |
| 34 | 36 | ||
| 35 | void EmuThread::SetFilename(std::string filename) | 37 | void EmuThread::SetFilename(std::string filename) |
| @@ -133,13 +135,9 @@ private: | |||
| 133 | GRenderWindow* parent; | 135 | GRenderWindow* parent; |
| 134 | }; | 136 | }; |
| 135 | 137 | ||
| 136 | EmuThread& GRenderWindow::GetEmuThread() | 138 | GRenderWindow::GRenderWindow(QWidget* parent, GMainWindow& main_window) : |
| 137 | { | 139 | QWidget(parent), main_window(main_window), keyboard_id(0) { |
| 138 | return emu_thread; | ||
| 139 | } | ||
| 140 | 140 | ||
| 141 | GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this), keyboard_id(0) | ||
| 142 | { | ||
| 143 | std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc); | 141 | std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc); |
| 144 | setWindowTitle(QString::fromStdString(window_title)); | 142 | setWindowTitle(QString::fromStdString(window_title)); |
| 145 | 143 | ||
| @@ -160,7 +158,6 @@ GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this | |||
| 160 | layout->addWidget(child); | 158 | layout->addWidget(child); |
| 161 | layout->setMargin(0); | 159 | layout->setMargin(0); |
| 162 | setLayout(layout); | 160 | setLayout(layout); |
| 163 | connect(&emu_thread, SIGNAL(started()), this, SLOT(moveContext())); | ||
| 164 | 161 | ||
| 165 | OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); | 162 | OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); |
| 166 | 163 | ||
| @@ -180,29 +177,17 @@ void GRenderWindow::moveContext() | |||
| 180 | // We need to move GL context to the swapping thread in Qt5 | 177 | // We need to move GL context to the swapping thread in Qt5 |
| 181 | #if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) | 178 | #if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) |
| 182 | // If the thread started running, move the GL Context to the new thread. Otherwise, move it back. | 179 | // If the thread started running, move the GL Context to the new thread. Otherwise, move it back. |
| 183 | child->context()->moveToThread((QThread::currentThread() == qApp->thread()) ? &emu_thread : qApp->thread()); | 180 | auto thread = QThread::currentThread() == qApp->thread() ? main_window.GetEmuThread() : qApp->thread(); |
| 181 | child->context()->moveToThread(thread); | ||
| 184 | #endif | 182 | #endif |
| 185 | } | 183 | } |
| 186 | 184 | ||
| 187 | GRenderWindow::~GRenderWindow() | ||
| 188 | { | ||
| 189 | if (emu_thread.isRunning()) | ||
| 190 | emu_thread.Stop(); | ||
| 191 | } | ||
| 192 | |||
| 193 | void GRenderWindow::SwapBuffers() | 185 | void GRenderWindow::SwapBuffers() |
| 194 | { | 186 | { |
| 195 | // MakeCurrent is already called in renderer_opengl | 187 | // MakeCurrent is already called in renderer_opengl |
| 196 | child->swapBuffers(); | 188 | child->swapBuffers(); |
| 197 | } | 189 | } |
| 198 | 190 | ||
| 199 | void GRenderWindow::closeEvent(QCloseEvent* event) | ||
| 200 | { | ||
| 201 | if (emu_thread.isRunning()) | ||
| 202 | emu_thread.Stop(); | ||
| 203 | QWidget::closeEvent(event); | ||
| 204 | } | ||
| 205 | |||
| 206 | void GRenderWindow::MakeCurrent() | 191 | void GRenderWindow::MakeCurrent() |
| 207 | { | 192 | { |
| 208 | child->makeCurrent(); | 193 | child->makeCurrent(); |
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h index 288da45a1..d3eab6ec1 100644 --- a/src/citra_qt/bootmanager.h +++ b/src/citra_qt/bootmanager.h | |||
| @@ -14,6 +14,7 @@ class QScreen; | |||
| 14 | class QKeyEvent; | 14 | class QKeyEvent; |
| 15 | 15 | ||
| 16 | class GRenderWindow; | 16 | class GRenderWindow; |
| 17 | class GMainWindow; | ||
| 17 | 18 | ||
| 18 | class EmuThread : public QThread | 19 | class EmuThread : public QThread |
| 19 | { | 20 | { |
| @@ -67,7 +68,7 @@ public slots: | |||
| 67 | void Stop(); | 68 | void Stop(); |
| 68 | 69 | ||
| 69 | private: | 70 | private: |
| 70 | friend class GRenderWindow; | 71 | friend class GMainWindow; |
| 71 | 72 | ||
| 72 | EmuThread(GRenderWindow* render_window); | 73 | EmuThread(GRenderWindow* render_window); |
| 73 | 74 | ||
| @@ -100,10 +101,7 @@ class GRenderWindow : public QWidget, public EmuWindow | |||
| 100 | Q_OBJECT | 101 | Q_OBJECT |
| 101 | 102 | ||
| 102 | public: | 103 | public: |
| 103 | GRenderWindow(QWidget* parent = NULL); | 104 | GRenderWindow(QWidget* parent, GMainWindow& main_window); |
| 104 | ~GRenderWindow(); | ||
| 105 | |||
| 106 | void closeEvent(QCloseEvent*) override; | ||
| 107 | 105 | ||
| 108 | // EmuWindow implementation | 106 | // EmuWindow implementation |
| 109 | void SwapBuffers() override; | 107 | void SwapBuffers() override; |
| @@ -116,8 +114,6 @@ public: | |||
| 116 | void restoreGeometry(const QByteArray& geometry); // overridden | 114 | void restoreGeometry(const QByteArray& geometry); // overridden |
| 117 | QByteArray saveGeometry(); // overridden | 115 | QByteArray saveGeometry(); // overridden |
| 118 | 116 | ||
| 119 | EmuThread& GetEmuThread(); | ||
| 120 | |||
| 121 | void keyPressEvent(QKeyEvent* event) override; | 117 | void keyPressEvent(QKeyEvent* event) override; |
| 122 | void keyReleaseEvent(QKeyEvent* event) override; | 118 | void keyReleaseEvent(QKeyEvent* event) override; |
| 123 | 119 | ||
| @@ -139,10 +135,10 @@ private: | |||
| 139 | 135 | ||
| 140 | QGLWidget* child; | 136 | QGLWidget* child; |
| 141 | 137 | ||
| 142 | EmuThread emu_thread; | ||
| 143 | |||
| 144 | QByteArray geometry; | 138 | QByteArray geometry; |
| 145 | 139 | ||
| 140 | GMainWindow& main_window; | ||
| 141 | |||
| 146 | /// Device id of keyboard for use with KeyMap | 142 | /// Device id of keyboard for use with KeyMap |
| 147 | int keyboard_id; | 143 | int keyboard_id; |
| 148 | }; | 144 | }; |
diff --git a/src/citra_qt/debugger/disassembler.cpp b/src/citra_qt/debugger/disassembler.cpp index f620687ae..b58edafe7 100644 --- a/src/citra_qt/debugger/disassembler.cpp +++ b/src/citra_qt/debugger/disassembler.cpp | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #include "disassembler.h" | 5 | #include "disassembler.h" |
| 6 | 6 | ||
| 7 | #include "../main.h" | ||
| 7 | #include "../bootmanager.h" | 8 | #include "../bootmanager.h" |
| 8 | #include "../hotkeys.h" | 9 | #include "../hotkeys.h" |
| 9 | 10 | ||
| @@ -158,8 +159,9 @@ void DisassemblerModel::SetNextInstruction(unsigned int address) { | |||
| 158 | emit dataChanged(prev_index, prev_index); | 159 | emit dataChanged(prev_index, prev_index); |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | DisassemblerWidget::DisassemblerWidget(QWidget* parent, EmuThread& emu_thread) : QDockWidget(parent), base_addr(0), emu_thread(emu_thread) | 162 | DisassemblerWidget::DisassemblerWidget(QWidget* parent, GMainWindow& main_window) : |
| 162 | { | 163 | QDockWidget(parent), main_window(main_window), base_addr(0) { |
| 164 | |||
| 163 | disasm_ui.setupUi(this); | 165 | disasm_ui.setupUi(this); |
| 164 | 166 | ||
| 165 | model = new DisassemblerModel(this); | 167 | model = new DisassemblerModel(this); |
| @@ -199,7 +201,7 @@ void DisassemblerWidget::Init() | |||
| 199 | 201 | ||
| 200 | void DisassemblerWidget::OnContinue() | 202 | void DisassemblerWidget::OnContinue() |
| 201 | { | 203 | { |
| 202 | emu_thread.SetCpuRunning(true); | 204 | main_window.GetEmuThread()->SetCpuRunning(true); |
| 203 | } | 205 | } |
| 204 | 206 | ||
| 205 | void DisassemblerWidget::OnStep() | 207 | void DisassemblerWidget::OnStep() |
| @@ -209,13 +211,13 @@ void DisassemblerWidget::OnStep() | |||
| 209 | 211 | ||
| 210 | void DisassemblerWidget::OnStepInto() | 212 | void DisassemblerWidget::OnStepInto() |
| 211 | { | 213 | { |
| 212 | emu_thread.SetCpuRunning(false); | 214 | main_window.GetEmuThread()->SetCpuRunning(false); |
| 213 | emu_thread.ExecStep(); | 215 | main_window.GetEmuThread()->ExecStep(); |
| 214 | } | 216 | } |
| 215 | 217 | ||
| 216 | void DisassemblerWidget::OnPause() | 218 | void DisassemblerWidget::OnPause() |
| 217 | { | 219 | { |
| 218 | emu_thread.SetCpuRunning(false); | 220 | main_window.GetEmuThread()->SetCpuRunning(false); |
| 219 | 221 | ||
| 220 | // TODO: By now, the CPU might not have actually stopped... | 222 | // TODO: By now, the CPU might not have actually stopped... |
| 221 | if (Core::g_app_core) { | 223 | if (Core::g_app_core) { |
| @@ -225,7 +227,7 @@ void DisassemblerWidget::OnPause() | |||
| 225 | 227 | ||
| 226 | void DisassemblerWidget::OnToggleStartStop() | 228 | void DisassemblerWidget::OnToggleStartStop() |
| 227 | { | 229 | { |
| 228 | emu_thread.SetCpuRunning(!emu_thread.IsCpuRunning()); | 230 | main_window.GetEmuThread()->SetCpuRunning(!main_window.GetEmuThread()->IsCpuRunning()); |
| 229 | } | 231 | } |
| 230 | 232 | ||
| 231 | void DisassemblerWidget::OnDebugModeEntered() | 233 | void DisassemblerWidget::OnDebugModeEntered() |
| @@ -233,7 +235,7 @@ void DisassemblerWidget::OnDebugModeEntered() | |||
| 233 | ARMword next_instr = Core::g_app_core->GetPC(); | 235 | ARMword next_instr = Core::g_app_core->GetPC(); |
| 234 | 236 | ||
| 235 | if (model->GetBreakPoints().IsAddressBreakPoint(next_instr)) | 237 | if (model->GetBreakPoints().IsAddressBreakPoint(next_instr)) |
| 236 | emu_thread.SetCpuRunning(false); | 238 | main_window.GetEmuThread()->SetCpuRunning(false); |
| 237 | 239 | ||
| 238 | model->SetNextInstruction(next_instr); | 240 | model->SetNextInstruction(next_instr); |
| 239 | 241 | ||
diff --git a/src/citra_qt/debugger/disassembler.h b/src/citra_qt/debugger/disassembler.h index 5e19d7c51..d9e32dbdf 100644 --- a/src/citra_qt/debugger/disassembler.h +++ b/src/citra_qt/debugger/disassembler.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "common/break_points.h" | 13 | #include "common/break_points.h" |
| 14 | 14 | ||
| 15 | class QAction; | 15 | class QAction; |
| 16 | class EmuThread; | 16 | class GMainWindow; |
| 17 | 17 | ||
| 18 | class DisassemblerModel : public QAbstractListModel | 18 | class DisassemblerModel : public QAbstractListModel |
| 19 | { | 19 | { |
| @@ -51,7 +51,7 @@ class DisassemblerWidget : public QDockWidget | |||
| 51 | Q_OBJECT | 51 | Q_OBJECT |
| 52 | 52 | ||
| 53 | public: | 53 | public: |
| 54 | DisassemblerWidget(QWidget* parent, EmuThread& emu_thread); | 54 | DisassemblerWidget(QWidget* parent, GMainWindow& main_window); |
| 55 | 55 | ||
| 56 | void Init(); | 56 | void Init(); |
| 57 | 57 | ||
| @@ -75,5 +75,5 @@ private: | |||
| 75 | 75 | ||
| 76 | u32 base_addr; | 76 | u32 base_addr; |
| 77 | 77 | ||
| 78 | EmuThread& emu_thread; | 78 | GMainWindow& main_window; |
| 79 | }; | 79 | }; |
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index e5ca04124..0e57d9e18 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | 46 | ||
| 47 | #include "version.h" | 47 | #include "version.h" |
| 48 | 48 | ||
| 49 | GMainWindow::GMainWindow() | 49 | GMainWindow::GMainWindow() : emu_thread(nullptr) |
| 50 | { | 50 | { |
| 51 | Pica::g_debug_context = Pica::DebugContext::Construct(); | 51 | Pica::g_debug_context = Pica::DebugContext::Construct(); |
| 52 | 52 | ||
| @@ -55,14 +55,15 @@ GMainWindow::GMainWindow() | |||
| 55 | ui.setupUi(this); | 55 | ui.setupUi(this); |
| 56 | statusBar()->hide(); | 56 | statusBar()->hide(); |
| 57 | 57 | ||
| 58 | render_window = new GRenderWindow; | 58 | render_window = new GRenderWindow(this, *this); |
| 59 | render_window->hide(); | 59 | render_window->hide(); |
| 60 | emu_thread = new EmuThread(render_window); | ||
| 60 | 61 | ||
| 61 | profilerWidget = new ProfilerWidget(this); | 62 | profilerWidget = new ProfilerWidget(this); |
| 62 | addDockWidget(Qt::BottomDockWidgetArea, profilerWidget); | 63 | addDockWidget(Qt::BottomDockWidgetArea, profilerWidget); |
| 63 | profilerWidget->hide(); | 64 | profilerWidget->hide(); |
| 64 | 65 | ||
| 65 | disasmWidget = new DisassemblerWidget(this, render_window->GetEmuThread()); | 66 | disasmWidget = new DisassemblerWidget(this, *this); |
| 66 | addDockWidget(Qt::BottomDockWidgetArea, disasmWidget); | 67 | addDockWidget(Qt::BottomDockWidgetArea, disasmWidget); |
| 67 | disasmWidget->hide(); | 68 | disasmWidget->hide(); |
| 68 | 69 | ||
| @@ -139,13 +140,13 @@ GMainWindow::GMainWindow() | |||
| 139 | connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog())); | 140 | connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog())); |
| 140 | 141 | ||
| 141 | // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues | 142 | // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues |
| 142 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); | 143 | connect(emu_thread, SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); |
| 143 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); | 144 | connect(emu_thread, SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); |
| 144 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), callstackWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); | 145 | connect(emu_thread, SIGNAL(DebugModeEntered()), callstackWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); |
| 145 | 146 | ||
| 146 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), disasmWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); | 147 | connect(emu_thread, SIGNAL(DebugModeLeft()), disasmWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); |
| 147 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), registersWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); | 148 | connect(emu_thread, SIGNAL(DebugModeLeft()), registersWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); |
| 148 | connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), callstackWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); | 149 | connect(emu_thread, SIGNAL(DebugModeLeft()), callstackWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); |
| 149 | 150 | ||
| 150 | // Setup hotkeys | 151 | // Setup hotkeys |
| 151 | RegisterHotkey("Main Window", "Load File", QKeySequence::Open); | 152 | RegisterHotkey("Main Window", "Load File", QKeySequence::Open); |
| @@ -210,8 +211,8 @@ void GMainWindow::BootGame(std::string filename) | |||
| 210 | registersWidget->OnDebugModeEntered(); | 211 | registersWidget->OnDebugModeEntered(); |
| 211 | callstackWidget->OnDebugModeEntered(); | 212 | callstackWidget->OnDebugModeEntered(); |
| 212 | 213 | ||
| 213 | render_window->GetEmuThread().SetFilename(filename); | 214 | emu_thread->SetFilename(filename); |
| 214 | render_window->GetEmuThread().start(); | 215 | emu_thread->start(); |
| 215 | 216 | ||
| 216 | render_window->show(); | 217 | render_window->show(); |
| 217 | OnStartGame(); | 218 | OnStartGame(); |
| @@ -232,7 +233,7 @@ void GMainWindow::OnMenuLoadSymbolMap() { | |||
| 232 | 233 | ||
| 233 | void GMainWindow::OnStartGame() | 234 | void GMainWindow::OnStartGame() |
| 234 | { | 235 | { |
| 235 | render_window->GetEmuThread().SetCpuRunning(true); | 236 | emu_thread->SetCpuRunning(true); |
| 236 | 237 | ||
| 237 | ui.action_Start->setEnabled(false); | 238 | ui.action_Start->setEnabled(false); |
| 238 | ui.action_Pause->setEnabled(true); | 239 | ui.action_Pause->setEnabled(true); |
| @@ -241,7 +242,7 @@ void GMainWindow::OnStartGame() | |||
| 241 | 242 | ||
| 242 | void GMainWindow::OnPauseGame() | 243 | void GMainWindow::OnPauseGame() |
| 243 | { | 244 | { |
| 244 | render_window->GetEmuThread().SetCpuRunning(false); | 245 | emu_thread->SetCpuRunning(false); |
| 245 | 246 | ||
| 246 | ui.action_Start->setEnabled(true); | 247 | ui.action_Start->setEnabled(true); |
| 247 | ui.action_Pause->setEnabled(false); | 248 | ui.action_Pause->setEnabled(false); |
| @@ -250,7 +251,7 @@ void GMainWindow::OnPauseGame() | |||
| 250 | 251 | ||
| 251 | void GMainWindow::OnStopGame() | 252 | void GMainWindow::OnStopGame() |
| 252 | { | 253 | { |
| 253 | render_window->GetEmuThread().SetCpuRunning(false); | 254 | emu_thread->SetCpuRunning(false); |
| 254 | // TODO: Shutdown core | 255 | // TODO: Shutdown core |
| 255 | 256 | ||
| 256 | ui.action_Start->setEnabled(true); | 257 | ui.action_Start->setEnabled(true); |
| @@ -265,24 +266,22 @@ void GMainWindow::OnOpenHotkeysDialog() | |||
| 265 | } | 266 | } |
| 266 | 267 | ||
| 267 | 268 | ||
| 268 | void GMainWindow::ToggleWindowMode() | 269 | void GMainWindow::ToggleWindowMode() { |
| 269 | { | 270 | if (ui.action_Single_Window_Mode->isChecked()) { |
| 270 | bool enable = ui.action_Single_Window_Mode->isChecked(); | 271 | // Render in the main window... |
| 271 | if (!enable && render_window->parent() != nullptr) | ||
| 272 | { | ||
| 273 | ui.horizontalLayout->removeWidget(render_window); | ||
| 274 | render_window->setParent(nullptr); | ||
| 275 | render_window->setVisible(true); | ||
| 276 | render_window->RestoreGeometry(); | ||
| 277 | render_window->setFocusPolicy(Qt::NoFocus); | ||
| 278 | } | ||
| 279 | else if (enable && render_window->parent() == nullptr) | ||
| 280 | { | ||
| 281 | render_window->BackupGeometry(); | 272 | render_window->BackupGeometry(); |
| 282 | ui.horizontalLayout->addWidget(render_window); | 273 | ui.horizontalLayout->addWidget(render_window); |
| 283 | render_window->setVisible(true); | 274 | render_window->setVisible(true); |
| 284 | render_window->setFocusPolicy(Qt::ClickFocus); | 275 | render_window->setFocusPolicy(Qt::ClickFocus); |
| 285 | render_window->setFocus(); | 276 | render_window->setFocus(); |
| 277 | |||
| 278 | } else { | ||
| 279 | // Render in a separate window... | ||
| 280 | ui.horizontalLayout->removeWidget(render_window); | ||
| 281 | render_window->setParent(nullptr); | ||
| 282 | render_window->setVisible(true); | ||
| 283 | render_window->RestoreGeometry(); | ||
| 284 | render_window->setFocusPolicy(Qt::NoFocus); | ||
| 286 | } | 285 | } |
| 287 | } | 286 | } |
| 288 | 287 | ||
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h index 9b57c5772..5b33ea962 100644 --- a/src/citra_qt/main.h +++ b/src/citra_qt/main.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | class GImageInfo; | 12 | class GImageInfo; |
| 13 | class GRenderWindow; | 13 | class GRenderWindow; |
| 14 | class EmuThread; | ||
| 14 | class ProfilerWidget; | 15 | class ProfilerWidget; |
| 15 | class DisassemblerWidget; | 16 | class DisassemblerWidget; |
| 16 | class RegistersWidget; | 17 | class RegistersWidget; |
| @@ -34,6 +35,10 @@ public: | |||
| 34 | GMainWindow(); | 35 | GMainWindow(); |
| 35 | ~GMainWindow(); | 36 | ~GMainWindow(); |
| 36 | 37 | ||
| 38 | EmuThread* GetEmuThread() { | ||
| 39 | return emu_thread; | ||
| 40 | } | ||
| 41 | |||
| 37 | private: | 42 | private: |
| 38 | void BootGame(std::string filename); | 43 | void BootGame(std::string filename); |
| 39 | 44 | ||
| @@ -54,6 +59,7 @@ private: | |||
| 54 | Ui::MainWindow ui; | 59 | Ui::MainWindow ui; |
| 55 | 60 | ||
| 56 | GRenderWindow* render_window; | 61 | GRenderWindow* render_window; |
| 62 | EmuThread* emu_thread; | ||
| 57 | 63 | ||
| 58 | ProfilerWidget* profilerWidget; | 64 | ProfilerWidget* profilerWidget; |
| 59 | DisassemblerWidget* disasmWidget; | 65 | DisassemblerWidget* disasmWidget; |