/** * Show and process the joystick dialog. */ void Dialog_JoyDlg(void) { int but; SDLGui_CenterDlg(joydlg); joydlg[DLGJOY_MSJY].state &= ~SG_SELECTED; joydlg[DLGJOY_JYJY].state &= ~SG_SELECTED; joydlg[DLGJOY_MSMS].state &= ~SG_SELECTED; int j0 = currprefs.jports[0].id/ JSEM_JOYS; int j1 = currprefs.jports[1].id/ JSEM_JOYS; if (j0 == 2 && j1 == 1) { //mouse & joy-1 joydlg[DLGJOY_MSJY].state |= SG_SELECTED; } else if (j0 == 1 && j1 == 1) { //joy-2 & joy-1 joydlg[DLGJOY_JYJY].state |= SG_SELECTED; } else { joydlg[DLGJOY_MSMS].state |= SG_SELECTED; } do { but = SDLGui_DoDialog(joydlg, NULL); gui_poll_events(); } while (but != DLGJOY_EXIT && but != SDLGUI_QUIT && but != SDLGUI_ERROR && !bQuitProgram); if(joydlg[DLGJOY_MSJY].state & SG_SELECTED){ changed_prefs.jports[0].id = JSEM_MICE; changed_prefs.jports[1].id = JSEM_JOYS; changed_prefs.mouse_settings[1]->enabled = 0; } else if(joydlg[DLGJOY_JYJY].state & SG_SELECTED){ changed_prefs.jports[0].id = JSEM_JOYS + 1; changed_prefs.jports[1].id = JSEM_JOYS; changed_prefs.mouse_settings[1]->enabled = 0; } else if(joydlg[DLGJOY_MSMS].state & SG_SELECTED){ changed_prefs.jports[0].id = JSEM_MICE; changed_prefs.jports[1].id = JSEM_MICE + 1; changed_prefs.mouse_settings[1]->enabled = 1; } inputdevice_config_change(); check_prefs_changed_custom(); }
static void values_from_dialog(int changedport, bool reset) { int i; int changed = 0; int prevport; if(reset) inputdevice_compa_clear (&workprefs, changedport); for (i = 0; i < MAX_JPORTS; i++) { int prevport = workprefs.jports[i].id; int max = JSEM_LASTKBD + inputdevice_get_device_total (IDTYPE_JOYSTICK); if (i < 2) max += inputdevice_get_device_total (IDTYPE_MOUSE); int id = cboPorts[i]->getSelected() - 1; if (id < 0) { workprefs.jports[i].id = JPORT_NONE; } else if (id >= max) { workprefs.jports[i].id = JPORT_NONE; } else if (id < JSEM_LASTKBD) { workprefs.jports[i].id = JSEM_KBDLAYOUT + id; } else if (id >= JSEM_LASTKBD + inputdevice_get_device_total (IDTYPE_JOYSTICK)) { workprefs.jports[i].id = JSEM_MICE + id - inputdevice_get_device_total (IDTYPE_JOYSTICK) - JSEM_LASTKBD; } else { workprefs.jports[i].id = JSEM_JOYS + id - JSEM_LASTKBD; } if (workprefs.jports[i].id != prevport) changed = 1; if (i >= 2) continue; if(cboPortModes[i] != NULL) workprefs.jports[i].mode = inputmode_val[cboPortModes[i]->getSelected()]; if(cboAutofires[i] != NULL) workprefs.jports[i].autofire = cboAutofires[i]->getSelected(); } if (changed) inputdevice_validate_jports (&workprefs, changedport, NULL); RefreshPanelGamePort(); inputdevice_config_change(); if(reset) inputdevice_forget_unplugged_device(changedport); }
// Handler for the XM_NOTIFY message HRESULT COptionsScene::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled ) { switch(m_GroupJoy.GetCurSel()) { case 0: memset (&changed_prefs.jports[0], 0, sizeof (struct jport)); memset (&changed_prefs.jports[1], 0, sizeof (struct jport)); changed_prefs.jports[0].id = JSEM_MICE; changed_prefs.jports[1].id = JSEM_JOYS; changed_prefs.mouse_settings[0]->enabled = 1; config_changed = 1; inputdevice_config_change(); break; case 1: memset (&changed_prefs.jports[0], 0, sizeof (struct jport)); memset (&changed_prefs.jports[1], 0, sizeof (struct jport)); changed_prefs.jports[0].id = JSEM_JOYS + 1; changed_prefs.jports[1].id = JSEM_JOYS; changed_prefs.mouse_settings[1]->enabled = 0; config_changed = 1; inputdevice_config_change(); break; case 2: memset (&changed_prefs.jports[0], 0, sizeof (struct jport)); memset (&changed_prefs.jports[1], 0, sizeof (struct jport)); changed_prefs.jports[0].id = JSEM_MICE; changed_prefs.jports[1].id = JSEM_MICE + 1; changed_prefs.mouse_settings[0]->enabled = 0; changed_prefs.mouse_settings[1]->enabled = 1; config_changed = 1; inputdevice_config_change(); break; } switch(m_GroupCPU.GetCurSel()) { case 0: changed_prefs.cpu_model = 68000; check_prefs_changed_cpu(); break; case 1: changed_prefs.cpu_model = 68010; check_prefs_changed_cpu(); break; case 2: changed_prefs.cpu_model = 68020; check_prefs_changed_cpu(); changed_prefs.address_space_24 = 0; break; case 3: changed_prefs.cpu_model = 68020; check_prefs_changed_cpu(); changed_prefs.address_space_24 = 1; break; case 4: changed_prefs.cpu_model = 68030; check_prefs_changed_cpu(); changed_prefs.address_space_24 = 0; break; case 5: changed_prefs.cpu_model = 68040; check_prefs_changed_cpu(); changed_prefs.address_space_24 = 0; break; } switch (m_GroupChipset.GetCurSel()) { case 0: changed_prefs.chipset_mask = 0; break; case 1: changed_prefs.chipset_mask = CSMASK_ECS_AGNUS; break; case 2: changed_prefs.chipset_mask = CSMASK_ECS_DENISE; break; case 3: changed_prefs.chipset_mask = (CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE); break; case 4: changed_prefs.chipset_mask = (CSMASK_AGA | CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE); break; } switch(m_GroupChipMem.GetCurSel()) { case 0: m_GroupFast.SetEnable(true); changed_prefs.chipmem_size = 0x80000; changed_prefs.bogomem_size = 0x0; memory_reset(); break; case 1: m_GroupFast.SetEnable(true); changed_prefs.chipmem_size = 0x100000; changed_prefs.bogomem_size = 0x0; memory_reset(); break; case 2: m_GroupFast.SetEnable(true); changed_prefs.chipmem_size = 0x200000; changed_prefs.bogomem_size = 0x0; memory_reset(); break; case 3: m_GroupFast.SetCurSel(0); m_GroupFast.SetEnable(false); changed_prefs.fastmem_size = 0x00; changed_prefs.chipmem_size = 0x400000; changed_prefs.bogomem_size = 0x0; memory_reset(); break; case 4: m_GroupFast.SetCurSel(0); m_GroupFast.SetEnable(false); changed_prefs.chipmem_size = 0x800000; changed_prefs.fastmem_size = 0x00; changed_prefs.bogomem_size = 0x0; memory_reset(); break; } switch (m_GroupFast.GetCurSel()) { case 0x00000000: changed_prefs.fastmem_size = 0x00000000; memory_reset(); break; case 0x100000: changed_prefs.fastmem_size = 0x100000; memory_reset(); break; case 0x200000: changed_prefs.fastmem_size = 0x200000; memory_reset(); break; case 0x400000: changed_prefs.fastmem_size = 0x400000; memory_reset(); break; case 0x800000: changed_prefs.fastmem_size = 0x800000; memory_reset(); break; } switch(m_GroupBogoMem.GetCurSel()) { case 0: changed_prefs.bogomem_size = 0x0; memory_reset(); break; case 1: changed_prefs.bogomem_size = 0x80000; memory_reset(); break; case 2: changed_prefs.bogomem_size = 0x100000; memory_reset(); break; case 3: changed_prefs.bogomem_size = 0x180000; memory_reset(); break; case 4: changed_prefs.bogomem_size = 0x1c0000; memory_reset(); break; } switch(m_GroupFast.GetCurSel()) { case 0: changed_prefs.fastmem_size = 0x00; memory_reset(); break; case 1: changed_prefs.fastmem_size = 0x100000; memory_reset(); break; case 2: changed_prefs.fastmem_size = 0x200000; memory_reset(); break; case 3: changed_prefs.fastmem_size = 0x400000; memory_reset(); break; case 4: changed_prefs.fastmem_size = 0x800000; memory_reset(); break; } switch(m_GroupZ3Fast.GetCurSel()) { case 0: changed_prefs.z3fastmem_size = 0x00; memory_reset(); break; case 1: changed_prefs.z3fastmem_size = 0x800000; memory_reset(); break; case 2: changed_prefs.z3fastmem_size = 0x2000000; memory_reset(); break; case 3: changed_prefs.z3fastmem_size = 0x4000000; memory_reset(); break; case 4: changed_prefs.z3fastmem_size = 0x8000000; memory_reset(); break; } switch(m_GroupRTG.GetCurSel()) { case 0: changed_prefs.gfxmem_size = 0x00; memory_reset(); break; case 1: changed_prefs.gfxmem_size = 0x800000; memory_reset(); break; case 2: changed_prefs.gfxmem_size = 0x2000000; memory_reset(); break; case 3: changed_prefs.gfxmem_size = 0x4000000; memory_reset(); break; case 4: changed_prefs.gfxmem_size = 0x8000000; memory_reset(); break; } if (m_FasterRTG.IsChecked()) { changed_prefs.picasso96_nocustom = 1; check_prefs_changed_gfx(); } else { changed_prefs.picasso96_nocustom = 0; check_prefs_changed_gfx(); } if (m_BSDSocket.IsChecked()) { currprefs.socket_emu = 1; } else { currprefs.socket_emu = 0; } if (m_Picasso96.IsChecked()) { currprefs.picasso96_modeflags = 212; check_prefs_changed_gfx(); } else { currprefs.picasso96_modeflags = 0; check_prefs_changed_gfx(); } if (m_DriveClick.IsChecked()) { changed_prefs.floppyslots[0].dfxclick = -1; changed_prefs.dfxclickvolume = 33; changed_prefs.dfxclickchannelmask = 0xFFFF; check_prefs_changed_audio (); driveclick_check_prefs(); } else { changed_prefs.floppyslots[0].dfxclick = 0; check_prefs_changed_audio (); driveclick_check_prefs(); } if (m_24BitAddressing.IsChecked()) { changed_prefs.address_space_24 = 1; check_prefs_changed_custom (); } else { changed_prefs.address_space_24 = 0; check_prefs_changed_custom (); } if (m_CycleExact.IsChecked()) { changed_prefs.cpu_cycle_exact = 1; check_prefs_changed_custom (); check_prefs_changed_gfx(); } else { changed_prefs.cpu_cycle_exact = 0; check_prefs_changed_custom (); check_prefs_changed_gfx(); } if (m_ImmediateBlits.IsChecked()) { changed_prefs.immediate_blits = 1; check_prefs_changed_custom (); check_prefs_changed_gfx(); } else { changed_prefs.immediate_blits = 0; check_prefs_changed_custom (); check_prefs_changed_gfx(); } if (m_ShowLeds.IsChecked()) { currprefs.leds_on_screen = 1; } else { currprefs.leds_on_screen = 0; } if( XuiControlIsBackButton( hObjPressed ) ) { config_changed = 1; fixup_prefs (&currprefs); this->NavigateBack(); } bHandled = TRUE; return S_OK; }
/* handle_message() * * This is called from the GUI when a GUI event happened. Specifically, * HandleMessage (PPP_Messaging) forwards dispatched UI action * messages posted from JavaScript to handle_message(). */ int32_t handle_message(const char* msg) { /* Grammar for messages from the UI: * * message ::= 'insert' drive fileURL * | 'rom' fileURL * | 'connect' port input * | 'eject' drive * | 'reset' | 'pause' | 'resume' * | 'resize' <width> <height> * device ::= 'kickstart' | drive * drive ::= 'df0' | 'df1' * port ::= 'port0' | 'port1' * input ::= 'mouse' | 'joy0' | 'joy1' | 'kbd0' | 'kbd1' * fileURL ::= <a URL of the form blob://> */ DEBUG_LOG("%s\n", msg); if (!gui_initialized) { DEBUG_LOG("GUI message refused; not yet initialized.\n"); return -1; } /* TODO(cstefansen): scan the string instead of these shenanigans. */ /* Copy to non-const buffer. */ char buf[1024]; (void) strncpy(buf, msg, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; /* Ensure NUL termination. */ /* Tokenize message up to 3 tokens (max given the grammar). */ int32_t i = 0; char *t[3], *token, *rest = NULL, *sep = " "; for (token = strtok_r(buf, sep, &rest); token != NULL && i <= 3; token = strtok_r(NULL, sep, &rest), ++i) { t[i] = token; } /* Pipe message to UAE main thread. */ if (i == 1 && !strcmp(t[0], "reset")) { write_comm_pipe_int(&from_gui_pipe, UAECMD_RESET, 1); } else if (i == 1 && !strcmp(t[0], "pause")) { /* It would be cleaner to call pause_sound and resume_sound in * gui_handle_events below, i.e, on the emulator thread. However, * if we're pausing because the tab is no longer in the foreground, * no graphics flush calls will unblock and no graphics callbacks will * be delivered until the tab is back in front. This means that the * emulator is probably already stuck in some call and won't get to * our UI request to pause the sound. */ /* TODO(cstefansen)People are reporting pausing/resuming problems; let's not do this until investigated. */ /* pause_sound(); */ write_comm_pipe_int(&from_gui_pipe, UAECMD_PAUSE, 1); } else if (i == 1 && !strcmp(t[0], "resume")) { /* resume_sound(); */ write_comm_pipe_int(&from_gui_pipe, UAECMD_RESUME, 1); } else if (i == 2 && !strcmp(t[0], "eject")) { int32_t drive_num; if (!strcmp(t[1], "df0")) { drive_num = 0; } else if (!strcmp(t[1], "df1")) { drive_num = 1; } else { return -1; } write_comm_pipe_int(&from_gui_pipe, UAECMD_EJECTDISK, 0); write_comm_pipe_int(&from_gui_pipe, drive_num, 1); } else if (i == 3 && !strcmp(t[0], "resize")) { long width = strtol(t[1], NULL, 10); long height = strtol(t[2], NULL, 10); if (width > INT_MAX || height > INT_MAX || errno == ERANGE || width <= 0 || height <= 0) { write_log("Could not parse width/height in message: %s\n", msg); return -1; } write_comm_pipe_int(&from_gui_pipe, UAECMD_RESIZE, 0); write_comm_pipe_int(&from_gui_pipe, (int32_t) width, 0); write_comm_pipe_int(&from_gui_pipe, (int32_t) height, 1); } else if (i == 3 && !strcmp(t[0], "insert")) { int32_t drive_num; if (!strcmp(t[1], "df0")) { drive_num = 0; } else if (!strcmp(t[1], "df1")) { drive_num = 1; } else { return -1; } uae_sem_wait(&gui_sem); if (new_disk_string[drive_num] != 0) free (new_disk_string[drive_num]); new_disk_string[drive_num] = strdup(t[2]); uae_sem_post(&gui_sem); write_comm_pipe_int (&from_gui_pipe, UAECMD_INSERTDISK, 0); write_comm_pipe_int (&from_gui_pipe, drive_num, 1); } else if (i == 2 && !strcmp(t[0], "rom")) { uae_sem_wait(&gui_sem); if (gui_romname != 0) free (gui_romname); gui_romname = strdup(t[1]); uae_sem_post(&gui_sem); write_comm_pipe_int(&from_gui_pipe, UAECMD_SELECT_ROM, 1); } else if (i == 3 && !strcmp(t[0], "connect")) { int32_t port_num; if (!strcmp(t[1], "port0")) { port_num = 0; } else if (!strcmp(t[1], "port1")) { port_num = 1; } else { return -1; } int32_t input_device = !strcmp(t[2], "mouse") ? JSEM_MICE : !strcmp(t[2], "joy0") ? JSEM_JOYS : !strcmp(t[2], "joy1") ? JSEM_JOYS + 1 : !strcmp(t[2], "kbd0") ? JSEM_KBDLAYOUT + 1 : !strcmp(t[2], "kbd1") ? JSEM_KBDLAYOUT + 2 : JSEM_END; changed_prefs.jports[port_num].id = input_device; if (changed_prefs.jports[port_num].id != currprefs.jports[port_num].id) { /* It's a little fishy that the typical way to update input * devices doesn't use the comm pipe. */ inputdevice_updateconfig (&changed_prefs); inputdevice_config_change(); } } else { return -1; } return 0; }