From 345bb5748e6e5d5927279da49dca5eb7b40f2d28 Mon Sep 17 00:00:00 2001 From: John Toman Date: Mon, 3 Aug 2009 01:01:45 +0000 Subject: [PATCH] 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 --- src/axis.h | 23 ++- src/axis_edit.cpp | 235 +++++++++++---------- src/axis_edit.h | 18 +- src/axisw.cpp | 49 ++--- src/axisw.h | 6 +- src/button.cpp | 254 ++++++++++++----------- src/button.h | 20 +- src/button_edit.cpp | 102 ++++----- src/button_edit.h | 9 +- src/buttonw.cpp | 33 +-- src/buttonw.h | 5 + src/component.h | 36 ---- src/constant.h | 2 + src/device.h | 5 +- src/error.h | 2 +- src/event.cpp | 26 +-- src/flash.cpp | 134 ++++++------ src/flash.h | 5 +- src/icon.cpp | 41 ++-- src/icon.h | 16 +- src/joypadw.cpp | 149 +++++++------- src/joypadw.h | 6 +- src/joyslider.cpp | 375 +++++++++++++++++----------------- src/joyslider.h | 15 +- src/keycode.cpp | 231 ++++++++------------- src/keycode.h | 35 +--- src/layout.h | 30 +-- src/loop.cpp | 65 ------ src/loop.h | 39 ---- src/portinglog.txt | 184 ----------------- src/qjoypad.pro | 10 +- src/quickset.h | 10 +- src/timer.h | 11 - src/trayicon/trayicon.cpp | 109 +++++----- src/trayicon/trayicon.h | 14 +- src/trayicon/trayicon_x11.cpp | 354 ++++++++++++++++---------------- 36 files changed, 1152 insertions(+), 1506 deletions(-) delete mode 100644 src/component.h delete mode 100644 src/loop.cpp delete mode 100644 src/loop.h delete mode 100644 src/portinglog.txt delete mode 100644 src/timer.h diff --git a/src/axis.h b/src/axis.h index ff47498..760f34e 100644 --- a/src/axis.h +++ b/src/axis.h @@ -4,11 +4,11 @@ //abs() #include -//parent of Axis -#include "component.h" - -//to request a periodic tap on the shoulder for gradient mode -#include "timer.h" +#include +#include +#include +#include +#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 diff --git a/src/axis_edit.cpp b/src/axis_edit.cpp index 6020081..82dc625 100644 --- a/src/axis_edit.cpp +++ b/src/axis_edit.cpp @@ -1,131 +1,150 @@ #include "axis_edit.h" + AxisEdit::AxisEdit( Axis* ax ) - :QDialog() { - //build the dialog, display current axis settings :) - axis = ax; - setCaption("Set " + axis->getName()); - setIcon(QPixmap(ICON24)); - - //h, v, and v2 are all references to layouts. They are used to refer to - //various layouts as the dialog is built and are not pointing to the same - //thing throughout. This is just because I don't care about the layouts - //after I have placed the widgets within them and there's no reasno to - //keep track of them. - - QVBoxLayout* v = new QVBoxLayout(this, 5, 5); - - QHBoxLayout* h = new QHBoxLayout(); - QVBoxLayout* v2 = new QVBoxLayout(0,5,5); - CGradient = new QCheckBox("Gradient", this); - CGradient->setChecked(axis->gradient); - v2->addWidget(CGradient); - - CMode = new QComboBox(this); - CMode->insertItem("Keyboard",keybd); - CMode->insertItem("Mouse (Vert.)",mousepv); - CMode->insertItem("Mouse (Vert. Rev.)", mousenv); - CMode->insertItem("Mouse (Hor.)", mouseph); - CMode->insertItem("Mouse (Hor. Rev.)", mousenh); - CMode->setCurrentItem( axis->mode ); - connect(CMode, SIGNAL(activated(int)), this, SLOT( CModeChanged( int ))); - v2->addWidget(CMode); - h->addLayout(v2); - - MouseBox = new QFrame(this); - MouseBox->setFrameStyle( QFrame::Box | QFrame::Sunken ); - v2 = new QVBoxLayout(MouseBox,5,5); - v2->setAutoAdd(true); - new QLabel("Mouse Speed", MouseBox); - SSpeed = new QSpinBox(0,MAXMOUSESPEED,1,MouseBox); - SSpeed->setValue(axis->maxSpeed); - h->addWidget(MouseBox); - v->addLayout(h); + :QDialog() { + //build the dialog, display current axis settings :) + axis = ax; + setWindowTitle("Set " + axis->getName()); + setWindowIcon(QPixmap(ICON24)); - Slider = new JoySlider(axis->dZone, axis->xZone, axis->state, this); - v->addWidget(Slider); + //h, v, and v2 are all references to layouts. They are used to refer to + //various layouts as the dialog is built and are not pointing to the same + //thing throughout. This is just because I don't care about the layouts + //after I have placed the widgets within them and there's no reasno to + //keep track of them. - KeyBox = new QFrame(this); - KeyBox->setFrameStyle( QFrame::Box | QFrame::Sunken ); - h = new QHBoxLayout(KeyBox, 5, 5); - h->setAutoAdd(true); - BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox); - - CThrottle = new QComboBox(KeyBox); - CThrottle->insertItem("Neg. Throttle",0); - CThrottle->insertItem("No Throttle",1); - CThrottle->insertItem("Pos. Throttle",2); - CThrottle->setCurrentItem(axis->throttle + 1); - connect( CThrottle, SIGNAL( activated( int )), this, SLOT( CThrottleChanged( int ))); - - BPos = new KeyButton(axis->getName(),axis->pkeycode,KeyBox); - v->addWidget( KeyBox ); - - h = new QHBoxLayout(); - BOkay = new QPushButton("Okay", this); - connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept())); - h->addWidget(BOkay); - BCancel = new QPushButton("Cancel", this); - connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject())); - h->addWidget(BCancel); - v->addLayout(h); - - CModeChanged( axis->mode ); - CThrottleChanged( axis->throttle + 1 ); + QVBoxLayout* v = new QVBoxLayout(this); + v->setMargin(5); + v->setSpacing(5); + + QHBoxLayout* h = new QHBoxLayout(); + QVBoxLayout* v2 = new QVBoxLayout(); + v2->setMargin(5); + v2->setSpacing(5); + CGradient = new QCheckBox("Gradient", this); + CGradient->setChecked(axis->gradient); + v2->addWidget(CGradient); + + CMode = new QComboBox(this); + CMode->insertItem((int)keybd, QString("Keyboard"), QVariant(NULL)); + CMode->insertItem((int) mousepv,QString("Mouse (Vert.)"),QVariant(NULL)); + CMode->insertItem((int) mousenv, QString("Mouse (Vert. Rev.)"), QVariant(NULL)); + CMode->insertItem((int) mouseph, "Mouse (Hor.)", QVariant(NULL)); + CMode->insertItem((int)mousenh, QString("Mouse (Hor. Rev.)"), NULL); + CMode->setCurrentIndex( axis->mode ); + connect(CMode, SIGNAL(activated(int)), this, SLOT( CModeChanged( int ))); + v2->addWidget(CMode); + h->addLayout(v2); + + MouseBox = new QFrame(this); + MouseBox->setFrameStyle( QFrame::Box | QFrame::Sunken ); + v2 = new QVBoxLayout(MouseBox); + v2->setSpacing(5); + v2->setMargin(5); + //v2->setAutoAdd(true); + QLabel *mouseLabel = new QLabel("Mouse Speed", MouseBox); + v2->addWidget(mouseLabel); + SSpeed = new QSpinBox(MouseBox); + SSpeed->setRange(0,MAXMOUSESPEED); + SSpeed->setSingleStep(1); + SSpeed->setValue(axis->maxSpeed); + v2->addWidget(SSpeed); + h->addWidget(MouseBox); + v->addLayout(h); + + Slider = new JoySlider(axis->dZone, axis->xZone, axis->state, this); + v->addWidget(Slider); + + KeyBox = new QFrame(this); + KeyBox->setFrameStyle( QFrame::Box | QFrame::Sunken ); + h = new QHBoxLayout(KeyBox); + h->setSpacing(5); + h->setMargin(5); + //h->setAutoAdd(true); + BNeg = new KeyButton(axis->getName(),axis->nkeycode,KeyBox); + + CThrottle = new QComboBox(KeyBox); + CThrottle->insertItem(0,"Neg. Throttle",QVariant(NULL)); + CThrottle->insertItem(1,"No Throttle",QVariant(NULL)); + CThrottle->insertItem(2,"Pos. Throttle",QVariant(NULL)); + CThrottle->setCurrentIndex(axis->throttle + 1); + connect( CThrottle, SIGNAL( activated( int )), this, SLOT( CThrottleChanged( int ))); + + BPos = new KeyButton(axis->getName(),axis->pkeycode,KeyBox); + h->addWidget(BNeg); + h->addWidget(CThrottle); + h->addWidget(BPos); + v->addWidget( KeyBox ); + + h = new QHBoxLayout(); + BOkay = new QPushButton("Okay", this); + connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept())); + h->addWidget(BOkay); + BCancel = new QPushButton("Cancel", this); + connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject())); + h->addWidget(BCancel); + v->addLayout(h); + + CModeChanged( axis->mode ); + CThrottleChanged( axis->throttle + 1 ); } void AxisEdit::show() { - QDialog::show(); - setFixedSize(size()); + QDialog::show(); + setFixedSize(size()); } void AxisEdit::setState( int val ) { - Slider->setValue( val ); + Slider->setValue( val ); } void AxisEdit::CModeChanged( int index ) { - if (index == keybd) { - MouseBox->setEnabled(false); - KeyBox->setEnabled(true); - } - else { - MouseBox->setEnabled(true); - KeyBox->setEnabled(false); - } + if (index == keybd) { + MouseBox->setEnabled(false); + KeyBox->setEnabled(true); + } + else { + MouseBox->setEnabled(true); + KeyBox->setEnabled(false); + } } void AxisEdit::CThrottleChanged( int index ) { - switch (index) { - case 0: BNeg->setEnabled(true); - BPos->setEnabled(false); - break; - case 1: BNeg->setEnabled(true); - BPos->setEnabled(true); - break; - case 2: BNeg->setEnabled(false); - BPos->setEnabled(true); - break; - } - Slider->setThrottle( index - 1 ); + switch (index) { + case 0: + BNeg->setEnabled(true); + BPos->setEnabled(false); + break; + case 1: + BNeg->setEnabled(true); + BPos->setEnabled(true); + break; + case 2: + BNeg->setEnabled(false); + BPos->setEnabled(true); + break; + } + Slider->setThrottle( index - 1 ); } void AxisEdit::accept() { //if the gradient status has changed, either request a timer or turn it down. - if (axis->gradient) { - if (!CGradient->isChecked()) tossTimer(axis); - } - else { - if (CGradient->isChecked()) takeTimer(axis); - } - axis->gradient = CGradient->isChecked(); - axis->maxSpeed = SSpeed->value(); - axis->throttle = CThrottle->currentItem() - 1; - axis->dZone = Slider->dZone(); - axis->xZone = Slider->xZone(); - axis->mode = (AxisMode) CMode->currentItem(); - axis->pkeycode = BPos->getValue(); - axis->nkeycode = BNeg->getValue(); - axis->adjustGradient(); + /*if (axis->gradient) { + if (!CGradient->isChecked()) tossTimer(axis); + } + else { + if (CGradient->isChecked()) takeTimer(axis); + }*/ + axis->gradient = CGradient->isChecked(); + axis->maxSpeed = SSpeed->value(); + axis->throttle = CThrottle->currentIndex() - 1; + axis->dZone = Slider->dZone(); + axis->xZone = Slider->xZone(); + axis->mode = (AxisMode) CMode->currentIndex(); + axis->pkeycode = BPos->getValue(); + axis->nkeycode = BNeg->getValue(); + axis->adjustGradient(); - QDialog::accept(); + QDialog::accept(); } diff --git a/src/axis_edit.h b/src/axis_edit.h index 78bb904..8a8b56c 100644 --- a/src/axis_edit.h +++ b/src/axis_edit.h @@ -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 -#include -#include -#include -#include -#include -#include - +#include "axis.h" +#include +#include +#include +#include //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: diff --git a/src/axisw.cpp b/src/axisw.cpp index ec4522c..e85bd0c 100644 --- a/src/axisw.cpp +++ b/src/axisw.cpp @@ -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 ); } diff --git a/src/axisw.h b/src/axisw.h index 6b51812..0c2b540 100644 --- a/src/axisw.h +++ b/src/axisw.h @@ -1,13 +1,15 @@ #ifndef AXIS_WIDGET_H #define AXIS_WIDGET_H +#include //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 ); diff --git a/src/button.cpp b/src/button.cpp index acf1b3a..1503400 100644 --- a/src/button.cpp +++ b/src/button.cpp @@ -1,156 +1,178 @@ #include "button.h" - +#include "event.h" Button::Button( int i ) { - index = i; - isOn = false; - //to keep toDefault from calling tossTimer without first calling takeTimer - rapidfire = false; - toDefault(); + index = i; + isButtonPressed = false; + isDown = false; + rapidfire = false; + timer = new QTimer(this); + toDefault(); + tick = 0; } Button::~Button() { - release(); + release(); + //delete timer; } bool Button::read( QTextStream* stream ) { // at this point, toDefault() has just been called. - - //read in a line of text and break it into words - QString input = stream->readLine().lower(); - QRegExp regex("[\\s,]+"); - QStringList words = QStringList::split(regex,input); - - //used to assure correct conversion of QStrings -> ints - bool ok; - //used to receive converted ints from QStrings. - int val; - - //go through every word on the line describing this button. + + //read in a line of text and break it into words + QString input = stream->readLine().toLower(); + QRegExp regex("[\\s,]+"); + QStringList words = input.split(regex); + + //used to assure correct conversion of QStrings -> ints + bool ok; + //used to receive converted ints from QStrings. + int val; + + //go through every word on the line describing this button. for ( QStringList::Iterator it = words.begin(); it != words.end(); ++it ) { if (*it == "mouse") { - ++it; - if (it == words.end()) return false; - val = (*it).toInt(&ok); - if (ok && val >= 0 && val <= MAXKEY) { - useMouse = true; - mousecode = val; - } - else return false; - } - else if (*it == "key") { - ++it; - if (it == words.end()) return false; - val = (*it).toInt(&ok); - if (ok && val >= 0 && val <= MAXKEY) { - useMouse = false; - keycode = val; - } - else return false; - } - else if (*it == "rapidfire") { - if (rapidfire == false) takeTimer( this ); - rapidfire = true; - } - else if (*it == "sticky") { - sticky = true; - } + ++it; + if (it == words.end()) return false; + val = (*it).toInt(&ok); + if (ok && val >= 0 && val <= MAXKEY) { + useMouse = true; + mousecode = val; + } + else return false; + } + else if (*it == "key") { + ++it; + if (it == words.end()) return false; + val = (*it).toInt(&ok); + if (ok && val >= 0 && val <= MAXKEY) { + useMouse = false; + keycode = val; + } + else return false; + } + else if (*it == "rapidfire") { + rapidfire = true; + } + else if (*it == "sticky") { + sticky = true; + } } - return true; + return true; } void Button::write( QTextStream* stream ) { - *stream << "\t" << getName() << ": "; - if (rapidfire) *stream << "rapidfire, "; - if (sticky) *stream << "sticky, "; - *stream << (useMouse?"mouse ":"key ") << (useMouse?mousecode:keycode) << "\n"; + *stream << "\t" << getName() << ": "; + if (rapidfire) *stream << "rapidfire, "; + if (sticky) *stream << "sticky, "; + *stream << (useMouse?"mouse ":"key ") << (useMouse?mousecode:keycode) << "\n"; } void Button::release() { - if (isDown) { - click(false); - isDown = true; - } + if (isDown) { + click(false); + isDown = true; + } } void Button::jsevent( int value ) { - bool newval = (value == 1); - if (sticky) { - //the state of a sticky key only changes on button press, not button release. - if (newval) isOn = !isOn; - else return; - } - //if the received event indicates a change in state, - else if (newval != isOn) { - isOn = newval; //change state - } - //otherwise... we don't care. This shouldn't happen. - else return; - //if rapidfire is on, then timer() will do its job. Otherwise we must - //manually triger the key event. - if (!rapidfire) click(isOn); + bool newval = (value == 1); + if (sticky) { + //the state of a sticky key only changes on button press, not button release. + if (value == 1) { + isButtonPressed = !isButtonPressed; + } + else return; + } + //if the received event indicates a change in state, + else if (newval != isButtonPressed) { + isButtonPressed = newval; //change state + if (isButtonPressed && rapidfire) { + tick = 0; + connect(timer, SIGNAL(timeout()), this, SLOT(timerCalled())); + timer->start(MSEC); + } + if (!isButtonPressed && rapidfire) { + timer->stop(); + if(isDown) { + click(false); + } + tick = 0; + } + } + //otherwise... we don't care. This shouldn't happen. + else return; + //if rapidfire is on, then timer() will do its job. Otherwise we must + //manually triger the key event. + if (!rapidfire) { + click(isButtonPressed); + } } void Button::toDefault() { - if (rapidfire == true) tossTimer( this ); - rapidfire = false; - sticky = false; - useMouse = false; - keycode = 0; - mousecode = 0; + rapidfire = false; + sticky = false; + useMouse = false; + keycode = 0; + mousecode = 0; + timer->stop(); } bool Button::isDefault() { - return (rapidfire == false) && - (sticky == false) && - (useMouse == false) && - (keycode == 0) && - (mousecode == 0); + return (rapidfire == false) && + (sticky == false) && + (useMouse == false) && + (keycode == 0) && + (mousecode == 0); } QString Button::status() { - if (useMouse) { - return getName() + " : Mouse " + QString::number(mousecode); - } - else { - return getName() + " : " + QString(ktos(keycode)); - } + if (useMouse) { + return getName() + " : Mouse " + QString::number(mousecode); + } + else { + return getName() + " : " + QString(ktos(keycode)); + } } void Button::setKey( bool mouse, int value ) { - if (mouse) { - mousecode = value; - useMouse = true; - } - else { - keycode = value; - useMouse = false; - } + if (mouse) { + mousecode = value; + useMouse = true; + } + else { + keycode = value; + useMouse = false; + } } -void Button::timer( int tick ) { - if (isOn) { - //originally I just clicked true and then false right after, but this - //was not recognized by some programs. I need a delay in between. - if (tick % FREQ == 0) { - click(true); - } - if (tick % FREQ == FREQ / 2) { - click(false); - } - } +void Button::timerTick( int tick ) { + if (isButtonPressed) { + //originally I just clicked true and then false right after, but this + //was not recognized by some programs. I need a delay in between. + if (tick % FREQ == 0) { + click(true); + } + if (tick % FREQ == FREQ / 2) { + click(false); + } + } } void Button::click( bool press ) { - if (isDown == press) return; - isDown = press; - xevent click; - //determine which of the four possible events we're sending. - if (press) click.type = useMouse?BPRESS:KPRESS; - else click.type = useMouse?BREL:KREL; - //set up the event, - click.value1 = useMouse?mousecode:keycode; - click.value2 = 0; - //and send it. - sendevent( click ); + if (isDown == press) return; + isDown = press; + xevent click; + //determine which of the four possible events we're sending. + if (press) click.type = useMouse?BPRESS:KPRESS; + else click.type = useMouse?BREL:KREL; + //set up the event, + click.value1 = useMouse?mousecode:keycode; + click.value2 = 0; + //and send it. + sendevent( click ); +} + +void Button::timerCalled() { + timerTick(++tick); } diff --git a/src/button.h b/src/button.h index ffffc61..a0954be 100644 --- a/src/button.h +++ b/src/button.h @@ -1,19 +1,18 @@ #ifndef BUTTON_H #define BUTTON_H -//parent of Button -#include "component.h" +#include +#include -//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 diff --git a/src/button_edit.cpp b/src/button_edit.cpp index 51003d2..43de502 100644 --- a/src/button_edit.cpp +++ b/src/button_edit.cpp @@ -1,60 +1,66 @@ #include "button_edit.h" -ButtonEdit::ButtonEdit(Button* butt) - :QDialog(0,0,true) { - //build the dialog! - button = butt; - setCaption("Set " + button->getName()); - setIcon(QPixmap(ICON24)); - - QVBoxLayout* v = new QVBoxLayout(this, 5, 5); +#include +#include - BKKey = new KeyButton( button->getName(), button->useMouse?button->mousecode:button->keycode, this, true, button->useMouse); - v->addWidget(BKKey); - - QHBoxLayout* h = new QHBoxLayout(); - CSticky = new QCheckBox("Sticky", this); - CSticky->setChecked(button->sticky); - h->addWidget(CSticky); - CRapid = new QCheckBox("Rapid Fire", this); - CRapid->setChecked(button->rapidfire); - h->addWidget(CRapid); - v->addLayout(h); - - h = new QHBoxLayout(); - BOkay = new QPushButton("Okay", this); - connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept())); - h->addWidget(BOkay); - BCancel = new QPushButton("Cancel", this); - connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject())); - h->addWidget(BCancel); - v->addLayout(h); +ButtonEdit::ButtonEdit(Button* butt) + :QDialog(0) { + setModal(true); + //build the dialog! + button = butt; + setWindowTitle("Set " + button->getName()); + setWindowIcon(QPixmap(ICON24)); + + QVBoxLayout* v = new QVBoxLayout(this); + v->setMargin(5); + v->setSpacing(5); + + BKKey = new KeyButton( button->getName(), button->useMouse?button->mousecode:button->keycode, this, true, button->useMouse); + v->addWidget(BKKey); + + QHBoxLayout* h = new QHBoxLayout(); + CSticky = new QCheckBox("Sticky", this); + CSticky->setChecked(button->sticky); + h->addWidget(CSticky); + CRapid = new QCheckBox("Rapid Fire", this); + CRapid->setChecked(button->rapidfire); + h->addWidget(CRapid); + v->addLayout(h); + + h = new QHBoxLayout(); + BOkay = new QPushButton("Okay", this); + connect(BOkay, SIGNAL( clicked() ), this, SLOT( accept())); + h->addWidget(BOkay); + BCancel = new QPushButton("Cancel", this); + connect(BCancel, SIGNAL( clicked() ), this, SLOT( reject())); + h->addWidget(BCancel); + v->addLayout(h); } void ButtonEdit::show() { - QDialog::show(); - setFixedSize(size()); + QDialog::show(); + setFixedSize(size()); } void ButtonEdit::accept() { //if the rapidfire status has changed, either request a timer or turn it down. - if (button->rapidfire) { - if (!CRapid->isChecked()) tossTimer(button); - } - else { - if (CRapid->isChecked()) takeTimer(button); - } - button->rapidfire = CRapid->isChecked(); - button->sticky = (CSticky->isChecked()); - //if the user chose a mouse button... - if (BKKey->choseMouse()) { - button->useMouse = true; - button->mousecode = BKKey->getValue(); - } - else { - button->useMouse = false; - button->keycode = BKKey->getValue(); - } + /*if (button->rapidfire) { + if (!CRapid->isChecked()) tossTimer(button); + } + else { + if (CRapid->isChecked()) takeTimer(button); + }*/ + button->rapidfire = CRapid->isChecked(); + button->sticky = (CSticky->isChecked()); + //if the user chose a mouse button... + if (BKKey->choseMouse()) { + button->useMouse = true; + button->mousecode = BKKey->getValue(); + } + else { + button->useMouse = false; + button->keycode = BKKey->getValue(); + } - QDialog::accept(); + QDialog::accept(); } diff --git a/src/button_edit.h b/src/button_edit.h index c746e38..4248a0b 100644 --- a/src/button_edit.h +++ b/src/button_edit.h @@ -1,14 +1,13 @@ #ifndef BUTTON_EDIT_H #define BUTTON_EDIT_H -//used to build the dialog: -#include -#include -#include -#include +#include +#include //we need to edit a Button #include "button.h" + + //to get a new key for the button. #include "keycode.h" diff --git a/src/buttonw.cpp b/src/buttonw.cpp index 9731766..0211b8c 100644 --- a/src/buttonw.cpp +++ b/src/buttonw.cpp @@ -1,29 +1,30 @@ #include "buttonw.h" + ButtonWidget::ButtonWidget( Button* b, QWidget* parent ) - : FlashButton( "", parent) { - button = b; - update(); - on = false; + : FlashButton( "", parent) { + button = b; + update(); + on = false; } void ButtonWidget::jsevent( int val ) { - bool newOn = (val == 1); - if (on != newOn) { - on = newOn; - flash(); - } + bool newOn = (val == 1); + if (on != newOn) { + on = newOn; + flash(); + } } void ButtonWidget::update() { - setText( button->status()); + setText( button->status()); } void ButtonWidget::mouseReleaseEvent( QMouseEvent* e ) { - ButtonEdit* be = new ButtonEdit(button); - be->exec(); - delete be; - - update(); - FlashButton::mouseReleaseEvent( e ); + ButtonEdit* be = new ButtonEdit(button); + be->exec(); + delete be; + + update(); + FlashButton::mouseReleaseEvent( e ); } diff --git a/src/buttonw.h b/src/buttonw.h index c601a77..856df81 100644 --- a/src/buttonw.h +++ b/src/buttonw.h @@ -7,6 +7,11 @@ #include "button_edit.h" //this IS a FlashButton #include "flash.h" +#ifdef Bool +#undef Bool +#endif + +#include class ButtonWidget : public FlashButton { public: diff --git a/src/component.h b/src/component.h deleted file mode 100644 index 4b7c219..0000000 --- a/src/component.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef COMPONENT_H -#define COMPONENT_H - - -//for parsing data from a file -#include -#include -#include - -//parent of Component -#include - -#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 diff --git a/src/constant.h b/src/constant.h index 0d13b98..93ecc3a 100644 --- a/src/constant.h +++ b/src/constant.h @@ -24,4 +24,6 @@ #define NAME "QJoyPad 3.4" +#define MOUSE_OFFSET 400 + #endif diff --git a/src/device.h b/src/device.h index 902488b..b7158a6 100644 --- a/src/device.h +++ b/src/device.h @@ -1,17 +1,16 @@ #ifndef JOY_DEVICE_H #define JOY_DEVICE_H -#include #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 available; +extern QHash 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 joypads; +extern QHash joypads; #endif diff --git a/src/error.h b/src/error.h index e637f3c..df70408 100644 --- a/src/error.h +++ b/src/error.h @@ -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 diff --git a/src/event.cpp b/src/event.cpp index 633a928..6191807 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -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); } diff --git a/src/flash.cpp b/src/flash.cpp index 7bf57d7..58eccbe 100644 --- a/src/flash.cpp +++ b/src/flash.cpp @@ -1,97 +1,99 @@ #include "flash.h" +//Added by qt3to4: //Modified here (and in .h) to not have default arguments for 2 and 3. //This caused an error with a development version of g++ on a Mandrake system //in Sweden. FlashButton::FlashButton( QString text, QWidget* parent, QString name ) - :QPushButton( text, parent, name ) + :QPushButton( text, parent ) { - //record the base palette for posterity. - Normal = palette(); + this->setObjectName(name); + //record the base palette for posterity. + Normal = palette(); - //define the palette the button will have when it flashes. - QColorGroup cg = this->palette().inactive(); - cg.setColor(QColorGroup::Button, HIGHLIGHT); - cg.setColor(QColorGroup::Light, HIGHLIGHT.light(150)); - cg.setColor(QColorGroup::Midlight, HIGHLIGHT.light(125)); - cg.setColor(QColorGroup::Dark, HIGHLIGHT.dark(200)); - cg.setColor(QColorGroup::Mid, HIGHLIGHT.dark(150)); - Flash = QPalette(cg,cg,cg); - isflash=false; + //define the palette the button will have when it flashes. + QPalette cg = this->palette(); + cg.setCurrentColorGroup(QPalette::Inactive); + cg.setColor(QPalette::Button, HIGHLIGHT); + cg.setColor(QPalette::Light, HIGHLIGHT.light(150)); + cg.setColor(QPalette::Midlight, HIGHLIGHT.light(125)); + cg.setColor(QPalette::Dark, HIGHLIGHT.dark(200)); + cg.setColor(QPalette::Mid, HIGHLIGHT.dark(150)); + Flash = cg; + isflash=false; - setAutoDefault( false ); - setFocusPolicy(QWidget::NoFocus); + setAutoDefault( false ); + setFocusPolicy(Qt::NoFocus); + } void FlashButton::flash() { - emit( flashed( !isflash ) ); - if (isflash) - { - setPalette( Normal ); - isflash = false; - } - else - { - setPalette( Flash ); - isflash = true; - } + emit( flashed( !isflash ) ); + if (isflash) + { + setPalette( Normal ); + isflash = false; + } + else + { + setPalette( Flash ); + isflash = true; + } } - - - - - - - FlashRadioArray::FlashRadioArray( int count, QString names[], bool horizontal, QWidget* parent) - :QWidget( parent ) + :QWidget( parent ) { - if (horizontal) - LMain = new QHBoxLayout( this, 5, 5 ); - else - LMain = new QVBoxLayout( this, 5, 5 ); - LMain->setAutoAdd( true ); - - Buttons = new FlashButton*[count]; - for (int i = 0; i < count; i++) - { - Buttons[i] = new FlashButton( names[i], this, "" ); - //when any of the buttons is clicked, it calls the same function on this. - connect( Buttons[i], SIGNAL( clicked() ), this, SLOT( clicked() )); - } - - Count = count; - State = 0; - Buttons[0]->setDown( true ); + if (horizontal) { + LMain = new QHBoxLayout( this); + LMain->setMargin(5); + LMain->setSpacing(5); + } else { + LMain = new QVBoxLayout( this); + LMain->setMargin(5); + LMain->setSpacing(5); + } + + Buttons = new FlashButton*[count]; + for (int i = 0; i < count; i++) + { + Buttons[i] = new FlashButton( names[i], this, "" ); + //when any of the buttons is clicked, it calls the same function on this. + connect( Buttons[i], SIGNAL( clicked() ), this, SLOT( clicked() )); + LMain->addWidget(Buttons[i]); + } + + Count = count; + State = 0; + Buttons[0]->setDown( true ); } int FlashRadioArray::getState() { - return State; + return State; } void FlashRadioArray::flash( int index ) { - Buttons[index]->flash(); + Buttons[index]->flash(); } void FlashRadioArray::clicked() { - //go through each button. If it wasn't the button that was just clicked, - //then make sure that it is up. If it WAS the button that was clicked, - //remember that index as the new state. - for (int i = 0; i < Count; i++) - { - if ( Buttons[i] != sender() ) - Buttons[i]->setDown( false ); - else - { - State = i; - Buttons[i]->setDown( true ); - } - } - emit changed( State ); + //go through each button. If it wasn't the button that was just clicked, + //then make sure that it is up. If it WAS the button that was clicked, + //remember that index as the new state. + for (int i = 0; i < Count; i++) + { + if ( Buttons[i] != sender() ) + Buttons[i]->setDown( false ); + else + { + State = i; + Buttons[i]->setDown( true ); + } + } + emit changed( State ); } diff --git a/src/flash.h b/src/flash.h index da720ff..b37595d 100644 --- a/src/flash.h +++ b/src/flash.h @@ -15,8 +15,9 @@ -#include -#include +#include +#include +#include //A QPushButton that can flash a color diff --git a/src/icon.cpp b/src/icon.cpp index 4d01ad6..e95b4b4 100644 --- a/src/icon.cpp +++ b/src/icon.cpp @@ -1,30 +1,33 @@ #include "icon.h" -#include -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(); } diff --git a/src/icon.h b/src/icon.h index 96fdc45..fa5689d 100644 --- a/src/icon.h +++ b/src/icon.h @@ -1,27 +1,25 @@ #ifndef JOY_ICON_H #define JOY_ICON_H -//for creating a floating icon in notray mode :) -#include -//the pixmap to load -#include +#include +#include +#include +#include +#include #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 diff --git a/src/joypadw.cpp b/src/joypadw.cpp index 9f60e1c..c5d85c2 100644 --- a/src/joypadw.cpp +++ b/src/joypadw.cpp @@ -1,93 +1,102 @@ #include "joypadw.h" +//Added by qt3to4: JoyPadWidget::JoyPadWidget( JoyPad* jp, int i, QWidget* parent ) - : QWidget(parent) { - //initialize things, build the dialog - joypad = jp; - index = i; - LMain = new QGridLayout(this, (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2, 2, 5, 5); - LMain->setAutoAdd( true ); - flashcount = 0; - quickset = NULL; - - Axes = new AxisWidget*[joypad->axes]; - for (int i = 0; i < joypad->axes; i++) { - Axes[i] = new AxisWidget(joypad->Axes[i],this); - connect( Axes[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool ))); - } - if (joypad->axes % 2 == 1) { - new QWidget(this); - } - - Buttons = new ButtonWidget*[joypad->buttons]; - for (int i = 0; i < joypad->buttons; i++) { - Buttons[i] = new ButtonWidget(joypad->Buttons[i],this); - connect( Buttons[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool ))); - } - if (joypad->buttons % 2 == 1) { - new QWidget(this); - } - - new QWidget(this); - new QWidget(this); + : QWidget(parent) { + //initialize things, build the dialog + joypad = jp; + index = i; + /* This was in below, no idea what it does :( ... + * (joypad->axes+1)/2 +(joypad->buttons+1)/2 + 2 + */ + LMain = new QGridLayout(this); + LMain->setSpacing(5); + LMain->setMargin(5); + flashcount = 0; + int insertCounter = 0; + quickset = NULL; - BClear = new QPushButton("Clear", this); - connect(BClear, SIGNAL(clicked()), this, SLOT(clear())); - BAll = new QPushButton("Quick Set", this); - connect(BAll, SIGNAL(clicked()), this, SLOT(setAll())); + Axes = new AxisWidget*[joypad->axes]; + for (int i = 0; i < joypad->axes; i++) { + Axes[i] = new AxisWidget(joypad->Axes[i],this); + connect( Axes[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool ))); + LMain->addWidget(Axes[i], insertCounter / 2, insertCounter %2); + insertCounter++; + } + + Buttons = new ButtonWidget*[joypad->buttons]; + for (int i = 0; i < joypad->buttons; i++) { + Buttons[i] = new ButtonWidget(joypad->Buttons[i],this); + connect( Buttons[i], SIGNAL( flashed( bool ) ), this, SLOT( flash( bool ))); + LMain->addWidget(Buttons[i], insertCounter/2, insertCounter%2); + insertCounter++; + } + + + if(insertCounter % 2 == 1) { + insertCounter++; + } + insertCounter+=2; + BClear = new QPushButton("Clear", this); + connect(BClear, SIGNAL(clicked()), this, SLOT(clear())); + LMain->addWidget(BClear, insertCounter / 2, insertCounter %2); + insertCounter++; + BAll = new QPushButton("Quick Set", this); + LMain->addWidget(BAll, insertCounter /2, insertCounter%2); + connect(BAll, SIGNAL(clicked()), this, SLOT(setAll())); } JoyPadWidget::~JoyPadWidget() { - //so the joypad knows that we're done. - joypad->releaseWidget(); + //so the joypad knows that we're done. + joypad->releaseWidget(); } void JoyPadWidget::flash( bool on ) { - //true iff this entire widget was considered "flashed" before - bool wasOn = (flashcount != 0); - - //adjust the count based on this new flash - flashcount += (on?1:-1); - - //if we were on and should now be off, or visa versa, flash the whole widget - if (wasOn != (flashcount != 0)) - emit flashed(index); + //true iff this entire widget was considered "flashed" before + bool wasOn = (flashcount != 0); + + //adjust the count based on this new flash + flashcount += (on?1:-1); + + //if we were on and should now be off, or visa versa, flash the whole widget + if (wasOn != (flashcount != 0)) + emit flashed(index); } void JoyPadWidget::update() { - for (int i = 0; i < joypad->axes; i++) { - Axes[i]->update(); - } - for (int i = 0; i < joypad->buttons; i++) { - Buttons[i]->update(); - } + for (int i = 0; i < joypad->axes; i++) { + Axes[i]->update(); + } + for (int i = 0; i < joypad->buttons; i++) { + Buttons[i]->update(); + } } void JoyPadWidget::clear() { - joypad->toDefault(); - update(); + joypad->toDefault(); + update(); } void JoyPadWidget::setAll() { - //quickset is NULL if there is no quickset dialog, and a pointer to the - //dialog otherwise. This is so we can forward jsevents properly. - quickset = new QuickSet(joypad); - quickset->exec(); - update(); - delete quickset; - quickset = NULL; + //quickset is NULL if there is no quickset dialog, and a pointer to the + //dialog otherwise. This is so we can forward jsevents properly. + quickset = new QuickSet(joypad); + quickset->exec(); + update(); + delete quickset; + quickset = NULL; } void JoyPadWidget::jsevent( js_event msg ) { - //notify the component this event applies to. this cannot generate anything - //other than a flash :) - if (msg.type == JS_EVENT_AXIS) { - Axes[msg.number]->jsevent(msg.value); - } - else { - Buttons[msg.number]->jsevent(msg.value); - } - //if we're doing quickset, it needs to know when we do something. - if (quickset != NULL) - quickset->jsevent(msg); + //notify the component this event applies to. this cannot generate anything + //other than a flash :) + if (msg.type == JS_EVENT_AXIS) { + Axes[msg.number]->jsevent(msg.value); + } + else { + Buttons[msg.number]->jsevent(msg.value); + } + //if we're doing quickset, it needs to know when we do something. + if (quickset != NULL) + quickset->jsevent(msg); } diff --git a/src/joypadw.h b/src/joypadw.h index 14d1985..f82ba63 100644 --- a/src/joypadw.h +++ b/src/joypadw.h @@ -2,13 +2,13 @@ #define JOYPAD_WIDGET_H //parts for the widget -#include -#include +//Added by qt3to4: +#include +#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" diff --git a/src/joyslider.cpp b/src/joyslider.cpp index 7f57401..03d87c6 100644 --- a/src/joyslider.cpp +++ b/src/joyslider.cpp @@ -1,238 +1,239 @@ #include "joyslider.h" +//Added by qt3to4: JoySlider::JoySlider( int dz, int xz, int val, QWidget* parent ) - :QWidget( parent ) + :QWidget( parent ) { - //initialize :) - JoyVal = val; - DeadZone = dz; - XZone = xz; - setMinimumHeight(20); + //initialize :) + JoyVal = val; + DeadZone = dz; + XZone = xz; + setMinimumHeight(20); } void JoySlider::setValue( int newval ) { - //adjust the new position based on the throttle settings - if (throttle == 0) JoyVal = newval; - else if (throttle < 0) JoyVal = (newval + JOYMIN) / 2; - else JoyVal = (newval + JOYMAX) / 2; - //then redraw! - update(); + //adjust the new position based on the throttle settings + if (throttle == 0) JoyVal = newval; + else if (throttle < 0) JoyVal = (newval + JOYMIN) / 2; + else JoyVal = (newval + JOYMAX) / 2; + //then redraw! + update(); } void JoySlider::setThrottle( int newval ) { - //change throttle settings. This WILL quite likely cause minor issues with - //status if the axis is not currently at zero, but these will be corrected - //as soon as the axis moves again. - throttle = newval; - update(); + //change throttle settings. This WILL quite likely cause minor issues with + //status if the axis is not currently at zero, but these will be corrected + //as soon as the axis moves again. + throttle = newval; + update(); } int JoySlider::pointFor( int value, bool negative ) { - //complicated... this just finds the pixel the given value should be. - if (throttle == 0) { - int result = ((boxwidth - 4) * value) / JOYMAX; - if (negative) result = lboxstart + boxwidth - 2 - result; - else result += rboxstart + 2; - return result; - } - else { - int result = ((twidth - 4) * value) / JOYMAX; - if (negative) result = lboxstart + twidth - 2 - result; - else result += lboxstart + 2; - return result; - } + //complicated... this just finds the pixel the given value should be. + if (throttle == 0) { + int result = ((boxwidth - 4) * value) / JOYMAX; + if (negative) result = lboxstart + boxwidth - 2 - result; + else result += rboxstart + 2; + return result; + } + else { + int result = ((twidth - 4) * value) / JOYMAX; + if (negative) result = lboxstart + twidth - 2 - result; + else result += lboxstart + 2; + return result; + } } int JoySlider::valueFrom( int point ) { - //the inverse of above :) - if (throttle == 0) { - if (point <= lboxstart) return JOYMAX; - if (point >= lboxend - 2 && point <= rboxstart + 2) return 0; - if (point >= rboxend - 2) return JOYMAX; - if (point < lboxend - 2) return ((lboxend - point) * JOYMAX) / boxwidth; - if (point > rboxstart) return ((point - rboxstart) * JOYMAX) / boxwidth; - else return 0; - } - else if (throttle > 0) { - if (point <= lboxstart) return 0; - else if (point >= tend) return JOYMAX; - else return ((point - lboxstart) * JOYMAX) / twidth; - } - else { - if (point <= lboxstart - 2) return JOYMAX; - else if (point >= tend) return 0; - else return ((tend - point) * JOYMAX) / twidth; - } + //the inverse of above :) + if (throttle == 0) { + if (point <= lboxstart) return JOYMAX; + if (point >= lboxend - 2 && point <= rboxstart + 2) return 0; + if (point >= rboxend - 2) return JOYMAX; + if (point < lboxend - 2) return ((lboxend - point) * JOYMAX) / boxwidth; + if (point > rboxstart) return ((point - rboxstart) * JOYMAX) / boxwidth; + else return 0; + } + else if (throttle > 0) { + if (point <= lboxstart) return 0; + else if (point >= tend) return JOYMAX; + else return ((point - lboxstart) * JOYMAX) / twidth; + } + else { + if (point <= lboxstart - 2) return JOYMAX; + else if (point >= tend) return 0; + else return ((tend - point) * JOYMAX) / twidth; + } } void JoySlider::resizeEvent( QResizeEvent* ) { - //when we resize, we need to recalculate a bunch of measurements. - boxwidth = (this->width() - 6) / 2 - 1; - twidth = this->width() - 4; - boxheight = this->height() - 4; - lboxstart = 1; - lboxend = lboxstart + boxwidth - 1; - tend = lboxstart + twidth - 1; - rboxstart = lboxend + 5; - rboxend = rboxstart + boxwidth - 1; + //when we resize, we need to recalculate a bunch of measurements. + boxwidth = (this->width() - 6) / 2 - 1; + twidth = this->width() - 4; + boxheight = this->height() - 4; + lboxstart = 1; + lboxend = lboxstart + boxwidth - 1; + tend = lboxstart + twidth - 1; + rboxstart = lboxend + 5; + rboxend = rboxstart + boxwidth - 1; } void JoySlider::drawBox( int x, int width ) { - //draws a nice, pretty, 3d-styled box. that takes up the full height of the - //widget but is defined by x-coordinate and width - QPainter paint( this ); + //draws a nice, pretty, 3d-styled box. that takes up the full height of the + //widget but is defined by x-coordinate and width + QPainter paint( this ); - paint.setPen( (isEnabled())?white:colorGroup().background() ); - paint.setBrush( (isEnabled())?white:colorGroup().background() ); - paint.drawRect( x, 1, width, boxheight); + paint.setPen( (isEnabled())?Qt::white:palette().background().color() ); + paint.setBrush( (isEnabled())?Qt::white:palette().background() ); + paint.drawRect( x, 1, width, boxheight); - paint.setPen( colorGroup().dark() ); - paint.drawLine( x, 1 + boxheight, x, 1 ); - paint.drawLine( x, 1, x + width - 1, 1); - - paint.setPen( colorGroup().shadow() ); - paint.drawLine( x + 1, 1 + boxheight - 1, x + 1, 2); - paint.drawLine( x + 1, 2, x + width - 2, 2); - - paint.setPen( colorGroup().light() ); - paint.drawLine( x + 2, 1 + boxheight - 1, x + width - 1, 1 + boxheight - 1); - paint.drawLine( x + width - 1, 1 + boxheight - 1, x + width - 1, 2); - - paint.setPen( colorGroup().midlight() ); - paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight ); - paint.drawLine( x + width, 1 + boxheight, x + width, 1 ); + paint.setPen( palette().dark().color() ); + paint.drawLine( x, 1 + boxheight, x, 1 ); + paint.drawLine( x, 1, x + width - 1, 1); + + paint.setPen( palette().shadow().color() ); + paint.drawLine( x + 1, 1 + boxheight - 1, x + 1, 2); + paint.drawLine( x + 1, 2, x + width - 2, 2); + + paint.setPen( palette().light().color() ); + paint.drawLine( x + 2, 1 + boxheight - 1, x + width - 1, 1 + boxheight - 1); + paint.drawLine( x + width - 1, 1 + boxheight - 1, x + width - 1, 2); + + paint.setPen( palette().midlight().color() ); + paint.drawLine( x + 1, 1 + boxheight, x + width, 1 + boxheight ); + paint.drawLine( x + width, 1 + boxheight, x + width, 1 ); } void JoySlider::paintEvent( QPaintEvent* ) { - //when we need to redraw, - //start by making our boxes - if (throttle == 0) { - drawBox( lboxstart, boxwidth ); - drawBox( rboxstart, boxwidth ); - } - //or box, if we are in throttle mode. - else { - drawBox( lboxstart, twidth ); - } - - //if this is disabled, that's enough of that. - if (!isEnabled()) return; + //when we need to redraw, + //start by making our boxes + if (throttle == 0) { + drawBox( lboxstart, boxwidth ); + drawBox( rboxstart, boxwidth ); + } + //or box, if we are in throttle mode. + else { + drawBox( lboxstart, twidth ); + } - //now we need to draw. - QPainter paint( this ); - - //prepare to draw a bar of the appropriate color - QColor bar; - if (abs(JoyVal) < DeadZone) bar = gray; - else if (abs(JoyVal) < XZone) bar = blue; - else bar = red; - paint.setPen( bar ); - paint.setBrush( bar ); - - //find out the dimensions of the bar, then draw it - int width = (throttle == 0)?boxwidth:twidth; - int barlen = abs(((width - 4) * JoyVal) / JOYMAX); - if (JoyVal > 0) - paint.drawRect( ((throttle == 0)?rboxstart:lboxstart) + 2, 3, barlen, boxheight - 3 ); - else if (JoyVal < 0) - paint.drawRect( lboxstart + width - 2 - barlen, 3, barlen, boxheight - 3 ); - + //if this is disabled, that's enough of that. + if (!isEnabled()) return; - //and now draw the tabs! We only need one set if we're doing a throttle mode - //but we need two if we're not. However, it's important to draw the right - //set of tabs depending on the mode! Negative throttle gets negative tabs. - int point; - QPointArray shape; - - paint.setPen( black ); - paint.setBrush( blue ); - if (throttle >= 0) { - point = pointFor(DeadZone, false); - shape.putPoints(0,5, - point, boxheight - 4, - point + 3, boxheight - 1, - point + 3, boxheight + 2, - point - 3, boxheight + 2, - point - 3, boxheight - 1); - paint.drawPolygon(shape); - } - - if (throttle <= 0) { - point = pointFor(DeadZone, true); - shape.putPoints(0,5, - point, boxheight - 4, - point + 3, boxheight - 1, - point + 3, boxheight + 2, - point - 3, boxheight + 2, - point - 3, boxheight - 1); - paint.drawPolygon(shape); - } + //now we need to draw. + QPainter paint( this ); + + //prepare to draw a bar of the appropriate color + QColor bar; + if (abs(JoyVal) < DeadZone) bar = Qt::gray; + else if (abs(JoyVal) < XZone) bar = Qt::blue; + else bar = Qt::red; + paint.setPen( bar ); + paint.setBrush( bar ); + + //find out the dimensions of the bar, then draw it + int width = (throttle == 0)?boxwidth:twidth; + int barlen = abs(((width - 4) * JoyVal) / JOYMAX); + if (JoyVal > 0) + paint.drawRect( ((throttle == 0)?rboxstart:lboxstart) + 2, 3, barlen, boxheight - 3 ); + else if (JoyVal < 0) + paint.drawRect( lboxstart + width - 2 - barlen, 3, barlen, boxheight - 3 ); + + + //and now draw the tabs! We only need one set if we're doing a throttle mode + //but we need two if we're not. However, it's important to draw the right + //set of tabs depending on the mode! Negative throttle gets negative tabs. + int point; + QPolygon shape; + + paint.setPen( Qt::black ); + paint.setBrush( Qt::blue ); + if (throttle >= 0) { + point = pointFor(DeadZone, false); + shape.putPoints(0,5, + point, boxheight - 4, + point + 3, boxheight - 1, + point + 3, boxheight + 2, + point - 3, boxheight + 2, + point - 3, boxheight - 1); + paint.drawPolygon(shape); + } + + if (throttle <= 0) { + point = pointFor(DeadZone, true); + shape.putPoints(0,5, + point, boxheight - 4, + point + 3, boxheight - 1, + point + 3, boxheight + 2, + point - 3, boxheight + 2, + point - 3, boxheight - 1); + paint.drawPolygon(shape); + } - paint.setBrush( red ); - if (throttle >= 0) { - point = pointFor(XZone, false); - shape.putPoints(0,5, - point, boxheight - 4, - point + 3, boxheight - 1, - point + 3, boxheight + 2, - point - 3, boxheight + 2, - point - 3, boxheight - 1); - paint.drawPolygon(shape); - } - - if (throttle <= 0) { - point = pointFor(XZone, true); - shape.putPoints(0,5, - point, boxheight - 4, - point + 3, boxheight - 1, - point + 3, boxheight + 2, - point - 3, boxheight + 2, - point - 3, boxheight - 1); - paint.drawPolygon(shape); - } + paint.setBrush( Qt::red ); + if (throttle >= 0) { + point = pointFor(XZone, false); + shape.putPoints(0,5, + point, boxheight - 4, + point + 3, boxheight - 1, + point + 3, boxheight + 2, + point - 3, boxheight + 2, + point - 3, boxheight - 1); + paint.drawPolygon(shape); + } + + if (throttle <= 0) { + point = pointFor(XZone, true); + shape.putPoints(0,5, + point, boxheight - 4, + point + 3, boxheight - 1, + point + 3, boxheight + 2, + point - 3, boxheight + 2, + point - 3, boxheight - 1); + paint.drawPolygon(shape); + } } void JoySlider::mousePressEvent( QMouseEvent* e ) { - //store the x coordinate. - int xpt = e->x(); - int result = 0; - //see if this happened near one of the tabs. If so, start dragging that tab. - if (throttle <= 0 && abs( xpt - pointFor( XZone, true )) < 5) result = DRAG_XZ; - else if (throttle <= 0 && abs( xpt - pointFor( DeadZone, true )) < 5) result = DRAG_DZ; - else if (throttle >= 0 && abs( xpt - pointFor( XZone, false )) < 5) result = DRAG_XZ; - else if (throttle >= 0 && abs( xpt - pointFor( DeadZone, false )) < 5) result = DRAG_DZ; - dragging = result; + //store the x coordinate. + int xpt = e->x(); + int result = 0; + //see if this happened near one of the tabs. If so, start dragging that tab. + if (throttle <= 0 && abs( xpt - pointFor( XZone, true )) < 5) result = DRAG_XZ; + else if (throttle <= 0 && abs( xpt - pointFor( DeadZone, true )) < 5) result = DRAG_DZ; + else if (throttle >= 0 && abs( xpt - pointFor( XZone, false )) < 5) result = DRAG_XZ; + else if (throttle >= 0 && abs( xpt - pointFor( DeadZone, false )) < 5) result = DRAG_DZ; + dragging = result; }; void JoySlider::mouseReleaseEvent( QMouseEvent* ) { - //when the mouse releases, all dragging stops. - dragging = 0; + //when the mouse releases, all dragging stops. + dragging = 0; } void JoySlider::mouseMoveEvent( QMouseEvent* e ) { - //get the x coordinate - int xpt = e->x(); - //if we're dragging, move the appropriate tab! - if (dragging == DRAG_XZ) - { - XZone = valueFrom( xpt ); - } - else if (dragging == DRAG_DZ) - { - DeadZone = valueFrom( xpt ); - } - else return; - //if we moved a tab, redraw! - update(); + //get the x coordinate + int xpt = e->x(); + //if we're dragging, move the appropriate tab! + if (dragging == DRAG_XZ) + { + XZone = valueFrom( xpt ); + } + else if (dragging == DRAG_DZ) + { + DeadZone = valueFrom( xpt ); + } + else return; + //if we moved a tab, redraw! + update(); } diff --git a/src/joyslider.h b/src/joyslider.h index 47ee8f4..b48081d 100644 --- a/src/joyslider.h +++ b/src/joyslider.h @@ -2,12 +2,17 @@ #define Q_JOYSLIDER_H //the parent of this -#include -//for drawing the widget :) -#include -//for abs() -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "constant.h" //dragging constants. diff --git a/src/keycode.cpp b/src/keycode.cpp index 8c60d30..0607c90 100644 --- a/src/keycode.cpp +++ b/src/keycode.cpp @@ -1,13 +1,13 @@ #include "keycode.h" - +#include "getkey.h" const QString ktos( int keycode ) { - if (keycode > MAXKEY || keycode < 0) keycode = 0; + if (keycode > MAXKEY || keycode < 0) keycode = 0; - if (keycode == 0) return "[NO KEY]"; - - QString xname = XKeysymToString(XKeycodeToKeysym(display, keycode,0)); + if (keycode == 0) return "[NO KEY]"; + + QString xname = XKeysymToString(XKeycodeToKeysym(display, keycode,0)); //this section of code converts standard X11 keynames into much nicer names //which are prettier, fit the dialogs better, and are more readily understandable. @@ -15,155 +15,90 @@ const QString ktos( int keycode ) //is a config option to define PLAIN_KEYS and drop this whole section of code, //instead using the default names for keys. #ifndef PLAIN_KEYS - //the following code assumes xname is system independent and always - //in the same exact format. - - QRegExp rx; - rx.setPattern("^\\w$"); - //"a-z" -> "A-Z" - if (rx.exactMatch(xname)) return xname.upper(); - - rx.setPattern("(.*)_(.*)"); - if (rx.exactMatch(xname)) { - QString first = rx.cap(1); - QString second = rx.cap(2); - - rx.setPattern("^[RL]$"); - //"Control_R" -> "R Control" - if (rx.exactMatch(second)) return second + " " + first; - - rx.setPattern("^(Lock|Enter)$"); - //"Caps_Lock" -> "Caps Lock" - //"KP_Enter" -> "KP Enter" - if (rx.exactMatch(second)) return first + " " + second; - - //the following assumes all number pads are laid out alike. - if (xname == "KP_Home") return "KP 7"; - if (xname == "KP_Up") return "KP 8"; - if (xname == "KP_Prior") return "KP 9"; - if (xname == "KP_Subtract") return "KP -"; - if (xname == "KP_Left") return "KP 4"; - if (xname == "KP_Begin") return "KP 5"; - if (xname == "KP_Right") return "KP 6"; - if (xname == "KP_Add") return "KP +"; - if (xname == "KP_End") return "KP 1"; - if (xname == "KP_Down") return "KP 2"; - if (xname == "KP_Next") return "KP 3"; - if (xname == "KP_Insert") return "KP 0"; - if (xname == "KP_Delete") return "KP ."; - if (xname == "KP_Multiply") return "KP *"; - if (xname == "KP_Divide") return "KP /"; - - return xname; - } - - if (xname == "minus") return "-"; - if (xname == "equal") return "="; - if (xname == "bracketleft") return "["; - if (xname == "bracketright") return "]"; - if (xname == "semicolon") return ";"; - if (xname == "apostrophe") return "'"; - if (xname == "grave") return "`"; - if (xname == "backslash") return "\\"; - if (xname == "comma") return ","; - if (xname == "period") return "."; - if (xname == "slash") return "/"; - if (xname == "space") return "Space"; - if (xname == "Prior") return "PageUp"; - if (xname == "Next") return "PageDown"; + //the following code assumes xname is system independent and always + //in the same exact format. + + QRegExp rx; + rx.setPattern("^\\w$"); + //"a-z" -> "A-Z" + if (rx.exactMatch(xname)) return xname.toUpper(); + + rx.setPattern("(.*)_(.*)"); + if (rx.exactMatch(xname)) { + QString first = rx.cap(1); + QString second = rx.cap(2); + + rx.setPattern("^[RL]$"); + //"Control_R" -> "R Control" + if (rx.exactMatch(second)) return second + " " + first; + + rx.setPattern("^(Lock|Enter)$"); + //"Caps_Lock" -> "Caps Lock" + //"KP_Enter" -> "KP Enter" + if (rx.exactMatch(second)) return first + " " + second; + + //the following assumes all number pads are laid out alike. + if (xname == "KP_Home") return "KP 7"; + if (xname == "KP_Up") return "KP 8"; + if (xname == "KP_Prior") return "KP 9"; + if (xname == "KP_Subtract") return "KP -"; + if (xname == "KP_Left") return "KP 4"; + if (xname == "KP_Begin") return "KP 5"; + if (xname == "KP_Right") return "KP 6"; + if (xname == "KP_Add") return "KP +"; + if (xname == "KP_End") return "KP 1"; + if (xname == "KP_Down") return "KP 2"; + if (xname == "KP_Next") return "KP 3"; + if (xname == "KP_Insert") return "KP 0"; + if (xname == "KP_Delete") return "KP ."; + if (xname == "KP_Multiply") return "KP *"; + if (xname == "KP_Divide") return "KP /"; + + return xname; + } + + if (xname == "minus") return "-"; + if (xname == "equal") return "="; + if (xname == "bracketleft") return "["; + if (xname == "bracketright") return "]"; + if (xname == "semicolon") return ";"; + if (xname == "apostrophe") return "'"; + if (xname == "grave") return "`"; + if (xname == "backslash") return "\\"; + if (xname == "comma") return ","; + if (xname == "period") return "."; + if (xname == "slash") return "/"; + if (xname == "space") return "Space"; + if (xname == "Prior") return "PageUp"; + if (xname == "Next") return "PageDown"; #endif - - //if none of that succeeded, - return xname; + + //if none of that succeeded, + return xname; } - - -GetKey::GetKey( QString button, bool m ) - :QDialog( ) -{ - //prepare the dialog - mouse = m; - setCaption( "Choose a key" ); - setIcon(QPixmap(ICON24)); - - //I'd use a QLabel, but that steals x11Events! - //So, I'll draw the text directly. That means - //I need to resolve the size of the dialog by hand: - Text = "Choose a new key "; - if (mouse) Text += "or mouse button "; - Text += "for " + button; - QRect rect = fontMetrics().boundingRect( Text ); - //I calculate the size based on the first line of text, which is longer. - //The fontMetrics function is dumb and would treat the string with a - //newline in it as a continues flow of characters if I did the whole string - //at once. - Text += "\n(Ctrl-X for no key)"; - //now I add 20 pixels of padding and double the height to make room for - //two lines. - setFixedSize( QSize( rect.width() + 20, rect.height()*2 + 20 ) ); -} - -bool GetKey::x11Event( XEvent* e ) -{ - //keep Qt from closing the dialog upon seeing Esc pressed. - if (e->type == KeyPress) return true; - - //On a key press, return the key and quit - //Ctrl+X == [No Key] - if (e->type == KeyRelease) { - if (XKeycodeToKeysym(display,e->xkey.keycode,0) == XK_x ) { - if (e->xkey.state & ControlMask) done( 0 ); - else done( e->xkey.keycode ); - } - else done( e->xkey.keycode ); - return true; - } - //if we're accepting mouse clicks and a mouse button was clicked... - if (mouse && e->type == ButtonRelease) { - done ( e->xbutton.button + MOUSE_OFFSET); - return true; - } - - //any other events we will pass on to the dialog. This allows for closing - //the window and easy redrawing :) - return false; -} - -void GetKey::paintEvent ( QPaintEvent * ) { - //whenever we need to repaint, draw in our text. - QPainter paint( this ); - paint.drawText( rect(), AlignCenter, Text ); -} - - - - - - - KeyButton::KeyButton( QString name, int val, QWidget* parent, bool m, bool nowMouse) - :QPushButton(nowMouse?"Mouse " + QString::number(val):QString(ktos(val)), parent) { - mouse = m; - mouseClicked = nowMouse; - buttonname = name; - value = val; - connect( this, SIGNAL( clicked() ), SLOT( onClick() )); + :QPushButton(nowMouse?"Mouse " + QString::number(val):QString(ktos(val)), parent) { + mouse = m; + mouseClicked = nowMouse; + buttonname = name; + value = val; + connect( this, SIGNAL( clicked() ), SLOT( onClick() )); } void KeyButton::onClick() { - //when clicked, ask for a key! - value = GetKey( buttonname, mouse ).exec(); - //if the return value was a mouse click... - if (value > MOUSE_OFFSET) { - mouseClicked = true; - value -= MOUSE_OFFSET; - setText( "Mouse " + QString::number(value)); - } - //otherwise, it was a key press! - else { - mouseClicked = false; - setText( ktos(value)); - } + //when clicked, ask for a key! + value = GetKey( buttonname, mouse ).exec(); + //if the return value was a mouse click... + if (value > MOUSE_OFFSET) { + mouseClicked = true; + value -= MOUSE_OFFSET; + setText( "Mouse " + QString::number(value)); + } + //otherwise, it was a key press! + else { + mouseClicked = false; + setText( ktos(value)); + } } diff --git a/src/keycode.h b/src/keycode.h index 5b17172..3bb0216 100644 --- a/src/keycode.h +++ b/src/keycode.h @@ -2,21 +2,11 @@ #define KEYCODE_H //To create the "press a key" dialog: -#include -#include +#include +#include +#include +#include -//For the KeyButton widget -#include - -//For converting X Windows key names to something nicer. -#include - -//Defines constants needed for x11Event -#include -//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 { diff --git a/src/layout.h b/src/layout.h index 3ef3d68..47528be 100644 --- a/src/layout.h +++ b/src/layout.h @@ -1,22 +1,6 @@ #ifndef JOY_LAYOUT_H #define JOY_LAYOUT_H -//for file i/o -#include -#include -#include -#include - -//to get a name for a new layout -#include - -//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 -#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 +#include +#include +#include +#include +#include +#include +#include + //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; diff --git a/src/loop.cpp b/src/loop.cpp deleted file mode 100644 index 213406f..0000000 --- a/src/loop.cpp +++ /dev/null @@ -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 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); - } -} diff --git a/src/loop.h b/src/loop.h deleted file mode 100644 index df8801e..0000000 --- a/src/loop.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef JOY_LOOP_H -#define JOY_LOOP_H - -//this is an event loop -#include - -//for reading events from the joysticks -#include -#include - -//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 timerList; -}; - -#endif diff --git a/src/portinglog.txt b/src/portinglog.txt deleted file mode 100644 index 18f5666..0000000 --- a/src/portinglog.txt +++ /dev/null @@ -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 -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 #include #include #include #include -In file /home/john/qjoypad-3.4.1/src/axisw.cpp: Added the following include directives: - #include -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 -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 #include #include -In file /home/john/qjoypad-3.4.1/src/buttonw.cpp: Added the following include directives: - #include -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 #include -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 #include #include -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 -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 -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 #include #include #include -In file /home/john/qjoypad-3.4.1/src/keycode.cpp: Added the following include directives: - #include #include -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 #include #include -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 #include #include #include #include -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 #include -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 #include -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 #include - -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 -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 -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 -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 -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 -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 #include #include -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 -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 -In file /home/john/qjoypad-3.4.1/src/joyslider.h: Added the following include directives: - #include #include #include -In file /home/john/qjoypad-3.4.1/src/keycode.h: Added the following include directives: - #include -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 -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 #include -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 - diff --git a/src/qjoypad.pro b/src/qjoypad.pro index 9e2cfac..218b5d3 100644 --- a/src/qjoypad.pro +++ b/src/qjoypad.pro @@ -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 diff --git a/src/quickset.h b/src/quickset.h index a12f875..10f6e89 100644 --- a/src/quickset.h +++ b/src/quickset.h @@ -2,12 +2,14 @@ #define QUICKSET_H //for building the dialog -#include -#include -#include +#include +#include +#include + +#include //to request new keycodes -#include "keycode.h" +//#include "keycode.h" //to actually set the joypad #include "joypad.h" diff --git a/src/timer.h b/src/timer.h deleted file mode 100644 index d2e20c5..0000000 --- a/src/timer.h +++ /dev/null @@ -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 diff --git a/src/trayicon/trayicon.cpp b/src/trayicon/trayicon.cpp index 9add020..a4ac3b6 100644 --- a/src/trayicon/trayicon.cpp +++ b/src/trayicon/trayicon.cpp @@ -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(); } diff --git a/src/trayicon/trayicon.h b/src/trayicon/trayicon.h index 4c6a662..1836084 100755 --- a/src/trayicon/trayicon.h +++ b/src/trayicon/trayicon.h @@ -23,8 +23,12 @@ #include #include +#include +#include +#include +#include + -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; diff --git a/src/trayicon/trayicon_x11.cpp b/src/trayicon/trayicon_x11.cpp index 20b63fc..12c9b0d 100644 --- a/src/trayicon/trayicon_x11.cpp +++ b/src/trayicon/trayicon_x11.cpp @@ -21,18 +21,15 @@ #include "trayicon.h" -#include -#include -#include -#include -#include - +#include +#include +#include #include #include #include //#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); + } }