straight copy of qt4 branch over to trunk, merge refused to work
git-svn-id: svn://svn.code.sf.net/p/qjoypad/code/trunk@95 c05e91a0-76c8-4ec0-b377-ef19ce7cc080
This commit is contained in:
committed by
virtuoussin13
parent
c1ef3fa0b7
commit
345bb5748e
23
src/axis.h
23
src/axis.h
@ -4,11 +4,11 @@
|
||||
//abs()
|
||||
#include <stdlib.h>
|
||||
|
||||
//parent of Axis
|
||||
#include "component.h"
|
||||
|
||||
//to request a periodic tap on the shoulder for gradient mode
|
||||
#include "timer.h"
|
||||
#include <QTimer>
|
||||
#include <QTextStream>
|
||||
#include <QRegExp>
|
||||
#include <QStringList>
|
||||
#include "constant.h"
|
||||
|
||||
//default and arbitrary values for dZone and xZone
|
||||
#define DZONE 3000
|
||||
@ -18,8 +18,9 @@
|
||||
enum AxisMode {keybd, mousepv, mousenv, mouseph, mousenh};
|
||||
|
||||
//represents one joystick axis
|
||||
class Axis : public Component {
|
||||
//so AxisEdit can manipulate fields directly.
|
||||
class Axis : public QObject {
|
||||
Q_OBJECT
|
||||
//so AxisEdit can manipulate fields directly.
|
||||
friend class AxisEdit;
|
||||
public:
|
||||
Axis( int i );
|
||||
@ -45,12 +46,13 @@ class Axis : public Component {
|
||||
void setKey(bool positive, int value);
|
||||
//happens every MSEC milliseconds (constant.h)
|
||||
//uses tick to decide if key events should be generated
|
||||
void timer( int tick );
|
||||
void timerTick( int tick );
|
||||
//recalculates the gradient curve. This should be run every time
|
||||
//maxSpeed, xZone, or dZone are changed.
|
||||
void adjustGradient();
|
||||
protected:
|
||||
//This axis is logically depressed (positive or negative)
|
||||
int tick;
|
||||
//This axis is logically depressed (positive or negative)
|
||||
//if the axis is gradient, this is true even if it is not
|
||||
//currently generating a keypress at the instant.
|
||||
bool isOn;
|
||||
@ -84,6 +86,9 @@ class Axis : public Component {
|
||||
//note, the key is still clicked at the same pace no matter what,
|
||||
//this just decides how long it stays down each cycle.
|
||||
int duration;
|
||||
QTimer *timer;
|
||||
public slots:
|
||||
void timerCalled();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,131 +1,150 @@
|
||||
#include "axis_edit.h"
|
||||
|
||||
|
||||
AxisEdit::AxisEdit( Axis* ax )
|
||||
:QDialog() {
|
||||
//build the dialog, display current axis settings :)
|
||||
axis = ax;
|
||||
setCaption("Set " + axis->getName());
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
//h, v, and v2 are all references to layouts. They are used to refer to
|
||||
//various layouts as the dialog is built and are not pointing to the same
|
||||
//thing throughout. This is just because I don't care about the layouts
|
||||
//after I have placed the widgets within them and there's no reasno to
|
||||
//keep track of them.
|
||||
|
||||
QVBoxLayout* v = new QVBoxLayout(this, 5, 5);
|
||||
|
||||
QHBoxLayout* h = new QHBoxLayout();
|
||||
QVBoxLayout* v2 = new QVBoxLayout(0,5,5);
|
||||
CGradient = new QCheckBox("Gradient", this);
|
||||
CGradient->setChecked(axis->gradient);
|
||||
v2->addWidget(CGradient);
|
||||
|
||||
CMode = new QComboBox(this);
|
||||
CMode->insertItem("Keyboard",keybd);
|
||||
CMode->insertItem("Mouse (Vert.)",mousepv);
|
||||
CMode->insertItem("Mouse (Vert. Rev.)", mousenv);
|
||||
CMode->insertItem("Mouse (Hor.)", mouseph);
|
||||
CMode->insertItem("Mouse (Hor. Rev.)", mousenh);
|
||||
CMode->setCurrentItem( axis->mode );
|
||||
connect(CMode, SIGNAL(activated(int)), this, SLOT( CModeChanged( int )));
|
||||
v2->addWidget(CMode);
|
||||
h->addLayout(v2);
|
||||
|
||||
MouseBox = new QFrame(this);
|
||||
MouseBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
v2 = new QVBoxLayout(MouseBox,5,5);
|
||||
v2->setAutoAdd(true);
|
||||
new QLabel("Mouse Speed", MouseBox);
|
||||
SSpeed = new QSpinBox(0,MAXMOUSESPEED,1,MouseBox);
|
||||
SSpeed->setValue(axis->maxSpeed);
|
||||
h->addWidget(MouseBox);
|
||||
v->addLayout(h);
|
||||
:QDialog() {
|
||||
//build the dialog, display current axis settings :)
|
||||
axis = ax;
|
||||
setWindowTitle("Set " + axis->getName());
|
||||
setWindowIcon(QPixmap(ICON24));
|
||||
|
||||
Slider = new JoySlider(axis->dZone, axis->xZone, axis->state, this);
|
||||
v->addWidget(Slider);
|
||||
//h, v, and v2 are all references to layouts. They are used to refer to
|
||||
//various layouts as the dialog is built and are not pointing to the same
|
||||
//thing throughout. This is just because I don't care about the layouts
|
||||
//after I have placed the widgets within them and there's no reasno to
|
||||
//keep track of them.
|
||||
|
||||
KeyBox = new QFrame(this);
|
||||
KeyBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
h = new QHBoxLayout(KeyBox, 5, 5);
|
||||
h->setAutoAdd(true);
|
||||
BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox);
|
||||
|
||||
CThrottle = new QComboBox(KeyBox);
|
||||
CThrottle->insertItem("Neg. Throttle",0);
|
||||
CThrottle->insertItem("No Throttle",1);
|
||||
CThrottle->insertItem("Pos. Throttle",2);
|
||||
CThrottle->setCurrentItem(axis->throttle + 1);
|
||||
connect( CThrottle, SIGNAL( activated( int )), this, SLOT( CThrottleChanged( int )));
|
||||
|
||||
BPos = new KeyButton(axis->getName(),axis->pkeycode,KeyBox);
|
||||
v->addWidget( KeyBox );
|
||||
|
||||
h = new QHBoxLayout();
|
||||
BOkay = new QPushButton("Okay", this);
|
||||
connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept()));
|
||||
h->addWidget(BOkay);
|
||||
BCancel = new QPushButton("Cancel", this);
|
||||
connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject()));
|
||||
h->addWidget(BCancel);
|
||||
v->addLayout(h);
|
||||
|
||||
CModeChanged( axis->mode );
|
||||
CThrottleChanged( axis->throttle + 1 );
|
||||
QVBoxLayout* v = new QVBoxLayout(this);
|
||||
v->setMargin(5);
|
||||
v->setSpacing(5);
|
||||
|
||||
QHBoxLayout* h = new QHBoxLayout();
|
||||
QVBoxLayout* v2 = new QVBoxLayout();
|
||||
v2->setMargin(5);
|
||||
v2->setSpacing(5);
|
||||
CGradient = new QCheckBox("Gradient", this);
|
||||
CGradient->setChecked(axis->gradient);
|
||||
v2->addWidget(CGradient);
|
||||
|
||||
CMode = new QComboBox(this);
|
||||
CMode->insertItem((int)keybd, QString("Keyboard"), QVariant(NULL));
|
||||
CMode->insertItem((int) mousepv,QString("Mouse (Vert.)"),QVariant(NULL));
|
||||
CMode->insertItem((int) mousenv, QString("Mouse (Vert. Rev.)"), QVariant(NULL));
|
||||
CMode->insertItem((int) mouseph, "Mouse (Hor.)", QVariant(NULL));
|
||||
CMode->insertItem((int)mousenh, QString("Mouse (Hor. Rev.)"), NULL);
|
||||
CMode->setCurrentIndex( axis->mode );
|
||||
connect(CMode, SIGNAL(activated(int)), this, SLOT( CModeChanged( int )));
|
||||
v2->addWidget(CMode);
|
||||
h->addLayout(v2);
|
||||
|
||||
MouseBox = new QFrame(this);
|
||||
MouseBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
v2 = new QVBoxLayout(MouseBox);
|
||||
v2->setSpacing(5);
|
||||
v2->setMargin(5);
|
||||
//v2->setAutoAdd(true);
|
||||
QLabel *mouseLabel = new QLabel("Mouse Speed", MouseBox);
|
||||
v2->addWidget(mouseLabel);
|
||||
SSpeed = new QSpinBox(MouseBox);
|
||||
SSpeed->setRange(0,MAXMOUSESPEED);
|
||||
SSpeed->setSingleStep(1);
|
||||
SSpeed->setValue(axis->maxSpeed);
|
||||
v2->addWidget(SSpeed);
|
||||
h->addWidget(MouseBox);
|
||||
v->addLayout(h);
|
||||
|
||||
Slider = new JoySlider(axis->dZone, axis->xZone, axis->state, this);
|
||||
v->addWidget(Slider);
|
||||
|
||||
KeyBox = new QFrame(this);
|
||||
KeyBox->setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||||
h = new QHBoxLayout(KeyBox);
|
||||
h->setSpacing(5);
|
||||
h->setMargin(5);
|
||||
//h->setAutoAdd(true);
|
||||
BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox);
|
||||
|
||||
CThrottle = new QComboBox(KeyBox);
|
||||
CThrottle->insertItem(0,"Neg. Throttle",QVariant(NULL));
|
||||
CThrottle->insertItem(1,"No Throttle",QVariant(NULL));
|
||||
CThrottle->insertItem(2,"Pos. Throttle",QVariant(NULL));
|
||||
CThrottle->setCurrentIndex(axis->throttle + 1);
|
||||
connect( CThrottle, SIGNAL( activated( int )), this, SLOT( CThrottleChanged( int )));
|
||||
|
||||
BPos = new KeyButton(axis->getName(),axis->pkeycode,KeyBox);
|
||||
h->addWidget(BNeg);
|
||||
h->addWidget(CThrottle);
|
||||
h->addWidget(BPos);
|
||||
v->addWidget( KeyBox );
|
||||
|
||||
h = new QHBoxLayout();
|
||||
BOkay = new QPushButton("Okay", this);
|
||||
connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept()));
|
||||
h->addWidget(BOkay);
|
||||
BCancel = new QPushButton("Cancel", this);
|
||||
connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject()));
|
||||
h->addWidget(BCancel);
|
||||
v->addLayout(h);
|
||||
|
||||
CModeChanged( axis->mode );
|
||||
CThrottleChanged( axis->throttle + 1 );
|
||||
}
|
||||
|
||||
void AxisEdit::show() {
|
||||
QDialog::show();
|
||||
setFixedSize(size());
|
||||
QDialog::show();
|
||||
setFixedSize(size());
|
||||
}
|
||||
|
||||
void AxisEdit::setState( int val ) {
|
||||
Slider->setValue( val );
|
||||
Slider->setValue( val );
|
||||
}
|
||||
|
||||
void AxisEdit::CModeChanged( int index ) {
|
||||
if (index == keybd) {
|
||||
MouseBox->setEnabled(false);
|
||||
KeyBox->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
MouseBox->setEnabled(true);
|
||||
KeyBox->setEnabled(false);
|
||||
}
|
||||
if (index == keybd) {
|
||||
MouseBox->setEnabled(false);
|
||||
KeyBox->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
MouseBox->setEnabled(true);
|
||||
KeyBox->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
void AxisEdit::CThrottleChanged( int index ) {
|
||||
switch (index) {
|
||||
case 0: BNeg->setEnabled(true);
|
||||
BPos->setEnabled(false);
|
||||
break;
|
||||
case 1: BNeg->setEnabled(true);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
case 2: BNeg->setEnabled(false);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
}
|
||||
Slider->setThrottle( index - 1 );
|
||||
switch (index) {
|
||||
case 0:
|
||||
BNeg->setEnabled(true);
|
||||
BPos->setEnabled(false);
|
||||
break;
|
||||
case 1:
|
||||
BNeg->setEnabled(true);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
case 2:
|
||||
BNeg->setEnabled(false);
|
||||
BPos->setEnabled(true);
|
||||
break;
|
||||
}
|
||||
Slider->setThrottle( index - 1 );
|
||||
}
|
||||
|
||||
void AxisEdit::accept() {
|
||||
//if the gradient status has changed, either request a timer or turn it down.
|
||||
if (axis->gradient) {
|
||||
if (!CGradient->isChecked()) tossTimer(axis);
|
||||
}
|
||||
else {
|
||||
if (CGradient->isChecked()) takeTimer(axis);
|
||||
}
|
||||
axis->gradient = CGradient->isChecked();
|
||||
axis->maxSpeed = SSpeed->value();
|
||||
axis->throttle = CThrottle->currentItem() - 1;
|
||||
axis->dZone = Slider->dZone();
|
||||
axis->xZone = Slider->xZone();
|
||||
axis->mode = (AxisMode) CMode->currentItem();
|
||||
axis->pkeycode = BPos->getValue();
|
||||
axis->nkeycode = BNeg->getValue();
|
||||
axis->adjustGradient();
|
||||
/*if (axis->gradient) {
|
||||
if (!CGradient->isChecked()) tossTimer(axis);
|
||||
}
|
||||
else {
|
||||
if (CGradient->isChecked()) takeTimer(axis);
|
||||
}*/
|
||||
axis->gradient = CGradient->isChecked();
|
||||
axis->maxSpeed = SSpeed->value();
|
||||
axis->throttle = CThrottle->currentIndex() - 1;
|
||||
axis->dZone = Slider->dZone();
|
||||
axis->xZone = Slider->xZone();
|
||||
axis->mode = (AxisMode) CMode->currentIndex();
|
||||
axis->pkeycode = BPos->getValue();
|
||||
axis->nkeycode = BNeg->getValue();
|
||||
axis->adjustGradient();
|
||||
|
||||
QDialog::accept();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
@ -1,22 +1,16 @@
|
||||
#ifndef AXIS_EDIT_H
|
||||
#define AXIS_EDIT_H
|
||||
|
||||
//to refer to the axis we're editing
|
||||
//for building up the dialog we need
|
||||
#include <qdialog.h>
|
||||
#include <qcheckbox.h>
|
||||
#include <qcombobox.h>
|
||||
#include <qframe.h>
|
||||
#include <qspinbox.h>
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
|
||||
#include "axis.h"
|
||||
#include <QComboBox>
|
||||
#include <QSpinBox>
|
||||
#include <QCheckBox>
|
||||
#include <QLabel>
|
||||
//for my home-brewed widgets
|
||||
#include "joyslider.h"
|
||||
#include "keycode.h"
|
||||
|
||||
//to refer to the axis we're editing
|
||||
#include "axis.h"
|
||||
|
||||
class AxisEdit : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
@ -1,37 +1,38 @@
|
||||
#include "axisw.h"
|
||||
|
||||
|
||||
AxisWidget::AxisWidget( Axis* a, QWidget* parent )
|
||||
: FlashButton( "",parent) {
|
||||
axis = a;
|
||||
ae = NULL;
|
||||
update();
|
||||
on = false;
|
||||
: FlashButton( "",parent) {
|
||||
axis = a;
|
||||
ae = NULL;
|
||||
update();
|
||||
on = false;
|
||||
}
|
||||
|
||||
void AxisWidget::jsevent( int val ) {
|
||||
bool newOn = !axis->inDeadZone(val);
|
||||
if (on != newOn) {
|
||||
on = newOn;
|
||||
flash();
|
||||
}
|
||||
if (ae != NULL) ae->setState(val);
|
||||
bool newOn = !axis->inDeadZone(val);
|
||||
if (on != newOn) {
|
||||
on = newOn;
|
||||
flash();
|
||||
}
|
||||
if (ae != NULL) ae->setState(val);
|
||||
}
|
||||
|
||||
void AxisWidget::update() {
|
||||
setText( axis->status());
|
||||
setText( axis->status());
|
||||
}
|
||||
|
||||
void AxisWidget::mouseReleaseEvent( QMouseEvent* e ) {
|
||||
//create the edit dialog,
|
||||
ae = new AxisEdit(axis);
|
||||
//get its input
|
||||
ae->exec();
|
||||
//now that it's done, destroy it!
|
||||
delete ae;
|
||||
//and remember that it's gone.
|
||||
ae = NULL;
|
||||
update();
|
||||
//release the button. Waiting to do this until the very end has the nice
|
||||
//effect of keeping the button depressed while the dialog is shown.
|
||||
FlashButton::mouseReleaseEvent( e );
|
||||
//create the edit dialog,
|
||||
ae = new AxisEdit(axis);
|
||||
//get its input
|
||||
ae->exec();
|
||||
//now that it's done, destroy it!
|
||||
delete ae;
|
||||
//and remember that it's gone.
|
||||
ae = NULL;
|
||||
update();
|
||||
//release the button. Waiting to do this until the very end has the nice
|
||||
//effect of keeping the button depressed while the dialog is shown.
|
||||
FlashButton::mouseReleaseEvent( e );
|
||||
}
|
||||
|
@ -1,13 +1,15 @@
|
||||
#ifndef AXIS_WIDGET_H
|
||||
#define AXIS_WIDGET_H
|
||||
|
||||
#include <QMouseEvent>
|
||||
//so we can interact with the axis this refers to
|
||||
#include "axis.h"
|
||||
//so we can edit this axis when the user clicks the button
|
||||
#include "axis_edit.h"
|
||||
//for the FlashButton widget
|
||||
#include "flash.h"
|
||||
|
||||
//so we can edit this axis when the user clicks the button
|
||||
#include "axis_edit.h"
|
||||
|
||||
class AxisWidget : public FlashButton {
|
||||
public:
|
||||
AxisWidget( Axis* a, QWidget* parent );
|
||||
|
254
src/button.cpp
254
src/button.cpp
@ -1,156 +1,178 @@
|
||||
#include "button.h"
|
||||
|
||||
#include "event.h"
|
||||
|
||||
Button::Button( int i ) {
|
||||
index = i;
|
||||
isOn = false;
|
||||
//to keep toDefault from calling tossTimer without first calling takeTimer
|
||||
rapidfire = false;
|
||||
toDefault();
|
||||
index = i;
|
||||
isButtonPressed = false;
|
||||
isDown = false;
|
||||
rapidfire = false;
|
||||
timer = new QTimer(this);
|
||||
toDefault();
|
||||
tick = 0;
|
||||
}
|
||||
|
||||
Button::~Button() {
|
||||
release();
|
||||
release();
|
||||
//delete timer;
|
||||
}
|
||||
|
||||
bool Button::read( QTextStream* stream ) {
|
||||
// at this point, toDefault() has just been called.
|
||||
|
||||
//read in a line of text and break it into words
|
||||
QString input = stream->readLine().lower();
|
||||
QRegExp regex("[\\s,]+");
|
||||
QStringList words = QStringList::split(regex,input);
|
||||
|
||||
//used to assure correct conversion of QStrings -> ints
|
||||
bool ok;
|
||||
//used to receive converted ints from QStrings.
|
||||
int val;
|
||||
|
||||
//go through every word on the line describing this button.
|
||||
|
||||
//read in a line of text and break it into words
|
||||
QString input = stream->readLine().toLower();
|
||||
QRegExp regex("[\\s,]+");
|
||||
QStringList words = input.split(regex);
|
||||
|
||||
//used to assure correct conversion of QStrings -> ints
|
||||
bool ok;
|
||||
//used to receive converted ints from QStrings.
|
||||
int val;
|
||||
|
||||
//go through every word on the line describing this button.
|
||||
for ( QStringList::Iterator it = words.begin(); it != words.end(); ++it ) {
|
||||
if (*it == "mouse") {
|
||||
++it;
|
||||
if (it == words.end()) return false;
|
||||
val = (*it).toInt(&ok);
|
||||
if (ok && val >= 0 && val <= MAXKEY) {
|
||||
useMouse = true;
|
||||
mousecode = val;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
else if (*it == "key") {
|
||||
++it;
|
||||
if (it == words.end()) return false;
|
||||
val = (*it).toInt(&ok);
|
||||
if (ok && val >= 0 && val <= MAXKEY) {
|
||||
useMouse = false;
|
||||
keycode = val;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
else if (*it == "rapidfire") {
|
||||
if (rapidfire == false) takeTimer( this );
|
||||
rapidfire = true;
|
||||
}
|
||||
else if (*it == "sticky") {
|
||||
sticky = true;
|
||||
}
|
||||
++it;
|
||||
if (it == words.end()) return false;
|
||||
val = (*it).toInt(&ok);
|
||||
if (ok && val >= 0 && val <= MAXKEY) {
|
||||
useMouse = true;
|
||||
mousecode = val;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
else if (*it == "key") {
|
||||
++it;
|
||||
if (it == words.end()) return false;
|
||||
val = (*it).toInt(&ok);
|
||||
if (ok && val >= 0 && val <= MAXKEY) {
|
||||
useMouse = false;
|
||||
keycode = val;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
else if (*it == "rapidfire") {
|
||||
rapidfire = true;
|
||||
}
|
||||
else if (*it == "sticky") {
|
||||
sticky = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Button::write( QTextStream* stream ) {
|
||||
*stream << "\t" << getName() << ": ";
|
||||
if (rapidfire) *stream << "rapidfire, ";
|
||||
if (sticky) *stream << "sticky, ";
|
||||
*stream << (useMouse?"mouse ":"key ") << (useMouse?mousecode:keycode) << "\n";
|
||||
*stream << "\t" << getName() << ": ";
|
||||
if (rapidfire) *stream << "rapidfire, ";
|
||||
if (sticky) *stream << "sticky, ";
|
||||
*stream << (useMouse?"mouse ":"key ") << (useMouse?mousecode:keycode) << "\n";
|
||||
}
|
||||
|
||||
void Button::release() {
|
||||
if (isDown) {
|
||||
click(false);
|
||||
isDown = true;
|
||||
}
|
||||
if (isDown) {
|
||||
click(false);
|
||||
isDown = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Button::jsevent( int value ) {
|
||||
bool newval = (value == 1);
|
||||
if (sticky) {
|
||||
//the state of a sticky key only changes on button press, not button release.
|
||||
if (newval) isOn = !isOn;
|
||||
else return;
|
||||
}
|
||||
//if the received event indicates a change in state,
|
||||
else if (newval != isOn) {
|
||||
isOn = newval; //change state
|
||||
}
|
||||
//otherwise... we don't care. This shouldn't happen.
|
||||
else return;
|
||||
//if rapidfire is on, then timer() will do its job. Otherwise we must
|
||||
//manually triger the key event.
|
||||
if (!rapidfire) click(isOn);
|
||||
bool newval = (value == 1);
|
||||
if (sticky) {
|
||||
//the state of a sticky key only changes on button press, not button release.
|
||||
if (value == 1) {
|
||||
isButtonPressed = !isButtonPressed;
|
||||
}
|
||||
else return;
|
||||
}
|
||||
//if the received event indicates a change in state,
|
||||
else if (newval != isButtonPressed) {
|
||||
isButtonPressed = newval; //change state
|
||||
if (isButtonPressed && rapidfire) {
|
||||
tick = 0;
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(timerCalled()));
|
||||
timer->start(MSEC);
|
||||
}
|
||||
if (!isButtonPressed && rapidfire) {
|
||||
timer->stop();
|
||||
if(isDown) {
|
||||
click(false);
|
||||
}
|
||||
tick = 0;
|
||||
}
|
||||
}
|
||||
//otherwise... we don't care. This shouldn't happen.
|
||||
else return;
|
||||
//if rapidfire is on, then timer() will do its job. Otherwise we must
|
||||
//manually triger the key event.
|
||||
if (!rapidfire) {
|
||||
click(isButtonPressed);
|
||||
}
|
||||
}
|
||||
|
||||
void Button::toDefault() {
|
||||
if (rapidfire == true) tossTimer( this );
|
||||
rapidfire = false;
|
||||
sticky = false;
|
||||
useMouse = false;
|
||||
keycode = 0;
|
||||
mousecode = 0;
|
||||
rapidfire = false;
|
||||
sticky = false;
|
||||
useMouse = false;
|
||||
keycode = 0;
|
||||
mousecode = 0;
|
||||
timer->stop();
|
||||
}
|
||||
|
||||
bool Button::isDefault() {
|
||||
return (rapidfire == false) &&
|
||||
(sticky == false) &&
|
||||
(useMouse == false) &&
|
||||
(keycode == 0) &&
|
||||
(mousecode == 0);
|
||||
return (rapidfire == false) &&
|
||||
(sticky == false) &&
|
||||
(useMouse == false) &&
|
||||
(keycode == 0) &&
|
||||
(mousecode == 0);
|
||||
}
|
||||
|
||||
QString Button::status() {
|
||||
if (useMouse) {
|
||||
return getName() + " : Mouse " + QString::number(mousecode);
|
||||
}
|
||||
else {
|
||||
return getName() + " : " + QString(ktos(keycode));
|
||||
}
|
||||
if (useMouse) {
|
||||
return getName() + " : Mouse " + QString::number(mousecode);
|
||||
}
|
||||
else {
|
||||
return getName() + " : " + QString(ktos(keycode));
|
||||
}
|
||||
}
|
||||
|
||||
void Button::setKey( bool mouse, int value ) {
|
||||
if (mouse) {
|
||||
mousecode = value;
|
||||
useMouse = true;
|
||||
}
|
||||
else {
|
||||
keycode = value;
|
||||
useMouse = false;
|
||||
}
|
||||
if (mouse) {
|
||||
mousecode = value;
|
||||
useMouse = true;
|
||||
}
|
||||
else {
|
||||
keycode = value;
|
||||
useMouse = false;
|
||||
}
|
||||
}
|
||||
|
||||
void Button::timer( int tick ) {
|
||||
if (isOn) {
|
||||
//originally I just clicked true and then false right after, but this
|
||||
//was not recognized by some programs. I need a delay in between.
|
||||
if (tick % FREQ == 0) {
|
||||
click(true);
|
||||
}
|
||||
if (tick % FREQ == FREQ / 2) {
|
||||
click(false);
|
||||
}
|
||||
}
|
||||
void Button::timerTick( int tick ) {
|
||||
if (isButtonPressed) {
|
||||
//originally I just clicked true and then false right after, but this
|
||||
//was not recognized by some programs. I need a delay in between.
|
||||
if (tick % FREQ == 0) {
|
||||
click(true);
|
||||
}
|
||||
if (tick % FREQ == FREQ / 2) {
|
||||
click(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Button::click( bool press ) {
|
||||
if (isDown == press) return;
|
||||
isDown = press;
|
||||
xevent click;
|
||||
//determine which of the four possible events we're sending.
|
||||
if (press) click.type = useMouse?BPRESS:KPRESS;
|
||||
else click.type = useMouse?BREL:KREL;
|
||||
//set up the event,
|
||||
click.value1 = useMouse?mousecode:keycode;
|
||||
click.value2 = 0;
|
||||
//and send it.
|
||||
sendevent( click );
|
||||
if (isDown == press) return;
|
||||
isDown = press;
|
||||
xevent click;
|
||||
//determine which of the four possible events we're sending.
|
||||
if (press) click.type = useMouse?BPRESS:KPRESS;
|
||||
else click.type = useMouse?BREL:KREL;
|
||||
//set up the event,
|
||||
click.value1 = useMouse?mousecode:keycode;
|
||||
click.value2 = 0;
|
||||
//and send it.
|
||||
sendevent( click );
|
||||
}
|
||||
|
||||
void Button::timerCalled() {
|
||||
timerTick(++tick);
|
||||
}
|
||||
|
20
src/button.h
20
src/button.h
@ -1,19 +1,18 @@
|
||||
#ifndef BUTTON_H
|
||||
#define BUTTON_H
|
||||
|
||||
//parent of Button
|
||||
#include "component.h"
|
||||
#include <QTimer>
|
||||
#include <QTextStream>
|
||||
|
||||
//to request a periodic tap on the shoulder for rapidfire
|
||||
#include "timer.h"
|
||||
|
||||
//for getting a key name in status()
|
||||
#include "keycode.h"
|
||||
|
||||
//note that the Button class, unlike the axis class, does not need a release
|
||||
//function because it releases the key as soon as it is pressed.
|
||||
class Button : public Component {
|
||||
friend class ButtonEdit;
|
||||
class Button : public QObject {
|
||||
Q_OBJECT
|
||||
friend class ButtonEdit;
|
||||
public:
|
||||
Button( int i );
|
||||
~Button();
|
||||
@ -36,23 +35,26 @@ class Button : public Component {
|
||||
//set the key code for this axis. Used by quickset.
|
||||
void setKey(bool mouse, int value);
|
||||
//happens every MSEC (constant.h) milliseconds
|
||||
void timer( int tick );
|
||||
void timerTick( int tick );
|
||||
protected:
|
||||
//true iff this button is physically depressed.
|
||||
bool isOn;
|
||||
bool isButtonPressed;
|
||||
//the index of this button on the joystick
|
||||
int index;
|
||||
//actually sends a key press/release
|
||||
virtual void click( bool press );
|
||||
//is a simulated key currently depressed?
|
||||
bool isDown;
|
||||
|
||||
int tick;
|
||||
//button settings
|
||||
bool rapidfire;
|
||||
bool sticky;
|
||||
bool useMouse;
|
||||
int keycode;
|
||||
int mousecode; //like keycode, only mousebutton ;)
|
||||
QTimer *timer;
|
||||
public slots:
|
||||
void timerCalled();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,60 +1,66 @@
|
||||
#include "button_edit.h"
|
||||
|
||||
ButtonEdit::ButtonEdit(Button* butt)
|
||||
:QDialog(0,0,true) {
|
||||
//build the dialog!
|
||||
button = butt;
|
||||
setCaption("Set " + button->getName());
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
QVBoxLayout* v = new QVBoxLayout(this, 5, 5);
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
BKKey = new KeyButton( button->getName(), button->useMouse?button->mousecode:button->keycode, this, true, button->useMouse);
|
||||
v->addWidget(BKKey);
|
||||
|
||||
QHBoxLayout* h = new QHBoxLayout();
|
||||
CSticky = new QCheckBox("Sticky", this);
|
||||
CSticky->setChecked(button->sticky);
|
||||
h->addWidget(CSticky);
|
||||
CRapid = new QCheckBox("Rapid Fire", this);
|
||||
CRapid->setChecked(button->rapidfire);
|
||||
h->addWidget(CRapid);
|
||||
v->addLayout(h);
|
||||
|
||||
h = new QHBoxLayout();
|
||||
BOkay = new QPushButton("Okay", this);
|
||||
connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept()));
|
||||
h->addWidget(BOkay);
|
||||
BCancel = new QPushButton("Cancel", this);
|
||||
connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject()));
|
||||
h->addWidget(BCancel);
|
||||
v->addLayout(h);
|
||||
ButtonEdit::ButtonEdit(Button* butt)
|
||||
:QDialog(0) {
|
||||
setModal(true);
|
||||
//build the dialog!
|
||||
button = butt;
|
||||
setWindowTitle("Set " + button->getName());
|
||||
setWindowIcon(QPixmap(ICON24));
|
||||
|
||||
QVBoxLayout* v = new QVBoxLayout(this);
|
||||
v->setMargin(5);
|
||||
v->setSpacing(5);
|
||||
|
||||
BKKey = new KeyButton( button->getName(), button->useMouse?button->mousecode:button->keycode, this, true, button->useMouse);
|
||||
v->addWidget(BKKey);
|
||||
|
||||
QHBoxLayout* h = new QHBoxLayout();
|
||||
CSticky = new QCheckBox("Sticky", this);
|
||||
CSticky->setChecked(button->sticky);
|
||||
h->addWidget(CSticky);
|
||||
CRapid = new QCheckBox("Rapid Fire", this);
|
||||
CRapid->setChecked(button->rapidfire);
|
||||
h->addWidget(CRapid);
|
||||
v->addLayout(h);
|
||||
|
||||
h = new QHBoxLayout();
|
||||
BOkay = new QPushButton("Okay", this);
|
||||
connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept()));
|
||||
h->addWidget(BOkay);
|
||||
BCancel = new QPushButton("Cancel", this);
|
||||
connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject()));
|
||||
h->addWidget(BCancel);
|
||||
v->addLayout(h);
|
||||
}
|
||||
|
||||
void ButtonEdit::show() {
|
||||
QDialog::show();
|
||||
setFixedSize(size());
|
||||
QDialog::show();
|
||||
setFixedSize(size());
|
||||
}
|
||||
|
||||
void ButtonEdit::accept() {
|
||||
//if the rapidfire status has changed, either request a timer or turn it down.
|
||||
if (button->rapidfire) {
|
||||
if (!CRapid->isChecked()) tossTimer(button);
|
||||
}
|
||||
else {
|
||||
if (CRapid->isChecked()) takeTimer(button);
|
||||
}
|
||||
button->rapidfire = CRapid->isChecked();
|
||||
button->sticky = (CSticky->isChecked());
|
||||
//if the user chose a mouse button...
|
||||
if (BKKey->choseMouse()) {
|
||||
button->useMouse = true;
|
||||
button->mousecode = BKKey->getValue();
|
||||
}
|
||||
else {
|
||||
button->useMouse = false;
|
||||
button->keycode = BKKey->getValue();
|
||||
}
|
||||
/*if (button->rapidfire) {
|
||||
if (!CRapid->isChecked()) tossTimer(button);
|
||||
}
|
||||
else {
|
||||
if (CRapid->isChecked()) takeTimer(button);
|
||||
}*/
|
||||
button->rapidfire = CRapid->isChecked();
|
||||
button->sticky = (CSticky->isChecked());
|
||||
//if the user chose a mouse button...
|
||||
if (BKKey->choseMouse()) {
|
||||
button->useMouse = true;
|
||||
button->mousecode = BKKey->getValue();
|
||||
}
|
||||
else {
|
||||
button->useMouse = false;
|
||||
button->keycode = BKKey->getValue();
|
||||
}
|
||||
|
||||
QDialog::accept();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
@ -1,14 +1,13 @@
|
||||
#ifndef BUTTON_EDIT_H
|
||||
#define BUTTON_EDIT_H
|
||||
|
||||
//used to build the dialog:
|
||||
#include <qdialog.h>
|
||||
#include <qpushbutton.h>
|
||||
#include <qcheckbox.h>
|
||||
#include <qlayout.h>
|
||||
#include <QPushButton>
|
||||
#include <QCheckBox>
|
||||
|
||||
//we need to edit a Button
|
||||
#include "button.h"
|
||||
|
||||
|
||||
//to get a new key for the button.
|
||||
#include "keycode.h"
|
||||
|
||||
|
@ -1,29 +1,30 @@
|
||||
#include "buttonw.h"
|
||||
|
||||
|
||||
ButtonWidget::ButtonWidget( Button* b, QWidget* parent )
|
||||
: FlashButton( "", parent) {
|
||||
button = b;
|
||||
update();
|
||||
on = false;
|
||||
: FlashButton( "", parent) {
|
||||
button = b;
|
||||
update();
|
||||
on = false;
|
||||
}
|
||||
|
||||
void ButtonWidget::jsevent( int val ) {
|
||||
bool newOn = (val == 1);
|
||||
if (on != newOn) {
|
||||
on = newOn;
|
||||
flash();
|
||||
}
|
||||
bool newOn = (val == 1);
|
||||
if (on != newOn) {
|
||||
on = newOn;
|
||||
flash();
|
||||
}
|
||||
}
|
||||
|
||||
void ButtonWidget::update() {
|
||||
setText( button->status());
|
||||
setText( button->status());
|
||||
}
|
||||
|
||||
void ButtonWidget::mouseReleaseEvent( QMouseEvent* e ) {
|
||||
ButtonEdit* be = new ButtonEdit(button);
|
||||
be->exec();
|
||||
delete be;
|
||||
|
||||
update();
|
||||
FlashButton::mouseReleaseEvent( e );
|
||||
ButtonEdit* be = new ButtonEdit(button);
|
||||
be->exec();
|
||||
delete be;
|
||||
|
||||
update();
|
||||
FlashButton::mouseReleaseEvent( e );
|
||||
}
|
||||
|
@ -7,6 +7,11 @@
|
||||
#include "button_edit.h"
|
||||
//this IS a FlashButton
|
||||
#include "flash.h"
|
||||
#ifdef Bool
|
||||
#undef Bool
|
||||
#endif
|
||||
|
||||
#include <QMouseEvent>
|
||||
|
||||
class ButtonWidget : public FlashButton {
|
||||
public:
|
||||
|
@ -1,36 +0,0 @@
|
||||
#ifndef COMPONENT_H
|
||||
#define COMPONENT_H
|
||||
|
||||
|
||||
//for parsing data from a file
|
||||
#include <qstringlist.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qregexp.h>
|
||||
|
||||
//parent of Component
|
||||
#include <qobject.h>
|
||||
|
||||
#include "event.h"
|
||||
#include "constant.h"
|
||||
|
||||
|
||||
//just a general blanket class to cover Button and Axis
|
||||
//it is completely worthless in itself.
|
||||
class Component : public QObject {
|
||||
public:
|
||||
virtual bool read( QTextStream* ) {return true; };
|
||||
virtual void write( QTextStream* ) {};
|
||||
virtual void release() {};
|
||||
virtual void jsevent( int ) {};
|
||||
virtual void toDefault() {};
|
||||
virtual bool isDefault() { return true; };
|
||||
virtual QString getName() { return ""; };
|
||||
virtual QString status() { return ""; };
|
||||
virtual void timer( int ) {};
|
||||
protected:
|
||||
bool isOn;
|
||||
bool isDown;
|
||||
int index;
|
||||
};
|
||||
|
||||
#endif
|
@ -24,4 +24,6 @@
|
||||
|
||||
#define NAME "QJoyPad 3.4"
|
||||
|
||||
#define MOUSE_OFFSET 400
|
||||
|
||||
#endif
|
||||
|
@ -1,17 +1,16 @@
|
||||
#ifndef JOY_DEVICE_H
|
||||
#define JOY_DEVICE_H
|
||||
|
||||
#include <qintdict.h>
|
||||
#include "joypad.h"
|
||||
|
||||
//the purpose of this file is to make device information available to what
|
||||
//needs it.
|
||||
|
||||
//a collection of joysticks currently available on this computer
|
||||
extern QIntDict<JoyPad> available;
|
||||
extern QHash<int, JoyPad*> available;
|
||||
|
||||
//a collection of joypad objects representing all the available joysticks
|
||||
//as well as the ones defined in a layout buy not currently plugged in.
|
||||
extern QIntDict<JoyPad> joypads;
|
||||
extern QHash<int, JoyPad*> joypads;
|
||||
|
||||
#endif
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
static void error(QString type, QString message ) {
|
||||
QMessageBox::warning(0,NAME" - " + type,
|
||||
message, QMessageBox::Ok, QMessageBox::NoButton);
|
||||
message, QMessageBox::Ok, Qt::NoButton);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -5,17 +5,17 @@ Display* display;
|
||||
|
||||
//actually creates an XWindows event :)
|
||||
void sendevent( xevent e ) {
|
||||
if (e.value1 == 0 && e.value2 == 0) return;
|
||||
if (e.type == WARP) {
|
||||
XTestFakeRelativeMotionEvent(display, e.value1, e.value2, 0);
|
||||
}
|
||||
else {
|
||||
if (e.type == KREL || e.type == KPRESS) {
|
||||
XTestFakeKeyEvent(display, e.value1, (e.type == KPRESS), 0);
|
||||
}
|
||||
else if (e.type == BREL | e.type == BPRESS) {
|
||||
XTestFakeButtonEvent(display, e.value1, (e.type == BPRESS), 0);
|
||||
}
|
||||
}
|
||||
XFlush(display);
|
||||
if (e.value1 == 0 && e.value2 == 0) return;
|
||||
if (e.type == WARP) {
|
||||
XTestFakeRelativeMotionEvent(display, e.value1, e.value2, 0);
|
||||
}
|
||||
else {
|
||||
if (e.type == KREL || e.type == KPRESS) {
|
||||
XTestFakeKeyEvent(display, e.value1, (e.type == KPRESS), 0);
|
||||
}
|
||||
else if (e.type == BREL || e.type == BPRESS) {
|
||||
XTestFakeButtonEvent(display, e.value1, (e.type == BPRESS), 0);
|
||||
}
|
||||
}
|
||||
XFlush(display);
|
||||
}
|
||||
|
134
src/flash.cpp
134
src/flash.cpp
@ -1,97 +1,99 @@
|
||||
#include "flash.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
//Modified here (and in .h) to not have default arguments for 2 and 3.
|
||||
//This caused an error with a development version of g++ on a Mandrake system
|
||||
//in Sweden.
|
||||
FlashButton::FlashButton( QString text, QWidget* parent, QString name )
|
||||
:QPushButton( text, parent, name )
|
||||
:QPushButton( text, parent )
|
||||
{
|
||||
//record the base palette for posterity.
|
||||
Normal = palette();
|
||||
this->setObjectName(name);
|
||||
//record the base palette for posterity.
|
||||
Normal = palette();
|
||||
|
||||
//define the palette the button will have when it flashes.
|
||||
QColorGroup cg = this->palette().inactive();
|
||||
cg.setColor(QColorGroup::Button, HIGHLIGHT);
|
||||
cg.setColor(QColorGroup::Light, HIGHLIGHT.light(150));
|
||||
cg.setColor(QColorGroup::Midlight, HIGHLIGHT.light(125));
|
||||
cg.setColor(QColorGroup::Dark, HIGHLIGHT.dark(200));
|
||||
cg.setColor(QColorGroup::Mid, HIGHLIGHT.dark(150));
|
||||
Flash = QPalette(cg,cg,cg);
|
||||
isflash=false;
|
||||
//define the palette the button will have when it flashes.
|
||||
QPalette cg = this->palette();
|
||||
cg.setCurrentColorGroup(QPalette::Inactive);
|
||||
cg.setColor(QPalette::Button, HIGHLIGHT);
|
||||
cg.setColor(QPalette::Light, HIGHLIGHT.light(150));
|
||||
cg.setColor(QPalette::Midlight, HIGHLIGHT.light(125));
|
||||
cg.setColor(QPalette::Dark, HIGHLIGHT.dark(200));
|
||||
cg.setColor(QPalette::Mid, HIGHLIGHT.dark(150));
|
||||
Flash = cg;
|
||||
isflash=false;
|
||||
|
||||
setAutoDefault( false );
|
||||
setFocusPolicy(QWidget::NoFocus);
|
||||
setAutoDefault( false );
|
||||
setFocusPolicy(Qt::NoFocus);
|
||||
|
||||
}
|
||||
|
||||
void FlashButton::flash()
|
||||
{
|
||||
emit( flashed( !isflash ) );
|
||||
if (isflash)
|
||||
{
|
||||
setPalette( Normal );
|
||||
isflash = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
setPalette( Flash );
|
||||
isflash = true;
|
||||
}
|
||||
emit( flashed( !isflash ) );
|
||||
if (isflash)
|
||||
{
|
||||
setPalette( Normal );
|
||||
isflash = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
setPalette( Flash );
|
||||
isflash = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FlashRadioArray::FlashRadioArray( int count, QString names[], bool horizontal, QWidget* parent)
|
||||
:QWidget( parent )
|
||||
:QWidget( parent )
|
||||
{
|
||||
if (horizontal)
|
||||
LMain = new QHBoxLayout( this, 5, 5 );
|
||||
else
|
||||
LMain = new QVBoxLayout( this, 5, 5 );
|
||||
LMain->setAutoAdd( true );
|
||||
|
||||
Buttons = new FlashButton*[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
Buttons[i] = new FlashButton( names[i], this, "" );
|
||||
//when any of the buttons is clicked, it calls the same function on this.
|
||||
connect( Buttons[i], SIGNAL( clicked() ), this, SLOT( clicked() ));
|
||||
}
|
||||
|
||||
Count = count;
|
||||
State = 0;
|
||||
Buttons[0]->setDown( true );
|
||||
if (horizontal) {
|
||||
LMain = new QHBoxLayout( this);
|
||||
LMain->setMargin(5);
|
||||
LMain->setSpacing(5);
|
||||
} else {
|
||||
LMain = new QVBoxLayout( this);
|
||||
LMain->setMargin(5);
|
||||
LMain->setSpacing(5);
|
||||
}
|
||||
|
||||
Buttons = new FlashButton*[count];
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
Buttons[i] = new FlashButton( names[i], this, "" );
|
||||
//when any of the buttons is clicked, it calls the same function on this.
|
||||
connect( Buttons[i], SIGNAL( clicked() ), this, SLOT( clicked() ));
|
||||
LMain->addWidget(Buttons[i]);
|
||||
}
|
||||
|
||||
Count = count;
|
||||
State = 0;
|
||||
Buttons[0]->setDown( true );
|
||||
}
|
||||
|
||||
int FlashRadioArray::getState()
|
||||
{
|
||||
return State;
|
||||
return State;
|
||||
}
|
||||
|
||||
void FlashRadioArray::flash( int index )
|
||||
{
|
||||
Buttons[index]->flash();
|
||||
Buttons[index]->flash();
|
||||
}
|
||||
|
||||
void FlashRadioArray::clicked()
|
||||
{
|
||||
//go through each button. If it wasn't the button that was just clicked,
|
||||
//then make sure that it is up. If it WAS the button that was clicked,
|
||||
//remember that index as the new state.
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
if ( Buttons[i] != sender() )
|
||||
Buttons[i]->setDown( false );
|
||||
else
|
||||
{
|
||||
State = i;
|
||||
Buttons[i]->setDown( true );
|
||||
}
|
||||
}
|
||||
emit changed( State );
|
||||
//go through each button. If it wasn't the button that was just clicked,
|
||||
//then make sure that it is up. If it WAS the button that was clicked,
|
||||
//remember that index as the new state.
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
if ( Buttons[i] != sender() )
|
||||
Buttons[i]->setDown( false );
|
||||
else
|
||||
{
|
||||
State = i;
|
||||
Buttons[i]->setDown( true );
|
||||
}
|
||||
}
|
||||
emit changed( State );
|
||||
}
|
||||
|
@ -15,8 +15,9 @@
|
||||
|
||||
|
||||
|
||||
#include <qpushbutton.h>
|
||||
#include <qlayout.h>
|
||||
#include <QPushButton>
|
||||
#include <QPalette>
|
||||
#include <QBoxLayout>
|
||||
|
||||
|
||||
//A QPushButton that can flash a color
|
||||
|
41
src/icon.cpp
41
src/icon.cpp
@ -1,30 +1,33 @@
|
||||
#include "icon.h"
|
||||
|
||||
#include <qpopupmenu.h>
|
||||
|
||||
FloatingIcon::FloatingIcon( const QPixmap &icon, QPopupMenu *popup, QWidget *parent, const char *name)
|
||||
: QDialog( parent, name ) {
|
||||
setCaption(NAME);
|
||||
setPaletteBackgroundPixmap(icon);
|
||||
pop = popup;
|
||||
FloatingIcon::FloatingIcon( const QPixmap &icon, QMenu *popup, QWidget *parent, const char *name)
|
||||
: QDialog( parent ) {
|
||||
this->setObjectName(name);
|
||||
setWindowTitle(NAME);
|
||||
QPalette palette;
|
||||
palette.setBrush(backgroundRole(), QBrush(icon));
|
||||
setPalette(palette);
|
||||
//setPaletteBackgroundPixmap(icon);
|
||||
pop = popup;
|
||||
|
||||
setFixedSize(64,64);
|
||||
setFixedSize(64,64);
|
||||
}
|
||||
|
||||
void FloatingIcon::mousePressEvent( QMouseEvent* e ) {
|
||||
//if it was the right mouse button,
|
||||
if (e->button() == RightButton) {
|
||||
//bring up the popup menu.
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
else {
|
||||
//otherwise, treat it as a regular click.
|
||||
emit clicked();
|
||||
}
|
||||
//if it was the right mouse button,
|
||||
if (e->button() == Qt::RightButton) {
|
||||
//bring up the popup menu.
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
else {
|
||||
//otherwise, treat it as a regular click.
|
||||
emit clicked();
|
||||
}
|
||||
}
|
||||
|
||||
void FloatingIcon::closeEvent( QCloseEvent* e ) {
|
||||
emit closed();
|
||||
e->accept();
|
||||
emit closed();
|
||||
e->accept();
|
||||
}
|
||||
|
16
src/icon.h
16
src/icon.h
@ -1,27 +1,25 @@
|
||||
#ifndef JOY_ICON_H
|
||||
#define JOY_ICON_H
|
||||
|
||||
//for creating a floating icon in notray mode :)
|
||||
#include <qdialog.h>
|
||||
//the pixmap to load
|
||||
#include <qpixmap.h>
|
||||
#include <QDialog>
|
||||
#include <QMenu>
|
||||
#include <QPixmap>
|
||||
#include <QMouseEvent>
|
||||
#include <QCloseEvent>
|
||||
|
||||
#include "constant.h"
|
||||
|
||||
//A quirk in QT forbids me from simply including qpopupmenu.h
|
||||
class QPopupMenu;
|
||||
|
||||
class FloatingIcon : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
FloatingIcon( const QPixmap &icon, QPopupMenu *popup = 0, QWidget *parent = 0, const char *name = 0);
|
||||
FloatingIcon( const QPixmap &icon, QMenu *popup = 0, QWidget *parent = 0, const char *name = 0);
|
||||
signals:
|
||||
void closed();
|
||||
void clicked();
|
||||
protected:
|
||||
void mousePressEvent( QMouseEvent* e );
|
||||
void closeEvent( QCloseEvent* e );
|
||||
QPopupMenu* pop;
|
||||
QMenu* pop;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
149
src/joypadw.cpp
149
src/joypadw.cpp
@ -1,93 +1,102 @@
|
||||
#include "joypadw.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
JoyPadWidget::JoyPadWidget( JoyPad* jp, int i, QWidget* parent )
|
||||
: QWidget(parent) {
|
||||
//initialize things, build the dialog
|
||||
joypad = jp;
|
||||
index = i;
|
||||
LMain = new QGridLayout(this, (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2, 2, 5, 5);
|
||||
LMain->setAutoAdd( true );
|
||||
flashcount = 0;
|
||||
quickset = NULL;
|
||||
|
||||
Axes = new AxisWidget*[joypad->axes];
|
||||
for (int i = 0; i < joypad->axes; i++) {
|
||||
Axes[i] = new AxisWidget(joypad->Axes[i],this);
|
||||
connect( Axes[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
}
|
||||
if (joypad->axes % 2 == 1) {
|
||||
new QWidget(this);
|
||||
}
|
||||
|
||||
Buttons = new ButtonWidget*[joypad->buttons];
|
||||
for (int i = 0; i < joypad->buttons; i++) {
|
||||
Buttons[i] = new ButtonWidget(joypad->Buttons[i],this);
|
||||
connect( Buttons[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
}
|
||||
if (joypad->buttons % 2 == 1) {
|
||||
new QWidget(this);
|
||||
}
|
||||
|
||||
new QWidget(this);
|
||||
new QWidget(this);
|
||||
: QWidget(parent) {
|
||||
//initialize things, build the dialog
|
||||
joypad = jp;
|
||||
index = i;
|
||||
/* This was in below, no idea what it does :( ...
|
||||
* (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2
|
||||
*/
|
||||
LMain = new QGridLayout(this);
|
||||
LMain->setSpacing(5);
|
||||
LMain->setMargin(5);
|
||||
flashcount = 0;
|
||||
int insertCounter = 0;
|
||||
quickset = NULL;
|
||||
|
||||
BClear = new QPushButton("Clear", this);
|
||||
connect(BClear, SIGNAL(clicked()), this, SLOT(clear()));
|
||||
BAll = new QPushButton("Quick Set", this);
|
||||
connect(BAll, SIGNAL(clicked()), this, SLOT(setAll()));
|
||||
Axes = new AxisWidget*[joypad->axes];
|
||||
for (int i = 0; i < joypad->axes; i++) {
|
||||
Axes[i] = new AxisWidget(joypad->Axes[i],this);
|
||||
connect( Axes[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
LMain->addWidget(Axes[i], insertCounter / 2, insertCounter %2);
|
||||
insertCounter++;
|
||||
}
|
||||
|
||||
Buttons = new ButtonWidget*[joypad->buttons];
|
||||
for (int i = 0; i < joypad->buttons; i++) {
|
||||
Buttons[i] = new ButtonWidget(joypad->Buttons[i],this);
|
||||
connect( Buttons[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool )));
|
||||
LMain->addWidget(Buttons[i], insertCounter/2, insertCounter%2);
|
||||
insertCounter++;
|
||||
}
|
||||
|
||||
|
||||
if(insertCounter % 2 == 1) {
|
||||
insertCounter++;
|
||||
}
|
||||
insertCounter+=2;
|
||||
BClear = new QPushButton("Clear", this);
|
||||
connect(BClear, SIGNAL(clicked()), this, SLOT(clear()));
|
||||
LMain->addWidget(BClear, insertCounter / 2, insertCounter %2);
|
||||
insertCounter++;
|
||||
BAll = new QPushButton("Quick Set", this);
|
||||
LMain->addWidget(BAll, insertCounter /2, insertCounter%2);
|
||||
connect(BAll, SIGNAL(clicked()), this, SLOT(setAll()));
|
||||
}
|
||||
|
||||
JoyPadWidget::~JoyPadWidget() {
|
||||
//so the joypad knows that we're done.
|
||||
joypad->releaseWidget();
|
||||
//so the joypad knows that we're done.
|
||||
joypad->releaseWidget();
|
||||
}
|
||||
|
||||
void JoyPadWidget::flash( bool on ) {
|
||||
//true iff this entire widget was considered "flashed" before
|
||||
bool wasOn = (flashcount != 0);
|
||||
|
||||
//adjust the count based on this new flash
|
||||
flashcount += (on?1:-1);
|
||||
|
||||
//if we were on and should now be off, or visa versa, flash the whole widget
|
||||
if (wasOn != (flashcount != 0))
|
||||
emit flashed(index);
|
||||
//true iff this entire widget was considered "flashed" before
|
||||
bool wasOn = (flashcount != 0);
|
||||
|
||||
//adjust the count based on this new flash
|
||||
flashcount += (on?1:-1);
|
||||
|
||||
//if we were on and should now be off, or visa versa, flash the whole widget
|
||||
if (wasOn != (flashcount != 0))
|
||||
emit flashed(index);
|
||||
}
|
||||
|
||||
void JoyPadWidget::update() {
|
||||
for (int i = 0; i < joypad->axes; i++) {
|
||||
Axes[i]->update();
|
||||
}
|
||||
for (int i = 0; i < joypad->buttons; i++) {
|
||||
Buttons[i]->update();
|
||||
}
|
||||
for (int i = 0; i < joypad->axes; i++) {
|
||||
Axes[i]->update();
|
||||
}
|
||||
for (int i = 0; i < joypad->buttons; i++) {
|
||||
Buttons[i]->update();
|
||||
}
|
||||
}
|
||||
|
||||
void JoyPadWidget::clear() {
|
||||
joypad->toDefault();
|
||||
update();
|
||||
joypad->toDefault();
|
||||
update();
|
||||
}
|
||||
|
||||
void JoyPadWidget::setAll() {
|
||||
//quickset is NULL if there is no quickset dialog, and a pointer to the
|
||||
//dialog otherwise. This is so we can forward jsevents properly.
|
||||
quickset = new QuickSet(joypad);
|
||||
quickset->exec();
|
||||
update();
|
||||
delete quickset;
|
||||
quickset = NULL;
|
||||
//quickset is NULL if there is no quickset dialog, and a pointer to the
|
||||
//dialog otherwise. This is so we can forward jsevents properly.
|
||||
quickset = new QuickSet(joypad);
|
||||
quickset->exec();
|
||||
update();
|
||||
delete quickset;
|
||||
quickset = NULL;
|
||||
}
|
||||
|
||||
void JoyPadWidget::jsevent( js_event msg ) {
|
||||
//notify the component this event applies to. this cannot generate anything
|
||||
//other than a flash :)
|
||||
if (msg.type == JS_EVENT_AXIS) {
|
||||
Axes[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
else {
|
||||
Buttons[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
//if we're doing quickset, it needs to know when we do something.
|
||||
if (quickset != NULL)
|
||||
quickset->jsevent(msg);
|
||||
//notify the component this event applies to. this cannot generate anything
|
||||
//other than a flash :)
|
||||
if (msg.type == JS_EVENT_AXIS) {
|
||||
Axes[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
else {
|
||||
Buttons[msg.number]->jsevent(msg.value);
|
||||
}
|
||||
//if we're doing quickset, it needs to know when we do something.
|
||||
if (quickset != NULL)
|
||||
quickset->jsevent(msg);
|
||||
}
|
||||
|
@ -2,13 +2,13 @@
|
||||
#define JOYPAD_WIDGET_H
|
||||
|
||||
//parts for the widget
|
||||
#include <qpushbutton.h>
|
||||
#include <qlayout.h>
|
||||
//Added by qt3to4:
|
||||
|
||||
#include <linux/joystick.h>
|
||||
#include "axisw.h"
|
||||
//this all relates to a JoyPad
|
||||
#include "joypad.h"
|
||||
//and a JoyPadWidget is composed of AxisWidgets and ButtonWidgets
|
||||
#include "axisw.h"
|
||||
#include "buttonw.h"
|
||||
//JoyPadWidget also is what initiates the whole QuickSet procedure :)
|
||||
#include "quickset.h"
|
||||
|
@ -1,238 +1,239 @@
|
||||
#include "joyslider.h"
|
||||
//Added by qt3to4:
|
||||
|
||||
JoySlider::JoySlider( int dz, int xz, int val, QWidget* parent )
|
||||
:QWidget( parent )
|
||||
:QWidget( parent )
|
||||
{
|
||||
//initialize :)
|
||||
JoyVal = val;
|
||||
DeadZone = dz;
|
||||
XZone = xz;
|
||||
setMinimumHeight(20);
|
||||
//initialize :)
|
||||
JoyVal = val;
|
||||
DeadZone = dz;
|
||||
XZone = xz;
|
||||
setMinimumHeight(20);
|
||||
}
|
||||
|
||||
void JoySlider::setValue( int newval )
|
||||
{
|
||||
//adjust the new position based on the throttle settings
|
||||
if (throttle == 0) JoyVal = newval;
|
||||
else if (throttle < 0) JoyVal = (newval + JOYMIN) / 2;
|
||||
else JoyVal = (newval + JOYMAX) / 2;
|
||||
//then redraw!
|
||||
update();
|
||||
//adjust the new position based on the throttle settings
|
||||
if (throttle == 0) JoyVal = newval;
|
||||
else if (throttle < 0) JoyVal = (newval + JOYMIN) / 2;
|
||||
else JoyVal = (newval + JOYMAX) / 2;
|
||||
//then redraw!
|
||||
update();
|
||||
}
|
||||
|
||||
void JoySlider::setThrottle( int newval )
|
||||
{
|
||||
//change throttle settings. This WILL quite likely cause minor issues with
|
||||
//status if the axis is not currently at zero, but these will be corrected
|
||||
//as soon as the axis moves again.
|
||||
throttle = newval;
|
||||
update();
|
||||
//change throttle settings. This WILL quite likely cause minor issues with
|
||||
//status if the axis is not currently at zero, but these will be corrected
|
||||
//as soon as the axis moves again.
|
||||
throttle = newval;
|
||||
update();
|
||||
}
|
||||
|
||||
int JoySlider::pointFor( int value, bool negative )
|
||||
{
|
||||
//complicated... this just finds the pixel the given value should be.
|
||||
if (throttle == 0) {
|
||||
int result = ((boxwidth - 4) * value) / JOYMAX;
|
||||
if (negative) result = lboxstart + boxwidth - 2 - result;
|
||||
else result += rboxstart + 2;
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
int result = ((twidth - 4) * value) / JOYMAX;
|
||||
if (negative) result = lboxstart + twidth - 2 - result;
|
||||
else result += lboxstart + 2;
|
||||
return result;
|
||||
}
|
||||
//complicated... this just finds the pixel the given value should be.
|
||||
if (throttle == 0) {
|
||||
int result = ((boxwidth - 4) * value) / JOYMAX;
|
||||
if (negative) result = lboxstart + boxwidth - 2 - result;
|
||||
else result += rboxstart + 2;
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
int result = ((twidth - 4) * value) / JOYMAX;
|
||||
if (negative) result = lboxstart + twidth - 2 - result;
|
||||
else result += lboxstart + 2;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
int JoySlider::valueFrom( int point )
|
||||
{
|
||||
//the inverse of above :)
|
||||
if (throttle == 0) {
|
||||
if (point <= lboxstart) return JOYMAX;
|
||||
if (point >= lboxend - 2 && point <= rboxstart + 2) return 0;
|
||||
if (point >= rboxend - 2) return JOYMAX;
|
||||
if (point < lboxend - 2) return ((lboxend - point) * JOYMAX) / boxwidth;
|
||||
if (point > rboxstart) return ((point - rboxstart) * JOYMAX) / boxwidth;
|
||||
else return 0;
|
||||
}
|
||||
else if (throttle > 0) {
|
||||
if (point <= lboxstart) return 0;
|
||||
else if (point >= tend) return JOYMAX;
|
||||
else return ((point - lboxstart) * JOYMAX) / twidth;
|
||||
}
|
||||
else {
|
||||
if (point <= lboxstart - 2) return JOYMAX;
|
||||
else if (point >= tend) return 0;
|
||||
else return ((tend - point) * JOYMAX) / twidth;
|
||||
}
|
||||
//the inverse of above :)
|
||||
if (throttle == 0) {
|
||||
if (point <= lboxstart) return JOYMAX;
|
||||
if (point >= lboxend - 2 && point <= rboxstart + 2) return 0;
|
||||
if (point >= rboxend - 2) return JOYMAX;
|
||||
if (point < lboxend - 2) return ((lboxend - point) * JOYMAX) / boxwidth;
|
||||
if (point > rboxstart) return ((point - rboxstart) * JOYMAX) / boxwidth;
|
||||
else return 0;
|
||||
}
|
||||
else if (throttle > 0) {
|
||||
if (point <= lboxstart) return 0;
|
||||
else if (point >= tend) return JOYMAX;
|
||||
else return ((point - lboxstart) * JOYMAX) / twidth;
|
||||
}
|
||||
else {
|
||||
if (point <= lboxstart - 2) return JOYMAX;
|
||||
else if (point >= tend) return 0;
|
||||
else return ((tend - point) * JOYMAX) / twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void JoySlider::resizeEvent( QResizeEvent* )
|
||||
{
|
||||
//when we resize, we need to recalculate a bunch of measurements.
|
||||
boxwidth = (this->width() - 6) / 2 - 1;
|
||||
twidth = this->width() - 4;
|
||||
boxheight = this->height() - 4;
|
||||
lboxstart = 1;
|
||||
lboxend = lboxstart + boxwidth - 1;
|
||||
tend = lboxstart + twidth - 1;
|
||||
rboxstart = lboxend + 5;
|
||||
rboxend = rboxstart + boxwidth - 1;
|
||||
//when we resize, we need to recalculate a bunch of measurements.
|
||||
boxwidth = (this->width() - 6) / 2 - 1;
|
||||
twidth = this->width() - 4;
|
||||
boxheight = this->height() - 4;
|
||||
lboxstart = 1;
|
||||
lboxend = lboxstart + boxwidth - 1;
|
||||
tend = lboxstart + twidth - 1;
|
||||
rboxstart = lboxend + 5;
|
||||
rboxend = rboxstart + boxwidth - 1;
|
||||
}
|
||||
|
||||
void JoySlider::drawBox( int x, int width ) {
|
||||
//draws a nice, pretty, 3d-styled box. that takes up the full height of the
|
||||
//widget but is defined by x-coordinate and width
|
||||
QPainter paint( this );
|
||||
//draws a nice, pretty, 3d-styled box. that takes up the full height of the
|
||||
//widget but is defined by x-coordinate and width
|
||||
QPainter paint( this );
|
||||
|
||||
paint.setPen( (isEnabled())?white:colorGroup().background() );
|
||||
paint.setBrush( (isEnabled())?white:colorGroup().background() );
|
||||
paint.drawRect( x, 1, width, boxheight);
|
||||
paint.setPen( (isEnabled())?Qt::white:palette().background().color() );
|
||||
paint.setBrush( (isEnabled())?Qt::white:palette().background() );
|
||||
paint.drawRect( x, 1, width, boxheight);
|
||||
|
||||
paint.setPen( colorGroup().dark() );
|
||||
paint.drawLine( x, 1 + boxheight, x, 1 );
|
||||
paint.drawLine( x, 1, x + width - 1, 1);
|
||||
|
||||
paint.setPen( colorGroup().shadow() );
|
||||
paint.drawLine( x + 1, 1 + boxheight - 1, x + 1, 2);
|
||||
paint.drawLine( x + 1, 2, x + width - 2, 2);
|
||||
|
||||
paint.setPen( colorGroup().light() );
|
||||
paint.drawLine( x + 2, 1 + boxheight - 1, x + width - 1, 1 + boxheight - 1);
|
||||
paint.drawLine( x + width - 1, 1 + boxheight - 1, x + width - 1, 2);
|
||||
|
||||
paint.setPen( colorGroup().midlight() );
|
||||
paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight );
|
||||
paint.drawLine( x + width, 1 + boxheight, x + width, 1 );
|
||||
paint.setPen( palette().dark().color() );
|
||||
paint.drawLine( x, 1 + boxheight, x, 1 );
|
||||
paint.drawLine( x, 1, x + width - 1, 1);
|
||||
|
||||
paint.setPen( palette().shadow().color() );
|
||||
paint.drawLine( x + 1, 1 + boxheight - 1, x + 1, 2);
|
||||
paint.drawLine( x + 1, 2, x + width - 2, 2);
|
||||
|
||||
paint.setPen( palette().light().color() );
|
||||
paint.drawLine( x + 2, 1 + boxheight - 1, x + width - 1, 1 + boxheight - 1);
|
||||
paint.drawLine( x + width - 1, 1 + boxheight - 1, x + width - 1, 2);
|
||||
|
||||
paint.setPen( palette().midlight().color() );
|
||||
paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight );
|
||||
paint.drawLine( x + width, 1 + boxheight, x + width, 1 );
|
||||
}
|
||||
|
||||
void JoySlider::paintEvent( QPaintEvent* )
|
||||
{
|
||||
//when we need to redraw,
|
||||
//start by making our boxes
|
||||
if (throttle == 0) {
|
||||
drawBox( lboxstart, boxwidth );
|
||||
drawBox( rboxstart, boxwidth );
|
||||
}
|
||||
//or box, if we are in throttle mode.
|
||||
else {
|
||||
drawBox( lboxstart, twidth );
|
||||
}
|
||||
|
||||
//if this is disabled, that's enough of that.
|
||||
if (!isEnabled()) return;
|
||||
//when we need to redraw,
|
||||
//start by making our boxes
|
||||
if (throttle == 0) {
|
||||
drawBox( lboxstart, boxwidth );
|
||||
drawBox( rboxstart, boxwidth );
|
||||
}
|
||||
//or box, if we are in throttle mode.
|
||||
else {
|
||||
drawBox( lboxstart, twidth );
|
||||
}
|
||||
|
||||
//now we need to draw.
|
||||
QPainter paint( this );
|
||||
|
||||
//prepare to draw a bar of the appropriate color
|
||||
QColor bar;
|
||||
if (abs(JoyVal) < DeadZone) bar = gray;
|
||||
else if (abs(JoyVal) < XZone) bar = blue;
|
||||
else bar = red;
|
||||
paint.setPen( bar );
|
||||
paint.setBrush( bar );
|
||||
|
||||
//find out the dimensions of the bar, then draw it
|
||||
int width = (throttle == 0)?boxwidth:twidth;
|
||||
int barlen = abs(((width - 4) * JoyVal) / JOYMAX);
|
||||
if (JoyVal > 0)
|
||||
paint.drawRect( ((throttle == 0)?rboxstart:lboxstart) + 2, 3, barlen, boxheight - 3 );
|
||||
else if (JoyVal < 0)
|
||||
paint.drawRect( lboxstart + width - 2 - barlen, 3, barlen, boxheight - 3 );
|
||||
|
||||
//if this is disabled, that's enough of that.
|
||||
if (!isEnabled()) return;
|
||||
|
||||
//and now draw the tabs! We only need one set if we're doing a throttle mode
|
||||
//but we need two if we're not. However, it's important to draw the right
|
||||
//set of tabs depending on the mode! Negative throttle gets negative tabs.
|
||||
int point;
|
||||
QPointArray shape;
|
||||
|
||||
paint.setPen( black );
|
||||
paint.setBrush( blue );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(DeadZone, false);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
|
||||
if (throttle <= 0) {
|
||||
point = pointFor(DeadZone, true);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
//now we need to draw.
|
||||
QPainter paint( this );
|
||||
|
||||
//prepare to draw a bar of the appropriate color
|
||||
QColor bar;
|
||||
if (abs(JoyVal) < DeadZone) bar = Qt::gray;
|
||||
else if (abs(JoyVal) < XZone) bar = Qt::blue;
|
||||
else bar = Qt::red;
|
||||
paint.setPen( bar );
|
||||
paint.setBrush( bar );
|
||||
|
||||
//find out the dimensions of the bar, then draw it
|
||||
int width = (throttle == 0)?boxwidth:twidth;
|
||||
int barlen = abs(((width - 4) * JoyVal) / JOYMAX);
|
||||
if (JoyVal > 0)
|
||||
paint.drawRect( ((throttle == 0)?rboxstart:lboxstart) + 2, 3, barlen, boxheight - 3 );
|
||||
else if (JoyVal < 0)
|
||||
paint.drawRect( lboxstart + width - 2 - barlen, 3, barlen, boxheight - 3 );
|
||||
|
||||
|
||||
//and now draw the tabs! We only need one set if we're doing a throttle mode
|
||||
//but we need two if we're not. However, it's important to draw the right
|
||||
//set of tabs depending on the mode! Negative throttle gets negative tabs.
|
||||
int point;
|
||||
QPolygon shape;
|
||||
|
||||
paint.setPen( Qt::black );
|
||||
paint.setBrush( Qt::blue );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(DeadZone, false);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
|
||||
if (throttle <= 0) {
|
||||
point = pointFor(DeadZone, true);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
|
||||
|
||||
|
||||
paint.setBrush( red );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(XZone, false);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
|
||||
if (throttle <= 0) {
|
||||
point = pointFor(XZone, true);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
paint.setBrush( Qt::red );
|
||||
if (throttle >= 0) {
|
||||
point = pointFor(XZone, false);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
|
||||
if (throttle <= 0) {
|
||||
point = pointFor(XZone, true);
|
||||
shape.putPoints(0,5,
|
||||
point, boxheight - 4,
|
||||
point + 3, boxheight - 1,
|
||||
point + 3, boxheight + 2,
|
||||
point - 3, boxheight + 2,
|
||||
point - 3, boxheight - 1);
|
||||
paint.drawPolygon(shape);
|
||||
}
|
||||
}
|
||||
|
||||
void JoySlider::mousePressEvent( QMouseEvent* e )
|
||||
{
|
||||
//store the x coordinate.
|
||||
int xpt = e->x();
|
||||
int result = 0;
|
||||
//see if this happened near one of the tabs. If so, start dragging that tab.
|
||||
if (throttle <= 0 && abs( xpt - pointFor( XZone, true )) < 5) result = DRAG_XZ;
|
||||
else if (throttle <= 0 && abs( xpt - pointFor( DeadZone, true )) < 5) result = DRAG_DZ;
|
||||
else if (throttle >= 0 && abs( xpt - pointFor( XZone, false )) < 5) result = DRAG_XZ;
|
||||
else if (throttle >= 0 && abs( xpt - pointFor( DeadZone, false )) < 5) result = DRAG_DZ;
|
||||
dragging = result;
|
||||
//store the x coordinate.
|
||||
int xpt = e->x();
|
||||
int result = 0;
|
||||
//see if this happened near one of the tabs. If so, start dragging that tab.
|
||||
if (throttle <= 0 && abs( xpt - pointFor( XZone, true )) < 5) result = DRAG_XZ;
|
||||
else if (throttle <= 0 && abs( xpt - pointFor( DeadZone, true )) < 5) result = DRAG_DZ;
|
||||
else if (throttle >= 0 && abs( xpt - pointFor( XZone, false )) < 5) result = DRAG_XZ;
|
||||
else if (throttle >= 0 && abs( xpt - pointFor( DeadZone, false )) < 5) result = DRAG_DZ;
|
||||
dragging = result;
|
||||
};
|
||||
|
||||
void JoySlider::mouseReleaseEvent( QMouseEvent* )
|
||||
{
|
||||
//when the mouse releases, all dragging stops.
|
||||
dragging = 0;
|
||||
//when the mouse releases, all dragging stops.
|
||||
dragging = 0;
|
||||
}
|
||||
|
||||
void JoySlider::mouseMoveEvent( QMouseEvent* e )
|
||||
{
|
||||
//get the x coordinate
|
||||
int xpt = e->x();
|
||||
//if we're dragging, move the appropriate tab!
|
||||
if (dragging == DRAG_XZ)
|
||||
{
|
||||
XZone = valueFrom( xpt );
|
||||
}
|
||||
else if (dragging == DRAG_DZ)
|
||||
{
|
||||
DeadZone = valueFrom( xpt );
|
||||
}
|
||||
else return;
|
||||
//if we moved a tab, redraw!
|
||||
update();
|
||||
//get the x coordinate
|
||||
int xpt = e->x();
|
||||
//if we're dragging, move the appropriate tab!
|
||||
if (dragging == DRAG_XZ)
|
||||
{
|
||||
XZone = valueFrom( xpt );
|
||||
}
|
||||
else if (dragging == DRAG_DZ)
|
||||
{
|
||||
DeadZone = valueFrom( xpt );
|
||||
}
|
||||
else return;
|
||||
//if we moved a tab, redraw!
|
||||
update();
|
||||
}
|
||||
|
@ -2,12 +2,17 @@
|
||||
#define Q_JOYSLIDER_H
|
||||
|
||||
//the parent of this
|
||||
#include <qwidget.h>
|
||||
//for drawing the widget :)
|
||||
#include <qpainter.h>
|
||||
//for abs()
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <QResizeEvent>
|
||||
#include <QPaintEvent>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainter>
|
||||
#include <QFrame>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QComboBox>
|
||||
#include <QSpinBox>
|
||||
#include "constant.h"
|
||||
|
||||
//dragging constants.
|
||||
|
231
src/keycode.cpp
231
src/keycode.cpp
@ -1,13 +1,13 @@
|
||||
#include "keycode.h"
|
||||
|
||||
#include "getkey.h"
|
||||
|
||||
const QString ktos( int keycode )
|
||||
{
|
||||
if (keycode > MAXKEY || keycode < 0) keycode = 0;
|
||||
if (keycode > MAXKEY || keycode < 0) keycode = 0;
|
||||
|
||||
if (keycode == 0) return "[NO KEY]";
|
||||
|
||||
QString xname = XKeysymToString(XKeycodeToKeysym(display, keycode,0));
|
||||
if (keycode == 0) return "[NO KEY]";
|
||||
|
||||
QString xname = XKeysymToString(XKeycodeToKeysym(display, keycode,0));
|
||||
|
||||
//this section of code converts standard X11 keynames into much nicer names
|
||||
//which are prettier, fit the dialogs better, and are more readily understandable.
|
||||
@ -15,155 +15,90 @@ const QString ktos( int keycode )
|
||||
//is a config option to define PLAIN_KEYS and drop this whole section of code,
|
||||
//instead using the default names for keys.
|
||||
#ifndef PLAIN_KEYS
|
||||
//the following code assumes xname is system independent and always
|
||||
//in the same exact format.
|
||||
|
||||
QRegExp rx;
|
||||
rx.setPattern("^\\w$");
|
||||
//"a-z" -> "A-Z"
|
||||
if (rx.exactMatch(xname)) return xname.upper();
|
||||
|
||||
rx.setPattern("(.*)_(.*)");
|
||||
if (rx.exactMatch(xname)) {
|
||||
QString first = rx.cap(1);
|
||||
QString second = rx.cap(2);
|
||||
|
||||
rx.setPattern("^[RL]$");
|
||||
//"Control_R" -> "R Control"
|
||||
if (rx.exactMatch(second)) return second + " " + first;
|
||||
|
||||
rx.setPattern("^(Lock|Enter)$");
|
||||
//"Caps_Lock" -> "Caps Lock"
|
||||
//"KP_Enter" -> "KP Enter"
|
||||
if (rx.exactMatch(second)) return first + " " + second;
|
||||
|
||||
//the following assumes all number pads are laid out alike.
|
||||
if (xname == "KP_Home") return "KP 7";
|
||||
if (xname == "KP_Up") return "KP 8";
|
||||
if (xname == "KP_Prior") return "KP 9";
|
||||
if (xname == "KP_Subtract") return "KP -";
|
||||
if (xname == "KP_Left") return "KP 4";
|
||||
if (xname == "KP_Begin") return "KP 5";
|
||||
if (xname == "KP_Right") return "KP 6";
|
||||
if (xname == "KP_Add") return "KP +";
|
||||
if (xname == "KP_End") return "KP 1";
|
||||
if (xname == "KP_Down") return "KP 2";
|
||||
if (xname == "KP_Next") return "KP 3";
|
||||
if (xname == "KP_Insert") return "KP 0";
|
||||
if (xname == "KP_Delete") return "KP .";
|
||||
if (xname == "KP_Multiply") return "KP *";
|
||||
if (xname == "KP_Divide") return "KP /";
|
||||
|
||||
return xname;
|
||||
}
|
||||
|
||||
if (xname == "minus") return "-";
|
||||
if (xname == "equal") return "=";
|
||||
if (xname == "bracketleft") return "[";
|
||||
if (xname == "bracketright") return "]";
|
||||
if (xname == "semicolon") return ";";
|
||||
if (xname == "apostrophe") return "'";
|
||||
if (xname == "grave") return "`";
|
||||
if (xname == "backslash") return "\\";
|
||||
if (xname == "comma") return ",";
|
||||
if (xname == "period") return ".";
|
||||
if (xname == "slash") return "/";
|
||||
if (xname == "space") return "Space";
|
||||
if (xname == "Prior") return "PageUp";
|
||||
if (xname == "Next") return "PageDown";
|
||||
//the following code assumes xname is system independent and always
|
||||
//in the same exact format.
|
||||
|
||||
QRegExp rx;
|
||||
rx.setPattern("^\\w$");
|
||||
//"a-z" -> "A-Z"
|
||||
if (rx.exactMatch(xname)) return xname.toUpper();
|
||||
|
||||
rx.setPattern("(.*)_(.*)");
|
||||
if (rx.exactMatch(xname)) {
|
||||
QString first = rx.cap(1);
|
||||
QString second = rx.cap(2);
|
||||
|
||||
rx.setPattern("^[RL]$");
|
||||
//"Control_R" -> "R Control"
|
||||
if (rx.exactMatch(second)) return second + " " + first;
|
||||
|
||||
rx.setPattern("^(Lock|Enter)$");
|
||||
//"Caps_Lock" -> "Caps Lock"
|
||||
//"KP_Enter" -> "KP Enter"
|
||||
if (rx.exactMatch(second)) return first + " " + second;
|
||||
|
||||
//the following assumes all number pads are laid out alike.
|
||||
if (xname == "KP_Home") return "KP 7";
|
||||
if (xname == "KP_Up") return "KP 8";
|
||||
if (xname == "KP_Prior") return "KP 9";
|
||||
if (xname == "KP_Subtract") return "KP -";
|
||||
if (xname == "KP_Left") return "KP 4";
|
||||
if (xname == "KP_Begin") return "KP 5";
|
||||
if (xname == "KP_Right") return "KP 6";
|
||||
if (xname == "KP_Add") return "KP +";
|
||||
if (xname == "KP_End") return "KP 1";
|
||||
if (xname == "KP_Down") return "KP 2";
|
||||
if (xname == "KP_Next") return "KP 3";
|
||||
if (xname == "KP_Insert") return "KP 0";
|
||||
if (xname == "KP_Delete") return "KP .";
|
||||
if (xname == "KP_Multiply") return "KP *";
|
||||
if (xname == "KP_Divide") return "KP /";
|
||||
|
||||
return xname;
|
||||
}
|
||||
|
||||
if (xname == "minus") return "-";
|
||||
if (xname == "equal") return "=";
|
||||
if (xname == "bracketleft") return "[";
|
||||
if (xname == "bracketright") return "]";
|
||||
if (xname == "semicolon") return ";";
|
||||
if (xname == "apostrophe") return "'";
|
||||
if (xname == "grave") return "`";
|
||||
if (xname == "backslash") return "\\";
|
||||
if (xname == "comma") return ",";
|
||||
if (xname == "period") return ".";
|
||||
if (xname == "slash") return "/";
|
||||
if (xname == "space") return "Space";
|
||||
if (xname == "Prior") return "PageUp";
|
||||
if (xname == "Next") return "PageDown";
|
||||
#endif
|
||||
|
||||
//if none of that succeeded,
|
||||
return xname;
|
||||
|
||||
//if none of that succeeded,
|
||||
return xname;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
GetKey::GetKey( QString button, bool m )
|
||||
:QDialog( )
|
||||
{
|
||||
//prepare the dialog
|
||||
mouse = m;
|
||||
setCaption( "Choose a key" );
|
||||
setIcon(QPixmap(ICON24));
|
||||
|
||||
//I'd use a QLabel, but that steals x11Events!
|
||||
//So, I'll draw the text directly. That means
|
||||
//I need to resolve the size of the dialog by hand:
|
||||
Text = "Choose a new key ";
|
||||
if (mouse) Text += "or mouse button ";
|
||||
Text += "for " + button;
|
||||
QRect rect = fontMetrics().boundingRect( Text );
|
||||
//I calculate the size based on the first line of text, which is longer.
|
||||
//The fontMetrics function is dumb and would treat the string with a
|
||||
//newline in it as a continues flow of characters if I did the whole string
|
||||
//at once.
|
||||
Text += "\n(Ctrl-X for no key)";
|
||||
//now I add 20 pixels of padding and double the height to make room for
|
||||
//two lines.
|
||||
setFixedSize( QSize( rect.width() + 20, rect.height()*2 + 20 ) );
|
||||
}
|
||||
|
||||
bool GetKey::x11Event( XEvent* e )
|
||||
{
|
||||
//keep Qt from closing the dialog upon seeing Esc pressed.
|
||||
if (e->type == KeyPress) return true;
|
||||
|
||||
//On a key press, return the key and quit
|
||||
//Ctrl+X == [No Key]
|
||||
if (e->type == KeyRelease) {
|
||||
if (XKeycodeToKeysym(display,e->xkey.keycode,0) == XK_x ) {
|
||||
if (e->xkey.state & ControlMask) done( 0 );
|
||||
else done( e->xkey.keycode );
|
||||
}
|
||||
else done( e->xkey.keycode );
|
||||
return true;
|
||||
}
|
||||
//if we're accepting mouse clicks and a mouse button was clicked...
|
||||
if (mouse && e->type == ButtonRelease) {
|
||||
done ( e->xbutton.button + MOUSE_OFFSET);
|
||||
return true;
|
||||
}
|
||||
|
||||
//any other events we will pass on to the dialog. This allows for closing
|
||||
//the window and easy redrawing :)
|
||||
return false;
|
||||
}
|
||||
|
||||
void GetKey::paintEvent ( QPaintEvent * ) {
|
||||
//whenever we need to repaint, draw in our text.
|
||||
QPainter paint( this );
|
||||
paint.drawText( rect(), AlignCenter, Text );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
KeyButton::KeyButton( QString name, int val, QWidget* parent, bool m, bool nowMouse)
|
||||
:QPushButton(nowMouse?"Mouse " + QString::number(val):QString(ktos(val)), parent) {
|
||||
mouse = m;
|
||||
mouseClicked = nowMouse;
|
||||
buttonname = name;
|
||||
value = val;
|
||||
connect( this, SIGNAL( clicked() ), SLOT( onClick() ));
|
||||
:QPushButton(nowMouse?"Mouse " + QString::number(val):QString(ktos(val)), parent) {
|
||||
mouse = m;
|
||||
mouseClicked = nowMouse;
|
||||
buttonname = name;
|
||||
value = val;
|
||||
connect( this, SIGNAL( clicked() ), SLOT( onClick() ));
|
||||
}
|
||||
|
||||
void KeyButton::onClick() {
|
||||
//when clicked, ask for a key!
|
||||
value = GetKey( buttonname, mouse ).exec();
|
||||
//if the return value was a mouse click...
|
||||
if (value > MOUSE_OFFSET) {
|
||||
mouseClicked = true;
|
||||
value -= MOUSE_OFFSET;
|
||||
setText( "Mouse " + QString::number(value));
|
||||
}
|
||||
//otherwise, it was a key press!
|
||||
else {
|
||||
mouseClicked = false;
|
||||
setText( ktos(value));
|
||||
}
|
||||
//when clicked, ask for a key!
|
||||
value = GetKey( buttonname, mouse ).exec();
|
||||
//if the return value was a mouse click...
|
||||
if (value > MOUSE_OFFSET) {
|
||||
mouseClicked = true;
|
||||
value -= MOUSE_OFFSET;
|
||||
setText( "Mouse " + QString::number(value));
|
||||
}
|
||||
//otherwise, it was a key press!
|
||||
else {
|
||||
mouseClicked = false;
|
||||
setText( ktos(value));
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,11 @@
|
||||
#define KEYCODE_H
|
||||
|
||||
//To create the "press a key" dialog:
|
||||
#include <qdialog.h>
|
||||
#include <qpainter.h>
|
||||
#include <QPushButton>
|
||||
#include <QDialog>
|
||||
#include <QPaintEvent>
|
||||
#include <QPainter>
|
||||
|
||||
//For the KeyButton widget
|
||||
#include <qpushbutton.h>
|
||||
|
||||
//For converting X Windows key names to something nicer.
|
||||
#include <qregexp.h>
|
||||
|
||||
//Defines constants needed for x11Event
|
||||
#include <X11/Xlib.h>
|
||||
//The KeySym for "x"
|
||||
#define XK_x 0x078
|
||||
|
||||
#define MOUSE_OFFSET 400
|
||||
|
||||
#include "constant.h"
|
||||
|
||||
@ -26,23 +16,6 @@ const QString ktos( int keycode );
|
||||
//The X11 display, taken from main.cpp
|
||||
extern Display* display;
|
||||
|
||||
//a keycode dialog box
|
||||
class GetKey : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
GetKey( QString button, bool m = false );
|
||||
protected:
|
||||
//to filter through every event this thing sees, before QT does.
|
||||
bool x11Event( XEvent* e );
|
||||
//to avoid focus issues, there is only the dialog widget, all the
|
||||
//rest is painted on. So, I need to know when to repaint.
|
||||
void paintEvent ( QPaintEvent * );
|
||||
private:
|
||||
//the dialog's message
|
||||
QString Text;
|
||||
//does this dialog accept mouse clicks?
|
||||
bool mouse;
|
||||
};
|
||||
|
||||
//a button that requests a keycode from the user when clicked.
|
||||
class KeyButton : public QPushButton {
|
||||
|
30
src/layout.h
30
src/layout.h
@ -1,22 +1,6 @@
|
||||
#ifndef JOY_LAYOUT_H
|
||||
#define JOY_LAYOUT_H
|
||||
|
||||
//for file i/o
|
||||
#include <qdir.h>
|
||||
#include <qfile.h>
|
||||
#include <qtextstream.h>
|
||||
#include <qstringlist.h>
|
||||
|
||||
//to get a name for a new layout
|
||||
#include <qinputdialog.h>
|
||||
|
||||
//qpopup is a REAL pain to include ;) This is because of some
|
||||
//odd complications and reciprocalities in QT... unfortunately, this is the
|
||||
//best way I've found to get around it.
|
||||
#ifndef MAIN
|
||||
//the layout manager is responsible for the tray icon and its popup
|
||||
#include <qpopupmenu.h>
|
||||
#endif
|
||||
|
||||
//to allow for interprocess communications (ie, signaling a running instance of
|
||||
//qjoypad by running "qjoypad layout-name", etc.) QJoyPad uses signals to
|
||||
@ -24,6 +8,14 @@
|
||||
//the joystick device list.
|
||||
#include <signal.h>
|
||||
|
||||
#include <QAction>
|
||||
#include <QDir>
|
||||
#include <QMenu>
|
||||
#include <QApplication>
|
||||
#include <QDialog>
|
||||
#include <QInputDialog>
|
||||
#include <poll.h>
|
||||
|
||||
//a layout handles several joypads
|
||||
#include "joypad.h"
|
||||
//for errors
|
||||
@ -41,7 +33,7 @@
|
||||
#define NL "[NO LAYOUT]"
|
||||
|
||||
//where QJoyPad saves its settings!
|
||||
const QString settingsDir(QDir::homeDirPath() + "/.qjoypad3/");
|
||||
const QString settingsDir(QDir::homePath() + "/.qjoypad3/");
|
||||
|
||||
//handles loading, saving, and changing of layouts
|
||||
class LayoutManager : public QObject {
|
||||
@ -74,7 +66,7 @@ class LayoutManager : public QObject {
|
||||
//when the tray icon is clicked
|
||||
void trayClick();
|
||||
//when the user selects an item on the tray's popup menu
|
||||
void trayMenu(int id);
|
||||
void trayMenu(QAction* menuItemAction);
|
||||
//rebuild the popup menu with the current information
|
||||
void fillPopup();
|
||||
//update the list of available joystick devices
|
||||
@ -87,7 +79,7 @@ class LayoutManager : public QObject {
|
||||
//the layout that is currently in use
|
||||
QString CurrentLayout;
|
||||
//the popup menu from the tray/floating icon
|
||||
QPopupMenu* Popup;
|
||||
QMenu* Popup;
|
||||
|
||||
//if there is a LayoutEdit open, this points to it. Otherwise, NULL.
|
||||
LayoutEdit* le;
|
||||
|
65
src/loop.cpp
65
src/loop.cpp
@ -1,65 +0,0 @@
|
||||
#include "loop.h"
|
||||
|
||||
JoyLoop::JoyLoop() {
|
||||
//I like to start from zero, though, in all honesty, this doesn't matter.
|
||||
tick = 0;
|
||||
}
|
||||
|
||||
bool JoyLoop::processEvents( ProcessEventsFlags ) {
|
||||
//standard event processing, except we get to throw in a few things of
|
||||
//our own!
|
||||
|
||||
int joydev;
|
||||
JoyPad* pad;
|
||||
js_event msg;
|
||||
int len;
|
||||
|
||||
//go through the currently plugged-in joysticks
|
||||
QIntDictIterator<JoyPad> it( available );
|
||||
for ( ; it.current(); ++it ) {
|
||||
pad = it.current();
|
||||
//get the file descriptor for the device
|
||||
joydev = pad->joydev;
|
||||
//and try reading an event, non-blocking
|
||||
len = read( joydev, &msg, sizeof(js_event));
|
||||
//if there was a real event waiting,
|
||||
if (len == (int) sizeof(js_event)) {
|
||||
//pass that event on to the joypad!
|
||||
pad->jsevent(msg);
|
||||
}
|
||||
}
|
||||
|
||||
//sleep for a moment. This is just to keep us from throwing all the
|
||||
//available processer power into madly checking for new events.
|
||||
usleep(1);
|
||||
|
||||
//now we can let QT process all of its events, like GUI events and timers.
|
||||
return QEventLoop::processEvents(AllEvents);
|
||||
}
|
||||
|
||||
void JoyLoop::takeTimer( Component* c ) {
|
||||
//if this is the first Component asking for a timer, then we can start
|
||||
//up the timer! It isn't running unless someone needs it.
|
||||
if (timerList.isEmpty()) startTimer( MSEC );
|
||||
//remember this Component so we can signal it.
|
||||
timerList.append( c );
|
||||
}
|
||||
|
||||
void JoyLoop::tossTimer( Component* c ) {
|
||||
//forget that Component, it doesn't NEED us any more :(
|
||||
timerList.remove( c );
|
||||
//if that means there are no longer any Components listening for timer
|
||||
//events, then we can go ahead and stop timing.
|
||||
if (timerList.isEmpty()) killTimers();
|
||||
}
|
||||
|
||||
void JoyLoop::timerEvent( QTimerEvent* ) {
|
||||
//ever MSEC miliseconds...
|
||||
|
||||
//increment the counter (used for timing in axis.cpp and button.cpp)
|
||||
++tick;
|
||||
//and notify every Component in the list.
|
||||
for ( Component* c = timerList.first(); c; c = timerList.next() ) {
|
||||
c->timer(tick);
|
||||
}
|
||||
}
|
39
src/loop.h
39
src/loop.h
@ -1,39 +0,0 @@
|
||||
#ifndef JOY_LOOP_H
|
||||
#define JOY_LOOP_H
|
||||
|
||||
//this is an event loop
|
||||
#include <qeventloop.h>
|
||||
|
||||
//for reading events from the joysticks
|
||||
#include <unistd.h>
|
||||
#include <linux/joystick.h>
|
||||
|
||||
//to pass events on to the joypads
|
||||
#include "joypad.h"
|
||||
//to know which devices need to be checked for joystick events
|
||||
#include "device.h"
|
||||
|
||||
//A Component is either an Axis or a Button
|
||||
class Component;
|
||||
|
||||
//the main event loop of QJoyPad; its main distinction from a regular event loop
|
||||
//is that it reads joystick events on every iteration and also provides a timer
|
||||
//to any Components that need it.
|
||||
class JoyLoop : public QEventLoop {
|
||||
public:
|
||||
JoyLoop();
|
||||
bool processEvents( ProcessEventsFlags );
|
||||
//provide a timer to the requesting Component
|
||||
void takeTimer( Component* c );
|
||||
//stop providing a timer to the given Component
|
||||
void tossTimer( Component* c );
|
||||
protected:
|
||||
//happens ever MSEC miliseconds :)
|
||||
virtual void timerEvent( QTimerEvent* );
|
||||
//just a counter, nothing more.
|
||||
int tick;
|
||||
//a list of the Components that need a timer
|
||||
QPtrList<Component> timerList;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,184 +0,0 @@
|
||||
Log for qt3to4 on Fri Dec 26 18:59:56 2008. Number of log entries: 101
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.cpp at line 21 column 28: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.cpp at line 115 column 29: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.cpp: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 22 column 12: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 22 column 33: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 24 column 12: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 24 column 33: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 25 column 13: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 25 column 35: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 41 column 23: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 42 column 33: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 42 column 47: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 43 column 22: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 54 column 20: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 55 column 30: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 55 column 44: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 56 column 20: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp at line 70 column 20: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.cpp: Added the following include directives:
|
||||
#include <QPixmap> #include <Q3HBoxLayout> #include <Q3VBoxLayout> #include <QLabel> #include <Q3Frame>
|
||||
In file /home/john/qjoypad-3.4.1/src/axisw.cpp: Added the following include directives:
|
||||
#include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/button.cpp at line 18 column 30: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/button.cpp at line 64 column 31: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/button.cpp: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp at line 14 column 12: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp at line 14 column 33: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp at line 19 column 12: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp at line 19 column 33: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp at line 28 column 20: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/button_edit.cpp: Added the following include directives:
|
||||
#include <Q3VBoxLayout> #include <QPixmap> #include <Q3HBoxLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/buttonw.cpp: Added the following include directives:
|
||||
#include <QMouseEvent>
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/event.cpp
|
||||
In file /home/john/qjoypad-3.4.1/src/flash.cpp at line 56 column 25: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/flash.cpp at line 58 column 25: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/flash.cpp: Added the following include directives:
|
||||
#include <Q3VBoxLayout> #include <Q3HBoxLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.cpp at line 7 column 20: qpopupmenu.h -> q3popupmenu.h
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.cpp at line 9 column 59: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.cpp: Added the following include directives:
|
||||
#include <QPixmap> #include <QCloseEvent> #include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 42 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 44 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 50 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 52 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 57 column 30: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 114 column 31: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 117 column 12: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 117 column 33: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 117 column 55: IO_WriteOnly -> QIODevice::WriteOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 119 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 126 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 139 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp at line 142 column 26: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.cpp: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
In file /home/john/qjoypad-3.4.1/src/joypadw.cpp at line 10 column 24: QGridLayout -> Q3GridLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/joypadw.cpp: Added the following include directives:
|
||||
#include <Q3GridLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/joyslider.cpp at line 156 column 12: QPointArray -> Q3PointArray
|
||||
In file /home/john/qjoypad-3.4.1/src/joyslider.cpp: Added the following include directives:
|
||||
#include <QResizeEvent> #include <Q3PointArray> #include <QMouseEvent> #include <QPaintEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/keycode.cpp: Added the following include directives:
|
||||
#include <QPixmap> #include <QPaintEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 13 column 26: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 54 column 27: IO_ReadOnly -> QIODevice::ReadOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 63 column 20: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 69 column 12: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 115 column 26: IO_ReadOnly -> QIODevice::ReadOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 116 column 13: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 137 column 22: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 154 column 27: IO_WriteOnly -> QIODevice::WriteOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 155 column 13: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 157 column 23: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 194 column 27: IO_WriteOnly -> QIODevice::WriteOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 195 column 13: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp at line 276 column 17: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.cpp: Added the following include directives:
|
||||
#include <QPixmap> #include <Q3TextStream> #include <Q3PopupMenu>
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 17 column 24: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 19 column 7: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 19 column 27: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 20 column 28: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 20 column 42: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 21 column 12: QGridLayout -> Q3GridLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 21 column 33: QGridLayout -> Q3GridLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 42 column 28: QWidgetStack -> Q3WidgetStack
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 43 column 31: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 43 column 45: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 52 column 20: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 77 column 12: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 77 column 33: QHBoxLayout -> Q3HBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp at line 112 column 17: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.cpp: Added the following include directives:
|
||||
#include <QPixmap> #include <Q3GridLayout> #include <Q3HBoxLayout> #include <Q3VBoxLayout> #include <Q3Frame>
|
||||
In file /home/john/qjoypad-3.4.1/src/loop.cpp at line 21 column 17: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/loop.cpp: Added the following include directives:
|
||||
#include <QTimerEvent> #include <QEventLoop>
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 34 column 8: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 35 column 8: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 36 column 8: QPtrList -> Q3PtrList
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 56 column 20: QIntDictIterator -> Q3IntDictIterator
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 192 column 28: IO_WriteOnly -> QIODevice::WriteOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 194 column 14: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 210 column 33: IO_ReadOnly -> QIODevice::ReadOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 213 column 14: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 235 column 31: IO_WriteOnly -> QIODevice::WriteOnly
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp at line 237 column 13: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/main.cpp: Added the following include directives:
|
||||
#include <Q3TextStream> #include <Q3PtrList>
|
||||
In file /home/john/qjoypad-3.4.1/src/quickset.cpp at line 12 column 12: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/quickset.cpp at line 12 column 37: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/quickset.cpp: Added the following include directives:
|
||||
#include <Q3VBoxLayout> #include <QLabel>
|
||||
|
||||
Log for qt3to4 on Fri Dec 26 19:23:39 2008. Number of log entries: 47
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.h at line 30 column 24: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.h at line 32 column 25: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/axis.h: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.h at line 8 column 16: qframe.h -> q3frame.h
|
||||
In file /home/john/qjoypad-3.4.1/src/axis_edit.h at line 40 column 8: QFrame -> Q3Frame
|
||||
In file /home/john/qjoypad-3.4.1/src/axisw.h: Added the following include directives:
|
||||
#include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/button.h at line 23 column 24: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/button.h at line 25 column 25: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/button.h: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/button_edit.h
|
||||
In file /home/john/qjoypad-3.4.1/src/buttonw.h: Added the following include directives:
|
||||
#include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/component.h at line 7 column 21: qtextstream.h -> q3textstream.h
|
||||
In file /home/john/qjoypad-3.4.1/src/component.h at line 21 column 32: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/component.h at line 22 column 33: QTextStream -> Q3TextStream
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/constant.h
|
||||
In file /home/john/qjoypad-3.4.1/src/device.h at line 4 column 18: qintdict.h -> q3intdict.h
|
||||
In file /home/john/qjoypad-3.4.1/src/device.h at line 11 column 15: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/device.h at line 15 column 15: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/error.h at line 10 column 39: QMessageBox -> Qt
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/event.h
|
||||
In file /home/john/qjoypad-3.4.1/src/flash.h at line 75 column 12: QBoxLayout -> Q3BoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/flash.h: Added the following include directives:
|
||||
#include <Q3BoxLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.h at line 16 column 16: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.h at line 21 column 47: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.h at line 28 column 12: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/icon.h: Added the following include directives:
|
||||
#include <QCloseEvent> #include <Q3PopupMenu> #include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h at line 7 column 18: qintdict.h -> q3intdict.h
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h at line 38 column 24: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h at line 40 column 25: QTextStream -> Q3TextStream
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h at line 71 column 10: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h at line 72 column 10: QIntDict -> Q3IntDict
|
||||
In file /home/john/qjoypad-3.4.1/src/joypad.h: Added the following include directives:
|
||||
#include <Q3TextStream>
|
||||
In file /home/john/qjoypad-3.4.1/src/joypadw.h at line 58 column 13: QGridLayout -> Q3GridLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/joypadw.h: Added the following include directives:
|
||||
#include <Q3GridLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/joyslider.h: Added the following include directives:
|
||||
#include <QPaintEvent> #include <QResizeEvent> #include <QMouseEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/keycode.h: Added the following include directives:
|
||||
#include <QPaintEvent>
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.h at line 7 column 21: qtextstream.h -> q3textstream.h
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.h at line 18 column 21: qpopupmenu.h -> q3popupmenu.h
|
||||
In file /home/john/qjoypad-3.4.1/src/layout.h at line 90 column 12: QPopupMenu -> Q3PopupMenu
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.h at line 10 column 22: qwidgetstack.h -> q3widgetstack.h
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.h at line 39 column 13: QVBoxLayout -> Q3VBoxLayout
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.h at line 40 column 14: QWidgetStack -> Q3WidgetStack
|
||||
In file /home/john/qjoypad-3.4.1/src/layout_edit.h: Added the following include directives:
|
||||
#include <Q3VBoxLayout>
|
||||
In file /home/john/qjoypad-3.4.1/src/loop.h at line 39 column 10: QPtrList -> Q3PtrList
|
||||
In file /home/john/qjoypad-3.4.1/src/loop.h: Added the following include directives:
|
||||
#include <Q3PtrList> #include <QTimerEvent>
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/quickset.h
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/timer.h
|
||||
|
||||
Log for qt3to4 on Fri Dec 26 19:24:31 2008. Number of log entries: 1
|
||||
No changes made to file /home/john/qjoypad-3.4.1/src/Makefile
|
||||
|
@ -27,8 +27,8 @@ doc.extra = cp ../README.txt ../LICENSE.txt $${doc.path}
|
||||
##### Setup Compile #####
|
||||
|
||||
DEFINES += DEVDIR='"$$DEVDIR"'
|
||||
DEFINES += ICON24='"$${icons.path}/icon24.png"'
|
||||
DEFINES += ICON64='"$${icons.path}/icon64.png"'
|
||||
DEFINES += ICON24='\"$${icons.path}/icon24.png\"'
|
||||
DEFINES += ICON64='\"$${icons.path}/icon64.png\"'
|
||||
|
||||
TEMPLATE = app
|
||||
DEPENDPATH += trayicon
|
||||
@ -42,7 +42,6 @@ HEADERS += axis.h \
|
||||
button.h \
|
||||
button_edit.h \
|
||||
buttonw.h \
|
||||
component.h \
|
||||
constant.h \
|
||||
device.h \
|
||||
error.h \
|
||||
@ -54,10 +53,9 @@ HEADERS += axis.h \
|
||||
joyslider.h \
|
||||
keycode.h \
|
||||
layout.h \
|
||||
getkey.h \
|
||||
layout_edit.h \
|
||||
loop.h \
|
||||
quickset.h \
|
||||
timer.h \
|
||||
trayicon/trayicon.h
|
||||
SOURCES += axis.cpp \
|
||||
axis_edit.cpp \
|
||||
@ -74,9 +72,9 @@ SOURCES += axis.cpp \
|
||||
keycode.cpp \
|
||||
layout.cpp \
|
||||
layout_edit.cpp \
|
||||
loop.cpp \
|
||||
main.cpp \
|
||||
quickset.cpp \
|
||||
getkey.cpp \
|
||||
trayicon/trayicon.cpp \
|
||||
trayicon/trayicon_x11.cpp
|
||||
|
||||
|
@ -2,12 +2,14 @@
|
||||
#define QUICKSET_H
|
||||
|
||||
//for building the dialog
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
#include <qpushbutton.h>
|
||||
#include <QLayout>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <linux/joystick.h>
|
||||
|
||||
//to request new keycodes
|
||||
#include "keycode.h"
|
||||
//#include "keycode.h"
|
||||
//to actually set the joypad
|
||||
#include "joypad.h"
|
||||
|
||||
|
11
src/timer.h
11
src/timer.h
@ -1,11 +0,0 @@
|
||||
#ifndef JTIMER_H
|
||||
#define JTIMER_H
|
||||
|
||||
#include "component.h"
|
||||
|
||||
//the purpose of this file is to make a list of Components that need timer
|
||||
//notification available to JoyLoop, Axis, and Buttons
|
||||
extern void takeTimer( Component* ); //taken from main.cpp
|
||||
extern void tossTimer( Component* ); //taken from main.cpp
|
||||
|
||||
#endif
|
@ -19,7 +19,6 @@
|
||||
*/
|
||||
|
||||
#include "trayicon.h"
|
||||
#include "qpopupmenu.h"
|
||||
|
||||
/*!
|
||||
\class TrayIcon qtrayicon.h
|
||||
@ -33,9 +32,9 @@
|
||||
\sa show
|
||||
*/
|
||||
TrayIcon::TrayIcon( QObject *parent, const char *name )
|
||||
: QObject(parent, name), pop(0), d(0)
|
||||
: QObject(parent/*, name*/), pop(0), d(0)
|
||||
{
|
||||
v_isWMDock = FALSE;
|
||||
v_isWMDock = FALSE;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -45,10 +44,10 @@ TrayIcon::TrayIcon( QObject *parent, const char *name )
|
||||
|
||||
\sa show
|
||||
*/
|
||||
TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QPopupMenu *popup, QObject *parent, const char *name )
|
||||
: QObject(parent, name), pop(popup), pm(icon), tip(tooltip), d(0)
|
||||
TrayIcon::TrayIcon( const QPixmap &icon, const QString &tooltip, QMenu *popup, QObject *parent, const char *name )
|
||||
: QObject(parent/*, name*/), pop(popup), pm(icon), tip(tooltip), d(0)
|
||||
{
|
||||
v_isWMDock = FALSE;
|
||||
v_isWMDock = FALSE;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -63,7 +62,7 @@ TrayIcon::~TrayIcon()
|
||||
Sets the context menu to \a popup. The context menu will pop up when the
|
||||
user clicks the system tray entry with the right mouse button.
|
||||
*/
|
||||
void TrayIcon::setPopup( QPopupMenu* popup )
|
||||
void TrayIcon::setPopup( QMenu* popup )
|
||||
{
|
||||
pop = popup;
|
||||
}
|
||||
@ -73,7 +72,7 @@ void TrayIcon::setPopup( QPopupMenu* popup )
|
||||
|
||||
\sa setPopup
|
||||
*/
|
||||
QPopupMenu* TrayIcon::popup() const
|
||||
QMenu* TrayIcon::popup() const
|
||||
{
|
||||
return pop;
|
||||
}
|
||||
@ -139,22 +138,22 @@ bool TrayIcon::event( QEvent *e )
|
||||
{
|
||||
switch ( e->type() ) {
|
||||
case QEvent::MouseMove:
|
||||
mouseMoveEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
mouseMoveEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
|
||||
case QEvent::MouseButtonPress:
|
||||
mousePressEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
mousePressEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
|
||||
case QEvent::MouseButtonRelease:
|
||||
mouseReleaseEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
mouseReleaseEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
|
||||
case QEvent::MouseButtonDblClick:
|
||||
mouseDoubleClickEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
mouseDoubleClickEvent( (QMouseEvent*)e );
|
||||
break;
|
||||
default:
|
||||
return QObject::event( e );
|
||||
return QObject::event( e );
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@ -183,22 +182,22 @@ void TrayIcon::mousePressEvent( QMouseEvent *e )
|
||||
#ifndef Q_WS_WIN
|
||||
// This is for X11, menus appear on mouse press
|
||||
// I'm not sure whether Mac should be here or below.. Somebody check?
|
||||
switch ( e->button() ) {
|
||||
case RightButton:
|
||||
if ( pop ) {
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case LeftButton:
|
||||
case MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch ( e->button() ) {
|
||||
case Qt::RightButton:
|
||||
if ( pop ) {
|
||||
pop->popup( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case Qt::LeftButton:
|
||||
case Qt::MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
e->ignore();
|
||||
e->ignore();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -215,26 +214,26 @@ void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
|
||||
{
|
||||
#ifdef Q_WS_WIN
|
||||
// This is for Windows, where menus appear on mouse release
|
||||
switch ( e->button() ) {
|
||||
case RightButton:
|
||||
if ( pop ) {
|
||||
// Necessary to make keyboard focus
|
||||
// and menu closing work on Windows.
|
||||
pop->setActiveWindow();
|
||||
pop->popup( e->globalPos() );
|
||||
pop->setActiveWindow();
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case LeftButton:
|
||||
case MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch ( e->button() ) {
|
||||
case Qt::RightButton:
|
||||
if ( pop ) {
|
||||
// Necessary to make keyboard focus
|
||||
// and menu closing work on Windows.
|
||||
pop->setActiveWindow();
|
||||
pop->popup( e->globalPos() );
|
||||
pop->setActiveWindow();
|
||||
e->accept();
|
||||
}
|
||||
break;
|
||||
case Qt::LeftButton:
|
||||
case Qt::MidButton:
|
||||
emit clicked( e->globalPos(), e->button() );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
e->ignore();
|
||||
e->ignore();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -249,9 +248,9 @@ void TrayIcon::mouseReleaseEvent( QMouseEvent *e )
|
||||
*/
|
||||
void TrayIcon::mouseDoubleClickEvent( QMouseEvent *e )
|
||||
{
|
||||
if ( e->button() == LeftButton )
|
||||
emit doubleClicked( e->globalPos() );
|
||||
e->accept();
|
||||
if ( e->button() == Qt::LeftButton )
|
||||
emit doubleClicked( e->globalPos() );
|
||||
e->accept();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -272,5 +271,5 @@ void TrayIcon::mouseDoubleClickEvent( QMouseEvent *e )
|
||||
|
||||
void TrayIcon::gotCloseEvent()
|
||||
{
|
||||
closed();
|
||||
closed();
|
||||
}
|
||||
|
@ -23,8 +23,12 @@
|
||||
|
||||
#include <qobject.h>
|
||||
#include <qimage.h>
|
||||
#include <QPixmap>
|
||||
#include <QDir>
|
||||
#include <QMenu>
|
||||
#include <QMouseEvent>
|
||||
|
||||
|
||||
class QPopupMenu;
|
||||
|
||||
class TrayIcon : public QObject
|
||||
{
|
||||
@ -35,7 +39,7 @@ class TrayIcon : public QObject
|
||||
|
||||
public:
|
||||
TrayIcon( QObject *parent = 0, const char *name = 0 );
|
||||
TrayIcon( const QPixmap &, const QString &, QPopupMenu *popup = 0, QObject *parent = 0, const char *name = 0 );
|
||||
TrayIcon( const QPixmap &, const QString &, QMenu *popup = 0, QObject *parent = 0, const char *name = 0 );
|
||||
~TrayIcon();
|
||||
|
||||
// use WindowMaker dock mode. ignored on non-X11 platforms
|
||||
@ -43,8 +47,8 @@ public:
|
||||
bool isWMDock() { return v_isWMDock; }
|
||||
|
||||
// Set a popup menu to handle RMB
|
||||
void setPopup( QPopupMenu * );
|
||||
QPopupMenu* popup() const;
|
||||
void setPopup( QMenu * );
|
||||
QMenu* popup() const;
|
||||
|
||||
QPixmap icon() const;
|
||||
QString toolTip() const;
|
||||
@ -71,7 +75,7 @@ protected:
|
||||
virtual void mouseDoubleClickEvent( QMouseEvent *e );
|
||||
|
||||
private:
|
||||
QPopupMenu *pop;
|
||||
QMenu *pop;
|
||||
QPixmap pm;
|
||||
QString tip;
|
||||
bool v_isWMDock;
|
||||
|
@ -21,18 +21,15 @@
|
||||
|
||||
#include "trayicon.h"
|
||||
|
||||
#include<qapplication.h>
|
||||
#include<qimage.h>
|
||||
#include<qpixmap.h>
|
||||
#include<qtooltip.h>
|
||||
#include<qpainter.h>
|
||||
|
||||
#include <QX11Info>
|
||||
#include <QApplication>
|
||||
#include <QPainter>
|
||||
#include<X11/Xlib.h>
|
||||
#include<X11/Xutil.h>
|
||||
#include<X11/Xatom.h>
|
||||
|
||||
//#if QT_VERSION < 0x030200
|
||||
extern Time qt_x_time;
|
||||
//extern Time;// qt_x_time;
|
||||
//#endif
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -44,47 +41,47 @@ static XErrorHandler old_handler = 0;
|
||||
static int dock_xerror = 0;
|
||||
extern "C" int dock_xerrhandler(Display* dpy, XErrorEvent* err)
|
||||
{
|
||||
dock_xerror = err->error_code;
|
||||
return old_handler(dpy, err);
|
||||
dock_xerror = err->error_code;
|
||||
return old_handler(dpy, err);
|
||||
}
|
||||
|
||||
static void trap_errors()
|
||||
{
|
||||
dock_xerror = 0;
|
||||
old_handler = XSetErrorHandler(dock_xerrhandler);
|
||||
dock_xerror = 0;
|
||||
old_handler = XSetErrorHandler(dock_xerrhandler);
|
||||
}
|
||||
|
||||
static bool untrap_errors()
|
||||
{
|
||||
XSetErrorHandler(old_handler);
|
||||
return (dock_xerror == 0);
|
||||
XSetErrorHandler(old_handler);
|
||||
return (dock_xerror == 0);
|
||||
}
|
||||
|
||||
static bool send_message(
|
||||
Display* dpy, /* display */
|
||||
Window w, /* sender (tray icon window) */
|
||||
long message, /* message opcode */
|
||||
long data1, /* message data 1 */
|
||||
long data2, /* message data 2 */
|
||||
long data3 /* message data 3 */
|
||||
Display* dpy, /* display */
|
||||
Window w, /* sender (tray icon window) */
|
||||
long message, /* message opcode */
|
||||
long data1, /* message data 1 */
|
||||
long data2, /* message data 2 */
|
||||
long data3 /* message data 3 */
|
||||
) {
|
||||
XEvent ev;
|
||||
XEvent ev;
|
||||
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.xclient.type = ClientMessage;
|
||||
ev.xclient.window = w;
|
||||
ev.xclient.message_type = XInternAtom (dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
|
||||
ev.xclient.format = 32;
|
||||
ev.xclient.data.l[0] = CurrentTime;
|
||||
ev.xclient.data.l[1] = message;
|
||||
ev.xclient.data.l[2] = data1;
|
||||
ev.xclient.data.l[3] = data2;
|
||||
ev.xclient.data.l[4] = data3;
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.xclient.type = ClientMessage;
|
||||
ev.xclient.window = w;
|
||||
ev.xclient.message_type = XInternAtom (dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
|
||||
ev.xclient.format = 32;
|
||||
ev.xclient.data.l[0] = CurrentTime;
|
||||
ev.xclient.data.l[1] = message;
|
||||
ev.xclient.data.l[2] = data1;
|
||||
ev.xclient.data.l[3] = data2;
|
||||
ev.xclient.data.l[4] = data3;
|
||||
|
||||
trap_errors();
|
||||
XSendEvent(dpy, w, False, NoEventMask, &ev);
|
||||
XSync(dpy, False);
|
||||
return untrap_errors();
|
||||
trap_errors();
|
||||
XSendEvent(dpy, w, False, NoEventMask, &ev);
|
||||
XSync(dpy, False);
|
||||
return untrap_errors();
|
||||
}
|
||||
|
||||
#define SYSTEM_TRAY_REQUEST_DOCK 0
|
||||
@ -98,123 +95,125 @@ static bool send_message(
|
||||
class TrayIcon::TrayIconPrivate : public QWidget
|
||||
{
|
||||
public:
|
||||
TrayIconPrivate(TrayIcon *object, int size);
|
||||
~TrayIconPrivate() { }
|
||||
TrayIconPrivate(TrayIcon *object, int size);
|
||||
~TrayIconPrivate() { }
|
||||
|
||||
virtual void initWM(WId icon);
|
||||
virtual void initWM(WId icon);
|
||||
|
||||
virtual void setPixmap(const QPixmap &pm);
|
||||
virtual void setPixmap(const QPixmap &pm);
|
||||
|
||||
virtual void paintEvent(QPaintEvent *);
|
||||
virtual void enterEvent(QEvent *);
|
||||
virtual void mouseMoveEvent(QMouseEvent *e);
|
||||
virtual void mousePressEvent(QMouseEvent *e);
|
||||
virtual void mouseReleaseEvent(QMouseEvent *e);
|
||||
virtual void mouseDoubleClickEvent(QMouseEvent *e);
|
||||
virtual void closeEvent(QCloseEvent *e);
|
||||
virtual void paintEvent(QPaintEvent *);
|
||||
virtual void enterEvent(QEvent *);
|
||||
virtual void mouseMoveEvent(QMouseEvent *e);
|
||||
virtual void mousePressEvent(QMouseEvent *e);
|
||||
virtual void mouseReleaseEvent(QMouseEvent *e);
|
||||
virtual void mouseDoubleClickEvent(QMouseEvent *e);
|
||||
virtual void closeEvent(QCloseEvent *e);
|
||||
|
||||
private:
|
||||
TrayIcon *iconObject;
|
||||
QPixmap pix;
|
||||
int size;
|
||||
TrayIcon *iconObject;
|
||||
QPixmap pix;
|
||||
int size;
|
||||
};
|
||||
|
||||
TrayIcon::TrayIconPrivate::TrayIconPrivate(TrayIcon *object, int _size)
|
||||
: QWidget(0, object->name(), WRepaintNoErase)
|
||||
: QWidget(0/*, object->name(), Qt::WRepaintNoErase*/)
|
||||
{
|
||||
iconObject = object;
|
||||
size = _size;
|
||||
iconObject = object;
|
||||
size = _size;
|
||||
setAttribute(Qt::WA_NoBackground);
|
||||
setFocusPolicy(Qt::NoFocus);
|
||||
//setBackgroundMode(X11ParentRelative);
|
||||
|
||||
setFocusPolicy(NoFocus);
|
||||
setBackgroundMode(X11ParentRelative);
|
||||
|
||||
setMinimumSize(size, size);
|
||||
setMaximumSize(size, size);
|
||||
setMinimumSize(size, size);
|
||||
setMaximumSize(size, size);
|
||||
}
|
||||
|
||||
// This base stuff is required by both FreeDesktop specification and WindowMaker
|
||||
void TrayIcon::TrayIconPrivate::initWM(WId icon)
|
||||
{
|
||||
Display *dsp = x11Display();
|
||||
WId leader = winId();
|
||||
Display *dsp = x11Info().display();
|
||||
WId leader = winId();
|
||||
|
||||
// set the class hint
|
||||
XClassHint classhint;
|
||||
classhint.res_name = (char*)"psidock";
|
||||
classhint.res_class = (char*)"Psi";
|
||||
XSetClassHint(dsp, leader, &classhint);
|
||||
// set the class hint
|
||||
XClassHint classhint;
|
||||
classhint.res_name = (char*)"psidock";
|
||||
classhint.res_class = (char*)"Psi";
|
||||
XSetClassHint(dsp, leader, &classhint);
|
||||
|
||||
// set the Window Manager hints
|
||||
XWMHints *hints;
|
||||
hints = XGetWMHints(dsp, leader); // init hints
|
||||
hints->flags = WindowGroupHint | IconWindowHint | StateHint; // set the window group hint
|
||||
hints->window_group = leader; // set the window hint
|
||||
hints->initial_state = WithdrawnState; // initial state
|
||||
hints->icon_window = icon; // in WM, this should be winId() of separate widget
|
||||
hints->icon_x = 0;
|
||||
hints->icon_y = 0;
|
||||
XSetWMHints(dsp, leader, hints); // set the window hints for WM to use.
|
||||
XFree( hints );
|
||||
// set the Window Manager hints
|
||||
XWMHints *hints;
|
||||
hints = XGetWMHints(dsp, leader); // init hints
|
||||
hints->flags = WindowGroupHint | IconWindowHint | StateHint; // set the window group hint
|
||||
hints->window_group = leader; // set the window hint
|
||||
hints->initial_state = WithdrawnState; // initial state
|
||||
hints->icon_window = icon; // in WM, this should be winId() of separate widget
|
||||
hints->icon_x = 0;
|
||||
hints->icon_y = 0;
|
||||
XSetWMHints(dsp, leader, hints); // set the window hints for WM to use.
|
||||
XFree( hints );
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::setPixmap(const QPixmap &pm)
|
||||
{
|
||||
pix = pm;
|
||||
setIcon(pix);
|
||||
repaint();
|
||||
pix = pm;
|
||||
setWindowIcon(pix);
|
||||
repaint();
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::paintEvent(QPaintEvent *)
|
||||
{
|
||||
QPainter p(this);
|
||||
p.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix);
|
||||
QPainter p(this);
|
||||
p.drawPixmap((width() - pix.width())/2, (height() - pix.height())/2, pix);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::enterEvent(QEvent *e)
|
||||
{
|
||||
// Taken from KSystemTray..
|
||||
// Taken from KSystemTray..
|
||||
//#if QT_VERSION < 0x030200
|
||||
//if ( !qApp->focusWidget() ) {
|
||||
XEvent ev;
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.xfocus.display = qt_xdisplay();
|
||||
ev.xfocus.type = FocusIn;
|
||||
ev.xfocus.window = winId();
|
||||
ev.xfocus.mode = NotifyNormal;
|
||||
ev.xfocus.detail = NotifyAncestor;
|
||||
Time time = qt_x_time;
|
||||
qt_x_time = 1;
|
||||
qApp->x11ProcessEvent( &ev );
|
||||
qt_x_time = time;
|
||||
//}
|
||||
//if ( !qApp->focusWidget() ) {
|
||||
XEvent ev;
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.xfocus.display = x11Info().display();//qt_xdisplay();
|
||||
ev.xfocus.type = FocusIn;
|
||||
ev.xfocus.window = winId();
|
||||
ev.xfocus.mode = NotifyNormal;
|
||||
ev.xfocus.detail = NotifyAncestor;
|
||||
Time time = x11Info().appTime();//qt_x_time;
|
||||
//qt_x_time = 1;
|
||||
x11Info().setAppTime(1);
|
||||
qApp->x11ProcessEvent( &ev );
|
||||
//qt_x_time = time;
|
||||
x11Info().setAppTime(time);
|
||||
//}
|
||||
//#endif
|
||||
QWidget::enterEvent(e);
|
||||
QWidget::enterEvent(e);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::mouseMoveEvent(QMouseEvent *e)
|
||||
{
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::mousePressEvent(QMouseEvent *e)
|
||||
{
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::mouseReleaseEvent(QMouseEvent *e)
|
||||
{
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::mouseDoubleClickEvent(QMouseEvent *e)
|
||||
{
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
QApplication::sendEvent(iconObject, e);
|
||||
}
|
||||
|
||||
void TrayIcon::TrayIconPrivate::closeEvent(QCloseEvent *e)
|
||||
{
|
||||
iconObject->gotCloseEvent();
|
||||
e->accept();
|
||||
iconObject->gotCloseEvent();
|
||||
e->accept();
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -224,43 +223,43 @@ void TrayIcon::TrayIconPrivate::closeEvent(QCloseEvent *e)
|
||||
class TrayIconFreeDesktop : public TrayIcon::TrayIconPrivate
|
||||
{
|
||||
public:
|
||||
TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm);
|
||||
TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm);
|
||||
};
|
||||
|
||||
TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm)
|
||||
: TrayIconPrivate(object, 22)
|
||||
: TrayIconPrivate(object, 22)
|
||||
{
|
||||
initWM( winId() );
|
||||
initWM( winId() );
|
||||
|
||||
// initialize NetWM
|
||||
Display *dsp = x11Display();
|
||||
// initialize NetWM
|
||||
Display *dsp = x11Info().display();//x11Display();
|
||||
|
||||
// dock the widget (adapted from SIM-ICQ)
|
||||
Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen
|
||||
int screen_id = XScreenNumberOfScreen(screen); // and it's number
|
||||
// dock the widget (adapted from SIM-ICQ)
|
||||
Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen
|
||||
int screen_id = XScreenNumberOfScreen(screen); // and it's number
|
||||
|
||||
char buf[32];
|
||||
snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id);
|
||||
Atom selection_atom = XInternAtom(dsp, buf, false);
|
||||
XGrabServer(dsp);
|
||||
Window manager_window = XGetSelectionOwner(dsp, selection_atom);
|
||||
if ( manager_window != None )
|
||||
XSelectInput(dsp, manager_window, StructureNotifyMask);
|
||||
XUngrabServer(dsp);
|
||||
XFlush(dsp);
|
||||
char buf[32];
|
||||
snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id);
|
||||
Atom selection_atom = XInternAtom(dsp, buf, false);
|
||||
XGrabServer(dsp);
|
||||
Window manager_window = XGetSelectionOwner(dsp, selection_atom);
|
||||
if ( manager_window != None )
|
||||
XSelectInput(dsp, manager_window, StructureNotifyMask);
|
||||
XUngrabServer(dsp);
|
||||
XFlush(dsp);
|
||||
|
||||
if ( manager_window != None )
|
||||
send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0);
|
||||
if ( manager_window != None )
|
||||
send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0);
|
||||
|
||||
// some KDE mumbo-jumbo... why is it there? anybody?
|
||||
Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false);
|
||||
Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false);
|
||||
// some KDE mumbo-jumbo... why is it there? anybody?
|
||||
Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false);
|
||||
Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false);
|
||||
|
||||
long data = 0;
|
||||
XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1);
|
||||
XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1);
|
||||
long data = 0;
|
||||
XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1);
|
||||
XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1);
|
||||
|
||||
setPixmap(pm);
|
||||
setPixmap(pm);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -270,58 +269,58 @@ TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm)
|
||||
class TrayIconWharf : public TrayIcon::TrayIconPrivate
|
||||
{
|
||||
public:
|
||||
TrayIconWharf(TrayIcon *object, const QPixmap &pm)
|
||||
: TrayIconPrivate(object, 64)
|
||||
{
|
||||
setPixmap(pm);
|
||||
}
|
||||
TrayIconWharf(TrayIcon *object, const QPixmap &pm)
|
||||
: TrayIconPrivate(object, 64)
|
||||
{
|
||||
setPixmap(pm);
|
||||
}
|
||||
|
||||
void setPixmap(const QPixmap &_pm)
|
||||
{
|
||||
QPixmap pm;
|
||||
QImage i = _pm.convertToImage();
|
||||
i = i.scale(i.width() * 2, i.height() * 2);
|
||||
pm.convertFromImage(i);
|
||||
void setPixmap(const QPixmap &_pm)
|
||||
{
|
||||
QPixmap pm;
|
||||
QImage i = _pm.toImage();
|
||||
i = i.scaled(i.width() * 2, i.height() * 2);
|
||||
pm = QPixmap::fromImage(i);
|
||||
|
||||
TrayIconPrivate::setPixmap(pm);
|
||||
TrayIconPrivate::setPixmap(pm);
|
||||
|
||||
// thanks to Robert Spier for this:
|
||||
// for some reason the repaint() isn't being honored, or isn't for
|
||||
// the icon. So force one on the widget behind the icon
|
||||
erase();
|
||||
QPaintEvent pe( rect() );
|
||||
paintEvent(&pe);
|
||||
}
|
||||
// thanks to Robert Spier for this:
|
||||
// for some reason the repaint() isn't being honored, or isn't for
|
||||
// the icon. So force one on the widget behind the icon
|
||||
//erase();
|
||||
QPaintEvent pe( rect() );
|
||||
paintEvent(&pe);
|
||||
}
|
||||
};
|
||||
|
||||
class TrayIconWindowMaker : public TrayIcon::TrayIconPrivate
|
||||
{
|
||||
public:
|
||||
TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm);
|
||||
~TrayIconWindowMaker();
|
||||
TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm);
|
||||
~TrayIconWindowMaker();
|
||||
|
||||
void setPixmap(const QPixmap &pm);
|
||||
void setPixmap(const QPixmap &pm);
|
||||
|
||||
private:
|
||||
TrayIconWharf *wharf;
|
||||
TrayIconWharf *wharf;
|
||||
};
|
||||
|
||||
TrayIconWindowMaker::TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm)
|
||||
: TrayIconPrivate(object, 32)
|
||||
: TrayIconPrivate(object, 32)
|
||||
{
|
||||
wharf = new TrayIconWharf(object, pm);
|
||||
wharf = new TrayIconWharf(object, pm);
|
||||
|
||||
initWM( wharf->winId() );
|
||||
initWM( wharf->winId() );
|
||||
}
|
||||
|
||||
TrayIconWindowMaker::~TrayIconWindowMaker()
|
||||
{
|
||||
delete wharf;
|
||||
delete wharf;
|
||||
}
|
||||
|
||||
void TrayIconWindowMaker::setPixmap(const QPixmap &pm)
|
||||
{
|
||||
wharf->setPixmap(pm);
|
||||
wharf->setPixmap(pm);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@ -330,43 +329,46 @@ void TrayIconWindowMaker::setPixmap(const QPixmap &pm)
|
||||
|
||||
void TrayIcon::sysInstall()
|
||||
{
|
||||
if ( d )
|
||||
return;
|
||||
if ( d )
|
||||
return;
|
||||
|
||||
if ( v_isWMDock )
|
||||
d = (TrayIconPrivate *)(new TrayIconWindowMaker(this, pm));
|
||||
else
|
||||
d = (TrayIconPrivate *)(new TrayIconFreeDesktop(this, pm));
|
||||
if ( v_isWMDock )
|
||||
d = (TrayIconPrivate *)(new TrayIconWindowMaker(this, pm));
|
||||
else
|
||||
d = (TrayIconPrivate *)(new TrayIconFreeDesktop(this, pm));
|
||||
|
||||
sysUpdateToolTip();
|
||||
d->show();
|
||||
sysUpdateToolTip();
|
||||
d->show();
|
||||
}
|
||||
|
||||
void TrayIcon::sysRemove()
|
||||
{
|
||||
if ( !d )
|
||||
return;
|
||||
if ( !d )
|
||||
return;
|
||||
|
||||
delete d;
|
||||
d = 0;
|
||||
delete d;
|
||||
d = 0;
|
||||
}
|
||||
|
||||
void TrayIcon::sysUpdateIcon()
|
||||
{
|
||||
if ( !d )
|
||||
return;
|
||||
if ( !d )
|
||||
return;
|
||||
|
||||
QPixmap pix = pm;
|
||||
d->setPixmap(pix);
|
||||
QPixmap pix = pm;
|
||||
d->setPixmap(pix);
|
||||
}
|
||||
|
||||
void TrayIcon::sysUpdateToolTip()
|
||||
{
|
||||
if ( !d )
|
||||
return;
|
||||
if ( !d )
|
||||
return;
|
||||
|
||||
if ( tip.isEmpty() )
|
||||
QToolTip::remove(d);
|
||||
else
|
||||
QToolTip::add(d, tip);
|
||||
if ( tip.isEmpty() ) {
|
||||
//QToolTip::remove(d);
|
||||
d->setToolTip(QString());
|
||||
} else {
|
||||
//QToolTip::add(d, tip);
|
||||
d->setToolTip(tip);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user