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:
John Toman
2009-08-03 01:01:45 +00:00
committed by virtuoussin13
parent c1ef3fa0b7
commit 345bb5748e
36 changed files with 1152 additions and 1506 deletions

View File

@ -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

View File

@ -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));
:QDialog() {
//build the dialog, display current axis settings :)
axis = ax;
setWindowTitle("Set " + axis->getName());
setWindowIcon(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.
//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);
QVBoxLayout* v = new QVBoxLayout(this);
v->setMargin(5);
v->setSpacing(5);
QHBoxLayout* h = new QHBoxLayout();
QVBoxLayout* v2 = new QVBoxLayout(0,5,5);
CGradient = new QCheckBox("Gradient", this);
CGradient->setChecked(axis->gradient);
v2->addWidget(CGradient);
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("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);
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,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);
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);
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, 5, 5);
h->setAutoAdd(true);
BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox);
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("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 )));
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);
v->addWidget( KeyBox );
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);
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 );
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();
}

View File

@ -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:

View File

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

View File

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

View File

@ -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);
//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;
//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.
//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);
}

View File

@ -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

View File

@ -1,60 +1,66 @@
#include "button_edit.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
ButtonEdit::ButtonEdit(Button* butt)
:QDialog(0,0,true) {
//build the dialog!
button = butt;
setCaption("Set " + button->getName());
setIcon(QPixmap(ICON24));
:QDialog(0) {
setModal(true);
//build the dialog!
button = butt;
setWindowTitle("Set " + button->getName());
setWindowIcon(QPixmap(ICON24));
QVBoxLayout* v = new QVBoxLayout(this, 5, 5);
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);
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);
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);
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();
}

View File

@ -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"

View File

@ -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;
ButtonEdit* be = new ButtonEdit(button);
be->exec();
delete be;
update();
FlashButton::mouseReleaseEvent( e );
update();
FlashButton::mouseReleaseEvent( e );
}

View File

@ -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:

View File

@ -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

View File

@ -24,4 +24,6 @@
#define NAME "QJoyPad 3.4"
#define MOUSE_OFFSET 400
#endif

View File

@ -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

View File

@ -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

View File

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

View File

@ -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(Qt::NoFocus);
setAutoDefault( false );
setFocusPolicy(QWidget::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 );
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() ));
}
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 );
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 );
}

View File

@ -15,8 +15,9 @@
#include <qpushbutton.h>
#include <qlayout.h>
#include <QPushButton>
#include <QPalette>
#include <QBoxLayout>
//A QPushButton that can flash a color

View File

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

View File

@ -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

View File

@ -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;
: 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;
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);
}
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 )));
}
if (joypad->buttons % 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 )));
LMain->addWidget(Buttons[i], insertCounter/2, insertCounter%2);
insertCounter++;
}
new QWidget(this);
new QWidget(this);
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()));
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);
//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);
//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);
//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);
}

View File

@ -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"

View File

@ -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( palette().dark().color() );
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( palette().shadow().color() );
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( 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( colorGroup().midlight() );
paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight );
paint.drawLine( x + width, 1 + boxheight, x + width, 1 );
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 );
}
//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;
//if this is disabled, that's enough of that.
if (!isEnabled()) return;
//now we need to draw.
QPainter paint( this );
//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 );
//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 );
//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;
QPointArray shape;
//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( 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);
}
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);
}
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);
}
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);
}
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();
}

View File

@ -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.

View File

@ -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]";
if (keycode == 0) return "[NO KEY]";
QString xname = XKeysymToString(XKeycodeToKeysym(display, keycode,0));
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.
//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();
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("(.*)_(.*)");
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("^[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;
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 /";
//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;
}
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";
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));
}
}

View File

@ -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 {

View File

@ -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;

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

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

View File

@ -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;

View File

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