/*
* Copyright (C) 2015-2018 Département de l'Instruction Publique (DIP-SEM)
*
* Copyright (C) 2013 Open Education Foundation
*
* Copyright (C) 2010-2013 Groupement d'Intérêt Public pour
* l'Education Numérique en Afrique (GIP ENA)
*
* This file is part of OpenBoard.
*
* OpenBoard is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License,
* with a specific linking exception for the OpenSSL project's
* "OpenSSL" library (or with modified versions of it that use the
* same license as the "OpenSSL" library).
*
* OpenBoard is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenBoard. If not, see .
*/
#ifndef UBPLATFORMUTILS_H_
#define UBPLATFORMUTILS_H_
#include
#include
#include
class QMainWindow;
#define SYMBOL_KEYS_COUNT 47
/*
Declaration for single keycode (code, which will be sent to output after pressing of button)
Each button has several codes, associated with shift state and modifier
symbol - (Windows only) Unide symbol to send
code - (LINUX, MAC) - code of key to press. Phisical keycode on MAC, position in keys table on LINUX
modifier (LINUX) - offset in keys table
*/
struct KEYCODE{
KEYCODE()
:symbol(0)
,code(0)
,modifier(0)
{}
KEYCODE(int _symbol)
:symbol(_symbol)
,code(0)
,modifier(0)
{}
KEYCODE(int _symbol,
unsigned char _code,
int _modifier)
:symbol(_symbol)
,code(_code)
,modifier(_modifier)
{}
bool empty() const
{
return symbol == 0;
}
int symbol;
unsigned char code;
int modifier;
};
/*
Declaration of single button. Properties:
symbol1, symbol2 - symbols to display under obscreen keyboard on normal/shifted modes
capsLockSwitch - if true, CapsLock button switched keystate to "shifted"
modifier1/modifier2 - if >0 means modified symbol for next press (modifier * 2 + shiststate index in codes array)
If this code dedined (not empty), this symbol will sent to output. For French keyboard layout
codes[i] - code for pressed symbol.
code[0] - normal symbol
code[1] - shifted symbol
code[2] - modifier = 1, normal symbol
code[3] - modifier = 1, shifted symbol
...
*/
struct KEYBT
{
QChar symbol1;
QChar symbol2;
bool capsLockSwitch;
int modifier1;
int modifier2;
KEYCODE codes[8];
KEYBT( QChar _symbol1,
QChar _symbol2,
bool _capsLockSwitch,
int _modifier1,
int _modifier2,
KEYCODE c1 = 0,
KEYCODE c2 = 0,
KEYCODE c3 = 0,
KEYCODE c4 = 0,
KEYCODE c5 = 0,
KEYCODE c6 = 0,
KEYCODE c7 = 0,
KEYCODE c8 = 0)
:symbol1(_symbol1)
,symbol2(_symbol2)
,capsLockSwitch(_capsLockSwitch)
,modifier1(_modifier1)
,modifier2(_modifier2)
{
codes[0] = c1;
codes[1] = c2;
codes[2] = c3;
codes[3] = c4;
codes[4] = c5;
codes[5] = c6;
codes[6] = c7;
codes[7] = c8;
}
~KEYBT()
{}
};
class UBKeyboardLocale
{
public:
UBKeyboardLocale(const QString& _fullName,
const QString& _name,
const QString& _id,
QIcon* _icon,
KEYBT** _symbols)
:fullName(_fullName),name(_name), id(_id), icon(_icon),
constSymbols(NULL), varSymbols(_symbols)
{}
UBKeyboardLocale(const QString& _fullName,
const QString& _name,
const QString& _id,
QIcon* _icon,
KEYBT _symbols[])
:fullName(_fullName),name(_name), id(_id), icon(_icon),
constSymbols(_symbols), varSymbols(NULL)
{}
~UBKeyboardLocale();
const QString fullName;
const QString name;
const QString id;
QIcon* icon;
KEYBT* operator[] (int index) const
{
return (varSymbols==NULL)? constSymbols + index : varSymbols[index];
}
private:
KEYBT* constSymbols;
KEYBT** varSymbols;
};
class UBPlatformUtils
{
Q_DECLARE_TR_FUNCTIONS(UBPlatformUtils)
private:
UBPlatformUtils();
virtual ~UBPlatformUtils();
static void initializeKeyboardLayouts();
static void destroyKeyboardLayouts();
static int nKeyboardLayouts;
static UBKeyboardLocale** keyboardLayouts;
public:
static void init();
static void destroy();
static QString applicationResourcesDirectory();
static void hideFile(const QString &filePath);
static void setFileType(const QString &filePath, unsigned long fileType);
static void fadeDisplayOut();
static void fadeDisplayIn();
static QString translationPath(QString pFilePrefix, QString pLanguage);
static QString systemLanguage();
static bool hasVirtualKeyboard();
static void bringPreviousProcessToFront();
static QString osUserLoginName();
static void setDesktopMode(bool desktop);
static void setWindowNonActivableFlag(QWidget* widget, bool nonAcivable);
static QString computerName();
static UBKeyboardLocale** getKeyboardLayouts(int& nCount);
static QString urlFromClipboard();
static QStringList availableTranslations();
static void setFrontProcess();
static void showFullScreen(QWidget * pWidget);
static void showOSK(bool show);
#ifdef Q_OS_OSX
static void SetMacLocaleByIdentifier(const QString& id);
static void toggleFinder(const bool on);
static bool errorOpeningVirtualKeyboard;
#endif
};
#endif /* UBPLATFORMUTILS_H_ */