changeset 971:e28f365605da

Move mouse mode and capture state to emulation context so it persists properly when switching between the menu and the game
author Michael Pavone <pavone@retrodev.com>
date Thu, 21 Apr 2016 22:08:26 -0700
parents e2d7067ea2d8
children 4899d3ae37b3
files blastem.c blastem.h io.c io.h
diffstat 4 files changed, 18 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Thu Apr 21 18:48:15 2016 -0700
+++ b/blastem.c	Thu Apr 21 22:08:26 2016 -0700
@@ -878,7 +878,7 @@
 	gen->cart = cart;
 	gen->work_ram = ram;
 	gen->zram = z80_ram;
-	setup_io_devices(config, rom, gen->ports);
+	setup_io_devices(config, rom, gen);
 
 	gen->save_type = rom->save_type;
 	gen->save_type = rom->save_type;
--- a/blastem.h	Thu Apr 21 18:48:15 2016 -0700
+++ b/blastem.h	Thu Apr 21 22:08:26 2016 -0700
@@ -49,6 +49,8 @@
 	uint8_t         bus_busy;
 	uint8_t         should_exit;
 	uint8_t         save_state;
+	uint8_t         mouse_mode;
+	uint8_t         mouse_captured;
 	eeprom_state    eeprom;
 };
 
--- a/io.c	Thu Apr 21 18:48:15 2016 -0700
+++ b/io.c	Thu Apr 21 22:08:26 2016 -0700
@@ -108,8 +108,6 @@
 static joystick joysticks[MAX_JOYSTICKS];
 static mousebinding mice[MAX_MICE];
 const uint8_t dpadbits[] = {RENDER_DPAD_UP, RENDER_DPAD_DOWN, RENDER_DPAD_LEFT, RENDER_DPAD_RIGHT};
-static mouse_modes mouse_mode;
-static char mouse_captured;
 
 void bind_key(int keycode, uint8_t bind_type, uint8_t subtype_a, uint8_t subtype_b, uint8_t value)
 {
@@ -278,8 +276,8 @@
 
 void handle_mousedown(int mouse, int button)
 {
-	if (mouse_mode == MOUSE_CAPTURE && !mouse_captured) {
-		mouse_captured = 1;
+	if (genesis->mouse_mode == MOUSE_CAPTURE && !genesis->mouse_captured) {
+		genesis->mouse_captured = 1;
 		render_relative_mouse(1);
 		return;
 	}
@@ -378,8 +376,8 @@
 			}
 			break;
 		case UI_RELEASE_MOUSE:
-			if (mouse_captured) {
-				mouse_captured = 0;
+			if (genesis->mouse_captured) {
+				genesis->mouse_captured = 0;
 				render_relative_mouse(0);
 			}
 			break;
@@ -443,7 +441,7 @@
 		return;
 	}
 	//TODO: relative mode
-	switch(mouse_mode)
+	switch(genesis->mouse_mode)
 	{
 	case MOUSE_ABSOLUTE: {
 		float scale_x = 640.0 / ((float)render_width());
@@ -459,7 +457,7 @@
 		break;
 	}
 	case MOUSE_CAPTURE: {
-		if (mouse_captured) {
+		if (genesis->mouse_captured) {
 			mice[mouse].motion_port->device.mouse.cur_x += deltax;
 			mice[mouse].motion_port->device.mouse.cur_y += deltay;
 		}
@@ -697,8 +695,9 @@
 	unlink(sockfile_name);
 }
 
-void setup_io_devices(tern_node * config, rom_info *rom, io_port * ports)
+void setup_io_devices(tern_node * config, rom_info *rom, genesis_context *gen)
 {
+	io_port * ports = gen->ports;
 	tern_node *io_nodes = tern_get_node(tern_find_path(config, "io\0devices\0"));
 	char * io_1 = rom->port1_override ? rom->port1_override : tern_find_ptr(io_nodes, "1");
 	char * io_2 = rom->port2_override ? rom->port2_override : tern_find_ptr(io_nodes, "2");
@@ -709,13 +708,13 @@
 	process_device(io_ext, ports+2);
 
 	if (render_fullscreen()) {
-			mouse_mode = MOUSE_RELATIVE;
+			gen->mouse_mode = MOUSE_RELATIVE;
 			render_relative_mouse(1);
 	} else {
 		if (rom->mouse_mode && !strcmp(rom->mouse_mode, "absolute")) {
-			mouse_mode = MOUSE_ABSOLUTE;
+			gen->mouse_mode = MOUSE_ABSOLUTE;
 		} else {
-			mouse_mode = MOUSE_CAPTURE;
+			gen->mouse_mode = MOUSE_CAPTURE;
 		}
 	}
 
@@ -1074,7 +1073,7 @@
 		if (port->device.mouse.tr_counter == 3) {
 			port->device.mouse.latched_x = port->device.mouse.cur_x;
 			port->device.mouse.latched_y = port->device.mouse.cur_y;
-			if (mouse_mode == MOUSE_ABSOLUTE) {
+			if (genesis->mouse_mode == MOUSE_ABSOLUTE) {
 				//avoid overflow in absolute mode
 				int deltax = port->device.mouse.latched_x - port->device.mouse.last_read_x;
 				if (abs(deltax) > 255) {
--- a/io.h	Thu Apr 21 18:48:15 2016 -0700
+++ b/io.h	Thu Apr 21 22:08:26 2016 -0700
@@ -68,9 +68,11 @@
 	IO_READ
 };
 
+typedef struct genesis_context genesis_context;
+
 void set_keybindings(io_port *ports);
 void map_all_bindings(io_port *ports);
-void setup_io_devices(tern_node * config, rom_info *rom, io_port * ports);
+void setup_io_devices(tern_node * config, rom_info *rom, genesis_context * gen);
 void io_adjust_cycles(io_port * pad, uint32_t current_cycle, uint32_t deduction);
 void io_data_write(io_port * pad, uint8_t value, uint32_t current_cycle);
 uint8_t io_data_read(io_port * pad, uint32_t current_cycle);