diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/emu_window.cpp | 22 | ||||
-rw-r--r-- | src/common/emu_window.h | 5 | ||||
-rw-r--r-- | src/common/thread.h | 81 |
3 files changed, 37 insertions, 71 deletions
diff --git a/src/common/emu_window.cpp b/src/common/emu_window.cpp index 6516fc633..f5b6c7301 100644 --- a/src/common/emu_window.cpp +++ b/src/common/emu_window.cpp @@ -28,6 +28,17 @@ static bool IsWithinTouchscreen(const EmuWindow::FramebufferLayout& layout, unsi framebuffer_x < layout.bottom_screen.right); } +std::tuple<unsigned,unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) { + + new_x = std::max(new_x, framebuffer_layout.bottom_screen.left); + new_x = std::min(new_x, framebuffer_layout.bottom_screen.right-1); + + new_y = std::max(new_y, framebuffer_layout.bottom_screen.top); + new_y = std::min(new_y, framebuffer_layout.bottom_screen.bottom-1); + + return std::make_tuple(new_x, new_y); +} + void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) return; @@ -52,14 +63,13 @@ void EmuWindow::TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y) { if (!touch_pressed) return; - if (IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) - TouchPressed(framebuffer_x, framebuffer_y); - else - TouchReleased(); + if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) + std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y); + + TouchPressed(framebuffer_x, framebuffer_y); } -EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, - unsigned height) { +EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, unsigned height) { ASSERT(width > 0); ASSERT(height > 0); diff --git a/src/common/emu_window.h b/src/common/emu_window.h index c8e2de04a..e0fc12a48 100644 --- a/src/common/emu_window.h +++ b/src/common/emu_window.h @@ -206,5 +206,10 @@ private: u16 touch_x; ///< Touchpad X-position in native 3DS pixel coordinates (0-320) u16 touch_y; ///< Touchpad Y-position in native 3DS pixel coordinates (0-240) + /** + * Clip the provided coordinates to be inside the touchscreen area. + */ + std::tuple<unsigned,unsigned> ClipToTouchScreen(unsigned new_x, unsigned new_y); + Service::HID::PadState pad_state; }; diff --git a/src/common/thread.h b/src/common/thread.h index a45728e1e..5fdb6baeb 100644 --- a/src/common/thread.h +++ b/src/common/thread.h @@ -51,109 +51,60 @@ int CurrentThreadId(); void SetThreadAffinity(std::thread::native_handle_type thread, u32 mask); void SetCurrentThreadAffinity(u32 mask); -class Event -{ +class Event { public: - Event() - : is_set(false) - {} + Event() : is_set(false) {} - void Set() - { + void Set() { std::lock_guard<std::mutex> lk(m_mutex); - if (!is_set) - { + if (!is_set) { is_set = true; m_condvar.notify_one(); } } - void Wait() - { + void Wait() { std::unique_lock<std::mutex> lk(m_mutex); - m_condvar.wait(lk, IsSet(this)); + m_condvar.wait(lk, [&]{ return is_set; }); is_set = false; } - void Reset() - { + void Reset() { std::unique_lock<std::mutex> lk(m_mutex); // no other action required, since wait loops on the predicate and any lingering signal will get cleared on the first iteration is_set = false; } private: - class IsSet - { - public: - IsSet(const Event* ev) - : m_event(ev) - {} - - bool operator()() - { - return m_event->is_set; - } - - private: - const Event* const m_event; - }; - - volatile bool is_set; + bool is_set; std::condition_variable m_condvar; std::mutex m_mutex; }; -// TODO: doesn't work on windows with (count > 2) -class Barrier -{ +class Barrier { public: - Barrier(size_t count) - : m_count(count), m_waiting(0) - {} + Barrier(size_t count) : m_count(count), m_waiting(0) {} - // block until "count" threads call Sync() - bool Sync() - { + /// Blocks until all "count" threads have called Sync() + void Sync() { std::unique_lock<std::mutex> lk(m_mutex); // TODO: broken when next round of Sync()s // is entered before all waiting threads return from the notify_all - if (m_count == ++m_waiting) - { + if (++m_waiting == m_count) { m_waiting = 0; m_condvar.notify_all(); - return true; - } - else - { - m_condvar.wait(lk, IsDoneWating(this)); - return false; + } else { + m_condvar.wait(lk, [&]{ return m_waiting == 0; }); } } private: - class IsDoneWating - { - public: - IsDoneWating(const Barrier* bar) - : m_bar(bar) - {} - - bool operator()() - { - return (0 == m_bar->m_waiting); - } - - private: - const Barrier* const m_bar; - }; - std::condition_variable m_condvar; std::mutex m_mutex; const size_t m_count; - volatile size_t m_waiting; + size_t m_waiting; }; void SleepCurrentThread(int ms); |