53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include <kinc/backend/Windows.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/system.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/window.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/input/mouse.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_internal_mouse_lock(int window) {
							 | 
						||
| 
								 | 
							
									kinc_mouse_hide();
							 | 
						||
| 
								 | 
							
									HWND handle = kinc_windows_window_handle(window);
							 | 
						||
| 
								 | 
							
									SetCapture(handle);
							 | 
						||
| 
								 | 
							
									RECT rect;
							 | 
						||
| 
								 | 
							
									GetWindowRect(handle, &rect);
							 | 
						||
| 
								 | 
							
									ClipCursor(&rect);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_internal_mouse_unlock(void) {
							 | 
						||
| 
								 | 
							
									kinc_mouse_show();
							 | 
						||
| 
								 | 
							
									ReleaseCapture();
							 | 
						||
| 
								 | 
							
									ClipCursor(NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bool kinc_mouse_can_lock(void) {
							 | 
						||
| 
								 | 
							
									return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_mouse_show() {
							 | 
						||
| 
								 | 
							
									// Work around the internal counter of ShowCursor
							 | 
						||
| 
								 | 
							
									while (ShowCursor(true) < 0) {
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_mouse_hide() {
							 | 
						||
| 
								 | 
							
									// Work around the internal counter of ShowCursor
							 | 
						||
| 
								 | 
							
									while (ShowCursor(false) >= 0) {
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_mouse_set_position(int window, int x, int y) {
							 | 
						||
| 
								 | 
							
									POINT point;
							 | 
						||
| 
								 | 
							
									point.x = x;
							 | 
						||
| 
								 | 
							
									point.y = y;
							 | 
						||
| 
								 | 
							
									ClientToScreen(kinc_windows_window_handle(window), &point);
							 | 
						||
| 
								 | 
							
									SetCursorPos(point.x, point.y);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_mouse_get_position(int window, int *x, int *y) {
							 | 
						||
| 
								 | 
							
									POINT point;
							 | 
						||
| 
								 | 
							
									GetCursorPos(&point);
							 | 
						||
| 
								 | 
							
									ScreenToClient(kinc_windows_window_handle(window), &point);
							 | 
						||
| 
								 | 
							
									*x = point.x;
							 | 
						||
| 
								 | 
							
									*y = point.y;
							 | 
						||
| 
								 | 
							
								}
							 |