From 1024a7c7c41f2c747a875e891ad7bed79730b6a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandro=20S=C3=A1nchez=20Bach?= Date: Sat, 14 Sep 2013 20:20:57 +0200 Subject: [PATCH] Mouse support added *Implemented 'cellMouse*' functions from 'sys_io' module, which are part of the libmouse library. * Added corresponding entries in the 'Config > Settings' menu to change the handler of the mouse. Supported handlers: Windows, Null. * cellGifDec: Fixed some errors and added support for RGBA color. (Remember: The mouse support is very experimental) --- rpcs3/Emu/Io/Mouse.cpp | 38 +++++ rpcs3/Emu/Io/Mouse.h | 26 ++++ rpcs3/Emu/Io/MouseHandler.h | 160 +++++++++++++++++++++ rpcs3/Emu/Io/Null/NullMouseHandler.h | 24 ++++ rpcs3/Emu/Io/Windows/WindowsMouseHandler.h | 59 ++++++++ rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp | 103 +++++++++---- rpcs3/Emu/SysCalls/Modules/sys_io.cpp | 11 ++ rpcs3/Emu/SysCalls/SysCalls.h | 12 ++ rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp | 142 ++++++++++++++++++ rpcs3/Emu/System.cpp | 1 + rpcs3/Emu/System.h | 3 + rpcs3/Gui/MainFrame.cpp | 12 +- rpcs3/Ini.h | 4 + rpcs3/rpcs3.vcxproj | 2 + rpcs3/rpcs3.vcxproj.filters | 6 + 15 files changed, 578 insertions(+), 25 deletions(-) create mode 100644 rpcs3/Emu/Io/Mouse.cpp create mode 100644 rpcs3/Emu/Io/Mouse.h create mode 100644 rpcs3/Emu/Io/MouseHandler.h create mode 100644 rpcs3/Emu/Io/Null/NullMouseHandler.h create mode 100644 rpcs3/Emu/Io/Windows/WindowsMouseHandler.h create mode 100644 rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp diff --git a/rpcs3/Emu/Io/Mouse.cpp b/rpcs3/Emu/Io/Mouse.cpp new file mode 100644 index 0000000000..7ad1dd0631 --- /dev/null +++ b/rpcs3/Emu/Io/Mouse.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "Mouse.h" +#include "Null/NullMouseHandler.h" +#include "Windows/WindowsMouseHandler.h" + +MouseManager::MouseManager() + : m_mouse_handler(nullptr) + , m_inited(false) +{ +} + +MouseManager::~MouseManager() +{ +} + +void MouseManager::Init(const u32 max_connect) +{ + if(m_inited) return; + + switch(Ini.MouseHandlerMode.GetValue()) + { + case 1: m_mouse_handler = new WindowsMouseHandler(); break; + + default: + case 0: m_mouse_handler = new NullMouseHandler(); break; + } + + m_mouse_handler->Init(max_connect); + m_inited = true; +} + +void MouseManager::Close() +{ + if(m_mouse_handler) m_mouse_handler->Close(); + m_mouse_handler = nullptr; + + m_inited = false; +} \ No newline at end of file diff --git a/rpcs3/Emu/Io/Mouse.h b/rpcs3/Emu/Io/Mouse.h new file mode 100644 index 0000000000..90f2336fbc --- /dev/null +++ b/rpcs3/Emu/Io/Mouse.h @@ -0,0 +1,26 @@ +#pragma once + +#include "MouseHandler.h" + +class MouseManager //: public wxWindow +{ + bool m_inited; + MouseHandlerBase* m_mouse_handler; + +public: + MouseManager(); + ~MouseManager(); + + void Init(const u32 max_connect); + void Close(); + + Array& GetMice() { return m_mouse_handler->GetMice(); } + MouseInfo& GetInfo() { return m_mouse_handler->GetInfo(); } + CellMouseData& GetData(const u32 mouse) { return m_mouse_handler->GetData(mouse); } + CellMouseRawData& GetRawData(const u32 mouse) { return m_mouse_handler->GetRawData(mouse); } + + bool IsInited() { return m_inited; } + +//private: + //DECLARE_EVENT_TABLE(); +}; \ No newline at end of file diff --git a/rpcs3/Emu/Io/MouseHandler.h b/rpcs3/Emu/Io/MouseHandler.h new file mode 100644 index 0000000000..b23a404633 --- /dev/null +++ b/rpcs3/Emu/Io/MouseHandler.h @@ -0,0 +1,160 @@ +#pragma once + +enum MousePortStatus +{ + CELL_MOUSE_STATUS_DISCONNECTED = 0x00000000, + CELL_MOUSE_STATUS_CONNECTED = 0x00000001, +}; + +enum MouseDataUpdate +{ + CELL_MOUSE_DATA_UPDATE = 1, + CELL_MOUSE_DATA_NON = 0, +}; + +enum MouseButtonCodes +{ + CELL_MOUSE_BUTTON_1 = 0x00000001, + CELL_MOUSE_BUTTON_2 = 0x00000002, + CELL_MOUSE_BUTTON_3 = 0x00000004, + CELL_MOUSE_BUTTON_4 = 0x00000008, + CELL_MOUSE_BUTTON_5 = 0x00000010, + CELL_MOUSE_BUTTON_6 = 0x00000020, + CELL_MOUSE_BUTTON_7 = 0x00000040, + CELL_MOUSE_BUTTON_8 = 0x00000080, +}; + +static const u32 CELL_MAX_MICE = 127; +static const u32 CELL_MOUSE_MAX_DATA_LIST_NUM = 8; +static const u32 CELL_MOUSE_MAX_CODES = 64; + +struct MouseInfo +{ + u32 max_connect; + u32 now_connect; + u32 info; + u16 vendor_id[CELL_MAX_MICE]; + u16 product_id[CELL_MAX_MICE]; + u8 status[CELL_MAX_MICE]; +}; + +struct CellMouseRawData +{ + s32 len; + u8 data[CELL_MOUSE_MAX_CODES]; + + CellMouseRawData() + : len(0) + { + } +}; + +struct CellMouseData +{ + u8 update; + u8 buttons; + s8 x_axis; + s8 y_axis; + s8 wheel; + s8 tilt; // (TODO) + + CellMouseData() + : update(0) + , buttons(0) + , x_axis(0) + , y_axis(0) + , wheel(0) + , tilt(0) + { + } +}; + +struct CellMouseDataList +{ + u32 list_num; + CellMouseData list[CELL_MOUSE_MAX_DATA_LIST_NUM]; + + CellMouseDataList() + : list_num(0) + { + } +}; + +struct Mouse +{ + s16 x_pos; + s16 y_pos; + + CellMouseData m_data; + CellMouseRawData m_rawdata; + + Mouse() + : m_data() + , m_rawdata() + { + } +}; + +class MouseHandlerBase +{ +protected: + MouseInfo m_info; + Array m_mice; + +public: + virtual void Init(const u32 max_connect)=0; + virtual void Close()=0; + + void Button(u8 button, bool pressed) + { + for(u64 p=0; p& GetMice() { return m_mice; } + CellMouseData& GetData(const u32 mouse) { return GetMice()[mouse].m_data; } + CellMouseRawData& GetRawData(const u32 mouse) { return GetMice()[mouse].m_rawdata; } +}; \ No newline at end of file diff --git a/rpcs3/Emu/Io/Null/NullMouseHandler.h b/rpcs3/Emu/Io/Null/NullMouseHandler.h new file mode 100644 index 0000000000..1abe6fe2c8 --- /dev/null +++ b/rpcs3/Emu/Io/Null/NullMouseHandler.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Emu/Io/MouseHandler.h" + +class NullMouseHandler : public MouseHandlerBase +{ +public: + NullMouseHandler() + { + } + + virtual void Init(const u32 max_connect) + { + memset(&m_info, 0, sizeof(MouseInfo)); + m_info.max_connect = max_connect; + m_mice.Clear(); + } + + virtual void Close() + { + memset(&m_info, 0, sizeof(MouseInfo)); + m_mice.Clear(); + } +}; \ No newline at end of file diff --git a/rpcs3/Emu/Io/Windows/WindowsMouseHandler.h b/rpcs3/Emu/Io/Windows/WindowsMouseHandler.h new file mode 100644 index 0000000000..dce6832dec --- /dev/null +++ b/rpcs3/Emu/Io/Windows/WindowsMouseHandler.h @@ -0,0 +1,59 @@ +#pragma once + +#include "Emu/Io/MouseHandler.h" + +class WindowsMouseHandler + : public wxWindow + , public MouseHandlerBase +{ + AppConnector m_app_connector; + +public: + WindowsMouseHandler() : wxWindow() + { + m_app_connector.Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(WindowsMouseHandler::MouseButtonDown), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_RIGHT_DOWN, wxMouseEventHandler(WindowsMouseHandler::MouseButtonDown), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_MIDDLE_DOWN, wxMouseEventHandler(WindowsMouseHandler::MouseButtonDown), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_LEFT_UP, wxMouseEventHandler(WindowsMouseHandler::MouseButtonUp), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_RIGHT_UP, wxMouseEventHandler(WindowsMouseHandler::MouseButtonUp), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_MIDDLE_UP, wxMouseEventHandler(WindowsMouseHandler::MouseButtonUp), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler(WindowsMouseHandler::MouseScroll), (wxObject*)0, this); + m_app_connector.Connect(wxEVT_MOTION, wxMouseEventHandler(WindowsMouseHandler::MouseMove), (wxObject*)0, this); + } + + virtual void MouseButtonDown(wxMouseEvent& event) + { + if (event.LeftDown()) MouseHandlerBase::Button(CELL_MOUSE_BUTTON_1, 1); + else if (event.RightDown()) MouseHandlerBase::Button(CELL_MOUSE_BUTTON_2, 1); + else if (event.MiddleDown())MouseHandlerBase::Button(CELL_MOUSE_BUTTON_3, 1); + event.Skip(); + } + virtual void MouseButtonUp(wxMouseEvent& event) + { + if (event.LeftUp()) MouseHandlerBase::Button(CELL_MOUSE_BUTTON_1, 0); + else if (event.RightUp()) MouseHandlerBase::Button(CELL_MOUSE_BUTTON_2, 0); + else if (event.MiddleUp()) MouseHandlerBase::Button(CELL_MOUSE_BUTTON_3, 0); + event.Skip(); + } + virtual void MouseScroll(wxMouseEvent& event) { MouseHandlerBase::Scroll(event.GetWheelRotation()); event.Skip(); } + virtual void MouseMove(wxMouseEvent& event) { MouseHandlerBase::Move(event.m_x, event.m_y); event.Skip(); } + + virtual void Init(const u32 max_connect) + { + m_mice.Move(new Mouse()); + memset(&m_info, 0, sizeof(MouseInfo)); + m_info.max_connect = max_connect; + m_info.now_connect = min(GetMice().GetCount(), max_connect); + m_info.info = 0; // Ownership of mouse data: 0=Application, 1=System + m_info.status[0] = CELL_MOUSE_STATUS_CONNECTED; // (TODO: Support for more mice) + for(u32 i=1; ifd = Memory.Read32(fd_addr); + Memory.Free(fd_addr); if(ret != 0) return CELL_GIFDEC_ERROR_OPEN_FILE; + // Get size of file + u32 sb_addr = Memory.Alloc(52,1); // Alloc a CellFsStat struct + cellFsFstat(subHandle->fd, sb_addr); + subHandle->fileSize = Memory.Read64(sb_addr+36); // Get CellFsStat.st_size + Memory.Free(sb_addr); + + // From now, every u32 subHandle argument is a pointer to a CellPngDecSubHandle struct. + Memory.Write32(subHandle_addr, (u32)subHandle); + return CELL_OK; } int cellGifDecReadHeader(u32 mainHandle, u32 subHandle, u32 info_addr) { - u32& fd = subHandle; - - //Check size of file - u32 sb_addr = Memory.Alloc(52,1); // Alloc a CellFsStat struct - cellFsFstat(fd, sb_addr); - u64 fileSize = Memory.Read64(sb_addr+36); // Get CellFsStat.st_size - Memory.Free(sb_addr); + const u32& fd = ((CellGifDecSubHandle*)subHandle)->fd; + const u64& fileSize = ((CellGifDecSubHandle*)subHandle)->fileSize; //Write the header to buffer u32 buffer = Memory.Alloc(13,1); // Alloc buffer for GIF header @@ -126,21 +168,21 @@ int cellGifDecReadHeader(u32 mainHandle, u32 subHandle, u32 info_addr) return CELL_OK; } -int cellGifDecSetParameter(u32 mainHandle, u32 subHandle, u32 inParam, u32 outParam) +int cellGifDecSetParameter(u32 mainHandle, u32 subHandle, u32 inParam_addr, u32 outParam_addr) { - UNIMPLEMENTED_FUNC(cellGifDec); + CellGifDecInParam& inParam = ((CellGifDecSubHandle*)subHandle)->inParam; + inParam.colorSpace = Memory.Read32(inParam_addr+4); + + // (TODO) + return CELL_OK; } int cellGifDecDecodeData(u32 mainHandle, u32 subHandle, u32 data_addr, u32 dataCtrlParam_addr, u32 dataOutInfo_addr) { - u32& fd = subHandle; - - //Get size of file - u32 sb_addr = Memory.Alloc(52,1); // Alloc a CellFsStat struct - cellFsFstat(fd, sb_addr); - u64 fileSize = Memory.Read64(sb_addr+36); // Get CellFsStat.st_size - Memory.Free(sb_addr); + const u32& fd = ((CellGifDecSubHandle*)subHandle)->fd; + const u64& fileSize = ((CellGifDecSubHandle*)subHandle)->fileSize; + const CellGifDecInParam& inParam = ((CellGifDecSubHandle*)subHandle)->inParam; // (TODO: We should use the outParam) //Copy the GIF file to a buffer u32 buffer = Memory.Alloc(fileSize,1); @@ -163,24 +205,37 @@ int cellGifDecDecodeData(u32 mainHandle, u32 subHandle, u32 data_addr, u32 dataC return CELL_GIFDEC_ERROR_STREAM_FORMAT; } u32 image_size = width * height * 4; - for(u32 i = 0; i < image_size; i+=4){ - Memory.Write8(data_addr+i+0, image[i+3]); - Memory.Write8(data_addr+i+1, image[i+0]); - Memory.Write8(data_addr+i+2, image[i+1]); - Memory.Write8(data_addr+i+3, image[i+2]); + if (inParam.colorSpace == CELL_GIFDEC_RGBA){ + for(u32 i = 0; i < image_size; i+=4){ + Memory.Write8(data_addr+i+0, image[i+0]); + Memory.Write8(data_addr+i+1, image[i+1]); + Memory.Write8(data_addr+i+2, image[i+2]); + Memory.Write8(data_addr+i+3, image[i+3]); // (This can be optimized by using Write32) + } + } + if (inParam.colorSpace == CELL_GIFDEC_ARGB){ + for(u32 i = 0; i < image_size; i+=4){ + Memory.Write8(data_addr+i+0, image[i+3]); + Memory.Write8(data_addr+i+1, image[i+0]); + Memory.Write8(data_addr+i+2, image[i+1]); + Memory.Write8(data_addr+i+3, image[i+2]); + } } Memory.Free(buffer); //The output data is an image (dataOutInfo.recordType = 1) Memory.Write32(dataOutInfo_addr, 1); + u32 outExtensionData_addr = Memory.Alloc(20,1); // (TODO: Is this the best way to avoid exceptions when trying to access this data? Will this produce a memory leak?) + Memory.Write32(dataOutInfo_addr+8, outExtensionData_addr); + return CELL_OK; } int cellGifDecClose(u32 mainHandle, u32 subHandle) { - u32& fd = subHandle; - cellFsClose(fd); + cellFsClose( ((CellGifDecSubHandle*)subHandle)->fd ); + delete (CellGifDecSubHandle*)subHandle; return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp index 4339052ecf..db6e727c0e 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_io.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_io.cpp @@ -26,4 +26,15 @@ void sys_io_init() sys_io.AddFunc(0x3f72c56e, cellKbSetLEDStatus); sys_io.AddFunc(0xdeefdfa7, cellKbSetReadMode); sys_io.AddFunc(0x1f71ecbe, cellKbGetConfiguration); + + sys_io.AddFunc(0xc9030138, cellMouseInit); + sys_io.AddFunc(0x3ef66b95, cellMouseClearBuf); + sys_io.AddFunc(0xe10183ce, cellMouseEnd); + sys_io.AddFunc(0x5baf30fb, cellMouseGetInfo); + sys_io.AddFunc(0x4d0b3b1f, cellMouseInfoTabletMode); + sys_io.AddFunc(0x3138e632, cellMouseGetData); + sys_io.AddFunc(0x6bd131f0, cellMouseGetDataList); + sys_io.AddFunc(0x2d16da4f, cellMouseSetTabletMode); + sys_io.AddFunc(0x21a62e9b, cellMouseGetTabletDataList); + sys_io.AddFunc(0xa328cc35, cellMouseGetRawData); } diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 68e12d882a..159f168d57 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -228,6 +228,18 @@ extern int cellKbSetLEDStatus(u32 port_no, u8 led); extern int cellKbSetReadMode(u32 port_no, u32 rmode); extern int cellKbGetConfiguration(u32 port_no, u32 config_addr); +//cellMouse +extern int cellMouseInit(u32 max_connect); +extern int cellMouseClearBuf(u32 port_no); +extern int cellMouseEnd(); +extern int cellMouseGetInfo(u32 info_addr); +extern int cellMouseInfoTabletMode(u32 port_no, u32 info_addr); +extern int cellMouseGetData(u32 port_no, u32 data_addr); +extern int cellMouseGetDataList(u32 port_no, u32 data_addr); +extern int cellMouseSetTabletMode(u32 port_no, u32 mode); +extern int cellMouseGetTabletDataList(u32 port_no, u32 data_addr); +extern int cellMouseGetRawData(u32 port_no, u32 data_addr); + //cellGcm extern int cellGcmCallback(u32 context_addr, u32 count); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp new file mode 100644 index 0000000000..9161fba651 --- /dev/null +++ b/rpcs3/Emu/SysCalls/lv2/SC_Mouse.cpp @@ -0,0 +1,142 @@ +#include "stdafx.h" +#include "Emu/Io/Mouse.h" +#include "Emu/SysCalls/SysCalls.h" + +extern Module sys_io; + +enum CELL_MOUSE_ERROR_CODE +{ + CELL_MOUSE_ERROR_FATAL = 0x80121201, + CELL_MOUSE_ERROR_INVALID_PARAMETER = 0x80121202, + CELL_MOUSE_ERROR_ALREADY_INITIALIZED = 0x80121203, + CELL_MOUSE_ERROR_UNINITIALIZED = 0x80121204, + CELL_MOUSE_ERROR_RESOURCE_ALLOCATION_FAILED = 0x80121205, + CELL_MOUSE_ERROR_DATA_READ_FAILED = 0x80121206, + CELL_MOUSE_ERROR_NO_DEVICE = 0x80121207, + CELL_MOUSE_ERROR_SYS_SETTING_FAILED = 0x80121208, +}; + +int cellMouseInit(u32 max_connect) +{ + sys_io.Log("cellMouseInit(max_connect=%d)", max_connect); + if(Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_ALREADY_INITIALIZED; + if(max_connect > 7) return CELL_MOUSE_ERROR_INVALID_PARAMETER; + + Emu.GetMouseManager().Init(max_connect); + return CELL_OK; +} + + +int cellMouseClearBuf(u32 port_no) +{ + sys_io.Log("cellMouseClearBuf(port_no=%d)", port_no); + if(!Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_UNINITIALIZED; + if(port_no >= Emu.GetMouseManager().GetMice().GetCount()) return CELL_MOUSE_ERROR_INVALID_PARAMETER; + + //? + + return CELL_OK; +} + +int cellMouseEnd() +{ + sys_io.Log("cellMouseEnd()"); + if(!Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_UNINITIALIZED; + Emu.GetMouseManager().Close(); + return CELL_OK; +} + +int cellMouseGetInfo(u32 info_addr) +{ + sys_io.Log("cellMouseGetInfo(info_addr=0x%x)", info_addr); + if(!Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_UNINITIALIZED; + + const MouseInfo& current_info = Emu.GetMouseManager().GetInfo(); + mem_class_t info(info_addr); + info += current_info.max_connect; + info += current_info.now_connect; + info += current_info.info; + for(u32 i=0; i= Emu.GetMouseManager().GetMice().GetCount()) return CELL_MOUSE_ERROR_INVALID_PARAMETER; + + mem_class_t info(info_addr); + info += 0; // Unimplemented: (0=Tablet mode is not supported) + info += 1; // Unimplemented: (1=Mouse mode) + + return CELL_OK; +} + +int cellMouseGetData(u32 port_no, u32 data_addr) +{ + sys_io.Log("cellMouseGetData(port_no=%d,data_addr=0x%x)", port_no,data_addr); + if(!Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_UNINITIALIZED; + if(port_no >= Emu.GetMouseManager().GetMice().GetCount()) return CELL_MOUSE_ERROR_NO_DEVICE; + + CellMouseData& current_data = Emu.GetMouseManager().GetData(port_no); + mem_class_t data(data_addr); + data += current_data.update; + data += current_data.buttons; + data += current_data.x_axis; + data += current_data.y_axis; + data += current_data.wheel; + data += current_data.tilt; + + current_data.update = CELL_MOUSE_DATA_NON; + current_data.x_axis = 0; + current_data.y_axis = 0; + current_data.wheel = 0; + + return CELL_OK; +} + +int cellMouseGetDataList(u32 port_no, u32 data_addr) +{ + UNIMPLEMENTED_FUNC(sys_io); + + return CELL_OK; +} + +int cellMouseSetTabletMode(u32 port_no, u32 mode) +{ + UNIMPLEMENTED_FUNC(sys_io); + + return CELL_OK; +} + +int cellMouseGetTabletDataList(u32 port_no, u32 data_addr) +{ + UNIMPLEMENTED_FUNC(sys_io); + + return CELL_OK; +} + +int cellMouseGetRawData(u32 port_no, u32 data_addr) +{ + UNIMPLEMENTED_FUNC(sys_io); + + /*sys_io.Log("cellMouseGetRawData(port_no=%d,data_addr=0x%x)", port_no,data_addr); + if(!Emu.GetMouseManager().IsInited()) return CELL_MOUSE_ERROR_UNINITIALIZED; + if(port_no >= Emu.GetMouseManager().GetMice().GetCount()) return CELL_MOUSE_ERROR_NO_DEVICE; + + CellMouseRawData& current_rawdata = Emu.GetMouseManager().GetRawData(port_no); + mem_class_t data(data_addr); + data += current_rawdata.len; + for(s32 i=0; iAppend("Windows"); //cbox_pad_handler->Append("DirectInput"); + cbox_mouse_handler->Append("Null"); + cbox_mouse_handler->Append("Windows"); + //cbox_pad_handler->Append("DirectInput"); + chbox_gs_vsync->SetValue(Ini.GSVSyncEnable.GetValue()); cbox_cpu_decoder->SetSelection(Ini.CPUDecoderMode.GetValue() ? Ini.CPUDecoderMode.GetValue() - 1 : 0); @@ -331,6 +337,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_gs_aspect->SetSelection(Ini.GSAspectRatio.GetValue() - 1); cbox_pad_handler->SetSelection(Ini.PadHandlerMode.GetValue()); cbox_keyboard_handler->SetSelection(Ini.KeyboardHandlerMode.GetValue()); + cbox_mouse_handler->SetSelection(Ini.MouseHandlerMode.GetValue()); s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_cpu->Add(s_round_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -345,8 +352,10 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_round_pad_handler->Add(cbox_pad_handler, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_keyboard_handler->Add(cbox_keyboard_handler, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_mouse_handler->Add(cbox_mouse_handler, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_io->Add(s_round_pad_handler, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_io->Add(s_round_keyboard_handler, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_io->Add(s_round_mouse_handler, wxSizerFlags().Border(wxALL, 5).Expand()); wxBoxSizer* s_b_panel(new wxBoxSizer(wxHORIZONTAL)); @@ -360,7 +369,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel2->Add(s_round_io, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel1->Add(s_b_panel, wxSizerFlags().Border(wxALL, 8).Expand()); - s_subpanel2->AddSpacer(200); + s_subpanel2->AddSpacer(180); s_panel->Add(s_subpanel1, wxSizerFlags().Border(wxALL, 5).Expand()); s_panel->Add(s_subpanel2, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -375,6 +384,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.GSVSyncEnable.SetValue(chbox_gs_vsync->GetValue()); Ini.PadHandlerMode.SetValue(cbox_pad_handler->GetSelection()); Ini.KeyboardHandlerMode.SetValue(cbox_keyboard_handler->GetSelection()); + Ini.MouseHandlerMode.SetValue(cbox_mouse_handler->GetSelection()); Ini.Save(); } diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index e9b2c92652..dff605bfeb 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -99,6 +99,7 @@ public: IniEntry GSVSyncEnable; IniEntry PadHandlerMode; IniEntry KeyboardHandlerMode; + IniEntry MouseHandlerMode; public: Inis() : DefPath("EmuSettings") @@ -117,6 +118,7 @@ public: path = DefPath + "\\" + "IO"; PadHandlerMode.Init("PadHandlerMode", path); KeyboardHandlerMode.Init("KeyboardHandlerMode", path); + MouseHandlerMode.Init("MouseHandlerMode", path); } void Load() @@ -128,6 +130,7 @@ public: GSVSyncEnable.Load(false); PadHandlerMode.Load(0); KeyboardHandlerMode.Load(0); + MouseHandlerMode.Load(0); } void Save() @@ -139,6 +142,7 @@ public: GSVSyncEnable.Save(); PadHandlerMode.Save(); KeyboardHandlerMode.Save(); + MouseHandlerMode.Save(); } }; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 637e88a80a..893c671409 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -222,6 +222,7 @@ + @@ -234,6 +235,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 7a15323230..1606f87a8a 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -301,6 +301,12 @@ Emu\SysCalls\lv2 + + Emu\Io + + + Emu\SysCalls\lv2 +