Configuration manager now bookends the emulator - running before emulation starts and after the main window is closed.

This commit is contained in:
SarahW 2017-05-10 20:27:52 +01:00
commit 172e88ed8b
6 changed files with 182 additions and 233 deletions

View file

@ -242,11 +242,6 @@ void initpc(int argc, char *argv[])
} }
} }
keyboard_init();
mouse_init();
joystick_init();
midi_init();
// append_filename(config_file_default, pcempath, "pcem.cfg", 511); // append_filename(config_file_default, pcempath, "pcem.cfg", 511);
loadconfig(config_file); loadconfig(config_file);
@ -279,7 +274,6 @@ void initpc(int argc, char *argv[])
//loadfont(); //loadfont();
loadnvr(); loadnvr();
sound_init();
resetide(); resetide();
#if __unix #if __unix
if (cdrom_drive == -1) if (cdrom_drive == -1)
@ -558,7 +552,6 @@ void closepc()
closevideo(); closevideo();
mouse_emu_close(); mouse_emu_close();
device_close_all(); device_close_all();
midi_close();
} }
/*int main() /*int main()

View file

@ -53,8 +53,6 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Disc activity indicator", IDM_VID_DISC MENUITEM "Disc activity indicator", IDM_VID_DISC
END END
MENUITEM SEPARATOR
MENUITEM "&Select configuration...", IDM_CONFIG_SELECT
END END
POPUP "&Misc" POPUP "&Misc"
BEGIN BEGIN
@ -318,8 +316,8 @@ BEGIN
END END
ConfigureSelectionDlg DIALOGEX 0, 0, 200, 150 ConfigureSelectionDlg DIALOGEX 0, 0, 200, 150
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_CENTER
CAPTION "Select Configuration" CAPTION "PCem Configuration Manager"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
DEFPUSHBUTTON "OK", IDOK, 200-54, 4, 50, 14, WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 200-54, 4, 50, 14, WS_TABSTOP

View file

@ -9,7 +9,6 @@
#define IDM_HDCONF 40014 #define IDM_HDCONF 40014
#define IDM_BPB_DISABLE 40015 #define IDM_BPB_DISABLE 40015
#define IDM_CONFIG 40020 #define IDM_CONFIG 40020
#define IDM_CONFIG_SELECT 40021
#define IDM_STATUS 40030 #define IDM_STATUS 40030
#define IDM_VID_RESIZE 40050 #define IDM_VID_RESIZE 40050
#define IDM_VID_REMEMBER 40051 #define IDM_VID_REMEMBER 40051

View file

@ -174,6 +174,8 @@ void d3d_reset()
{ {
HRESULT hr; HRESULT hr;
if (!d3ddev)
return;
memset(&d3dpp, 0, sizeof(d3dpp)); memset(&d3dpp, 0, sizeof(d3dpp));
d3dpp.Flags = 0; d3dpp.Flags = 0;

View file

@ -21,8 +21,6 @@ int mouse_buttons = 0;
void mouse_init() void mouse_init()
{ {
atexit(mouse_close);
if (FAILED(DirectInputCreate(hinstance, DIRECTINPUT_VERSION, &lpdi, NULL))) if (FAILED(DirectInputCreate(hinstance, DIRECTINPUT_VERSION, &lpdi, NULL)))
fatal("mouse_init : DirectInputCreate failed\n"); fatal("mouse_init : DirectInputCreate failed\n");
if (FAILED(lpdi->CreateDevice(GUID_SysMouse, &lpdi_mouse, NULL))) if (FAILED(lpdi->CreateDevice(GUID_SysMouse, &lpdi_mouse, NULL)))

403
src/win.c
View file

@ -31,6 +31,7 @@
#include "thread.h" #include "thread.h"
#include "video.h" #include "video.h"
#include "plat-joystick.h"
#include "plat-midi.h" #include "plat-midi.h"
#include "plat-mouse.h" #include "plat-mouse.h"
#include "plat-keyboard.h" #include "plat-keyboard.h"
@ -534,75 +535,13 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
if (!RegisterClassEx(&wincl)) if (!RegisterClassEx(&wincl))
return 0; return 0;
menu = LoadMenu(hThisInstance, TEXT("MainMenu"));
initmenu();
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"PCem v12", /* Title Text */
WS_OVERLAPPEDWINDOW&~WS_SIZEBOX, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
640+(GetSystemMetrics(SM_CXFIXEDFRAME)*2), /* The programs width */
480+(GetSystemMetrics(SM_CYFIXEDFRAME)*2)+GetSystemMetrics(SM_CYMENUSIZE)+GetSystemMetrics(SM_CYCAPTION)+1, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
menu, /* Menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
ghMutex = CreateMutex(NULL, FALSE, NULL);
// win_set_window(hwnd);
memset(rawinputkey, 0, sizeof(rawinputkey));
device.usUsagePage = 0x01;
device.usUsage = 0x06;
device.dwFlags = RIDEV_NOHOTKEYS;
device.hwndTarget = hwnd;
if (RegisterRawInputDevices(&device, 1, sizeof(device)))
pclog("Raw input registered!\n");
else
pclog("Raw input registration failed!\n");
get_registry_key_map();
ghwnd=hwnd;
getpath(); getpath();
if (vid_resize) SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW|WS_VISIBLE); d = romset;
else SetWindowLong(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX)|WS_VISIBLE); for (c = 0; c < ROM_MAX; c++)
if (!cdrom_enabled)
CheckMenuItem(menu, IDM_CDROM_DISABLED, MF_CHECKED);
else
{ {
if (cdrom_drive == CDROM_ISO) romset = c;
CheckMenuItem(menu, IDM_CDROM_ISO, MF_CHECKED); romspresent[c] = loadbios();
else
CheckMenuItem(menu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
}
if (vid_resize) CheckMenuItem(menu, IDM_VID_RESIZE, MF_CHECKED);
if (video_force_aspect_ration)
CheckMenuItem(menu, IDM_VID_ASPECT, MF_CHECKED);
CheckMenuItem(menu, IDM_VID_DDRAW + vid_api, MF_CHECKED);
CheckMenuItem(menu, IDM_VID_FS_FULL + video_fullscreen_scale, MF_CHECKED);
CheckMenuItem(menu, IDM_VID_REMEMBER, window_remember ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(menu, IDM_BPB_DISABLE, bpb_disable ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(menu, IDM_VID_DISC, vid_disc_indicator ? MF_CHECKED : MF_UNCHECKED);
// set_display_switch_mode(SWITCH_BACKGROUND);
d=romset;
for (c=0;c<ROM_MAX;c++)
{
romset=c;
romspresent[c]=loadbios();
pclog("romset %i - %i\n", c, romspresent[c]); pclog("romset %i - %i\n", c, romspresent[c]);
} }
@ -613,162 +552,217 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
} }
if (c == ROM_MAX) if (c == ROM_MAX)
{ {
MessageBox(hwnd,"No ROMs present!\nYou must have at least one romset to use PCem.","PCem fatal error",MB_OK); MessageBox(NULL, "No ROMs present!\nYou must have at least one romset to use PCem.","PCem fatal error",MB_OK);
return 0; return 0;
} }
romset=d; romset = d;
for (c = 0; c < GFX_MAX; c++) for (c = 0; c < GFX_MAX; c++)
gfx_present[c] = video_card_available(video_old_to_new(c)); gfx_present[c] = video_card_available(video_old_to_new(c));
loadconfig(NULL);
if (!config_selection_open(ghwnd, 0))
return 0;
initpc(argc, argv);
if (!loadbios())
{
if (romset!=-1) MessageBox(hwnd,"Configured romset not available.\nDefaulting to available romset.","PCem error",MB_OK);
for (c=0;c<ROM_MAX;c++)
{
if (romspresent[c])
{
romset = c;
model = model_getmodel(romset);
// saveconfig();
// resetpchard();
break;
}
}
}
if (!video_card_available(video_old_to_new(gfxcard)))
{
if (romset!=-1) MessageBox(hwnd,"Configured video BIOS not available.\nDefaulting to available romset.","PCem error",MB_OK);
for (c = GFX_MAX-1; c >= 0; c--)
{
if (gfx_present[c])
{
gfxcard = c;
// saveconfig();
// resetpchard();
break;
}
}
}
loadbios();
resetpchard();
timeBeginPeriod(1); timeBeginPeriod(1);
atexit(releasemouse); atexit(releasemouse);
vid_apis[0][vid_api].init(ghwnd);
// QueryPerformanceFrequency(&counter_base);
/// QueryPerformanceCounter(&counter_posold);
// counter_posold.QuadPart*=100;
mainthreadh=(HANDLE)_beginthread(mainthread,0,NULL);
SetThreadPriority(mainthreadh, THREAD_PRIORITY_HIGHEST);
updatewindowsize(640, 480);
QueryPerformanceFrequency(&qpc_freq); QueryPerformanceFrequency(&qpc_freq);
timer_freq = qpc_freq.QuadPart; timer_freq = qpc_freq.QuadPart;
// focus=1; sound_init();
// setrefresh(100);
// ShowCursor(TRUE); initpc(argc, argv);
// return 0; while (1)
if (start_in_fullscreen)
{ {
startblit(); quited = 0;
mouse_close();
vid_apis[0][vid_api].close();
video_fullscreen = 1;
vid_apis[1][vid_api].init(ghwnd);
mouse_init();
leave_fullscreen_flag = 0;
endblit();
device_force_redraw();
}
if (window_remember)
{
MoveWindow(hwnd, window_x, window_y,
window_w,
window_h,
TRUE);
}
/* Run the message loop. It will run until GetMessage() returns 0 */ if (!config_selection_open(NULL, 0))
while (!quited) break;
{
/* if (infocus) ghMutex = CreateMutex(NULL, FALSE, NULL);
menu = LoadMenu(hThisInstance, TEXT("MainMenu"));
initmenu();
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"PCem v12", /* Title Text */
WS_OVERLAPPEDWINDOW&~WS_SIZEBOX, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
640+(GetSystemMetrics(SM_CXFIXEDFRAME)*2), /* The programs width */
480+(GetSystemMetrics(SM_CYFIXEDFRAME)*2)+GetSystemMetrics(SM_CYMENUSIZE)+GetSystemMetrics(SM_CYCAPTION)+1, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
menu, /* Menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
memset(rawinputkey, 0, sizeof(rawinputkey));
device.usUsagePage = 0x01;
device.usUsage = 0x06;
device.dwFlags = RIDEV_NOHOTKEYS;
device.hwndTarget = hwnd;
if (RegisterRawInputDevices(&device, 1, sizeof(device)))
pclog("Raw input registered!\n");
else
pclog("Raw input registration failed!\n");
get_registry_key_map();
ghwnd = hwnd;
if (vid_resize)
SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW|WS_VISIBLE);
else
SetWindowLong(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX)|WS_VISIBLE);
if (!cdrom_enabled)
CheckMenuItem(menu, IDM_CDROM_DISABLED, MF_CHECKED);
else
{ {
if (drawits) if (cdrom_drive == CDROM_ISO)
{ CheckMenuItem(menu, IDM_CDROM_ISO, MF_CHECKED);
drawits--; else
if (drawits>10) drawits=0; CheckMenuItem(menu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
runpc(); }
} if (vid_resize)
//; else CheckMenuItem(menu, IDM_VID_RESIZE, MF_CHECKED);
// sleep(0); if (video_force_aspect_ration)
if ((pcem_key[KEY_LCONTROL] || pcem_key[KEY_RCONTROL]) && pcem_key[KEY_END] && mousecapture) CheckMenuItem(menu, IDM_VID_ASPECT, MF_CHECKED);
{ CheckMenuItem(menu, IDM_VID_DDRAW + vid_api, MF_CHECKED);
ClipCursor(&oldclip); CheckMenuItem(menu, IDM_VID_FS_FULL + video_fullscreen_scale, MF_CHECKED);
mousecapture=0; CheckMenuItem(menu, IDM_VID_REMEMBER, window_remember ? MF_CHECKED : MF_UNCHECKED);
} CheckMenuItem(menu, IDM_BPB_DISABLE, bpb_disable ? MF_CHECKED : MF_UNCHECKED);
}*/ CheckMenuItem(menu, IDM_VID_DISC, vid_disc_indicator ? MF_CHECKED : MF_UNCHECKED);
while (GetMessage(&messages,NULL,0,0) && !quited) loadconfig(NULL);
if (!loadbios())
{ {
if (messages.message==WM_QUIT) quited=1; if (romset != -1)
TranslateMessage(&messages); MessageBox(hwnd,"Configured romset not available.\nDefaulting to available romset.","PCem error",MB_OK);
DispatchMessage(&messages); for (c = 0; c < ROM_MAX; c++)
if ((pcem_key[KEY_LCONTROL] || pcem_key[KEY_RCONTROL]) && pcem_key[KEY_END] && mousecapture)
{ {
ClipCursor(&oldclip); if (romspresent[c])
ShowCursor(TRUE); {
mousecapture=0; romset = c;
model = model_getmodel(romset);
break;
}
} }
} }
quited=1; if (!video_card_available(video_old_to_new(gfxcard)))
// else {
// sleep(10); if (romset != -1)
} MessageBox(hwnd,"Configured video BIOS not available.\nDefaulting to available romset.","PCem error",MB_OK);
for (c = GFX_MAX-1; c >= 0; c--)
{
if (gfx_present[c])
{
gfxcard = c;
break;
}
}
}
startblit(); loadbios();
resetpchard();
vid_apis[0][vid_api].init(ghwnd);
mainthreadh=(HANDLE)_beginthread(mainthread,0,NULL);
SetThreadPriority(mainthreadh, THREAD_PRIORITY_HIGHEST);
updatewindowsize(640, 480);
keyboard_init();
mouse_init();
joystick_init();
midi_init();
if (start_in_fullscreen)
{
startblit();
mouse_close();
vid_apis[0][vid_api].close();
video_fullscreen = 1;
vid_apis[1][vid_api].init(ghwnd);
mouse_init();
leave_fullscreen_flag = 0;
endblit();
device_force_redraw();
}
if (window_remember)
{
MoveWindow(hwnd, window_x, window_y,
window_w,
window_h,
TRUE);
}
/* Run the message loop. It will run until GetMessage() returns 0 */
while (!quited)
{
while (GetMessage(&messages,NULL,0,0) && !quited)
{
if (messages.message==WM_QUIT) quited=1;
TranslateMessage(&messages);
DispatchMessage(&messages);
if ((pcem_key[KEY_LCONTROL] || pcem_key[KEY_RCONTROL]) && pcem_key[KEY_END] && mousecapture)
{
ClipCursor(&oldclip);
ShowCursor(TRUE);
mousecapture=0;
}
}
quited=1;
}
startblit();
// pclog("Sleep 1000\n"); // pclog("Sleep 1000\n");
Sleep(200); Sleep(200);
// pclog("TerminateThread\n"); // pclog("TerminateThread\n");
TerminateThread(mainthreadh,0); TerminateThread(mainthreadh,0);
// endblit();
// pclog("Quited? %i\n",quited); // pclog("Quited? %i\n",quited);
// pclog("Closepc\n"); // pclog("Closepc\n");
savenvr(); savenvr();
if (save_window_pos && window_remember) if (save_window_pos && window_remember)
saveconfig(NULL); saveconfig(NULL);
closepc();
// pclog("dumpregs\n"); // pclog("dumpregs\n");
vid_apis[video_fullscreen][vid_api].close(); vid_apis[video_fullscreen][vid_api].close();
if (mousecapture)
{
ClipCursor(&oldclip);
ShowCursor(TRUE);
}
keyboard_close();
mouse_close();
joystick_close();
midi_close();
DestroyWindow(hwnd);
CloseHandle(ghMutex);
}
closepc();
timeEndPeriod(1); timeEndPeriod(1);
// dumpregs(); // dumpregs();
if (mousecapture)
{
ClipCursor(&oldclip);
ShowCursor(TRUE);
}
UnregisterClass(szSubClassName, hinstance); UnregisterClass(szSubClassName, hinstance);
UnregisterClass(szClassName, hinstance); UnregisterClass(szClassName, hinstance);
@ -1050,41 +1044,6 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
saveconfig(NULL); saveconfig(NULL);
break; break;
case IDM_CONFIG_SELECT:
pause = 1;
if (config_selection_open(ghwnd, 1))
{
loadconfig(NULL);
mem_resize();
loadbios();
resetpchard();
}
pause = 0;
break;
/* case IDM_CONFIG_LOAD:
pause = 1;
if (!getfile(hwnd, "Configuration (*.CFG)\0*.CFG\0All files (*.*)\0*.*\0", ""))
{
if (MessageBox(NULL, "This will reset PCem!\nOkay to continue?", "PCem", MB_OKCANCEL) == IDOK)
{
loadconfig(openfilestring);
config_save(config_file_default);
mem_resize();
loadbios();
resetpchard();
}
}
pause = 0;
break;
case IDM_CONFIG_SAVE:
pause = 1;
if (!getsfile(hwnd, "Configuration (*.CFG)\0*.CFG\0All files (*.*)\0*.*\0", "", NULL))
config_save(openfilestring);
pause = 0;
break;*/
case IDM_CDROM_DISABLED: case IDM_CDROM_DISABLED:
if (cdrom_enabled) if (cdrom_enabled)
{ {