/* # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg # # This program is free software distributed under the GPL version 2. # See http://openslx.org/COPYING # # If you have any feedback please consult http://openslx.org/feedback and # send your suggestions, praise, or complaints to feedback@openslx.org # # General information about OpenSLX can be found at http://openslx.org/ # -------------------------------------------------------------------------- # inputEvent.h: # - Definition of an input event - utility routines # -------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include "inputEvent.h" #include // We implement operators to serialize and load an event: /** * Serialize an input event to a \ref QDataStream. */ QDataStream& operator <<(QDataStream& ostrm, InputEvent const& evt) { ostrm << evt._type << evt._code << evt._value; return ostrm; } /** * Load an input event from a \ref QDataStream. */ QDataStream& operator >>(QDataStream& istrm, InputEvent& evt) { istrm >> evt._type >> evt._code >> evt._value; return istrm; } /** * Produce a string-encodeable representation of an input event. * This consists of a base64-encoded binary representation as * generated by \ref{operator<<(QDataStream&, InputEvent const&)}. */ void eventToString(InputEvent const& evt, QString& str) { QByteArray ba; QBuffer buf(&ba); buf.open(QIODevice::WriteOnly); QDataStream out(&buf); out << evt; str = QString::fromAscii(ba.toBase64()); } /** * Decode the string representation of an input-event produced by * \ref eventToString. */ bool eventFromString(QString const& str, InputEvent& evt) { // TODO This does not do proper error checking. Only use from trusted sources! QByteArray ba = QByteArray::fromBase64(str.toAscii()); QBuffer buf(&ba); buf.open(QIODevice::ReadOnly); QDataStream in(&buf); in >> evt; return true; } quint16 InputEvent::mouseButtonsFromQt(int b) { quint16 ret = 0; if(b & Qt::LeftButton) { ret |= EB_LEFT; } if(b & Qt::RightButton) { ret |= EB_RIGHT; } if(b & Qt::MidButton) { ret |= EB_MIDDLE; } return ret; } InputEvent InputEvent::mousePressRelease(int qt_button, int qt_buttons) { quint16 button = mouseButtonsFromQt(qt_button); quint16 buttons = mouseButtonsFromQt(qt_buttons); quint16 code; if(buttons & button) { code = EC_PRESS; } else { code = EC_RELEASE; } quint32 value = ((quint32)button << 16) | buttons; return InputEvent(ET_BUTTON, code, value); } InputEvent InputEvent::keyboardPress(int key, int mods) { quint32 value = key | mods; return InputEvent(ET_KEY, EC_PRESS, value); } InputEvent InputEvent::keyboardRelease(int key, int mods) { quint32 value = key | mods; return InputEvent(ET_KEY, EC_RELEASE, value); } #define describe(list, description, type, code, value) \ list.append(SpecialInputEventDescription(InputEvent::type, InputEvent::code, value, description)) QList SpecialInputEventDescription::describeSpecialEvents() { QList list; describe(list, InputEvent::tr("Say Hello"), ET_SPECIAL, EC_SAY_HELLO, 0); describe(list, InputEvent::tr("Reboot"), ET_SPECIAL, EC_REBOOT, 0); describe(list, InputEvent::tr("Kill X Server"), ET_SPECIAL, EC_KILL_X, 0); describe(list, InputEvent::tr("Reboot immediately"), ET_SPECIAL, EC_SYSRQ, 'b'); describe(list, InputEvent::tr("Power off immediately"), ET_SPECIAL, EC_SYSRQ, 'o'); describe(list, InputEvent::tr("Crash System"), ET_SPECIAL, EC_SYSRQ, 'c'); describe(list, InputEvent::tr("Turn off raw keyboard mode"), ET_SPECIAL, EC_SYSRQ, 'r'); describe(list, InputEvent::tr("Send SIGTERM to all"), ET_SPECIAL, EC_SYSRQ, 'e'); describe(list, InputEvent::tr("Send SIGKILL to all"), ET_SPECIAL, EC_SYSRQ, 'i'); describe(list, InputEvent::tr("Kill all on this terminal"), ET_SPECIAL, EC_SYSRQ, 'k'); describe(list, InputEvent::tr("Activate OOM killer"), ET_SPECIAL, EC_SYSRQ, 'f'); describe(list, InputEvent::tr("Make real-time tasks niceable"), ET_SPECIAL, EC_SYSRQ, 'n'); describe(list, InputEvent::tr("Force-thaw filesystems"), ET_SPECIAL, EC_SYSRQ, 'j'); describe(list, InputEvent::tr("Sync all mounted filesystems"), ET_SPECIAL, EC_SYSRQ, 's'); describe(list, InputEvent::tr("Remount all readonly"), ET_SPECIAL, EC_SYSRQ, 'u'); describe(list, InputEvent::tr("Show all held locks"), ET_SPECIAL, EC_SYSRQ, 'd'); describe(list, InputEvent::tr("Show stack traces"), ET_SPECIAL, EC_SYSRQ, 'l'); describe(list, InputEvent::tr("Dump memory info"), ET_SPECIAL, EC_SYSRQ, 'm'); describe(list, InputEvent::tr("Dump registers and flags"), ET_SPECIAL, EC_SYSRQ, 'p'); describe(list, InputEvent::tr("Dump timers and clockevents"), ET_SPECIAL, EC_SYSRQ, 'q'); describe(list, InputEvent::tr("Dump task list"), ET_SPECIAL, EC_SYSRQ, 't'); describe(list, InputEvent::tr("Dump uninterruptible tasks"), ET_SPECIAL, EC_SYSRQ, 'w'); describe(list, InputEvent::tr("Dump ftrace buffer"), ET_SPECIAL, EC_SYSRQ, 'z'); return list; }