From 73423681ddbca9e4829471a6b5a3d0035129fa59 Mon Sep 17 00:00:00 2001 From: Wengier Date: Wed, 25 Nov 2020 01:12:51 -0500 Subject: [PATCH] enhanced mapper and system menu etc --- CHANGELOG | 22 +- .../com.dosbox_x.DOSBox-X.metainfo.xml.in | 2 +- .../installer/dosbox-x.reference.setup.conf | 3 + dosbox-x.reference.conf | 3 + dosbox-x.reference.full.conf | 3 + include/build_timestamp.h | 4 +- include/mapper.h | 6 +- include/menu.h | 2 +- include/resource.h | 5 + src/dosbox.cpp | 16 +- src/gui/menu.cpp | 314 +++++++++++------- src/gui/sdl_gui.cpp | 2 + src/gui/sdl_mapper.cpp | 76 ++++- src/gui/sdlmain.cpp | 131 +++++++- src/hardware/hardware.cpp | 13 +- src/hardware/ne2000.cpp | 4 +- src/ints/bios.cpp | 4 +- 17 files changed, 444 insertions(+), 166 deletions(-) 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. */