diff --git a/CHANGELOG b/CHANGELOG
index f68fc36e0..b7be24b67 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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)
diff --git a/contrib/linux/com.dosbox_x.DOSBox-X.metainfo.xml.in b/contrib/linux/com.dosbox_x.DOSBox-X.metainfo.xml.in
index 985cc9a40..913d902d0 100644
--- a/contrib/linux/com.dosbox_x.DOSBox-X.metainfo.xml.in
+++ b/contrib/linux/com.dosbox_x.DOSBox-X.metainfo.xml.in
@@ -10,7 +10,7 @@
Emulation
-
+
diff --git a/contrib/windows/installer/dosbox-x.reference.setup.conf b/contrib/windows/installer/dosbox-x.reference.setup.conf
index 1cf0dff05..1c20aae08 100644
--- a/contrib/windows/installer/dosbox-x.reference.setup.conf
+++ b/contrib/windows/installer/dosbox-x.reference.setup.conf
@@ -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
diff --git a/dosbox-x.reference.conf b/dosbox-x.reference.conf
index fd58dd857..1fb1d8d16 100644
--- a/dosbox-x.reference.conf
+++ b/dosbox-x.reference.conf
@@ -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
diff --git a/dosbox-x.reference.full.conf b/dosbox-x.reference.full.conf
index 371a2dc7f..0fadff4b7 100644
--- a/dosbox-x.reference.full.conf
+++ b/dosbox-x.reference.full.conf
@@ -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
diff --git a/include/build_timestamp.h b/include/build_timestamp.h
index c02ab3eb0..b3121e743 100644
--- a/include/build_timestamp.h
+++ b/include/build_timestamp.h
@@ -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"
diff --git a/include/mapper.h b/include/mapper.h
index 50bd7faa2..24af7864c 100644
--- a/include/mapper.h
+++ b/include/mapper.h
@@ -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
};
diff --git a/include/menu.h b/include/menu.h
index 1fa5635db..23ee5b21f 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -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;
diff --git a/include/resource.h b/include/resource.h
index 15d4dec2f..53eec841a 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -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
diff --git a/src/dosbox.cpp b/src/dosbox.cpp
index 615736363..7a9651b12 100644
--- a/src/dosbox.cpp
+++ b/src/dosbox.cpp
@@ -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(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);
diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp
index 765fa6f03..b315f2fb7 100644
--- a/src/gui/menu.cpp
+++ b/src/gui/menu.cpp
@@ -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
@@ -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
diff --git a/src/gui/sdl_gui.cpp b/src/gui/sdl_gui.cpp
index e6e521789..4c32d735a 100644
--- a/src/gui/sdl_gui.cpp
+++ b/src/gui/sdl_gui.cpp
@@ -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
diff --git a/src/gui/sdl_mapper.cpp b/src/gui/sdl_mapper.cpp
index 598a7ff54..723b15251 100644
--- a/src/gui/sdl_mapper.cpp
+++ b/src/gui/sdl_mapper.cpp
@@ -45,6 +45,7 @@
#include "menu.h"
#include "SDL_syswm.h"
+#include "sdlmain.h"
#if C_EMSCRIPTEN
# include
@@ -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 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) {
diff --git a/src/gui/sdlmain.cpp b/src/gui/sdlmain.cpp
index cff928c4d..283a507dd 100644
--- a/src/gui/sdlmain.cpp
+++ b/src/gui/sdlmain.cpp
@@ -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);
diff --git a/src/hardware/hardware.cpp b/src/hardware/hardware.cpp
index 89d5b5308..437a1a8d7 100644
--- a/src/hardware/hardware.cpp
+++ b/src/hardware/hardware.cpp
@@ -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
diff --git a/src/hardware/ne2000.cpp b/src/hardware/ne2000.cpp
index e040f843c..9a4cc9c9f 100644
--- a/src/hardware/ne2000.cpp
+++ b/src/hardware/ne2000.cpp
@@ -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;
diff --git a/src/ints/bios.cpp b/src/ints/bios.cpp
index 81f31ba45..714429c7b 100644
--- a/src/ints/bios.cpp
+++ b/src/ints/bios.cpp
@@ -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. */