Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Makefile.emulatorjs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ EXPORTED_FUNCTIONS = _main,_malloc,_free,_load_state, \
_system_restart,_cmd_savefiles,_get_core_options,_cmd_save_state,_supports_states,_reset_cheat,_toggleMainLoop, \
_save_file_path,_get_disk_count,_set_current_disk,_get_current_disk,_refresh_save_files,_toggle_fastforward,_set_ff_ratio, \
_toggle_slow_motion,_set_sm_ratio,_toggle_rewind,_set_rewind_granularity,_get_current_frame_count,_ejs_set_keyboard_enabled, \
_set_vsync,_set_video_rotation,_get_video_dimensions,EmscriptenSendCommand,EmscriptenReceiveCommandReply,_get_memory_data
_set_vsync,_set_video_rotation,_get_video_dimensions,EmscriptenSendCommand,EmscriptenReceiveCommandReply,_get_memory_data, \
_ejs_set_controller_port_device,_ejs_get_controller_port_info

EXPORTS := Browser,callMain,cwrap,getValue,HEAPU8,FS,PATH,ERRNO_CODES,AL,abort,ENV,stringToNewUTF8,UTF8ToString,Browser,EmscriptenSendCommand,EmscriptenReceiveCommandReply,EmulatorJSGetState,EmulatorJSGetMemoryData

Expand Down
39 changes: 39 additions & 0 deletions input/drivers/emulatorjs_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,44 @@ static int16_t rwebinput_input_state(
case RETRO_DEVICE_MOUSE:
case RARCH_DEVICE_MOUSE_SCREEN:
return rwebinput_mouse_state(&rwebinput->mouse, id, device == RARCH_DEVICE_MOUSE_SCREEN);
case RETRO_DEVICE_LIGHTGUN:
{
struct video_viewport vp = {0};
rwebinput_mouse_state_t
*mouse = &rwebinput->mouse;
int16_t res_x = 0;
int16_t res_y = 0;
int16_t res_screen_x = 0;
int16_t res_screen_y = 0;

if (!(video_driver_translate_coord_viewport_confined_wrap(
&vp, mouse->x, mouse->y,
&res_x, &res_y, &res_screen_x, &res_screen_y)))
return 0;

switch (id)
{
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X:
return res_x;
case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y:
return res_y;
case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN:
return input_driver_pointer_is_offscreen(res_x, res_y);
case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
return !!(mouse->buttons & (1 << RWEBINPUT_MOUSE_BTNL));
case RETRO_DEVICE_ID_LIGHTGUN_AUX_A:
return !!(mouse->buttons & (1 << RWEBINPUT_MOUSE_BTNR));
case RETRO_DEVICE_ID_LIGHTGUN_AUX_B:
return !!(mouse->buttons & (1 << RWEBINPUT_MOUSE_BTNM));
case RETRO_DEVICE_ID_LIGHTGUN_START:
return !!(mouse->buttons & (1 << RWEBINPUT_MOUSE_BTN4));
case RETRO_DEVICE_ID_LIGHTGUN_SELECT:
return !!(mouse->buttons & (1 << RWEBINPUT_MOUSE_BTN5));
default:
break;
}
}
break;
case RETRO_DEVICE_POINTER:
case RARCH_DEVICE_POINTER_SCREEN:
{
Expand Down Expand Up @@ -1046,6 +1084,7 @@ static uint64_t rwebinput_get_capabilities(void *data)
| (1 << RETRO_DEVICE_ANALOG)
| (1 << RETRO_DEVICE_KEYBOARD)
| (1 << RETRO_DEVICE_MOUSE)
| (1 << RETRO_DEVICE_LIGHTGUN)
| (1 << RETRO_DEVICE_POINTER);
}

Expand Down
53 changes: 53 additions & 0 deletions runloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -8670,4 +8670,57 @@ float get_video_dimensions(const char *key)
return -1.0f;
}
}

void ejs_set_controller_port_device(unsigned port, unsigned device)
{
retro_ctx_controller_info_t pad;
pad.port = port;
pad.device = device;
core_set_controller_port_device(&pad);
}

char* ejs_get_controller_port_info(void)
{
runloop_state_t *runloop_st = &runloop_state;
rarch_system_info_t *sys_info = &runloop_st->system;

if (!sys_info || !sys_info->ports.data || sys_info->ports.size == 0)
return "";

/* Calculate required buffer size */
size_t size = 1;
for (size_t i = 0; i < sys_info->ports.size; i++)
{
const struct retro_controller_info *port = &sys_info->ports.data[i];
for (size_t j = 0; j < port->num_types; j++)
{
if (!port->types[j].desc)
continue;
size += snprintf(NULL, 0, "%zu:%u:%s\n",
i, port->types[j].id, port->types[j].desc);
}
}

static char *rv = NULL;
free(rv);
rv = (char*)calloc(size, 1);
if (!rv)
return "";

for (size_t i = 0; i < sys_info->ports.size; i++)
{
const struct retro_controller_info *port = &sys_info->ports.data[i];
for (size_t j = 0; j < port->num_types; j++)
{
if (!port->types[j].desc)
continue;
char line[256];
snprintf(line, sizeof(line), "%zu:%u:%s\n",
i, port->types[j].id, port->types[j].desc);
strcat(rv, line);
}
}

return rv;
}
#endif