summaryrefslogtreecommitdiff
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
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 (more/less context) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp121
-rw-r--r--library/qpeapplication.h1
-rw-r--r--library/qpemenubar.cpp4
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 )