author | sandman <sandman> | 2002-12-22 23:59:13 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-12-22 23:59:13 (UTC) |
commit | c513f413c7d901cc9945714c8e7eb47292f63306 (patch) (side-by-side diff) | |
tree | 9ce6af28225f006dffbeb536eb2fd520e903e08d | |
parent | 5c7694a7baadec8afe128ad2541e0a8acfc23737 (diff) | |
download | opie-c513f413c7d901cc9945714c8e7eb47292f63306.zip opie-c513f413c7d901cc9945714c8e7eb47292f63306.tar.gz opie-c513f413c7d901cc9945714c8e7eb47292f63306.tar.bz2 |
Totally reworked the key grabbing, which always had problems:
- applications get *all* key events now, as long as they have the focus
- an application decides if it has the keyboard grabbed or not
- if it's grabbed, the app consumes the key press
- if it's not grabbed and a F1-F29 key is pressed, the app sends a QCop
call to the launcher (deviceButtonPressed(...))
- when the launcher receives a QCop deviceButtonPressed it simply sends
the configured QCopEnvelope
- all "special" actions (like menu, home) are now accessible via QCop
calls (see buttonsettings)
-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 @@ -89,28 +89,27 @@ #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; @@ -752,14 +751,12 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) 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() ) { @@ -806,45 +803,60 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e ) } 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 ) @@ -1030,12 +1042,26 @@ 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 ); } @@ -1053,24 +1079,12 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data 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 ) { @@ -1621,40 +1635,23 @@ void QPEApplication::removeSenderFromStylusDict() /*! \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 @@ -1662,23 +1659,13 @@ void QPEApplication::ungrabKeyboard() 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() diff --git a/library/qpeapplication.h b/library/qpeapplication.h index f712077..7d956a3 100644 --- a/library/qpeapplication.h +++ b/library/qpeapplication.h @@ -80,13 +80,12 @@ public: 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(); diff --git a/library/qpemenubar.cpp b/library/qpemenubar.cpp index 4aa0bf3..3e5bad5 100644 --- a/library/qpemenubar.cpp +++ b/library/qpemenubar.cpp @@ -222,16 +222,12 @@ bool QPEMenuToolFocusManager::eventFilter( QObject *object, QEvent *event ) 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 ) |