summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/citra_qt/main.cpp18
-rw-r--r--src/citra_qt/main.h8
-rw-r--r--src/common/logging/backend.cpp1
-rw-r--r--src/common/logging/log.h1
-rw-r--r--src/core/hle/service/ir/ir.cpp72
-rw-r--r--src/core/hle/service/ir/ir.h47
-rw-r--r--src/core/hle/service/ir/ir_user.cpp41
7 files changed, 170 insertions, 18 deletions
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index 144f11117..da9ea6c91 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -171,6 +171,8 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
171 } 171 }
172 UpdateRecentFiles(); 172 UpdateRecentFiles();
173 173
174 confirm_before_closing = settings.value("confirmClose", true).toBool();
175
174 // Setup connections 176 // Setup connections
175 connect(game_list, SIGNAL(GameChosen(QString)), this, SLOT(OnGameListLoadFile(QString))); 177 connect(game_list, SIGNAL(GameChosen(QString)), this, SLOT(OnGameListLoadFile(QString)));
176 connect(ui.action_Load_File, SIGNAL(triggered()), this, SLOT(OnMenuLoadFile())); 178 connect(ui.action_Load_File, SIGNAL(triggered()), this, SLOT(OnMenuLoadFile()));
@@ -497,7 +499,22 @@ void GMainWindow::OnConfigure() {
497 //GControllerConfigDialog* dialog = new GControllerConfigDialog(controller_ports, this); 499 //GControllerConfigDialog* dialog = new GControllerConfigDialog(controller_ports, this);
498} 500}
499 501
502bool GMainWindow::ConfirmClose() {
503 if (emu_thread == nullptr || !confirm_before_closing)
504 return true;
505
506 auto answer = QMessageBox::question(this, tr("Citra"),
507 tr("Are you sure you want to close Citra?"),
508 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
509 return answer != QMessageBox::No;
510}
511
500void GMainWindow::closeEvent(QCloseEvent* event) { 512void GMainWindow::closeEvent(QCloseEvent* event) {
513 if (!ConfirmClose()) {
514 event->ignore();
515 return;
516 }
517
501 // Save window layout 518 // Save window layout
502 QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Citra team", "Citra"); 519 QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Citra team", "Citra");
503 520
@@ -512,6 +529,7 @@ void GMainWindow::closeEvent(QCloseEvent* event) {
512 settings.setValue("singleWindowMode", ui.action_Single_Window_Mode->isChecked()); 529 settings.setValue("singleWindowMode", ui.action_Single_Window_Mode->isChecked());
513 settings.setValue("displayTitleBars", ui.actionDisplay_widget_title_bars->isChecked()); 530 settings.setValue("displayTitleBars", ui.actionDisplay_widget_title_bars->isChecked());
514 settings.setValue("firstStart", false); 531 settings.setValue("firstStart", false);
532 settings.setValue("confirmClose", confirm_before_closing);
515 game_list->SaveInterfaceLayout(settings); 533 game_list->SaveInterfaceLayout(settings);
516 SaveHotkeys(settings); 534 SaveHotkeys(settings);
517 535
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index f6d429cd9..8c195f816 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -82,6 +82,13 @@ private:
82 */ 82 */
83 void UpdateRecentFiles(); 83 void UpdateRecentFiles();
84 84
85 /**
86 * If the emulation is running,
87 * asks the user if he really want to close the emulator
88 *
89 * @return true if the user confirmed
90 */
91 bool ConfirmClose();
85 void closeEvent(QCloseEvent* event) override; 92 void closeEvent(QCloseEvent* event) override;
86 93
87private slots: 94private slots:
@@ -122,6 +129,7 @@ private:
122 GPUCommandListWidget* graphicsCommandsWidget; 129 GPUCommandListWidget* graphicsCommandsWidget;
123 130
124 QAction* actions_recent_files[max_recent_files_item]; 131 QAction* actions_recent_files[max_recent_files_item];
132 bool confirm_before_closing;
125}; 133};
126 134
127#endif // _CITRA_QT_MAIN_HXX_ 135#endif // _CITRA_QT_MAIN_HXX_
diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 58819012d..54291429a 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -49,6 +49,7 @@ namespace Log {
49 SUB(Service, DSP) \ 49 SUB(Service, DSP) \
50 SUB(Service, HID) \ 50 SUB(Service, HID) \
51 SUB(Service, SOC) \ 51 SUB(Service, SOC) \
52 SUB(Service, IR) \
52 SUB(Service, Y2R) \ 53 SUB(Service, Y2R) \
53 CLS(HW) \ 54 CLS(HW) \
54 SUB(HW, Memory) \ 55 SUB(HW, Memory) \
diff --git a/src/common/logging/log.h b/src/common/logging/log.h
index ec7bb00b8..4b01805ae 100644
--- a/src/common/logging/log.h
+++ b/src/common/logging/log.h
@@ -64,6 +64,7 @@ enum class Class : ClassType {
64 Service_DSP, ///< The DSP (DSP control) service 64 Service_DSP, ///< The DSP (DSP control) service
65 Service_HID, ///< The HID (Human interface device) service 65 Service_HID, ///< The HID (Human interface device) service
66 Service_SOC, ///< The SOC (Socket) service 66 Service_SOC, ///< The SOC (Socket) service
67 Service_IR, ///< The IR service
67 Service_Y2R, ///< The Y2R (YUV to RGB conversion) service 68 Service_Y2R, ///< The Y2R (YUV to RGB conversion) service
68 HW, ///< Low-level hardware emulation 69 HW, ///< Low-level hardware emulation
69 HW_Memory, ///< Memory-map and address translation 70 HW_Memory, ///< Memory-map and address translation
diff --git a/src/core/hle/service/ir/ir.cpp b/src/core/hle/service/ir/ir.cpp
index 0f8eed33a..c2121cb2e 100644
--- a/src/core/hle/service/ir/ir.cpp
+++ b/src/core/hle/service/ir/ir.cpp
@@ -2,20 +2,22 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/hle/kernel/event.h"
6#include "core/hle/kernel/shared_memory.h"
7
5#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
6#include "core/hle/service/ir/ir.h" 9#include "core/hle/service/ir/ir.h"
7#include "core/hle/service/ir/ir_rst.h" 10#include "core/hle/service/ir/ir_rst.h"
8#include "core/hle/service/ir/ir_u.h" 11#include "core/hle/service/ir/ir_u.h"
9#include "core/hle/service/ir/ir_user.h" 12#include "core/hle/service/ir/ir_user.h"
10 13
11#include "core/hle/kernel/event.h"
12#include "core/hle/kernel/shared_memory.h"
13
14namespace Service { 14namespace Service {
15namespace IR { 15namespace IR {
16 16
17static Kernel::SharedPtr<Kernel::Event> handle_event; 17static Kernel::SharedPtr<Kernel::Event> handle_event;
18static Kernel::SharedPtr<Kernel::Event> conn_status_event;
18static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory; 19static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
20static Kernel::SharedPtr<Kernel::SharedMemory> transfer_shared_memory;
19 21
20void GetHandles(Service::Interface* self) { 22void GetHandles(Service::Interface* self) {
21 u32* cmd_buff = Kernel::GetCommandBuffer(); 23 u32* cmd_buff = Kernel::GetCommandBuffer();
@@ -26,6 +28,64 @@ void GetHandles(Service::Interface* self) {
26 cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom(); 28 cmd_buff[4] = Kernel::g_handle_table.Create(Service::IR::handle_event).MoveFrom();
27} 29}
28 30
31void InitializeIrNopShared(Interface* self) {
32 u32* cmd_buff = Kernel::GetCommandBuffer();
33
34 u32 transfer_buff_size = cmd_buff[1];
35 u32 recv_buff_size = cmd_buff[2];
36 u32 unk1 = cmd_buff[3];
37 u32 send_buff_size = cmd_buff[4];
38 u32 unk2 = cmd_buff[5];
39 u8 baud_rate = cmd_buff[6] & 0xFF;
40 Handle handle = cmd_buff[8];
41
42 if(Kernel::g_handle_table.IsValid(handle)) {
43 transfer_shared_memory = Kernel::g_handle_table.Get<Kernel::SharedMemory>(handle);
44 transfer_shared_memory->name = "IR:TransferSharedMemory";
45 }
46
47 cmd_buff[1] = RESULT_SUCCESS.raw;
48
49 LOG_WARNING(Service_IR, "(STUBBED) called, transfer_buff_size=%d, recv_buff_size=%d, "
50 "unk1=%d, send_buff_size=%d, unk2=%d, baud_rate=%u, handle=0x%08X",
51 transfer_buff_size, recv_buff_size, unk1, send_buff_size, unk2, baud_rate, handle);
52}
53
54void RequireConnection(Interface* self) {
55 u32* cmd_buff = Kernel::GetCommandBuffer();
56
57 conn_status_event->Signal();
58
59 cmd_buff[1] = RESULT_SUCCESS.raw;
60
61 LOG_WARNING(Service_IR, "(STUBBED) called");
62}
63
64void Disconnect(Interface* self) {
65 u32* cmd_buff = Kernel::GetCommandBuffer();
66
67 cmd_buff[1] = RESULT_SUCCESS.raw;
68
69 LOG_WARNING(Service_IR, "(STUBBED) called");
70}
71
72void GetConnectionStatusEvent(Interface* self) {
73 u32* cmd_buff = Kernel::GetCommandBuffer();
74
75 cmd_buff[1] = RESULT_SUCCESS.raw;
76 cmd_buff[3] = Kernel::g_handle_table.Create(Service::IR::conn_status_event).MoveFrom();
77
78 LOG_WARNING(Service_IR, "(STUBBED) called");
79}
80
81void FinalizeIrNop(Interface* self) {
82 u32* cmd_buff = Kernel::GetCommandBuffer();
83
84 cmd_buff[1] = RESULT_SUCCESS.raw;
85
86 LOG_WARNING(Service_IR, "(STUBBED) called");
87}
88
29void Init() { 89void Init() {
30 using namespace Kernel; 90 using namespace Kernel;
31 91
@@ -35,15 +95,19 @@ void Init() {
35 95
36 using Kernel::MemoryPermission; 96 using Kernel::MemoryPermission;
37 shared_memory = SharedMemory::Create(0x1000, Kernel::MemoryPermission::ReadWrite, 97 shared_memory = SharedMemory::Create(0x1000, Kernel::MemoryPermission::ReadWrite,
38 Kernel::MemoryPermission::ReadWrite, "IR:SharedMemory"); 98 Kernel::MemoryPermission::ReadWrite, "IR:SharedMemory");
99 transfer_shared_memory = nullptr;
39 100
40 // Create event handle(s) 101 // Create event handle(s)
41 handle_event = Event::Create(RESETTYPE_ONESHOT, "IR:HandleEvent"); 102 handle_event = Event::Create(RESETTYPE_ONESHOT, "IR:HandleEvent");
103 conn_status_event = Event::Create(RESETTYPE_ONESHOT, "IR:ConnectionStatusEvent");
42} 104}
43 105
44void Shutdown() { 106void Shutdown() {
107 transfer_shared_memory = nullptr;
45 shared_memory = nullptr; 108 shared_memory = nullptr;
46 handle_event = nullptr; 109 handle_event = nullptr;
110 conn_status_event = nullptr;
47} 111}
48 112
49} // namespace IR 113} // namespace IR
diff --git a/src/core/hle/service/ir/ir.h b/src/core/hle/service/ir/ir.h
index 3e107a8fe..72d44ce60 100644
--- a/src/core/hle/service/ir/ir.h
+++ b/src/core/hle/service/ir/ir.h
@@ -20,6 +20,53 @@ namespace IR {
20 */ 20 */
21void GetHandles(Interface* self); 21void GetHandles(Interface* self);
22 22
23/**
24 * IR::InitializeIrNopShared service function
25 * Inputs:
26 * 1 : Size of transfer buffer
27 * 2 : Recv buffer size
28 * 3 : unknown
29 * 4 : Send buffer size
30 * 5 : unknown
31 * 6 : BaudRate (u8)
32 * 7 : 0
33 * 8 : Handle of transfer shared memory
34 * Outputs:
35 * 1 : Result of function, 0 on success, otherwise error code
36 */
37void InitializeIrNopShared(Interface* self);
38
39/**
40 * IR::FinalizeIrNop service function
41 * Outputs:
42 * 1 : Result of function, 0 on success, otherwise error code
43 */
44void FinalizeIrNop(Interface* self);
45
46/**
47 * IR::GetConnectionStatusEvent service function
48 * Outputs:
49 * 1 : Result of function, 0 on success, otherwise error code
50 * 2 : Connection Status Event handle
51 */
52void GetConnectionStatusEvent(Interface* self);
53
54/**
55 * IR::Disconnect service function
56 * Outputs:
57 * 1 : Result of function, 0 on success, otherwise error code
58 */
59void Disconnect(Interface* self);
60
61/**
62 * IR::RequireConnection service function
63 * Inputs:
64 * 1 : unknown (u8), looks like always 1
65 * Outputs:
66 * 1 : Result of function, 0 on success, otherwise error code
67 */
68void RequireConnection(Interface* self);
69
23/// Initialize IR service 70/// Initialize IR service
24void Init(); 71void Init();
25 72
diff --git a/src/core/hle/service/ir/ir_user.cpp b/src/core/hle/service/ir/ir_user.cpp
index 0a98e5801..06a601029 100644
--- a/src/core/hle/service/ir/ir_user.cpp
+++ b/src/core/hle/service/ir/ir_user.cpp
@@ -2,26 +2,39 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/hle/service/ir/ir.h"
5#include "core/hle/service/ir/ir_user.h" 6#include "core/hle/service/ir/ir_user.h"
6 7
7namespace Service { 8namespace Service {
8namespace IR { 9namespace IR {
9 10
10const Interface::FunctionInfo FunctionTable[] = { 11const Interface::FunctionInfo FunctionTable[] = {
11 {0x00010182, nullptr, "InitializeIrNop"}, 12 {0x00010182, nullptr, "InitializeIrNop"},
12 {0x00020000, nullptr, "FinalizeIrNop"}, 13 {0x00020000, FinalizeIrNop, "FinalizeIrNop"},
13 {0x00030000, nullptr, "ClearReceiveBuffer"}, 14 {0x00030000, nullptr, "ClearReceiveBuffer"},
14 {0x00040000, nullptr, "ClearSendBuffer"}, 15 {0x00040000, nullptr, "ClearSendBuffer"},
15 {0x00060040, nullptr, "RequireConnection"}, 16 {0x000500C0, nullptr, "WaitConnection"},
16 {0x00090000, nullptr, "Disconnect"}, 17 {0x00060040, RequireConnection, "RequireConnection"},
17 {0x000A0000, nullptr, "GetReceiveEvent"}, 18 {0x000702C0, nullptr, "AutoConnection"},
18 {0x000B0000, nullptr, "GetSendEvent"}, 19 {0x00080000, nullptr, "AnyConnection"},
19 {0x000C0000, nullptr, "GetConnectionStatusEvent"}, 20 {0x00090000, Disconnect, "Disconnect"},
20 {0x000D0042, nullptr, "SendIrNop"}, 21 {0x000A0000, nullptr, "GetReceiveEvent"},
21 {0x000E0042, nullptr, "SendIrNopLarge"}, 22 {0x000B0000, nullptr, "GetSendEvent"},
22 {0x00180182, nullptr, "InitializeIrNopShared"}, 23 {0x000C0000, GetConnectionStatusEvent, "GetConnectionStatusEvent"},
23 {0x00190040, nullptr, "ReleaseReceivedData"}, 24 {0x000D0042, nullptr, "SendIrNop"},
24 {0x001A0040, nullptr, "SetOwnMachineId"}, 25 {0x000E0042, nullptr, "SendIrNopLarge"},
26 {0x000F0040, nullptr, "ReceiveIrnop"},
27 {0x00100042, nullptr, "ReceiveIrnopLarge"},
28 {0x00110040, nullptr, "GetLatestReceiveErrorResult"},
29 {0x00120040, nullptr, "GetLatestSendErrorResult"},
30 {0x00130000, nullptr, "GetConnectionStatus"},
31 {0x00140000, nullptr, "GetTryingToConnectStatus"},
32 {0x00150000, nullptr, "GetReceiveSizeFreeAndUsed"},
33 {0x00160000, nullptr, "GetSendSizeFreeAndUsed"},
34 {0x00170000, nullptr, "GetConnectionRole"},
35 {0x00180182, InitializeIrNopShared, "InitializeIrNopShared"},
36 {0x00190040, nullptr, "ReleaseReceivedData"},
37 {0x001A0040, nullptr, "SetOwnMachineId"},
25}; 38};
26 39
27IR_User_Interface::IR_User_Interface() { 40IR_User_Interface::IR_User_Interface() {