From 93de3481e58790bec3ae498073c45ccf15809734 Mon Sep 17 00:00:00 2001 From: rock88 Date: Sat, 2 May 2020 15:31:44 +0300 Subject: [PATCH] Work... --- moonlight.xcodeproj/project.pbxproj | 10 ++- .../xcshareddata/xcschemes/moonlight.xcscheme | 10 +-- src/Server.cpp | 79 +++++++++++++++---- src/Server.hpp | 20 +++-- src/moonlight_glfw.cpp | 11 +-- src/moonlight_libretro.c | 34 +++----- src/moonlight_libretro_wrapper.cpp | 7 +- src/moonlight_libretro_wrapper.h | 2 +- src/ui/AddHostWindow.cpp | 7 +- src/ui/Application.cpp | 20 +---- src/ui/Application.hpp | 19 ++++- src/ui/ContentWindow.cpp | 3 +- src/ui/ContentWindow.hpp | 10 ++- src/ui/HostButton.cpp | 32 ++++++++ src/ui/HostButton.hpp | 18 +++++ src/ui/LoadingOverlay.cpp | 7 +- src/ui/LoadingOverlay.hpp | 2 +- src/ui/MainWindow.cpp | 32 +++++++- src/ui/MainWindow.hpp | 5 +- 19 files changed, 225 insertions(+), 103 deletions(-) create mode 100644 src/ui/HostButton.cpp create mode 100644 src/ui/HostButton.hpp diff --git a/moonlight.xcodeproj/project.pbxproj b/moonlight.xcodeproj/project.pbxproj index d233f82..ba50905 100644 --- a/moonlight.xcodeproj/project.pbxproj +++ b/moonlight.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3602C3B7245D903000368900 /* HostButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3602C3B5245D903000368900 /* HostButton.cpp */; }; 361F8A3A245CB44E00A8D9C0 /* moonlight_libretro_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 361F8A38245CB44E00A8D9C0 /* moonlight_libretro_wrapper.cpp */; }; 3652EFCD245B3B00001FABF3 /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3652EF0F245B3B00001FABF3 /* widget.cpp */; }; 3652EFCE245B3B00001FABF3 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3652EF10245B3B00001FABF3 /* common.cpp */; }; @@ -104,6 +105,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3602C3B5245D903000368900 /* HostButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HostButton.cpp; sourceTree = ""; }; + 3602C3B6245D903000368900 /* HostButton.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = HostButton.hpp; sourceTree = ""; }; 361F8A38245CB44E00A8D9C0 /* moonlight_libretro_wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = moonlight_libretro_wrapper.cpp; sourceTree = ""; }; 361F8A39245CB44E00A8D9C0 /* moonlight_libretro_wrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = moonlight_libretro_wrapper.h; sourceTree = ""; }; 3652ECE8245B3AFF001FABF3 /* colorpicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = colorpicker.h; sourceTree = ""; }; @@ -547,13 +550,13 @@ 36DFE0D5245A1FEC00FC51CE /* glsym */, 36DFE0CA2459FA3F00FC51CE /* nanogui_resources */, 36DFDCF12459F79000FC51CE /* ui */, - 36B406962459F460005BD903 /* moonlight_glfw.cpp */, 3652F003245C28C6001FABF3 /* Server.cpp */, 3652F004245C28C6001FABF3 /* Server.hpp */, 3652F084245C6CFC001FABF3 /* libretro.h */, - 3652F085245C6CFC001FABF3 /* moonlight_libretro.c */, 361F8A39245CB44E00A8D9C0 /* moonlight_libretro_wrapper.h */, 361F8A38245CB44E00A8D9C0 /* moonlight_libretro_wrapper.cpp */, + 3652F085245C6CFC001FABF3 /* moonlight_libretro.c */, + 36B406962459F460005BD903 /* moonlight_glfw.cpp */, ); path = src; sourceTree = ""; @@ -603,6 +606,8 @@ 3652F001245B6961001FABF3 /* AddHostWindow.hpp */, 3652F081245C60D1001FABF3 /* LoadingOverlay.cpp */, 3652F082245C60D1001FABF3 /* LoadingOverlay.hpp */, + 3602C3B5245D903000368900 /* HostButton.cpp */, + 3602C3B6245D903000368900 /* HostButton.hpp */, ); path = ui; sourceTree = ""; @@ -754,6 +759,7 @@ 3652EFDD245B3B00001FABF3 /* texture_gl.cpp in Sources */, 3652F013245C2919001FABF3 /* http.c in Sources */, 3652F069245C292B001FABF3 /* peer.c in Sources */, + 3602C3B7245D903000368900 /* HostButton.cpp in Sources */, 3652EFD0245B3B00001FABF3 /* vscrollpanel.cpp in Sources */, 3652F06D245C292B001FABF3 /* win32.c in Sources */, 3652F012245C2919001FABF3 /* mkcert.c in Sources */, diff --git a/moonlight.xcodeproj/xcshareddata/xcschemes/moonlight.xcscheme b/moonlight.xcodeproj/xcshareddata/xcschemes/moonlight.xcscheme index e33b469..e6b02aa 100644 --- a/moonlight.xcodeproj/xcshareddata/xcschemes/moonlight.xcscheme +++ b/moonlight.xcodeproj/xcshareddata/xcschemes/moonlight.xcscheme @@ -34,7 +34,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - enableAddressSanitizer = "YES" enableASanStackUseAfterReturn = "YES" enableUBSanitizer = "YES" launchStyle = "0" @@ -43,11 +42,8 @@ debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> - - - + - + #include #include +#include +#include #include -using Task = const std::function; +using namespace std; -std::mutex m_task_mutex; -std::vector m_tasks; -std::thread m_task_thread; +using Task = const function; + +mutex m_task_mutex; +vector m_tasks; +thread m_task_thread; void perform_load_task(Task &task) { - std::lock_guard guard(m_task_mutex); + lock_guard guard(m_task_mutex); m_tasks.push_back(task); } Server::Server() { - auto delay = std::chrono::microseconds((int64_t)(500'000)); + auto delay = chrono::microseconds((int64_t)(500'000)); - m_task_thread = std::thread([delay]() { + m_task_thread = thread([delay]() { while (true) { - std::vector tasks; { - std::lock_guard guard(m_task_mutex); - tasks = std::vector(m_tasks); + vector tasks; { + lock_guard guard(m_task_mutex); + tasks = vector(m_tasks); m_tasks.clear(); } for (auto task: tasks) { task(); } - std::this_thread::sleep_for(delay); + this_thread::sleep_for(delay); } } ); } -void Server::connect(std::string address, ServerCallback &callback) { - perform_load_task([address, callback] { +void Server::add_host(string address) { + if (find(m_hosts.begin(), m_hosts.end(), address) == m_hosts.end()) { + m_hosts.push_back(address); + } + + ofstream file(m_working_dir + "/hosts.txt"); + + for (auto host: m_hosts) { + file << host << endl; + } + + file.close(); +} + +vector Server::hosts() { + if (!m_hosts.empty()) { + return m_hosts; + } + + ifstream in(m_working_dir + "/hosts.txt"); + + if (!in) { + return {}; + } + + string str; + while (getline(in, str)) { + if (str.size() > 0) + m_hosts.push_back(str); + } + in.close(); + return m_hosts; +} + +void Server::connect(string address, ServerCallback &callback) { + perform_load_task([this, address, callback] { SERVER_DATA data; - int status = gs_init(&data, (char *)address.c_str(), "/Users/rock88/Documents/Projects/RetroArch/moonlight-libretro/key", 0, false); + int status = gs_init(&data, (char *)address.c_str(), (m_working_dir + "/key").c_str(), 0, false); - nanogui::async([address, callback, &data, status] { + nanogui::async([address, callback, data, status] { + SERVER_DATA copy(data); + if (status == GS_OK) { - callback(Result::success(&data)); + callback(Result::success(©)); + //free(data); } else { - callback(Result::failure(gs_error)); + if (gs_error != NULL) { + callback(Result::failure(gs_error)); + } else { + callback(Result::failure("Unknown error...")); + } } }); }); diff --git a/src/Server.hpp b/src/Server.hpp index db73ead..9b8afed 100644 --- a/src/Server.hpp +++ b/src/Server.hpp @@ -1,4 +1,5 @@ #include +#include extern "C" { #include "client.h" @@ -48,16 +49,23 @@ template using ServerCallback = const std::function)>; class Server { public: - static Server server() { - static Server* server = NULL; - if (server == NULL) { - server = new Server(); - } - return *server; + static Server* server() { + static Server server; + return &server; } + void set_working_dir(const std::string &dir) { + m_working_dir = std::string(dir + "/moonlight"); + } + + void add_host(std::string address); + std::vector hosts(); + void connect(std::string address, ServerCallback &callback); private: Server(); + + std::string m_working_dir; + std::vector m_hosts; }; diff --git a/src/moonlight_glfw.cpp b/src/moonlight_glfw.cpp index 1dbf80c..664a4c9 100644 --- a/src/moonlight_glfw.cpp +++ b/src/moonlight_glfw.cpp @@ -3,6 +3,7 @@ #include #include "glsym/glsym.h" #include "Application.hpp" +#include "Server.hpp" int main(int argc, const char * argv[]) { glfwInit(); @@ -33,26 +34,22 @@ int main(int argc, const char * argv[]) { glfwGetWindowSize(window, &width, &height); glfwGetFramebufferSize(window, &fb_width, &fb_height); + Server::server()->set_working_dir("/Users/rock88/Documents/RetroArch/system"); + nanogui::init(); nanogui::ref app = new Application(Size(width, height), Size(fb_width, fb_height)); - nanogui::setup(1.0 / 60.0); + nanogui::setup(1.0 / 60.0 * 1000); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); int width, height; glfwGetFramebufferSize(window, &width, &height); - glViewport(0, 0, width, height); nanogui::draw(); - //glfwGetWindowSize(win, &width, &height); - //glViewport(0, 0, width, height); - //glClear(GL_COLOR_BUFFER_BIT); - - //glfwWaitEvents(); glfwSwapBuffers(window); } return 0; diff --git a/src/moonlight_libretro.c b/src/moonlight_libretro.c index 55702f0..0481419 100644 --- a/src/moonlight_libretro.c +++ b/src/moonlight_libretro.c @@ -133,39 +133,28 @@ void retro_run(void) { double mouse_x = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); double mouse_y = input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); + double pointer_x = 0; + double pointer_y = 0; -// if (mouse_x == 0 && mouse_y == 0) { -// int pointer_x = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); -// int pointer_y = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); -// -// if (pointer_x != 0 && pointer_y != 0) { -// mouse_x = (pointer_x / 32768.0f + 1) / 2 * width; -// mouse_y = (pointer_y / 32768.0f + 1) / 2 * height; -// } -// } - + // TODO: Pointers in MacBook currently work incorrectly... if (input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED)) { - int p_x = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); - int p_y = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); - - //int px=(int)((float)retro.width/854.0*(float)p_x); - //int py=(int)((float)retro.height/480.0*(float)p_y); - mouse_x=(int)((p_x+0x7fff)*width/0xffff); - mouse_y=(int)((p_y+0x7fff)*height/0xffff); + int p_x = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); + int p_y = input_state_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); + pointer_x = (p_x + 0x7fff) * width / 0xffff; + pointer_y = (p_y + 0x7fff) * height / 0xffff; } if (mouse_x != 0 && mouse_y != 0) { moonlight_libretro_wrapper_handle_mouse_move(mouse_x, mouse_y); } - - - last_mouse_x = mouse_x; - last_mouse_y = mouse_y; - static bool mouse_l_pressed = false; if (input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) && !mouse_l_pressed) { + if (pointer_x != 0 && pointer_y != 0) { + moonlight_libretro_wrapper_handle_mouse_move(pointer_x, pointer_y); + } + mouse_l_pressed = true; moonlight_libretro_wrapper_handle_mouse_button(0, 1, 0); } else if (!input_state_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT) && mouse_l_pressed) { @@ -177,7 +166,6 @@ void retro_run(void) { glBindFramebuffer(RARCH_GL_FRAMEBUFFER, hw_render.get_current_framebuffer()); glViewport(0, 0, width, height); - moonlight_libretro_wrapper_draw(); video_cb(RETRO_HW_FRAME_BUFFER_VALID, width, height, 0); diff --git a/src/moonlight_libretro_wrapper.cpp b/src/moonlight_libretro_wrapper.cpp index 9ba66c7..81edb35 100644 --- a/src/moonlight_libretro_wrapper.cpp +++ b/src/moonlight_libretro_wrapper.cpp @@ -1,5 +1,6 @@ #include "moonlight_libretro_wrapper.h" #include "Application.hpp" +#include "Server.hpp" #include #include @@ -23,17 +24,15 @@ void moonlight_libretro_wrapper_init(int width, int height) { nanogui::setup(1.0 / 60.0); } -void moonlight_libretro_wrapper_set_working_dir(char* dir) { - +void moonlight_libretro_wrapper_set_working_dir(const char* dir) { + Server::server()->set_working_dir(dir); } void moonlight_libretro_wrapper_handle_mouse_move(double x, double y) { - //printf("mouse_move: %fx%f\n", x, y); nanogui::cursor_pos_callback_event(x, y); } void moonlight_libretro_wrapper_handle_mouse_button(int button, int action, int modifiers) { - //printf("mouse_button: %i x %i\n", button, action); nanogui::mouse_button_callback_event(button, action, modifiers); } diff --git a/src/moonlight_libretro_wrapper.h b/src/moonlight_libretro_wrapper.h index 21b077d..f3fb099 100644 --- a/src/moonlight_libretro_wrapper.h +++ b/src/moonlight_libretro_wrapper.h @@ -7,7 +7,7 @@ #endif EXTERN void moonlight_libretro_wrapper_init(int width, int height); -EXTERN void moonlight_libretro_wrapper_set_working_dir(char* dir); +EXTERN void moonlight_libretro_wrapper_set_working_dir(const char* dir); EXTERN void moonlight_libretro_wrapper_handle_mouse_move(double x, double y); EXTERN void moonlight_libretro_wrapper_handle_mouse_button(int button, int action, int modifiers); EXTERN void moonlight_libretro_wrapper_draw(); diff --git a/src/ui/AddHostWindow.cpp b/src/ui/AddHostWindow.cpp index a83059a..9930bbe 100644 --- a/src/ui/AddHostWindow.cpp +++ b/src/ui/AddHostWindow.cpp @@ -37,6 +37,7 @@ AddHostWindow::AddHostWindow(Widget *parent): ContentWindow(parent, "Add Host") auto backspace = other_buttons_container->add