VirtualBox

Changeset 50191 in vbox for trunk/src


Ignore:
Timestamp:
Jan 23, 2014 5:05:30 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91760
Message:

HID LEDs sync for Windows host (checked on Win7 only atm).

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r50142 r50191  
    731731        src/platform/win/VirtualBox.rc \
    732732        src/platform/win/UIDesktopServices_win.cpp \
    733         src/platform/win/VBoxUtils-win.cpp
     733        src/platform/win/VBoxUtils-win.cpp \
     734        src/platform/win/WinKeyboard.cpp
    734735
    735736VirtualBox_DEFS.darwin += VBOX_DARWIN_USE_NATIVE_CONTROLS
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp

    r48647 r50191  
    356356
    357357#if defined(Q_WS_WIN)
     358/** Tell keyboard event handler to skip host keyboard events. Used for HID LEDs sync
     359 * when on Windows host a keyboard event is generated in order to change corresponding LED. */
     360void UIKeyboardHandler::winSkipKeyboardEvents(bool fSkip)
     361{
     362    m_fSkipKeyboardEvents = fSkip;
     363}
    358364
    359365bool UIKeyboardHandler::winEventFilter(MSG *pMsg, ulong uScreenId)
     
    363369     * Returning 'false' means passing event to Qt. */
    364370    bool fResult = false; /* Pass to Qt by default: */
     371
     372    /* Skip this event if m_fSkipKeyboardEvents is set by winSkipKeyboardEvents(). */
     373    if (m_fSkipKeyboardEvents)
     374        return false;
     375
    365376    switch (pMsg->message)
    366377    {
     
    681692    , m_bIsHostkeyInCapture(false)
    682693    , m_iKeyboardHookViewIndex(-1)
     694    , m_fSkipKeyboardEvents(false)
    683695#elif defined(Q_WS_MAC)
    684696    , m_darwinKeyModifiers(0)
     
    12041216         * (NumLock, CapsLock, ScrollLock) as the X server.
    12051217         * If not, send KeyPress events to synchronize the state: */
    1206 #if !defined(Q_WS_MAC)
     1218#if !defined(Q_WS_MAC) && !defined(Q_WS_WIN)
    12071219        if (fFlags & KeyPressed)
    12081220            fixModifierState(pCodes, puCodesCount);
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h

    r47478 r50191  
    8484#if defined(Q_WS_WIN)
    8585    bool winEventFilter(MSG *pMsg, ulong uScreenId);
     86    void winSkipKeyboardEvents(bool fSkip);
    8687#elif defined(Q_WS_X11)
    8788    bool x11EventFilter(XEvent *pEvent, ulong uScreenId);
     
    183184    HHOOK m_keyboardHook;
    184185    int m_iKeyboardHookViewIndex;
     186    /* A flag that used to tell kbd event filter to ignore keyboard events */
     187    bool m_fSkipKeyboardEvents;
    185188#elif defined(Q_WS_MAC)
    186189    /* The current modifier key mask. Used to figure out which modifier
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp

    r50165 r50191  
    8787# include "DarwinKeyboard.h"
    8888#endif
     89#ifdef Q_WS_WIN
     90# include "WinKeyboard.h"
     91#endif
    8992
    9093/* External includes: */
     
    516519        return;
    517520
    518 #ifdef Q_WS_MAC
    519     LogRelFlow(("UIMachineLogic::sltKeyboardLedsChanged: Updating host LED lock states.\n"));
     521#if defined(Q_WS_MAC)
    520522    DarwinHidDevicesBroadcastLeds(m_pHostLedsState, uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
     523#elif defined(Q_WS_WIN)
     524    if (!winHidLedsInSync(uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock()))
     525    {
     526        keyboardHandler()->winSkipKeyboardEvents(true);
     527        WinHidDevicesBroadcastLeds(uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
     528        keyboardHandler()->winSkipKeyboardEvents(false);
     529    }
     530    else
     531        LogRel2(("HID LEDs Sync: already in sync\n"));
     532#else
     533    LogRelFlow(("UIMachineLogic::sltKeyboardLedsChanged: Updating host LED lock states does not supported on this platform.\n"));
    521534#endif
    522535}
     
    604617    , m_pDockPreviewSelectMonitorGroup(0)
    605618    , m_DockIconPreviewMonitor(0)
     619#endif /* Q_WS_MAC */
    606620    , m_pHostLedsState(NULL)
    607 #endif /* Q_WS_MAC */
    608621{
    609622}
     
    23972410        return;
    23982411
    2399 #ifdef Q_WS_MAC
    2400     LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToGuestLeds: keep host LED lock states and broadcast guest's ones.\n"));
     2412#if defined(Q_WS_MAC)
    24012413    if (m_pHostLedsState == NULL)
    24022414        m_pHostLedsState = DarwinHidDevicesKeepLedsState();
    24032415    DarwinHidDevicesBroadcastLeds(m_pHostLedsState, uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
    2404 #endif /* Q_WS_MAC */
     2416#elif defined(Q_WS_WIN)
     2417    if (m_pHostLedsState == NULL)
     2418        m_pHostLedsState = WinHidDevicesKeepLedsState();
     2419    keyboardHandler()->winSkipKeyboardEvents(true);
     2420    WinHidDevicesBroadcastLeds(uisession()->isNumLock(), uisession()->isCapsLock(), uisession()->isScrollLock());
     2421    keyboardHandler()->winSkipKeyboardEvents(false);
     2422#else
     2423    LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToGuestLeds: keep host LED lock states and broadcast guest's ones does not supported on this platform.\n"));
     2424#endif
    24052425}
    24062426
     
    24172437
    24182438    /* Here we have to restore host LED lock states. */
    2419 #ifdef Q_WS_MAC
    2420     LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToPreviousLeds: restore host LED lock states.\n"));
    2421 
    24222439    if (m_pHostLedsState)
    24232440    {
    2424         DarwinHidDevicesApplyAndReleaseLedsState(m_pHostLedsState);
     2441#if defined(Q_WS_MAC)
     2442        DarwinHidDevicesApplyAndReleaseLedsState(m_pHostLedsState);
     2443#elif defined(Q_WS_WIN)
     2444        keyboardHandler()->winSkipKeyboardEvents(true);
     2445        WinHidDevicesApplyAndReleaseLedsState(m_pHostLedsState);
     2446        keyboardHandler()->winSkipKeyboardEvents(false);
     2447#else
     2448        LogRelFlow(("UIMachineLogic::sltSwitchKeyboardLedsToPreviousLeds: restore host LED lock states does not supported on this platform.\n"));
     2449#endif
    24252450        m_pHostLedsState = NULL;
    2426     }
    2427 #endif /* Q_WS_MAC */
     2451        }
    24282452}
    24292453
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h

    r50165 r50191  
    275275    QActionGroup *m_pDockPreviewSelectMonitorGroup;
    276276    int m_DockIconPreviewMonitor;
     277#endif /* Q_WS_MAC */
     278
    277279    void *m_pHostLedsState;
    278 #endif /* Q_WS_MAC */
    279280
    280281    /* Friend classes: */
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