gale/gale/key/Special.cpp

265 lines
5.4 KiB
C++

/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license APACHE v2.0 (see license file)
*/
#include <gale/key/Special.hpp>
#include <etk/stdTools.hpp>
#define GALE_FLAG_KEY_CAPS_LOCK 0x00000001
#define GALE_FLAG_KEY_SHIFT 0x00000002
#define GALE_FLAG_KEY_CTRL 0x00000004
#define GALE_FLAG_KEY_META 0x00000008
#define GALE_FLAG_KEY_ALT 0x00000010
#define GALE_FLAG_KEY_ALTGR 0x00000020
#define GALE_FLAG_KEY_NUM_LOCK 0x00000040
#define GALE_FLAG_KEY_INSERT 0x00000080
// TODO : Update to support the Left and right of some key ...
gale::key::Special::Special() :
m_value(0) {
}
void gale::key::Special::update(enum gale::key::keyboard _move, bool _isDown) {
switch (_move) {
case keyboard::insert:
setInsert(_isDown);
break;
case keyboard::capLock:
setCapsLock(_isDown);
break;
case keyboard::shiftLeft:
case keyboard::shiftRight:
setShift(_isDown);
break;
case keyboard::ctrlLeft:
case keyboard::ctrlRight:
setCtrl(_isDown);
break;
case keyboard::metaLeft:
case keyboard::metaRight:
setMeta(_isDown);
break;
case keyboard::alt:
setAlt(_isDown);
break;
case keyboard::altGr:
setAltGr(_isDown);
break;
case keyboard::numLock:
setNumLock(_isDown);
break;
default:
break;
}
}
bool gale::key::Special::getCapsLock() const {
if ((m_value & GALE_FLAG_KEY_CAPS_LOCK) != 0) {
return true;
}
return false;
}
void gale::key::Special::setCapsLock(bool _value) {
if ((m_value & GALE_FLAG_KEY_CAPS_LOCK) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_CAPS_LOCK;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_CAPS_LOCK;
}
}
}
bool gale::key::Special::getShift() const {
if ((m_value & GALE_FLAG_KEY_SHIFT) != 0) {
return true;
}
return false;
}
void gale::key::Special::setShift(bool _value) {
if ((m_value & GALE_FLAG_KEY_SHIFT) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_SHIFT;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_SHIFT;
}
}
}
bool gale::key::Special::getCtrl() const {
if ((m_value & GALE_FLAG_KEY_CTRL) != 0) {
return true;
}
return false;
}
void gale::key::Special::setCtrl(bool _value) {
if ((m_value & GALE_FLAG_KEY_CTRL) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_CTRL;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_CTRL;
}
}
}
bool gale::key::Special::getMeta() const {
if ((m_value & GALE_FLAG_KEY_META) != 0) {
return true;
}
return false;
}
void gale::key::Special::setMeta(bool _value) {
if ((m_value & GALE_FLAG_KEY_META) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_META;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_META;
}
}
}
bool gale::key::Special::getAlt() const {
if ((m_value & GALE_FLAG_KEY_ALT) != 0) {
return true;
}
return false;
}
void gale::key::Special::setAlt(bool _value) {
if ((m_value & GALE_FLAG_KEY_ALT) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_ALT;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_ALT;
}
}
}
bool gale::key::Special::getAltGr() const {
if ((m_value & GALE_FLAG_KEY_ALTGR) != 0) {
return true;
}
return false;
}
void gale::key::Special::setAltGr(bool _value) {
if ((m_value & GALE_FLAG_KEY_ALTGR) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_ALTGR;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_ALTGR;
}
}
}
bool gale::key::Special::getNumLock() const {
if ((m_value & GALE_FLAG_KEY_NUM_LOCK) != 0) {
return true;
}
return false;
}
void gale::key::Special::setNumLock(bool _value) {
if ((m_value & GALE_FLAG_KEY_NUM_LOCK) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_NUM_LOCK;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_NUM_LOCK;
}
}
}
bool gale::key::Special::getInsert() const {
if ((m_value & GALE_FLAG_KEY_INSERT) != 0) {
return true;
}
return false;
}
void gale::key::Special::setInsert(bool _value) {
if ((m_value & GALE_FLAG_KEY_INSERT) != 0) {
if (_value == false) {
m_value -= GALE_FLAG_KEY_INSERT;
}
} else {
if (_value == true) {
m_value += GALE_FLAG_KEY_INSERT;
}
}
}
std::ostream& gale::key::operator <<(std::ostream& _os, const gale::key::Special& _obj) {
_os << " capLock=" << _obj.getCapsLock();
_os << " shift=" << _obj.getShift();
_os << " ctrl=" << _obj.getCtrl();
_os << " meta=" << _obj.getMeta();
_os << " alt=" << _obj.getAlt();
_os << " altGr=" << _obj.getAltGr();
_os << " verNum=" << _obj.getNumLock();
_os << " insert=" << _obj.getInsert();
return _os;
}
namespace etk {
template<> std::string to_string<gale::key::Special>(const gale::key::Special& _obj) {
std::string out;
if (_obj.getCapsLock() == true) {
out = "CAPS";
}
if (_obj.getShift() == true) {
if (out.size() > 0) {
out += "|";
}
out = "SHIFT";
}
if (_obj.getCtrl() == true) {
if (out.size() > 0) {
out += "|";
}
out = "CTRL";
}
if (_obj.getMeta() == true) {
if (out.size() > 0) {
out += "|";
}
out = "META";
}
if (_obj.getAlt() == true) {
if (out.size() > 0) {
out += "|";
}
out = "ALT";
}
if (_obj.getAltGr() == true) {
if (out.size() > 0) {
out += "|";
}
out = "ALTGR";
}
if (_obj.getNumLock() == true) {
if (out.size() > 0) {
out += "|";
}
out = "NUM_LOCK";
}
if (_obj.getInsert() == true) {
if (out.size() > 0) {
out += "|";
}
out = "INSERT";
}
return out;
}
}