summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
authorsandman <sandman>2002-12-22 23:59:13 (UTC)
committer sandman <sandman>2002-12-22 23:59:13 (UTC)
commitc513f413c7d901cc9945714c8e7eb47292f63306 (patch) (side-by-side diff)
tree9ce6af28225f006dffbeb536eb2fd520e903e08d /library/qpeapplication.cpp
parent5c7694a7baadec8afe128ad2541e0a8acfc23737 (diff)
downloadopie-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)
Diffstat (limited to 'library/qpeapplication.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp121
1 files changed, 54 insertions, 67 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index b26933b..e7e210a 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -94,5 +94,6 @@ 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 )
@@ -104,4 +105,2 @@ public:
QWidget* presswidget;
- int kbgrabber;
- QString kbgrabber_appname;
QPoint presspos;
@@ -109,3 +108,3 @@ public:
bool rightpressed : 1;
- bool kbregrab : 1;
+ bool kbgrabbed : 1;
bool notbusysent : 1;
@@ -757,4 +756,2 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
if ( e->type == QWSEvent::Key ) {
- if ( d->kbgrabber == 1 )
- return TRUE;
QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
@@ -811,10 +808,34 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
}
-
-#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;
+ }
}
@@ -822,3 +843,2 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
- QWidget* nfw = QWidget::find( e->window() );
if ( !fe->simpleData.get_focus ) {
@@ -829,6 +849,2 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
}
- if ( !nfw && d->kbgrabber == 2 ) {
- ungrabKeyboard();
- d->kbregrab = TRUE; // want kb back when we're active
- }
}
@@ -840,6 +856,2 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
}
- if ( d->kbregrab ) {
- grabKeyboard();
- d->kbregrab = FALSE;
- }
}
@@ -1035,2 +1047,16 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
}
+ 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)" ) {
@@ -1058,14 +1084,2 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
}
- 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)" ) {
@@ -1626,11 +1640,3 @@ bool QPEApplication::keyboardGrabbed() const
{
- return d->kbgrabber;
-}
-
-/*!
- \internal
-*/
-QString QPEApplication::keyboardGrabbedBy() const
-{
- return d->kbgrabber_appname;
+ return d->kbgrabbed;
}
@@ -1644,12 +1650,3 @@ 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;
}
@@ -1667,13 +1664,3 @@ 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;
}