Changeset 5782 in vbox
- Timestamp:
- Nov 16, 2007 8:34:18 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 26179
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vrdpapi.h
r4702 r5782 733 733 #define VRDP_INPUT_CAD 2 734 734 #define VRDP_INPUT_RESET 3 735 #define VRDP_INPUT_SYNCH 4 735 736 736 737 typedef struct _VRDPINPUTSCANCODE … … 751 752 unsigned uButtons; 752 753 } VRDPINPUTPOINT; 754 755 #define VRDP_INPUT_SYNCH_SCROLL 0x01 756 #define VRDP_INPUT_SYNCH_NUMLOCK 0x02 757 #define VRDP_INPUT_SYNCH_CAPITAL 0x04 758 759 typedef struct _VRDPINPUTSYNCH 760 { 761 unsigned uLockStatus; 762 } VRDPINPUTSYNCH; 753 763 #pragma pack() 754 764 -
trunk/src/VBox/Main/ConsoleVRDPServer.cpp
r5616 r5782 92 92 STDMETHOD(OnKeyboardLedsChange)(BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock) 93 93 { 94 if (m_server) 95 { 96 m_server->NotifyKeyboardLedsChange (fNumLock, fCapsLock, fScrollLock); 97 } 94 98 return S_OK; 95 99 } … … 863 867 } 864 868 869 static void fixKbdLockStatus (VRDPInputSynch *pInputSynch, IKeyboard *pKeyboard) 870 { 871 if ( pInputSynch->cGuestNumLockAdaptions 872 && (pInputSynch->fGuestNumLock != pInputSynch->fClientNumLock)) 873 { 874 pInputSynch->cGuestNumLockAdaptions--; 875 pKeyboard->PutScancode(0x45); 876 pKeyboard->PutScancode(0x45 | 0x80); 877 } 878 if ( pInputSynch->cGuestCapsLockAdaptions 879 && (pInputSynch->fGuestCapsLock != pInputSynch->fClientCapsLock)) 880 { 881 pInputSynch->cGuestCapsLockAdaptions--; 882 pKeyboard->PutScancode(0x3a); 883 pKeyboard->PutScancode(0x3a | 0x80); 884 } 885 } 886 865 887 DECLCALLBACK(void) ConsoleVRDPServer::VRDPCallbackInput (void *pvCallback, int type, const void *pvInput, unsigned cbInput) 866 888 { … … 874 896 if (cbInput == sizeof (VRDPINPUTSCANCODE)) 875 897 { 898 IKeyboard *pKeyboard = pConsole->getKeyboard (); 899 876 900 const VRDPINPUTSCANCODE *pInputScancode = (VRDPINPUTSCANCODE *)pvInput; 877 pConsole->getKeyboard ()->PutScancode((LONG)pInputScancode->uScancode); 901 902 /* Track lock keys. */ 903 if (pInputScancode->uScancode == 0x45) 904 { 905 server->m_InputSynch.fClientNumLock = !server->m_InputSynch.fClientNumLock; 906 } 907 else if (pInputScancode->uScancode == 0x3a) 908 { 909 server->m_InputSynch.fClientCapsLock = !server->m_InputSynch.fClientCapsLock; 910 } 911 else if (pInputScancode->uScancode == 0x46) 912 { 913 server->m_InputSynch.fClientScrollLock = !server->m_InputSynch.fClientScrollLock; 914 } 915 else if ((pInputScancode->uScancode & 0x80) == 0) 916 { 917 /* Key pressed. */ 918 fixKbdLockStatus (&server->m_InputSynch, pKeyboard); 919 } 920 921 pKeyboard->PutScancode((LONG)pInputScancode->uScancode); 878 922 } 879 923 } break; … … 935 979 } break; 936 980 981 case VRDP_INPUT_SYNCH: 982 { 983 if (cbInput == sizeof (VRDPINPUTSYNCH)) 984 { 985 IKeyboard *pKeyboard = pConsole->getKeyboard (); 986 987 const VRDPINPUTSYNCH *pInputSynch = (VRDPINPUTSYNCH *)pvInput; 988 989 server->m_InputSynch.fClientNumLock = (pInputSynch->uLockStatus & VRDP_INPUT_SYNCH_NUMLOCK) != 0; 990 server->m_InputSynch.fClientCapsLock = (pInputSynch->uLockStatus & VRDP_INPUT_SYNCH_CAPITAL) != 0; 991 server->m_InputSynch.fClientScrollLock = (pInputSynch->uLockStatus & VRDP_INPUT_SYNCH_SCROLL) != 0; 992 993 /* The client initiated synchronization. Always make the guest to reflect the client state. 994 * Than means, when the guest changes the state itself, it is forced to return to the client 995 * state. 996 */ 997 if (server->m_InputSynch.fClientNumLock != server->m_InputSynch.fGuestNumLock) 998 { 999 server->m_InputSynch.cGuestNumLockAdaptions = 2; 1000 } 1001 1002 if (server->m_InputSynch.fClientCapsLock != server->m_InputSynch.fGuestCapsLock) 1003 { 1004 server->m_InputSynch.cGuestCapsLockAdaptions = 2; 1005 } 1006 1007 fixKbdLockStatus (&server->m_InputSynch, pKeyboard); 1008 } 1009 } break; 1010 937 1011 default: 938 1012 break; … … 975 1049 m_mousey = 0; 976 1050 1051 m_InputSynch.cGuestNumLockAdaptions = 2; 1052 m_InputSynch.cGuestCapsLockAdaptions = 2; 1053 1054 m_InputSynch.fGuestNumLock = false; 1055 m_InputSynch.fGuestCapsLock = false; 1056 m_InputSynch.fGuestScrollLock = false; 1057 1058 m_InputSynch.fClientNumLock = false; 1059 m_InputSynch.fClientCapsLock = false; 1060 m_InputSynch.fClientScrollLock = false; 1061 977 1062 memset (maFramebuffers, 0, sizeof (maFramebuffers)); 978 1063 -
trunk/src/VBox/Main/include/ConsoleVRDPServer.h
r4404 r5782 33 33 /////////////////////////////////////////////////////////////////////////////// 34 34 35 #ifdef VRDP_NO_COM 36 typedef struct _VRDPInputSynch 37 { 38 int cGuestNumLockAdaptions; 39 int cGuestCapsLockAdaptions; 40 41 bool fGuestNumLock; 42 bool fGuestCapsLock; 43 bool fGuestScrollLock; 44 45 bool fClientNumLock; 46 bool fClientCapsLock; 47 bool fClientScrollLock; 48 } VRDPInputSynch; 49 #endif /* VRDP_NO_COM */ 50 35 51 /* Member of Console. Helper class for VRDP server management. Not a COM class. */ 36 52 class ConsoleVRDPServer … … 46 62 m_fGuestWantsAbsolute = fGuestWantsAbsolute; 47 63 } 48 64 65 void NotifyKeyboardLedsChange (BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock) 66 { 67 bool fGuestNumLock = (fNumLock != FALSE); 68 bool fGuestCapsLock = (fCapsLock != FALSE); 69 bool fGuestScrollLock = (fScrollLock != FALSE); 70 71 /* Might need to resynch in case the guest itself changed the LED status. */ 72 if (m_InputSynch.fClientNumLock != fGuestNumLock) 73 { 74 m_InputSynch.cGuestNumLockAdaptions = 2; 75 } 76 77 if (m_InputSynch.fClientCapsLock != fGuestCapsLock) 78 { 79 m_InputSynch.cGuestCapsLockAdaptions = 2; 80 } 81 82 m_InputSynch.fGuestNumLock = fGuestNumLock; 83 m_InputSynch.fGuestCapsLock = fGuestCapsLock; 84 m_InputSynch.fGuestScrollLock = fGuestScrollLock; 85 } 86 49 87 void EnableConnections (void); 50 88 void MousePointerUpdate (const VRDPCOLORPOINTER *pPointer); … … 145 183 146 184 IConsoleCallback *mConsoleCallback; 185 186 VRDPInputSynch m_InputSynch; 147 187 #else 148 188 // VRDP API function pointers
Note:
See TracChangeset
for help on using the changeset viewer.