/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qdirectfbconvenience.h" #include "qdirectfbblitter.h" #include "qdirectfbscreen.h" #include #include #include QT_BEGIN_NAMESPACE IDirectFB *QDirectFbConvenience::dfbInterface() { static IDirectFB *dfb = 0; if (!dfb) { DFBResult result = DirectFBCreate(&dfb); if (result != DFB_OK) { DirectFBErrorFatal("QDirectFBConvenience: error creating DirectFB interface", result); return 0; } } return dfb; } IDirectFBDisplayLayer *QDirectFbConvenience::dfbDisplayLayer(int display) { IDirectFBDisplayLayer *layer; DFBResult result = QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(),display,&layer); if (result != DFB_OK) DirectFBErrorFatal("QDirectFbConvenience: " "Unable to get primary display layer!", result); return layer; } QImage::Format QDirectFbConvenience::imageFormatFromSurfaceFormat(const DFBSurfacePixelFormat format, const DFBSurfaceCapabilities caps) { switch (format) { case DSPF_LUT8: return QImage::Format_Indexed8; case DSPF_RGB24: return QImage::Format_RGB888; case DSPF_ARGB4444: return QImage::Format_ARGB4444_Premultiplied; case DSPF_RGB444: return QImage::Format_RGB444; case DSPF_RGB555: case DSPF_ARGB1555: return QImage::Format_RGB555; case DSPF_RGB16: return QImage::Format_RGB16; case DSPF_ARGB6666: return QImage::Format_ARGB6666_Premultiplied; case DSPF_RGB18: return QImage::Format_RGB666; case DSPF_RGB32: return QImage::Format_RGB32; case DSPF_ARGB: { if (caps & DSCAPS_PREMULTIPLIED) return QImage::Format_ARGB32_Premultiplied; else return QImage::Format_ARGB32; } default: break; } return QImage::Format_Invalid; } int QDirectFbConvenience::colorDepthForSurface(const DFBSurfacePixelFormat format) { return ((0x1f << 7) & format) >> 7; } /** * This is borrowing the reference of the QDirectFbBlitter. You may not store this * pointer as a class member but must only use it locally. */ IDirectFBSurface *QDirectFbConvenience::dfbSurfaceForPlatformPixmap(QPlatformPixmap *handle) { QBlittablePlatformPixmap *blittablePmData = static_cast(handle); if (blittablePmData) { QBlittable *blittable = blittablePmData->blittable(); QDirectFbBlitter *dfbBlitter = static_cast(blittable); return dfbBlitter->m_surface.data(); } return 0; } Qt::MouseButton QDirectFbConvenience::mouseButton(DFBInputDeviceButtonIdentifier identifier) { // The Enum contains values for DIBI_FIRST (= DIBI_LEFT), DIBI_LAST (= 0x1f,) and // just 3 enumerated Mouse Buttons. To convert into *ALL* possible Qt::MoueButton values, // the parameter is cast as integer. switch (int(identifier)) { case DIBI_LEFT: // value is 0x00 return Qt::LeftButton; case DIBI_RIGHT: // value is 0x01 return Qt::RightButton; case DIBI_MIDDLE: // value is 0x02 return Qt::MidButton; case 0x03: return Qt::BackButton; case 0x04: return Qt::ForwardButton; case 0x05: return Qt::ExtraButton3; case 0x06: return Qt::ExtraButton4; case 0x07: return Qt::ExtraButton5; case 0x08: return Qt::ExtraButton6; case 0x09: return Qt::ExtraButton7; case 0x0a: return Qt::ExtraButton8; case 0x0b: return Qt::ExtraButton9; case 0x0c: return Qt::ExtraButton10; case 0x0d: return Qt::ExtraButton11; case 0x0e: return Qt::ExtraButton12; case 0x0f: return Qt::ExtraButton13; case 0x10: return Qt::ExtraButton14; case 0x11: return Qt::ExtraButton15; case 0x12: return Qt::ExtraButton16; case 0x13: return Qt::ExtraButton17; case 0x14: return Qt::ExtraButton18; case 0x15: return Qt::ExtraButton19; case 0x16: return Qt::ExtraButton20; case 0x17: return Qt::ExtraButton21; case 0x18: return Qt::ExtraButton22; case 0x19: return Qt::ExtraButton23; case 0x1a: return Qt::ExtraButton24; default: return Qt::NoButton; } } Qt::MouseButtons QDirectFbConvenience::mouseButtons(DFBInputDeviceButtonMask mask) { Qt::MouseButtons buttons = Qt::NoButton; if (mask & DIBM_LEFT) { buttons |= Qt::LeftButton; } if (mask & DIBM_MIDDLE) { buttons |= Qt::MidButton; } if (mask & DIBM_RIGHT) { buttons |= Qt::RightButton; } return buttons; } Qt::KeyboardModifiers QDirectFbConvenience::keyboardModifiers(DFBInputDeviceModifierMask mask) { Qt::KeyboardModifiers modifiers = Qt::NoModifier; if (mask & DIMM_SHIFT) { modifiers |= Qt::ShiftModifier; } if (mask & DIMM_ALT) { modifiers |= Qt::AltModifier; } if (mask & DIMM_ALTGR) { modifiers |= Qt::MetaModifier; } if (mask & DIMM_CONTROL) { modifiers |= Qt::ControlModifier; } if (mask & DIMM_META) { modifiers |= Qt::MetaModifier; } return modifiers; } QEvent::Type QDirectFbConvenience::eventType(DFBWindowEventType type) { switch(type) { case DWET_BUTTONDOWN: return QEvent::MouseButtonPress; case DWET_BUTTONUP: return QEvent::MouseButtonRelease; case DWET_MOTION: return QEvent::MouseMove; case DWET_WHEEL: return QEvent::Wheel; case DWET_KEYDOWN: return QEvent::KeyPress; case DWET_KEYUP: return QEvent::KeyRelease; default: return QEvent::None; } } QDirectFbKeyMap *QDirectFbConvenience::dfbKeymap = 0; QDirectFbKeyMap *QDirectFbConvenience::keyMap() { if (!dfbKeymap) dfbKeymap = new QDirectFbKeyMap(); return dfbKeymap; } QDirectFbKeyMap::QDirectFbKeyMap() { insert(DIKS_BACKSPACE , Qt::Key_Backspace); insert(DIKS_TAB , Qt::Key_Tab); insert(DIKS_RETURN , Qt::Key_Return); insert(DIKS_ESCAPE , Qt::Key_Escape); insert(DIKS_DELETE , Qt::Key_Delete); insert(DIKS_CURSOR_LEFT , Qt::Key_Left); insert(DIKS_CURSOR_RIGHT , Qt::Key_Right); insert(DIKS_CURSOR_UP , Qt::Key_Up); insert(DIKS_CURSOR_DOWN , Qt::Key_Down); insert(DIKS_INSERT , Qt::Key_Insert); insert(DIKS_HOME , Qt::Key_Home); insert(DIKS_END , Qt::Key_End); insert(DIKS_PAGE_UP , Qt::Key_PageUp); insert(DIKS_PAGE_DOWN , Qt::Key_PageDown); insert(DIKS_PRINT , Qt::Key_Print); insert(DIKS_PAUSE , Qt::Key_Pause); insert(DIKS_SELECT , Qt::Key_Select); insert(DIKS_GOTO , Qt::Key_OpenUrl); insert(DIKS_CLEAR , Qt::Key_Clear); insert(DIKS_MENU , Qt::Key_Menu); insert(DIKS_HELP , Qt::Key_Help); insert(DIKS_INFO , Qt::Key_Info); insert(DIKS_EXIT , Qt::Key_Exit); insert(DIKS_SETUP , Qt::Key_Settings); insert(DIKS_CD , Qt::Key_CD); insert(DIKS_INTERNET , Qt::Key_HomePage); insert(DIKS_MAIL , Qt::Key_LaunchMail); insert(DIKS_FAVORITES , Qt::Key_Favorites); insert(DIKS_PHONE , Qt::Key_Phone); insert(DIKS_PROGRAM , Qt::Key_Guide); insert(DIKS_TIME , Qt::Key_Time); insert(DIKS_RED , Qt::Key_Red); insert(DIKS_GREEN , Qt::Key_Green); insert(DIKS_YELLOW , Qt::Key_Yellow); insert(DIKS_BLUE , Qt::Key_Blue); insert(DIKS_CHANNEL_UP , Qt::Key_ChannelUp); insert(DIKS_CHANNEL_DOWN , Qt::Key_ChannelDown); insert(DIKS_BACK , Qt::Key_Back); insert(DIKS_FORWARD , Qt::Key_Forward); insert(DIKS_VOLUME_UP , Qt::Key_VolumeUp); insert(DIKS_VOLUME_DOWN , Qt::Key_VolumeDown); insert(DIKS_MUTE , Qt::Key_VolumeMute); insert(DIKS_PLAYPAUSE , Qt::Key_MediaTogglePlayPause); insert(DIKS_PLAY , Qt::Key_MediaPlay); insert(DIKS_STOP , Qt::Key_MediaStop); insert(DIKS_RECORD , Qt::Key_MediaRecord); insert(DIKS_PREVIOUS , Qt::Key_MediaPrevious); insert(DIKS_NEXT , Qt::Key_MediaNext); insert(DIKS_REWIND , Qt::Key_AudioRewind); insert(DIKS_FASTFORWARD , Qt::Key_AudioForward); insert(DIKS_SUBTITLE , Qt::Key_Subtitle); insert(DIKS_F1 , Qt::Key_F1); insert(DIKS_F2 , Qt::Key_F2); insert(DIKS_F3 , Qt::Key_F3); insert(DIKS_F4 , Qt::Key_F4); insert(DIKS_F5 , Qt::Key_F5); insert(DIKS_F6 , Qt::Key_F6); insert(DIKS_F7 , Qt::Key_F7); insert(DIKS_F8 , Qt::Key_F8); insert(DIKS_F9 , Qt::Key_F9); insert(DIKS_F10 , Qt::Key_F10); insert(DIKS_F11 , Qt::Key_F11); insert(DIKS_F12 , Qt::Key_F12); insert(DIKS_SHIFT , Qt::Key_Shift); insert(DIKS_CONTROL , Qt::Key_Control); insert(DIKS_ALT , Qt::Key_Alt); insert(DIKS_ALTGR , Qt::Key_AltGr); insert(DIKS_META , Qt::Key_Meta); insert(DIKS_SUPER , Qt::Key_Super_L); // ??? insert(DIKS_HYPER , Qt::Key_Hyper_L); // ??? insert(DIKS_CAPS_LOCK , Qt::Key_CapsLock); insert(DIKS_NUM_LOCK , Qt::Key_NumLock); insert(DIKS_SCROLL_LOCK , Qt::Key_ScrollLock); insert(DIKS_DEAD_ABOVEDOT , Qt::Key_Dead_Abovedot); insert(DIKS_DEAD_ABOVERING , Qt::Key_Dead_Abovering); insert(DIKS_DEAD_ACUTE , Qt::Key_Dead_Acute); insert(DIKS_DEAD_BREVE , Qt::Key_Dead_Breve); insert(DIKS_DEAD_CARON , Qt::Key_Dead_Caron); insert(DIKS_DEAD_CEDILLA , Qt::Key_Dead_Cedilla); insert(DIKS_DEAD_CIRCUMFLEX , Qt::Key_Dead_Circumflex); insert(DIKS_DEAD_DIAERESIS , Qt::Key_Dead_Diaeresis); insert(DIKS_DEAD_DOUBLEACUTE , Qt::Key_Dead_Doubleacute); insert(DIKS_DEAD_GRAVE , Qt::Key_Dead_Grave); insert(DIKS_DEAD_IOTA , Qt::Key_Dead_Iota); insert(DIKS_DEAD_MACRON , Qt::Key_Dead_Macron); insert(DIKS_DEAD_OGONEK , Qt::Key_Dead_Ogonek); insert(DIKS_DEAD_SEMIVOICED_SOUND , Qt::Key_Dead_Semivoiced_Sound); insert(DIKS_DEAD_TILDE , Qt::Key_Dead_Tilde); insert(DIKS_DEAD_VOICED_SOUND , Qt::Key_Dead_Voiced_Sound); insert(DIKS_SPACE , Qt::Key_Space); insert(DIKS_EXCLAMATION_MARK , Qt::Key_Exclam); insert(DIKS_QUOTATION , Qt::Key_QuoteDbl); insert(DIKS_NUMBER_SIGN , Qt::Key_NumberSign); insert(DIKS_DOLLAR_SIGN , Qt::Key_Dollar); insert(DIKS_PERCENT_SIGN , Qt::Key_Percent); insert(DIKS_AMPERSAND , Qt::Key_Ampersand); insert(DIKS_APOSTROPHE , Qt::Key_Apostrophe); insert(DIKS_PARENTHESIS_LEFT , Qt::Key_ParenLeft); insert(DIKS_PARENTHESIS_RIGHT , Qt::Key_ParenRight); insert(DIKS_ASTERISK , Qt::Key_Asterisk); insert(DIKS_PLUS_SIGN , Qt::Key_Plus); insert(DIKS_COMMA , Qt::Key_Comma); insert(DIKS_MINUS_SIGN , Qt::Key_Minus); insert(DIKS_PERIOD , Qt::Key_Period); insert(DIKS_SLASH , Qt::Key_Slash); insert(DIKS_0 , Qt::Key_0); insert(DIKS_1 , Qt::Key_1); insert(DIKS_2 , Qt::Key_2); insert(DIKS_3 , Qt::Key_3); insert(DIKS_4 , Qt::Key_4); insert(DIKS_5 , Qt::Key_5); insert(DIKS_6 , Qt::Key_6); insert(DIKS_7 , Qt::Key_7); insert(DIKS_8 , Qt::Key_8); insert(DIKS_9 , Qt::Key_9); insert(DIKS_COLON , Qt::Key_Colon); insert(DIKS_SEMICOLON , Qt::Key_Semicolon); insert(DIKS_LESS_THAN_SIGN , Qt::Key_Less); insert(DIKS_EQUALS_SIGN , Qt::Key_Equal); insert(DIKS_GREATER_THAN_SIGN , Qt::Key_Greater); insert(DIKS_QUESTION_MARK , Qt::Key_Question); insert(DIKS_AT , Qt::Key_At); insert(DIKS_CAPITAL_A , Qt::Key_A); insert(DIKS_CAPITAL_B , Qt::Key_B); insert(DIKS_CAPITAL_C , Qt::Key_C); insert(DIKS_CAPITAL_D , Qt::Key_D); insert(DIKS_CAPITAL_E , Qt::Key_E); insert(DIKS_CAPITAL_F , Qt::Key_F); insert(DIKS_CAPITAL_G , Qt::Key_G); insert(DIKS_CAPITAL_H , Qt::Key_H); insert(DIKS_CAPITAL_I , Qt::Key_I); insert(DIKS_CAPITAL_J , Qt::Key_J); insert(DIKS_CAPITAL_K , Qt::Key_K); insert(DIKS_CAPITAL_L , Qt::Key_L); insert(DIKS_CAPITAL_M , Qt::Key_M); insert(DIKS_CAPITAL_N , Qt::Key_N); insert(DIKS_CAPITAL_O , Qt::Key_O); insert(DIKS_CAPITAL_P , Qt::Key_P); insert(DIKS_CAPITAL_Q , Qt::Key_Q); insert(DIKS_CAPITAL_R , Qt::Key_R); insert(DIKS_CAPITAL_S , Qt::Key_S); insert(DIKS_CAPITAL_T , Qt::Key_T); insert(DIKS_CAPITAL_U , Qt::Key_U); insert(DIKS_CAPITAL_V , Qt::Key_V); insert(DIKS_CAPITAL_W , Qt::Key_W); insert(DIKS_CAPITAL_X , Qt::Key_X); insert(DIKS_CAPITAL_Y , Qt::Key_Y); insert(DIKS_CAPITAL_Z , Qt::Key_Z); insert(DIKS_SQUARE_BRACKET_LEFT , Qt::Key_BracketLeft); insert(DIKS_BACKSLASH , Qt::Key_Backslash); insert(DIKS_SQUARE_BRACKET_RIGHT , Qt::Key_BracketRight); insert(DIKS_CIRCUMFLEX_ACCENT , Qt::Key_AsciiCircum); insert(DIKS_UNDERSCORE , Qt::Key_Underscore); insert(DIKS_SMALL_A , Qt::Key_A); insert(DIKS_SMALL_B , Qt::Key_B); insert(DIKS_SMALL_C , Qt::Key_C); insert(DIKS_SMALL_D , Qt::Key_D); insert(DIKS_SMALL_E , Qt::Key_E); insert(DIKS_SMALL_F , Qt::Key_F); insert(DIKS_SMALL_G , Qt::Key_G); insert(DIKS_SMALL_H , Qt::Key_H); insert(DIKS_SMALL_I , Qt::Key_I); insert(DIKS_SMALL_J , Qt::Key_J); insert(DIKS_SMALL_K , Qt::Key_K); insert(DIKS_SMALL_L , Qt::Key_L); insert(DIKS_SMALL_M , Qt::Key_M); insert(DIKS_SMALL_N , Qt::Key_N); insert(DIKS_SMALL_O , Qt::Key_O); insert(DIKS_SMALL_P , Qt::Key_P); insert(DIKS_SMALL_Q , Qt::Key_Q); insert(DIKS_SMALL_R , Qt::Key_R); insert(DIKS_SMALL_S , Qt::Key_S); insert(DIKS_SMALL_T , Qt::Key_T); insert(DIKS_SMALL_U , Qt::Key_U); insert(DIKS_SMALL_V , Qt::Key_V); insert(DIKS_SMALL_W , Qt::Key_W); insert(DIKS_SMALL_X , Qt::Key_X); insert(DIKS_SMALL_Y , Qt::Key_Y); insert(DIKS_SMALL_Z , Qt::Key_Z); insert(DIKS_CURLY_BRACKET_LEFT , Qt::Key_BraceLeft); insert(DIKS_VERTICAL_BAR , Qt::Key_Bar); insert(DIKS_CURLY_BRACKET_RIGHT , Qt::Key_BraceRight); insert(DIKS_TILDE , Qt::Key_AsciiTilde); } QDirectFbScreen *toDfbScreen(QWindow *window) { return static_cast(window->screen()->handle()); } IDirectFBDisplayLayer *toDfbLayer(QPlatformScreen *screen) { return static_cast(screen)->dfbLayer(); } QT_END_NAMESPACE