void fs_uae_reconfigure_input_ports_host() { fs_emu_log("fs_uae_reconfigure_input_ports_host\n"); fs_emu_reset_input_mapping(); fs_uae_map_keyboard(); int mouse_mapped_to_port = -1; for (int i = 0; i < FS_UAE_NUM_INPUT_PORTS; i++) { fs_uae_input_port *port = g_fs_uae_input_ports + i; fs_log("configuring joystick port %d\n", i); if (port->mode == AMIGA_JOYPORT_NONE) { fs_log("* nothing in port\n"); fs_log("* FIXME\n"); } else if (port->mode == AMIGA_JOYPORT_MOUSE) { fs_log("* amiga mouse\n"); // if (strcmp(port->device, "MOUSE") == 0) { // fs_log("* using host mouse\n"); fs_log("* using device %s\n", port->device); map_mouse(port->device, i); mouse_mapped_to_port = i; // } // else { // fs_log("* not mapping host device to amiga mouse\n"); // } } else if (port->mode == AMIGA_JOYPORT_DJOY) { fs_log("* amiga joystick\n"); if (strcmp(port->device, "MOUSE") == 0) { fs_log("* cannot map mouse to joystick\n"); } else { fs_log("* using device %s\n", port->device); fs_emu_configure_joystick(port->device, "amiga", g_joystick_mappings[i], 1, NULL, 0, true); } } else if (port->mode == AMIGA_JOYPORT_CD32JOY) { fs_log("* amiga cd32 gamepad\n"); if (strcmp(port->device, "MOUSE") == 0) { fs_log("* cannot map mouse to cd32 gamepad\n"); } else { fs_log("* using device %s\n", port->device); fs_emu_configure_joystick(port->device, "cd32", g_joystick_mappings[i], 1, NULL, 0, true); } } } fs_uae_input_port *port0 = g_fs_uae_input_ports; #if 0 int autoswitch = fs_config_get_boolean("joystick_port_0_autoswitch"); if (autoswitch == FS_CONFIG_NONE) { autoswitch = 0; } if (!autoswitch) { if (mouse_mapped_to_port == -1 && port0->mode != AMIGA_JOYPORT_NONE) { // there is a device in port 0, but mouse is not use in either // port fs_log("additionally mapping mouse buttons to port 0\n"); fs_emu_configure_mouse("MOUSE", 0, 0, INPUTEVENT_JOY1_FIRE_BUTTON, 0, INPUTEVENT_JOY1_2ND_BUTTON, 0); } } #endif if (mouse_mapped_to_port == -1 && port0->mode == AMIGA_JOYPORT_DJOY) { fs_log("additionally mapping mouse to port 0\n"); map_mouse("mouse", 0); } #if 0 if (autoswitch && !fs_emu_netplay_enabled()) { // auto-select for other devices when not in netplay mode if (mouse_mapped_to_port == -1) { // FIXME: device "9" is a bit of a hack here, should promote fs_emu_configure_mouse("MOUSE", 0, 0, INPUTEVENT_AMIGA_JOYPORT_0_DEVICE_9, 0, 0, 0); } int count; fs_emu_input_device *input_device = fs_emu_get_input_devices(&count); for (int i = 0; i < count; i++) { //printf("---- %d %s\n", i, input_device->name); //printf("usage: %d\n", input_device->usage); if (input_device->usage) { // this device is used, so we don't want auto-select for this // device input_device++; continue; } if (strcmp(input_device->name, "KEYBOARD") == 0) { continue; } int input_event = INPUTEVENT_AMIGA_JOYPORT_0_DEVICE_0 + i; fs_emu_input_mapping mapping[] = { { "1", input_event }, { NULL, 0 }, }; fs_emu_configure_joystick(input_device->name, "amiga", mapping, 0, NULL, 0); input_device++; }; } #endif fs_emu_map_custom_actions(); }
void menu_dats_view::draw(uint32_t flags) { float const line_height = ui().get_line_height(); float const ud_arrow_width = line_height * machine().render().ui_aspect(); float const gutter_width = 0.52f * line_height * machine().render().ui_aspect(); float const visible_width = 1.0f - (2.0f * UI_BOX_LR_BORDER); float const visible_left = (1.0f - visible_width) * 0.5f; float const extra_height = 2.0f * line_height; float const visible_extra_menu_height = get_customtop() + get_custombottom() + extra_height; int const visible_items = item.size() - 2; // determine effective positions taking into account the hilighting arrows float const effective_width = visible_width - 2.0f * gutter_width; float const effective_left = visible_left + gutter_width; draw_background(); map_mouse(); // account for extra space at the top and bottom float visible_main_menu_height = 1.0f - 2.0f * UI_BOX_TB_BORDER - visible_extra_menu_height; m_visible_lines = int(std::trunc(visible_main_menu_height / line_height)); visible_main_menu_height = float(m_visible_lines) * line_height; // compute top/left of inner menu area by centering, if the menu is at the bottom of the extra, adjust float const visible_top = ((1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f) + get_customtop(); // compute left box size float x1 = visible_left; float y1 = visible_top - UI_BOX_TB_BORDER; float x2 = x1 + visible_width; float y2 = visible_top + visible_main_menu_height + UI_BOX_TB_BORDER + extra_height; float line = visible_top + float(m_visible_lines) * line_height; ui().draw_outlined_box(container(), x1, y1, x2, y2, UI_BACKGROUND_COLOR); m_visible_lines = (std::min)(visible_items, m_visible_lines); top_line = (std::max)(0, top_line); if (top_line + m_visible_lines >= visible_items) top_line = visible_items - m_visible_lines; hover = item.size() + 1; int const n_loop = (std::min)(visible_items, m_visible_lines); for (int linenum = 0; linenum < n_loop; linenum++) { float const line_y = visible_top + (float)linenum * line_height; int const itemnum = top_line + linenum; menu_item const &pitem = item[itemnum]; char const *const itemtext = pitem.text.c_str(); float const line_x0 = x1 + 0.5f * UI_LINE_WIDTH; float const line_y0 = line_y; float const line_x1 = x2 - 0.5f * UI_LINE_WIDTH; float const line_y1 = line_y + line_height; rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; if (!linenum && top_line) { // if we're on the top line, display the up arrow if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1)) { fgcolor = UI_MOUSEOVER_COLOR; bgcolor = UI_MOUSEOVER_BG_COLOR; highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); hover = HOVER_ARROW_UP; } draw_arrow( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, line_y + 0.75f * line_height, fgcolor, ROT0); } else if ((linenum == m_visible_lines - 1) && (itemnum != visible_items - 1)) { // if we're on the bottom line, display the down arrow if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1)) { fgcolor = UI_MOUSEOVER_COLOR; bgcolor = UI_MOUSEOVER_BG_COLOR; highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); hover = HOVER_ARROW_DOWN; } draw_arrow( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, line_y + 0.75f * line_height, fgcolor, ROT0 ^ ORIENTATION_FLIP_Y); } else if (pitem.subtext.empty()) { // draw dats text ui().draw_text_full( container(), itemtext, effective_left, line_y, effective_width, ui::text_layout::LEFT, ui::text_layout::NEVER, mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr); } } for (size_t count = visible_items; count < item.size(); count++) { menu_item const &pitem = item[count]; char const *const itemtext = pitem.text.c_str(); float const line_x0 = x1 + 0.5f * UI_LINE_WIDTH; float const line_y0 = line; float const line_x1 = x2 - 0.5f * UI_LINE_WIDTH; float const line_y1 = line + line_height; rgb_t const fgcolor = UI_SELECTED_COLOR; rgb_t const bgcolor = UI_SELECTED_BG_COLOR; if (mouse_in_rect(line_x0, line_y0, line_x1, line_y1) && is_selectable(pitem)) hover = count; if (pitem.type == menu_item_type::SEPARATOR) { container().add_line( visible_left, line + 0.5f * line_height, visible_left + visible_width, line + 0.5f * line_height, UI_LINE_WIDTH, UI_TEXT_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } else { highlight(line_x0, line_y0, line_x1, line_y1, bgcolor); ui().draw_text_full( container(), itemtext, effective_left, line, effective_width, ui::text_layout::CENTER, ui::text_layout::TRUNCATE, mame_ui_manager::NORMAL, fgcolor, bgcolor, nullptr, nullptr); } line += line_height; } // if there is something special to add, do it by calling the virtual method custom_render(get_selection_ref(), get_customtop(), get_custombottom(), x1, y1, x2, y2); // return the number of visible lines, minus 1 for top arrow and 1 for bottom arrow m_visible_items = m_visible_lines - (top_line != 0) - (top_line + m_visible_lines != visible_items); }