Index: /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp	(revision 79674)
+++ /trunk/src/VBox/Devices/Input/DrvKeyboardQueue.cpp	(revision 79675)
@@ -206,5 +206,5 @@
 
 /**
- * Queues a keyboard event.
+ * Queues a scancode-based keyboard event.
  * Because of the event queueing the EMT context requirement is lifted.
  *
@@ -262,4 +262,34 @@
 
 
+/**
+ * Queues a HID-usage-based keyboard event.
+ * Because of the event queueing the EMT context requirement is lifted.
+ *
+ * @returns VBox status code.
+ * @param   pInterface          Pointer to this interface structure.
+ * @param   u32UsageCode        The HID usage code to queue.
+ * @thread  Any thread.
+ */
+static DECLCALLBACK(int) drvKbdQueuePutEventHid(PPDMIKEYBOARDPORT pInterface, uint32_t u32UsageCode)
+{
+    PDRVKBDQUEUE pDrv = IKEYBOARDPORT_2_DRVKBDQUEUE(pInterface);
+    /* Ignore any attempt to send events if queue is inactive. */
+    if (pDrv->fInactive)
+        return VINF_SUCCESS;
+
+    PDRVKBDQUEUEITEM pItem = (PDRVKBDQUEUEITEM)PDMQueueAlloc(pDrv->pQueue);
+    if (pItem)
+    {
+        pItem->u32UsageCode = u32UsageCode;
+        PDMQueueInsert(pDrv->pQueue, &pItem->Core);
+
+        return VINF_SUCCESS;
+    }
+    if (!pDrv->fSuspended)
+        AssertMsgFailed(("drvKbdQueuePutEventHid: Queue is full!!!!\n"));
+    return VERR_PDM_NO_QUEUE_ITEMS;
+}
+
+
 /* -=-=-=-=- IConnector -=-=-=-=- */
 
@@ -425,4 +455,5 @@
     /* IKeyboardPort. */
     pDrv->IPort.pfnPutEventScan             = drvKbdQueuePutEventScan;
+    pDrv->IPort.pfnPutEventHid              = drvKbdQueuePutEventHid;
 
     /*
