summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-02-26 20:55:01 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-02-26 20:55:01 +0100
commit32da9ae38969c2e4f01968401339433e7909eed8 (patch)
treeafe1b708d2dd22fcda239d8a9808468e3d84d931 /src
parent8a9f77ead179ce88df5113290fa0201872fcd74e (diff)
parentb2d2b655e58d5337765c26dafa836b12e019c6a4 (diff)
Merge remote-tracking branch 'origin/5.11' into dev
Diffstat (limited to 'src')
-rw-r--r--src/corelib/configure.json6
-rw-r--r--src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm7
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp1108
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.h18
5 files changed, 447 insertions, 696 deletions
diff --git a/src/corelib/configure.json b/src/corelib/configure.json
index 9f9512942a..92b2b0b1ad 100644
--- a/src/corelib/configure.json
+++ b/src/corelib/configure.json
@@ -130,7 +130,11 @@
"label": "dlopen()",
"test": {
"include": "dlfcn.h",
- "main": "dlopen(0, 0);"
+ "main": [
+ "dlclose(dlopen(0, 0));",
+ "dlsym(RTLD_DEFAULT, 0);",
+ "dlerror();"
+ ]
},
"sources": [
"",
diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
index 0b1e186bce..d3aafa3785 100644
--- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
+++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.mm
@@ -84,6 +84,8 @@
#include "qt_mac_p.h"
#include "qcocoahelpers.h"
+#include "qcocoaintegration.h"
+#include "qcocoascreen.h"
#include <QtGui/private/qcoregraphics_p.h>
#import <AppKit/AppKit.h>
@@ -383,9 +385,8 @@ QT_END_NAMESPACE
- (QRectF)geometry {
if (NSWindow *window = [[item view] window]) {
- NSRect screenRect = [[window screen] frame];
- NSRect windowRect = [window frame];
- return QRectF(windowRect.origin.x, screenRect.size.height-windowRect.origin.y-windowRect.size.height, windowRect.size.width, windowRect.size.height);
+ if (QCocoaScreen *screen = QCocoaIntegration::instance()->screenForNSScreen([window screen]))
+ return screen->mapFromNative([window frame]);
}
return QRectF();
}
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 1e3bb69069..7d213320a4 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -1132,7 +1132,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
m_keyboard->updateXKBStateFromCore(((xcb_key_release_event_t *)event)->state);
HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent);
case XCB_MAPPING_NOTIFY:
- m_keyboard->handleMappingNotifyEvent(reinterpret_cast<xcb_mapping_notify_event_t *>(event));
+ m_keyboard->updateKeymap(reinterpret_cast<xcb_mapping_notify_event_t *>(event));
break;
case XCB_SELECTION_REQUEST:
{
@@ -1220,7 +1220,7 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
handled = true;
break;
case XCB_XKB_MAP_NOTIFY:
- m_keyboard->handleMappingNotifyEvent(&xkb_event->map_notify);
+ m_keyboard->updateKeymap();
handled = true;
break;
case XCB_XKB_NEW_KEYBOARD_NOTIFY: {
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index d00d69586a..e4551b0139 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -50,622 +50,354 @@
#include <private/qguiapplication_p.h>
-#include <X11/keysym.h>
+#include <xkbcommon/xkbcommon-keysyms.h>
#if QT_CONFIG(xinput2)
#include <X11/extensions/XI2proto.h>
#undef KeyPress
#undef KeyRelease
#endif
-
-#ifndef XK_ISO_Left_Tab
-#define XK_ISO_Left_Tab 0xFE20
-#endif
-
-#ifndef XK_dead_a
-#define XK_dead_a 0xFE80
-#endif
-
-#ifndef XK_dead_A
-#define XK_dead_A 0xFE81
-#endif
-
-#ifndef XK_dead_e
-#define XK_dead_e 0xFE82
-#endif
-
-#ifndef XK_dead_E
-#define XK_dead_E 0xFE83
-#endif
-
-#ifndef XK_dead_i
-#define XK_dead_i 0xFE84
-#endif
-
-#ifndef XK_dead_I
-#define XK_dead_I 0xFE85
-#endif
-
-#ifndef XK_dead_o
-#define XK_dead_o 0xFE86
-#endif
-
-#ifndef XK_dead_O
-#define XK_dead_O 0xFE87
-#endif
-
-#ifndef XK_dead_u
-#define XK_dead_u 0xFE88
-#endif
-
-#ifndef XK_dead_U
-#define XK_dead_U 0xFE89
-#endif
-
-#ifndef XK_dead_small_schwa
-#define XK_dead_small_schwa 0xFE8A
-#endif
-
-#ifndef XK_dead_capital_schwa
-#define XK_dead_capital_schwa 0xFE8B
-#endif
-
-#ifndef XK_dead_greek
-#define XK_dead_greek 0xFE8C
-#endif
-
-#ifndef XK_dead_lowline
-#define XK_dead_lowline 0xFE90
-#endif
-
-#ifndef XK_dead_aboveverticalline
-#define XK_dead_aboveverticalline 0xFE91
-#endif
-
-#ifndef XK_dead_belowverticalline
-#define XK_dead_belowverticalline 0xFE92
-#endif
-
-#ifndef XK_dead_longsolidusoverlay
-#define XK_dead_longsolidusoverlay 0xFE93
-#endif
-
-
-#ifndef XK_Codeinput
-#define XK_Codeinput 0xFF37
-#endif
-
-#ifndef XK_Kanji_Bangou
-#define XK_Kanji_Bangou 0xFF37 /* same as codeinput */
-#endif
-
-// Fix old X libraries
-#ifndef XK_KP_Home
-#define XK_KP_Home 0xFF95
-#endif
-#ifndef XK_KP_Left
-#define XK_KP_Left 0xFF96
-#endif
-#ifndef XK_KP_Up
-#define XK_KP_Up 0xFF97
-#endif
-#ifndef XK_KP_Right
-#define XK_KP_Right 0xFF98
-#endif
-#ifndef XK_KP_Down
-#define XK_KP_Down 0xFF99
-#endif
-#ifndef XK_KP_Prior
-#define XK_KP_Prior 0xFF9A
-#endif
-#ifndef XK_KP_Next
-#define XK_KP_Next 0xFF9B
-#endif
-#ifndef XK_KP_End
-#define XK_KP_End 0xFF9C
-#endif
-#ifndef XK_KP_Insert
-#define XK_KP_Insert 0xFF9E
-#endif
-#ifndef XK_KP_Delete
-#define XK_KP_Delete 0xFF9F
-#endif
-
-// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special
-// multimedia keys. They are included here as not every system has them.
-#define XF86XK_MonBrightnessUp 0x1008FF02
-#define XF86XK_MonBrightnessDown 0x1008FF03
-#define XF86XK_KbdLightOnOff 0x1008FF04
-#define XF86XK_KbdBrightnessUp 0x1008FF05
-#define XF86XK_KbdBrightnessDown 0x1008FF06
-#define XF86XK_Standby 0x1008FF10
-#define XF86XK_AudioLowerVolume 0x1008FF11
-#define XF86XK_AudioMute 0x1008FF12
-#define XF86XK_AudioRaiseVolume 0x1008FF13
-#define XF86XK_AudioPlay 0x1008FF14
-#define XF86XK_AudioStop 0x1008FF15
-#define XF86XK_AudioPrev 0x1008FF16
-#define XF86XK_AudioNext 0x1008FF17
-#define XF86XK_HomePage 0x1008FF18
-#define XF86XK_Mail 0x1008FF19
-#define XF86XK_Start 0x1008FF1A
-#define XF86XK_Search 0x1008FF1B
-#define XF86XK_AudioRecord 0x1008FF1C
-#define XF86XK_Calculator 0x1008FF1D
-#define XF86XK_Memo 0x1008FF1E
-#define XF86XK_ToDoList 0x1008FF1F
-#define XF86XK_Calendar 0x1008FF20
-#define XF86XK_PowerDown 0x1008FF21
-#define XF86XK_ContrastAdjust 0x1008FF22
-#define XF86XK_Back 0x1008FF26
-#define XF86XK_Forward 0x1008FF27
-#define XF86XK_Stop 0x1008FF28
-#define XF86XK_Refresh 0x1008FF29
-#define XF86XK_PowerOff 0x1008FF2A
-#define XF86XK_WakeUp 0x1008FF2B
-#define XF86XK_Eject 0x1008FF2C
-#define XF86XK_ScreenSaver 0x1008FF2D
-#define XF86XK_WWW 0x1008FF2E
-#define XF86XK_Sleep 0x1008FF2F
-#define XF86XK_Favorites 0x1008FF30
-#define XF86XK_AudioPause 0x1008FF31
-#define XF86XK_AudioMedia 0x1008FF32
-#define XF86XK_MyComputer 0x1008FF33
-#define XF86XK_LightBulb 0x1008FF35
-#define XF86XK_Shop 0x1008FF36
-#define XF86XK_History 0x1008FF37
-#define XF86XK_OpenURL 0x1008FF38
-#define XF86XK_AddFavorite 0x1008FF39
-#define XF86XK_HotLinks 0x1008FF3A
-#define XF86XK_BrightnessAdjust 0x1008FF3B
-#define XF86XK_Finance 0x1008FF3C
-#define XF86XK_Community 0x1008FF3D
-#define XF86XK_AudioRewind 0x1008FF3E
-#define XF86XK_BackForward 0x1008FF3F
-#define XF86XK_Launch0 0x1008FF40
-#define XF86XK_Launch1 0x1008FF41
-#define XF86XK_Launch2 0x1008FF42
-#define XF86XK_Launch3 0x1008FF43
-#define XF86XK_Launch4 0x1008FF44
-#define XF86XK_Launch5 0x1008FF45
-#define XF86XK_Launch6 0x1008FF46
-#define XF86XK_Launch7 0x1008FF47
-#define XF86XK_Launch8 0x1008FF48
-#define XF86XK_Launch9 0x1008FF49
-#define XF86XK_LaunchA 0x1008FF4A
-#define XF86XK_LaunchB 0x1008FF4B
-#define XF86XK_LaunchC 0x1008FF4C
-#define XF86XK_LaunchD 0x1008FF4D
-#define XF86XK_LaunchE 0x1008FF4E
-#define XF86XK_LaunchF 0x1008FF4F
-#define XF86XK_ApplicationLeft 0x1008FF50
-#define XF86XK_ApplicationRight 0x1008FF51
-#define XF86XK_Book 0x1008FF52
-#define XF86XK_CD 0x1008FF53
-#define XF86XK_Calculater 0x1008FF54
-#define XF86XK_Clear 0x1008FF55
-#define XF86XK_ClearGrab 0x1008FE21
-#define XF86XK_Close 0x1008FF56
-#define XF86XK_Copy 0x1008FF57
-#define XF86XK_Cut 0x1008FF58
-#define XF86XK_Display 0x1008FF59
-#define XF86XK_DOS 0x1008FF5A
-#define XF86XK_Documents 0x1008FF5B
-#define XF86XK_Excel 0x1008FF5C
-#define XF86XK_Explorer 0x1008FF5D
-#define XF86XK_Game 0x1008FF5E
-#define XF86XK_Go 0x1008FF5F
-#define XF86XK_iTouch 0x1008FF60
-#define XF86XK_LogOff 0x1008FF61
-#define XF86XK_Market 0x1008FF62
-#define XF86XK_Meeting 0x1008FF63
-#define XF86XK_MenuKB 0x1008FF65
-#define XF86XK_MenuPB 0x1008FF66
-#define XF86XK_MySites 0x1008FF67
-#define XF86XK_New 0x1008FF68
-#define XF86XK_News 0x1008FF69
-#define XF86XK_OfficeHome 0x1008FF6A
-#define XF86XK_Open 0x1008FF6B
-#define XF86XK_Option 0x1008FF6C
-#define XF86XK_Paste 0x1008FF6D
-#define XF86XK_Phone 0x1008FF6E
-#define XF86XK_Reply 0x1008FF72
-#define XF86XK_Reload 0x1008FF73
-#define XF86XK_RotateWindows 0x1008FF74
-#define XF86XK_RotationPB 0x1008FF75
-#define XF86XK_RotationKB 0x1008FF76
-#define XF86XK_Save 0x1008FF77
-#define XF86XK_Send 0x1008FF7B
-#define XF86XK_Spell 0x1008FF7C
-#define XF86XK_SplitScreen 0x1008FF7D
-#define XF86XK_Support 0x1008FF7E
-#define XF86XK_TaskPane 0x1008FF7F
-#define XF86XK_Terminal 0x1008FF80
-#define XF86XK_Tools 0x1008FF81
-#define XF86XK_Travel 0x1008FF82
-#define XF86XK_Video 0x1008FF87
-#define XF86XK_Word 0x1008FF89
-#define XF86XK_Xfer 0x1008FF8A
-#define XF86XK_ZoomIn 0x1008FF8B
-#define XF86XK_ZoomOut 0x1008FF8C
-#define XF86XK_Away 0x1008FF8D
-#define XF86XK_Messenger 0x1008FF8E
-#define XF86XK_WebCam 0x1008FF8F
-#define XF86XK_MailForward 0x1008FF90
-#define XF86XK_Pictures 0x1008FF91
-#define XF86XK_Music 0x1008FF92
-#define XF86XK_Battery 0x1008FF93
-#define XF86XK_Bluetooth 0x1008FF94
-#define XF86XK_WLAN 0x1008FF95
-#define XF86XK_UWB 0x1008FF96
-#define XF86XK_AudioForward 0x1008FF97
-#define XF86XK_AudioRepeat 0x1008FF98
-#define XF86XK_AudioRandomPlay 0x1008FF99
-#define XF86XK_Subtitle 0x1008FF9A
-#define XF86XK_AudioCycleTrack 0x1008FF9B
-#define XF86XK_Time 0x1008FF9F
-#define XF86XK_Select 0x1008FFA0
-#define XF86XK_View 0x1008FFA1
-#define XF86XK_TopMenu 0x1008FFA2
-#define XF86XK_Red 0x1008FFA3
-#define XF86XK_Green 0x1008FFA4
-#define XF86XK_Yellow 0x1008FFA5
-#define XF86XK_Blue 0x1008FFA6
-#define XF86XK_Suspend 0x1008FFA7
-#define XF86XK_Hibernate 0x1008FFA8
-#define XF86XK_TouchpadToggle 0x1008FFA9
-#define XF86XK_TouchpadOn 0x1008FFB0
-#define XF86XK_TouchpadOff 0x1008FFB1
-#define XF86XK_AudioMicMute 0x1008FFB2
-
-
-// end of XF86keysyms.h
-
QT_BEGIN_NAMESPACE
-// keyboard mapping table
static const unsigned int KeyTbl[] = {
-
// misc keys
- XK_Escape, Qt::Key_Escape,
- XK_Tab, Qt::Key_Tab,
- XK_ISO_Left_Tab, Qt::Key_Backtab,
- XK_BackSpace, Qt::Key_Backspace,
- XK_Return, Qt::Key_Return,
- XK_Insert, Qt::Key_Insert,
- XK_Delete, Qt::Key_Delete,
- XK_Clear, Qt::Key_Delete,
- XK_Pause, Qt::Key_Pause,
- XK_Print, Qt::Key_Print,
+ XKB_KEY_Escape, Qt::Key_Escape,
+ XKB_KEY_Tab, Qt::Key_Tab,
+ XKB_KEY_ISO_Left_Tab, Qt::Key_Backtab,
+ XKB_KEY_BackSpace, Qt::Key_Backspace,
+ XKB_KEY_Return, Qt::Key_Return,
+ XKB_KEY_Insert, Qt::Key_Insert,
+ XKB_KEY_Delete, Qt::Key_Delete,
+ XKB_KEY_Clear, Qt::Key_Delete,
+ XKB_KEY_Pause, Qt::Key_Pause,
+ XKB_KEY_Print, Qt::Key_Print,
0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq
0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq
// cursor movement
- XK_Home, Qt::Key_Home,
- XK_End, Qt::Key_End,
- XK_Left, Qt::Key_Left,
- XK_Up, Qt::Key_Up,
- XK_Right, Qt::Key_Right,
- XK_Down, Qt::Key_Down,
- XK_Prior, Qt::Key_PageUp,
- XK_Next, Qt::Key_PageDown,
+ XKB_KEY_Home, Qt::Key_Home,
+ XKB_KEY_End, Qt::Key_End,
+ XKB_KEY_Left, Qt::Key_Left,
+ XKB_KEY_Up, Qt::Key_Up,
+ XKB_KEY_Right, Qt::Key_Right,
+ XKB_KEY_Down, Qt::Key_Down,
+ XKB_KEY_Prior, Qt::Key_PageUp,
+ XKB_KEY_Next, Qt::Key_PageDown,
// modifiers
- XK_Shift_L, Qt::Key_Shift,
- XK_Shift_R, Qt::Key_Shift,
- XK_Shift_Lock, Qt::Key_Shift,
- XK_Control_L, Qt::Key_Control,
- XK_Control_R, Qt::Key_Control,
- XK_Meta_L, Qt::Key_Meta,
- XK_Meta_R, Qt::Key_Meta,
- XK_Alt_L, Qt::Key_Alt,
- XK_Alt_R, Qt::Key_Alt,
- XK_Caps_Lock, Qt::Key_CapsLock,
- XK_Num_Lock, Qt::Key_NumLock,
- XK_Scroll_Lock, Qt::Key_ScrollLock,
- XK_Super_L, Qt::Key_Super_L,
- XK_Super_R, Qt::Key_Super_R,
- XK_Menu, Qt::Key_Menu,
- XK_Hyper_L, Qt::Key_Hyper_L,
- XK_Hyper_R, Qt::Key_Hyper_R,
- XK_Help, Qt::Key_Help,
+ XKB_KEY_Shift_L, Qt::Key_Shift,
+ XKB_KEY_Shift_R, Qt::Key_Shift,
+ XKB_KEY_Shift_Lock, Qt::Key_Shift,
+ XKB_KEY_Control_L, Qt::Key_Control,
+ XKB_KEY_Control_R, Qt::Key_Control,
+ XKB_KEY_Meta_L, Qt::Key_Meta,
+ XKB_KEY_Meta_R, Qt::Key_Meta,
+ XKB_KEY_Alt_L, Qt::Key_Alt,
+ XKB_KEY_Alt_R, Qt::Key_Alt,
+ XKB_KEY_Caps_Lock, Qt::Key_CapsLock,
+ XKB_KEY_Num_Lock, Qt::Key_NumLock,
+ XKB_KEY_Scroll_Lock, Qt::Key_ScrollLock,
+ XKB_KEY_Super_L, Qt::Key_Super_L,
+ XKB_KEY_Super_R, Qt::Key_Super_R,
+ XKB_KEY_Menu, Qt::Key_Menu,
+ XKB_KEY_Hyper_L, Qt::Key_Hyper_L,
+ XKB_KEY_Hyper_R, Qt::Key_Hyper_R,
+ XKB_KEY_Help, Qt::Key_Help,
0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab
0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11)
0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12)
// numeric and function keypad keys
- XK_KP_Space, Qt::Key_Space,
- XK_KP_Tab, Qt::Key_Tab,
- XK_KP_Enter, Qt::Key_Enter,
- //XK_KP_F1, Qt::Key_F1,
- //XK_KP_F2, Qt::Key_F2,
- //XK_KP_F3, Qt::Key_F3,
- //XK_KP_F4, Qt::Key_F4,
- XK_KP_Home, Qt::Key_Home,
- XK_KP_Left, Qt::Key_Left,
- XK_KP_Up, Qt::Key_Up,
- XK_KP_Right, Qt::Key_Right,
- XK_KP_Down, Qt::Key_Down,
- XK_KP_Prior, Qt::Key_PageUp,
- XK_KP_Next, Qt::Key_PageDown,
- XK_KP_End, Qt::Key_End,
- XK_KP_Begin, Qt::Key_Clear,
- XK_KP_Insert, Qt::Key_Insert,
- XK_KP_Delete, Qt::Key_Delete,
- XK_KP_Equal, Qt::Key_Equal,
- XK_KP_Multiply, Qt::Key_Asterisk,
- XK_KP_Add, Qt::Key_Plus,
- XK_KP_Separator, Qt::Key_Comma,
- XK_KP_Subtract, Qt::Key_Minus,
- XK_KP_Decimal, Qt::Key_Period,
- XK_KP_Divide, Qt::Key_Slash,
+ XKB_KEY_KP_Space, Qt::Key_Space,
+ XKB_KEY_KP_Tab, Qt::Key_Tab,
+ XKB_KEY_KP_Enter, Qt::Key_Enter,
+ //XKB_KEY_KP_F1, Qt::Key_F1,
+ //XKB_KEY_KP_F2, Qt::Key_F2,
+ //XKB_KEY_KP_F3, Qt::Key_F3,
+ //XKB_KEY_KP_F4, Qt::Key_F4,
+ XKB_KEY_KP_Home, Qt::Key_Home,
+ XKB_KEY_KP_Left, Qt::Key_Left,
+ XKB_KEY_KP_Up, Qt::Key_Up,
+ XKB_KEY_KP_Right, Qt::Key_Right,
+ XKB_KEY_KP_Down, Qt::Key_Down,
+ XKB_KEY_KP_Prior, Qt::Key_PageUp,
+ XKB_KEY_KP_Next, Qt::Key_PageDown,
+ XKB_KEY_KP_End, Qt::Key_End,
+ XKB_KEY_KP_Begin, Qt::Key_Clear,
+ XKB_KEY_KP_Insert, Qt::Key_Insert,
+ XKB_KEY_KP_Delete, Qt::Key_Delete,
+ XKB_KEY_KP_Equal, Qt::Key_Equal,
+ XKB_KEY_KP_Multiply, Qt::Key_Asterisk,
+ XKB_KEY_KP_Add, Qt::Key_Plus,
+ XKB_KEY_KP_Separator, Qt::Key_Comma,
+ XKB_KEY_KP_Subtract, Qt::Key_Minus,
+ XKB_KEY_KP_Decimal, Qt::Key_Period,
+ XKB_KEY_KP_Divide, Qt::Key_Slash,
// International input method support keys
// International & multi-key character composition
- XK_ISO_Level3_Shift, Qt::Key_AltGr,
- XK_Multi_key, Qt::Key_Multi_key,
- XK_Codeinput, Qt::Key_Codeinput,
- XK_SingleCandidate, Qt::Key_SingleCandidate,
- XK_MultipleCandidate, Qt::Key_MultipleCandidate,
- XK_PreviousCandidate, Qt::Key_PreviousCandidate,
+ XKB_KEY_ISO_Level3_Shift, Qt::Key_AltGr,
+ XKB_KEY_Multi_key, Qt::Key_Multi_key,
+ XKB_KEY_Codeinput, Qt::Key_Codeinput,
+ XKB_KEY_SingleCandidate, Qt::Key_SingleCandidate,
+ XKB_KEY_MultipleCandidate, Qt::Key_MultipleCandidate,
+ XKB_KEY_PreviousCandidate, Qt::Key_PreviousCandidate,
// Misc Functions
- XK_Mode_switch, Qt::Key_Mode_switch,
- XK_script_switch, Qt::Key_Mode_switch,
+ XKB_KEY_Mode_switch, Qt::Key_Mode_switch,
+ XKB_KEY_script_switch, Qt::Key_Mode_switch,
// Japanese keyboard support
- XK_Kanji, Qt::Key_Kanji,
- XK_Muhenkan, Qt::Key_Muhenkan,
- //XK_Henkan_Mode, Qt::Key_Henkan_Mode,
- XK_Henkan_Mode, Qt::Key_Henkan,
- XK_Henkan, Qt::Key_Henkan,
- XK_Romaji, Qt::Key_Romaji,
- XK_Hiragana, Qt::Key_Hiragana,
- XK_Katakana, Qt::Key_Katakana,
- XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
- XK_Zenkaku, Qt::Key_Zenkaku,
- XK_Hankaku, Qt::Key_Hankaku,
- XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
- XK_Touroku, Qt::Key_Touroku,
- XK_Massyo, Qt::Key_Massyo,
- XK_Kana_Lock, Qt::Key_Kana_Lock,
- XK_Kana_Shift, Qt::Key_Kana_Shift,
- XK_Eisu_Shift, Qt::Key_Eisu_Shift,
- XK_Eisu_toggle, Qt::Key_Eisu_toggle,
- //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou,
- //XK_Zen_Koho, Qt::Key_Zen_Koho,
- //XK_Mae_Koho, Qt::Key_Mae_Koho,
- XK_Kanji_Bangou, Qt::Key_Codeinput,
- XK_Zen_Koho, Qt::Key_MultipleCandidate,
- XK_Mae_Koho, Qt::Key_PreviousCandidate,
-
-#ifdef XK_KOREAN
+ XKB_KEY_Kanji, Qt::Key_Kanji,
+ XKB_KEY_Muhenkan, Qt::Key_Muhenkan,
+ //XKB_KEY_Henkan_Mode, Qt::Key_Henkan_Mode,
+ XKB_KEY_Henkan_Mode, Qt::Key_Henkan,
+ XKB_KEY_Henkan, Qt::Key_Henkan,
+ XKB_KEY_Romaji, Qt::Key_Romaji,
+ XKB_KEY_Hiragana, Qt::Key_Hiragana,
+ XKB_KEY_Katakana, Qt::Key_Katakana,
+ XKB_KEY_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
+ XKB_KEY_Zenkaku, Qt::Key_Zenkaku,
+ XKB_KEY_Hankaku, Qt::Key_Hankaku,
+ XKB_KEY_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
+ XKB_KEY_Touroku, Qt::Key_Touroku,
+ XKB_KEY_Massyo, Qt::Key_Massyo,
+ XKB_KEY_Kana_Lock, Qt::Key_Kana_Lock,
+ XKB_KEY_Kana_Shift, Qt::Key_Kana_Shift,
+ XKB_KEY_Eisu_Shift, Qt::Key_Eisu_Shift,
+ XKB_KEY_Eisu_toggle, Qt::Key_Eisu_toggle,
+ //XKB_KEY_Kanji_Bangou, Qt::Key_Kanji_Bangou,
+ //XKB_KEY_Zen_Koho, Qt::Key_Zen_Koho,
+ //XKB_KEY_Mae_Koho, Qt::Key_Mae_Koho,
+ XKB_KEY_Kanji_Bangou, Qt::Key_Codeinput,
+ XKB_KEY_Zen_Koho, Qt::Key_MultipleCandidate,
+ XKB_KEY_Mae_Koho, Qt::Key_PreviousCandidate,
+
// Korean keyboard support
- XK_Hangul, Qt::Key_Hangul,
- XK_Hangul_Start, Qt::Key_Hangul_Start,
- XK_Hangul_End, Qt::Key_Hangul_End,
- XK_Hangul_Hanja, Qt::Key_Hangul_Hanja,
- XK_Hangul_Jamo, Qt::Key_Hangul_Jamo,
- XK_Hangul_Romaja, Qt::Key_Hangul_Romaja,
- //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
- XK_Hangul_Codeinput, Qt::Key_Codeinput,
- XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
- XK_Hangul_Banja, Qt::Key_Hangul_Banja,
- XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
- XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
- //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
- //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
- //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
- XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
- XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
- XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
- XK_Hangul_Special, Qt::Key_Hangul_Special,
- //XK_Hangul_switch, Qt::Key_Hangul_switch,
- XK_Hangul_switch, Qt::Key_Mode_switch,
-#endif // XK_KOREAN
+ XKB_KEY_Hangul, Qt::Key_Hangul,
+ XKB_KEY_Hangul_Start, Qt::Key_Hangul_Start,
+ XKB_KEY_Hangul_End, Qt::Key_Hangul_End,
+ XKB_KEY_Hangul_Hanja, Qt::Key_Hangul_Hanja,
+ XKB_KEY_Hangul_Jamo, Qt::Key_Hangul_Jamo,
+ XKB_KEY_Hangul_Romaja, Qt::Key_Hangul_Romaja,
+ //XKB_KEY_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
+ XKB_KEY_Hangul_Codeinput, Qt::Key_Codeinput,
+ XKB_KEY_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
+ XKB_KEY_Hangul_Banja, Qt::Key_Hangul_Banja,
+ XKB_KEY_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
+ XKB_KEY_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
+ //XKB_KEY_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
+ //XKB_KEY_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
+ //XKB_KEY_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
+ XKB_KEY_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
+ XKB_KEY_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
+ XKB_KEY_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
+ XKB_KEY_Hangul_Special, Qt::Key_Hangul_Special,
+ //XKB_KEY_Hangul_switch, Qt::Key_Hangul_switch,
+ XKB_KEY_Hangul_switch, Qt::Key_Mode_switch,
// dead keys
- XK_dead_grave, Qt::Key_Dead_Grave,
- XK_dead_acute, Qt::Key_Dead_Acute,
- XK_dead_circumflex, Qt::Key_Dead_Circumflex,
- XK_dead_tilde, Qt::Key_Dead_Tilde,
- XK_dead_macron, Qt::Key_Dead_Macron,
- XK_dead_breve, Qt::Key_Dead_Breve,
- XK_dead_abovedot, Qt::Key_Dead_Abovedot,
- XK_dead_diaeresis, Qt::Key_Dead_Diaeresis,
- XK_dead_abovering, Qt::Key_Dead_Abovering,
- XK_dead_doubleacute, Qt::Key_Dead_Doubleacute,
- XK_dead_caron, Qt::Key_Dead_Caron,
- XK_dead_cedilla, Qt::Key_Dead_Cedilla,
- XK_dead_ogonek, Qt::Key_Dead_Ogonek,
- XK_dead_iota, Qt::Key_Dead_Iota,
- XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
- XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
- XK_dead_belowdot, Qt::Key_Dead_Belowdot,
- XK_dead_hook, Qt::Key_Dead_Hook,
- XK_dead_horn, Qt::Key_Dead_Horn,
- XK_dead_stroke, Qt::Key_Dead_Stroke,
- XK_dead_abovecomma, Qt::Key_Dead_Abovecomma,
- XK_dead_abovereversedcomma, Qt::Key_Dead_Abovereversedcomma,
- XK_dead_doublegrave, Qt::Key_Dead_Doublegrave,
- XK_dead_belowring, Qt::Key_Dead_Belowring,
- XK_dead_belowmacron, Qt::Key_Dead_Belowmacron,
- XK_dead_belowcircumflex, Qt::Key_Dead_Belowcircumflex,
- XK_dead_belowtilde, Qt::Key_Dead_Belowtilde,
- XK_dead_belowbreve, Qt::Key_Dead_Belowbreve,
- XK_dead_belowdiaeresis, Qt::Key_Dead_Belowdiaeresis,
- XK_dead_invertedbreve, Qt::Key_Dead_Invertedbreve,
- XK_dead_belowcomma, Qt::Key_Dead_Belowcomma,
- XK_dead_currency, Qt::Key_Dead_Currency,
- XK_dead_a, Qt::Key_Dead_a,
- XK_dead_A, Qt::Key_Dead_A,
- XK_dead_e, Qt::Key_Dead_e,
- XK_dead_E, Qt::Key_Dead_E,
- XK_dead_i, Qt::Key_Dead_i,
- XK_dead_I, Qt::Key_Dead_I,
- XK_dead_o, Qt::Key_Dead_o,
- XK_dead_O, Qt::Key_Dead_O,
- XK_dead_u, Qt::Key_Dead_u,
- XK_dead_U, Qt::Key_Dead_U,
- XK_dead_small_schwa, Qt::Key_Dead_Small_Schwa,
- XK_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa,
- XK_dead_greek, Qt::Key_Dead_Greek,
- XK_dead_lowline, Qt::Key_Dead_Lowline,
- XK_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline,
- XK_dead_belowverticalline, Qt::Key_Dead_Belowverticalline,
- XK_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay,
+ XKB_KEY_dead_grave, Qt::Key_Dead_Grave,
+ XKB_KEY_dead_acute, Qt::Key_Dead_Acute,
+ XKB_KEY_dead_circumflex, Qt::Key_Dead_Circumflex,
+ XKB_KEY_dead_tilde, Qt::Key_Dead_Tilde,
+ XKB_KEY_dead_macron, Qt::Key_Dead_Macron,
+ XKB_KEY_dead_breve, Qt::Key_Dead_Breve,
+ XKB_KEY_dead_abovedot, Qt::Key_Dead_Abovedot,
+ XKB_KEY_dead_diaeresis, Qt::Key_Dead_Diaeresis,
+ XKB_KEY_dead_abovering, Qt::Key_Dead_Abovering,
+ XKB_KEY_dead_doubleacute, Qt::Key_Dead_Doubleacute,
+ XKB_KEY_dead_caron, Qt::Key_Dead_Caron,
+ XKB_KEY_dead_cedilla, Qt::Key_Dead_Cedilla,
+ XKB_KEY_dead_ogonek, Qt::Key_Dead_Ogonek,
+ XKB_KEY_dead_iota, Qt::Key_Dead_Iota,
+ XKB_KEY_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
+ XKB_KEY_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
+ XKB_KEY_dead_belowdot, Qt::Key_Dead_Belowdot,
+ XKB_KEY_dead_hook, Qt::Key_Dead_Hook,
+ XKB_KEY_dead_horn, Qt::Key_Dead_Horn,
+ XKB_KEY_dead_stroke, Qt::Key_Dead_Stroke,
+ XKB_KEY_dead_abovecomma, Qt::Key_Dead_Abovecomma,
+ XKB_KEY_dead_abovereversedcomma, Qt::Key_Dead_Abovereversedcomma,
+ XKB_KEY_dead_doublegrave, Qt::Key_Dead_Doublegrave,
+ XKB_KEY_dead_belowring, Qt::Key_Dead_Belowring,
+ XKB_KEY_dead_belowmacron, Qt::Key_Dead_Belowmacron,
+ XKB_KEY_dead_belowcircumflex, Qt::Key_Dead_Belowcircumflex,
+ XKB_KEY_dead_belowtilde, Qt::Key_Dead_Belowtilde,
+ XKB_KEY_dead_belowbreve, Qt::Key_Dead_Belowbreve,
+ XKB_KEY_dead_belowdiaeresis, Qt::Key_Dead_Belowdiaeresis,
+ XKB_KEY_dead_invertedbreve, Qt::Key_Dead_Invertedbreve,
+ XKB_KEY_dead_belowcomma, Qt::Key_Dead_Belowcomma,
+ XKB_KEY_dead_currency, Qt::Key_Dead_Currency,
+ XKB_KEY_dead_a, Qt::Key_Dead_a,
+ XKB_KEY_dead_A, Qt::Key_Dead_A,
+ XKB_KEY_dead_e, Qt::Key_Dead_e,
+ XKB_KEY_dead_E, Qt::Key_Dead_E,
+ XKB_KEY_dead_i, Qt::Key_Dead_i,
+ XKB_KEY_dead_I, Qt::Key_Dead_I,
+ XKB_KEY_dead_o, Qt::Key_Dead_o,
+ XKB_KEY_dead_O, Qt::Key_Dead_O,
+ XKB_KEY_dead_u, Qt::Key_Dead_u,
+ XKB_KEY_dead_U, Qt::Key_Dead_U,
+ XKB_KEY_dead_small_schwa, Qt::Key_Dead_Small_Schwa,
+ XKB_KEY_dead_capital_schwa, Qt::Key_Dead_Capital_Schwa,
+ XKB_KEY_dead_greek, Qt::Key_Dead_Greek,
+ XKB_KEY_dead_lowline, Qt::Key_Dead_Lowline,
+ XKB_KEY_dead_aboveverticalline, Qt::Key_Dead_Aboveverticalline,
+ XKB_KEY_dead_belowverticalline, Qt::Key_Dead_Belowverticalline,
+ XKB_KEY_dead_longsolidusoverlay, Qt::Key_Dead_Longsolidusoverlay,
// Special keys from X.org - This include multimedia keys,
- // wireless/bluetooth/uwb keys, special launcher keys, etc.
- XF86XK_Back, Qt::Key_Back,
- XF86XK_Forward, Qt::Key_Forward,
- XF86XK_Stop, Qt::Key_Stop,
- XF86XK_Refresh, Qt::Key_Refresh,
- XF86XK_Favorites, Qt::Key_Favorites,
- XF86XK_AudioMedia, Qt::Key_LaunchMedia,
- XF86XK_OpenURL, Qt::Key_OpenUrl,
- XF86XK_HomePage, Qt::Key_HomePage,
- XF86XK_Search, Qt::Key_Search,
- XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
- XF86XK_AudioMute, Qt::Key_VolumeMute,
- XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
- XF86XK_AudioPlay, Qt::Key_MediaPlay,
- XF86XK_AudioStop, Qt::Key_MediaStop,
- XF86XK_AudioPrev, Qt::Key_MediaPrevious,
- XF86XK_AudioNext, Qt::Key_MediaNext,
- XF86XK_AudioRecord, Qt::Key_MediaRecord,
- XF86XK_AudioPause, Qt::Key_MediaPause,
- XF86XK_Mail, Qt::Key_LaunchMail,
- XF86XK_MyComputer, Qt::Key_Launch0, // ### Qt 6: remap properly
- XF86XK_Calculator, Qt::Key_Launch1,
- XF86XK_Memo, Qt::Key_Memo,
- XF86XK_ToDoList, Qt::Key_ToDoList,
- XF86XK_Calendar, Qt::Key_Calendar,
- XF86XK_PowerDown, Qt::Key_PowerDown,
- XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust,
- XF86XK_Standby, Qt::Key_Standby,
- XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp,
- XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown,
- XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff,
- XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp,
- XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown,
- XF86XK_PowerOff, Qt::Key_PowerOff,
- XF86XK_WakeUp, Qt::Key_WakeUp,
- XF86XK_Eject, Qt::Key_Eject,
- XF86XK_ScreenSaver, Qt::Key_ScreenSaver,
- XF86XK_WWW, Qt::Key_WWW,
- XF86XK_Sleep, Qt::Key_Sleep,
- XF86XK_LightBulb, Qt::Key_LightBulb,
- XF86XK_Shop, Qt::Key_Shop,
- XF86XK_History, Qt::Key_History,
- XF86XK_AddFavorite, Qt::Key_AddFavorite,
- XF86XK_HotLinks, Qt::Key_HotLinks,
- XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust,
- XF86XK_Finance, Qt::Key_Finance,
- XF86XK_Community, Qt::Key_Community,
- XF86XK_AudioRewind, Qt::Key_AudioRewind,
- XF86XK_BackForward, Qt::Key_BackForward,
- XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft,
- XF86XK_ApplicationRight, Qt::Key_ApplicationRight,
- XF86XK_Book, Qt::Key_Book,
- XF86XK_CD, Qt::Key_CD,
- XF86XK_Calculater, Qt::Key_Calculator,
- XF86XK_Clear, Qt::Key_Clear,
- XF86XK_ClearGrab, Qt::Key_ClearGrab,
- XF86XK_Close, Qt::Key_Close,
- XF86XK_Copy, Qt::Key_Copy,
- XF86XK_Cut, Qt::Key_Cut,
- XF86XK_Display, Qt::Key_Display,
- XF86XK_DOS, Qt::Key_DOS,
- XF86XK_Documents, Qt::Key_Documents,
- XF86XK_Excel, Qt::Key_Excel,
- XF86XK_Explorer, Qt::Key_Explorer,
- XF86XK_Game, Qt::Key_Game,
- XF86XK_Go, Qt::Key_Go,
- XF86XK_iTouch, Qt::Key_iTouch,
- XF86XK_LogOff, Qt::Key_LogOff,
- XF86XK_Market, Qt::Key_Market,
- XF86XK_Meeting, Qt::Key_Meeting,
- XF86XK_MenuKB, Qt::Key_MenuKB,
- XF86XK_MenuPB, Qt::Key_MenuPB,
- XF86XK_MySites, Qt::Key_MySites,
- XF86XK_New, Qt::Key_New,
- XF86XK_News, Qt::Key_News,
- XF86XK_OfficeHome, Qt::Key_OfficeHome,
- XF86XK_Open, Qt::Key_Open,
- XF86XK_Option, Qt::Key_Option,
- XF86XK_Paste, Qt::Key_Paste,
- XF86XK_Phone, Qt::Key_Phone,
- XF86XK_Reply, Qt::Key_Reply,
- XF86XK_Reload, Qt::Key_Reload,
- XF86XK_RotateWindows, Qt::Key_RotateWindows,
- XF86XK_RotationPB, Qt::Key_RotationPB,
- XF86XK_RotationKB, Qt::Key_RotationKB,
- XF86XK_Save, Qt::Key_Save,
- XF86XK_Send, Qt::Key_Send,
- XF86XK_Spell, Qt::Key_Spell,
- XF86XK_SplitScreen, Qt::Key_SplitScreen,
- XF86XK_Support, Qt::Key_Support,
- XF86XK_TaskPane, Qt::Key_TaskPane,
- XF86XK_Terminal, Qt::Key_Terminal,
- XF86XK_Tools, Qt::Key_Tools,
- XF86XK_Travel, Qt::Key_Travel,
- XF86XK_Video, Qt::Key_Video,
- XF86XK_Word, Qt::Key_Word,
- XF86XK_Xfer, Qt::Key_Xfer,
- XF86XK_ZoomIn, Qt::Key_ZoomIn,
- XF86XK_ZoomOut, Qt::Key_ZoomOut,
- XF86XK_Away, Qt::Key_Away,
- XF86XK_Messenger, Qt::Key_Messenger,
- XF86XK_WebCam, Qt::Key_WebCam,
- XF86XK_MailForward, Qt::Key_MailForward,
- XF86XK_Pictures, Qt::Key_Pictures,
- XF86XK_Music, Qt::Key_Music,
- XF86XK_Battery, Qt::Key_Battery,
- XF86XK_Bluetooth, Qt::Key_Bluetooth,
- XF86XK_WLAN, Qt::Key_WLAN,
- XF86XK_UWB, Qt::Key_UWB,
- XF86XK_AudioForward, Qt::Key_AudioForward,
- XF86XK_AudioRepeat, Qt::Key_AudioRepeat,
- XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay,
- XF86XK_Subtitle, Qt::Key_Subtitle,
- XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack,
- XF86XK_Time, Qt::Key_Time,
- XF86XK_Select, Qt::Key_Select,
- XF86XK_View, Qt::Key_View,
- XF86XK_TopMenu, Qt::Key_TopMenu,
- XF86XK_Red, Qt::Key_Red,
- XF86XK_Green, Qt::Key_Green,
- XF86XK_Yellow, Qt::Key_Yellow,
- XF86XK_Blue, Qt::Key_Blue,
- XF86XK_Bluetooth, Qt::Key_Bluetooth,
- XF86XK_Suspend, Qt::Key_Suspend,
- XF86XK_Hibernate, Qt::Key_Hibernate,
- XF86XK_TouchpadToggle, Qt::Key_TouchpadToggle,
- XF86XK_TouchpadOn, Qt::Key_TouchpadOn,
- XF86XK_TouchpadOff, Qt::Key_TouchpadOff,
- XF86XK_AudioMicMute, Qt::Key_MicMute,
- XF86XK_Launch0, Qt::Key_Launch2, // ### Qt 6: remap properly
- XF86XK_Launch1, Qt::Key_Launch3,
- XF86XK_Launch2, Qt::Key_Launch4,
- XF86XK_Launch3, Qt::Key_Launch5,
- XF86XK_Launch4, Qt::Key_Launch6,
- XF86XK_Launch5, Qt::Key_Launch7,
- XF86XK_Launch6, Qt::Key_Launch8,
- XF86XK_Launch7, Qt::Key_Launch9,
- XF86XK_Launch8, Qt::Key_LaunchA,
- XF86XK_Launch9, Qt::Key_LaunchB,
- XF86XK_LaunchA, Qt::Key_LaunchC,
- XF86XK_LaunchB, Qt::Key_LaunchD,
- XF86XK_LaunchC, Qt::Key_LaunchE,
- XF86XK_LaunchD, Qt::Key_LaunchF,
- XF86XK_LaunchE, Qt::Key_LaunchG,
- XF86XK_LaunchF, Qt::Key_LaunchH,
+ // wireless/bluetooth/uwb keys, special launcher keys, etc.
+ XKB_KEY_XF86Back, Qt::Key_Back,
+ XKB_KEY_XF86Forward, Qt::Key_Forward,
+ XKB_KEY_XF86Stop, Qt::Key_Stop,
+ XKB_KEY_XF86Refresh, Qt::Key_Refresh,
+ XKB_KEY_XF86Favorites, Qt::Key_Favorites,
+ XKB_KEY_XF86AudioMedia, Qt::Key_LaunchMedia,
+ XKB_KEY_XF86OpenURL, Qt::Key_OpenUrl,
+ XKB_KEY_XF86HomePage, Qt::Key_HomePage,
+ XKB_KEY_XF86Search, Qt::Key_Search,
+ XKB_KEY_XF86AudioLowerVolume, Qt::Key_VolumeDown,
+ XKB_KEY_XF86AudioMute, Qt::Key_VolumeMute,
+ XKB_KEY_XF86AudioRaiseVolume, Qt::Key_VolumeUp,
+ XKB_KEY_XF86AudioPlay, Qt::Key_MediaPlay,
+ XKB_KEY_XF86AudioStop, Qt::Key_MediaStop,
+ XKB_KEY_XF86AudioPrev, Qt::Key_MediaPrevious,
+ XKB_KEY_XF86AudioNext, Qt::Key_MediaNext,
+ XKB_KEY_XF86AudioRecord, Qt::Key_MediaRecord,
+ XKB_KEY_XF86AudioPause, Qt::Key_MediaPause,
+ XKB_KEY_XF86Mail, Qt::Key_LaunchMail,
+ XKB_KEY_XF86MyComputer, Qt::Key_Launch0, // ### Qt 6: remap properly
+ XKB_KEY_XF86Calculator, Qt::Key_Launch1,
+ XKB_KEY_XF86Memo, Qt::Key_Memo,
+ XKB_KEY_XF86ToDoList, Qt::Key_ToDoList,
+ XKB_KEY_XF86Calendar, Qt::Key_Calendar,
+ XKB_KEY_XF86PowerDown, Qt::Key_PowerDown,
+ XKB_KEY_XF86ContrastAdjust, Qt::Key_ContrastAdjust,
+ XKB_KEY_XF86Standby, Qt::Key_Standby,
+ XKB_KEY_XF86MonBrightnessUp, Qt::Key_MonBrightnessUp,
+ XKB_KEY_XF86MonBrightnessDown, Qt::Key_MonBrightnessDown,
+ XKB_KEY_XF86KbdLightOnOff, Qt::Key_KeyboardLightOnOff,
+ XKB_KEY_XF86KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp,
+ XKB_KEY_XF86KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown,
+ XKB_KEY_XF86PowerOff, Qt::Key_PowerOff,
+ XKB_KEY_XF86WakeUp, Qt::Key_WakeUp,
+ XKB_KEY_XF86Eject, Qt::Key_Eject,
+ XKB_KEY_XF86ScreenSaver, Qt::Key_ScreenSaver,
+ XKB_KEY_XF86WWW, Qt::Key_WWW,
+ XKB_KEY_XF86Sleep, Qt::Key_Sleep,
+ XKB_KEY_XF86LightBulb, Qt::Key_LightBulb,
+ XKB_KEY_XF86Shop, Qt::Key_Shop,
+ XKB_KEY_XF86History, Qt::Key_History,
+ XKB_KEY_XF86AddFavorite, Qt::Key_AddFavorite,
+ XKB_KEY_XF86HotLinks, Qt::Key_HotLinks,
+ XKB_KEY_XF86BrightnessAdjust, Qt::Key_BrightnessAdjust,
+ XKB_KEY_XF86Finance, Qt::Key_Finance,
+ XKB_KEY_XF86Community, Qt::Key_Community,
+ XKB_KEY_XF86AudioRewind, Qt::Key_AudioRewind,
+ XKB_KEY_XF86BackForward, Qt::Key_BackForward,
+ XKB_KEY_XF86ApplicationLeft, Qt::Key_ApplicationLeft,
+ XKB_KEY_XF86ApplicationRight, Qt::Key_ApplicationRight,
+ XKB_KEY_XF86Book, Qt::Key_Book,
+ XKB_KEY_XF86CD, Qt::Key_CD,
+ XKB_KEY_XF86Calculater, Qt::Key_Calculator,
+ XKB_KEY_XF86Clear, Qt::Key_Clear,
+ XKB_KEY_XF86ClearGrab, Qt::Key_ClearGrab,
+ XKB_KEY_XF86Close, Qt::Key_Close,
+ XKB_KEY_XF86Copy, Qt::Key_Copy,
+ XKB_KEY_XF86Cut, Qt::Key_Cut,
+ XKB_KEY_XF86Display, Qt::Key_Display,
+ XKB_KEY_XF86DOS, Qt::Key_DOS,
+ XKB_KEY_XF86Documents, Qt::Key_Documents,
+ XKB_KEY_XF86Excel, Qt::Key_Excel,
+ XKB_KEY_XF86Explorer, Qt::Key_Explorer,
+ XKB_KEY_XF86Game, Qt::Key_Game,
+ XKB_KEY_XF86Go, Qt::Key_Go,
+ XKB_KEY_XF86iTouch, Qt::Key_iTouch,
+ XKB_KEY_XF86LogOff, Qt::Key_LogOff,
+ XKB_KEY_XF86Market, Qt::Key_Market,
+ XKB_KEY_XF86Meeting, Qt::Key_Meeting,
+ XKB_KEY_XF86MenuKB, Qt::Key_MenuKB,
+ XKB_KEY_XF86MenuPB, Qt::Key_MenuPB,
+ XKB_KEY_XF86MySites, Qt::Key_MySites,
+ XKB_KEY_XF86New, Qt::Key_New,
+ XKB_KEY_XF86News, Qt::Key_News,
+ XKB_KEY_XF86OfficeHome, Qt::Key_OfficeHome,
+ XKB_KEY_XF86Open, Qt::Key_Open,
+ XKB_KEY_XF86Option, Qt::Key_Option,
+ XKB_KEY_XF86Paste, Qt::Key_Paste,
+ XKB_KEY_XF86Phone, Qt::Key_Phone,
+ XKB_KEY_XF86Reply, Qt::Key_Reply,
+ XKB_KEY_XF86Reload, Qt::Key_Reload,
+ XKB_KEY_XF86RotateWindows, Qt::Key_RotateWindows,
+ XKB_KEY_XF86RotationPB, Qt::Key_RotationPB,
+ XKB_KEY_XF86RotationKB, Qt::Key_RotationKB,
+ XKB_KEY_XF86Save, Qt::Key_Save,
+ XKB_KEY_XF86Send, Qt::Key_Send,
+ XKB_KEY_XF86Spell, Qt::Key_Spell,
+ XKB_KEY_XF86SplitScreen, Qt::Key_SplitScreen,
+ XKB_KEY_XF86Support, Qt::Key_Support,
+ XKB_KEY_XF86TaskPane, Qt::Key_TaskPane,
+ XKB_KEY_XF86Terminal, Qt::Key_Terminal,
+ XKB_KEY_XF86Tools, Qt::Key_Tools,
+ XKB_KEY_XF86Travel, Qt::Key_Travel,
+ XKB_KEY_XF86Video, Qt::Key_Video,
+ XKB_KEY_XF86Word, Qt::Key_Word,
+ XKB_KEY_XF86Xfer, Qt::Key_Xfer,
+ XKB_KEY_XF86ZoomIn, Qt::Key_ZoomIn,
+ XKB_KEY_XF86ZoomOut, Qt::Key_ZoomOut,
+ XKB_KEY_XF86Away, Qt::Key_Away,
+ XKB_KEY_XF86Messenger, Qt::Key_Messenger,
+ XKB_KEY_XF86WebCam, Qt::Key_WebCam,
+ XKB_KEY_XF86MailForward, Qt::Key_MailForward,
+ XKB_KEY_XF86Pictures, Qt::Key_Pictures,
+ XKB_KEY_XF86Music, Qt::Key_Music,
+ XKB_KEY_XF86Battery, Qt::Key_Battery,
+ XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth,
+ XKB_KEY_XF86WLAN, Qt::Key_WLAN,
+ XKB_KEY_XF86UWB, Qt::Key_UWB,
+ XKB_KEY_XF86AudioForward, Qt::Key_AudioForward,
+ XKB_KEY_XF86AudioRepeat, Qt::Key_AudioRepeat,
+ XKB_KEY_XF86AudioRandomPlay, Qt::Key_AudioRandomPlay,
+ XKB_KEY_XF86Subtitle, Qt::Key_Subtitle,
+ XKB_KEY_XF86AudioCycleTrack, Qt::Key_AudioCycleTrack,
+ XKB_KEY_XF86Time, Qt::Key_Time,
+ XKB_KEY_XF86Select, Qt::Key_Select,
+ XKB_KEY_XF86View, Qt::Key_View,
+ XKB_KEY_XF86TopMenu, Qt::Key_TopMenu,
+ XKB_KEY_XF86Red, Qt::Key_Red,
+ XKB_KEY_XF86Green, Qt::Key_Green,
+ XKB_KEY_XF86Yellow, Qt::Key_Yellow,
+ XKB_KEY_XF86Blue, Qt::Key_Blue,
+ XKB_KEY_XF86Bluetooth, Qt::Key_Bluetooth,
+ XKB_KEY_XF86Suspend, Qt::Key_Suspend,
+ XKB_KEY_XF86Hibernate, Qt::Key_Hibernate,
+ XKB_KEY_XF86TouchpadToggle, Qt::Key_TouchpadToggle,
+ XKB_KEY_XF86TouchpadOn, Qt::Key_TouchpadOn,
+ XKB_KEY_XF86TouchpadOff, Qt::Key_TouchpadOff,
+ XKB_KEY_XF86AudioMicMute, Qt::Key_MicMute,
+ XKB_KEY_XF86Launch0, Qt::Key_Launch2, // ### Qt 6: remap properly
+ XKB_KEY_XF86Launch1, Qt::Key_Launch3,
+ XKB_KEY_XF86Launch2, Qt::Key_Launch4,
+ XKB_KEY_XF86Launch3, Qt::Key_Launch5,
+ XKB_KEY_XF86Launch4, Qt::Key_Launch6,
+ XKB_KEY_XF86Launch5, Qt::Key_Launch7,
+ XKB_KEY_XF86Launch6, Qt::Key_Launch8,
+ XKB_KEY_XF86Launch7, Qt::Key_Launch9,
+ XKB_KEY_XF86Launch8, Qt::Key_LaunchA,
+ XKB_KEY_XF86Launch9, Qt::Key_LaunchB,
+ XKB_KEY_XF86LaunchA, Qt::Key_LaunchC,
+ XKB_KEY_XF86LaunchB, Qt::Key_LaunchD,
+ XKB_KEY_XF86LaunchC, Qt::Key_LaunchE,
+ XKB_KEY_XF86LaunchD, Qt::Key_LaunchF,
+ XKB_KEY_XF86LaunchE, Qt::Key_LaunchG,
+ XKB_KEY_XF86LaunchF, Qt::Key_LaunchH,
0, 0
};
@@ -744,7 +476,7 @@ static QByteArray symbolsGroupString(const xcb_keysym_t *symbols, int count)
return groupString;
}
-struct xkb_keymap *QXcbKeyboard::keymapFromCore()
+struct xkb_keymap *QXcbKeyboard::keymapFromCore(const KeysymModifierMap &keysymMods)
{
/* Construct an XKB keymap string from information queried from
* the X server */
@@ -870,7 +602,6 @@ struct xkb_keymap *QXcbKeyboard::keymapFromCore()
if (xkeymap.isEmpty())
return nullptr;
- KeysymModifierMap keysymMods(keysymsToModifiers());
static const char *const builtinModifiers[] =
{ "Shift", "Lock", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5" };
@@ -987,8 +718,22 @@ struct xkb_keymap *QXcbKeyboard::keymapFromCore()
XKB_KEYMAP_COMPILE_NO_FLAGS);
}
+void QXcbKeyboard::updateKeymap(xcb_mapping_notify_event_t *event)
+{
+ if (connection()->hasXKB() || event->request == XCB_MAPPING_POINTER)
+ return;
+
+ xcb_refresh_keyboard_mapping(m_key_symbols, event);
+ updateKeymap();
+}
+
void QXcbKeyboard::updateKeymap()
{
+ KeysymModifierMap keysymMods;
+ if (!connection()->hasXKB())
+ keysymMods = keysymsToModifiers();
+ updateModifiers(keysymMods);
+
m_config = true;
if (!m_xkbContext) {
@@ -1011,7 +756,7 @@ void QXcbKeyboard::updateKeymap()
m_xkbState.reset(xkb_x11_state_new_from_device(m_xkbKeymap.get(), xcb_connection(), core_device_id));
} else {
#endif
- m_xkbKeymap.reset(keymapFromCore());
+ m_xkbKeymap.reset(keymapFromCore(keysymMods));
if (m_xkbKeymap)
m_xkbState.reset(xkb_state_new(m_xkbKeymap.get()));
#if QT_CONFIG(xkb)
@@ -1038,7 +783,7 @@ void QXcbKeyboard::updateKeymap()
void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state)
{
if (m_config && connection()->hasXKB()) {
- const xkb_state_component newState
+ const xkb_state_component changedComponents
= xkb_state_update_mask(m_xkbState.get(),
state->baseMods,
state->latchedMods,
@@ -1047,44 +792,35 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state)
state->latchedGroup,
state->lockedGroup);
- if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
- //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
- }
+ handleStateChanges(changedComponents);
}
}
#endif
-void QXcbKeyboard::updateXKBStateFromState(struct xkb_state *kb_state, quint16 state)
+static xkb_layout_index_t lockedGroup(quint16 state)
{
- const quint32 modsDepressed = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_DEPRESSED);
- const quint32 modsLatched = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LATCHED);
- const quint32 modsLocked = xkb_state_serialize_mods(kb_state, XKB_STATE_MODS_LOCKED);
- const quint32 xkbMask = xkbModMask(state);
-
- const quint32 latched = modsLatched & xkbMask;
- const quint32 locked = modsLocked & xkbMask;
- quint32 depressed = modsDepressed & xkbMask;
- // set modifiers in depressed if they don't appear in any of the final masks
- depressed |= ~(depressed | latched | locked) & xkbMask;
-
- const xkb_state_component newState
- = xkb_state_update_mask(kb_state,
- depressed,
- latched,
- locked,
- 0,
- 0,
- (state >> 13) & 3); // bits 13 and 14 report the state keyboard group
-
- if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
- //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
- }
+ return (state >> 13) & 3; // bits 13 and 14 report the state keyboard group
}
void QXcbKeyboard::updateXKBStateFromCore(quint16 state)
{
if (m_config && !connection()->hasXKB()) {
- updateXKBStateFromState(m_xkbState.get(), state);
+ struct xkb_state *xkbState = m_xkbState.get();
+ xkb_mod_mask_t modsDepressed = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_DEPRESSED);
+ xkb_mod_mask_t modsLatched = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LATCHED);
+ xkb_mod_mask_t modsLocked = xkb_state_serialize_mods(xkbState, XKB_STATE_MODS_LOCKED);
+ xkb_mod_mask_t xkbMask = xkbModMask(state);
+
+ xkb_mod_mask_t latched = modsLatched & xkbMask;
+ xkb_mod_mask_t locked = modsLocked & xkbMask;
+ xkb_mod_mask_t depressed = modsDepressed & xkbMask;
+ // set modifiers in depressed if they don't appear in any of the final masks
+ depressed |= ~(depressed | latched | locked) & xkbMask;
+
+ xkb_state_component changedComponents = xkb_state_update_mask(
+ xkbState, depressed, latched, locked, 0, 0, lockedGroup(state));
+
+ handleStateChanges(changedComponents);
}
}
@@ -1094,24 +830,32 @@ void QXcbKeyboard::updateXKBStateFromXI(void *modInfo, void *groupInfo)
if (m_config && !connection()->hasXKB()) {
xXIModifierInfo *mods = static_cast<xXIModifierInfo *>(modInfo);
xXIGroupInfo *group = static_cast<xXIGroupInfo *>(groupInfo);
- const xkb_state_component newState = xkb_state_update_mask(m_xkbState.get(),
- mods->base_mods,
- mods->latched_mods,
- mods->locked_mods,
- group->base_group,
- group->latched_group,
- group->locked_group);
-
- if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) {
- //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
- }
+ const xkb_state_component changedComponents
+ = xkb_state_update_mask(m_xkbState.get(),
+ mods->base_mods,
+ mods->latched_mods,
+ mods->locked_mods,
+ group->base_group,
+ group->latched_group,
+ group->locked_group);
+
+ handleStateChanges(changedComponents);
}
}
#endif
-quint32 QXcbKeyboard::xkbModMask(quint16 state)
+void QXcbKeyboard::handleStateChanges(xkb_state_component changedComponents)
+{
+ // Note: Ubuntu (with Unity) always creates a new keymap when layout is changed
+ // via system settings, which means that the layout change would not be detected
+ // by this code. That can be solved by emitting KeyboardLayoutChange also from updateKeymap().
+ if ((changedComponents & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE)
+ qCDebug(lcQpaKeyboard, "TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)");
+}
+
+xkb_mod_mask_t QXcbKeyboard::xkbModMask(quint16 state)
{
- quint32 xkb_mask = 0;
+ xkb_mod_mask_t xkb_mask = 0;
if ((state & XCB_MOD_MASK_SHIFT) && xkb_mods.shift != XKB_MOD_INVALID)
xkb_mask |= (1 << xkb_mods.shift);
@@ -1153,17 +897,17 @@ static bool isLatin(xkb_keysym_t sym)
void QXcbKeyboard::checkForLatinLayout() const
{
const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(m_xkbKeymap.get());
- const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
- const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
+ const xcb_keycode_t minKeycode = xkb_keymap_min_keycode(m_xkbKeymap.get());
+ const xcb_keycode_t maxKeycode = xkb_keymap_max_keycode(m_xkbKeymap.get());
- ScopedXKBState state(xkb_state_new(m_xkbKeymap.get()));
+ const xkb_keysym_t *keysyms = nullptr;
+ int nrLatinKeys = 0;
for (xkb_layout_index_t layout = 0; layout < layoutCount; ++layout) {
- xkb_state_update_mask(state.get(), 0, 0, 0, 0, 0, layout);
for (xcb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
- xkb_keysym_t sym = xkb_state_key_get_one_sym(state.get(), code);
- // if layout can produce any of these latin letters (chosen
- // arbitrarily) then it must be a latin key based layout
- if (sym == XK_q || sym == XK_a || sym == XK_e)
+ xkb_keymap_key_get_syms_by_level(m_xkbKeymap.get(), code, layout, 0, &keysyms);
+ if (keysyms && isLatin(keysyms[0]))
+ nrLatinKeys++;
+ if (nrLatinKeys > 10) // arbitrarily chosen threshold
return;
}
}
@@ -1213,8 +957,8 @@ xkb_keysym_t QXcbKeyboard::lookupLatinKeysym(xkb_keycode_t keycode) const
// then the obtained key is not unique. This prevents ctrl+<physical q key> from generating a ctrl+q
// shortcut in the above described setup. We don't want ctrl+<physical x key> and ctrl+<physical q key> to
// generate the same shortcut event in this case.
- const xcb_keycode_t minKeycode = connection()->setup()->min_keycode;
- const xcb_keycode_t maxKeycode = connection()->setup()->max_keycode;
+ const xcb_keycode_t minKeycode = xkb_keymap_min_keycode(m_xkbKeymap.get());
+ const xcb_keycode_t maxKeycode = xkb_keymap_max_keycode(m_xkbKeymap.get());
ScopedXKBState state(xkb_state_new(m_xkbKeymap.get()));
for (xkb_layout_index_t prevLayout = 0; prevLayout < layout; ++prevLayout) {
xkb_state_update_mask(state.get(), 0, latchedMods, lockedMods, 0, 0, prevLayout);
@@ -1421,8 +1165,6 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
#if QT_CONFIG(xkb)
core_device_id = 0;
if (connection->hasXKB()) {
- updateVModMapping();
- updateVModToRModMapping();
core_device_id = xkb_x11_get_core_keyboard_device_id(xcb_connection());
if (core_device_id == -1) {
qWarning("Qt: couldn't get core keyboard device info");
@@ -1431,7 +1173,6 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
} else {
#endif
m_key_symbols = xcb_key_symbols_alloc(xcb_connection());
- updateModifiers();
#if QT_CONFIG(xkb)
}
#endif
@@ -1440,7 +1181,7 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
QXcbKeyboard::~QXcbKeyboard()
{
- if (!connection()->hasXKB())
+ if (m_key_symbols)
xcb_key_symbols_free(m_key_symbols);
}
@@ -1566,8 +1307,6 @@ void QXcbKeyboard::updateVModToRModMapping()
else if (vmod_masks.hyper == bit)
rmod_masks.hyper = modmap;
}
-
- resolveMaskConflicts();
#endif
}
@@ -1578,21 +1317,24 @@ static inline void applyModifier(uint *mask, int modifierBit)
*mask |= 1 << modifierBit;
}
-void QXcbKeyboard::updateModifiers()
+void QXcbKeyboard::updateModifiers(const KeysymModifierMap &keysymMods)
{
- memset(&rmod_masks, 0, sizeof(rmod_masks));
-
- // Compute X modifier bits for Qt modifiers
- KeysymModifierMap keysymMods(keysymsToModifiers());
- applyModifier(&rmod_masks.alt, keysymMods.value(XK_Alt_L, -1));
- applyModifier(&rmod_masks.alt, keysymMods.value(XK_Alt_R, -1));
- applyModifier(&rmod_masks.meta, keysymMods.value(XK_Meta_L, -1));
- applyModifier(&rmod_masks.meta, keysymMods.value(XK_Meta_R, -1));
- applyModifier(&rmod_masks.altgr, keysymMods.value(XK_Mode_switch, -1));
- applyModifier(&rmod_masks.super, keysymMods.value(XK_Super_L, -1));
- applyModifier(&rmod_masks.super, keysymMods.value(XK_Super_R, -1));
- applyModifier(&rmod_masks.hyper, keysymMods.value(XK_Hyper_L, -1));
- applyModifier(&rmod_masks.hyper, keysymMods.value(XK_Hyper_R, -1));
+ if (connection()->hasXKB()) {
+ updateVModMapping();
+ updateVModToRModMapping();
+ } else {
+ memset(&rmod_masks, 0, sizeof(rmod_masks));
+ // Compute X modifier bits for Qt modifiers
+ applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_L, -1));
+ applyModifier(&rmod_masks.alt, keysymMods.value(XKB_KEY_Alt_R, -1));
+ applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_L, -1));
+ applyModifier(&rmod_masks.meta, keysymMods.value(XKB_KEY_Meta_R, -1));
+ applyModifier(&rmod_masks.altgr, keysymMods.value(XKB_KEY_Mode_switch, -1));
+ applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_L, -1));
+ applyModifier(&rmod_masks.super, keysymMods.value(XKB_KEY_Super_R, -1));
+ applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_L, -1));
+ applyModifier(&rmod_masks.hyper, keysymMods.value(XKB_KEY_Hyper_R, -1));
+ }
resolveMaskConflicts();
}
@@ -1625,8 +1367,8 @@ QXcbKeyboard::KeysymModifierMap QXcbKeyboard::keysymsToModifiers()
// for Alt and Meta L and R are the same
static const xcb_keysym_t symbols[] = {
- XK_Alt_L, XK_Meta_L, XK_Mode_switch, XK_Super_L, XK_Super_R,
- XK_Hyper_L, XK_Hyper_R
+ XKB_KEY_Alt_L, XKB_KEY_Meta_L, XKB_KEY_Mode_switch, XKB_KEY_Super_L, XKB_KEY_Super_R,
+ XKB_KEY_Hyper_L, XKB_KEY_Hyper_R
};
static const size_t numSymbols = sizeof symbols / sizeof *symbols;
@@ -1771,7 +1513,7 @@ private:
};
void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code,
- quint16 state, xcb_timestamp_t time)
+ quint16 state, xcb_timestamp_t time, bool fromSendEvent)
{
if (!m_config)
return;
@@ -1783,17 +1525,25 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
if (type == QEvent::KeyPress)
targetWindow->updateNetWmUserTime(time);
- // Have a temporary keyboard state filled in from state
- // this way we allow for synthetic events to have different state
- // from the current state i.e. you can have Alt+Ctrl pressed
- // and receive a synthetic key event that has neither Alt nor Ctrl pressed
- ScopedXKBState xkbState(xkb_state_new(m_xkbKeymap.get()));
- if (!xkbState)
- return;
- updateXKBStateFromState(xkbState.get(), state);
- xcb_keysym_t sym = xkb_state_key_get_one_sym(xkbState.get(), code);
- QString string = lookupString(xkbState.get(), code);
+ ScopedXKBState sendEventState;
+ if (fromSendEvent) {
+ // Have a temporary keyboard state filled in from state
+ // this way we allow for synthetic events to have different state
+ // from the current state i.e. you can have Alt+Ctrl pressed
+ // and receive a synthetic key event that has neither Alt nor Ctrl pressed
+ sendEventState.reset(xkb_state_new(m_xkbKeymap.get()));
+ if (!sendEventState)
+ return;
+
+ xkb_mod_mask_t depressed = xkbModMask(state);
+ xkb_state_update_mask(sendEventState.get(), depressed, 0, 0, 0, 0, lockedGroup(state));
+ }
+
+ struct xkb_state *xkbState = fromSendEvent ? sendEventState.get() : m_xkbState.get();
+
+ xcb_keysym_t sym = xkb_state_key_get_one_sym(xkbState, code);
+ QString string = lookupString(xkbState, code);
Qt::KeyboardModifiers modifiers = translateModifiers(state);
if (sym >= XKB_KEY_KP_Space && sym <= XKB_KEY_KP_9)
@@ -1816,7 +1566,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
}
int qtcode = keysymToQtKey(latinKeysym != XKB_KEY_NoSymbol ? latinKeysym : sym,
- modifiers, xkbState.get(), code);
+ modifiers, xkbState, code);
bool isAutoRepeat = false;
if (type == QEvent::KeyPress) {
@@ -1892,27 +1642,23 @@ QString QXcbKeyboard::lookupStringNoKeysymTransformations(xkb_keysym_t keysym) c
return QString::fromUtf8(chars.constData(), size);
}
-void QXcbKeyboard::handleKeyPressEvent(const xcb_key_press_event_t *event)
+static bool fromSendEvent(const void *event)
{
- handleKeyEvent(event->event, QEvent::KeyPress, event->detail, event->state, event->time);
+ // From X11 protocol: Every event contains an 8-bit type code. The most
+ // significant bit in this code is set if the event was generated from
+ // a SendEvent request.
+ const xcb_generic_event_t *e = reinterpret_cast<const xcb_generic_event_t *>(event);
+ return (e->response_type & 0x80) != 0;
}
-void QXcbKeyboard::handleKeyReleaseEvent(const xcb_key_release_event_t *event)
+void QXcbKeyboard::handleKeyPressEvent(const xcb_key_press_event_t *e)
{
- handleKeyEvent(event->event, QEvent::KeyRelease, event->detail, event->state, event->time);
+ handleKeyEvent(e->event, QEvent::KeyPress, e->detail, e->state, e->time, fromSendEvent(e));
}
-void QXcbKeyboard::handleMappingNotifyEvent(const void *event)
+void QXcbKeyboard::handleKeyReleaseEvent(const xcb_key_release_event_t *e)
{
- updateKeymap();
- if (connection()->hasXKB()) {
- updateVModMapping();
- updateVModToRModMapping();
- } else {
- void *ev = const_cast<void *>(event);
- xcb_refresh_keyboard_mapping(m_key_symbols, static_cast<xcb_mapping_notify_event_t *>(ev));
- updateModifiers();
- }
+ handleKeyEvent(e->event, QEvent::KeyRelease, e->detail, e->state, e->time, fromSendEvent(e));
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
index 736b32a2fd..c131d69267 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.h
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
@@ -64,15 +64,15 @@ public:
void handleKeyPressEvent(const xcb_key_press_event_t *event);
void handleKeyReleaseEvent(const xcb_key_release_event_t *event);
- void handleMappingNotifyEvent(const void *event);
Qt::KeyboardModifiers translateModifiers(int s) const;
+ void updateKeymap(xcb_mapping_notify_event_t *event);
void updateKeymap();
QList<int> possibleKeys(const QKeyEvent *e) const;
// when XKEYBOARD not present on the X server
void updateXKBMods();
- quint32 xkbModMask(quint16 state);
+ xkb_mod_mask_t xkbModMask(quint16 state);
void updateXKBStateFromCore(quint16 state);
#if QT_CONFIG(xinput2)
void updateXKBStateFromXI(void *modInfo, void *groupInfo);
@@ -82,9 +82,11 @@ public:
int coreDeviceId() const { return core_device_id; }
void updateXKBState(xcb_xkb_state_notify_event_t *state);
#endif
+ void handleStateChanges(xkb_state_component changedComponents);
protected:
- void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time);
+ void handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type, xcb_keycode_t code,
+ quint16 state, xcb_timestamp_t time, bool fromSendEvent);
void resolveMaskConflicts();
QString lookupString(struct xkb_state *state, xcb_keycode_t code) const;
@@ -92,11 +94,11 @@ protected:
int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers modifiers,
struct xkb_state *state, xcb_keycode_t code) const;
- struct xkb_keymap *keymapFromCore();
+ typedef QMap<xcb_keysym_t, int> KeysymModifierMap;
+ struct xkb_keymap *keymapFromCore(const KeysymModifierMap &keysymMods);
// when XKEYBOARD not present on the X server
- void updateModifiers();
- typedef QMap<xcb_keysym_t, int> KeysymModifierMap;
+ void updateModifiers(const KeysymModifierMap &keysymMods);
KeysymModifierMap keysymsToModifiers();
// when XKEYBOARD is present on the X server
void updateVModMapping();
@@ -106,8 +108,6 @@ protected:
void checkForLatinLayout() const;
private:
- void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
-
bool m_config = false;
xcb_keycode_t m_autorepeat_code = 0;
@@ -122,7 +122,7 @@ private:
_mod_masks rmod_masks;
// when XKEYBOARD not present on the X server
- xcb_key_symbols_t *m_key_symbols;
+ xcb_key_symbols_t *m_key_symbols = nullptr;
struct _xkb_mods {
xkb_mod_index_t shift;
xkb_mod_index_t lock;