mirror of https://github.com/xemu-project/xemu.git
ui: Add runtime disc eject & load actions
This commit is contained in:
parent
382d6e383d
commit
89734ca828
|
@ -547,7 +547,6 @@ private:
|
||||||
char flash_path[MAX_STRING_LEN];
|
char flash_path[MAX_STRING_LEN];
|
||||||
char bootrom_path[MAX_STRING_LEN];
|
char bootrom_path[MAX_STRING_LEN];
|
||||||
char hdd_path[MAX_STRING_LEN];
|
char hdd_path[MAX_STRING_LEN];
|
||||||
char dvd_path[MAX_STRING_LEN];
|
|
||||||
char eeprom_path[MAX_STRING_LEN];
|
char eeprom_path[MAX_STRING_LEN];
|
||||||
int memory_idx;
|
int memory_idx;
|
||||||
bool short_animation;
|
bool short_animation;
|
||||||
|
@ -562,7 +561,6 @@ public:
|
||||||
flash_path[0] = '\0';
|
flash_path[0] = '\0';
|
||||||
bootrom_path[0] = '\0';
|
bootrom_path[0] = '\0';
|
||||||
hdd_path[0] = '\0';
|
hdd_path[0] = '\0';
|
||||||
dvd_path[0] = '\0';
|
|
||||||
eeprom_path[0] = '\0';
|
eeprom_path[0] = '\0';
|
||||||
memory_idx = 0;
|
memory_idx = 0;
|
||||||
short_animation = false;
|
short_animation = false;
|
||||||
|
@ -593,11 +591,6 @@ public:
|
||||||
assert(len < MAX_STRING_LEN);
|
assert(len < MAX_STRING_LEN);
|
||||||
strncpy(hdd_path, tmp, sizeof(hdd_path));
|
strncpy(hdd_path, tmp, sizeof(hdd_path));
|
||||||
|
|
||||||
xemu_settings_get_string(XEMU_SETTINGS_SYSTEM_DVD_PATH, &tmp);
|
|
||||||
len = strlen(tmp);
|
|
||||||
assert(len < MAX_STRING_LEN);
|
|
||||||
strncpy(dvd_path, tmp, sizeof(dvd_path));
|
|
||||||
|
|
||||||
xemu_settings_get_string(XEMU_SETTINGS_SYSTEM_EEPROM_PATH, &tmp);
|
xemu_settings_get_string(XEMU_SETTINGS_SYSTEM_EEPROM_PATH, &tmp);
|
||||||
len = strlen(tmp);
|
len = strlen(tmp);
|
||||||
assert(len < MAX_STRING_LEN);
|
assert(len < MAX_STRING_LEN);
|
||||||
|
@ -617,7 +610,6 @@ public:
|
||||||
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_FLASH_PATH, flash_path);
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_FLASH_PATH, flash_path);
|
||||||
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_BOOTROM_PATH, bootrom_path);
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_BOOTROM_PATH, bootrom_path);
|
||||||
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_HDD_PATH, hdd_path);
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_HDD_PATH, hdd_path);
|
||||||
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_DVD_PATH, dvd_path);
|
|
||||||
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_EEPROM_PATH, eeprom_path);
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_EEPROM_PATH, eeprom_path);
|
||||||
xemu_settings_set_int(XEMU_SETTINGS_SYSTEM_MEMORY, 64+memory_idx*64);
|
xemu_settings_set_int(XEMU_SETTINGS_SYSTEM_MEMORY, 64+memory_idx*64);
|
||||||
xemu_settings_set_bool(XEMU_SETTINGS_SYSTEM_SHORTANIM, short_animation);
|
xemu_settings_set_bool(XEMU_SETTINGS_SYSTEM_SHORTANIM, short_animation);
|
||||||
|
@ -659,7 +651,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *rom_file_filters = ".bin Files\0*.bin\0.rom Files\0*.rom\0All Files\0*.*\0";
|
const char *rom_file_filters = ".bin Files\0*.bin\0.rom Files\0*.rom\0All Files\0*.*\0";
|
||||||
const char *iso_file_filters = ".iso Files\0*.iso\0All Files\0*.*\0";
|
|
||||||
const char *qcow_file_filters = ".qcow2 Files\0*.qcow2\0All Files\0*.*\0";
|
const char *qcow_file_filters = ".qcow2 Files\0*.qcow2\0All Files\0*.*\0";
|
||||||
|
|
||||||
ImGui::Columns(2, "", false);
|
ImGui::Columns(2, "", false);
|
||||||
|
@ -684,12 +675,6 @@ public:
|
||||||
FilePicker("###HDD", hdd_path, sizeof(hdd_path), qcow_file_filters);
|
FilePicker("###HDD", hdd_path, sizeof(hdd_path), qcow_file_filters);
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
|
|
||||||
ImGui::Text("DVD Image File");
|
|
||||||
ImGui::NextColumn();
|
|
||||||
ImGui::SetNextItemWidth(picker_width);
|
|
||||||
FilePicker("###DVD", dvd_path, sizeof(dvd_path), iso_file_filters);
|
|
||||||
ImGui::NextColumn();
|
|
||||||
|
|
||||||
ImGui::Text("EEPROM File");
|
ImGui::Text("EEPROM File");
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
ImGui::SetNextItemWidth(picker_width);
|
ImGui::SetNextItemWidth(picker_width);
|
||||||
|
@ -1237,6 +1222,28 @@ static bool is_shortcut_key_pressed(int scancode)
|
||||||
return is_shortcut_key && io.KeysDown[scancode] && (io.KeysDownDuration[scancode] == 0.0);
|
return is_shortcut_key && io.KeysDown[scancode] && (io.KeysDownDuration[scancode] == 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void action_eject_disc(void)
|
||||||
|
{
|
||||||
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_DVD_PATH, "");
|
||||||
|
xemu_settings_save();
|
||||||
|
xemu_eject_disc();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void action_load_disc(void)
|
||||||
|
{
|
||||||
|
const char *iso_file_filters = ".iso Files\0*.iso\0All Files\0*.*\0";
|
||||||
|
const char *current_disc_path;
|
||||||
|
xemu_settings_get_string(XEMU_SETTINGS_SYSTEM_DVD_PATH, ¤t_disc_path);
|
||||||
|
const char *new_disc_path = noc_file_dialog_open(NOC_FILE_DIALOG_OPEN, iso_file_filters, current_disc_path, NULL);
|
||||||
|
if (new_disc_path == NULL) {
|
||||||
|
/* Cancelled */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xemu_settings_set_string(XEMU_SETTINGS_SYSTEM_DVD_PATH, new_disc_path);
|
||||||
|
xemu_settings_save();
|
||||||
|
xemu_load_disc(new_disc_path);
|
||||||
|
}
|
||||||
|
|
||||||
static void action_toggle_pause(void)
|
static void action_toggle_pause(void)
|
||||||
{
|
{
|
||||||
if (runstate_is_running()) {
|
if (runstate_is_running()) {
|
||||||
|
@ -1258,6 +1265,14 @@ static void action_shutdown(void)
|
||||||
|
|
||||||
static void process_keyboard_shortcuts(void)
|
static void process_keyboard_shortcuts(void)
|
||||||
{
|
{
|
||||||
|
if (is_shortcut_key_pressed(SDL_SCANCODE_E)) {
|
||||||
|
action_eject_disc();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_shortcut_key_pressed(SDL_SCANCODE_O)) {
|
||||||
|
action_load_disc();
|
||||||
|
}
|
||||||
|
|
||||||
if (is_shortcut_key_pressed(SDL_SCANCODE_P)) {
|
if (is_shortcut_key_pressed(SDL_SCANCODE_P)) {
|
||||||
action_toggle_pause();
|
action_toggle_pause();
|
||||||
}
|
}
|
||||||
|
@ -1285,10 +1300,21 @@ static void ShowMainMenu()
|
||||||
{
|
{
|
||||||
if (ImGui::BeginMenu("Machine"))
|
if (ImGui::BeginMenu("Machine"))
|
||||||
{
|
{
|
||||||
|
if (ImGui::MenuItem("Eject Disc", SHORTCUT_MENU_TEXT(E))) {
|
||||||
|
action_eject_disc();
|
||||||
|
}
|
||||||
|
if (ImGui::MenuItem("Load Disc...", SHORTCUT_MENU_TEXT(O))) {
|
||||||
|
action_load_disc();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
ImGui::MenuItem("Input", NULL, &input_window.is_open);
|
ImGui::MenuItem("Input", NULL, &input_window.is_open);
|
||||||
ImGui::MenuItem("Network", NULL, &network_window.is_open);
|
ImGui::MenuItem("Network", NULL, &network_window.is_open);
|
||||||
ImGui::MenuItem("Settings", NULL, &settings_window.is_open);
|
ImGui::MenuItem("Settings", NULL, &settings_window.is_open);
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::MenuItem(running ? "Pause" : "Run", SHORTCUT_MENU_TEXT(P))) {
|
if (ImGui::MenuItem(running ? "Pause" : "Run", SHORTCUT_MENU_TEXT(P))) {
|
||||||
action_toggle_pause();
|
action_toggle_pause();
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,8 @@ extern int scaling_mode;
|
||||||
int xemu_is_fullscreen(void);
|
int xemu_is_fullscreen(void);
|
||||||
void xemu_monitor_init(void);
|
void xemu_monitor_init(void);
|
||||||
void xemu_toggle_fullscreen(void);
|
void xemu_toggle_fullscreen(void);
|
||||||
|
void xemu_eject_disc(void);
|
||||||
|
void xemu_load_disc(const char *path);
|
||||||
|
|
||||||
// Implemented in xemu_hud.cc
|
// Implemented in xemu_hud.cc
|
||||||
void xemu_hud_init(SDL_Window *window, void *sdl_gl_context);
|
void xemu_hud_init(SDL_Window *window, void *sdl_gl_context);
|
||||||
|
|
30
ui/xemu.c
30
ui/xemu.c
|
@ -43,6 +43,12 @@
|
||||||
#include "xemu-shaders.h"
|
#include "xemu-shaders.h"
|
||||||
#include "hw/xbox/nv2a/gl/gloffscreen.h" // FIXME
|
#include "hw/xbox/nv2a/gl/gloffscreen.h" // FIXME
|
||||||
|
|
||||||
|
#include "qemu-common.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "qapi/qapi-commands-block.h"
|
||||||
|
#include "qapi/qmp/qdict.h"
|
||||||
|
#include "hw/xbox/smbus.h" // For eject, drive tray
|
||||||
|
|
||||||
// #define DEBUG_XEMU_C
|
// #define DEBUG_XEMU_C
|
||||||
|
|
||||||
#ifdef DEBUG_XEMU_C
|
#ifdef DEBUG_XEMU_C
|
||||||
|
@ -1440,3 +1446,27 @@ int main(int argc, char **argv)
|
||||||
sdl2_gl_refresh(&sdl2_console[0].dcl);
|
sdl2_gl_refresh(&sdl2_console[0].dcl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xemu_eject_disc(void)
|
||||||
|
{
|
||||||
|
xbox_smc_eject_button();
|
||||||
|
|
||||||
|
// Xbox software may request that the drive open, but do it now anyway
|
||||||
|
Error *err = NULL;
|
||||||
|
qmp_eject(true, "ide0-cd1", false, NULL, true, false, &err);
|
||||||
|
|
||||||
|
xbox_smc_update_tray_state();
|
||||||
|
}
|
||||||
|
|
||||||
|
void xemu_load_disc(const char *path)
|
||||||
|
{
|
||||||
|
// Ensure an eject sequence is always triggered so Xbox software reloads
|
||||||
|
xbox_smc_eject_button();
|
||||||
|
|
||||||
|
Error *err = NULL;
|
||||||
|
qmp_blockdev_change_medium(true, "ide0-cd1", false, NULL, path,
|
||||||
|
false, "", false, 0,
|
||||||
|
&err);
|
||||||
|
|
||||||
|
xbox_smc_update_tray_state();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue