-rw-r--r-- | library/qpeapplication.cpp | 121 | ||||
-rw-r--r-- | library/qpeapplication.h | 1 | ||||
-rw-r--r-- | library/qpemenubar.cpp | 4 |
3 files changed, 54 insertions, 72 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index b26933b..e7e210a 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -71,64 +71,63 @@ #endif #include "config.h" #include "network.h" #ifdef QWS #include "fontmanager.h" #endif #include "alarmserver.h" #include "applnk.h" #include "qpemenubar.h" #include "textcodecinterface.h" #include "imagecodecinterface.h" #include <unistd.h> #include <sys/file.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include "qt_override_p.h" class QPEApplicationData { public: - QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), kbgrabber( 0 ), - rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), - forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ), qpe_main_widget( 0 ) + QPEApplicationData ( ) + : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), + notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ), + keep_running( true ), qpe_main_widget( 0 ) { qcopq.setAutoDelete( TRUE ); } int presstimer; QWidget* presswidget; - int kbgrabber; - QString kbgrabber_appname; QPoint presspos; bool rightpressed : 1; - bool kbregrab : 1; + bool kbgrabbed : 1; bool notbusysent : 1; bool preloaded : 1; bool forceshow : 1; bool nomaximize : 1; bool keep_running : 1; QString appName; struct QCopRec { QCopRec( const QCString &ch, const QCString &msg, const QByteArray &d ) : channel( ch ), message( msg ), data( d ) { } QCString channel; QCString message; QByteArray data; }; QWidget* qpe_main_widget; QList<QCopRec> qcopq; void enqueueQCop( const QCString &ch, const QCString &msg, const QByteArray &data ) { @@ -734,50 +733,48 @@ public: \internal */ #ifdef QWS bool QPEApplication::qwsEventFilter( QWSEvent * e ) { if ( !d->notbusysent && e->type == QWSEvent::Focus ) { if ( qApp->type() != QApplication::GuiServer ) { QCopEnvelope e( "QPE/System", "notBusy(QString)" ); e << d->appName; } d->notbusysent = TRUE; } if ( type() == GuiServer ) { switch ( e->type ) { case QWSEvent::Mouse: if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) emit clientMoused(); break; default: break; } } if ( e->type == QWSEvent::Key ) { - if ( d->kbgrabber == 1 ) - return TRUE; QWSKeyEvent *ke = ( QWSKeyEvent * ) e; if ( ke->simpleData.keycode == Qt::Key_F33 ) { // Use special "OK" key to press "OK" on top level widgets QWidget * active = activeWindow(); QWidget *popup = 0; if ( active && active->isPopup() ) { popup = active; active = active->parentWidget(); } if ( active && ( int ) active->winId() == ke->simpleData.window && !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { if ( ke->simpleData.is_press ) { if ( popup ) popup->close(); if ( active->inherits( "QDialog" ) ) { HackDialog * d = ( HackDialog * ) active; d->acceptIt(); return TRUE; } else if ( ( ( HackWidget * ) active ) ->needsOk() ) { QSignal s; s.connect( active, SLOT( accept() ) ); s.activate(); } @@ -788,81 +785,96 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) } } } else if ( ke->simpleData.keycode == Qt::Key_F30 ) { // Use special "select" key to do whatever default action a widget has mapToDefaultAction( ke, Qt::Key_Space ); } else if ( ke->simpleData.keycode == Qt::Key_Escape && ke->simpleData.is_press ) { // Escape key closes app if focus on toplevel QWidget * active = activeWindow(); if ( active && active->testWFlags( WType_TopLevel ) && ( int ) active->winId() == ke->simpleData.window && !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { if ( active->inherits( "QDialog" ) ) { HackDialog * d = ( HackDialog * ) active; d->rejectIt(); return TRUE; } else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { active->close(); } } } - -#if QT_VERSION < 231 - // Filter out the F4/Launcher key from apps - // ### The launcher key may not always be F4 on all devices - if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) - return TRUE; -#endif - + else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) { + // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... )) + // but we cannot access libopie function within libqpe :( + + QWidget * active = activeWindow ( ); + if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) { + if ( d-> kbgrabbed ) { // we grabbed the keyboard + QChar ch ( ke-> simpleData.unicode ); + QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease, + ke-> simpleData.keycode, + ch. latin1 ( ), + ke-> simpleData.modifiers, + QString ( ch ), + ke-> simpleData.is_auto_repeat, 1 ); + + QObject *which = QWidget::keyboardGrabber ( ); + if ( !which ) + which = QApplication::focusWidget ( ); + if ( !which ) + which = QApplication::activeWindow ( ); + if ( !which ) + which = qApp; + + QApplication::sendEvent ( which, &qke ); + } + else { // we didn't grab the keyboard, so send the event to the launcher + QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" ); + e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat ); + } + } + return true; + } } if ( e->type == QWSEvent::Focus ) { QWSFocusEvent * fe = ( QWSFocusEvent* ) e; - QWidget* nfw = QWidget::find( e->window() ); if ( !fe->simpleData.get_focus ) { QWidget * active = activeWindow(); while ( active && active->isPopup() ) { active->close(); active = activeWindow(); } - if ( !nfw && d->kbgrabber == 2 ) { - ungrabKeyboard(); - d->kbregrab = TRUE; // want kb back when we're active - } } else { // make sure our modal widget is ALWAYS on top QWidget *topm = activeModalWidget(); if ( topm ) { topm->raise(); } - if ( d->kbregrab ) { - grabKeyboard(); - d->kbregrab = FALSE; - } } if ( fe->simpleData.get_focus && inputMethodDict ) { InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); if ( m == AlwaysOff ) Global::hideInputMethod(); if ( m == AlwaysOn ) Global::showInputMethod(); } } return QApplication::qwsEventFilter( e ); } #endif /*! Destroys the QPEApplication. */ QPEApplication::~QPEApplication() { ungrabKeyboard(); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) // Need to delete QCopChannels early, since the display will // be gone by the time we get to ~QObject(). delete sysChannel; delete pidChannel; @@ -1012,83 +1024,85 @@ void QPEApplication::applyStyle() // Font QString ff = config.readEntry( "FontFamily", font().family() ); int fs = config.readNumEntry( "FontSize", font().pointSize() ); // don't set a custom font if ( nostyle & Opie::Force_Font ) { ff = "Helvetica"; fs = 10; } setFont ( QFont ( ff, fs ), true ); // revert to global blocking policy ... Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; Opie::force_appearance &= ~nostyle; } void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) { #ifdef Q_WS_QWS QDataStream stream( data, IO_ReadOnly ); if ( msg == "applyStyle()" ) { applyStyle(); } + else if ( msg == "toggleApplicationMenu()" ) { + QWidget *active = activeWindow ( ); + + if ( active ) { + QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( ); + bool oldactive = man-> isActive ( ); + + man-> setActive( !man-> isActive() ); + + if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu + QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" ); + } + } + } else if ( msg == "setDefaultRotation(int)" ) { if ( type() == GuiServer ) { int r; stream >> r; setDefaultRotation( r ); } } else if ( msg == "shutdown()" ) { if ( type() == GuiServer ) shutdown(); } else if ( msg == "quit()" ) { if ( type() != GuiServer ) tryQuit(); } else if ( msg == "forceQuit()" ) { if ( type() != GuiServer ) quit(); } else if ( msg == "restart()" ) { if ( type() == GuiServer ) restart(); } - else if ( msg == "grabKeyboard(QString)" ) { - QString who; - stream >> who; - if ( who.isEmpty() ) - d->kbgrabber = 0; - else if ( who != d->appName ) - d->kbgrabber = 1; - else - d->kbgrabber = 2; - - d-> kbgrabber_appname = who; - } else if ( msg == "language(QString)" ) { if ( type() == GuiServer ) { QString l; stream >> l; QString cl = getenv( "LANG" ); if ( cl != l ) { if ( l.isNull() ) unsetenv( "LANG" ); else setenv( "LANG", l.latin1(), 1 ); restart(); } } } else if ( msg == "timeChange(QString)" ) { QString t; stream >> t; if ( t.isNull() ) unsetenv( "TZ" ); else setenv( "TZ", t.latin1(), 1 ); // emit the signal so everyone else knows... emit timeChanged(); } @@ -1603,100 +1617,73 @@ void QPEApplication::timerEvent( QTimerEvent *e ) if ( e->timerId() == d->presstimer && d->presswidget ) { // Right pressed postEvent( d->presswidget, new QMouseEvent( QEvent::MouseButtonPress, d->presspos, RightButton, LeftButton ) ); killTimer( d->presstimer ); d->presstimer = 0; d->rightpressed = TRUE; } } void QPEApplication::removeSenderFromStylusDict() { stylusDict->remove ( ( void* ) sender() ); if ( d->presswidget == sender() ) d->presswidget = 0; } /*! \internal */ bool QPEApplication::keyboardGrabbed() const { - return d->kbgrabber; -} - -/*! - \internal -*/ -QString QPEApplication::keyboardGrabbedBy() const -{ - return d->kbgrabber_appname; + return d->kbgrabbed; } /*! Reverses the effect of grabKeyboard(). This is called automatically on program exit. */ void QPEApplication::ungrabKeyboard() { - QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; - if ( d->kbgrabber == 2 ) { -#ifndef QT_NO_COP - QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); - e << QString::null; -#endif - - d->kbregrab = FALSE; - d->kbgrabber = 0; - } + ((QPEApplication *) qApp )-> d-> kbgrabbed = false; } /*! Grabs the physical keyboard keys, e.g. the application's launching keys. Instead of launching applications when these keys are pressed the signals emitted are sent to this application instead. Some games programs take over the launch keys in this way to make interaction easier. \sa ungrabKeyboard() */ void QPEApplication::grabKeyboard() { - QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; - if ( qApp->type() == QApplication::GuiServer ) - d->kbgrabber = 0; - else { -#ifndef QT_NO_COP - QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" ); - e << d->appName; -#endif - - d->kbgrabber = 2; // me - } + ((QPEApplication *) qApp )-> d-> kbgrabbed = true; } /*! \reimp */ int QPEApplication::exec() { #ifndef QT_NO_COP d->sendQCopQ(); #endif if ( d->keep_running ) //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) return QApplication::exec(); #ifndef QT_NO_COP { QCopEnvelope e( "QPE/System", "closing(QString)" ); e << d->appName; } #endif processEvents(); return 0; diff --git a/library/qpeapplication.h b/library/qpeapplication.h index f712077..7d956a3 100644 --- a/library/qpeapplication.h +++ b/library/qpeapplication.h @@ -62,49 +62,48 @@ public: Normal, AlwaysOff, AlwaysOn }; enum screenSaverHint { Disable = 0, DisableLightOff = 1, DisableSuspend = 2, Enable = 100 }; static void setInputMethodHint( QWidget *, InputMethodHint ); static InputMethodHint inputMethodHint( QWidget * ); void showMainWidget( QWidget*, bool nomax=FALSE ); void showMainDocumentWidget( QWidget*, bool nomax=FALSE ); static void showDialog( QDialog*, bool nomax=FALSE ); static int execDialog( QDialog*, bool nomax=FALSE ); static void setKeepRunning(); bool keepRunning() const; bool keyboardGrabbed() const; - QString keyboardGrabbedBy ( ) const; int exec(); signals: void clientMoused(); void timeChanged(); void clockChanged( bool pm ); void micChanged( bool muted ); void volumeChanged( bool muted ); void appMessage( const QCString& msg, const QByteArray& data); void weekChanged( bool startOnMonday ); void dateFormatChanged( DateFormat ); void flush(); void reload(); private slots: void systemMessage( const QCString &msg, const QByteArray &data ); void pidMessage( const QCString &msg, const QByteArray &data ); void removeSenderFromStylusDict(); void hideOrQuit(); protected: bool qwsEventFilter( QWSEvent * ); void internalSetStyle( const QString &style ); diff --git a/library/qpemenubar.cpp b/library/qpemenubar.cpp index 4aa0bf3..3e5bad5 100644 --- a/library/qpemenubar.cpp +++ b/library/qpemenubar.cpp @@ -204,52 +204,48 @@ bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ) QMenuBarHack *mb = (QMenuBarHack *)object; if ( dx && mb->activeItem() >= 0 ) { int i = mb->activeItem(); int c = mb->count(); int n = c; while ( n-- ) { i = i + dx; if ( i == c ) { mb->goodbye(); moveFocus( TRUE ); return TRUE; } else if ( i < 0 ) { mb->goodbye(); moveFocus( FALSE ); return TRUE; } QMenuItem *mi = mb->findItem( mb->idAt(i) ); if ( mi->isEnabled() && !mi->isSeparator() ) { break; } } } } } - if ( ke->key() == Key_F11 ) { - setActive( !isActive() ); - return TRUE; - } } else if ( event->type() == QEvent::KeyRelease ) { QKeyEvent *ke = (QKeyEvent *)event; if ( isActive() ) { if ( object->inherits( "QButton" ) ) { // Deactivate when a button is selected if ( ke->key() == Key_Space ) QTimer::singleShot( 0, this, SLOT(deactivate()) ); } } } else if ( event->type() == QEvent::FocusIn ) { if ( isActive() ) { // A non-menu/tool widget has been selected - we're deactivated QWidget *w = (QWidget *)object; if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { inFocus = 0; } } } else if ( event->type() == QEvent::Hide ) { if ( isActive() ) { // Deaticvate if a menu/tool has been hidden QWidget *w = (QWidget *)object; if ( !w->isPopup() && !list.contains( GuardedWidget( w ) ) ) { setActive( FALSE ); } |