Changeset 59384 in vbox
- Timestamp:
- Jan 18, 2016 5:30:57 PM (9 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/runtime
- Files:
-
- 3 edited
-
UIKeyboardHandler.cpp (modified) (9 diffs)
-
UIMachineView.cpp (modified) (7 diffs)
-
UIMachineView.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
r59377 r59384 268 268 { 269 269 # if QT_VERSION >= 0x050000 270 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);270 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); 271 271 # else /* QT_VERSION < 0x050000 */ 272 272 XGrabKey(QX11Info::display(), AnyKey, AnyModifier, m_windows[uScreenId]->winId(), False, GrabModeAsync, GrabModeAsync); … … 279 279 { 280 280 # if QT_VERSION >= 0x050000 281 xcb_grab_keyboard(QX11Info::connection(), 0, m_ views.value(uScreenId)->viewport()->winId(), XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);281 xcb_grab_keyboard(QX11Info::connection(), 0, m_windows.value(uScreenId)->winId(), XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); 282 282 # else /* QT_VERSION < 0x050000 */ 283 283 /* Keyboard grabbing can fail because of some keyboard shortcut is still grabbed by window manager. … … 367 367 { 368 368 # if QT_VERSION >= 0x050000 369 xcb_ungrab_key(QX11Info::connection(), XCB_GRAB_ANY, m_ views.value(m_iKeyboardCaptureViewIndex)->viewport()->winId(), XCB_MOD_MASK_ANY);369 xcb_ungrab_key(QX11Info::connection(), XCB_GRAB_ANY, m_windows.value(m_iKeyboardCaptureViewIndex)->winId(), XCB_MOD_MASK_ANY); 370 370 # else /* QT_VERSION < 0x050000 */ 371 371 XUngrabKey(QX11Info::display(), AnyKey, AnyModifier, m_windows[m_iKeyboardCaptureViewIndex]->winId()); … … 939 939 bool UIKeyboardHandler::nativeEventFilter(void *pMessage, ulong uScreenId) 940 940 { 941 /* Cast to XCB event: */942 xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage);943 944 941 /* Check if some system event should be filtered out. 945 942 * Returning @c true means filtering-out, 946 943 * Returning @c false means passing event to Qt. */ 947 944 bool fResult = false; /* Pass to Qt by default. */ 945 946 # if defined(Q_WS_MAC) 947 948 # warning "implement me!" 949 950 # elif defined(Q_WS_WIN) 951 952 # warning "implement me!" 953 954 # elif defined(Q_WS_X11) 955 956 /* Cast to XCB event: */ 957 xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage); 958 959 /* Depending on event type: */ 948 960 switch (pEvent->response_type & ~0x80) 949 961 { 950 /* Watch for key board behavior: */962 /* Watch for key-events: */ 951 963 case XCB_KEY_PRESS: 952 964 case XCB_KEY_RELEASE: … … 955 967 xcb_key_press_event_t *pKeyEvent = static_cast<xcb_key_press_event_t*>(pMessage); 956 968 957 /* Translate the keycode to a PC scan code: */958 unsigned scan = handleXKeyEvent(QX11Info::display(), pKeyEvent->detail);959 960 /* Scan codes 0x00 (no valid translation) and 0x80 (extended flag) are ignored: */961 if (!( scan & 0x7F))969 /* Translate the keycode to a PC scan code: */ 970 unsigned uScan = handleXKeyEvent(QX11Info::display(), pKeyEvent->detail); 971 972 /* Scan codes 0x00 (no valid translation) and 0x80 (extended flag) are ignored: */ 973 if (!(uScan & 0x7F)) 962 974 { 963 975 fResult = true; … … 976 988 // } 977 989 978 /* Detect common scancode flags: */979 int flags = 0;980 if ( scan >> 8)981 flags |= KeyExtended;990 /* Calculate flags: */ 991 int iflags = 0; 992 if (uScan >> 8) 993 iflags |= KeyExtended; 982 994 if ((pEvent->response_type & ~0x80) == XCB_KEY_PRESS) 983 flags |= KeyPressed;995 iflags |= KeyPressed; 984 996 985 997 /* Remove the extended flag: */ 986 scan &= 0x7F;987 988 /* Special Korean keys must send scan code 0xF1/0xF2998 uScan &= 0x7F; 999 1000 /* Special Korean keys must send scan code 0xF1/0xF2 989 1001 * when pressed and nothing when released. */ 990 if ( scan == 0x71 || scan == 0x72)1002 if (uScan == 0x71 || uScan == 0x72) 991 1003 { 992 1004 if ((pEvent->response_type & ~0x80) == XCB_KEY_RELEASE) … … 995 1007 break; 996 1008 } 997 /* Re-create the bizarre scan code: */998 scan |= 0x80;1009 /* Re-create the bizarre scan code: */ 1010 uScan |= 0x80; 999 1011 } 1000 1012 … … 1002 1014 KeySym ks = ::wrapXkbKeycodeToKeysym(QX11Info::display(), pKeyEvent->detail, 0, 0); 1003 1015 1004 /* Detect particular scancodeflags: */1016 /* Update special flags: */ 1005 1017 switch (ks) 1006 1018 { 1007 1019 case XK_Print: 1008 flags |= KeyPrint;1020 iflags |= KeyPrint; 1009 1021 break; 1010 1022 case XK_Pause: 1011 if (pKeyEvent->state & ControlMask) 1023 if (pKeyEvent->state & ControlMask) /* Break */ 1012 1024 { 1013 1025 ks = XK_Break; 1014 flags |= KeyExtended;1015 scan = 0x46;1026 iflags |= KeyExtended; 1027 uScan = 0x46; 1016 1028 } 1017 1029 else 1018 flags |= KeyPause;1030 iflags |= KeyPause; 1019 1031 break; 1020 1032 } 1021 1033 1022 /* Handle key-event: */ 1023 fResult = keyEvent(ks, scan, flags, uScreenId); 1034 /* Finally, handle parsed key-event: */ 1035 fResult = keyEvent(ks, uScan, iflags, uScreenId); 1036 1024 1037 break; 1025 1038 } … … 1027 1040 break; 1028 1041 } 1042 1043 # else 1044 1045 # warning "port me!" 1046 1047 # endif 1048 1029 1049 /* Return result: */ 1030 1050 return fResult; -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
r59380 r59384 70 70 71 71 #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */ 72 73 /* Qt includes: */ 74 #ifdef Q_WS_X11 75 # if QT_VERSION >= 0x050000 76 # include <QAbstractNativeEventFilter> 77 # endif /* QT_VERSION >= 0x050000 */ 78 #endif /* Q_WS_X11 */ 72 79 73 80 /* GUI includes: */ … … 121 128 # define DNDDEBUG(x) 122 129 #endif 130 131 132 #ifdef Q_WS_X11 133 # if QT_VERSION >= 0x050000 134 /** QAbstractNativeEventFilter extension 135 * allowing to pre-process native platform events. */ 136 class PrivateEventFilter : public QAbstractNativeEventFilter 137 { 138 public: 139 140 /** Constructor which takes the passed @a pParent to redirect events to. */ 141 PrivateEventFilter(UIMachineView *pParent) 142 : m_pParent(pParent) 143 {} 144 145 /** Handles all native events. */ 146 bool nativeEventFilter(const QByteArray &eventType, void *pMessage, long *pResult) 147 { 148 /* Redirect event to parent: */ 149 return m_pParent->nativeEvent(eventType, pMessage, pResult); 150 } 151 152 private: 153 154 /** Holds the passed parent reference. */ 155 UIMachineView *m_pParent; 156 }; 157 # endif /* QT_VERSION >= 0x050000 */ 158 #endif /* Q_WS_X11 */ 123 159 124 160 … … 215 251 return; 216 252 253 /* Cleanup event-filters: */ 254 pMachineView->cleanupFilters(); 255 217 256 /* Cleanup frame-buffer: */ 218 257 pMachineView->cleanupFrameBuffer(); … … 622 661 , m_fIsDraggingFromGuest(false) 623 662 #endif 663 #ifdef Q_WS_X11 664 # if QT_VERSION >= 0x050000 665 , m_pPrivateEventFilter(0) 666 # endif /* QT_VERSION >= 0x050000 */ 667 #endif /* Q_WS_X11 */ 624 668 { 625 669 } … … 798 842 /* We want to be notified on some parent's events: */ 799 843 machineWindow()->installEventFilter(this); 844 845 #ifdef Q_WS_X11 846 # if QT_VERSION >= 0x050000 847 /* Prepare private event-filter: */ 848 m_pPrivateEventFilter = new PrivateEventFilter(this); 849 qApp->installNativeEventFilter(m_pPrivateEventFilter); 850 # endif /* QT_VERSION >= 0x050000 */ 851 #endif /* Q_WS_X11 */ 800 852 } 801 853 … … 823 875 /* Machine state-change updater: */ 824 876 connect(uisession(), SIGNAL(sigMachineStateChange()), this, SLOT(sltMachineStateChanged())); 877 } 878 879 void UIMachineView::cleanupFilters() 880 { 881 #ifdef Q_WS_X11 882 # if QT_VERSION >= 0x050000 883 /* Cleanup private event-filter: */ 884 qApp->removeNativeEventFilter(m_pPrivateEventFilter); 885 delete m_pPrivateEventFilter; 886 m_pPrivateEventFilter = 0; 887 # endif /* QT_VERSION >= 0x050000 */ 888 #endif /* Q_WS_X11 */ 825 889 } 826 890 … … 1818 1882 1819 1883 # endif /* Q_WS_X11 */ 1820 #endif /* QT_VERSION < 0x050000 */ 1884 #else /* QT_VERSION >= 0x050000 */ 1885 1886 bool UIMachineView::nativeEvent(const QByteArray &eventType, void *pMessage, long *pResult) 1887 { 1888 # if defined(Q_WS_MAC) 1889 1890 # warning "implement me!" 1891 1892 # elif defined(Q_WS_WIN) 1893 1894 # warning "implement me!" 1895 1896 # elif defined(Q_WS_X11) 1897 1898 /* Make sure it's generic XCB event: */ 1899 if (eventType != "xcb_generic_event_t") 1900 return QAbstractScrollArea::nativeEvent(eventType, pMessage, pResult); 1901 xcb_generic_event_t *pEvent = static_cast<xcb_generic_event_t*>(pMessage); 1902 1903 /* Check if some XCB event should be filtered out. 1904 * Returning @c true means filtering-out, 1905 * Returning @c false means passing event to Qt. */ 1906 switch (pEvent->response_type & ~0x80) 1907 { 1908 /* Watch for key-events: */ 1909 case XCB_KEY_PRESS: 1910 case XCB_KEY_RELEASE: 1911 { 1912 /* Delegate key-event handling to the keyboard-handler: */ 1913 return machineLogic()->keyboardHandler()->nativeEventFilter(pMessage, screenId()); 1914 } 1915 default: 1916 break; 1917 } 1918 1919 # else 1920 1921 # warning "port me!" 1922 1923 # endif 1924 1925 /* Filter nothing by default: */ 1926 return false; 1927 } 1928 1929 #endif /* QT_VERSION >= 0x050000 */ 1821 1930 1822 1931 QSize UIMachineView::scaledForward(QSize size) const -
trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
r59380 r59384 60 60 # if QT_VERSION < 0x050000 61 61 typedef union _XEvent XEvent; 62 # endif /* QT_VERSION < 0x050000 */ 62 # else /* QT_VERSION >= 0x050000 */ 63 class PrivateEventFilter; 64 # endif /* QT_VERSION >= 0x050000 */ 63 65 #endif /* Q_WS_X11 */ 64 66 #ifdef VBOX_WITH_DRAG_AND_DROP … … 184 186 //virtual void cleanupConsoleConnections() {} 185 187 //virtual void cleanupConnections() {} 186 //virtual void cleanupFilters() {}188 virtual void cleanupFilters(); 187 189 //virtual void cleanupCommon() {} 188 190 virtual void cleanupFrameBuffer(); … … 365 367 virtual bool x11Event(XEvent *pEvent); 366 368 # endif /* Q_WS_X11 */ 367 #endif /* QT_VERSION < 0x050000 */ 369 #else /* QT_VERSION >= 0x050000 */ 370 /** Qt5: Performs pre-processing of all the native events. 371 * @note Take into account this function is _not_ called by 372 * the Qt itself because it has another signature, 373 * only by the keyboard-hook of the keyboard-handler. */ 374 virtual bool nativeEvent(const QByteArray &eventType, void *pMessage, long *pResult); 375 #endif /* QT_VERSION >= 0x050000 */ 368 376 369 377 /** Scales passed size forward. */ … … 422 430 #endif 423 431 432 #ifdef Q_WS_X11 433 # if QT_VERSION >= 0x050000 434 /** X11: Holds the native event filter instance. */ 435 PrivateEventFilter *m_pPrivateEventFilter; 436 /** X11: Allows the native event filter to 437 * redirect events directly to nativeEvent handler. */ 438 friend class PrivateEventFilter; 439 # endif /* QT_VERSION >= 0x050000 */ 440 #endif /* Q_WS_X11 */ 441 424 442 /* Friend classes: */ 425 443 friend class UIKeyboardHandler;
Note:
See TracChangeset
for help on using the changeset viewer.

