changeset 916:20c464dbae8f

Finished implementation of mouse capture mode
author Michael Pavone <pavone@retrodev.com>
date Thu, 17 Dec 2015 20:03:50 -0800
parents 9e882eca717e
children f057975212e9
files default.cfg io.c
diffstat 2 files changed, 24 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/default.cfg	Tue Dec 15 20:01:50 2015 -0800
+++ b/default.cfg	Thu Dec 17 20:03:50 2015 -0800
@@ -14,6 +14,7 @@
 		f gamepads.1.mode
 		enter gamepads.1.start
 
+		r ui.release_mouse
 		[ ui.vdp_debug_mode
 		] ui.vdp_debug_pal
 		u ui.enter_debugger
--- a/io.c	Tue Dec 15 20:01:50 2015 -0800
+++ b/io.c	Thu Dec 17 20:03:50 2015 -0800
@@ -65,6 +65,7 @@
 	UI_SET_SPEED,
 	UI_NEXT_SPEED,
 	UI_PREV_SPEED,
+	UI_RELEASE_MOUSE,
 	UI_EXIT
 } ui_action;
 
@@ -100,6 +101,7 @@
 mousebinding mice[MAX_MICE];
 const uint8_t dpadbits[] = {RENDER_DPAD_UP, RENDER_DPAD_DOWN, RENDER_DPAD_LEFT, RENDER_DPAD_RIGHT};
 mouse_modes mouse_mode;
+char mouse_captured;
 
 void bind_key(int keycode, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b, uint8_t value)
 {
@@ -265,6 +267,11 @@
 
 void handle_mousedown(int mouse, int button)
 {
+	if (mouse_mode == MOUSE_CAPTURE && !mouse_captured) {
+		mouse_captured = 1;
+		render_relative_mouse(1);
+		return;
+	}
 	if (mouse >= MAX_MICE || button > MAX_MOUSE_BUTTONS || button <= 0) {
 		return;
 	}
@@ -359,6 +366,12 @@
 				set_speed_percent(genesis, binding->value);
 			}
 			break;
+		case UI_RELEASE_MOUSE:
+			if (mouse_captured) {
+				mouse_captured = 0;
+				render_relative_mouse(0);
+			}
+			break;
 		case UI_EXIT:
 			genesis->m68k->should_return = 1;
 		}
@@ -435,6 +448,10 @@
 		break;
 	}
 	case MOUSE_CAPTURE: {
+		if (mouse_captured) {
+			mice[mouse].motion_port->device.mouse.cur_x += deltax;
+			mice[mouse].motion_port->device.mouse.cur_y += deltay;
+		}
 	}
 	}
 }
@@ -496,6 +513,8 @@
 			*ui_out = UI_NEXT_SPEED;
 		} else if(!strcmp(target + 3, "prev_speed")) {
 			*ui_out = UI_PREV_SPEED;
+		} else if(!strcmp(target + 3, "release_mouse")) {
+			*ui_out = UI_RELEASE_MOUSE;
 		} else if(!strcmp(target + 3, "exit")) {
 			*ui_out = UI_EXIT;
 		} else {
@@ -678,12 +697,12 @@
 	process_device(io_2, ports+1);
 	process_device(io_ext, ports+2);
 
-	if (rom->mouse_mode && !strcmp(rom->mouse_mode, "absolute")) {
-		mouse_mode = MOUSE_ABSOLUTE;
-	} else {
-		if (render_fullscreen()) {
+	if (render_fullscreen()) {
 			mouse_mode = MOUSE_RELATIVE;
 			render_relative_mouse(1);
+	} else {
+		if (rom->mouse_mode && !strcmp(rom->mouse_mode, "absolute")) {
+			mouse_mode = MOUSE_ABSOLUTE;
 		} else {
 			mouse_mode = MOUSE_CAPTURE;
 		}