1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the plugins of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include "qdirectfbconvenience.h"
41 #include "qdirectfbblitter.h"
42 #include "qdirectfbscreen.h"
43
44 #include <private/qpixmap_blitter_p.h>
45
46 #include <QtGui/QWindow>
47 #include <QtGui/QScreen>
48
49 QT_BEGIN_NAMESPACE
50
dfbInterface()51 IDirectFB *QDirectFbConvenience::dfbInterface()
52 {
53 static IDirectFB *dfb = 0;
54 if (!dfb) {
55 DFBResult result = DirectFBCreate(&dfb);
56 if (result != DFB_OK) {
57 DirectFBErrorFatal("QDirectFBConvenience: error creating DirectFB interface", result);
58 return 0;
59 }
60 }
61 return dfb;
62 }
63
dfbDisplayLayer(int display)64 IDirectFBDisplayLayer *QDirectFbConvenience::dfbDisplayLayer(int display)
65 {
66 IDirectFBDisplayLayer *layer;
67 DFBResult result = QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(),display,&layer);
68 if (result != DFB_OK)
69 DirectFBErrorFatal("QDirectFbConvenience: "
70 "Unable to get primary display layer!", result);
71 return layer;
72 }
73
imageFormatFromSurfaceFormat(const DFBSurfacePixelFormat format,const DFBSurfaceCapabilities caps)74 QImage::Format QDirectFbConvenience::imageFormatFromSurfaceFormat(const DFBSurfacePixelFormat format, const DFBSurfaceCapabilities caps)
75 {
76 switch (format) {
77 case DSPF_LUT8:
78 return QImage::Format_Indexed8;
79 case DSPF_RGB24:
80 return QImage::Format_RGB888;
81 case DSPF_ARGB4444:
82 return QImage::Format_ARGB4444_Premultiplied;
83 case DSPF_RGB444:
84 return QImage::Format_RGB444;
85 case DSPF_RGB555:
86 case DSPF_ARGB1555:
87 return QImage::Format_RGB555;
88 case DSPF_RGB16:
89 return QImage::Format_RGB16;
90 case DSPF_ARGB6666:
91 return QImage::Format_ARGB6666_Premultiplied;
92 case DSPF_RGB18:
93 return QImage::Format_RGB666;
94 case DSPF_RGB32:
95 return QImage::Format_RGB32;
96 case DSPF_ARGB: {
97 if (caps & DSCAPS_PREMULTIPLIED)
98 return QImage::Format_ARGB32_Premultiplied;
99 else return QImage::Format_ARGB32; }
100 default:
101 break;
102 }
103 return QImage::Format_Invalid;
104
105 }
106
colorDepthForSurface(const DFBSurfacePixelFormat format)107 int QDirectFbConvenience::colorDepthForSurface(const DFBSurfacePixelFormat format)
108 {
109 return ((0x1f << 7) & format) >> 7;
110 }
111
112 /**
113 * This is borrowing the reference of the QDirectFbBlitter. You may not store this
114 * pointer as a class member but must only use it locally.
115 */
dfbSurfaceForPlatformPixmap(QPlatformPixmap * handle)116 IDirectFBSurface *QDirectFbConvenience::dfbSurfaceForPlatformPixmap(QPlatformPixmap *handle)
117 {
118 QBlittablePlatformPixmap *blittablePmData = static_cast<QBlittablePlatformPixmap *>(handle);
119 if (blittablePmData) {
120 QBlittable *blittable = blittablePmData->blittable();
121 QDirectFbBlitter *dfbBlitter = static_cast<QDirectFbBlitter *>(blittable);
122 return dfbBlitter->m_surface.data();
123 }
124 return 0;
125 }
126
mouseButton(DFBInputDeviceButtonIdentifier identifier)127 Qt::MouseButton QDirectFbConvenience::mouseButton(DFBInputDeviceButtonIdentifier identifier)
128 {
129 // The Enum contains values for DIBI_FIRST (= DIBI_LEFT), DIBI_LAST (= 0x1f,) and
130 // just 3 enumerated Mouse Buttons. To convert into *ALL* possible Qt::MoueButton values,
131 // the parameter is cast as integer.
132
133 switch (int(identifier)) {
134 case DIBI_LEFT: // value is 0x00
135 return Qt::LeftButton;
136 case DIBI_RIGHT: // value is 0x01
137 return Qt::RightButton;
138 case DIBI_MIDDLE: // value is 0x02
139 return Qt::MiddleButton;
140 case 0x03:
141 return Qt::BackButton;
142 case 0x04:
143 return Qt::ForwardButton;
144 case 0x05:
145 return Qt::ExtraButton3;
146 case 0x06:
147 return Qt::ExtraButton4;
148 case 0x07:
149 return Qt::ExtraButton5;
150 case 0x08:
151 return Qt::ExtraButton6;
152 case 0x09:
153 return Qt::ExtraButton7;
154 case 0x0a:
155 return Qt::ExtraButton8;
156 case 0x0b:
157 return Qt::ExtraButton9;
158 case 0x0c:
159 return Qt::ExtraButton10;
160 case 0x0d:
161 return Qt::ExtraButton11;
162 case 0x0e:
163 return Qt::ExtraButton12;
164 case 0x0f:
165 return Qt::ExtraButton13;
166 case 0x10:
167 return Qt::ExtraButton14;
168 case 0x11:
169 return Qt::ExtraButton15;
170 case 0x12:
171 return Qt::ExtraButton16;
172 case 0x13:
173 return Qt::ExtraButton17;
174 case 0x14:
175 return Qt::ExtraButton18;
176 case 0x15:
177 return Qt::ExtraButton19;
178 case 0x16:
179 return Qt::ExtraButton20;
180 case 0x17:
181 return Qt::ExtraButton21;
182 case 0x18:
183 return Qt::ExtraButton22;
184 case 0x19:
185 return Qt::ExtraButton23;
186 case 0x1a:
187 return Qt::ExtraButton24;
188 default:
189 return Qt::NoButton;
190 }
191 }
192
mouseButtons(DFBInputDeviceButtonMask mask)193 Qt::MouseButtons QDirectFbConvenience::mouseButtons(DFBInputDeviceButtonMask mask)
194 {
195 Qt::MouseButtons buttons = Qt::NoButton;
196
197 if (mask & DIBM_LEFT) {
198 buttons |= Qt::LeftButton;
199 }
200 if (mask & DIBM_MIDDLE) {
201 buttons |= Qt::MiddleButton;
202 }
203 if (mask & DIBM_RIGHT) {
204 buttons |= Qt::RightButton;
205 }
206 return buttons;
207 }
208
keyboardModifiers(DFBInputDeviceModifierMask mask)209 Qt::KeyboardModifiers QDirectFbConvenience::keyboardModifiers(DFBInputDeviceModifierMask mask)
210 {
211 Qt::KeyboardModifiers modifiers = Qt::NoModifier;
212
213 if (mask & DIMM_SHIFT) {
214 modifiers |= Qt::ShiftModifier;
215 }
216 if (mask & DIMM_ALT) {
217 modifiers |= Qt::AltModifier;
218 }
219 if (mask & DIMM_ALTGR) {
220 modifiers |= Qt::MetaModifier;
221 }
222 if (mask & DIMM_CONTROL) {
223 modifiers |= Qt::ControlModifier;
224 }
225 if (mask & DIMM_META) {
226 modifiers |= Qt::MetaModifier;
227 }
228 return modifiers;
229 }
230
eventType(DFBWindowEventType type)231 QEvent::Type QDirectFbConvenience::eventType(DFBWindowEventType type)
232 {
233 switch(type) {
234 case DWET_BUTTONDOWN:
235 return QEvent::MouseButtonPress;
236 case DWET_BUTTONUP:
237 return QEvent::MouseButtonRelease;
238 case DWET_MOTION:
239 return QEvent::MouseMove;
240 case DWET_WHEEL:
241 return QEvent::Wheel;
242 case DWET_KEYDOWN:
243 return QEvent::KeyPress;
244 case DWET_KEYUP:
245 return QEvent::KeyRelease;
246 default:
247 return QEvent::None;
248 }
249 }
250 QDirectFbKeyMap *QDirectFbConvenience::dfbKeymap = 0;
keyMap()251 QDirectFbKeyMap *QDirectFbConvenience::keyMap()
252 {
253 if (!dfbKeymap)
254 dfbKeymap = new QDirectFbKeyMap();
255 return dfbKeymap;
256 }
257
QDirectFbKeyMap()258 QDirectFbKeyMap::QDirectFbKeyMap()
259 {
260 insert(DIKS_BACKSPACE , Qt::Key_Backspace);
261 insert(DIKS_TAB , Qt::Key_Tab);
262 insert(DIKS_RETURN , Qt::Key_Return);
263 insert(DIKS_ESCAPE , Qt::Key_Escape);
264 insert(DIKS_DELETE , Qt::Key_Delete);
265
266 insert(DIKS_CURSOR_LEFT , Qt::Key_Left);
267 insert(DIKS_CURSOR_RIGHT , Qt::Key_Right);
268 insert(DIKS_CURSOR_UP , Qt::Key_Up);
269 insert(DIKS_CURSOR_DOWN , Qt::Key_Down);
270 insert(DIKS_INSERT , Qt::Key_Insert);
271 insert(DIKS_HOME , Qt::Key_Home);
272 insert(DIKS_END , Qt::Key_End);
273 insert(DIKS_PAGE_UP , Qt::Key_PageUp);
274 insert(DIKS_PAGE_DOWN , Qt::Key_PageDown);
275 insert(DIKS_PRINT , Qt::Key_Print);
276 insert(DIKS_PAUSE , Qt::Key_Pause);
277 insert(DIKS_SELECT , Qt::Key_Select);
278 insert(DIKS_GOTO , Qt::Key_OpenUrl);
279 insert(DIKS_CLEAR , Qt::Key_Clear);
280 insert(DIKS_MENU , Qt::Key_Menu);
281 insert(DIKS_HELP , Qt::Key_Help);
282 insert(DIKS_INFO , Qt::Key_Info);
283 insert(DIKS_EXIT , Qt::Key_Exit);
284 insert(DIKS_SETUP , Qt::Key_Settings);
285
286 insert(DIKS_CD , Qt::Key_CD);
287 insert(DIKS_INTERNET , Qt::Key_HomePage);
288 insert(DIKS_MAIL , Qt::Key_LaunchMail);
289 insert(DIKS_FAVORITES , Qt::Key_Favorites);
290 insert(DIKS_PHONE , Qt::Key_Phone);
291 insert(DIKS_PROGRAM , Qt::Key_Guide);
292 insert(DIKS_TIME , Qt::Key_Time);
293
294 insert(DIKS_RED , Qt::Key_Red);
295 insert(DIKS_GREEN , Qt::Key_Green);
296 insert(DIKS_YELLOW , Qt::Key_Yellow);
297 insert(DIKS_BLUE , Qt::Key_Blue);
298
299 insert(DIKS_CHANNEL_UP , Qt::Key_ChannelUp);
300 insert(DIKS_CHANNEL_DOWN , Qt::Key_ChannelDown);
301
302 insert(DIKS_BACK , Qt::Key_Back);
303 insert(DIKS_FORWARD , Qt::Key_Forward);
304 insert(DIKS_VOLUME_UP , Qt::Key_VolumeUp);
305 insert(DIKS_VOLUME_DOWN , Qt::Key_VolumeDown);
306 insert(DIKS_MUTE , Qt::Key_VolumeMute);
307 insert(DIKS_PLAYPAUSE , Qt::Key_MediaTogglePlayPause);
308 insert(DIKS_PLAY , Qt::Key_MediaPlay);
309 insert(DIKS_STOP , Qt::Key_MediaStop);
310 insert(DIKS_RECORD , Qt::Key_MediaRecord);
311 insert(DIKS_PREVIOUS , Qt::Key_MediaPrevious);
312 insert(DIKS_NEXT , Qt::Key_MediaNext);
313 insert(DIKS_REWIND , Qt::Key_AudioRewind);
314 insert(DIKS_FASTFORWARD , Qt::Key_AudioForward);
315 insert(DIKS_SUBTITLE , Qt::Key_Subtitle);
316
317 insert(DIKS_F1 , Qt::Key_F1);
318 insert(DIKS_F2 , Qt::Key_F2);
319 insert(DIKS_F3 , Qt::Key_F3);
320 insert(DIKS_F4 , Qt::Key_F4);
321 insert(DIKS_F5 , Qt::Key_F5);
322 insert(DIKS_F6 , Qt::Key_F6);
323 insert(DIKS_F7 , Qt::Key_F7);
324 insert(DIKS_F8 , Qt::Key_F8);
325 insert(DIKS_F9 , Qt::Key_F9);
326 insert(DIKS_F10 , Qt::Key_F10);
327 insert(DIKS_F11 , Qt::Key_F11);
328 insert(DIKS_F12 , Qt::Key_F12);
329
330 insert(DIKS_SHIFT , Qt::Key_Shift);
331 insert(DIKS_CONTROL , Qt::Key_Control);
332 insert(DIKS_ALT , Qt::Key_Alt);
333 insert(DIKS_ALTGR , Qt::Key_AltGr);
334
335 insert(DIKS_META , Qt::Key_Meta);
336 insert(DIKS_SUPER , Qt::Key_Super_L); // ???
337 insert(DIKS_HYPER , Qt::Key_Hyper_L); // ???
338
339 insert(DIKS_CAPS_LOCK , Qt::Key_CapsLock);
340 insert(DIKS_NUM_LOCK , Qt::Key_NumLock);
341 insert(DIKS_SCROLL_LOCK , Qt::Key_ScrollLock);
342
343 insert(DIKS_DEAD_ABOVEDOT , Qt::Key_Dead_Abovedot);
344 insert(DIKS_DEAD_ABOVERING , Qt::Key_Dead_Abovering);
345 insert(DIKS_DEAD_ACUTE , Qt::Key_Dead_Acute);
346 insert(DIKS_DEAD_BREVE , Qt::Key_Dead_Breve);
347 insert(DIKS_DEAD_CARON , Qt::Key_Dead_Caron);
348 insert(DIKS_DEAD_CEDILLA , Qt::Key_Dead_Cedilla);
349 insert(DIKS_DEAD_CIRCUMFLEX , Qt::Key_Dead_Circumflex);
350 insert(DIKS_DEAD_DIAERESIS , Qt::Key_Dead_Diaeresis);
351 insert(DIKS_DEAD_DOUBLEACUTE , Qt::Key_Dead_Doubleacute);
352 insert(DIKS_DEAD_GRAVE , Qt::Key_Dead_Grave);
353 insert(DIKS_DEAD_IOTA , Qt::Key_Dead_Iota);
354 insert(DIKS_DEAD_MACRON , Qt::Key_Dead_Macron);
355 insert(DIKS_DEAD_OGONEK , Qt::Key_Dead_Ogonek);
356 insert(DIKS_DEAD_SEMIVOICED_SOUND , Qt::Key_Dead_Semivoiced_Sound);
357 insert(DIKS_DEAD_TILDE , Qt::Key_Dead_Tilde);
358 insert(DIKS_DEAD_VOICED_SOUND , Qt::Key_Dead_Voiced_Sound);
359 insert(DIKS_SPACE , Qt::Key_Space);
360 insert(DIKS_EXCLAMATION_MARK , Qt::Key_Exclam);
361 insert(DIKS_QUOTATION , Qt::Key_QuoteDbl);
362 insert(DIKS_NUMBER_SIGN , Qt::Key_NumberSign);
363 insert(DIKS_DOLLAR_SIGN , Qt::Key_Dollar);
364 insert(DIKS_PERCENT_SIGN , Qt::Key_Percent);
365 insert(DIKS_AMPERSAND , Qt::Key_Ampersand);
366 insert(DIKS_APOSTROPHE , Qt::Key_Apostrophe);
367 insert(DIKS_PARENTHESIS_LEFT , Qt::Key_ParenLeft);
368 insert(DIKS_PARENTHESIS_RIGHT , Qt::Key_ParenRight);
369 insert(DIKS_ASTERISK , Qt::Key_Asterisk);
370 insert(DIKS_PLUS_SIGN , Qt::Key_Plus);
371 insert(DIKS_COMMA , Qt::Key_Comma);
372 insert(DIKS_MINUS_SIGN , Qt::Key_Minus);
373 insert(DIKS_PERIOD , Qt::Key_Period);
374 insert(DIKS_SLASH , Qt::Key_Slash);
375 insert(DIKS_0 , Qt::Key_0);
376 insert(DIKS_1 , Qt::Key_1);
377 insert(DIKS_2 , Qt::Key_2);
378 insert(DIKS_3 , Qt::Key_3);
379 insert(DIKS_4 , Qt::Key_4);
380 insert(DIKS_5 , Qt::Key_5);
381 insert(DIKS_6 , Qt::Key_6);
382 insert(DIKS_7 , Qt::Key_7);
383 insert(DIKS_8 , Qt::Key_8);
384 insert(DIKS_9 , Qt::Key_9);
385 insert(DIKS_COLON , Qt::Key_Colon);
386 insert(DIKS_SEMICOLON , Qt::Key_Semicolon);
387 insert(DIKS_LESS_THAN_SIGN , Qt::Key_Less);
388 insert(DIKS_EQUALS_SIGN , Qt::Key_Equal);
389 insert(DIKS_GREATER_THAN_SIGN , Qt::Key_Greater);
390 insert(DIKS_QUESTION_MARK , Qt::Key_Question);
391 insert(DIKS_AT , Qt::Key_At);
392 insert(DIKS_CAPITAL_A , Qt::Key_A);
393 insert(DIKS_CAPITAL_B , Qt::Key_B);
394 insert(DIKS_CAPITAL_C , Qt::Key_C);
395 insert(DIKS_CAPITAL_D , Qt::Key_D);
396 insert(DIKS_CAPITAL_E , Qt::Key_E);
397 insert(DIKS_CAPITAL_F , Qt::Key_F);
398 insert(DIKS_CAPITAL_G , Qt::Key_G);
399 insert(DIKS_CAPITAL_H , Qt::Key_H);
400 insert(DIKS_CAPITAL_I , Qt::Key_I);
401 insert(DIKS_CAPITAL_J , Qt::Key_J);
402 insert(DIKS_CAPITAL_K , Qt::Key_K);
403 insert(DIKS_CAPITAL_L , Qt::Key_L);
404 insert(DIKS_CAPITAL_M , Qt::Key_M);
405 insert(DIKS_CAPITAL_N , Qt::Key_N);
406 insert(DIKS_CAPITAL_O , Qt::Key_O);
407 insert(DIKS_CAPITAL_P , Qt::Key_P);
408 insert(DIKS_CAPITAL_Q , Qt::Key_Q);
409 insert(DIKS_CAPITAL_R , Qt::Key_R);
410 insert(DIKS_CAPITAL_S , Qt::Key_S);
411 insert(DIKS_CAPITAL_T , Qt::Key_T);
412 insert(DIKS_CAPITAL_U , Qt::Key_U);
413 insert(DIKS_CAPITAL_V , Qt::Key_V);
414 insert(DIKS_CAPITAL_W , Qt::Key_W);
415 insert(DIKS_CAPITAL_X , Qt::Key_X);
416 insert(DIKS_CAPITAL_Y , Qt::Key_Y);
417 insert(DIKS_CAPITAL_Z , Qt::Key_Z);
418 insert(DIKS_SQUARE_BRACKET_LEFT , Qt::Key_BracketLeft);
419 insert(DIKS_BACKSLASH , Qt::Key_Backslash);
420 insert(DIKS_SQUARE_BRACKET_RIGHT , Qt::Key_BracketRight);
421 insert(DIKS_CIRCUMFLEX_ACCENT , Qt::Key_AsciiCircum);
422 insert(DIKS_UNDERSCORE , Qt::Key_Underscore);
423 insert(DIKS_SMALL_A , Qt::Key_A);
424 insert(DIKS_SMALL_B , Qt::Key_B);
425 insert(DIKS_SMALL_C , Qt::Key_C);
426 insert(DIKS_SMALL_D , Qt::Key_D);
427 insert(DIKS_SMALL_E , Qt::Key_E);
428 insert(DIKS_SMALL_F , Qt::Key_F);
429 insert(DIKS_SMALL_G , Qt::Key_G);
430 insert(DIKS_SMALL_H , Qt::Key_H);
431 insert(DIKS_SMALL_I , Qt::Key_I);
432 insert(DIKS_SMALL_J , Qt::Key_J);
433 insert(DIKS_SMALL_K , Qt::Key_K);
434 insert(DIKS_SMALL_L , Qt::Key_L);
435 insert(DIKS_SMALL_M , Qt::Key_M);
436 insert(DIKS_SMALL_N , Qt::Key_N);
437 insert(DIKS_SMALL_O , Qt::Key_O);
438 insert(DIKS_SMALL_P , Qt::Key_P);
439 insert(DIKS_SMALL_Q , Qt::Key_Q);
440 insert(DIKS_SMALL_R , Qt::Key_R);
441 insert(DIKS_SMALL_S , Qt::Key_S);
442 insert(DIKS_SMALL_T , Qt::Key_T);
443 insert(DIKS_SMALL_U , Qt::Key_U);
444 insert(DIKS_SMALL_V , Qt::Key_V);
445 insert(DIKS_SMALL_W , Qt::Key_W);
446 insert(DIKS_SMALL_X , Qt::Key_X);
447 insert(DIKS_SMALL_Y , Qt::Key_Y);
448 insert(DIKS_SMALL_Z , Qt::Key_Z);
449 insert(DIKS_CURLY_BRACKET_LEFT , Qt::Key_BraceLeft);
450 insert(DIKS_VERTICAL_BAR , Qt::Key_Bar);
451 insert(DIKS_CURLY_BRACKET_RIGHT , Qt::Key_BraceRight);
452 insert(DIKS_TILDE , Qt::Key_AsciiTilde);
453 }
454
toDfbScreen(QWindow * window)455 QDirectFbScreen *toDfbScreen(QWindow *window)
456 {
457 return static_cast<QDirectFbScreen*>(window->screen()->handle());
458 }
459
toDfbLayer(QPlatformScreen * screen)460 IDirectFBDisplayLayer *toDfbLayer(QPlatformScreen *screen)
461 {
462 return static_cast<QDirectFbScreen*>(screen)->dfbLayer();
463 }
464
465 QT_END_NAMESPACE
466