summaryrefslogblamecommitdiffstats
path: root/src/input/inputEvent.cpp
blob: 9b69a3a01b6c9039ea1648e7acf7d8c581fa3721 (plain) (tree)



































































                                                                                      
                                                                       
 

                                                         














                                                          
                                                       
 
                                   


                                                   
                                                         
 
                                   

                                                     
 
/*
 * inputEvent.cpp
 *
 *  Created on: 06.09.2010
 *      Author: brs
 */

#include <QBuffer>
#include <QByteArray>
#include <QDataStream>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QString>
#include "inputEvent.h"
#include <src/util/consoleLogger.h>

// We implement operators to serialize and load an event:
QDataStream& operator <<(QDataStream& ostrm, InputEvent const& evt)
{
	ostrm << evt.type_ << evt.code_ << evt.value_;
	return ostrm;
}

QDataStream& operator >>(QDataStream& istrm, InputEvent& evt)
{
	istrm >> evt.type_ >> evt.code_ >> evt.value_;
	return istrm;
}

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());
}

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);
}