Merge lp:~timo-jyrinki/kubuntu-packaging/qtbase-fix-keymap-update-handling2 into lp:~kubuntu-packagers/kubuntu-packaging/qtbase-opensource-src
- qtbase-fix-keymap-update-handling2
- Merge into qtbase-opensource-src
Status: | Merged |
---|---|
Merged at revision: | 167 |
Proposed branch: | lp:~timo-jyrinki/kubuntu-packaging/qtbase-fix-keymap-update-handling2 |
Merge into: | lp:~kubuntu-packagers/kubuntu-packaging/qtbase-opensource-src |
Diff against target: |
709 lines (+678/-0) 4 files modified
debian/changelog (+11/-0) debian/control (+1/-0) debian/patches/Add_better_support_for_keymap_update_handling.patch (+665/-0) debian/patches/series (+1/-0) |
To merge this branch: | bzr merge lp:~timo-jyrinki/kubuntu-packaging/qtbase-fix-keymap-update-handling2 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Needs Fixing | |
Timo Jyrinki | Approve | ||
Dmitry Shachnev | Approve | ||
Review via email: mp+216815@code.launchpad.net |
Commit message
[ Dmitry Shachnev ]
* Backport upstream patch to fix issues with keymap update handling
(Add_
Debian and rebased).
* Build-depend on libxkbcommon-
<xkbcommon/
Description of the change
For U-series when it opens, via a landing silo
Dmitry Shachnev (mitya57) wrote : | # |
Timo Jyrinki (timo-jyrinki) wrote : | # |
There was a last minute 0.4.1 upload to trusty:
http://
So it's ok already now.
Dmitry Shachnev (mitya57) wrote : | # |
Indeed, I missed that. Looks good to me then.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:168
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:169
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:170
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Timo Jyrinki (timo-jyrinki) wrote : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Autolanding.
More details in the following jenkins job:
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Preview Diff
1 | === modified file 'debian/changelog' | |||
2 | --- debian/changelog 2014-04-23 05:06:52 +0000 | |||
3 | +++ debian/changelog 2014-04-24 09:08:03 +0000 | |||
4 | @@ -1,3 +1,14 @@ | |||
5 | 1 | qtbase-opensource-src (5.2.1+dfsg-1ubuntu15) UNRELEASED; urgency=medium | ||
6 | 2 | |||
7 | 3 | [ Dmitry Shachnev ] | ||
8 | 4 | * Backport upstream patch to fix issues with keymap update handling | ||
9 | 5 | (Add_better_support_for_keymap_update_handling.patch, copied from | ||
10 | 6 | Debian and rebased). | ||
11 | 7 | * Build-depend on libxkbcommon-x11-dev, as the new patch includes | ||
12 | 8 | <xkbcommon/xkbcommon-x11.h>. | ||
13 | 9 | |||
14 | 10 | -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Wed, 23 Apr 2014 05:09:08 +0000 | ||
15 | 11 | |||
16 | 1 | qtbase-opensource-src (5.2.1+dfsg-1ubuntu14) trusty; urgency=medium | 12 | qtbase-opensource-src (5.2.1+dfsg-1ubuntu14) trusty; urgency=medium |
17 | 2 | 13 | ||
18 | 3 | * libqt5gui5.symbols, libqt5opengl5.symbols: making the gl/gles symbols | 14 | * libqt5gui5.symbols, libqt5opengl5.symbols: making the gl/gles symbols |
19 | 4 | 15 | ||
20 | === modified file 'debian/control' | |||
21 | --- debian/control 2014-03-18 12:08:16 +0000 | |||
22 | +++ debian/control 2014-04-24 09:08:03 +0000 | |||
23 | @@ -55,6 +55,7 @@ | |||
24 | 55 | libxcb1-dev, | 55 | libxcb1-dev, |
25 | 56 | libxi-dev, | 56 | libxi-dev, |
26 | 57 | libxkbcommon-dev, | 57 | libxkbcommon-dev, |
27 | 58 | libxkbcommon-x11-dev, | ||
28 | 58 | libxrender-dev, | 59 | libxrender-dev, |
29 | 59 | pkg-kde-tools (>= 0.14.2), | 60 | pkg-kde-tools (>= 0.14.2), |
30 | 60 | unixodbc-dev, | 61 | unixodbc-dev, |
31 | 61 | 62 | ||
32 | === added file 'debian/patches/Add_better_support_for_keymap_update_handling.patch' | |||
33 | --- debian/patches/Add_better_support_for_keymap_update_handling.patch 1970-01-01 00:00:00 +0000 | |||
34 | +++ debian/patches/Add_better_support_for_keymap_update_handling.patch 2014-04-24 09:08:03 +0000 | |||
35 | @@ -0,0 +1,665 @@ | |||
36 | 1 | From 18e162e8640d96f2d7f2a85ef35d00350360903d Mon Sep 17 00:00:00 2001 | ||
37 | 2 | From: Gatis Paeglis <gatis.paeglis@digia.com> | ||
38 | 3 | Date: Thu, 27 Feb 2014 18:05:14 +0100 | ||
39 | 4 | Subject: [PATCH] Add better support for keymap update handling | ||
40 | 5 | |||
41 | 6 | Use the new X11 support API xkb_x11_* released in libxkbcommon version 0.4.0. | ||
42 | 7 | |||
43 | 8 | From the commit message where this API was introduced: | ||
44 | 9 | |||
45 | 10 | "These are function to create an xkb_keymap directly from XKB requests | ||
46 | 11 | to the X server. This opens up the possibility for X clients to use | ||
47 | 12 | xcb + xcb-xkb + xkbcommon as a proper replacement for Xlib + xkbfile for | ||
48 | 13 | keyboard support. | ||
49 | 14 | |||
50 | 15 | Why not just use the RMLVO that the server puts in the _XKB_RULES_NAMES | ||
51 | 16 | property? This does not account for custom keymaps, on-the-fly keymap | ||
52 | 17 | modifications, remote clients, etc., so is not a proper solution in | ||
53 | 18 | practice. Also, some servers don't even set it. Now, the client just | ||
54 | 19 | needs to recreate the keymap in response to a change in the server's | ||
55 | 20 | keymap (as Xlib clients do with XRefreshKeyboardMapping() and friends)." | ||
56 | 21 | |||
57 | 22 | This patch moves XKEYBOARD presence decision from compile time to runtime | ||
58 | 23 | for a proper remote X client support. | ||
59 | 24 | |||
60 | 25 | Task-number: QTBUG-31527 | ||
61 | 26 | Task-number: QTBUG-32760 | ||
62 | 27 | Change-Id: I4d402668cda2126ef180b27022154f96b1874b1d | ||
63 | 28 | --- | ||
64 | 29 | src/plugins/platforms/xcb/qxcbconnection.cpp | 61 ++++---- | ||
65 | 30 | src/plugins/platforms/xcb/qxcbconnection.h | 2 +- | ||
66 | 31 | src/plugins/platforms/xcb/qxcbkeyboard.cpp | 220 +++++++++++---------------- | ||
67 | 32 | src/plugins/platforms/xcb/qxcbkeyboard.h | 35 ++--- | ||
68 | 33 | src/plugins/platforms/xcb/xcb-plugin.pro | 8 +- | ||
69 | 34 | 5 files changed, 136 insertions(+), 190 deletions(-) | ||
70 | 35 | |||
71 | 36 | --- a/src/plugins/platforms/xcb/qxcbconnection.cpp | ||
72 | 37 | +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp | ||
73 | 38 | @@ -782,6 +782,7 @@ | ||
74 | 39 | xcb_timestamp_t time; | ||
75 | 40 | uint8_t deviceID; | ||
76 | 41 | } any; | ||
77 | 42 | + xcb_xkb_new_keyboard_notify_event_t new_keyboard_notify; | ||
78 | 43 | xcb_xkb_map_notify_event_t map_notify; | ||
79 | 44 | xcb_xkb_state_notify_event_t state_notify; | ||
80 | 45 | } _xkb_event; | ||
81 | 46 | @@ -812,15 +813,11 @@ | ||
82 | 47 | case XCB_EXPOSE: | ||
83 | 48 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_expose_event_t, window, handleExposeEvent); | ||
84 | 49 | case XCB_BUTTON_PRESS: | ||
85 | 50 | -#ifdef QT_NO_XKB | ||
86 | 51 | m_keyboard->updateXKBStateFromCore(((xcb_button_press_event_t *)event)->state); | ||
87 | 52 | -#endif | ||
88 | 53 | handleButtonPress(event); | ||
89 | 54 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_press_event_t, event, handleButtonPressEvent); | ||
90 | 55 | case XCB_BUTTON_RELEASE: | ||
91 | 56 | -#ifdef QT_NO_XKB | ||
92 | 57 | m_keyboard->updateXKBStateFromCore(((xcb_button_release_event_t *)event)->state); | ||
93 | 58 | -#endif | ||
94 | 59 | handleButtonRelease(event); | ||
95 | 60 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_button_release_event_t, event, handleButtonReleaseEvent); | ||
96 | 61 | case XCB_MOTION_NOTIFY: | ||
97 | 62 | @@ -828,9 +825,7 @@ | ||
98 | 63 | xcb_motion_notify_event_t *mev = (xcb_motion_notify_event_t *)event; | ||
99 | 64 | qDebug("xcb: moved mouse to %4d, %4d; button state %X", mev->event_x, mev->event_y, static_cast<unsigned int>(m_buttons)); | ||
100 | 65 | } | ||
101 | 66 | -#ifdef QT_NO_XKB | ||
102 | 67 | m_keyboard->updateXKBStateFromCore(((xcb_motion_notify_event_t *)event)->state); | ||
103 | 68 | -#endif | ||
104 | 69 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_motion_notify_event_t, event, handleMotionNotifyEvent); | ||
105 | 70 | case XCB_CONFIGURE_NOTIFY: | ||
106 | 71 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_configure_notify_event_t, event, handleConfigureNotifyEvent); | ||
107 | 72 | @@ -846,29 +841,21 @@ | ||
108 | 73 | case XCB_ENTER_NOTIFY: | ||
109 | 74 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_enter_notify_event_t, event, handleEnterNotifyEvent); | ||
110 | 75 | case XCB_LEAVE_NOTIFY: | ||
111 | 76 | -#ifdef QT_NO_XKB | ||
112 | 77 | m_keyboard->updateXKBStateFromCore(((xcb_leave_notify_event_t *)event)->state); | ||
113 | 78 | -#endif | ||
114 | 79 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_leave_notify_event_t, event, handleLeaveNotifyEvent); | ||
115 | 80 | case XCB_FOCUS_IN: | ||
116 | 81 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_in_event_t, event, handleFocusInEvent); | ||
117 | 82 | case XCB_FOCUS_OUT: | ||
118 | 83 | HANDLE_PLATFORM_WINDOW_EVENT(xcb_focus_out_event_t, event, handleFocusOutEvent); | ||
119 | 84 | case XCB_KEY_PRESS: | ||
120 | 85 | -#ifdef QT_NO_XKB | ||
121 | 86 | m_keyboard->updateXKBStateFromCore(((xcb_key_press_event_t *)event)->state); | ||
122 | 87 | -#endif | ||
123 | 88 | HANDLE_KEYBOARD_EVENT(xcb_key_press_event_t, handleKeyPressEvent); | ||
124 | 89 | case XCB_KEY_RELEASE: | ||
125 | 90 | -#ifdef QT_NO_XKB | ||
126 | 91 | m_keyboard->updateXKBStateFromCore(((xcb_key_release_event_t *)event)->state); | ||
127 | 92 | -#endif | ||
128 | 93 | HANDLE_KEYBOARD_EVENT(xcb_key_release_event_t, handleKeyReleaseEvent); | ||
129 | 94 | -#ifdef QT_NO_XKB | ||
130 | 95 | case XCB_MAPPING_NOTIFY: | ||
131 | 96 | m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event); | ||
132 | 97 | break; | ||
133 | 98 | -#endif | ||
134 | 99 | case XCB_SELECTION_REQUEST: | ||
135 | 100 | { | ||
136 | 101 | xcb_selection_request_event_t *sr = (xcb_selection_request_event_t *)event; | ||
137 | 102 | @@ -936,6 +923,8 @@ | ||
138 | 103 | _xkb_event *xkb_event = reinterpret_cast<_xkb_event *>(event); | ||
139 | 104 | if (xkb_event->any.deviceID == m_keyboard->coreDeviceId()) { | ||
140 | 105 | switch (xkb_event->any.xkbType) { | ||
141 | 106 | + // XkbNewKkdNotify and XkbMapNotify together capture all sorts of keymap | ||
142 | 107 | + // updates (e.g. xmodmap, xkbcomp, setxkbmap), with minimal redundent recompilations. | ||
143 | 108 | case XCB_XKB_STATE_NOTIFY: | ||
144 | 109 | m_keyboard->updateXKBState(&xkb_event->state_notify); | ||
145 | 110 | handled = true; | ||
146 | 111 | @@ -944,6 +933,12 @@ | ||
147 | 112 | m_keyboard->handleMappingNotifyEvent(&xkb_event->map_notify); | ||
148 | 113 | handled = true; | ||
149 | 114 | break; | ||
150 | 115 | + case XCB_XKB_NEW_KEYBOARD_NOTIFY: { | ||
151 | 116 | + xcb_xkb_new_keyboard_notify_event_t *ev = &xkb_event->new_keyboard_notify; | ||
152 | 117 | + if (ev->changed & XCB_XKB_NKN_DETAIL_KEYCODES) | ||
153 | 118 | + m_keyboard->updateKeymap(); | ||
154 | 119 | + break; | ||
155 | 120 | + } | ||
156 | 121 | default: | ||
157 | 122 | break; | ||
158 | 123 | } | ||
159 | 124 | @@ -1667,6 +1662,7 @@ | ||
160 | 125 | #ifndef QT_NO_XKB | ||
161 | 126 | const xcb_query_extension_reply_t *reply = xcb_get_extension_data(m_connection, &xcb_xkb_id); | ||
162 | 127 | if (!reply || !reply->present) { | ||
163 | 128 | + qWarning() << "Qt: XKEYBOARD extension not present on the X server."; | ||
164 | 129 | xkb_first_event = 0; | ||
165 | 130 | return; | ||
166 | 131 | } | ||
167 | 132 | @@ -1676,14 +1672,14 @@ | ||
168 | 133 | xcb_xkb_use_extension_cookie_t xkb_query_cookie; | ||
169 | 134 | xcb_xkb_use_extension_reply_t *xkb_query; | ||
170 | 135 | |||
171 | 136 | - xkb_query_cookie = xcb_xkb_use_extension(c, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); | ||
172 | 137 | + xkb_query_cookie = xcb_xkb_use_extension(c, XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION); | ||
173 | 138 | xkb_query = xcb_xkb_use_extension_reply(c, xkb_query_cookie, 0); | ||
174 | 139 | |||
175 | 140 | if (!xkb_query) { | ||
176 | 141 | qWarning("Qt: Failed to initialize XKB extension"); | ||
177 | 142 | return; | ||
178 | 143 | } else if (!xkb_query->supported) { | ||
179 | 144 | - qWarning("Qt: Unsupported XKB version (want %d %d, has %d %d)", | ||
180 | 145 | + qWarning("Qt: Unsupported XKB version (We want %d %d, but X server has %d %d)", | ||
181 | 146 | XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION, | ||
182 | 147 | xkb_query->serverMajor, xkb_query->serverMinor); | ||
183 | 148 | free(xkb_query); | ||
184 | 149 | @@ -1693,25 +1689,28 @@ | ||
185 | 150 | has_xkb = true; | ||
186 | 151 | free(xkb_query); | ||
187 | 152 | |||
188 | 153 | - uint affectMap, map; | ||
189 | 154 | - affectMap = map = XCB_XKB_MAP_PART_KEY_TYPES | | ||
190 | 155 | - XCB_XKB_MAP_PART_KEY_SYMS | | ||
191 | 156 | - XCB_XKB_MAP_PART_MODIFIER_MAP | | ||
192 | 157 | - XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | | ||
193 | 158 | - XCB_XKB_MAP_PART_KEY_ACTIONS | | ||
194 | 159 | - XCB_XKB_MAP_PART_KEY_BEHAVIORS | | ||
195 | 160 | - XCB_XKB_MAP_PART_VIRTUAL_MODS | | ||
196 | 161 | - XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP; | ||
197 | 162 | + const uint16_t required_map_parts = (XCB_XKB_MAP_PART_KEY_TYPES | | ||
198 | 163 | + XCB_XKB_MAP_PART_KEY_SYMS | | ||
199 | 164 | + XCB_XKB_MAP_PART_MODIFIER_MAP | | ||
200 | 165 | + XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | | ||
201 | 166 | + XCB_XKB_MAP_PART_KEY_ACTIONS | | ||
202 | 167 | + XCB_XKB_MAP_PART_KEY_BEHAVIORS | | ||
203 | 168 | + XCB_XKB_MAP_PART_VIRTUAL_MODS | | ||
204 | 169 | + XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP); | ||
205 | 170 | + | ||
206 | 171 | + const uint16_t required_events = (XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY | | ||
207 | 172 | + XCB_XKB_EVENT_TYPE_MAP_NOTIFY | | ||
208 | 173 | + XCB_XKB_EVENT_TYPE_STATE_NOTIFY); | ||
209 | 174 | |||
210 | 175 | - // Xkb events are reported to all interested clients without regard | ||
211 | 176 | + // XKB events are reported to all interested clients without regard | ||
212 | 177 | // to the current keyboard input focus or grab state | ||
213 | 178 | xcb_void_cookie_t select = xcb_xkb_select_events_checked(c, | ||
214 | 179 | XCB_XKB_ID_USE_CORE_KBD, | ||
215 | 180 | - XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY, | ||
216 | 181 | + required_events, | ||
217 | 182 | 0, | ||
218 | 183 | - XCB_XKB_EVENT_TYPE_STATE_NOTIFY | XCB_XKB_EVENT_TYPE_MAP_NOTIFY, | ||
219 | 184 | - affectMap, | ||
220 | 185 | - map, | ||
221 | 186 | + required_events, | ||
222 | 187 | + required_map_parts, | ||
223 | 188 | + required_map_parts, | ||
224 | 189 | 0); | ||
225 | 190 | |||
226 | 191 | xcb_generic_error_t *error = xcb_request_check(c, select); | ||
227 | 192 | --- a/src/plugins/platforms/xcb/qxcbconnection.h | ||
228 | 193 | +++ b/src/plugins/platforms/xcb/qxcbconnection.h | ||
229 | 194 | @@ -54,7 +54,7 @@ | ||
230 | 195 | #include <qpa/qwindowsysteminterface.h> | ||
231 | 196 | |||
232 | 197 | // This is needed to make Qt compile together with XKB. xkb.h is using a variable | ||
233 | 198 | -// which is called 'explicit', this is a reserved keyword in c++ */ | ||
234 | 199 | +// which is called 'explicit', this is a reserved keyword in c++ | ||
235 | 200 | #ifndef QT_NO_XKB | ||
236 | 201 | #define explicit dont_use_cxx_explicit | ||
237 | 202 | #include <xcb/xkb.h> | ||
238 | 203 | --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp | ||
239 | 204 | +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp | ||
240 | 205 | @@ -662,6 +662,7 @@ | ||
241 | 206 | void QXcbKeyboard::updateKeymap() | ||
242 | 207 | { | ||
243 | 208 | m_config = true; | ||
244 | 209 | + // set xkb context object | ||
245 | 210 | if (!xkb_context) { | ||
246 | 211 | xkb_context = xkb_context_new((xkb_context_flags)0); | ||
247 | 212 | if (!xkb_context) { | ||
248 | 213 | @@ -670,67 +671,50 @@ | ||
249 | 214 | return; | ||
250 | 215 | } | ||
251 | 216 | } | ||
252 | 217 | - readXKBConfig(); | ||
253 | 218 | - // Compile a keymap from RMLVO (rules, models, layouts, variants and options) names | ||
254 | 219 | - if (xkb_keymap) | ||
255 | 220 | - xkb_keymap_unref(xkb_keymap); | ||
256 | 221 | + // update xkb keymap object | ||
257 | 222 | + xkb_keymap_unref(xkb_keymap); | ||
258 | 223 | + xkb_keymap = 0; | ||
259 | 224 | |||
260 | 225 | - xkb_keymap = xkb_keymap_new_from_names(xkb_context, &xkb_names, (xkb_keymap_compile_flags)0); | ||
261 | 226 | + struct xkb_state *new_state = 0; | ||
262 | 227 | +#ifndef QT_NO_XKB | ||
263 | 228 | + if (connection()->hasXKB()) { | ||
264 | 229 | + xkb_keymap = xkb_x11_keymap_new_from_device(xkb_context, xcb_connection(), core_device_id, (xkb_keymap_compile_flags)0); | ||
265 | 230 | + if (xkb_keymap) { | ||
266 | 231 | + // Create a new keyboard state object for a keymap | ||
267 | 232 | + new_state = xkb_x11_state_new_from_device(xkb_keymap, xcb_connection(), core_device_id); | ||
268 | 233 | + } | ||
269 | 234 | + } | ||
270 | 235 | +#endif | ||
271 | 236 | + if (!xkb_keymap) { | ||
272 | 237 | + // Compile a keymap from RMLVO (rules, models, layouts, variants and options) names | ||
273 | 238 | + readXKBConfig(); | ||
274 | 239 | + xkb_keymap = xkb_keymap_new_from_names(xkb_context, &xkb_names, (xkb_keymap_compile_flags)0); | ||
275 | 240 | + if (xkb_keymap) | ||
276 | 241 | + new_state = xkb_state_new(xkb_keymap); | ||
277 | 242 | + } | ||
278 | 243 | |||
279 | 244 | if (!xkb_keymap) { | ||
280 | 245 | qWarning("Qt: Failed to compile a keymap"); | ||
281 | 246 | m_config = false; | ||
282 | 247 | - return; | ||
283 | 248 | } | ||
284 | 249 | - // Create a new keyboard state object for a keymap | ||
285 | 250 | - struct xkb_state *new_state = xkb_state_new(xkb_keymap); | ||
286 | 251 | if (!new_state) { | ||
287 | 252 | - qWarning("Qt: Failed to create a new keyboard state"); | ||
288 | 253 | + qWarning("Qt: Failed to create xkb state"); | ||
289 | 254 | m_config = false; | ||
290 | 255 | - return; | ||
291 | 256 | } | ||
292 | 257 | + if (!m_config) | ||
293 | 258 | + return; | ||
294 | 259 | |||
295 | 260 | - if (xkb_state) { | ||
296 | 261 | - xkb_state_unref(xkb_state); | ||
297 | 262 | - xkb_state = new_state; | ||
298 | 263 | - } else { | ||
299 | 264 | - xkb_state = new_state; | ||
300 | 265 | -#ifndef QT_NO_XKB | ||
301 | 266 | - // get initial state from the X server (and keep it up-to-date at all times) | ||
302 | 267 | - xcb_xkb_get_state_cookie_t state; | ||
303 | 268 | - xcb_xkb_get_state_reply_t *init_state; | ||
304 | 269 | - | ||
305 | 270 | - xcb_connection_t *c = xcb_connection(); | ||
306 | 271 | - state = xcb_xkb_get_state(c, XCB_XKB_ID_USE_CORE_KBD); | ||
307 | 272 | - init_state = xcb_xkb_get_state_reply(c, state, 0); | ||
308 | 273 | - if (!init_state) { | ||
309 | 274 | - qWarning("Qt: couldn't retrieve an initial keyboard state"); | ||
310 | 275 | - return; | ||
311 | 276 | - } | ||
312 | 277 | - /* The xkb keyboard state is comprised of the state of all keyboard modifiers, | ||
313 | 278 | - the keyboard group, and the state of the pointer buttons */ | ||
314 | 279 | - xkb_state_update_mask(xkb_state, | ||
315 | 280 | - init_state->baseMods, | ||
316 | 281 | - init_state->latchedMods, | ||
317 | 282 | - init_state->lockedMods, | ||
318 | 283 | - init_state->baseGroup, | ||
319 | 284 | - init_state->latchedGroup, | ||
320 | 285 | - init_state->lockedGroup); | ||
321 | 286 | - free(init_state); | ||
322 | 287 | -#else | ||
323 | 288 | + // update xkb state object | ||
324 | 289 | + xkb_state_unref(xkb_state); | ||
325 | 290 | + xkb_state = new_state; | ||
326 | 291 | + if (!connection()->hasXKB()) | ||
327 | 292 | updateXKBMods(); | ||
328 | 293 | -#endif | ||
329 | 294 | - } | ||
330 | 295 | } | ||
331 | 296 | |||
332 | 297 | #ifndef QT_NO_XKB | ||
333 | 298 | void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state) | ||
334 | 299 | { | ||
335 | 300 | - if (!m_config) | ||
336 | 301 | - return; | ||
337 | 302 | - | ||
338 | 303 | - if (connection()->hasXKB()) { | ||
339 | 304 | - | ||
340 | 305 | + if (m_config && connection()->hasXKB()) { | ||
341 | 306 | const xkb_state_component newState | ||
342 | 307 | = xkb_state_update_mask(xkb_state, | ||
343 | 308 | state->baseMods, | ||
344 | 309 | @@ -745,35 +729,34 @@ | ||
345 | 310 | } | ||
346 | 311 | } | ||
347 | 312 | } | ||
348 | 313 | +#endif | ||
349 | 314 | |||
350 | 315 | -#else | ||
351 | 316 | void QXcbKeyboard::updateXKBStateFromCore(quint16 state) | ||
352 | 317 | { | ||
353 | 318 | - if (!m_config) | ||
354 | 319 | - return; | ||
355 | 320 | + if (m_config && !connection()->hasXKB()) { | ||
356 | 321 | + const quint32 modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED); | ||
357 | 322 | + const quint32 modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED); | ||
358 | 323 | + const quint32 modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED); | ||
359 | 324 | + const quint32 xkbMask = xkbModMask(state); | ||
360 | 325 | + | ||
361 | 326 | + const quint32 latched = modsLatched & xkbMask; | ||
362 | 327 | + const quint32 locked = modsLocked & xkbMask; | ||
363 | 328 | + quint32 depressed = modsDepressed & xkbMask; | ||
364 | 329 | + // set modifiers in depressed if they don't appear in any of the final masks | ||
365 | 330 | + depressed |= ~(depressed | latched | locked) & xkbMask; | ||
366 | 331 | |||
367 | 332 | - const quint32 modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED); | ||
368 | 333 | - const quint32 modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED); | ||
369 | 334 | - const quint32 modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED); | ||
370 | 335 | - const quint32 xkbMask = xkbModMask(state); | ||
371 | 336 | - | ||
372 | 337 | - const quint32 latched = modsLatched & xkbMask; | ||
373 | 338 | - const quint32 locked = modsLocked & xkbMask; | ||
374 | 339 | - quint32 depressed = modsDepressed & xkbMask; | ||
375 | 340 | - // set modifiers in depressed if they don't appear in any of the final masks | ||
376 | 341 | - depressed |= ~(depressed | latched | locked) & xkbMask; | ||
377 | 342 | - | ||
378 | 343 | - const xkb_state_component newState | ||
379 | 344 | - = xkb_state_update_mask(xkb_state, | ||
380 | 345 | - depressed, | ||
381 | 346 | - latched, | ||
382 | 347 | - locked, | ||
383 | 348 | - 0, | ||
384 | 349 | - 0, | ||
385 | 350 | - (state >> 13) & 3); // bits 13 and 14 report the state keyboard group | ||
386 | 351 | + const xkb_state_component newState | ||
387 | 352 | + = xkb_state_update_mask(xkb_state, | ||
388 | 353 | + depressed, | ||
389 | 354 | + latched, | ||
390 | 355 | + locked, | ||
391 | 356 | + 0, | ||
392 | 357 | + 0, | ||
393 | 358 | + (state >> 13) & 3); // bits 13 and 14 report the state keyboard group | ||
394 | 359 | |||
395 | 360 | - if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { | ||
396 | 361 | - //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); | ||
397 | 362 | + if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { | ||
398 | 363 | + //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); | ||
399 | 364 | + } | ||
400 | 365 | } | ||
401 | 366 | } | ||
402 | 367 | |||
403 | 368 | @@ -803,16 +786,15 @@ | ||
404 | 369 | |||
405 | 370 | void QXcbKeyboard::updateXKBMods() | ||
406 | 371 | { | ||
407 | 372 | - xkb_mods.shift = xkb_map_mod_get_index(xkb_keymap, XKB_MOD_NAME_SHIFT); | ||
408 | 373 | - xkb_mods.lock = xkb_map_mod_get_index(xkb_keymap, XKB_MOD_NAME_CAPS); | ||
409 | 374 | - xkb_mods.control = xkb_map_mod_get_index(xkb_keymap, XKB_MOD_NAME_CTRL); | ||
410 | 375 | - xkb_mods.mod1 = xkb_map_mod_get_index(xkb_keymap, "Mod1"); | ||
411 | 376 | - xkb_mods.mod2 = xkb_map_mod_get_index(xkb_keymap, "Mod2"); | ||
412 | 377 | - xkb_mods.mod3 = xkb_map_mod_get_index(xkb_keymap, "Mod3"); | ||
413 | 378 | - xkb_mods.mod4 = xkb_map_mod_get_index(xkb_keymap, "Mod4"); | ||
414 | 379 | - xkb_mods.mod5 = xkb_map_mod_get_index(xkb_keymap, "Mod5"); | ||
415 | 380 | + xkb_mods.shift = xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_SHIFT); | ||
416 | 381 | + xkb_mods.lock = xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_CAPS); | ||
417 | 382 | + xkb_mods.control = xkb_keymap_mod_get_index(xkb_keymap, XKB_MOD_NAME_CTRL); | ||
418 | 383 | + xkb_mods.mod1 = xkb_keymap_mod_get_index(xkb_keymap, "Mod1"); | ||
419 | 384 | + xkb_mods.mod2 = xkb_keymap_mod_get_index(xkb_keymap, "Mod2"); | ||
420 | 385 | + xkb_mods.mod3 = xkb_keymap_mod_get_index(xkb_keymap, "Mod3"); | ||
421 | 386 | + xkb_mods.mod4 = xkb_keymap_mod_get_index(xkb_keymap, "Mod4"); | ||
422 | 387 | + xkb_mods.mod5 = xkb_keymap_mod_get_index(xkb_keymap, "Mod5"); | ||
423 | 388 | } | ||
424 | 389 | -#endif | ||
425 | 390 | |||
426 | 391 | QList<int> QXcbKeyboard::possibleKeys(const QKeyEvent *event) const | ||
427 | 392 | { | ||
428 | 393 | @@ -897,10 +879,8 @@ | ||
429 | 394 | result += (qtKey + mods); | ||
430 | 395 | } | ||
431 | 396 | } | ||
432 | 397 | - if (kb_state) | ||
433 | 398 | - xkb_state_unref(kb_state); | ||
434 | 399 | - if (fallback_keymap) | ||
435 | 400 | - xkb_keymap_unref(fallback_keymap); | ||
436 | 401 | + xkb_state_unref(kb_state); | ||
437 | 402 | + xkb_keymap_unref(fallback_keymap); | ||
438 | 403 | |||
439 | 404 | return result; | ||
440 | 405 | } | ||
441 | 406 | @@ -967,58 +947,41 @@ | ||
442 | 407 | , xkb_context(0) | ||
443 | 408 | , xkb_keymap(0) | ||
444 | 409 | , xkb_state(0) | ||
445 | 410 | -#ifndef QT_NO_XKB | ||
446 | 411 | , core_device_id(0) | ||
447 | 412 | -#endif | ||
448 | 413 | { | ||
449 | 414 | memset(&xkb_names, 0, sizeof(xkb_names)); | ||
450 | 415 | - updateKeymap(); | ||
451 | 416 | #ifndef QT_NO_XKB | ||
452 | 417 | if (connection->hasXKB()) { | ||
453 | 418 | - | ||
454 | 419 | updateVModMapping(); | ||
455 | 420 | updateVModToRModMapping(); | ||
456 | 421 | - | ||
457 | 422 | - // get the core keyboard id | ||
458 | 423 | - xcb_xkb_get_device_info_cookie_t device_id_cookie; | ||
459 | 424 | - xcb_xkb_get_device_info_reply_t *device_id; | ||
460 | 425 | - | ||
461 | 426 | - device_id_cookie = xcb_xkb_get_device_info(xcb_connection(), | ||
462 | 427 | - XCB_XKB_ID_USE_CORE_KBD, | ||
463 | 428 | - 0, 0, 0, 0, 0, 0); | ||
464 | 429 | - | ||
465 | 430 | - device_id = xcb_xkb_get_device_info_reply(xcb_connection(), device_id_cookie, 0); | ||
466 | 431 | - if (!device_id) { | ||
467 | 432 | + core_device_id = xkb_x11_get_core_keyboard_device_id(xcb_connection()); | ||
468 | 433 | + if (core_device_id == -1) { | ||
469 | 434 | qWarning("Qt: couldn't get core keyboard device info"); | ||
470 | 435 | return; | ||
471 | 436 | } | ||
472 | 437 | - | ||
473 | 438 | - core_device_id = device_id->deviceID; | ||
474 | 439 | - free(device_id); | ||
475 | 440 | + } else { | ||
476 | 441 | +#endif | ||
477 | 442 | + m_key_symbols = xcb_key_symbols_alloc(xcb_connection()); | ||
478 | 443 | + updateModifiers(); | ||
479 | 444 | +#ifndef QT_NO_XKB | ||
480 | 445 | } | ||
481 | 446 | -#else | ||
482 | 447 | - m_key_symbols = xcb_key_symbols_alloc(xcb_connection()); | ||
483 | 448 | - updateModifiers(); | ||
484 | 449 | #endif | ||
485 | 450 | + updateKeymap(); | ||
486 | 451 | } | ||
487 | 452 | |||
488 | 453 | QXcbKeyboard::~QXcbKeyboard() | ||
489 | 454 | { | ||
490 | 455 | - if (xkb_state) | ||
491 | 456 | - xkb_state_unref(xkb_state); | ||
492 | 457 | - if (xkb_keymap) | ||
493 | 458 | - xkb_keymap_unref(xkb_keymap); | ||
494 | 459 | - if (xkb_context) | ||
495 | 460 | - xkb_context_unref(xkb_context); | ||
496 | 461 | -#ifdef QT_NO_XKB | ||
497 | 462 | - xcb_key_symbols_free(m_key_symbols); | ||
498 | 463 | -#endif | ||
499 | 464 | + xkb_state_unref(xkb_state); | ||
500 | 465 | + xkb_keymap_unref(xkb_keymap); | ||
501 | 466 | + xkb_context_unref(xkb_context); | ||
502 | 467 | + if (!connection()->hasXKB()) | ||
503 | 468 | + xcb_key_symbols_free(m_key_symbols); | ||
504 | 469 | clearXKBConfig(); | ||
505 | 470 | } | ||
506 | 471 | |||
507 | 472 | -#ifndef QT_NO_XKB | ||
508 | 473 | void QXcbKeyboard::updateVModMapping() | ||
509 | 474 | { | ||
510 | 475 | +#ifndef QT_NO_XKB | ||
511 | 476 | xcb_xkb_get_names_cookie_t names_cookie; | ||
512 | 477 | xcb_xkb_get_names_reply_t *name_reply; | ||
513 | 478 | xcb_xkb_get_names_value_list_t names_list; | ||
514 | 479 | @@ -1082,10 +1045,12 @@ | ||
515 | 480 | } | ||
516 | 481 | |||
517 | 482 | free(name_reply); | ||
518 | 483 | +#endif | ||
519 | 484 | } | ||
520 | 485 | |||
521 | 486 | void QXcbKeyboard::updateVModToRModMapping() | ||
522 | 487 | { | ||
523 | 488 | +#ifndef QT_NO_XKB | ||
524 | 489 | xcb_xkb_get_map_cookie_t map_cookie; | ||
525 | 490 | xcb_xkb_get_map_reply_t *map_reply; | ||
526 | 491 | xcb_xkb_get_map_map_t map; | ||
527 | 492 | @@ -1148,8 +1113,9 @@ | ||
528 | 493 | |||
529 | 494 | free(map_reply); | ||
530 | 495 | resolveMaskConflicts(); | ||
531 | 496 | +#endif | ||
532 | 497 | } | ||
533 | 498 | -#else | ||
534 | 499 | + | ||
535 | 500 | void QXcbKeyboard::updateModifiers() | ||
536 | 501 | { | ||
537 | 502 | // The core protocol does not provide a convenient way to determine the mapping | ||
538 | 503 | @@ -1213,7 +1179,6 @@ | ||
539 | 504 | free(modMapReply); | ||
540 | 505 | resolveMaskConflicts(); | ||
541 | 506 | } | ||
542 | 507 | -#endif | ||
543 | 508 | |||
544 | 509 | void QXcbKeyboard::resolveMaskConflicts() | ||
545 | 510 | { | ||
546 | 511 | @@ -1296,17 +1261,9 @@ | ||
547 | 512 | |||
548 | 513 | if (!m_config) | ||
549 | 514 | return; | ||
550 | 515 | - // It is crucial the order of xkb_state_key_get_one_sym & | ||
551 | 516 | - // xkb_state_update_key operations is not reversed! | ||
552 | 517 | + | ||
553 | 518 | + // It is crucial the order of xkb_state_key_get_one_sym & xkb_state_update_key operations is not reversed! | ||
554 | 519 | xcb_keysym_t sym = xkb_state_key_get_one_sym(xkb_state, code); | ||
555 | 520 | -#ifdef QT_NO_XKB | ||
556 | 521 | - enum xkb_key_direction direction; | ||
557 | 522 | - if (type == QEvent::KeyPress) | ||
558 | 523 | - direction = XKB_KEY_DOWN; | ||
559 | 524 | - else | ||
560 | 525 | - direction = XKB_KEY_UP; | ||
561 | 526 | - xkb_state_update_key(xkb_state, code, direction); | ||
562 | 527 | -#endif | ||
563 | 528 | |||
564 | 529 | QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext(); | ||
565 | 530 | QMetaMethod method; | ||
566 | 531 | @@ -1442,17 +1399,14 @@ | ||
567 | 532 | void QXcbKeyboard::handleMappingNotifyEvent(const void *event) | ||
568 | 533 | { | ||
569 | 534 | updateKeymap(); | ||
570 | 535 | -#ifdef QT_NO_XKB | ||
571 | 536 | - void *ev = const_cast<void *>(event); | ||
572 | 537 | - xcb_refresh_keyboard_mapping(m_key_symbols, static_cast<xcb_mapping_notify_event_t *>(ev)); | ||
573 | 538 | - updateModifiers(); | ||
574 | 539 | -#else | ||
575 | 540 | - Q_UNUSED(event) | ||
576 | 541 | if (connection()->hasXKB()) { | ||
577 | 542 | updateVModMapping(); | ||
578 | 543 | updateVModToRModMapping(); | ||
579 | 544 | + } else { | ||
580 | 545 | + void *ev = const_cast<void *>(event); | ||
581 | 546 | + xcb_refresh_keyboard_mapping(m_key_symbols, static_cast<xcb_mapping_notify_event_t *>(ev)); | ||
582 | 547 | + updateModifiers(); | ||
583 | 548 | } | ||
584 | 549 | -#endif | ||
585 | 550 | } | ||
586 | 551 | |||
587 | 552 | QT_END_NAMESPACE | ||
588 | 553 | --- a/src/plugins/platforms/xcb/qxcbkeyboard.h | ||
589 | 554 | +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h | ||
590 | 555 | @@ -44,11 +44,15 @@ | ||
591 | 556 | |||
592 | 557 | #include "qxcbobject.h" | ||
593 | 558 | |||
594 | 559 | -#ifdef QT_NO_XKB | ||
595 | 560 | #include <xcb/xcb_keysyms.h> | ||
596 | 561 | -#endif | ||
597 | 562 | |||
598 | 563 | #include <xkbcommon/xkbcommon.h> | ||
599 | 564 | +#ifndef QT_NO_XKB | ||
600 | 565 | +// note: extern won't be needed from libxkbcommon 0.4.1 and above | ||
601 | 566 | +extern "C" { | ||
602 | 567 | +#include <xkbcommon/xkbcommon-x11.h> | ||
603 | 568 | +} | ||
604 | 569 | +#endif | ||
605 | 570 | |||
606 | 571 | #include <QEvent> | ||
607 | 572 | |||
608 | 573 | @@ -65,41 +69,37 @@ | ||
609 | 574 | |||
610 | 575 | void handleKeyPressEvent(QXcbWindowEventListener *eventListener, const xcb_key_press_event_t *event); | ||
611 | 576 | void handleKeyReleaseEvent(QXcbWindowEventListener *eventListener, const xcb_key_release_event_t *event); | ||
612 | 577 | - | ||
613 | 578 | void handleMappingNotifyEvent(const void *event); | ||
614 | 579 | |||
615 | 580 | Qt::KeyboardModifiers translateModifiers(int s) const; | ||
616 | 581 | - | ||
617 | 582 | void updateKeymap(); | ||
618 | 583 | QList<int> possibleKeys(const QKeyEvent *e) const; | ||
619 | 584 | |||
620 | 585 | -#ifdef QT_NO_XKB | ||
621 | 586 | - void updateXKBStateFromCore(quint16 state); | ||
622 | 587 | + // when XKEYBOARD not present on the X server | ||
623 | 588 | void updateXKBMods(); | ||
624 | 589 | quint32 xkbModMask(quint16 state); | ||
625 | 590 | -#else | ||
626 | 591 | - int coreDeviceId() { return core_device_id; } | ||
627 | 592 | + void updateXKBStateFromCore(quint16 state); | ||
628 | 593 | + // when XKEYBOARD is present on the X server | ||
629 | 594 | + int coreDeviceId() const { return core_device_id; } | ||
630 | 595 | +#ifndef QT_NO_XKB | ||
631 | 596 | void updateXKBState(xcb_xkb_state_notify_event_t *state); | ||
632 | 597 | #endif | ||
633 | 598 | |||
634 | 599 | protected: | ||
635 | 600 | void handleKeyEvent(QWindow *window, QEvent::Type type, xcb_keycode_t code, quint16 state, xcb_timestamp_t time); | ||
636 | 601 | - void resolveMaskConflicts(); | ||
637 | 602 | |||
638 | 603 | + void resolveMaskConflicts(); | ||
639 | 604 | QString keysymToUnicode(xcb_keysym_t sym) const; | ||
640 | 605 | - | ||
641 | 606 | int keysymToQtKey(xcb_keysym_t keysym) const; | ||
642 | 607 | int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modifiers, QString text) const; | ||
643 | 608 | |||
644 | 609 | void readXKBConfig(); | ||
645 | 610 | void clearXKBConfig(); | ||
646 | 611 | - | ||
647 | 612 | -#ifdef QT_NO_XKB | ||
648 | 613 | + // when XKEYBOARD not present on the X server | ||
649 | 614 | void updateModifiers(); | ||
650 | 615 | -#else | ||
651 | 616 | + // when XKEYBOARD is present on the X server | ||
652 | 617 | void updateVModMapping(); | ||
653 | 618 | void updateVModToRModMapping(); | ||
654 | 619 | -#endif | ||
655 | 620 | |||
656 | 621 | private: | ||
657 | 622 | bool m_config; | ||
658 | 623 | @@ -120,9 +120,8 @@ | ||
659 | 624 | |||
660 | 625 | _mod_masks rmod_masks; | ||
661 | 626 | |||
662 | 627 | -#ifdef QT_NO_XKB | ||
663 | 628 | + // when XKEYBOARD not present on the X server | ||
664 | 629 | xcb_key_symbols_t *m_key_symbols; | ||
665 | 630 | - | ||
666 | 631 | struct _xkb_mods { | ||
667 | 632 | xkb_mod_index_t shift; | ||
668 | 633 | xkb_mod_index_t lock; | ||
669 | 634 | @@ -133,12 +132,10 @@ | ||
670 | 635 | xkb_mod_index_t mod4; | ||
671 | 636 | xkb_mod_index_t mod5; | ||
672 | 637 | }; | ||
673 | 638 | - | ||
674 | 639 | _xkb_mods xkb_mods; | ||
675 | 640 | -#else | ||
676 | 641 | + // when XKEYBOARD is present on the X server | ||
677 | 642 | _mod_masks vmod_masks; | ||
678 | 643 | int core_device_id; | ||
679 | 644 | -#endif | ||
680 | 645 | }; | ||
681 | 646 | |||
682 | 647 | QT_END_NAMESPACE | ||
683 | 648 | --- a/src/plugins/platforms/xcb/xcb-plugin.pro | ||
684 | 649 | +++ b/src/plugins/platforms/xcb/xcb-plugin.pro | ||
685 | 650 | @@ -121,13 +121,9 @@ | ||
686 | 651 | INCLUDEPATH += $$XCB_DIR/include $$XCB_DIR/sysinclude | ||
687 | 652 | LIBS += -lxcb -L$$OUT_PWD/xcb-static -lxcb-static | ||
688 | 653 | } else { | ||
689 | 654 | - LIBS += -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr | ||
690 | 655 | + LIBS += -lxcb -lxcb-image -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shm -lxcb-randr -lxcb-keysyms | ||
691 | 656 | !contains(DEFINES, QT_NO_SHAPE):LIBS += -lxcb-shape | ||
692 | 657 | - contains(DEFINES, QT_NO_XKB) { | ||
693 | 658 | - LIBS += -lxcb-keysyms | ||
694 | 659 | - } else { | ||
695 | 660 | - LIBS += -lxcb-xkb | ||
696 | 661 | - } | ||
697 | 662 | + !contains(DEFINES, QT_NO_XKB):LIBS += -lxcb-xkb -lxkbcommon-x11 | ||
698 | 663 | } | ||
699 | 664 | |||
700 | 665 | # libxkbcommon | ||
701 | 0 | 666 | ||
702 | === modified file 'debian/patches/series' | |||
703 | --- debian/patches/series 2014-04-01 12:42:46 +0000 | |||
704 | +++ debian/patches/series 2014-04-24 09:08:03 +0000 | |||
705 | @@ -29,3 +29,4 @@ | |||
706 | 29 | Minor-optimization-for-QTextEngine-shapeText.patch | 29 | Minor-optimization-for-QTextEngine-shapeText.patch |
707 | 30 | HarfBuzz-NG-Hide-characters-that-should-normally-be-.patch | 30 | HarfBuzz-NG-Hide-characters-that-should-normally-be-.patch |
708 | 31 | When-looking-up-the-window-hierarchy-stop-at-foreign.patch | 31 | When-looking-up-the-window-hierarchy-stop-at-foreign.patch |
709 | 32 | Add_better_support_for_keymap_update_handling.patch |
> For U-series when it opens, via a landing silo
We will be able to land this not when U opens, but …
> Build-depend on libxkbcommon- x11-dev
… when that package becomes available in Ubuntu (via a Debian merge).