Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp	(revision 59383)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp	(revision 59384)
@@ -268,5 +268,5 @@
             {
 # if QT_VERSION >= 0x050000
-                xcb_grab_key_checked(QX11Info::connection(), 0, m_views.value(uScreenId)->viewport()->winId(), XCB_MOD_MASK_ANY, XCB_GRAB_ANY, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+                xcb_grab_key_checked(QX11Info::connection(), 0, m_windows.value(uScreenId)->winId(), XCB_MOD_MASK_ANY, XCB_GRAB_ANY, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
 # else /* QT_VERSION < 0x050000 */
                 XGrabKey(QX11Info::display(), AnyKey, AnyModifier, m_windows[uScreenId]->winId(), False, GrabModeAsync, GrabModeAsync);
@@ -279,5 +279,5 @@
             {
 # if QT_VERSION >= 0x050000
-                xcb_grab_keyboard(QX11Info::connection(), 0, m_views.value(uScreenId)->viewport()->winId(), XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+                xcb_grab_keyboard(QX11Info::connection(), 0, m_windows.value(uScreenId)->winId(), XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
 # else /* QT_VERSION < 0x050000 */
                 /* Keyboard grabbing can fail because of some keyboard shortcut is still grabbed by window manager.
@@ -367,5 +367,5 @@
             {
 # if QT_VERSION >= 0x050000
-                xcb_ungrab_key(QX11Info::connection(), XCB_GRAB_ANY, m_views.value(m_iKeyboardCaptureViewIndex)->viewport()->winId(), XCB_MOD_MASK_ANY);
+                xcb_ungrab_key(QX11Info::connection(), XCB_GRAB_ANY, m_windows.value(m_iKeyboardCaptureViewIndex)->winId(), XCB_MOD_MASK_ANY);
 # else /* QT_VERSION < 0x050000 */
                 XUngrabKey(QX11Info::display(), AnyKey, AnyModifier, m_windows[m_iKeyboardCaptureViewIndex]->winId());
@@ -939,14 +939,26 @@
 bool UIKeyboardHandler::nativeEventFilter(void *pMessage, ulong uScreenId)
 {
-    /* Cast to XCB event: */
-    xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage);
-
     /* Check if some system event should be filtered out.
      * Returning @c true means filtering-out,
      * Returning @c false means passing event to Qt. */
     bool fResult = false; /* Pass to Qt by default. */
+
+# if defined(Q_WS_MAC)
+
+#  warning "implement me!"
+
+# elif defined(Q_WS_WIN)
+
+#  warning "implement me!"
+
+# elif defined(Q_WS_X11)
+
+    /* Cast to XCB event: */
+    xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage);
+
+    /* Depending on event type: */
     switch (pEvent->response_type & ~0x80)
     {
-        /* Watch for keyboard behavior: */
+        /* Watch for key-events: */
         case XCB_KEY_PRESS:
         case XCB_KEY_RELEASE:
@@ -955,9 +967,9 @@
             xcb_key_press_event_t *pKeyEvent = static_cast<xcb_key_press_event_t*>(pMessage);
 
-            /* Translate the keycode to a PC scancode: */
-            unsigned scan = handleXKeyEvent(QX11Info::display(), pKeyEvent->detail);
-
-            /* Scancodes 0x00 (no valid translation) and 0x80 (extended flag) are ignored: */
-            if (!(scan & 0x7F))
+            /* Translate the keycode to a PC scan code: */
+            unsigned uScan = handleXKeyEvent(QX11Info::display(), pKeyEvent->detail);
+
+            /* Scan codes 0x00 (no valid translation) and 0x80 (extended flag) are ignored: */
+            if (!(uScan & 0x7F))
             {
                 fResult = true;
@@ -976,17 +988,17 @@
 //            }
 
-            /* Detect common scancode flags: */
-            int flags = 0;
-            if (scan >> 8)
-                flags |= KeyExtended;
+            /* Calculate flags: */
+            int iflags = 0;
+            if (uScan >> 8)
+                iflags |= KeyExtended;
             if ((pEvent->response_type & ~0x80) == XCB_KEY_PRESS)
-                flags |= KeyPressed;
+                iflags |= KeyPressed;
 
             /* Remove the extended flag: */
-            scan &= 0x7F;
-
-            /* Special Korean keys must send scancode 0xF1/0xF2
+            uScan &= 0x7F;
+
+            /* Special Korean keys must send scan code 0xF1/0xF2
              * when pressed and nothing when released. */
-            if (scan == 0x71 || scan == 0x72)
+            if (uScan == 0x71 || uScan == 0x72)
             {
                 if ((pEvent->response_type & ~0x80) == XCB_KEY_RELEASE)
@@ -995,6 +1007,6 @@
                     break;
                 }
-                /* Re-create the bizarre scancode: */
-                scan |= 0x80;
+                /* Re-create the bizarre scan code: */
+                uScan |= 0x80;
             }
 
@@ -1002,24 +1014,25 @@
             KeySym ks = ::wrapXkbKeycodeToKeysym(QX11Info::display(), pKeyEvent->detail, 0, 0);
 
-            /* Detect particular scancode flags: */
+            /* Update special flags: */
             switch (ks)
             {
                 case XK_Print:
-                    flags |= KeyPrint;
+                    iflags |= KeyPrint;
                     break;
                 case XK_Pause:
-                    if (pKeyEvent->state & ControlMask)
+                    if (pKeyEvent->state & ControlMask) /* Break */
                     {
                         ks = XK_Break;
-                        flags |= KeyExtended;
-                        scan = 0x46;
+                        iflags |= KeyExtended;
+                        uScan = 0x46;
                     }
                     else
-                        flags |= KeyPause;
+                        iflags |= KeyPause;
                     break;
             }
 
-            /* Handle key-event: */
-            fResult = keyEvent(ks, scan, flags, uScreenId);
+            /* Finally, handle parsed key-event: */
+            fResult = keyEvent(ks, uScan, iflags, uScreenId);
+
             break;
         }
@@ -1027,4 +1040,11 @@
             break;
     }
+
+# else
+
+#  warning "port me!"
+
+# endif
+
     /* Return result: */
     return fResult;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 59383)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp	(revision 59384)
@@ -70,4 +70,11 @@
 
 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+/* Qt includes: */
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+#  include <QAbstractNativeEventFilter>
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
 
 /* GUI includes: */
@@ -121,4 +128,33 @@
 # define DNDDEBUG(x)
 #endif
+
+
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+/** QAbstractNativeEventFilter extension
+  * allowing to pre-process native platform events. */
+class PrivateEventFilter : public QAbstractNativeEventFilter
+{
+public:
+
+    /** Constructor which takes the passed @a pParent to redirect events to. */
+    PrivateEventFilter(UIMachineView *pParent)
+        : m_pParent(pParent)
+    {}
+
+    /** Handles all native events. */
+    bool nativeEventFilter(const QByteArray &eventType, void *pMessage, long *pResult)
+    {
+        /* Redirect event to parent: */
+        return m_pParent->nativeEvent(eventType, pMessage, pResult);
+    }
+
+private:
+
+    /** Holds the passed parent reference. */
+    UIMachineView *m_pParent;
+};
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
 
 
@@ -215,4 +251,7 @@
         return;
 
+    /* Cleanup event-filters: */
+    pMachineView->cleanupFilters();
+
     /* Cleanup frame-buffer: */
     pMachineView->cleanupFrameBuffer();
@@ -622,4 +661,9 @@
     , m_fIsDraggingFromGuest(false)
 #endif
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+    , m_pPrivateEventFilter(0)
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
 {
 }
@@ -798,4 +842,12 @@
     /* We want to be notified on some parent's events: */
     machineWindow()->installEventFilter(this);
+
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+    /* Prepare private event-filter: */
+    m_pPrivateEventFilter = new PrivateEventFilter(this);
+    qApp->installNativeEventFilter(m_pPrivateEventFilter);
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
 }
 
@@ -823,4 +875,16 @@
     /* Machine state-change updater: */
     connect(uisession(), SIGNAL(sigMachineStateChange()), this, SLOT(sltMachineStateChanged()));
+}
+
+void UIMachineView::cleanupFilters()
+{
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+    /* Cleanup private event-filter: */
+    qApp->removeNativeEventFilter(m_pPrivateEventFilter);
+    delete m_pPrivateEventFilter;
+    m_pPrivateEventFilter = 0;
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
 }
 
@@ -1818,5 +1882,50 @@
 
 # endif /* Q_WS_X11 */
-#endif /* QT_VERSION < 0x050000 */
+#else /* QT_VERSION >= 0x050000 */
+
+bool UIMachineView::nativeEvent(const QByteArray &eventType, void *pMessage, long *pResult)
+{
+# if defined(Q_WS_MAC)
+
+#  warning "implement me!"
+
+# elif defined(Q_WS_WIN)
+
+#  warning "implement me!"
+
+# elif defined(Q_WS_X11)
+
+    /* Make sure it's generic XCB event: */
+    if (eventType != "xcb_generic_event_t")
+        return QAbstractScrollArea::nativeEvent(eventType, pMessage, pResult);
+    xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage);
+
+    /* Check if some XCB event should be filtered out.
+     * Returning @c true means filtering-out,
+     * Returning @c false means passing event to Qt. */
+    switch (pEvent->response_type & ~0x80)
+    {
+        /* Watch for key-events: */
+        case XCB_KEY_PRESS:
+        case XCB_KEY_RELEASE:
+        {
+            /* Delegate key-event handling to the keyboard-handler: */
+            return machineLogic()->keyboardHandler()->nativeEventFilter(pMessage, screenId());
+        }
+        default:
+            break;
+    }
+
+# else
+
+#  warning "port me!"
+
+# endif
+
+    /* Filter nothing by default: */
+    return false;
+}
+
+#endif /* QT_VERSION >= 0x050000 */
 
 QSize UIMachineView::scaledForward(QSize size) const
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 59383)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h	(revision 59384)
@@ -60,5 +60,7 @@
 # if QT_VERSION < 0x050000
 typedef union _XEvent XEvent;
-# endif /* QT_VERSION < 0x050000 */
+# else /* QT_VERSION >= 0x050000 */
+class PrivateEventFilter;
+# endif /* QT_VERSION >= 0x050000 */
 #endif /* Q_WS_X11 */
 #ifdef VBOX_WITH_DRAG_AND_DROP
@@ -184,5 +186,5 @@
     //virtual void cleanupConsoleConnections() {}
     //virtual void cleanupConnections() {}
-    //virtual void cleanupFilters() {}
+    virtual void cleanupFilters();
     //virtual void cleanupCommon() {}
     virtual void cleanupFrameBuffer();
@@ -365,5 +367,11 @@
     virtual bool x11Event(XEvent *pEvent);
 # endif /* Q_WS_X11 */
-#endif /* QT_VERSION < 0x050000 */
+#else /* QT_VERSION >= 0x050000 */
+    /** Qt5: Performs pre-processing of all the native events.
+      * @note     Take into account this function is _not_ called by
+      *           the Qt itself because it has another signature,
+      *           only by the keyboard-hook of the keyboard-handler. */
+    virtual bool nativeEvent(const QByteArray &eventType, void *pMessage, long *pResult);
+#endif /* QT_VERSION >= 0x050000 */
 
     /** Scales passed size forward. */
@@ -422,4 +430,14 @@
 #endif
 
+#ifdef Q_WS_X11
+# if QT_VERSION >= 0x050000
+    /** X11: Holds the native event filter instance. */
+    PrivateEventFilter *m_pPrivateEventFilter;
+    /** X11: Allows the native event filter to
+      * redirect events directly to nativeEvent handler. */
+    friend class PrivateEventFilter;
+# endif /* QT_VERSION >= 0x050000 */
+#endif /* Q_WS_X11 */
+
     /* Friend classes: */
     friend class UIKeyboardHandler;
