summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
Side-by-side diff
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
@@ -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()