mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	
						commit
						ed5b275d21
					
				
					 10 changed files with 298 additions and 161 deletions
				
			
		|  | @ -6,18 +6,61 @@ | |||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| void EmuWindow::KeyPressed(KeyMap::HostDeviceKey key) { | ||||
|     Service::HID::PadState mapped_key = KeyMap::GetPadKey(key); | ||||
| 
 | ||||
|     Service::HID::PadButtonPress(mapped_key); | ||||
|     pad_state.hex |= KeyMap::GetPadKey(key).hex; | ||||
| } | ||||
| 
 | ||||
| void EmuWindow::KeyReleased(KeyMap::HostDeviceKey key) { | ||||
|     Service::HID::PadState mapped_key = KeyMap::GetPadKey(key); | ||||
| 
 | ||||
|     Service::HID::PadButtonRelease(mapped_key); | ||||
|     pad_state.hex &= ~KeyMap::GetPadKey(key).hex; | ||||
| } | ||||
| 
 | ||||
| EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, unsigned height) { | ||||
| /**
 | ||||
|  * Check if the given x/y coordinates are within the touchpad specified by the framebuffer layout | ||||
|  * @param layout FramebufferLayout object describing the framebuffer size and screen positions | ||||
|  * @param framebuffer_x Framebuffer x-coordinate to check | ||||
|  * @param framebuffer_y Framebuffer y-coordinate to check | ||||
|  * @return True if the coordinates are within the touchpad, otherwise false | ||||
|  */ | ||||
| static bool IsWithinTouchscreen(const EmuWindow::FramebufferLayout& layout, unsigned framebuffer_x, | ||||
|                                 unsigned framebuffer_y) { | ||||
|     return (framebuffer_y >= layout.bottom_screen.top    && | ||||
|             framebuffer_y <  layout.bottom_screen.bottom && | ||||
|             framebuffer_x >= layout.bottom_screen.left   && | ||||
|             framebuffer_x <  layout.bottom_screen.right); | ||||
| } | ||||
| 
 | ||||
| void EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { | ||||
|     if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) | ||||
|         return; | ||||
| 
 | ||||
|     touch_x = VideoCore::kScreenBottomWidth * (framebuffer_x - framebuffer_layout.bottom_screen.left) / | ||||
|         (framebuffer_layout.bottom_screen.right - framebuffer_layout.bottom_screen.left); | ||||
|     touch_y = VideoCore::kScreenBottomHeight * (framebuffer_y - framebuffer_layout.bottom_screen.top) / | ||||
|         (framebuffer_layout.bottom_screen.bottom - framebuffer_layout.bottom_screen.top); | ||||
| 
 | ||||
|     touch_pressed = true; | ||||
|     pad_state.touch = 1; | ||||
| } | ||||
| 
 | ||||
| void EmuWindow::TouchReleased() { | ||||
|     touch_pressed = false; | ||||
|     touch_x = 0; | ||||
|     touch_y = 0; | ||||
|     pad_state.touch = 0; | ||||
| } | ||||
| 
 | ||||
| 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(); | ||||
| } | ||||
| 
 | ||||
| EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, | ||||
|     unsigned height) { | ||||
| 
 | ||||
|     ASSERT(width > 0); | ||||
|     ASSERT(height > 0); | ||||
| 
 | ||||
|  |  | |||
|  | @ -71,10 +71,48 @@ public: | |||
|     virtual void ReloadSetKeymaps() = 0; | ||||
| 
 | ||||
|     /// Signals a key press action to the HID module
 | ||||
|     static void KeyPressed(KeyMap::HostDeviceKey key); | ||||
|     void KeyPressed(KeyMap::HostDeviceKey key); | ||||
| 
 | ||||
|     /// Signals a key release action to the HID module
 | ||||
|     static void KeyReleased(KeyMap::HostDeviceKey key); | ||||
|     void KeyReleased(KeyMap::HostDeviceKey key); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Signal that a touch pressed event has occurred (e.g. mouse click pressed) | ||||
|      * @param framebuffer_x Framebuffer x-coordinate that was pressed | ||||
|      * @param framebuffer_y Framebuffer y-coordinate that was pressed | ||||
|      */ | ||||
|     void TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y); | ||||
| 
 | ||||
|     /// Signal that a touch released event has occurred (e.g. mouse click released)
 | ||||
|     void TouchReleased(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Signal that a touch movement event has occurred (e.g. mouse was moved over the emu window) | ||||
|      * @param framebuffer_x Framebuffer x-coordinate | ||||
|      * @param framebuffer_y Framebuffer y-coordinate | ||||
|      */ | ||||
|     void TouchMoved(unsigned framebuffer_x, unsigned framebuffer_y); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Gets the current pad state (which buttons are pressed and the circle pad direction). | ||||
|      * @note This should be called by the core emu thread to get a state set by the window thread. | ||||
|      * @todo Fix this function to be thread-safe. | ||||
|      * @return PadState object indicating the current pad state | ||||
|      */ | ||||
|     const Service::HID::PadState GetPadState() const { | ||||
|         return pad_state; | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * Gets the current touch screen state (touch X/Y coordinates and whether or not it is pressed). | ||||
|      * @note This should be called by the core emu thread to get a state set by the window thread. | ||||
|      * @todo Fix this function to be thread-safe. | ||||
|      * @return std::tuple of (x, y, pressed) where `x` and `y` are the touch coordinates and | ||||
|      *         `pressed` is true if the touch screen is currently being pressed | ||||
|      */ | ||||
|     const std::tuple<u16, u16, bool>& GetTouchState() const { | ||||
|         return std::make_tuple(touch_x, touch_y, touch_pressed); | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * Returns currently active configuration. | ||||
|  | @ -100,21 +138,15 @@ public: | |||
|         return framebuffer_layout; | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * Gets window client area width in logical coordinates. | ||||
|      * @note For high-DPI systems, this is smaller than the framebuffer size. | ||||
|      * @note This method is thread-safe | ||||
|      */ | ||||
|     std::pair<unsigned,unsigned> GetClientAreaSize() const { | ||||
|         return std::make_pair(client_area_width, client_area_height); | ||||
|     } | ||||
| 
 | ||||
| protected: | ||||
|     EmuWindow() | ||||
|     { | ||||
|     EmuWindow() { | ||||
|         // TODO: Find a better place to set this.
 | ||||
|         config.min_client_area_size = std::make_pair(400u, 480u); | ||||
|         active_config = config; | ||||
|         pad_state.hex = 0; | ||||
|         touch_x = 0; | ||||
|         touch_y = 0; | ||||
|         touch_pressed = false; | ||||
|     } | ||||
|     virtual ~EmuWindow() {} | ||||
| 
 | ||||
|  | @ -168,4 +200,11 @@ private: | |||
| 
 | ||||
|     WindowConfig config;         ///< Internal configuration (changes pending for being applied in ProcessConfigurationChanges)
 | ||||
|     WindowConfig active_config;  ///< Internal active configuration
 | ||||
| 
 | ||||
|     bool touch_pressed;          ///< True if touchpad area is currently pressed, otherwise false
 | ||||
| 
 | ||||
|     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)
 | ||||
| 
 | ||||
|     Service::HID::PadState pad_state; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue