~robertcarr/qtubuntu/mir-with-packaging

« back to all changes in this revision

Viewing changes to src/platforms/base/input.cc

  • Committer: Robert Carr
  • Date: 2013-07-01 19:08:36 UTC
  • mfrom: (147.1.21 mir)
  • Revision ID: robert.carr@canonical.com-20130701190836-ii3f71ujo4kkaacr
Merge qtubuntu/mir

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <private/qguiapplication_p.h>
26
26
#include <qpa/qplatforminputcontext.h>
27
27
#include <ubuntu/application/ui/input/event.h>
28
 
 
29
 
#include <xkbcommon/xkbcommon.h>
30
 
#include <xkbcommon/xkbcommon-keysyms.h>
 
28
#include <input/input_stack_compatibility_layer_flags.h>
31
29
 
32
30
#define LOG_EVENTS 0
33
31
 
34
 
// XKB Keysyms which do not map directly to Qt types (i.e. Unicode points)
35
 
static const uint32_t KeyTbl[] = {
36
 
    XKB_KEY_Escape,                  Qt::Key_Escape,
37
 
    XKB_KEY_Tab,                     Qt::Key_Tab,
38
 
    XKB_KEY_ISO_Left_Tab,            Qt::Key_Backtab,
39
 
    XKB_KEY_BackSpace,               Qt::Key_Backspace,
40
 
    XKB_KEY_Return,                  Qt::Key_Return,
41
 
    XKB_KEY_Insert,                  Qt::Key_Insert,
42
 
    XKB_KEY_Delete,                  Qt::Key_Delete,
43
 
    XKB_KEY_Clear,                   Qt::Key_Delete,
44
 
    XKB_KEY_Pause,                   Qt::Key_Pause,
45
 
    XKB_KEY_Print,                   Qt::Key_Print,
46
 
 
47
 
    XKB_KEY_Home,                    Qt::Key_Home,
48
 
    XKB_KEY_End,                     Qt::Key_End,
49
 
    XKB_KEY_Left,                    Qt::Key_Left,
50
 
    XKB_KEY_Up,                      Qt::Key_Up,
51
 
    XKB_KEY_Right,                   Qt::Key_Right,
52
 
    XKB_KEY_Down,                    Qt::Key_Down,
53
 
    XKB_KEY_Prior,                   Qt::Key_PageUp,
54
 
    XKB_KEY_Next,                    Qt::Key_PageDown,
55
 
 
56
 
    XKB_KEY_Shift_L,                 Qt::Key_Shift,
57
 
    XKB_KEY_Shift_R,                 Qt::Key_Shift,
58
 
    XKB_KEY_Shift_Lock,              Qt::Key_Shift,
59
 
    XKB_KEY_Control_L,               Qt::Key_Control,
60
 
    XKB_KEY_Control_R,               Qt::Key_Control,
61
 
    XKB_KEY_Meta_L,                  Qt::Key_Meta,
62
 
    XKB_KEY_Meta_R,                  Qt::Key_Meta,
63
 
    XKB_KEY_Alt_L,                   Qt::Key_Alt,
64
 
    XKB_KEY_Alt_R,                   Qt::Key_Alt,
65
 
    XKB_KEY_Caps_Lock,               Qt::Key_CapsLock,
66
 
    XKB_KEY_Num_Lock,                Qt::Key_NumLock,
67
 
    XKB_KEY_Scroll_Lock,             Qt::Key_ScrollLock,
68
 
    XKB_KEY_Super_L,                 Qt::Key_Super_L,
69
 
    XKB_KEY_Super_R,                 Qt::Key_Super_R,
70
 
    XKB_KEY_Menu,                    Qt::Key_Menu,
71
 
    XKB_KEY_Hyper_L,                 Qt::Key_Hyper_L,
72
 
    XKB_KEY_Hyper_R,                 Qt::Key_Hyper_R,
73
 
    XKB_KEY_Help,                    Qt::Key_Help,
74
 
 
75
 
    XKB_KEY_KP_Space,                Qt::Key_Space,
76
 
    XKB_KEY_KP_Tab,                  Qt::Key_Tab,
77
 
    XKB_KEY_KP_Enter,                Qt::Key_Enter,
78
 
    XKB_KEY_KP_Home,                 Qt::Key_Home,
79
 
    XKB_KEY_KP_Left,                 Qt::Key_Left,
80
 
    XKB_KEY_KP_Up,                   Qt::Key_Up,
81
 
    XKB_KEY_KP_Right,                Qt::Key_Right,
82
 
    XKB_KEY_KP_Down,                 Qt::Key_Down,
83
 
    XKB_KEY_KP_Prior,                Qt::Key_PageUp,
84
 
    XKB_KEY_KP_Next,                 Qt::Key_PageDown,
85
 
    XKB_KEY_KP_End,                  Qt::Key_End,
86
 
    XKB_KEY_KP_Begin,                Qt::Key_Clear,
87
 
    XKB_KEY_KP_Insert,               Qt::Key_Insert,
88
 
    XKB_KEY_KP_Delete,               Qt::Key_Delete,
89
 
    XKB_KEY_KP_Equal,                Qt::Key_Equal,
90
 
    XKB_KEY_KP_Multiply,             Qt::Key_Asterisk,
91
 
    XKB_KEY_KP_Add,                  Qt::Key_Plus,
92
 
    XKB_KEY_KP_Separator,            Qt::Key_Comma,
93
 
    XKB_KEY_KP_Subtract,             Qt::Key_Minus,
94
 
    XKB_KEY_KP_Decimal,              Qt::Key_Period,
95
 
    XKB_KEY_KP_Divide,               Qt::Key_Slash,
96
 
 
97
 
    XKB_KEY_ISO_Level3_Shift,        Qt::Key_AltGr,
98
 
    XKB_KEY_Multi_key,               Qt::Key_Multi_key,
99
 
    XKB_KEY_Codeinput,               Qt::Key_Codeinput,
100
 
    XKB_KEY_SingleCandidate,         Qt::Key_SingleCandidate,
101
 
    XKB_KEY_MultipleCandidate,       Qt::Key_MultipleCandidate,
102
 
    XKB_KEY_PreviousCandidate,       Qt::Key_PreviousCandidate,
103
 
 
104
 
    XKB_KEY_Mode_switch,             Qt::Key_Mode_switch,
105
 
    XKB_KEY_script_switch,           Qt::Key_Mode_switch,
106
 
 
107
 
    0,                          0
 
32
// Lookup table for the key types.
 
33
// FIXME(loicm) Not sure what to do with that multiple thing.
 
34
static const QEvent::Type kEventType[] = {
 
35
  QEvent::KeyPress,    // ISCL_KEY_EVENT_ACTION_DOWN     = 0
 
36
  QEvent::KeyRelease,  // ISCL_KEY_EVENT_ACTION_UP       = 1
 
37
  QEvent::KeyPress     // ISCL_KEY_EVENT_ACTION_MULTIPLE = 2
 
38
};
 
39
 
 
40
// Lookup table for the key codes and unicode values.
 
41
static const struct {
 
42
  const quint32 keycode;
 
43
  const quint16 unicode[3];  // { no modifier, shift modifier, other modifiers }
 
44
} kKeyCode[] = {
 
45
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_UNKNOWN         = 0
 
46
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SOFT_LEFT       = 1
 
47
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SOFT_RIGHT      = 2
 
48
  { Qt::Key_Home, { 0xffff, 0xffff, 0xffff } },            // ISCL_KEYCODE_HOME            = 3
 
49
  { Qt::Key_Back, { 0xffff, 0xffff, 0xffff } },            // ISCL_KEYCODE_BACK            = 4
 
50
  { Qt::Key_Call, { 0xffff, 0xffff, 0xffff } },            // ISCL_KEYCODE_CALL            = 5
 
51
  { Qt::Key_Hangup, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_ENDCALL         = 6
 
52
  { Qt::Key_0, { 0x0030, 0xffff, 0xffff } },               // ISCL_KEYCODE_0               = 7
 
53
  { Qt::Key_1, { 0x0031, 0xffff, 0xffff } },               // ISCL_KEYCODE_1               = 8
 
54
  { Qt::Key_2, { 0x0032, 0xffff, 0xffff } },               // ISCL_KEYCODE_2               = 9
 
55
  { Qt::Key_3, { 0x0033, 0xffff, 0xffff } },               // ISCL_KEYCODE_3               = 10
 
56
  { Qt::Key_4, { 0x0034, 0xffff, 0xffff } },               // ISCL_KEYCODE_4               = 11
 
57
  { Qt::Key_5, { 0x0035, 0xffff, 0xffff } },               // ISCL_KEYCODE_5               = 12
 
58
  { Qt::Key_6, { 0x0036, 0xffff, 0xffff } },               // ISCL_KEYCODE_6               = 13
 
59
  { Qt::Key_7, { 0x0037, 0xffff, 0xffff } },               // ISCL_KEYCODE_7               = 14
 
60
  { Qt::Key_8, { 0x0038, 0xffff, 0xffff } },               // ISCL_KEYCODE_8               = 15
 
61
  { Qt::Key_9, { 0x0039, 0xffff, 0xffff } },               // ISCL_KEYCODE_9               = 16
 
62
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_STAR            = 17
 
63
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_POUND           = 18
 
64
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DPAD_UP         = 19
 
65
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DPAD_DOWN       = 20
 
66
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DPAD_LEFT       = 21
 
67
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DPAD_RIGHT      = 22
 
68
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DPAD_CENTER     = 23
 
69
  { Qt::Key_VolumeUp, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_VOLUME_UP       = 24
 
70
  { Qt::Key_VolumeDown, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_VOLUME_DOWN     = 25
 
71
  { Qt::Key_PowerOff, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_POWER           = 26
 
72
  { Qt::Key_Camera, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_CAMERA          = 27
 
73
  { Qt::Key_Clear, { 0xffff, 0xffff, 0xffff } },           // ISCL_KEYCODE_CLEAR           = 28
 
74
  { Qt::Key_A, { 0x0061, 0x0041, 0xffff } },               // ISCL_KEYCODE_A               = 29
 
75
  { Qt::Key_B, { 0x0062, 0x0042, 0xffff } },               // ISCL_KEYCODE_B               = 30
 
76
  { Qt::Key_C, { 0x0063, 0x0043, 0xffff } },               // ISCL_KEYCODE_C               = 31
 
77
  { Qt::Key_D, { 0x0064, 0x0044, 0xffff } },               // ISCL_KEYCODE_D               = 32
 
78
  { Qt::Key_E, { 0x0065, 0x0045, 0xffff } },               // ISCL_KEYCODE_E               = 33
 
79
  { Qt::Key_F, { 0x0066, 0x0046, 0xffff } },               // ISCL_KEYCODE_F               = 34
 
80
  { Qt::Key_G, { 0x0067, 0x0047, 0xffff } },               // ISCL_KEYCODE_G               = 35
 
81
  { Qt::Key_H, { 0x0068, 0x0048, 0xffff } },               // ISCL_KEYCODE_H               = 36
 
82
  { Qt::Key_I, { 0x0069, 0x0049, 0xffff } },               // ISCL_KEYCODE_I               = 37
 
83
  { Qt::Key_J, { 0x006a, 0x004a, 0xffff } },               // ISCL_KEYCODE_J               = 38
 
84
  { Qt::Key_K, { 0x006b, 0x004b, 0xffff } },               // ISCL_KEYCODE_K               = 39
 
85
  { Qt::Key_L, { 0x006c, 0x004c, 0xffff } },               // ISCL_KEYCODE_L               = 40
 
86
  { Qt::Key_M, { 0x006d, 0x004d, 0xffff } },               // ISCL_KEYCODE_M               = 41
 
87
  { Qt::Key_N, { 0x006e, 0x004e, 0xffff } },               // ISCL_KEYCODE_N               = 42
 
88
  { Qt::Key_O, { 0x006f, 0x004f, 0xffff } },               // ISCL_KEYCODE_O               = 43
 
89
  { Qt::Key_P, { 0x0070, 0x0050, 0xffff } },               // ISCL_KEYCODE_P               = 44
 
90
  { Qt::Key_Q, { 0x0071, 0x0051, 0xffff } },               // ISCL_KEYCODE_Q               = 45
 
91
  { Qt::Key_R, { 0x0072, 0x0052, 0xffff } },               // ISCL_KEYCODE_R               = 46
 
92
  { Qt::Key_S, { 0x0073, 0x0053, 0xffff } },               // ISCL_KEYCODE_S               = 47
 
93
  { Qt::Key_T, { 0x0074, 0x0054, 0xffff } },               // ISCL_KEYCODE_T               = 48
 
94
  { Qt::Key_U, { 0x0075, 0x0055, 0xffff } },               // ISCL_KEYCODE_U               = 49
 
95
  { Qt::Key_V, { 0x0076, 0x0056, 0xffff } },               // ISCL_KEYCODE_V               = 50
 
96
  { Qt::Key_W, { 0x0077, 0x0057, 0xffff } },               // ISCL_KEYCODE_W               = 51
 
97
  { Qt::Key_X, { 0x0078, 0x0058, 0xffff } },               // ISCL_KEYCODE_X               = 52
 
98
  { Qt::Key_Y, { 0x0079, 0x0059, 0xffff } },               // ISCL_KEYCODE_Y               = 53
 
99
  { Qt::Key_Z, { 0x007a, 0x005a, 0xffff } },               // ISCL_KEYCODE_Z               = 54
 
100
  { Qt::Key_Comma, { 0x002c, 0xffff, 0xffff } },           // ISCL_KEYCODE_COMMA           = 55
 
101
  { Qt::Key_Period, { 0x002e, 0xffff, 0xffff } },          // ISCL_KEYCODE_PERIOD          = 56
 
102
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_ALT_LEFT        = 57
 
103
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_ALT_RIGHT       = 58
 
104
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SHIFT_LEFT      = 59
 
105
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SHIFT_RIGHT     = 60
 
106
  { Qt::Key_Tab, { 0xffff, 0xffff, 0xffff } },             // ISCL_KEYCODE_TAB             = 61
 
107
  { Qt::Key_Space, { 0x0020, 0xffff, 0xffff } },           // ISCL_KEYCODE_SPACE           = 62
 
108
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SYM             = 63
 
109
  { Qt::Key_Explorer, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_EXPLORER        = 64
 
110
  { Qt::Key_LaunchMail, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_ENVELOPE        = 65
 
111
  { Qt::Key_Enter, { 0xffff, 0xffff, 0xffff } },           // ISCL_KEYCODE_ENTER           = 66
 
112
  { Qt::Key_Delete, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_DEL             = 67
 
113
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_GRAVE           = 68
 
114
  { Qt::Key_Minus, { 0x002d, 0xffff, 0xffff } },           // ISCL_KEYCODE_MINUS           = 69
 
115
  { Qt::Key_Equal, { 0x003d, 0xffff, 0xffff } },           // ISCL_KEYCODE_EQUALS          = 70
 
116
  { Qt::Key_BracketLeft, { 0x005b, 0xffff, 0xffff } },     // ISCL_KEYCODE_LEFT_BRACKET    = 71
 
117
  { Qt::Key_BracketRight, { 0x005d, 0xffff, 0xffff } },    // ISCL_KEYCODE_RIGHT_BRACKET   = 72
 
118
  { Qt::Key_Backslash, { 0x005c, 0xffff, 0xffff } },       // ISCL_KEYCODE_BACKSLASH       = 73
 
119
  { Qt::Key_Semicolon, { 0x003b, 0xffff, 0xffff } },       // ISCL_KEYCODE_SEMICOLON       = 74
 
120
  { Qt::Key_Apostrophe, { 0x0027, 0xffff, 0xffff } },      // ISCL_KEYCODE_APOSTROPHE      = 75
 
121
  { Qt::Key_Slash, { 0x002f, 0xffff, 0xffff } },           // ISCL_KEYCODE_SLASH           = 76
 
122
  { Qt::Key_At, { 0x0040, 0xffff, 0xffff } },              // ISCL_KEYCODE_AT              = 77
 
123
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_NUM             = 78
 
124
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_HEADSETHOOK     = 79
 
125
  { Qt::Key_CameraFocus, { 0xffff, 0xffff, 0xffff } },     // ISCL_KEYCODE_FOCUS           = 80  // *Camera* focus
 
126
  { Qt::Key_Plus, { 0x002b, 0xffff, 0xffff } },            // ISCL_KEYCODE_PLUS            = 81
 
127
  { Qt::Key_Menu, { 0xffff, 0xffff, 0xffff } },            // ISCL_KEYCODE_MENU            = 82
 
128
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_NOTIFICATION    = 83
 
129
  { Qt::Key_Search, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_SEARCH          = 84
 
130
  { Qt::Key_MediaTogglePlayPause, { 0xffff, 0xffff, 0xffff } },  // ISCL_KEYCODE_MEDIA_PLAY_PAUSE= 85
 
131
  { Qt::Key_MediaStop, { 0xffff, 0xffff, 0xffff } },       // ISCL_KEYCODE_MEDIA_STOP      = 86
 
132
  { Qt::Key_MediaNext, { 0xffff, 0xffff, 0xffff } },       // ISCL_KEYCODE_MEDIA_NEXT      = 87
 
133
  { Qt::Key_MediaPrevious, { 0xffff, 0xffff, 0xffff } },   // ISCL_KEYCODE_MEDIA_PREVIOUS  = 88
 
134
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MEDIA_REWIND    = 89
 
135
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MEDIA_FAST_FORWARD = 90
 
136
  { Qt::Key_VolumeMute, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_MUTE            = 91
 
137
  { Qt::Key_PageUp, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_PAGE_UP         = 92
 
138
  { Qt::Key_PageDown, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_PAGE_DOWN       = 93
 
139
  { Qt::Key_Pictures, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_PICTSYMBOLS     = 94
 
140
  { Qt::Key_Mode_switch, { 0xffff, 0xffff, 0xffff } },     // ISCL_KEYCODE_SWITCH_CHARSET  = 95
 
141
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_A        = 96
 
142
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_B        = 97
 
143
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_C        = 98
 
144
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_X        = 99
 
145
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_Y        = 100
 
146
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_Z        = 101
 
147
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_L1       = 102
 
148
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_R1       = 103
 
149
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_L2       = 104
 
150
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_R2       = 105
 
151
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_THUMBL   = 106
 
152
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_THUMBR   = 107
 
153
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_START    = 108
 
154
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_SELECT   = 109
 
155
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_MODE     = 110
 
156
  { Qt::Key_Escape, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_ESCAPE          = 111
 
157
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_FORWARD_DEL     = 112
 
158
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CTRL_LEFT       = 113
 
159
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CTRL_RIGHT      = 114
 
160
  { Qt::Key_CapsLock, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_CAPS_LOCK       = 115
 
161
  { Qt::Key_ScrollLock, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_SCROLL_LOCK     = 116
 
162
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_META_LEFT       = 117
 
163
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_META_RIGHT      = 118
 
164
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_FUNCTION        = 119
 
165
  { Qt::Key_SysReq, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_SYSRQ           = 120
 
166
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BREAK           = 121
 
167
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MOVE_HOME       = 122
 
168
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MOVE_END        = 123
 
169
  { Qt::Key_Insert, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_INSERT          = 124
 
170
  { Qt::Key_Forward, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_FORWARD         = 125
 
171
  { Qt::Key_MediaPlay, { 0xffff, 0xffff, 0xffff } },       // ISCL_KEYCODE_MEDIA_PLAY      = 126
 
172
  { Qt::Key_MediaPause, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_MEDIA_PAUSE     = 127
 
173
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MEDIA_CLOSE     = 128
 
174
  { Qt::Key_Eject, { 0xffff, 0xffff, 0xffff } },           // ISCL_KEYCODE_MEDIA_EJECT     = 129
 
175
  { Qt::Key_MediaRecord, { 0xffff, 0xffff, 0xffff } },     // ISCL_KEYCODE_MEDIA_RECORD    = 130
 
176
  { Qt::Key_F1, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F1              = 131
 
177
  { Qt::Key_F2, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F2              = 132
 
178
  { Qt::Key_F3, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F3              = 133
 
179
  { Qt::Key_F4, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F4              = 134
 
180
  { Qt::Key_F5, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F5              = 135
 
181
  { Qt::Key_F6, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F6              = 136
 
182
  { Qt::Key_F7, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F7              = 137
 
183
  { Qt::Key_F8, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F8              = 138
 
184
  { Qt::Key_F9, { 0xffff, 0xffff, 0xffff } },              // ISCL_KEYCODE_F9              = 139
 
185
  { Qt::Key_F10, { 0xffff, 0xffff, 0xffff } },             // ISCL_KEYCODE_F10             = 140
 
186
  { Qt::Key_F11, { 0xffff, 0xffff, 0xffff } },             // ISCL_KEYCODE_F11             = 141
 
187
  { Qt::Key_F12, { 0xffff, 0xffff, 0xffff } },             // ISCL_KEYCODE_F12             = 142
 
188
  { Qt::Key_NumLock, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_NUM_LOCK        = 143
 
189
  { Qt::Key_0, { 0x0030, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_0        = 144
 
190
  { Qt::Key_1, { 0x0031, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_1        = 145
 
191
  { Qt::Key_2, { 0x0032, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_2        = 146
 
192
  { Qt::Key_3, { 0x0033, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_3        = 147
 
193
  { Qt::Key_4, { 0x0034, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_4        = 148
 
194
  { Qt::Key_5, { 0x0035, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_5        = 149
 
195
  { Qt::Key_6, { 0x0036, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_6        = 150
 
196
  { Qt::Key_7, { 0x0037, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_7        = 151
 
197
  { Qt::Key_8, { 0x0038, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_8        = 152
 
198
  { Qt::Key_9, { 0x0039, 0xffff, 0xffff } },               // ISCL_KEYCODE_NUMPAD_9        = 153
 
199
  { Qt::Key_Slash, { 0x002f, 0xffff, 0xffff } },           // ISCL_KEYCODE_NUMPAD_DIVIDE   = 154
 
200
  { Qt::Key_Asterisk, { 0x002a, 0xffff, 0xffff } },        // ISCL_KEYCODE_NUMPAD_MULTIPLY = 155
 
201
  { Qt::Key_Minus, { 0x002d, 0xffff, 0xffff } },           // ISCL_KEYCODE_NUMPAD_SUBTRACT = 156
 
202
  { Qt::Key_Plus, { 0x002b, 0xffff, 0xffff } },            // ISCL_KEYCODE_NUMPAD_ADD      = 157
 
203
  { Qt::Key_Period, { 0x002e, 0xffff, 0xffff } },          // ISCL_KEYCODE_NUMPAD_DOT      = 158
 
204
  { Qt::Key_Comma, { 0x002c, 0xffff, 0xffff } },           // ISCL_KEYCODE_NUMPAD_COMMA    = 159
 
205
  { Qt::Key_Enter, { 0xffff, 0xffff, 0xffff } },           // ISCL_KEYCODE_NUMPAD_ENTER    = 160
 
206
  { Qt::Key_Equal, { 0x003d, 0xffff, 0xffff } },           // ISCL_KEYCODE_NUMPAD_EQUALS   = 161
 
207
  { Qt::Key_ParenLeft, { 0x0028, 0xffff, 0xffff } },       // ISCL_KEYCODE_NUMPAD_LEFT_PAREN = 162
 
208
  { Qt::Key_ParenRight, { 0x0029, 0xffff, 0xffff } },      // ISCL_KEYCODE_NUMPAD_RIGHT_PAREN = 163
 
209
  { Qt::Key_VolumeMute, { 0xffff, 0xffff, 0xffff } },      // ISCL_KEYCODE_VOLUME_MUTE     = 164
 
210
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_INFO            = 165
 
211
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CHANNEL_UP      = 166
 
212
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CHANNEL_DOWN    = 167
 
213
  { Qt::Key_ZoomIn, { 0xffff, 0xffff, 0xffff } },          // ISCL_KEYCODE_ZOOM_IN         = 168
 
214
  { Qt::Key_ZoomOut, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_ZOOM_OUT        = 169
 
215
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_TV              = 170
 
216
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_WINDOW          = 171
 
217
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_GUIDE           = 172
 
218
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_DVR             = 173
 
219
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BOOKMARK        = 174
 
220
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CAPTIONS        = 175
 
221
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_SETTINGS        = 176
 
222
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_TV_POWER        = 177
 
223
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_TV_INPUT        = 178
 
224
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_STB_POWER       = 179
 
225
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_STB_INPUT       = 180
 
226
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_AVR_POWER       = 181
 
227
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_AVR_INPUT       = 182
 
228
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_PROG_RED        = 183
 
229
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_PROG_GREEN      = 184
 
230
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_PROG_YELLOW     = 185
 
231
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_PROG_BLUE       = 186
 
232
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_APP_SWITCH      = 187
 
233
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_1        = 188
 
234
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_2        = 189
 
235
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_3        = 190
 
236
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_4        = 191
 
237
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_5        = 192
 
238
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_6        = 193
 
239
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_7        = 194
 
240
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_8        = 195
 
241
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_9        = 196
 
242
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_10       = 197
 
243
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_11       = 198
 
244
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_12       = 199
 
245
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_13       = 200
 
246
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_14       = 201
 
247
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_15       = 202
 
248
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_BUTTON_16       = 203
 
249
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_LANGUAGE_SWITCH = 204
 
250
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_MANNER_MODE     = 205
 
251
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_3D_MODE         = 206
 
252
  { Qt::Key_unknown, { 0xffff, 0xffff, 0xffff } },         // ISCL_KEYCODE_CONTACTS        = 207
 
253
  { Qt::Key_Calendar, { 0xffff, 0xffff, 0xffff } },        // ISCL_KEYCODE_CALENDAR        = 208
 
254
  { Qt::Key_Music, { 0xffff, 0xffff, 0xffff } },           // ISCL_KEYCODE_MUSIC           = 209
 
255
  { Qt::Key_Calculator, { 0xffff, 0xffff, 0xffff } }       // ISCL_KEYCODE_CALCULATOR      = 210
108
256
};
109
257
 
110
258
class QUbuntuBaseEvent : public QEvent {
228
376
  const float kMaxPressure = 1.28;
229
377
  const QRect kWindowGeometry = window->geometry();
230
378
 
231
 
  switch (event->action & U_MOTION_ACTION_MASK) {
232
 
    case U_MOTION_ACTION_MOVE: {
 
379
  switch (event->action & ISCL_MOTION_EVENT_ACTION_MASK) {
 
380
    case ISCL_MOTION_EVENT_ACTION_MOVE: {
233
381
      int eventIndex = 0;
234
382
      const int kPointerCount = event->details.motion.pointer_count;
235
383
      for (int touchIndex = 0; eventIndex < kPointerCount; touchIndex++) {
250
398
      break;
251
399
    }
252
400
 
253
 
    case U_MOTION_ACTION_DOWN: {
 
401
    case ISCL_MOTION_EVENT_ACTION_DOWN: {
254
402
      const int kTouchIndex = event->details.motion.pointer_coordinates[0].id;
255
403
      const float kX = event->details.motion.pointer_coordinates[0].raw_x;
256
404
      const float kY = event->details.motion.pointer_coordinates[0].raw_y;
265
413
      break;
266
414
    }
267
415
 
268
 
    case U_MOTION_ACTION_UP: {
 
416
    case ISCL_MOTION_EVENT_ACTION_UP: {
269
417
      const int kTouchIndex = event->details.motion.pointer_coordinates[0].id;
270
418
      touchPoints_[kTouchIndex].state = Qt::TouchPointReleased;
271
419
      break;
272
420
    }
273
421
 
274
 
    case U_MOTION_ACTION_POINTER_DOWN: {
275
 
      const int eventIndex = (event->action & U_MOTION_ACTION_POINTER_INDEX_MASK) >>
276
 
          U_MOTION_ACTION_POINTER_INDEX_SHIFT;
 
422
    case ISCL_MOTION_EVENT_ACTION_POINTER_DOWN: {
 
423
      const int eventIndex = (event->action & ISCL_MOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
 
424
          ISCL_MOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
277
425
      const int kTouchIndex = event->details.motion.pointer_coordinates[eventIndex].id;
278
426
      const float kX = event->details.motion.pointer_coordinates[eventIndex].raw_x;
279
427
      const float kY = event->details.motion.pointer_coordinates[eventIndex].raw_y;
288
436
      break;
289
437
    }
290
438
 
291
 
    case U_MOTION_ACTION_CANCEL:
292
 
    case U_MOTION_ACTION_POINTER_UP: {
293
 
      const int kEventIndex = (event->action & U_MOTION_ACTION_POINTER_INDEX_MASK) >>
294
 
          U_MOTION_ACTION_POINTER_INDEX_SHIFT;
 
439
    case ISCL_MOTION_EVENT_ACTION_CANCEL:
 
440
    case ISCL_MOTION_EVENT_ACTION_POINTER_UP: {
 
441
      const int kEventIndex = (event->action & ISCL_MOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>
 
442
          ISCL_MOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
295
443
      const int kTouchIndex = event->details.motion.pointer_coordinates[kEventIndex].id;
296
444
      touchPoints_[kTouchIndex].state = Qt::TouchPointReleased;
297
445
      break;
298
446
    }
299
447
 
300
 
    case U_MOTION_ACTION_OUTSIDE:
301
 
    case U_MOTION_ACTION_HOVER_MOVE:
302
 
    case U_MOTION_ACTION_SCROLL:
303
 
    case U_MOTION_ACTION_HOVER_ENTER:
304
 
    case U_MOTION_ACTION_HOVER_EXIT:
 
448
    case ISCL_MOTION_EVENT_ACTION_OUTSIDE:
 
449
    case ISCL_MOTION_EVENT_ACTION_HOVER_MOVE:
 
450
    case ISCL_MOTION_EVENT_ACTION_SCROLL:
 
451
    case ISCL_MOTION_EVENT_ACTION_HOVER_ENTER:
 
452
    case ISCL_MOTION_EVENT_ACTION_HOVER_EXIT:
305
453
    default: {
306
 
      DLOG("unhandled motion event action %d", event->action & U_MOTION_ACTION_MASK);
 
454
      DLOG("unhandled motion event action %d", event->action & ISCL_MOTION_EVENT_ACTION_MASK);
307
455
    }
308
456
  }
309
457
 
319
467
  QWindowSystemInterface::handleTouchEvent(window, timestamp, device, points);
320
468
}
321
469
 
322
 
namespace
323
 
{
324
 
static uint32_t translateKey(uint32_t sym, char *string, size_t size)
325
 
{
326
 
    Q_UNUSED(size);
327
 
    string[0] = '\0';
328
 
 
329
 
    if (sym >= XKB_KEY_F1 && sym <= XKB_KEY_F35)
330
 
        return Qt::Key_F1 + (int(sym) - XKB_KEY_F1);
331
 
 
332
 
    for (int i = 0; KeyTbl[i]; i += 2)
333
 
        if (sym == KeyTbl[i])
334
 
            return KeyTbl[i + 1];
335
 
 
336
 
    string[0] = sym;
337
 
    string[1] = '\0';
338
 
    return toupper(sym);
339
 
}
340
 
}
341
 
 
342
470
void QUbuntuBaseInput::dispatchKeyEvent(QWindow* window, const void* ev) {
343
471
  DLOG("QUbuntuBaseInput::dispatchKeyEvent (this=%p, window=%p, event=%p)", this, window, ev);
344
472
  const Event* event = reinterpret_cast<const Event*>(ev);
353
481
      event->details.key.event_time, event->details.key.is_system_key);
354
482
#endif
355
483
 
356
 
  ulong timestamp = event->details.key.event_time / 1000000;
357
 
  xkb_keysym_t xk_sym = (xkb_keysym_t)event->details.key.key_code;
358
 
 
359
484
  // Key modifier and unicode index mapping.
360
485
  const int kMetaState = event->meta_state;
361
486
  Qt::KeyboardModifiers modifiers = Qt::NoModifier;
362
 
  if (kMetaState & U_KEY_MODIFIER_SHIFT) {
 
487
  int unicodeIndex = 0;
 
488
  if (kMetaState & ISCL_META_SHIFT_ON) {
363
489
    modifiers |= Qt::ShiftModifier;
 
490
    unicodeIndex = 1;
364
491
  }
365
 
  if (kMetaState & U_KEY_MODIFIER_CTRL) {
 
492
  if (kMetaState & ISCL_META_CTRL_ON) {
366
493
    modifiers |= Qt::ControlModifier;
 
494
    unicodeIndex = 2;
367
495
  }
368
 
  if (kMetaState & U_KEY_MODIFIER_ALT) {
 
496
  if (kMetaState & ISCL_META_ALT_ON) {
369
497
    modifiers |= Qt::AltModifier;
 
498
    unicodeIndex = 2;
370
499
  }
371
 
  if (kMetaState & U_KEY_MODIFIER_META) {
 
500
  if (kMetaState & ISCL_META_META_ON) {
372
501
    modifiers |= Qt::MetaModifier;
 
502
    unicodeIndex = 2;
373
503
  }
374
504
 
375
 
  QEvent::Type keyType = event->action == U_KEY_ACTION_DOWN ? QEvent::KeyPress : QEvent::KeyRelease;
376
 
 
377
 
  char s[2];
378
 
  int sym = translateKey(xk_sym, s, sizeof(s));
379
 
  QString text = QString::fromLatin1(s);
380
 
 
 
505
  // Key event propagation.
 
506
  QEvent::Type keyType = kEventType[event->action];
 
507
  quint32 keyCode = kKeyCode[event->details.key.key_code].keycode;
 
508
  QString text(kKeyCode[event->details.key.key_code].unicode[unicodeIndex]);
 
509
  ulong timestamp = event->details.key.event_time / 1000000;
381
510
  QPlatformInputContext* context = QGuiApplicationPrivate::platformIntegration()->inputContext();
382
511
  if (context) {
383
 
    QKeyEvent qKeyEvent(keyType, sym, modifiers, text);
 
512
    QKeyEvent qKeyEvent(keyType, keyCode, modifiers, text);
384
513
    qKeyEvent.setTimestamp(timestamp);
385
514
    if (context->filterEvent(&qKeyEvent)) {
386
515
      DLOG("key event filtered out by input context");
387
516
      return;
388
517
    }
389
518
  }
390
 
 
391
 
  handleKeyEvent(window, timestamp, keyType, sym, modifiers, text);
 
519
  handleKeyEvent(window, timestamp, keyType, keyCode, modifiers, text);
392
520
}
393
521
 
394
522
void QUbuntuBaseInput::handleKeyEvent(