Merge pull request #39 from minger0/master
mouse absolute coordinate support
This commit is contained in:
27
src/axis.cpp
27
src/axis.cpp
@ -13,7 +13,9 @@ Axis::Axis( int i, QObject *parent ) : QObject(parent) {
|
|||||||
isOn = false;
|
isOn = false;
|
||||||
isDown = false;
|
isDown = false;
|
||||||
state = 0;
|
state = 0;
|
||||||
|
interpretation = ZeroOne;
|
||||||
gradient = false;
|
gradient = false;
|
||||||
|
absolute = false;
|
||||||
toDefault();
|
toDefault();
|
||||||
tick = 0;
|
tick = 0;
|
||||||
}
|
}
|
||||||
@ -117,8 +119,20 @@ bool Axis::read( QTextStream &stream ) {
|
|||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
//the rest of the options are keywords without integers
|
//the rest of the options are keywords without integers
|
||||||
else if (*it == "gradient") {
|
else if (*it == "zeroone") {
|
||||||
|
interpretation = ZeroOne;
|
||||||
|
gradient = false;
|
||||||
|
absolute = false;
|
||||||
|
}
|
||||||
|
else if (*it == "absolute") {
|
||||||
|
interpretation = AbsolutePos;
|
||||||
gradient = true;
|
gradient = true;
|
||||||
|
absolute = true;
|
||||||
|
}
|
||||||
|
else if (*it == "gradient") {
|
||||||
|
interpretation = Gradient;
|
||||||
|
gradient = true;
|
||||||
|
absolute = false;
|
||||||
}
|
}
|
||||||
else if (*it == "throttle+") {
|
else if (*it == "throttle+") {
|
||||||
throttle = 1;
|
throttle = 1;
|
||||||
@ -157,7 +171,8 @@ void Axis::timerCalled() {
|
|||||||
|
|
||||||
void Axis::write( QTextStream &stream ) {
|
void Axis::write( QTextStream &stream ) {
|
||||||
stream << "\tAxis " << (index+1) << ": ";
|
stream << "\tAxis " << (index+1) << ": ";
|
||||||
if (gradient) stream << "gradient, ";
|
stream << ((interpretation == ZeroOne)?"ZeroOne":
|
||||||
|
(interpretation == Gradient)?"Gradient":"Absolute") << ", ";
|
||||||
if (throttle > 0) stream << "throttle+, ";
|
if (throttle > 0) stream << "throttle+, ";
|
||||||
else if (throttle < 0) stream << "throttle-, ";
|
else if (throttle < 0) stream << "throttle-, ";
|
||||||
if (dZone != DZONE) stream << "dZone " << dZone << ", ";
|
if (dZone != DZONE) stream << "dZone " << dZone << ", ";
|
||||||
@ -235,7 +250,9 @@ void Axis::jsevent( int value ) {
|
|||||||
|
|
||||||
void Axis::toDefault() {
|
void Axis::toDefault() {
|
||||||
release();
|
release();
|
||||||
|
interpretation = ZeroOne;
|
||||||
gradient = false;
|
gradient = false;
|
||||||
|
absolute = false;
|
||||||
throttle = 0;
|
throttle = 0;
|
||||||
maxSpeed = 100;
|
maxSpeed = 100;
|
||||||
transferCurve = Quadratic;
|
transferCurve = Quadratic;
|
||||||
@ -254,7 +271,9 @@ void Axis::toDefault() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Axis::isDefault() {
|
bool Axis::isDefault() {
|
||||||
return (gradient == false) &&
|
return (interpretation == ZeroOne) &&
|
||||||
|
(gradient == false) &&
|
||||||
|
(absolute == false) &&
|
||||||
(throttle == 0) &&
|
(throttle == 0) &&
|
||||||
(maxSpeed == 100) &&
|
(maxSpeed == 100) &&
|
||||||
(dZone == DZONE) &&
|
(dZone == DZONE) &&
|
||||||
@ -414,7 +433,7 @@ void Axis::move( bool press ) {
|
|||||||
//if not gradient, always go full speed.
|
//if not gradient, always go full speed.
|
||||||
else dist = maxSpeed;
|
else dist = maxSpeed;
|
||||||
|
|
||||||
e.type = FakeEvent::MouseMove;
|
e.type = absolute ? FakeEvent::MouseMoveAbsolute : FakeEvent::MouseMove;
|
||||||
if (mode == MousePosVert) {
|
if (mode == MousePosVert) {
|
||||||
e.move.x = 0;
|
e.move.x = 0;
|
||||||
e.move.y = dist;
|
e.move.y = dist;
|
||||||
|
@ -22,6 +22,7 @@ class Axis : public QObject {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
//each axis can create a key press or move the mouse in one of four directions.
|
//each axis can create a key press or move the mouse in one of four directions.
|
||||||
|
enum Interpretation { ZeroOne, Gradient, AbsolutePos };
|
||||||
enum Mode {Keyboard, MousePosVert, MouseNegVert, MousePosHor, MouseNegHor};
|
enum Mode {Keyboard, MousePosVert, MouseNegVert, MousePosHor, MouseNegHor};
|
||||||
enum TransferCurve {Linear, Quadratic, Cubic, QuadraticExtreme,
|
enum TransferCurve {Linear, Quadratic, Cubic, QuadraticExtreme,
|
||||||
PowerFunction};
|
PowerFunction};
|
||||||
@ -76,7 +77,9 @@ class Axis : public QObject {
|
|||||||
float inverseRange;
|
float inverseRange;
|
||||||
|
|
||||||
//actual axis settings:
|
//actual axis settings:
|
||||||
|
Interpretation interpretation;
|
||||||
bool gradient;
|
bool gradient;
|
||||||
|
bool absolute;
|
||||||
int maxSpeed; //0..MAXMOUSESPEED
|
int maxSpeed; //0..MAXMOUSESPEED
|
||||||
unsigned int transferCurve;
|
unsigned int transferCurve;
|
||||||
float sensitivity;
|
float sensitivity;
|
||||||
|
@ -23,9 +23,12 @@ AxisEdit::AxisEdit( Axis* ax )
|
|||||||
QVBoxLayout* v2 = new QVBoxLayout();
|
QVBoxLayout* v2 = new QVBoxLayout();
|
||||||
v2->setMargin(5);
|
v2->setMargin(5);
|
||||||
v2->setSpacing(5);
|
v2->setSpacing(5);
|
||||||
chkGradient = new QCheckBox(tr("&Gradient"), this);
|
chkGradient = new QComboBox(this);
|
||||||
chkGradient->setChecked(axis->gradient);
|
chkGradient->insertItem((int) Axis::ZeroOne, tr("Use 0 or max always"), Qt::DisplayRole);
|
||||||
connect(chkGradient, SIGNAL(toggled(bool)), this, SLOT( gradientChanged( bool )));
|
chkGradient->insertItem((int) Axis::Gradient, tr("Relative movement (previously gradient)"), Qt::DisplayRole);
|
||||||
|
chkGradient->insertItem((int) Axis::AbsolutePos, tr("Absolute movement (direct position)"), Qt::DisplayRole);
|
||||||
|
chkGradient->setCurrentIndex( axis->interpretation );
|
||||||
|
connect(chkGradient, SIGNAL(activated(int)), this, SLOT( gradientChanged( int )));
|
||||||
v2->addWidget(chkGradient);
|
v2->addWidget(chkGradient);
|
||||||
|
|
||||||
cmbMode = new QComboBox(this);
|
cmbMode = new QComboBox(this);
|
||||||
@ -103,6 +106,7 @@ AxisEdit::AxisEdit( Axis* ax )
|
|||||||
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
||||||
v->addWidget(buttonBox);
|
v->addWidget(buttonBox);
|
||||||
|
|
||||||
|
gradientChanged( axis->interpretation );
|
||||||
modeChanged( axis->mode );
|
modeChanged( axis->mode );
|
||||||
transferCurveChanged( axis->transferCurve );
|
transferCurveChanged( axis->transferCurve );
|
||||||
throttleChanged( axis->throttle + 1 );
|
throttleChanged( axis->throttle + 1 );
|
||||||
@ -116,9 +120,10 @@ void AxisEdit::show() {
|
|||||||
void AxisEdit::setState( int val ) {
|
void AxisEdit::setState( int val ) {
|
||||||
slider->setValue( val );
|
slider->setValue( val );
|
||||||
}
|
}
|
||||||
void AxisEdit::gradientChanged( bool on ) {
|
void AxisEdit::gradientChanged( int index ) {
|
||||||
cmbTransferCurve->setEnabled(on);
|
bool gradient = index != Axis::ZeroOne;
|
||||||
if (on) {
|
cmbTransferCurve->setEnabled(gradient);
|
||||||
|
if (gradient) {
|
||||||
transferCurveChanged( axis->transferCurve );
|
transferCurveChanged( axis->transferCurve );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -135,7 +140,7 @@ void AxisEdit::modeChanged( int index ) {
|
|||||||
else {
|
else {
|
||||||
mouseBox->setEnabled(true);
|
mouseBox->setEnabled(true);
|
||||||
keyBox->setEnabled(false);
|
keyBox->setEnabled(false);
|
||||||
if (chkGradient->isChecked()) {
|
if ((Axis::Interpretation)chkGradient->currentIndex() != Axis::ZeroOne) {
|
||||||
cmbTransferCurve->setEnabled(true);
|
cmbTransferCurve->setEnabled(true);
|
||||||
transferCurveChanged( axis->transferCurve );
|
transferCurveChanged( axis->transferCurve );
|
||||||
}
|
}
|
||||||
@ -172,7 +177,9 @@ void AxisEdit::throttleChanged( int index ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AxisEdit::accept() {
|
void AxisEdit::accept() {
|
||||||
axis->gradient = chkGradient->isChecked();
|
axis->interpretation = (Axis::Interpretation)chkGradient->currentIndex();
|
||||||
|
axis->gradient = axis->interpretation != Axis::ZeroOne;
|
||||||
|
axis->absolute = axis->interpretation == Axis::AbsolutePos;
|
||||||
axis->maxSpeed = spinSpeed->value();
|
axis->maxSpeed = spinSpeed->value();
|
||||||
axis->transferCurve = (Axis::TransferCurve)cmbTransferCurve->currentIndex();
|
axis->transferCurve = (Axis::TransferCurve)cmbTransferCurve->currentIndex();
|
||||||
axis->sensitivity = spinSensitivity->value();
|
axis->sensitivity = spinSensitivity->value();
|
||||||
|
@ -24,7 +24,7 @@ class AxisEdit : public QDialog {
|
|||||||
void setState( int val );
|
void setState( int val );
|
||||||
protected slots:
|
protected slots:
|
||||||
//slots for GUI events
|
//slots for GUI events
|
||||||
void gradientChanged( bool on );
|
void gradientChanged( int index );
|
||||||
void modeChanged( int index );
|
void modeChanged( int index );
|
||||||
void transferCurveChanged( int index );
|
void transferCurveChanged( int index );
|
||||||
void throttleChanged( int index );
|
void throttleChanged( int index );
|
||||||
@ -33,8 +33,7 @@ class AxisEdit : public QDialog {
|
|||||||
//the associated Axis that needs to be set.
|
//the associated Axis that needs to be set.
|
||||||
Axis *axis;
|
Axis *axis;
|
||||||
//the important parts of the dialog:
|
//the important parts of the dialog:
|
||||||
QCheckBox *chkGradient;
|
QComboBox *chkGradient, *cmbMode, *cmbThrottle, *cmbTransferCurve;
|
||||||
QComboBox *cmbMode, *cmbThrottle, *cmbTransferCurve;
|
|
||||||
QFrame *mouseBox, *keyBox;
|
QFrame *mouseBox, *keyBox;
|
||||||
QSpinBox *spinSpeed;
|
QSpinBox *spinSpeed;
|
||||||
QLabel *lblSensitivity;
|
QLabel *lblSensitivity;
|
||||||
|
@ -11,6 +11,19 @@ void sendevent(const FakeEvent &e) {
|
|||||||
XTestFakeRelativeMotionEvent(display, e.move.x, e.move.y, 0);
|
XTestFakeRelativeMotionEvent(display, e.move.x, e.move.y, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FakeEvent::MouseMoveAbsolute:
|
||||||
|
{
|
||||||
|
Screen* screen = XDefaultScreenOfDisplay(display);
|
||||||
|
static int rememberX = 0, rememberY = 0;
|
||||||
|
if (e.move.x) rememberX = e.move.x;
|
||||||
|
if (e.move.y) rememberY = e.move.y;
|
||||||
|
const int scaledX100 = rememberX * (XWidthOfScreen(screen)/2) / 100;
|
||||||
|
const int scaledY100 = rememberY * (XHeightOfScreen(screen)/2) / 100;
|
||||||
|
XTestFakeMotionEvent(display, DefaultScreen(display),
|
||||||
|
XWidthOfScreen(screen)/2 + scaledX100,
|
||||||
|
XHeightOfScreen(screen)/2 + scaledY100, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case FakeEvent::KeyUp:
|
case FakeEvent::KeyUp:
|
||||||
if (e.keycode == 0) return;
|
if (e.keycode == 0) return;
|
||||||
XTestFakeKeyEvent(display, e.keycode, false, 0);
|
XTestFakeKeyEvent(display, e.keycode, false, 0);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
struct FakeEvent {
|
struct FakeEvent {
|
||||||
//types of events QJoyPad can create.
|
//types of events QJoyPad can create.
|
||||||
//KeyRelease, KeyPress, ButtonRelease, ButtonPress, and MouseMove
|
//KeyRelease, KeyPress, ButtonRelease, ButtonPress, and MouseMove
|
||||||
enum EventType {KeyUp, KeyDown, MouseUp, MouseDown, MouseMove};
|
enum EventType {KeyUp, KeyDown, MouseUp, MouseDown, MouseMove, MouseMoveAbsolute};
|
||||||
|
|
||||||
EventType type;
|
EventType type;
|
||||||
union {
|
union {
|
||||||
|
Reference in New Issue
Block a user