249 lines
11 KiB
C++
249 lines
11 KiB
C++
/**************************************************************************\
|
|
* Copyright (c) Kongsberg Oil & Gas Technologies AS
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* Neither the name of the copyright holder nor the names of its
|
|
* contributors may be used to endorse or promote products derived from
|
|
* this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
\**************************************************************************/
|
|
|
|
#include "KeyboardP.h"
|
|
#include <Quarter/devices/Keyboard.h>
|
|
#include <QtCore/QMap>
|
|
#include <Inventor/errors/SoDebugError.h>
|
|
|
|
using namespace SIM::Coin3D::Quarter;
|
|
|
|
#define PUBLIC(obj) obj->publ
|
|
|
|
KeyboardP::KeyboardP(Keyboard * publ)
|
|
{
|
|
PUBLIC(this) = publ;
|
|
this->keyboard = new SoKeyboardEvent;
|
|
|
|
if (keyboardmap == nullptr) {
|
|
keyboardmap = new KeyMap;
|
|
keypadmap = new KeyMap;
|
|
this->initKeyMap();
|
|
}
|
|
}
|
|
|
|
KeyboardP::~KeyboardP()
|
|
{
|
|
delete this->keyboard;
|
|
}
|
|
|
|
bool
|
|
KeyboardP::debugKeyEvents()
|
|
{
|
|
const char * env = coin_getenv("QUARTER_DEBUG_KEYEVENTS");
|
|
return env && (atoi(env) > 0);
|
|
}
|
|
|
|
const SoEvent *
|
|
KeyboardP::keyEvent(QKeyEvent * qevent)
|
|
{
|
|
const Qt::KeyboardModifiers modifiers = qevent->modifiers();
|
|
|
|
this->keyboard->setPosition(PUBLIC(this)->mousepos);
|
|
PUBLIC(this)->setModifiers(this->keyboard, qevent);
|
|
|
|
(qevent->type() == QEvent::KeyPress) ?
|
|
this->keyboard->setState(SoButtonEvent::DOWN):
|
|
this->keyboard->setState(SoButtonEvent::UP);
|
|
|
|
Qt::Key qkey = (Qt::Key) qevent->key();
|
|
|
|
SoKeyboardEvent::Key sokey = (modifiers & Qt::KeypadModifier) ?
|
|
keypadmap->value(qkey, SoKeyboardEvent::ANY) :
|
|
keyboardmap->value(qkey, SoKeyboardEvent::ANY);
|
|
|
|
//Need to use a temporary to avoid reference becoming deleted before
|
|
//we get a hold of it.
|
|
QByteArray tmp = qevent->text().toLatin1();
|
|
const char * printable = tmp.constData();
|
|
this->keyboard->setPrintableCharacter(*printable);
|
|
this->keyboard->setKey(sokey);
|
|
|
|
#if QUARTER_DEBUG
|
|
if (KeyboardP::debugKeyEvents()) {
|
|
SbString s;
|
|
this->keyboard->enumToString(this->keyboard->getKey(), s);
|
|
SoDebugError::postInfo("KeyboardP::keyEvent",
|
|
"enum: '%s', pos: <%i %i>, printable: '%s'",
|
|
s.getString(),
|
|
PUBLIC(this)->mousepos[0],
|
|
PUBLIC(this)->mousepos[1],
|
|
printable);
|
|
}
|
|
#endif
|
|
return this->keyboard;
|
|
}
|
|
|
|
KeyboardP::KeyMap * KeyboardP::keyboardmap = nullptr;
|
|
KeyboardP::KeyMap * KeyboardP::keypadmap = nullptr;
|
|
|
|
void
|
|
KeyboardP::initKeyMap()
|
|
{
|
|
// keyboard
|
|
keyboardmap->insert(Qt::Key_Shift, SoKeyboardEvent::LEFT_SHIFT);
|
|
keyboardmap->insert(Qt::Key_Alt, SoKeyboardEvent::LEFT_ALT);
|
|
keyboardmap->insert(Qt::Key_Control, SoKeyboardEvent::LEFT_CONTROL);
|
|
keyboardmap->insert(Qt::Key_0, SoKeyboardEvent::NUMBER_0);
|
|
keyboardmap->insert(Qt::Key_1, SoKeyboardEvent::NUMBER_1);
|
|
keyboardmap->insert(Qt::Key_2, SoKeyboardEvent::NUMBER_2);
|
|
keyboardmap->insert(Qt::Key_3, SoKeyboardEvent::NUMBER_3);
|
|
keyboardmap->insert(Qt::Key_4, SoKeyboardEvent::NUMBER_4);
|
|
keyboardmap->insert(Qt::Key_5, SoKeyboardEvent::NUMBER_5);
|
|
keyboardmap->insert(Qt::Key_6, SoKeyboardEvent::NUMBER_6);
|
|
keyboardmap->insert(Qt::Key_7, SoKeyboardEvent::NUMBER_7);
|
|
keyboardmap->insert(Qt::Key_8, SoKeyboardEvent::NUMBER_8);
|
|
keyboardmap->insert(Qt::Key_9, SoKeyboardEvent::NUMBER_9);
|
|
|
|
keyboardmap->insert(Qt::Key_A, SoKeyboardEvent::A);
|
|
keyboardmap->insert(Qt::Key_B, SoKeyboardEvent::B);
|
|
keyboardmap->insert(Qt::Key_C, SoKeyboardEvent::C);
|
|
keyboardmap->insert(Qt::Key_D, SoKeyboardEvent::D);
|
|
keyboardmap->insert(Qt::Key_E, SoKeyboardEvent::E);
|
|
keyboardmap->insert(Qt::Key_F, SoKeyboardEvent::F);
|
|
keyboardmap->insert(Qt::Key_G, SoKeyboardEvent::G);
|
|
keyboardmap->insert(Qt::Key_H, SoKeyboardEvent::H);
|
|
keyboardmap->insert(Qt::Key_I, SoKeyboardEvent::I);
|
|
keyboardmap->insert(Qt::Key_J, SoKeyboardEvent::J);
|
|
keyboardmap->insert(Qt::Key_K, SoKeyboardEvent::K);
|
|
keyboardmap->insert(Qt::Key_L, SoKeyboardEvent::L);
|
|
keyboardmap->insert(Qt::Key_M, SoKeyboardEvent::M);
|
|
keyboardmap->insert(Qt::Key_N, SoKeyboardEvent::N);
|
|
keyboardmap->insert(Qt::Key_O, SoKeyboardEvent::O);
|
|
keyboardmap->insert(Qt::Key_P, SoKeyboardEvent::P);
|
|
keyboardmap->insert(Qt::Key_Q, SoKeyboardEvent::Q);
|
|
keyboardmap->insert(Qt::Key_R, SoKeyboardEvent::R);
|
|
keyboardmap->insert(Qt::Key_S, SoKeyboardEvent::S);
|
|
keyboardmap->insert(Qt::Key_T, SoKeyboardEvent::T);
|
|
keyboardmap->insert(Qt::Key_U, SoKeyboardEvent::U);
|
|
keyboardmap->insert(Qt::Key_V, SoKeyboardEvent::V);
|
|
keyboardmap->insert(Qt::Key_W, SoKeyboardEvent::W);
|
|
keyboardmap->insert(Qt::Key_X, SoKeyboardEvent::X);
|
|
keyboardmap->insert(Qt::Key_Y, SoKeyboardEvent::Y);
|
|
keyboardmap->insert(Qt::Key_Z, SoKeyboardEvent::Z);
|
|
|
|
keyboardmap->insert(Qt::Key_Home, SoKeyboardEvent::HOME);
|
|
keyboardmap->insert(Qt::Key_Left, SoKeyboardEvent::LEFT_ARROW);
|
|
keyboardmap->insert(Qt::Key_Up, SoKeyboardEvent::UP_ARROW);
|
|
keyboardmap->insert(Qt::Key_Right, SoKeyboardEvent::RIGHT_ARROW);
|
|
keyboardmap->insert(Qt::Key_Down, SoKeyboardEvent::DOWN_ARROW);
|
|
keyboardmap->insert(Qt::Key_PageUp, SoKeyboardEvent::PAGE_UP);
|
|
keyboardmap->insert(Qt::Key_PageDown, SoKeyboardEvent::PAGE_DOWN);
|
|
keyboardmap->insert(Qt::Key_End, SoKeyboardEvent::END);
|
|
|
|
keyboardmap->insert(Qt::Key_F1, SoKeyboardEvent::F1);
|
|
keyboardmap->insert(Qt::Key_F2, SoKeyboardEvent::F2);
|
|
keyboardmap->insert(Qt::Key_F3, SoKeyboardEvent::F3);
|
|
keyboardmap->insert(Qt::Key_F4, SoKeyboardEvent::F4);
|
|
keyboardmap->insert(Qt::Key_F5, SoKeyboardEvent::F5);
|
|
keyboardmap->insert(Qt::Key_F6, SoKeyboardEvent::F6);
|
|
keyboardmap->insert(Qt::Key_F7, SoKeyboardEvent::F7);
|
|
keyboardmap->insert(Qt::Key_F8, SoKeyboardEvent::F8);
|
|
keyboardmap->insert(Qt::Key_F9, SoKeyboardEvent::F9);
|
|
keyboardmap->insert(Qt::Key_F10, SoKeyboardEvent::F10);
|
|
keyboardmap->insert(Qt::Key_F11, SoKeyboardEvent::F11);
|
|
keyboardmap->insert(Qt::Key_F12, SoKeyboardEvent::F12);
|
|
|
|
keyboardmap->insert(Qt::Key_Backspace, SoKeyboardEvent::BACKSPACE);
|
|
keyboardmap->insert(Qt::Key_Tab, SoKeyboardEvent::TAB);
|
|
keyboardmap->insert(Qt::Key_Return, SoKeyboardEvent::RETURN);
|
|
keyboardmap->insert(Qt::Key_Enter, SoKeyboardEvent::ENTER);
|
|
keyboardmap->insert(Qt::Key_Pause, SoKeyboardEvent::PAUSE);
|
|
keyboardmap->insert(Qt::Key_ScrollLock, SoKeyboardEvent::SCROLL_LOCK);
|
|
keyboardmap->insert(Qt::Key_Escape, SoKeyboardEvent::ESCAPE);
|
|
keyboardmap->insert(Qt::Key_Delete, SoKeyboardEvent::DELETE);
|
|
keyboardmap->insert(Qt::Key_Print, SoKeyboardEvent::PRINT);
|
|
keyboardmap->insert(Qt::Key_Insert, SoKeyboardEvent::INSERT);
|
|
keyboardmap->insert(Qt::Key_NumLock, SoKeyboardEvent::NUM_LOCK);
|
|
keyboardmap->insert(Qt::Key_CapsLock, SoKeyboardEvent::CAPS_LOCK);
|
|
|
|
keyboardmap->insert(Qt::Key_Space, SoKeyboardEvent::SPACE);
|
|
keyboardmap->insert(Qt::Key_Apostrophe, SoKeyboardEvent::APOSTROPHE);
|
|
keyboardmap->insert(Qt::Key_Comma, SoKeyboardEvent::COMMA);
|
|
keyboardmap->insert(Qt::Key_Minus, SoKeyboardEvent::MINUS);
|
|
keyboardmap->insert(Qt::Key_Period, SoKeyboardEvent::PERIOD);
|
|
keyboardmap->insert(Qt::Key_Slash, SoKeyboardEvent::SLASH);
|
|
keyboardmap->insert(Qt::Key_Semicolon, SoKeyboardEvent::SEMICOLON);
|
|
keyboardmap->insert(Qt::Key_Equal, SoKeyboardEvent::EQUAL);
|
|
keyboardmap->insert(Qt::Key_BracketLeft, SoKeyboardEvent::BRACKETLEFT);
|
|
keyboardmap->insert(Qt::Key_BracketRight, SoKeyboardEvent::BRACKETRIGHT);
|
|
keyboardmap->insert(Qt::Key_Backslash, SoKeyboardEvent::BACKSLASH);
|
|
keyboardmap->insert(Qt::Key_Agrave, SoKeyboardEvent::GRAVE);
|
|
|
|
// keypad
|
|
|
|
// on Mac OS X, the keypad modifier will also be set when an arrow
|
|
// key is pressed as the arrow keys are considered part of the
|
|
// keypad
|
|
keypadmap->insert(Qt::Key_Left, SoKeyboardEvent::LEFT_ARROW);
|
|
keypadmap->insert(Qt::Key_Up, SoKeyboardEvent::UP_ARROW);
|
|
keypadmap->insert(Qt::Key_Right, SoKeyboardEvent::RIGHT_ARROW);
|
|
keypadmap->insert(Qt::Key_Down, SoKeyboardEvent::DOWN_ARROW);
|
|
|
|
keypadmap->insert(Qt::Key_Enter, SoKeyboardEvent::PAD_ENTER);
|
|
keypadmap->insert(Qt::Key_F1, SoKeyboardEvent::PAD_F1);
|
|
keypadmap->insert(Qt::Key_F2, SoKeyboardEvent::PAD_F2);
|
|
keypadmap->insert(Qt::Key_F3, SoKeyboardEvent::PAD_F3);
|
|
keypadmap->insert(Qt::Key_F4, SoKeyboardEvent::PAD_F4);
|
|
keypadmap->insert(Qt::Key_0, SoKeyboardEvent::PAD_0);
|
|
keypadmap->insert(Qt::Key_1, SoKeyboardEvent::PAD_1);
|
|
keypadmap->insert(Qt::Key_2, SoKeyboardEvent::PAD_2);
|
|
keypadmap->insert(Qt::Key_3, SoKeyboardEvent::PAD_3);
|
|
keypadmap->insert(Qt::Key_4, SoKeyboardEvent::PAD_4);
|
|
keypadmap->insert(Qt::Key_5, SoKeyboardEvent::PAD_5);
|
|
keypadmap->insert(Qt::Key_6, SoKeyboardEvent::PAD_6);
|
|
keypadmap->insert(Qt::Key_7, SoKeyboardEvent::PAD_7);
|
|
keypadmap->insert(Qt::Key_8, SoKeyboardEvent::PAD_8);
|
|
keypadmap->insert(Qt::Key_9, SoKeyboardEvent::PAD_9);
|
|
keypadmap->insert(Qt::Key_Plus, SoKeyboardEvent::PAD_ADD);
|
|
keypadmap->insert(Qt::Key_Minus, SoKeyboardEvent::PAD_SUBTRACT);
|
|
keypadmap->insert(Qt::Key_multiply, SoKeyboardEvent::PAD_MULTIPLY);
|
|
keypadmap->insert(Qt::Key_division, SoKeyboardEvent::PAD_DIVIDE);
|
|
keypadmap->insert(Qt::Key_Tab, SoKeyboardEvent::PAD_TAB);
|
|
keypadmap->insert(Qt::Key_Space, SoKeyboardEvent::PAD_SPACE);
|
|
keypadmap->insert(Qt::Key_Insert, SoKeyboardEvent::PAD_INSERT);
|
|
keypadmap->insert(Qt::Key_Delete, SoKeyboardEvent::PAD_DELETE);
|
|
keypadmap->insert(Qt::Key_Period, SoKeyboardEvent::PAD_PERIOD);
|
|
|
|
|
|
#if 0 // FIXME: don't know what to do with these (20070306 frodo)
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::RIGHT_SHIFT);
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::RIGHT_CONTROL);
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::RIGHT_ALT);
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::PRIOR);
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::NEXT);
|
|
keyboardmap->insert(Qt::, SoKeyboardEvent::SHIFT_LOCK);
|
|
#endif
|
|
}
|
|
|
|
#undef PUBLIC
|