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