From: Toni Wilen Date: Sun, 4 Dec 2016 11:50:07 +0000 (+0200) Subject: AF updates. X-Git-Tag: 3400~12 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=a5ee3880fd8955c87a09f74872720c962d43ac41;p=francis%2Fwinuae.git AF updates. --- diff --git a/include/inputdevice.h b/include/inputdevice.h index 37360394..c1851d22 100644 --- a/include/inputdevice.h +++ b/include/inputdevice.h @@ -198,6 +198,7 @@ extern void inputdevice_set_device_status (int devnum, int enabled); extern int inputdevice_get_device_total (int type); extern int inputdevice_get_widget_num (int devnum); extern int inputdevice_get_widget_type (int devnum, int num, TCHAR *name); +extern int send_input_event (int nr, int state, int max, int autofire); extern int input_get_default_mouse (struct uae_input_device *uid, int num, int port, int af, bool gp, bool wheel, bool joymouseswap); extern int input_get_default_lightpen (struct uae_input_device *uid, int num, int port, int af, bool gp, bool joymouseswap); diff --git a/inputdevice.cpp b/inputdevice.cpp index d4033705..e93e6719 100644 --- a/inputdevice.cpp +++ b/inputdevice.cpp @@ -4609,6 +4609,11 @@ static int handle_input_event (int nr, int state, int max, int autofire, bool ca return 1; } +int send_input_event (int nr, int state, int max, int autofire) +{ + return handle_input_event(nr, state, max, autofire, false, false); +} + static void inputdevice_checkconfig (void) { bool changed = false; diff --git a/od-win32/cloanto/RetroPlatformGuestIPC.cpp b/od-win32/cloanto/RetroPlatformGuestIPC.cpp index 586bd55c..91acbf4e 100644 --- a/od-win32/cloanto/RetroPlatformGuestIPC.cpp +++ b/od-win32/cloanto/RetroPlatformGuestIPC.cpp @@ -25,18 +25,7 @@ static const _TCHAR g_szHostWndClass[] = _T(RPIPC_HostWndClass); static const _TCHAR g_szGuestWndClass[] = _T(RPIPC_GuestWndClass); static const WCHAR g_szRegistration[] = L"Cloanto(R) RetroPlatform(TM)"; -#define VK_NOP 0xFF // do-nothing key (disables Windows keys functionality) -static BOOL g_bLeftWinDown = FALSE; -static BOOL g_bRightWinDown = FALSE; -static int g_nIgnoreLeftWinUp = 0; -static int g_nIgnoreRightWinUp = 0; - -struct VKeyFlags -{ - int nVKey; - DWORD dwFlags; -}; /***************************************************************************** @@ -58,6 +47,7 @@ HRESULT RPInitializeGuest(RPGUESTINFO *pInfo, HINSTANCE hInstance, LPCTSTR pszHo { _TCHAR szGuestClass[(sizeof(g_szGuestWndClass)/sizeof(_TCHAR))+20]; _TCHAR *pszHostClass; + RAWINPUTDEVICE rid; LRESULT lr; if (!pInfo || !pszHostInfo) @@ -69,8 +59,6 @@ HRESULT RPInitializeGuest(RPGUESTINFO *pInfo, HINSTANCE hInstance, LPCTSTR pszHo pInfo->bGuestClassRegistered = FALSE; pInfo->pfnMsgFunction = pfnMsgFunction; pInfo->lMsgFunctionParam = lMsgFunctionParam; - pInfo->hUser32 = LoadLibrary(_T("user32.dll")); - pInfo->pfnToUnicode = pInfo->hUser32 ? (TOUNICODEFN)GetProcAddress(pInfo->hUser32, "ToUnicode") : NULL; // find the host message window // @@ -117,6 +105,13 @@ HRESULT RPInitializeGuest(RPGUESTINFO *pInfo, HINSTANCE hInstance, LPCTSTR pszHo RPUninitializeGuest(pInfo); return HRESULT_FROM_WIN32(ERROR_INVALID_ACCESS); } + // disable system shortcuts (e.g. Windows-key shortcuts) while the guest is the foreground app + rid.usUsagePage = 0x01; + rid.usUsage = 0x06; + rid.dwFlags = RIDEV_NOHOTKEYS; + rid.hwndTarget = 0; + RegisterRawInputDevices(&rid, 1, sizeof(rid)); + return S_OK; } @@ -133,6 +128,8 @@ HRESULT RPInitializeGuest(RPGUESTINFO *pInfo, HINSTANCE hInstance, LPCTSTR pszHo void RPUninitializeGuest(RPGUESTINFO *pInfo) { + RAWINPUTDEVICE rid; + _TCHAR szGuestClass[(sizeof(g_szGuestWndClass)/sizeof(_TCHAR))+20]; if (!pInfo) @@ -149,12 +146,11 @@ void RPUninitializeGuest(RPGUESTINFO *pInfo) UnregisterClass(szGuestClass, pInfo->hInstance); pInfo->bGuestClassRegistered = FALSE; } - if (pInfo->hUser32) - { - FreeLibrary(pInfo->hUser32); - pInfo->hUser32 = NULL; - pInfo->pfnToUnicode = NULL; - } + rid.usUsagePage = 0x01; + rid.usUsage = 0x06; + rid.dwFlags = RIDEV_REMOVE | RIDEV_NOHOTKEYS; + rid.hwndTarget = 0; + RegisterRawInputDevices(&rid, 1, sizeof(rid)); } /***************************************************************************** @@ -305,229 +301,3 @@ static LRESULT CALLBACK RPGuestWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, return DefWindowProc(hWnd, uMessage, wParam, lParam); } } - -/***************************************************************************** - Name : RPProcessKeyboardInput - Arguments : DWORD dwFlags - - : BYTE btVirtualKey - wParam & 0xFF, for a WM_KEYDOWN/WM_KEYUP message - : BYTE btScanCode - (lParam >> 16) & 0xFF, for a WM_KEYDOWN/WM_KEYUP message - : const RPGUESTINFO *pInfo - - : LRESULT *plResult - - Return : HRESULT - - Authors : os - Created : 2016-06-21 11:04:38 - Comment : - *****************************************************************************/ - -HRESULT RPProcessKeyboardInput(DWORD dwFlags, BYTE btVirtualKey, BYTE btScanCode, const RPGUESTINFO *pInfo, LRESULT *plResult) -{ - static const struct VKeyFlags s_VKeyFlags[] = - { - { VK_CAPITAL, RP_PREPROCESSKEY_CAPS_DOWN }, - { VK_SHIFT, RP_PREPROCESSKEY_SHIFT_DOWN }, - { VK_LSHIFT, RP_PREPROCESSKEY_LSHIFT_DOWN }, - { VK_RSHIFT, RP_PREPROCESSKEY_RSHIFT_DOWN }, - { VK_MENU, RP_PREPROCESSKEY_ALT_DOWN }, - { VK_LMENU, RP_PREPROCESSKEY_LALT_DOWN }, - { VK_RMENU, RP_PREPROCESSKEY_RALT_DOWN }, - { VK_CONTROL, RP_PREPROCESSKEY_CTRL_DOWN }, - { VK_LCONTROL, RP_PREPROCESSKEY_LCTRL_DOWN }, - { VK_RCONTROL, RP_PREPROCESSKEY_RCTRL_DOWN }, - }; - static const int s_nVKeyFlagsCount = sizeof(s_VKeyFlags) / sizeof(s_VKeyFlags[0]); - BYTE btKeyboardState[256], btProcessedVirtualKey, btProcessedScanCode; - WPARAM wParam; - LPARAM lParam; - LRESULT lResult; - wchar_t wcChars[2]; - int n; - - if (!pInfo || !plResult) - return E_POINTER; - - if (!pInfo->pfnToUnicode) - return S_FALLBACK_HANDLING; - - if (dwFlags & (RPPKIF_EXTENDED0 | RPPKIF_EXTENDED1)) - { - switch (btVirtualKey) - { - case VK_CONTROL: btVirtualKey = VK_RCONTROL; break; - case VK_MENU: btVirtualKey = VK_RMENU; break; - } - } - else - { - switch (btVirtualKey) - { - case VK_CONTROL: btVirtualKey = VK_LCONTROL; break; - case VK_MENU: btVirtualKey = VK_LMENU; break; - case VK_SHIFT: btVirtualKey = (MapVirtualKey(VK_RSHIFT, MAPVK_VK_TO_VSC) == btScanCode) ? VK_RSHIFT : VK_LSHIFT; break; - } - } - - if (dwFlags & RPPKIF_MORE) - { - if (!RPSendMessage(RP_IPC_TO_HOST_PROCESSKEY, RP_PROCESSKEY_MORE, 0, NULL, 0, pInfo, plResult)) - return E_FAIL; - if (!(*plResult & RP_PROCESSKEY_OK)) - return S_FALLBACK_HANDLING; - } - else if (dwFlags & RPPKIF_KEYDOWN) - { - if (dwFlags & RPPKIF_DISABLEWIN) - { - switch (btVirtualKey) - { - case VK_LWIN: - case VK_RWIN: // disable Windows-key system functions (e.g. WinKey = Start Menu, WinKey+1/2/3 = activate first/second/third appbar program) - { - keybd_event(VK_NOP, 255, 0, 0); // a do-nothing key must precede the "up" event, or the Start Menu pops up - keybd_event(VK_NOP, 255, KEYEVENTF_KEYUP, 0); - keybd_event(btVirtualKey, btScanCode, KEYEVENTF_KEYUP, 0); - GetKeyboardState(btKeyboardState); - btKeyboardState[btVirtualKey] = 0; - SetKeyboardState(btKeyboardState); - if (btVirtualKey == VK_LWIN) - { - g_nIgnoreLeftWinUp += 1; // ignore the up event just synthesized - if (g_bLeftWinDown) - dwFlags |= RPPKIF_AUTOREPEAT; // flag as auto-repeated key event - else - g_bLeftWinDown = TRUE; - } - else - { - g_nIgnoreRightWinUp += 1; - if (g_bRightWinDown) - dwFlags |= RPPKIF_AUTOREPEAT; - else - g_bRightWinDown = TRUE; - } - break; - } - case VK_NOP: - return S_IGNORE; - } - } - if (dwFlags & RPPKIF_AUTOREPEAT) // ignore repeated keys (autorepeat handled on guest side) - return S_IGNORE_REPEATED; - - wParam = RP_PREPROCESSKEY_SET_VKEY(btVirtualKey) | - RP_PREPROCESSKEY_SET_SCANCODE(btScanCode); - if (dwFlags & RPPKIF_EXTENDED0) - wParam |= RP_PREPROCESSKEY_EXTENDED0; - if (dwFlags & RPPKIF_EXTENDED1) - wParam |= RP_PREPROCESSKEY_EXTENDED1; - if (dwFlags & RPPKIF_RAWINPUT) - wParam |= RP_PREPROCESSKEY_RAWINPUT; - if (GetKeyState(VK_CAPITAL) & 0x01) - wParam |= RP_PREPROCESSKEY_CAPS_TOGGLED; - - for (n = 0; n < s_nVKeyFlagsCount; n++) - { - if (GetKeyState(s_VKeyFlags[n].nVKey) & 0x80) - wParam |= (WPARAM)s_VKeyFlags[n].dwFlags; - } - if (!RPSendMessage(RP_IPC_TO_HOST_PREPROCESSKEY, wParam, 0, NULL, 0, pInfo, &lResult)) // ask how we are supposed to handle this event - return E_FAIL; - if (!(lResult & RP_PREPROCESSKEY_OK)) // host does not support RP_IPC_TO_HOST_PREPROCESSKEY (or other type of error - e.g. system not supported) - return S_FALLBACK_HANDLING; - - btProcessedVirtualKey = RP_PREPROCESSKEY_GET_VKEY(lResult); - btProcessedScanCode = RP_PREPROCESSKEY_GET_SCANCODE(lResult); - if (btProcessedVirtualKey == 0) // event consumed by host - return S_IGNORE; - - wParam = RP_PROCESSKEY_KEYDOWN; - lParam = 0; - - if ((lResult & RP_PREPROCESSKEY_CHAR_KEY) && - btProcessedVirtualKey != 0) - { - // just set qualifier state, so that multiple keypresses can be detected - // (e.g. press 'B' while pressing 'A') - memset(btKeyboardState, 0, sizeof(btKeyboardState)); - for (n = 0; n < s_nVKeyFlagsCount; n++) - { - if (lResult & s_VKeyFlags[n].dwFlags) - btKeyboardState[s_VKeyFlags[n].nVKey] |= 0x80; - } - if (lResult & RP_PREPROCESSKEY_CAPS_TOGGLED) - btKeyboardState[VK_CAPITAL] |= 0x01; - - btKeyboardState[btProcessedVirtualKey] = 0x80; - - memset(wcChars, 0, sizeof(wcChars)); - n = pInfo->pfnToUnicode((UINT)btProcessedVirtualKey, btProcessedScanCode, btKeyboardState, wcChars, 2, 0); - lParam = MAKELONG(wcChars[0], wcChars[1]); - if (n < 0) - { - pInfo->pfnToUnicode((UINT)btProcessedVirtualKey, btProcessedScanCode, btKeyboardState, wcChars, 2, 0); // reset ToUnicode() internal flags - n = 3; - } - else if (n > 2) - n = 2; - wParam |= RP_PROCESSKEY_SET_CHARCOUNT(n); - } - wParam |= RP_PROCESSKEY_SET_VKEY(btProcessedVirtualKey) | - RP_PROCESSKEY_SET_SCANCODE(btProcessedScanCode); - if (lResult & RP_PREPROCESSKEY_EXTENDED0) - wParam |= RP_PROCESSKEY_EXTENDED0; - if (lResult & RP_PREPROCESSKEY_EXTENDED1) - wParam |= RP_PROCESSKEY_EXTENDED1; - if (lResult & RP_PREPROCESSKEY_RAWINPUT) - wParam |= RP_PROCESSKEY_RAWINPUT; - - if (!RPSendMessage(RP_IPC_TO_HOST_PROCESSKEY, wParam, lParam, NULL, 0, pInfo, plResult)) - return E_FAIL; - if (!(*plResult & RP_PROCESSKEY_OK)) // host does not support RP_IPC_TO_HOST_PROCESSKEY - return S_FALLBACK_HANDLING; - } - else - { - switch (btVirtualKey) - { - case VK_NOP: - return S_IGNORE; - case VK_LWIN: - if (dwFlags & RPPKIF_DISABLEWIN) - { - if (g_nIgnoreLeftWinUp) - { - g_nIgnoreLeftWinUp -= 1; - return S_IGNORE; - } - g_bLeftWinDown = FALSE; - } - break; - case VK_RWIN: - if (dwFlags & RPPKIF_DISABLEWIN) - { - if (g_nIgnoreRightWinUp) - { - g_nIgnoreRightWinUp -= 1; - return S_IGNORE; - } - g_bRightWinDown = FALSE; - } - break; - } - wParam = RP_PROCESSKEY_SET_VKEY(btVirtualKey) | - RP_PROCESSKEY_SET_SCANCODE(btScanCode); - if (dwFlags & RPPKIF_EXTENDED0) - wParam |= RP_PROCESSKEY_EXTENDED0; - if (dwFlags & RPPKIF_EXTENDED1) - wParam |= RP_PROCESSKEY_EXTENDED1; - if (dwFlags & RPPKIF_RAWINPUT) - wParam |= RP_PROCESSKEY_RAWINPUT; - - if (!RPSendMessage(RP_IPC_TO_HOST_PROCESSKEY, wParam, 0, NULL, 0, pInfo, plResult)) - return E_FAIL; - if (!(*plResult & RP_PROCESSKEY_OK)) // host does not support RP_IPC_TO_HOST_PROCESSKEY - return S_FALLBACK_HANDLING; - if (*plResult == RP_PROCESSKEY_OK) // event consumed by host (e.g. Escape key) or no equivalent key in guest keyboard - return S_IGNORE; - } - return NOERROR; -} diff --git a/od-win32/cloanto/RetroPlatformGuestIPC.h b/od-win32/cloanto/RetroPlatformGuestIPC.h index a1959a83..959b627d 100644 --- a/od-win32/cloanto/RetroPlatformGuestIPC.h +++ b/od-win32/cloanto/RetroPlatformGuestIPC.h @@ -20,7 +20,6 @@ #include typedef LRESULT (CALLBACK *RPGUESTMSGFN)(UINT uMessage, WPARAM wParam, LPARAM lParam, LPCVOID pData, DWORD dwDataSize, LPARAM lMsgFunctionParam); -typedef int (WINAPI *TOUNICODEFN)(UINT wVirtKey, UINT wScanCode, const PBYTE lpKeyState, LPWSTR pwszBuff, int cchBuff, UINT wFlags); // the RPGuestInfo fields should be considered private, // since future implementations of RetroPlatform interprocess communication @@ -37,8 +36,6 @@ typedef struct RPGuestInfo BOOL bGuestClassRegistered; RPGUESTMSGFN pfnMsgFunction; LPARAM lMsgFunctionParam; - HMODULE hUser32; - TOUNICODEFN pfnToUnicode; } RPGUESTINFO; #ifdef __cplusplus @@ -52,21 +49,6 @@ HRESULT RPInitializeGuest(RPGUESTINFO *pInfo, HINSTANCE hInstance, LPCTSTR pszHo void RPUninitializeGuest(RPGUESTINFO *pInfo); BOOL RPSendMessage(UINT uMessage, WPARAM wParam, LPARAM lParam, LPCVOID pData, DWORD dwDataSize, const RPGUESTINFO *pInfo, LRESULT *plResult); BOOL RPPostMessage(UINT uMessage, WPARAM wParam, LPARAM lParam, const RPGUESTINFO *pInfo); -HRESULT RPProcessKeyboardInput(DWORD dwFlags, BYTE btVirtualKey, BYTE btScanCode, const RPGUESTINFO *pInfo, LRESULT *plResult); - -// RPProcessKeyboardInput dwFlags -#define RPPKIF_KEYDOWN (1<<0) // bit set, if WM_KEYDOWN, or if (RAWKEYBOARD.Flags & RI_KEY_BREAK) == 0 -#define RPPKIF_AUTOREPEAT (1<<1) // bit set, if lParam & (1<<30) in a WM_KEYDOWN/WM_KEYUP message -#define RPPKIF_EXTENDED0 (1<<2) // bit set, if lParam & (1<<24) in a WM_KEYDOWN/WM_KEYUP message, or if RAWKEYBOARD.Flags & RI_KEY_E0 -#define RPPKIF_EXTENDED1 (1<<3) // bit set, if RAWKEYBOARD.Flags & RI_KEY_E1 -#define RPPKIF_DISABLEWIN (1<<4) // bit set, if Windows keys need to be disabled (e.g. for WM_KEYDOWN/WM_KEYUP, or non-exclusive DirectInput client) -#define RPPKIF_RAWINPUT (1<<5) // bit set, if DirectInput/rawinput client -#define RPPKIF_MORE (1<<6) // bit set, if additional guest key events must be retrieved for the same keyboard input - -// RPProcessKeyboardInput return codes -#define S_FALLBACK_HANDLING ((HRESULT)1L) -#define S_IGNORE ((HRESULT)2L) -#define S_IGNORE_REPEATED ((HRESULT)3L) #ifdef __cplusplus } // ... extern "C" diff --git a/od-win32/cloanto/RetroPlatformIPC_doc_draft.txt b/od-win32/cloanto/RetroPlatformIPC-doc.txt similarity index 93% rename from od-win32/cloanto/RetroPlatformIPC_doc_draft.txt rename to od-win32/cloanto/RetroPlatformIPC-doc.txt index cc8da81d..5bf406cc 100644 --- a/od-win32/cloanto/RetroPlatformIPC_doc_draft.txt +++ b/od-win32/cloanto/RetroPlatformIPC-doc.txt @@ -9,7 +9,7 @@ : assigned or transferred by contract. Authors : os, mcb Created : 2007-08-23 10:08:25 - Updated : 2016-06-17 15:07:10 + Updated : 2016-12-03 11:15:00 Comment : Reference for RetroPlatformIPC.h (RP Player interprocess communication include file) *****************************************************************************/ @@ -219,7 +219,7 @@ Description: Data sent: WPARAM = device category (RP_DEVICE_* value) and device number combined with the MAKEWORD macro; - e.g. MAKEWORD(RP_DEVICE_FLOPPY, 0); + e.g. MAKEWORD(RP_DEVICECATEGORY_FLOPPY, 0); the RP_ALL_DEVICES define may be used as device number to turn on or off all the activity LEDs for a device category LPARAM = for non-joystick devices, LED status and flags are combined @@ -299,7 +299,13 @@ Description: (see the RP_IPC_TO_GUEST_PAUSE message) must not be notified, unless the guest returned the value 2 as RP_IPC_TO_GUEST_PAUSE response; note: when paused, the guest should release the mouse (if captured); - during pause mode, the mouse should never be captured + during pause mode, the mouse should never be captured; + starting with version 7.1 of the RetroPlatform API, + the host handles every keyboard input/shortcuts, + so the guest is not supposed to enter pause mode based on + its own keyboard shortcuts (e.f. the key): + this notification message is therfore just used + in the RP_IPC_TO_GUEST_PAUSE scenario described above Data sent: WPARAM = non-zero when the guest enters pause mode or zero when the guest exits from pause mode @@ -351,7 +357,7 @@ Description: Data sent: WPARAM = device category (RP_DEVICE_* value) and device number combined with the MAKEWORD macro; - e.g. MAKEWORD(RP_DEVICE_FLOPPY, 0) + e.g. MAKEWORD(RP_DEVICECATEGORY_FLOPPY, 0) LPARAM = current device read/write status flags (RP_DEVICE_READONLY/RP_DEVICE_READWRITE) Response: none @@ -431,7 +437,7 @@ Description: Data sent: WPARAM = device category (RP_DEVICE_* value) and device number combined with the MAKEWORD macro; - e.g. MAKEWORD(RP_DEVICE_FLOPPY, 0) + e.g. MAKEWORD(RP_DEVICECATEGORY_FLOPPY, 0) LPARAM = device-dependant seek position (e.g. drive track position) Response: none @@ -481,13 +487,16 @@ Message: Description: the guest sends this message to notify the host about a change of the guest keyboard layout + (e.g. Amiga SetMap/SetKeyboard) Data sent: - pData = keyboard layout name (null-terminated Unicode string) + pData = platform-dependent keyboard layout data Response: none + + **************************************************************************** Host-to-Guest Messages **************************************************************************** @@ -568,7 +577,7 @@ Description: the host sends a RP_IPC_TO_GUEST_DEVICECONTENT message to load an image file or a peripheral into an emulated device (e.g. an ADF floppy file into a floppy drive, - or a physical or keyboard-emulated joystick into an input port) + or a joystick into an input port) or to unload the currently loaded content from the device Data sent: pData = a RPDEVICECONTENT structure (see RetroPlatformIPC.h); @@ -589,7 +598,7 @@ Description: Data sent: WPARAM = device category (RP_DEVICE_* value) and device number combined with the MAKEWORD macro; - e.g. MAKEWORD(RP_DEVICE_FLOPPY, 0) + e.g. MAKEWORD(RP_DEVICECATEGORY_FLOPPY, 0) LPARAM = current device read/write status flags (RP_DEVICE_READONLY/RP_DEVICE_READWRITE) Response: LRESULT = 1 if the guest successfully executed the command or 0 otherwise (for example, because the image file itself is read-only, so that writing is not possible) @@ -748,3 +757,34 @@ Data sent: none Response: LRESULT = 1 if the guest acknowledged the command or 0 otherwise + + +Message: + RP_IPC_TO_GUEST_DEVICEACTIVITY +Description: + this message is used to tell the guest about a device status change + (e.g. a button pressed or released on a joystick) +Data sent: + WPARAM = device category (RP_DEVICE_* value) and device number + combined with the MAKEWORD macro; + e.g. MAKEWORD(RP_DEVICECATEGORY_INPUTPORT, 1); + the only categories used at the moment are + RP_DEVICECATEGORY_INPUTPORT and RP_DEVICECATEGORY_MULTITAPPORT + LPARAM = if the message references a RP_DEVICECATEGORY_INPUTPORT + or a RP_DEVICECATEGORY_MULTITAPPORT device + in which a joystick/gamepad/joypad is plugged, + then the data sent via LPARAM is a mask of RP_JOYSTICK_* values + reporting all the buttons that are pressed (more than one may be + pressed simultaneously) +Response: + LRESULT = 1 if the guest acknowledged the command or 0 otherwise + + +Message: + RP_IPC_TO_GUEST_SHOWOPTIONS +Description: + this message is used to ask the guest to open its options/settings dialog +Data sent: + none +Response: + LRESULT = 1 if the guest acknowledged the command or 0 otherwise diff --git a/od-win32/cloanto/RetroPlatformIPC.h b/od-win32/cloanto/RetroPlatformIPC.h index d862f352..c0c98585 100644 --- a/od-win32/cloanto/RetroPlatformIPC.h +++ b/od-win32/cloanto/RetroPlatformIPC.h @@ -2,14 +2,14 @@ Name : RetroPlatformIPC.h Project : RetroPlatform Player Support : http://www.retroplatform.com - Legal : Copyright 2007-2015 Cloanto Italia srl - All rights reserved. This + Legal : Copyright 2007-2016 Cloanto Italia srl - All rights reserved. This : file is multi-licensed under the terms of the Mozilla Public License : version 2.0 as published by Mozilla Corporation and the GNU General : Public License, version 2 or later, as published by the Free : Software Foundation. Authors : os, mcb Created : 2007-08-27 13:55:49 - Updated : 2015-09-04 16:43:00 + Updated : 2016-12-03 11:15:00 Comment : RetroPlatform Player interprocess communication include file *****************************************************************************/ @@ -50,7 +50,6 @@ #define RP_IPC_TO_HOST_TURBO (WM_APP + 17) #define RP_IPC_TO_HOST_PING (WM_APP + 18) #define RP_IPC_TO_HOST_VOLUME (WM_APP + 19) -#define RP_IPC_TO_HOST_ESCAPED (WM_APP + 20) #define RP_IPC_TO_HOST_PARENT (WM_APP + 21) #define RP_IPC_TO_HOST_DEVICESEEK (WM_APP + 22) #define RP_IPC_TO_HOST_CLOSE (WM_APP + 23) @@ -58,8 +57,6 @@ #define RP_IPC_TO_HOST_HOSTVERSION (WM_APP + 25) #define RP_IPC_TO_HOST_INPUTDEVICE (WM_APP + 26) // introduced in RetroPlatform API 3.0 #define RP_IPC_TO_HOST_DEVICECONTENT (WM_APP + 27) // extended in RetroPlatform API 3.0 -#define RP_IPC_TO_HOST_PREPROCESSKEY (WM_APP + 28) // introduced in RetroPlatform API 7.1 -#define RP_IPC_TO_HOST_PROCESSKEY (WM_APP + 29) // introduced in RetroPlatform API 7.1 #define RP_IPC_TO_HOST_KEYBOARDLAYOUT (WM_APP + 30) // introduced in RetroPlatform API 7.1 @@ -74,7 +71,6 @@ #define RP_IPC_TO_GUEST_TURBO (WM_APP + 207) #define RP_IPC_TO_GUEST_PING (WM_APP + 208) #define RP_IPC_TO_GUEST_VOLUME (WM_APP + 209) -#define RP_IPC_TO_GUEST_ESCAPEKEY (WM_APP + 210) #define RP_IPC_TO_GUEST_EVENT (WM_APP + 211) #define RP_IPC_TO_GUEST_MOUSECAPTURE (WM_APP + 212) #define RP_IPC_TO_GUEST_SAVESTATE (WM_APP + 213) @@ -85,6 +81,8 @@ #define RP_IPC_TO_GUEST_GUESTAPIVERSION (WM_APP + 218) // introduced in RetroPlatform API 3.0 #define RP_IPC_TO_GUEST_DEVICECONTENT (WM_APP + 219) // extended in RetroPlatform API 3.0 #define RP_IPC_TO_GUEST_SCREENCAPTURE (WM_APP + 220) // extended in RetroPlatform API 3.4 +#define RP_IPC_TO_GUEST_DEVICEACTIVITY (WM_APP + 221) // introduced in RetroPlatform API 7.1 +#define RP_IPC_TO_GUEST_SHOWOPTIONS (WM_APP + 222) // introduced in RetroPlatform API 7.1 // **************************************************************************** // Message Data Structures and Defines @@ -276,47 +274,21 @@ typedef struct RPDeviceContent BYTE btDeviceNumber; // device number (range 0..31), e.g. Amiga floppy drive unit 0, C64 disk unit 8 or 9, etc. DWORD dwInputDevice; // (guest-side) input device type (RP_INPUTDEVICE_MOUSE, RP_INPUTDEVICE_JOYSTICK, etc.); currently set to 0 if not RP_DEVICE_INPUTPORT DWORD dwFlags; // flags (or 0); e.g. see RP_DEVICEFLAGS_MOUSE_ (for "mouse hack"), RP_DEVICEFLAGS_RW_ (for read/write status) - WCHAR szContent[260]; // if RP_DEVICECATEGORY_INPUTPORT, then host device ID, otherwise full path and name of the media image file to load, if file content (not used for input devices, which only use szHostInputID); see comment for format of KeyboardJoystick string; szContent is ignored if btDeviceCategory == RP_DEVICECATEGORY_INPUTPORT and dwInputDevice == RP_INPUTDEVICE_EMPTY + WCHAR szContent[260]; // if RP_DEVICECATEGORY_INPUTPORT (mice only), then host device ID, otherwise full path and name of the media image file to load, if file content (not used for input devices, which only use szHostInputID); szContent is ignored if btDeviceCategory == RP_DEVICECATEGORY_INPUTPORT and dwInputDevice == RP_INPUTDEVICE_EMPTY } RPDEVICECONTENT; -// -// Keyboard layouts for joystick emulation -// -// These are virtual devices enumerated and named by the guest, rather than by the operating system. Any device name set by the guest will do, as long as it is unique and does not contain space characters. Each device is enumerated only once. -// -// In the initial device enumeration (guest to host), the szHostInputID strings are enumerated with names like -// "KeyboardLayout1", "KeyboardLayout2", "KeyboardLayout3" and "KeyboardJoystick" -// -// In dwHostInputType: -// - "KeyboardLayout1", "KeyboardLayout2", "KeyboardLayout3" are flagged -// RP_HOSTINPUT_KEYJOY_MAP1, RP_HOSTINPUT_KEYJOY_MAP2, RP_HOSTINPUT_KEYJOY_MAP3 -// - "KeyboardJoystick" is flagged RP_HOSTINPUT_KEYBOARD -// -// In RP_IPC_TO_GUEST_DEVICECONTENT (host to guest) messages for RP_HOSTINPUT_KEYBOARD, the key code strings are appended to the device string in szContent. Multiple joysticks can be set up in this way. -// -// For example: -// "KeyboardJoystick Left=0x4B Right=0x4D Up=0x48 Down=0x50 Fire=0x4C Autofire=0x38 Fire2=0x52 Rewind=0xB5 Play=0x37 FastForward=0x4A Green=0x47 Yellow=0x49 Red=0x4F Blue=0x51" -// -// The example sets a layout based mostly on the numeric keyboard: -// - 8, 2, 4, 6 for direction, 5 to fire -// - an additional "Fire2" button (as on the X-Arcade), set to the 0 key -// - an additional Autofire button, set to Left Alt -// - additional CD32 Joypad buttons: Rewind, Play, Fast Forward, Green, Yellow, Red, Blue (set to /, *, -, 7, 9, 1, 3) -// -// Full set of button definitions: as in the above example, plus "Fire3" (currently not used) - - // Device Categories -#define RP_DEVICECATEGORY_FLOPPY 0 // floppy disk drive -#define RP_DEVICECATEGORY_HD 1 // hard disk drive -#define RP_DEVICECATEGORY_CD 2 // CD/DVD drive -#define RP_DEVICECATEGORY_NET 3 // network card -#define RP_DEVICECATEGORY_TAPE 4 // cassette tape drive -#define RP_DEVICECATEGORY_CARTRIDGE 5 // expansion cartridge -#define RP_DEVICECATEGORY_INPUTPORT 6 // input port (hosts an INPUTDEVICE: mouse, joystick, joystick emulated via keyboard, etc.) -#define RP_DEVICECATEGORY_KEYBOARD 7 // keyboard -#define RP_DEVICECATEGORY_COUNT 8 // total number of device categories +#define RP_DEVICECATEGORY_FLOPPY 0 // floppy disk drive +#define RP_DEVICECATEGORY_HD 1 // hard disk drive +#define RP_DEVICECATEGORY_CD 2 // CD/DVD drive +#define RP_DEVICECATEGORY_NET 3 // network card +#define RP_DEVICECATEGORY_TAPE 4 // cassette tape drive +#define RP_DEVICECATEGORY_CARTRIDGE 5 // expansion cartridge +#define RP_DEVICECATEGORY_INPUTPORT 6 // input port (hosts an INPUTDEVICE: mouse, joystick, etc.) +#define RP_DEVICECATEGORY_KEYBOARD 7 // keyboard +#define RP_DEVICECATEGORY_MULTITAPPORT 8 // multitap port (e.g. input port on Amiga parallel port joystick adapter) +#define RP_DEVICECATEGORY_COUNT 9 // total number of device categories #define RP_ALL_DEVICES 32 // constant for the RP_IPC_TO_HOST_DEVICEACTIVITY message (to turn on/off all LEDs for a device category) @@ -324,13 +296,13 @@ typedef struct RPDeviceContent // Host Input Device Types (used to enumerate host devices) #define RP_HOSTINPUT_MOUSE 0 // Mouse/trackball (supports relative moves) #define RP_HOSTINPUT_TABLET 1 // Pen tablet (no relative moves, only absolute positions) -#define RP_HOSTINPUT_JOYSTICK 2 // PC joystick, gamepad, trackball, etc. +#define RP_HOSTINPUT_JOYSTICK 2 // [LEGACY] PC joystick, gamepad, trackball, etc. #define RP_HOSTINPUT_KEYJOY_MAP1 3 // [LEGACY] Keyboard Layout 1; Amiga/C64: Keyboard Layout A for WinUAE/VICE (8, 2, 4, 6 on keypad, 0 to fire, etc.) #define RP_HOSTINPUT_KEYJOY_MAP2 4 // [LEGACY] Keyboard Layout 2; Amiga/C64: Keyboard Layout B for WinUAE/VICE (cursor keys, right Control to fire, etc.) #define RP_HOSTINPUT_KEYJOY_MAP3 5 // [LEGACY] Keyboard Layout 3; Amiga/C64: Keyboard Layout C for WinUAE/VICE (W, S, A, D keys, left Alt to fire, etc.) #define RP_HOSTINPUT_ARCADE_LEFT 6 // [LEGACY] Left part of arcade dual joystick input device ("player 1") #define RP_HOSTINPUT_ARCADE_RIGHT 7 // [LEGACY] Right part of arcade dual joystick input device ("player 2") -#define RP_HOSTINPUT_KEYBOARD 8 // Keyboard Layout, using DirectInput keyboard scan codes (e.g. "KeyboardJoystick Left=0x4B Right=0x4D Up=0x48 Down=0x50 Fire=0x4C Autofire=0x38 Fire2=0x52 Rewind=0xB5 Play=0x37 FastForward=0x4A Green=0x47 Yellow=0x49 Red=0x4F Blue=0x51" set in szContent); introduced in RP API 3.3 to replace other keyboard layout modes +#define RP_HOSTINPUT_KEYBOARD 8 // [LEGACY] Keyboard Layout, using DirectInput keyboard scan codes (e.g. "KeyboardJoystick Left=0x4B Right=0x4D Up=0x48 Down=0x50 Fire=0x4C Autofire=0x38 Fire2=0x52 Rewind=0xB5 Play=0x37 FastForward=0x4A Green=0x47 Yellow=0x49 Red=0x4F Blue=0x51" set in szContent); introduced in RP API 3.3 to replace other keyboard layout modes #define RP_HOSTINPUT_END 9 // "End of device enumeration" (dummy device used to terminate an input device set that began with the first input device) #define RP_HOSTINPUT_COUNT 10 // total number of device types @@ -378,7 +350,6 @@ typedef struct RPDeviceContent #define RP_JOYSTICK_BUTTON6 0x00000200 // button 6 - CDTV/CD32 Reverse #define RP_JOYSTICK_BUTTON7 0x00000400 // button 7 - CDTV/CD32 Forward - // Device Read/Write status (used in RP_IPC_TO_HOST_DEVICEREADWRITE, RP_IPC_TO_GUEST_DEVICEREADWRITE; used for device categories RP_DEVICECATEGORY_FLOPPY, RP_DEVICECATEGORY_HD, RP_DEVICECATEGORY_TAPE, RP_DEVICECATEGORY_CARTRIDGE) #define RP_DEVICE_READONLY 0 // the medium is write-protected #define RP_DEVICE_READWRITE 1 // the medium is read/write @@ -393,12 +364,13 @@ typedef struct RPDeviceContent #define RP_RESET_HARD 1 // hard reset // RP_IPC_TO_HOST_MOUSECAPTURE/RP_IPC_TO_GUEST_MOUSECAPTURE -#define RP_MOUSECAPTURE_CAPTURED 0x00000001 -#define RP_MOUSECAPTURE_INTEGRATED 0x00000002 // aka "magic mouse" +#define RP_MOUSECAPTURE_CAPTURED 0x00000001 // "trapped" (host system pointer becomes hidden) +#define RP_MOUSECAPTURE_INTEGRATED 0x00000002 // "force-push to untrap" aka "magic mouse" active // RP_IPC_TO_GUEST_EVENT // -// KEY_RAW_: is a hex keycode that uniquely identifies the raw key on the guest system +// KEY_RAW_DOWN : is a numeric keycode (e.g. 0x4F or 79) that uniquely identifies the raw key on the guest system +// KEY_RAW_UP : is a numeric keycode (e.g. 0x4F or 79) that uniquely identifies the raw key on the guest system // // RP_IPC_TO_HOST_DEVICEACTIVITY @@ -491,45 +463,6 @@ typedef struct RPScreenCapture #define RP_HOSTVERSION_BUILD(ver) ((ver) & 0x3FF) #define RP_MAKE_HOSTVERSION(major,minor,build) ((LPARAM) (((LPARAM)((major) & 0xFFF)<<20) | ((LPARAM)((minor) & 0x3FF)<<10) | ((LPARAM)((build) & 0x3FF)))) -// RP_IPC_TO_HOST_PREPROCESSKEY flags -#define RP_PREPROCESSKEY_SET_VKEY(f) ((f) & 0xFF) -#define RP_PREPROCESSKEY_GET_VKEY(f) ((f) & 0xFF) -#define RP_PREPROCESSKEY_SET_SCANCODE(f) (((f) & 0xFF) << 8) -#define RP_PREPROCESSKEY_GET_SCANCODE(f) (((f) >> 8) & 0xFF) -#define RP_PREPROCESSKEY_EXTENDED0 (1 << 16) -#define RP_PREPROCESSKEY_EXTENDED1 (1 << 17) -#define RP_PREPROCESSKEY_RAWINPUT (1 << 18) -#define RP_PREPROCESSKEY_CAPS_DOWN (1 << 19) -#define RP_PREPROCESSKEY_CAPS_TOGGLED (1 << 20) -#define RP_PREPROCESSKEY_SHIFT_DOWN (1 << 21) -#define RP_PREPROCESSKEY_LSHIFT_DOWN (1 << 22) -#define RP_PREPROCESSKEY_RSHIFT_DOWN (1 << 23) -#define RP_PREPROCESSKEY_ALT_DOWN (1 << 24) -#define RP_PREPROCESSKEY_LALT_DOWN (1 << 25) -#define RP_PREPROCESSKEY_RALT_DOWN (1 << 26) -#define RP_PREPROCESSKEY_CTRL_DOWN (1 << 27) -#define RP_PREPROCESSKEY_LCTRL_DOWN (1 << 28) -#define RP_PREPROCESSKEY_RCTRL_DOWN (1 << 29) -#define RP_PREPROCESSKEY_CHAR_KEY (1 << 30) -#define RP_PREPROCESSKEY_OK (1 << 31) // out flag - -// RP_IPC_TO_HOST_PROCESSKEY flags -#define RP_PROCESSKEY_SET_VKEY(f) ((f) & 0xFF) -#define RP_PROCESSKEY_GET_VKEY(f) ((f) & 0xFF) -#define RP_PROCESSKEY_SET_SCANCODE(f) (((f) & 0xFF) << 8) -#define RP_PROCESSKEY_GET_SCANCODE(f) (((f) >> 8) & 0xFF) -#define RP_PROCESSKEY_EXTENDED0 (1 << 16) -#define RP_PROCESSKEY_EXTENDED1 (1 << 17) -#define RP_PROCESSKEY_RAWINPUT (1 << 18) -#define RP_PROCESSKEY_SET_CHARCOUNT(f) (((f) & 0x03) << 19) -#define RP_PROCESSKEY_GET_CHARCOUNT(f) (((f) >> 19) & 0x03) -#define RP_PROCESSKEY_KEYDOWN (1 << 21) -#define RP_PROCESSKEY_KEYMASK 0xFFFFFF // returned key code mask -#define RP_PROCESSKEY_MORE (1 << 28) // in/out flag -#define RP_PROCESSKEY_PRESSKEY (1 << 29) // out flag -#define RP_PROCESSKEY_RELEASEKEY (1 << 30) // out flag -#define RP_PROCESSKEY_OK (1 << 31) // out flag - // Legacy Compatibility #ifndef RP_NO_LEGACY @@ -596,7 +529,6 @@ typedef struct RPDeviceContent_Legacy #define RPIPCGM_TURBO RP_IPC_TO_HOST_TURBO #define RPIPCGM_PING RP_IPC_TO_HOST_PING #define RPIPCGM_VOLUME RP_IPC_TO_HOST_VOLUME -#define RPIPCGM_ESCAPED RP_IPC_TO_HOST_ESCAPED #define RPIPCGM_PARENT RP_IPC_TO_HOST_PARENT #define RPIPCGM_DEVICESEEK RP_IPC_TO_HOST_DEVICESEEK #define RPIPCGM_CLOSE RP_IPC_TO_HOST_CLOSE @@ -612,7 +544,6 @@ typedef struct RPDeviceContent_Legacy #define RPIPCHM_TURBO RP_IPC_TO_GUEST_TURBO #define RPIPCHM_PING RP_IPC_TO_GUEST_PING #define RPIPCHM_VOLUME RP_IPC_TO_GUEST_VOLUME -#define RPIPCHM_ESCAPEKEY RP_IPC_TO_GUEST_ESCAPEKEY #define RPIPCHM_EVENT RP_IPC_TO_GUEST_EVENT #define RPIPCHM_MOUSECAPTURE RP_IPC_TO_GUEST_MOUSECAPTURE #define RPIPCHM_SAVESTATE RP_IPC_TO_GUEST_SAVESTATE diff --git a/od-win32/dinput.cpp b/od-win32/dinput.cpp index 7a531ecc..183cd3dd 100644 --- a/od-win32/dinput.cpp +++ b/od-win32/dinput.cpp @@ -554,11 +554,6 @@ static int keyhack (int scancode, int pressed, int num) { static byte backslashstate, apostrophstate; -#ifdef RETROPLATFORM - if (rp_checkesc (scancode, pressed, num)) - return -1; -#endif - //check ALT-F4 if (pressed && !di_keycodes[num][DIK_F4] && scancode == DIK_F4) { if (di_keycodes[num][DIK_LALT] && !currprefs.win32_ctrl_F11_is_quit) { @@ -2193,6 +2188,12 @@ static void handle_rawinput_2 (RAWINPUT *raw) PRAWHID hid = &raw->data.hid; HANDLE h = raw->header.hDevice; PCHAR rawdata; + +#ifdef RETROPLATFORM + if (rp_isactive ()) + return; +#endif + if ((rawinput_log & 4) || RAWINPUT_DEBUG) { static uae_u8 *oldbuf; static int oldbufsize; @@ -2546,7 +2547,7 @@ bool is_hid_rawinput(void) { if (no_rawinput) return false; - if (!rawinput_enabled_hid) + if (!rawinput_enabled_hid && !rawinput_enabled_hid_reset) return false; if (!os_vista) return false; @@ -4002,6 +4003,10 @@ static void read_joystick (void) if (IGNOREEVERYTHING) return; +#ifdef RETROPLATFORM + if (rp_isactive ()) + return; +#endif for (i = 0; i < MAX_INPUT_DEVICES; i++) { struct didata *did = &di_joystick[i]; diff --git a/od-win32/rp.cpp b/od-win32/rp.cpp index efe774b1..212792e5 100644 --- a/od-win32/rp.cpp +++ b/od-win32/rp.cpp @@ -32,6 +32,7 @@ #include "drawing.h" #include "resource.h" #include "gui.h" +#include "keyboard.h" #include "rp.h" static int initialized; @@ -104,13 +105,14 @@ static const TCHAR *getmsg (int msg) case RP_IPC_TO_HOST_TURBO: return _T("RP_IPC_TO_HOST_TURBO"); case RP_IPC_TO_HOST_PING: return _T("RP_IPC_TO_HOST_PING"); case RP_IPC_TO_HOST_VOLUME: return _T("RP_IPC_TO_HOST_VOLUME"); - case RP_IPC_TO_HOST_ESCAPED: return _T("RP_IPC_TO_HOST_ESCAPED"); +// case RP_IPC_TO_HOST_ESCAPED: return _T("RP_IPC_TO_HOST_ESCAPED"); case RP_IPC_TO_HOST_PARENT: return _T("RP_IPC_TO_HOST_PARENT"); case RP_IPC_TO_HOST_DEVICESEEK: return _T("RP_IPC_TO_HOST_DEVICESEEK"); case RP_IPC_TO_HOST_CLOSE: return _T("RP_IPC_TO_HOST_CLOSE"); case RP_IPC_TO_HOST_DEVICEREADWRITE: return _T("RP_IPC_TO_HOST_DEVICEREADWRITE"); case RP_IPC_TO_HOST_HOSTVERSION: return _T("RP_IPC_TO_HOST_HOSTVERSION"); case RP_IPC_TO_HOST_INPUTDEVICE: return _T("RP_IPC_TO_HOST_INPUTDEVICE"); + case RP_IPC_TO_HOST_KEYBOARDLAYOUT: return _T("RP_IPC_TO_HOST_KEYBOARDLAYOUT"); case RP_IPC_TO_GUEST_CLOSE: return _T("RP_IPC_TO_GUEST_CLOSE"); case RP_IPC_TO_GUEST_SCREENMODE: return _T("RP_IPC_TO_GUEST_SCREENMODE"); @@ -121,7 +123,7 @@ static const TCHAR *getmsg (int msg) case RP_IPC_TO_GUEST_TURBO: return _T("RP_IPC_TO_GUEST_TURBO"); case RP_IPC_TO_GUEST_PING: return _T("RP_IPC_TO_GUEST_PING"); case RP_IPC_TO_GUEST_VOLUME: return _T("RP_IPC_TO_GUEST_VOLUME"); - case RP_IPC_TO_GUEST_ESCAPEKEY: return _T("RP_IPC_TO_GUEST_ESCAPEKEY"); +// case RP_IPC_TO_GUEST_ESCAPEKEY: return _T("RP_IPC_TO_GUEST_ESCAPEKEY"); case RP_IPC_TO_GUEST_EVENT: return _T("RP_IPC_TO_GUEST_EVENT"); case RP_IPC_TO_GUEST_MOUSECAPTURE: return _T("RP_IPC_TO_GUEST_MOUSECAPTURE"); case RP_IPC_TO_GUEST_SAVESTATE: return _T("RP_IPC_TO_GUEST_SAVESTATE"); @@ -130,6 +132,8 @@ static const TCHAR *getmsg (int msg) case RP_IPC_TO_GUEST_DEVICEREADWRITE: return _T("RP_IPC_TO_GUEST_DEVICEREADWRITE"); case RP_IPC_TO_GUEST_QUERYSCREENMODE: return _T("RP_IPC_TO_GUEST_QUERYSCREENMODE"); case RP_IPC_TO_GUEST_GUESTAPIVERSION : return _T("RP_IPC_TO_GUEST_GUESTAPIVERSION"); + case RP_IPC_TO_GUEST_SHOWOPTIONS: return _T("RP_IPC_TO_GUEST_SHOWOPTIONS"); + case RP_IPC_TO_GUEST_DEVICEACTIVITY: return _T("RP_IPC_TO_GUEST_DEVICEACTIVITY"); default: return _T("UNKNOWN"); } } @@ -142,6 +146,140 @@ static void trimws (TCHAR *s) s[--len] = '\0'; } + +static uae_u32 dactmask[4]; +static uae_u32 dacttype[4]; + +static const int rp0_joystick[] = { + INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_LEFT, + INPUTEVENT_JOY1_DOWN, INPUTEVENT_JOY1_UP, + INPUTEVENT_JOY1_FIRE_BUTTON, + INPUTEVENT_JOY1_2ND_BUTTON, + -1 +}; +static const int rp0_pad[] = { + INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_LEFT, + INPUTEVENT_JOY1_DOWN, INPUTEVENT_JOY1_UP, + INPUTEVENT_JOY1_FIRE_BUTTON, + INPUTEVENT_JOY1_2ND_BUTTON, + INPUTEVENT_JOY1_3RD_BUTTON, + -1 +}; +static const int rp0_cd32[] = { + INPUTEVENT_JOY1_RIGHT, INPUTEVENT_JOY1_LEFT, + INPUTEVENT_JOY1_DOWN, INPUTEVENT_JOY1_UP, + INPUTEVENT_JOY1_CD32_RED, + INPUTEVENT_JOY1_CD32_BLUE, + INPUTEVENT_JOY1_CD32_GREEN, + INPUTEVENT_JOY1_CD32_YELLOW, + INPUTEVENT_JOY1_CD32_PLAY, + INPUTEVENT_JOY1_CD32_RWD, + INPUTEVENT_JOY1_CD32_FFW + -1 +}; +static const int rp1_joystick[] = { + INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_LEFT, + INPUTEVENT_JOY2_DOWN, INPUTEVENT_JOY2_UP, + INPUTEVENT_JOY2_FIRE_BUTTON, + INPUTEVENT_JOY2_2ND_BUTTON, + -1 +}; +static const int rp1_pad[] = { + INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_LEFT, + INPUTEVENT_JOY2_DOWN, INPUTEVENT_JOY2_UP, + INPUTEVENT_JOY2_FIRE_BUTTON, + INPUTEVENT_JOY2_2ND_BUTTON, + INPUTEVENT_JOY2_3RD_BUTTON, + -1 +}; +static const int rp1_cd32[] = { + INPUTEVENT_JOY2_RIGHT, INPUTEVENT_JOY2_LEFT, + INPUTEVENT_JOY2_DOWN, INPUTEVENT_JOY2_UP, + INPUTEVENT_JOY2_CD32_RED, + INPUTEVENT_JOY2_CD32_BLUE, + INPUTEVENT_JOY2_CD32_GREEN, + INPUTEVENT_JOY2_CD32_YELLOW, + INPUTEVENT_JOY2_CD32_PLAY, + INPUTEVENT_JOY2_CD32_RWD, + INPUTEVENT_JOY2_CD32_FFW + -1 +}; +static const int rp2_joystick[] = { + INPUTEVENT_PAR_JOY1_RIGHT, INPUTEVENT_PAR_JOY1_LEFT, + INPUTEVENT_PAR_JOY1_DOWN, INPUTEVENT_PAR_JOY1_UP, + INPUTEVENT_PAR_JOY1_FIRE_BUTTON, + -1 +}; +static const int rp3_joystick[] = { + INPUTEVENT_PAR_JOY2_RIGHT, INPUTEVENT_PAR_JOY2_LEFT, + INPUTEVENT_PAR_JOY2_DOWN, INPUTEVENT_PAR_JOY2_UP, + INPUTEVENT_PAR_JOY2_FIRE_BUTTON, + -1 +}; + +static LRESULT deviceactivity(WPARAM wParam, LPARAM lParam) +{ + int num = LOBYTE(wParam); + int cat = HIBYTE(wParam); + uae_u32 mask = lParam; + if (cat != RP_DEVICECATEGORY_INPUTPORT && cat != RP_DEVICECATEGORY_MULTITAPPORT) + return 0; + if (cat == RP_DEVICECATEGORY_MULTITAPPORT) { + if (num < 0 || num > 1) + return 0; + num += 2; + } else { + if (num < 0 || num > 1) + return 0; + } + if (dactmask[num] == mask) + return 1; + const int *map = NULL; + int type = dacttype[num]; + switch(num) + { + case 0: + if (type == RP_INPUTDEVICE_JOYSTICK) + map = rp0_joystick; + else if (type == RP_INPUTDEVICE_GAMEPAD) + map = rp0_pad; + else if (type == RP_INPUTDEVICE_JOYPAD) + map = rp0_cd32; + break; + case 1: + if (type == RP_INPUTDEVICE_JOYSTICK) + map = rp1_joystick; + else if (type == RP_INPUTDEVICE_GAMEPAD) + map = rp1_pad; + else if (type == RP_INPUTDEVICE_JOYPAD) + map = rp1_cd32; + break; + case 2: + if (type == RP_INPUTDEVICE_JOYSTICK) + map = rp2_joystick; + break; + case 3: + if (type == RP_INPUTDEVICE_JOYSTICK) + map = rp3_joystick; + break; + } + if (!map) + return 0; + for (int i = 0; i < 16; i++) { + uae_u32 mask2 = 1 << i; + if (map[i] < 0) + break; + if ((dactmask[num] ^ mask) & mask2) { + int state = (mask & mask2) ? 1 : 0; + send_input_event(map[i], state, 1, 0); + } + } + dactmask[num] = mask; + return 1; +} + + + static const int inputdevmode[] = { RP_INPUTDEVICE_MOUSE, JSEM_MODE_WHEELMOUSE, RP_INPUTDEVICE_JOYSTICK, JSEM_MODE_JOYSTICK, @@ -372,6 +510,14 @@ static int port_insert (int inputmap_port, int devicetype, DWORD flags, const TC write_log (L"port%d_insert type=%d flags=%d '%s'\n", inputmap_port, devicetype, flags, name); + if (devicetype == RP_INPUTDEVICE_JOYSTICK || devicetype == RP_INPUTDEVICE_GAMEPAD || devicetype == RP_INPUTDEVICE_JOYPAD) { + if (inputmap_port >= 0 && inputmap_port < 4) { + dacttype[inputmap_port] = devicetype; + return 1; + } + return 0; + } + if (inputmap_port < 0 || inputmap_port >= maxjports) return FALSE; @@ -1017,10 +1163,12 @@ static LRESULT CALLBACK RPHostMsgFunction2 (UINT uMessage, WPARAM wParam, LPARAM currprefs.sound_volume_cd = changed_prefs.sound_volume_cd = 100 - wParam; set_volume (currprefs.sound_volume_master, 0); return TRUE; +#if 0 case RP_IPC_TO_GUEST_ESCAPEKEY: rp_rpescapekey = wParam; rp_rpescapeholdtime = lParam; return TRUE; +#endif case RP_IPC_TO_GUEST_MOUSECAPTURE: { if (wParam & RP_MOUSECAPTURE_CAPTURED) @@ -1049,6 +1197,11 @@ static LRESULT CALLBACK RPHostMsgFunction2 (UINT uMessage, WPARAM wParam, LPARAM if (ok) inputdevice_updateconfig (&changed_prefs, &currprefs); break; + case RP_DEVICECATEGORY_MULTITAPPORT: + ok = port_insert (num + 2, dc->dwInputDevice, dc->dwFlags, n); + if (ok) + inputdevice_updateconfig (&changed_prefs, &currprefs); + break; case RP_DEVICECATEGORY_CD: ok = cd_insert (num, n); break; @@ -1179,8 +1332,13 @@ static LRESULT CALLBACK RPHostMsgFunction2 (UINT uMessage, WPARAM wParam, LPARAM } case RP_IPC_TO_GUEST_GUESTAPIVERSION: { - return MAKELONG(3, 4); + return MAKELONG(7, 1); } + case RP_IPC_TO_GUEST_SHOWOPTIONS: + inputdevice_add_inputcode (AKS_ENTERGUI, 1); + return 1; + case RP_IPC_TO_GUEST_DEVICEACTIVITY: + return deviceactivity(wParam, lParam); } return FALSE; } @@ -1232,6 +1390,10 @@ HRESULT rp_init (void) } xfree (rp_param); rp_param = NULL; + for (int i = 0; i < 4; i++) { + dacttype[i] = -1; + dactmask[i] = 0; + } mousecapture = 0; return hr; } @@ -1806,8 +1968,6 @@ static uae_u64 gett (void) void rp_vsync (void) { - uae_u64 t; - if (!initialized) return; if (hwndset_delay > 0) { @@ -1827,6 +1987,8 @@ void rp_vsync (void) } if (magicmouse_alive () != mousemagic) rp_mouse_magic (magicmouse_alive ()); +#if 0 + uae_u64 t; if (!esctime && !releasetime) return; t = gett (); @@ -1840,6 +2002,7 @@ void rp_vsync (void) releasetime = -1; esctime = 0; } +#endif } int rp_checkesc (int scancode, int pressed, int num)