VirtualBox

Changeset 5782 in vbox


Ignore:
Timestamp:
Nov 16, 2007 8:34:18 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
26179
Message:

Implemented NumLock state synch over VRDP.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vrdpapi.h

    r4702 r5782  
    733733#define VRDP_INPUT_CAD      2
    734734#define VRDP_INPUT_RESET    3
     735#define VRDP_INPUT_SYNCH    4
    735736
    736737typedef struct _VRDPINPUTSCANCODE
     
    751752    unsigned uButtons;
    752753} VRDPINPUTPOINT;
     754
     755#define VRDP_INPUT_SYNCH_SCROLL   0x01
     756#define VRDP_INPUT_SYNCH_NUMLOCK  0x02
     757#define VRDP_INPUT_SYNCH_CAPITAL  0x04
     758
     759typedef struct _VRDPINPUTSYNCH
     760{
     761    unsigned uLockStatus;
     762} VRDPINPUTSYNCH;
    753763#pragma pack()
    754764
  • trunk/src/VBox/Main/ConsoleVRDPServer.cpp

    r5616 r5782  
    9292    STDMETHOD(OnKeyboardLedsChange)(BOOL fNumLock, BOOL fCapsLock, BOOL fScrollLock)
    9393    {
     94        if (m_server)
     95        {
     96            m_server->NotifyKeyboardLedsChange (fNumLock, fCapsLock, fScrollLock);
     97        }
    9498        return S_OK;
    9599    }
     
    863867}
    864868
     869static 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
    865887DECLCALLBACK(void) ConsoleVRDPServer::VRDPCallbackInput (void *pvCallback, int type, const void *pvInput, unsigned cbInput)
    866888{
     
    874896            if (cbInput == sizeof (VRDPINPUTSCANCODE))
    875897            {
     898                IKeyboard *pKeyboard = pConsole->getKeyboard ();
     899
    876900                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);
    878922            }
    879923        } break;
     
    935979        } break;
    936980
     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
    9371011        default:
    9381012            break;
     
    9751049    m_mousey = 0;
    9761050
     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   
    9771062    memset (maFramebuffers, 0, sizeof (maFramebuffers));
    9781063
  • trunk/src/VBox/Main/include/ConsoleVRDPServer.h

    r4404 r5782  
    3333///////////////////////////////////////////////////////////////////////////////
    3434
     35#ifdef VRDP_NO_COM
     36typedef 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
    3551/* Member of Console. Helper class for VRDP server management. Not a COM class. */
    3652class ConsoleVRDPServer
     
    4662        m_fGuestWantsAbsolute = fGuestWantsAbsolute;
    4763    }
    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
    4987    void EnableConnections (void);
    5088    void MousePointerUpdate (const VRDPCOLORPOINTER *pPointer);
     
    145183   
    146184    IConsoleCallback *mConsoleCallback;
     185
     186    VRDPInputSynch m_InputSynch;
    147187#else
    148188    // VRDP API function pointers
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette