enhanced mapper and system menu etc

This commit is contained in:
Wengier 2020-11-25 01:12:51 -05:00
parent def06b31dd
commit 73423681dd
17 changed files with 444 additions and 166 deletions

View File

@ -29,10 +29,24 @@
options such as increasing/decreasing the TTF font
sizes and on-screen text style toggling (including
bold, italics, underline and strikeout). (Wengier)
- Cleaned up the mapper editor interface to allow
more keyboard shortcuts to be added, shown in
multiple pages in the mapper, navigable with the
"Previous Page" and "Next Page" buttons. (Wengier)
- You can now select a host key from the menu (under
"Main") including Ctrl+Alt, Ctrl+Shift, Alt+Shift,
or use the mapper-defined host key as in previous
versions (which default to F11 on Windows and F12
otherwise). A config option "hostkey" is added so
that you can specify it from config file. (Wengier)
- The system menu in Windows SDL1 builds is now also
available for Windows SDL2 builds, and menu items
"Reset font size", "Increase TTF font size" and
"Decrease TTF font size" are added. (Wengier)
- Enhanced the mapper editor interface to allow more
keyboard shortcuts to be added, shown in multiple
pages in the mapper, navigable with the "Previous
Page" and "Next Page" buttons. The text in the
grids are now longer and clearer too. The default
shortcuts for a few items are changed to use the
Host key style (e.g. Host+S and Host+L for saving
and loading states respectively). (Wengier)
- Added menu item "List network interfaces" under
"Help" menu to list network interfaces in the host
system for the NE2000 feature. (Wengier)

View File

@ -10,7 +10,7 @@
<category>Emulation</category>
</categories>
<releases>
<release version="@PACKAGE_VERSION@" date="2020-11-23"/>
<release version="@PACKAGE_VERSION@" date="2020-11-25"/>
</releases>
<screenshots>
<screenshot type="default">

View File

@ -168,6 +168,8 @@ logfile =
# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running.
# Possible values: true, false, 1, 0, auto, autofile.
# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default.
# hostkey: Select a DOSBox-X host key, or use the mapper-defined host key (default: F11 on Windows and F12 otherwise).
# Possible values: ctrlalt, ctrlshift, altshift, mapper.
# mapper send key: Select the key the mapper SendKey function will send.
# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel.
#DOSBOX-X-ADV:# keyboard hook: Use keyboard hook (currently only on Windows) to catch special keys and synchronize the keyboard LEDs with the host.
@ -346,6 +348,7 @@ startbanner = true
#DOSBOX-X-ADV:dpi aware = auto
quit warning = auto
show advanced options = false
hostkey = mapper
mapper send key = ctrlaltdel
#DOSBOX-X-ADV:keyboard hook = false
#DOSBOX-X-ADV:weitek = false

View File

@ -83,6 +83,8 @@ logfile =
# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running.
# Possible values: true, false, 1, 0, auto, autofile.
# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default.
# hostkey: Select a DOSBox-X host key, or use the mapper-defined host key (default: F11 on Windows and F12 otherwise).
# Possible values: ctrlalt, ctrlshift, altshift, mapper.
# mapper send key: Select the key the mapper SendKey function will send.
# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel.
# machine: The type of machine DOSBox-X tries to emulate.
@ -107,6 +109,7 @@ fastbioslogo = false
startbanner = true
quit warning = auto
show advanced options = false
hostkey = mapper
mapper send key = ctrlaltdel
machine = svga_s3
captures = capture

View File

@ -168,6 +168,8 @@ fileio = false
# If set to autofile, DOSBox-X will warn if there are open file handles or a guest system is currently running.
# Possible values: true, false, 1, 0, auto, autofile.
# show advanced options: If set, the Configuration Tool will display all config options (including advanced ones) by default.
# hostkey: Select a DOSBox-X host key, or use the mapper-defined host key (default: F11 on Windows and F12 otherwise).
# Possible values: ctrlalt, ctrlshift, altshift, mapper.
# mapper send key: Select the key the mapper SendKey function will send.
# Possible values: winlogo, winmenu, alttab, ctrlesc, ctrlbreak, ctrlaltdel.
# keyboard hook: Use keyboard hook (currently only on Windows) to catch special keys and synchronize the keyboard LEDs with the host.
@ -346,6 +348,7 @@ startbanner = true
dpi aware = auto
quit warning = auto
show advanced options = false
hostkey = mapper
mapper send key = ctrlaltdel
keyboard hook = false
weitek = false

View File

@ -1,4 +1,4 @@
/*auto-generated*/
#define UPDATED_STR "Nov 23, 2020 1:54:58am"
#define GIT_COMMIT_HASH "1b77eb2"
#define UPDATED_STR "Nov 25, 2020 1:10:55am"
#define GIT_COMMIT_HASH "def06b3"
#define COPYRIGHT_END_YEAR "2020"

View File

@ -26,9 +26,9 @@ enum MapKeys {
MK_f1,MK_f2,MK_f3,MK_f4,MK_f5,MK_f6,MK_f7,MK_f8,MK_f9,MK_f10,MK_f11,MK_f12,
MK_return,MK_kpminus,MK_kpplus,MK_minus,MK_equals,MK_scrolllock,MK_printscreen,MK_pause,MK_home,MK_rightarrow,
MK_1, MK_2, MK_3, MK_4,
MK_a, MK_c, MK_d, MK_f, MK_m, MK_q, MK_r, MK_s, MK_v, MK_w,
MK_escape,MK_delete,MK_uparrow,MK_downarrow,
MK_lbracket,MK_rbracket,MK_leftarrow,
MK_a, MK_b, MK_c, MK_d, MK_f, MK_i, MK_l, MK_m, MK_o, MK_p, MK_q, MK_r, MK_s, MK_v, MK_w,
MK_escape,MK_delete,MK_uparrow,MK_downarrow,MK_leftarrow,
MK_lbracket,MK_rbracket,MK_comma,MK_period,
MK_MAX
};

View File

@ -448,9 +448,9 @@ class DOSBoxMenu {
public:
HMENU getWinMenu(void) const;
bool mainMenuWM_COMMAND(unsigned int id);
#endif
public:
static constexpr unsigned int winMenuMinimumID = 0x1000;
#endif
#if DOSBOXMENU_TYPE == DOSBOXMENU_NSMENU /* Mac OS X NSMenu / NSMenuItem handle */
protected:
void* nsMenu = NULL;

View File

@ -739,6 +739,11 @@
# define ID_WIN_SYSMENU_MAPPER 0x0F02
# define ID_WIN_SYSMENU_CFG_GUI 0x0F03
# define ID_WIN_SYSMENU_PAUSE 0x0F04
# define ID_WIN_SYSMENU_RESETSIZE 0x0F05
#if defined(USE_TTF)
# define ID_WIN_SYSMENU_TTFINCSIZE 0x0F06
# define ID_WIN_SYSMENU_TTFDECSIZE 0x0F07
#endif
#endif
#define IDI_MAPPER 0x1000
#define IDI_CFG_GUI 0x1001

View File

@ -1097,13 +1097,13 @@ void DOSBOX_RealInit() {
}
//add support for loading/saving game states
MAPPER_AddHandler(SaveGameState, MK_f7, MMOD1,"savestate","Save state", &item);
MAPPER_AddHandler(SaveGameState, MK_s, MMODHOST,"savestate","Save state", &item);
item->set_text("Save state");
MAPPER_AddHandler(LoadGameState, MK_f8, MMOD1,"loadstate","Load state", &item);
MAPPER_AddHandler(LoadGameState, MK_l, MMODHOST,"loadstate","Load state", &item);
item->set_text("Load state");
MAPPER_AddHandler(PreviousSaveSlot, MK_f7, MMOD1|MMOD2,"prevslot","Previous save slot", &item);
MAPPER_AddHandler(PreviousSaveSlot, MK_comma, MMODHOST,"prevslot","Previous save slot", &item);
item->set_text("Select previous slot");
MAPPER_AddHandler(NextSaveSlot, MK_f8, MMOD1|MMOD2,"nextslot","Next save slot", &item);
MAPPER_AddHandler(NextSaveSlot, MK_period, MMODHOST,"nextslot","Next save slot", &item);
item->set_text("Select next slot");
Section_prop *section = static_cast<Section_prop *>(control->GetSection("dosbox"));
@ -1328,6 +1328,9 @@ void DOSBOX_SetupConfigSections(void) {
const char* aspectmodes[] = { "false", "true", "0", "1", "yes", "no", "nearest", "bilinear", 0};
const char *vga_ac_mapping_settings[] = { "", "auto", "4x4", "4low", "first16", 0 };
const char* hostkeys[] = {
"ctrlalt", "ctrlshift", "altshift", "mapper", 0 };
const char* sendkeys[] = {
"winlogo", "winmenu", "alttab", "ctrlesc", "ctrlbreak", "ctrlaltdel", 0 };
@ -1428,6 +1431,11 @@ void DOSBOX_SetupConfigSections(void) {
Pbool->Set_help("If set, the Configuration Tool will display all config options (including advanced ones) by default.");
Pbool->SetBasic(true);
Pstring = secprop->Add_string("hostkey", Property::Changeable::Always, "mapper");
Pstring->Set_help("Select a DOSBox-X host key, or use the mapper-defined host key (default: F11 on Windows and F12 otherwise).");
Pstring->Set_values(hostkeys);
Pstring->SetBasic(true);
Pstring = secprop->Add_string("mapper send key", Property::Changeable::Always, "ctrlaltdel");
Pstring->Set_help("Select the key the mapper SendKey function will send.");
Pstring->Set_values(sendkeys);

View File

@ -87,6 +87,7 @@ void GUI_ResetResize(bool pressed
MENU_Block menu;
int ttfpos=-1;
unsigned int hdd_defsize=16000;
char hdd_size[20]="";
@ -115,6 +116,7 @@ static const char *def_menu_main[] =
"mapper_mapper",
"--",
"MainSendKey",
"MainHostKey",
#if defined(WIN32) || defined(C_SDL2) || defined(LINUX) && C_X11
"SharedClipboard",
#endif
@ -161,6 +163,17 @@ static const char *def_menu_main_sendkey[] =
NULL
};
/* main -> host key menu ("MenuHostKey") */
static const char *def_menu_main_hostkey[] =
{
"hostkey_ctrlalt",
"hostkey_ctrlshift",
"hostkey_altshift",
"--",
"hostkey_mapper",
NULL
};
/* main -> mouse wheel menu ("WheelToArrows") */
static const char *def_menu_main_wheelarrow[] =
{
@ -723,6 +736,7 @@ static const char *def_menu_help[] =
NULL
};
void DOSBox_SetSysMenu(void);
bool DOSBox_isMenuVisible(void) {
return menu.toggle;
}
@ -1362,6 +1376,9 @@ void ConstructMenu(void) {
/* main sendkey menu */
ConstructSubMenu(mainMenu.get_item("MainSendKey").get_master_id(), def_menu_main_sendkey);
/* main hostkey menu */
ConstructSubMenu(mainMenu.get_item("MainHostKey").get_master_id(), def_menu_main_hostkey);
/* main mouse wheel movements menu */
ConstructSubMenu(mainMenu.get_item("WheelToArrow").get_master_id(), def_menu_main_wheelarrow);
@ -1628,10 +1645,8 @@ void DOSBox_SetMenu(void) {
if(menu.startup) {
RENDER_CallBack( GFX_CallBackReset );
}
void DOSBox_SetSysMenu(void);
DOSBox_SetSysMenu();
#endif
DOSBox_SetSysMenu();
}
void DOSBox_NoMenu(void) {
@ -1654,10 +1669,8 @@ void DOSBox_NoMenu(void) {
SDL1_hax_SetMenu(NULL);
mainMenu.get_item("mapper_togmenu").check(!menu.toggle).refresh_item(mainMenu);
RENDER_CallBack( GFX_CallBackReset );
void DOSBox_SetSysMenu(void);
DOSBox_SetSysMenu();
#endif
DOSBox_SetSysMenu();
}
void ToggleMenu(bool pressed) {
@ -1680,7 +1693,6 @@ void ToggleMenu(bool pressed) {
DOSBox_NoMenu();
}
void DOSBox_SetSysMenu(void);
DOSBox_SetSysMenu();
}
@ -1721,6 +1733,181 @@ HWND GetSurfaceHWND(void) {
# endif
#endif
void MSG_WM_COMMAND_handle(SDL_SysWMmsg &Message) {
#if defined(WIN32) && !defined(HX_DOS)
bool GFX_GetPreventFullscreen(void);
bool MAPPER_IsRunning(void);
bool GUI_IsRunning(void);
#if defined(C_SDL2)
if (Message.msg.win.msg != WM_COMMAND) return;
#else
if (Message.msg != WM_COMMAND) return;
#endif
WPARAM wParam;
#if defined(C_SDL2)
wParam=Message.msg.win.wParam;
#else
wParam=Message.wParam;
#endif
if (!MAPPER_IsRunning() && !GUI_IsRunning()) {
if (LOWORD(wParam) == ID_WIN_SYSMENU_MAPPER) {
extern void MAPPER_Run(bool pressed);
MAPPER_Run(false);
}
if (LOWORD(wParam) == ID_WIN_SYSMENU_CFG_GUI) {
extern void GUI_Run(bool pressed);
GUI_Run(false);
}
if (LOWORD(wParam) == ID_WIN_SYSMENU_PAUSE) {
extern void PauseDOSBox(bool pressed);
PauseDOSBox(true);
}
if (LOWORD(wParam) == ID_WIN_SYSMENU_RESETSIZE) {
extern void resetFontSize();
resetFontSize();
}
#if defined(USE_TTF)
if (LOWORD(wParam) == ID_WIN_SYSMENU_TTFINCSIZE) {
extern void increaseFontSize();
increaseFontSize();
}
if (LOWORD(wParam) == ID_WIN_SYSMENU_TTFDECSIZE) {
extern void decreaseFontSize();
decreaseFontSize();
}
#endif
}
std::string fullScreenString = std::string("desktop.fullscreen");
if (!menu.gui || GetSetSDLValue(1, fullScreenString, 0)) return;
if (!GetMenu(GetHWND())) return;
#if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU
if (mainMenu.mainMenuWM_COMMAND((unsigned int)LOWORD(wParam))) return;
#endif
#endif
}
void DOSBox_SetSysMenu(void) {
#if defined(WIN32) && !defined(HX_DOS)
MENUITEMINFO mii;
HMENU sysmenu;
sysmenu = GetSystemMenu(GetHWND(), TRUE); // revert, so we can reapply menu items
sysmenu = GetSystemMenu(GetHWND(), FALSE);
if (sysmenu == NULL) return;
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
#if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU
{
const char *msg = "Show &menu bar";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = (menu.toggle ? MFS_CHECKED : 0) | (GFX_GetPreventFullscreen() ? MFS_DISABLED : MFS_ENABLED);
mii.wID = ID_WIN_SYSMENU_TOGGLEMENU;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg)+1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
#endif
{
const char *msg = "&Pause";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_PAUSE;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
{
const char *msg = "Reset window size";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_RESETSIZE;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg)+1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
#if defined(USE_TTF)
bool TTF_using(void);
ttfpos = GetMenuItemCount(sysmenu);
{
const char *msg = "Increase TTF font size";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = TTF_using() ? MFS_ENABLED : MFS_DISABLED;
mii.wID = ID_WIN_SYSMENU_TTFINCSIZE;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg)+1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
{
const char *msg = "Decrease TTF font size";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = TTF_using() ? MFS_ENABLED : MFS_DISABLED;
mii.wID = ID_WIN_SYSMENU_TTFDECSIZE;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg)+1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
#endif
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
{
const char *msg = "Configuration &Tool";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_CFG_GUI;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
{
const char *msg = "Mapper &Editor";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_MAPPER;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
#endif
}
#if defined(WIN32) && !defined(C_SDL2) && !defined(HX_DOS)
#include <shlobj.h>
@ -1850,79 +2037,6 @@ void Mount_Img(char drive, std::string realpath) {
(void)drive;
}
void DOSBox_SetSysMenu(void) {
#if !defined(HX_DOS)
MENUITEMINFO mii;
HMENU sysmenu;
sysmenu = GetSystemMenu(GetHWND(), TRUE); // revert, so we can reapply menu items
sysmenu = GetSystemMenu(GetHWND(), FALSE);
if (sysmenu == NULL) return;
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
{
const char *msg = "Show menu &bar";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = (menu.toggle ? MFS_CHECKED : 0) | (GFX_GetPreventFullscreen() ? MFS_DISABLED : MFS_ENABLED);
mii.wID = ID_WIN_SYSMENU_TOGGLEMENU;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg)+1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
{
const char *msg = "&Pause";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_PAUSE;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
AppendMenu(sysmenu, MF_SEPARATOR, -1, "");
{
const char *msg = "Show &mapper interface";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_MAPPER;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
{
const char *msg = "Show configuration &GUI";
memset(&mii, 0, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mii.fState = MFS_ENABLED;
mii.wID = ID_WIN_SYSMENU_CFG_GUI;
mii.dwTypeData = (LPTSTR)(msg);
mii.cch = (UINT)(strlen(msg) + 1);
InsertMenuItem(sysmenu, GetMenuItemCount(sysmenu), TRUE, &mii);
}
#endif
}
void DOSBox_CheckOS(int &id, int &major, int &minor) {
OSVERSIONINFO osi;
ZeroMemory(&osi, sizeof(OSVERSIONINFO));
@ -1962,12 +2076,12 @@ void DOSBox_RefreshMenu(void) {
DrawMenuBar(GetHWND());
return;
}
DOSBox_SetSysMenu();
if(menu.toggle)
DOSBox_SetMenu();
else
DOSBox_NoMenu();
#endif
DOSBox_SetSysMenu();
}
void DOSBox_RefreshMenu2(void) {
@ -1993,10 +2107,8 @@ void DOSBox_RefreshMenu2(void) {
NonUserResizeCounter=1;
SDL1_hax_SetMenu(NULL);
}
void DOSBox_SetSysMenu(void);
DOSBox_SetSysMenu();
#endif
DOSBox_SetSysMenu();
}
void MENU_Check_Drive(HMENU handle, int cdrom, int floppy, int local, int image, int automount, int umount, char drive) {
@ -2033,40 +2145,6 @@ void reflectmenu_INITMENU_cb() {
the menus before the menu is displayed. */
Reflect_Menu();
}
void MSG_WM_COMMAND_handle(SDL_SysWMmsg &Message) {
bool GFX_GetPreventFullscreen(void);
if (Message.msg != WM_COMMAND) return;
#if defined(WIN32) && !defined(HX_DOS)
bool MAPPER_IsRunning(void);
bool GUI_IsRunning(void);
if (!MAPPER_IsRunning() && !GUI_IsRunning()) {
if (LOWORD(Message.wParam) == ID_WIN_SYSMENU_MAPPER) {
extern void MAPPER_Run(bool pressed);
MAPPER_Run(false);
}
if (LOWORD(Message.wParam) == ID_WIN_SYSMENU_CFG_GUI) {
extern void GUI_Run(bool pressed);
GUI_Run(false);
}
if (LOWORD(Message.wParam) == ID_WIN_SYSMENU_PAUSE) {
extern void PauseDOSBox(bool pressed);
PauseDOSBox(true);
}
}
#endif
std::string fullScreenString = std::string("desktop.fullscreen");
if (!menu.gui || GetSetSDLValue(1, fullScreenString, 0)) return;
if (!GetMenu(GetHWND())) return;
#if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU
if (mainMenu.mainMenuWM_COMMAND((unsigned int)LOWORD(Message.wParam))) return;
#endif
}
#else
void DOSBox_SetSysMenu(void) {
}
#endif
#if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW

View File

@ -99,6 +99,7 @@ int shortcutid = -1;
void GFX_GetSizeAndPos(int &x,int &y,int &width, int &height, bool &fullscreen);
#if defined(WIN32) && !defined(HX_DOS)
void DOSBox_SetSysMenu(void);
void WindowsTaskbarUpdatePreviewRegion(void);
void WindowsTaskbarResetPreviewRegion(void);
#endif
@ -480,6 +481,7 @@ static void UI_Shutdown(GUI::ScreenSDL *screen) {
#endif
#if defined(WIN32) && !defined(HX_DOS)
DOSBox_SetSysMenu();
WindowsTaskbarUpdatePreviewRegion();
#endif

View File

@ -45,6 +45,7 @@
#include "menu.h"
#include "SDL_syswm.h"
#include "sdlmain.h"
#if C_EMSCRIPTEN
# include <emscripten.h>
@ -162,7 +163,8 @@ struct KeyBlock {
static DOSBoxMenu mapperMenu;
#endif
extern uint8_t int10_font_14[256 * 14];
extern unsigned int hostkeyalt;
extern uint8_t int10_font_14[256 * 14];
std::map<std::string,std::string> pending_string_binds;
@ -2068,7 +2070,13 @@ void CBindGroup::ActivateBindList(CBindList * list,Bits value,bool ev_trigger) {
}
}
for (it=list->begin();it!=list->end();++it) {
if (validmod==(*it)->mods) (*it)->ActivateBind(value,ev_trigger);
if ((*it)->mods==MMODHOST) {
if ((!hostkeyalt&&validmod==(*it)->mods)||(hostkeyalt==1&&(sdl.lctrlstate==SDL_KEYDOWN||sdl.rctrlstate==SDL_KEYDOWN)&&(sdl.laltstate==SDL_KEYDOWN||sdl.raltstate==SDL_KEYDOWN))||(hostkeyalt==2&&(sdl.lctrlstate==SDL_KEYDOWN||sdl.rctrlstate==SDL_KEYDOWN)&&(sdl.lshiftstate==SDL_KEYDOWN||sdl.rshiftstate==SDL_KEYDOWN))||(hostkeyalt==3&&(sdl.laltstate==SDL_KEYDOWN||sdl.raltstate==SDL_KEYDOWN)&&(sdl.lshiftstate==SDL_KEYDOWN||sdl.rshiftstate==SDL_KEYDOWN))) {
(*it)->flags|=BFLG_Hold;
(*it)->ActivateBind(value,ev_trigger);
}
} else if (validmod==(*it)->mods)
(*it)->ActivateBind(value,ev_trigger);
}
}
@ -2647,7 +2655,7 @@ std::string CBind::GetModifierText(void) {
if ((mods & ((Bitu)1u << (m - 1u))) && mod_event[m] != NULL) {
t = mod_event[m]->GetBindMenuText();
if (!r.empty()) r += "+";
r += t;
r += m==4?(hostkeyalt==1?"Ctrl+Alt":(hostkeyalt==2?"Ctrl+Shift":(hostkeyalt==3?"Alt+Shift":t))):t;
}
}
@ -2741,6 +2749,12 @@ public:
case MK_home:
key=SDL_SCANCODE_HOME;
break;
case MK_comma:
key=SDL_SCANCODE_COMMA;
break;
case MK_period:
key=SDL_SCANCODE_PERIOD;
break;
case MK_1:
key=SDL_SCANCODE_1;
break;
@ -2756,6 +2770,9 @@ public:
case MK_a:
key=SDL_SCANCODE_A;
break;
case MK_b:
key=SDL_SCANCODE_B;
break;
case MK_c:
key=SDL_SCANCODE_C;
break;
@ -2765,9 +2782,21 @@ public:
case MK_f:
key=SDL_SCANCODE_F;
break;
case MK_i:
key=SDL_SCANCODE_I;
break;
case MK_l:
key=SDL_SCANCODE_L;
break;
case MK_m:
key=SDL_SCANCODE_M;
break;
case MK_o:
key=SDL_SCANCODE_O;
break;
case MK_p:
key=SDL_SCANCODE_P;
break;
case MK_q:
key=SDL_SCANCODE_Q;
break;
@ -2861,9 +2890,15 @@ public:
key=SDLK_PRINT;
#endif
break;
case MK_home:
case MK_home:
key=SDLK_HOME;
break;
case MK_comma:
key=SDLK_COMMA;
break;
case MK_period:
key=SDLK_PERIOD;
break;
case MK_1:
key=SDLK_1;
break;
@ -2879,6 +2914,9 @@ public:
case MK_a:
key=SDLK_a;
break;
case MK_b:
key=SDLK_b;
break;
case MK_c:
key=SDLK_c;
break;
@ -2888,9 +2926,21 @@ public:
case MK_f:
key=SDLK_f;
break;
case MK_i:
key=SDLK_i;
break;
case MK_l:
key=SDLK_l;
break;
case MK_m:
key=SDLK_m;
break;
case MK_o:
key=SDLK_o;
break;
case MK_p:
key=SDLK_p;
break;
case MK_q:
key=SDLK_q;
break;
@ -4274,6 +4324,12 @@ void MAPPER_Run(bool pressed) {
PIC_AddEvent(MAPPER_RunEvent,0.0001f); //In case mapper deletes the key object that ran it
}
void update_all_shortcuts() {
for (auto &ev : events) {
if (ev != NULL) ev->update_menu_shortcut();
}
}
void MAPPER_RunInternal() {
MAPPER_ReleaseAllKeys();
@ -4377,6 +4433,10 @@ void MAPPER_RunInternal() {
SDL_FreePalette(sdl2_map_pal_ptr);
GFX_SetResizeable(true);
#endif
#if defined(USE_TTF)
void resetFontSize();
if (ttf.inUse) resetFontSize();
#endif
#if defined (REDUCE_JOYSTICK_POLLING)
SDL_JoystickEventState(SDL_DISABLE);
#endif
@ -4414,9 +4474,7 @@ void MAPPER_RunInternal() {
GFX_LosingFocus();
/* and then the menu items need to be updated */
for (auto &ev : events) {
if (ev != NULL) ev->update_menu_shortcut();
}
update_all_shortcuts();
#if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW
mainMenu.rebuild();
@ -4523,9 +4581,7 @@ void MAPPER_Init(void) {
}
/* and then the menu items need to be updated */
for (auto &ev : events) {
if (ev != NULL) ev->update_menu_shortcut();
}
update_all_shortcuts();
}
void ReloadMapper(Section_prop *section, bool init) {

View File

@ -238,17 +238,18 @@ void osx_init_touchbar(void);
bool TTF_using(void);
void ShutDownMemHandles(Section * sec);
void resetFontSize();
static void decreaseFontSize();
void resetFontSize(), decreaseFontSize();
extern SHELL_Cmd cmd_list[];
SDL_Block sdl;
Bitu frames = 0;
unsigned int page=0;
unsigned int hostkeyalt=0;
unsigned int sendkeymap=0;
ScreenSizeInfo screen_size_info;
#if defined(USE_TTF)
extern int ttfpos;
Render_ttf ttf;
bool char512 = true;
bool showbold = true;
@ -1490,19 +1491,28 @@ void PauseDOSBoxLoop(Bitu /*unused*/) {
SDL_WaitEvent(&event); // since we're not polling, cpu usage drops to 0.
#endif
#ifdef __WIN32__
#if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU
if (event.type==SDL_SYSWMEVENT && event.syswm.msg->msg == WM_COMMAND && (LOWORD(event.syswm.msg->wParam) == ID_WIN_SYSMENU_PAUSE || LOWORD(event.syswm.msg->wParam) == (mainMenu.get_item("mapper_pause").get_master_id()+DOSBoxMenu::winMenuMinimumID))) {
#if defined(WIN32) && !defined(HX_DOS)
UINT msg=0;
WPARAM wparam;
if (event.type==SDL_SYSWMEVENT) {
#if defined(C_SDL2)
msg=event.syswm.msg->msg.win.msg;
wparam=event.syswm.msg->msg.win.wParam;
#else
msg=event.syswm.msg->msg;
wparam=event.syswm.msg->wParam;
#endif
}
if (event.type==SDL_SYSWMEVENT && msg == WM_COMMAND && (LOWORD(wparam) == ID_WIN_SYSMENU_PAUSE || LOWORD(wparam) == (mainMenu.get_item("mapper_pause").get_master_id()+DOSBoxMenu::winMenuMinimumID))) {
paused=false;
GFX_SetTitle(-1,-1,-1,false);
break;
}
if (event.type == SDL_SYSWMEVENT && event.syswm.msg->msg == WM_SYSCOMMAND && LOWORD(event.syswm.msg->wParam) == ID_WIN_SYSMENU_PAUSE) {
if (event.type == SDL_SYSWMEVENT && msg == WM_SYSCOMMAND && LOWORD(wparam) == ID_WIN_SYSMENU_PAUSE) {
paused = false;
GFX_SetTitle(-1, -1, -1, false);
break;
}
#endif
#endif
switch (event.type) {
@ -1816,12 +1826,15 @@ Bitu GFX_GetBestMode(Bitu flags)
void SDL_Prepare(void) {
if (menu_compatible) return;
#if defined(WIN32) && !defined(C_SDL2) && !defined(HX_DOS) // Microsoft Windows specific
#if defined(WIN32) && !defined(HX_DOS) // Microsoft Windows specific
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
#if !defined(C_SDL2)
LOG(LOG_MISC,LOG_DEBUG)("Win32: Preparing main window to accept files dragged in from the Windows shell");
SDL_PumpEvents(); SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
SDL_PumpEvents();
DragAcceptFiles(GetHWND(), TRUE);
#endif
#endif
}
void GFX_ForceRedrawScreen(void) {
@ -3519,6 +3532,13 @@ void change_output(int output) {
resetFontSize();
resetreq = true;
}
#if defined(WIN32) && !defined(HX_DOS)
HMENU sysmenu = GetSystemMenu(GetHWND(), TRUE);
if (ttfpos>-1 && sysmenu != NULL) {
EnableMenuItem(sysmenu, ttfpos, MF_BYPOSITION|(TTF_using()?MF_ENABLED:MF_DISABLED));
EnableMenuItem(sysmenu, ttfpos+1, MF_BYPOSITION|(TTF_using()?MF_ENABLED:MF_DISABLED));
}
#endif
mainMenu.get_item("mapper_ttf_incsize").enable(TTF_using()).refresh_item(mainMenu);
mainMenu.get_item("mapper_ttf_decsize").enable(TTF_using()).refresh_item(mainMenu);
mainMenu.get_item("ttf_showbold").enable(TTF_using()).check(showbold).refresh_item(mainMenu);
@ -4581,7 +4601,7 @@ void resetFontSize() {
}
}
static void decreaseFontSize() {
void decreaseFontSize() {
if (ttf.inUse && ttf.pointsize > 10) {
GFX_SelectFontByPoints(ttf.pointsize - (ttf.DOSBox ? 2 : 1));
GFX_SetSize(720+sdl.clip.x, 400+sdl.clip.y, sdl.draw.flags,sdl.draw.scalex,sdl.draw.scaley,sdl.draw.callback);
@ -4594,7 +4614,7 @@ static void decreaseFontSize() {
}
}
static void increaseFontSize() {
void increaseFontSize() {
if (ttf.inUse) { // increase fontsize
int maxWidth = sdl.desktop.full.width;
int maxHeight = sdl.desktop.full.height;
@ -5045,7 +5065,7 @@ static void GUI_StartUp() {
MAPPER_AddHandler(ResetSystem, MK_r, MMODHOST, "reset", "Reset DOSBox-X", &item); /* Host+R (Host+CTRL+R acts funny on my Linux system) */
item->set_text("Reset virtual machine");
MAPPER_AddHandler(RebootGuest, MK_s, MMODHOST, "reboot", "Reboot guest system", &item); /* Reboot guest system or integrated DOS */
MAPPER_AddHandler(RebootGuest, MK_b, MMODHOST, "reboot", "Reboot guest system", &item); /* Reboot guest system or integrated DOS */
item->set_text("Reboot guest system");
#if !defined(HX_DOS)
@ -6440,7 +6460,7 @@ static void HandleTouchscreenFinger(SDL_TouchFingerEvent * finger) {
}
#endif
#if defined(WIN32) && !defined(C_SDL2) && !defined(HX_DOS)
#if defined(WIN32) && !defined(HX_DOS)
void MSG_WM_COMMAND_handle(SDL_SysWMmsg &Message);
#endif
@ -6580,6 +6600,44 @@ void GFX_Events() {
while (SDL_PollEvent(&event)) {
switch (event.type) {
#if defined(WIN32) && !defined(HX_DOS)
case SDL_SYSWMEVENT:
switch( event.syswm.msg->msg.win.msg ) {
case WM_COMMAND:
MSG_WM_COMMAND_handle(/*&*/(*event.syswm.msg));
break;
case WM_SYSCOMMAND:
switch (event.syswm.msg->msg.win.wParam) {
case ID_WIN_SYSMENU_MAPPER:
extern void MAPPER_Run(bool pressed);
MAPPER_Run(false);
break;
case ID_WIN_SYSMENU_CFG_GUI:
extern void GUI_Run(bool pressed);
GUI_Run(false);
break;
case ID_WIN_SYSMENU_PAUSE:
extern void PauseDOSBox(bool pressed);
PauseDOSBox(true);
break;
case ID_WIN_SYSMENU_RESETSIZE:
resetFontSize();
break;
#if defined(USE_TTF)
case ID_WIN_SYSMENU_TTFINCSIZE:
increaseFontSize();
break;
case ID_WIN_SYSMENU_TTFDECSIZE:
decreaseFontSize();
break;
#endif
default:
break;
}
default:
break;
}
#endif
case SDL_WINDOWEVENT:
switch (event.window.event) {
case SDL_WINDOWEVENT_MOVED:
@ -6886,6 +6944,17 @@ void GFX_Events() {
extern void PauseDOSBox(bool pressed);
PauseDOSBox(true);
break;
case ID_WIN_SYSMENU_RESETSIZE:
resetFontSize();
break;
#if defined(USE_TTF)
case ID_WIN_SYSMENU_TTFINCSIZE:
increaseFontSize();
break;
case ID_WIN_SYSMENU_TTFDECSIZE:
decreaseFontSize();
break;
#endif
#endif
}
default:
@ -7019,7 +7088,6 @@ void GFX_Events() {
case SDL_VIDEOEXPOSE:
if (sdl.draw.callback && !glide.enabled) sdl.draw.callback( GFX_CallBackRedraw );
break;
#ifdef WIN32
case SDL_KEYDOWN:
case SDL_KEYUP:
// ignore event alt+tab
@ -7029,6 +7097,7 @@ void GFX_Events() {
if (event.key.keysym.sym==SDLK_RCTRL) sdl.rctrlstate = event.key.type;
if (event.key.keysym.sym==SDLK_LSHIFT) sdl.lshiftstate = event.key.type;
if (event.key.keysym.sym==SDLK_RSHIFT) sdl.rshiftstate = event.key.type;
#if defined(WIN32)
if (((event.key.keysym.sym==SDLK_TAB)) &&
((sdl.laltstate==SDL_KEYDOWN) || (sdl.raltstate==SDL_KEYDOWN))) { MAPPER_LosingFocus(); break; }
// This can happen as well.
@ -7037,8 +7106,6 @@ void GFX_Events() {
if ((event.key.keysym.sym == SDLK_TAB) && (GetTicks() - sdl.focus_ticks < 2)) break;
#endif
#if defined (MACOSX)
case SDL_KEYDOWN:
case SDL_KEYUP:
/* On macs CMD-Q is the default key to close an application */
if (event.key.keysym.sym == SDLK_q && (event.key.keysym.mod == KMOD_RMETA || event.key.keysym.mod == KMOD_LMETA) ) {
KillSwitch(true);
@ -10248,6 +10315,24 @@ bool sendkey_preset_menu_callback(DOSBoxMenu * const menu, DOSBoxMenu::item * co
return true;
}
void update_all_shortcuts();
bool hostkey_preset_menu_callback(DOSBoxMenu * const menu, DOSBoxMenu::item * const menuitem) {
(void)menu;//UNUSED
if (menuitem->get_name()=="hostkey_ctrlalt") hostkeyalt=1;
else if (menuitem->get_name()=="hostkey_ctrlshift") hostkeyalt=2;
else if (menuitem->get_name()=="hostkey_altshift") hostkeyalt=3;
else hostkeyalt=0;
mainMenu.get_item("hostkey_ctrlalt").check(hostkeyalt==1).refresh_item(mainMenu);
mainMenu.get_item("hostkey_ctrlshift").check(hostkeyalt==2).refresh_item(mainMenu);
mainMenu.get_item("hostkey_altshift").check(hostkeyalt==3).refresh_item(mainMenu);
mainMenu.get_item("hostkey_mapper").check(hostkeyalt==0).refresh_item(mainMenu);
update_all_shortcuts();
#if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW
mainMenu.rebuild();
#endif
return true;
}
bool help_open_url_callback(DOSBoxMenu * const menu, DOSBoxMenu::item * const menuitem) {
(void)menu;//UNUSED
std::string url="";
@ -11185,6 +11270,10 @@ int main(int argc, char* argv[]) SDL_MAIN_NOEXCEPT {
DOSBoxMenu::item &item = mainMenu.alloc_item(DOSBoxMenu::submenu_type_id,"MainSendKey");
item.set_text("Send special key");
}
{
DOSBoxMenu::item &item = mainMenu.alloc_item(DOSBoxMenu::submenu_type_id,"MainHostKey");
item.set_text("Select host key");
}
{
DOSBoxMenu::item &item = mainMenu.alloc_item(DOSBoxMenu::submenu_type_id,"WheelToArrow");
item.set_text("Mouse wheel movements");
@ -11841,6 +11930,10 @@ int main(int argc, char* argv[]) SDL_MAIN_NOEXCEPT {
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_ctrlesc").set_text("Send Ctrl+Esc").set_callback_function(sendkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_ctrlbreak").set_text("Send Ctrl+Break").set_callback_function(sendkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_cad").set_text("Send Ctrl+Alt+Del").set_callback_function(sendkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"hostkey_ctrlalt").set_text("Ctrl+Alt").set_callback_function(hostkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"hostkey_ctrlshift").set_text("Ctrl+Shift").set_callback_function(hostkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"hostkey_altshift").set_text("Alt+Shift").set_callback_function(hostkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"hostkey_mapper").set_text("Mapper-defined").set_callback_function(hostkey_preset_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_mapper_winlogo").set_text("Mapper \"Send special key\": logo key").set_callback_function(sendkey_mapper_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_mapper_winmenu").set_text("Mapper \"Send special key\": menu key").set_callback_function(sendkey_mapper_menu_callback);
mainMenu.alloc_item(DOSBoxMenu::item_type_id,"sendkey_mapper_alttab").set_text("Mapper \"Send special key\": Alt+Tab").set_callback_function(sendkey_mapper_menu_callback);
@ -11873,6 +11966,12 @@ int main(int argc, char* argv[]) SDL_MAIN_NOEXCEPT {
mainMenu.get_item("sendkey_mapper_ctrlesc").check(sendkeymap==4).refresh_item(mainMenu);
mainMenu.get_item("sendkey_mapper_ctrlbreak").check(sendkeymap==5).refresh_item(mainMenu);
mainMenu.get_item("sendkey_mapper_cad").check(!sendkeymap).refresh_item(mainMenu);
mainMenu.get_item("hostkey_ctrlalt").check(hostkeyalt==1).refresh_item(mainMenu);
mainMenu.get_item("hostkey_ctrlshift").check(hostkeyalt==2).refresh_item(mainMenu);
mainMenu.get_item("hostkey_altshift").check(hostkeyalt==3).refresh_item(mainMenu);
std::string mapper_keybind = mapper_event_keybind_string("host");
if (mapper_keybind.empty()) mapper_keybind = "unbound";
mainMenu.get_item("hostkey_mapper").check(hostkeyalt==0).set_text("Mapper-defined: "+mapper_keybind).refresh_item(mainMenu);
bool MENU_get_swapstereo(void);
mainMenu.get_item("mixer_swapstereo").check(MENU_get_swapstereo()).refresh_item(mainMenu);

View File

@ -314,7 +314,7 @@ bool export_ffmpeg = false;
std::string capturedir;
extern std::string savefilename;
extern bool use_save_file, noremark_save_state, force_load_state;
extern unsigned int sendkeymap;
extern unsigned int hostkeyalt, sendkeymap;
extern const char* RunningProgram;
Bitu CaptureState = 0;
@ -1834,6 +1834,11 @@ void CAPTURE_Init() {
mainMenu.get_item(slot).enable(!use_save_file).refresh_item(mainMenu);
}
}
std::string hostkey = section->Get_string("hostkey");
if (hostkey=="ctrlalt") hostkeyalt=1;
else if (hostkey=="ctrlshift") hostkeyalt=2;
else if (hostkey=="altshift") hostkeyalt=3;
else hostkeyalt=0;
std::string mapsendkey = section->Get_string("mapper send key");
if (mapsendkey=="winlogo") sendkeymap=1;
else if (mapsendkey=="winmenu") sendkeymap=2;
@ -1884,7 +1889,7 @@ void CAPTURE_Init() {
#if !defined(C_EMSCRIPTEN)
// mapper shortcuts for capture
MAPPER_AddHandler(CAPTURE_WaveEvent,MK_w,MMOD3|MMODHOST,"recwave","Record audio to WAV", &item);
MAPPER_AddHandler(CAPTURE_WaveEvent,MK_w,MMODHOST,"recwave","Record audio to WAV", &item);
item->set_text("Record audio to WAV");
MAPPER_AddHandler(CAPTURE_MTWaveEvent,MK_nothing,0,"recmtwave","Record to M.T. AVI", &item);
@ -1896,10 +1901,10 @@ void CAPTURE_Init() {
MAPPER_AddHandler(OPL_SaveRawEvent,MK_nothing,0,"caprawopl","Record FM/OPL output",&item);
item->set_text("Record FM (OPL) output");
#if (C_SSHOT)
MAPPER_AddHandler(CAPTURE_ScreenShotEvent,MK_s,MMOD3|MMODHOST,"scrshot","Take screenshot", &item);
MAPPER_AddHandler(CAPTURE_ScreenShotEvent,MK_p,MMODHOST,"scrshot","Take screenshot", &item);
item->set_text("Take screenshot");
MAPPER_AddHandler(CAPTURE_VideoEvent,MK_v,MMOD3|MMODHOST,"video","Record video to AVI", &item);
MAPPER_AddHandler(CAPTURE_VideoEvent,MK_i,MMODHOST,"video","Record video to AVI", &item);
item->set_text("Record video to AVI");
#endif
#endif

View File

@ -1619,7 +1619,9 @@ public:
}
if (!strcasecmp(realnicstring,"list")) {
// print list and quit
LOG_MSG(("\n"+niclist).c_str());
std::istringstream in(("\n"+niclist+"\n").c_str());
if (in) for (std::string line; std::getline(in, line); )
LOG_MSG(line.c_str());
pcap_freealldevs(alldevs);
load_success = false;
return;

View File

@ -9164,10 +9164,10 @@ void BIOS_Init() {
for (int i=0;i < MAX_ISA_PNP_SYSDEVNODES;i++) ISAPNP_SysDevNodes[i] = NULL;
/* make sure CD swap and floppy swap mapper events are available */
MAPPER_AddHandler(swapInNextDisk,MK_d,MMODHOST|MMOD1,"swapimg","Swap floppy drive",&item); /* Originally "Swap Image" but this version does not swap CDs */
MAPPER_AddHandler(swapInNextDisk,MK_o,MMODHOST,"swapimg","Swap floppy drive",&item); /* Originally "Swap Image" but this version does not swap CDs */
item->set_text("Swap floppy drive");
MAPPER_AddHandler(swapInNextCD,MK_c,MMODHOST|MMOD1,"swapcd","Swap CD drive",&item); /* Variant of "Swap Image" for CDs */
MAPPER_AddHandler(swapInNextCD,MK_d,MMODHOST,"swapcd","Swap CD drive",&item); /* Variant of "Swap Image" for CDs */
item->set_text("Swap CD drive");
/* NTS: VM_EVENT_BIOS_INIT this callback must be first. */