# HG changeset patch # User Michael Pavone # Date 1461301706 25200 # Node ID e28f365605da4d4f7909708fdf7dba2aaf789112 # Parent e2d7067ea2d8029b12c11da231fe70c81c597b81 Move mouse mode and capture state to emulation context so it persists properly when switching between the menu and the game diff -r e2d7067ea2d8 -r e28f365605da blastem.c --- 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; diff -r e2d7067ea2d8 -r e28f365605da blastem.h --- 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; }; diff -r e2d7067ea2d8 -r e28f365605da io.c --- 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) { diff -r e2d7067ea2d8 -r e28f365605da io.h --- 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);