mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #698 from Zaneo/clip_stylus_input
EmuWindow: Clip mouse input coordinates to emulated screen dimensions.
This commit is contained in:
		
						commit
						7859b145cf
					
				
					 4 changed files with 23 additions and 8 deletions
				
			
		|  | @ -31,7 +31,7 @@ void EmuWindow_GLFW::OnMouseButtonEvent(GLFWwindow* win, int button, int action, | |||
| } | ||||
| 
 | ||||
| void EmuWindow_GLFW::OnCursorPosEvent(GLFWwindow* win, double x, double y) { | ||||
|     GetEmuWindow(win)->TouchMoved(static_cast<unsigned>(x), static_cast<unsigned>(y)); | ||||
|     GetEmuWindow(win)->TouchMoved(static_cast<unsigned>(std::max(x, 0.0)), static_cast<unsigned>(std::max(y, 0.0))); | ||||
| } | ||||
| 
 | ||||
| /// Called by GLFW when a key event occurs
 | ||||
|  |  | |||
|  | @ -225,7 +225,7 @@ void GRenderWindow::mousePressEvent(QMouseEvent *event) | |||
| void GRenderWindow::mouseMoveEvent(QMouseEvent *event) | ||||
| { | ||||
|     auto pos = event->pos(); | ||||
|     this->TouchMoved(static_cast<unsigned>(pos.x()), static_cast<unsigned>(pos.y())); | ||||
|     this->TouchMoved(static_cast<unsigned>(std::max(pos.x(), 0)), static_cast<unsigned>(std::max(pos.y(), 0))); | ||||
| } | ||||
| 
 | ||||
| void GRenderWindow::mouseReleaseEvent(QMouseEvent *event) | ||||
|  |  | |||
|  | @ -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)) | ||||
|     if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) | ||||
|         std::tie(framebuffer_x, framebuffer_y) = ClipToTouchScreen(framebuffer_x, framebuffer_y); | ||||
| 
 | ||||
|     TouchPressed(framebuffer_x, framebuffer_y); | ||||
|     else | ||||
|         TouchReleased(); | ||||
| } | ||||
| 
 | ||||
| EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, | ||||
|     unsigned height) { | ||||
| EmuWindow::FramebufferLayout EmuWindow::FramebufferLayout::DefaultScreenLayout(unsigned width, unsigned height) { | ||||
| 
 | ||||
|     ASSERT(width > 0); | ||||
|     ASSERT(height > 0); | ||||
|  |  | |||
|  | @ -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; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue