summaryrefslogtreecommitdiff
Unidiff
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 @@
89#include "qt_override_p.h" 89#include "qt_override_p.h"
90 90
91 91
92class QPEApplicationData 92class QPEApplicationData
93{ 93{
94public: 94public:
95 QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), kbgrabber( 0 ), 95 QPEApplicationData ( )
96 rightpressed( FALSE ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), 96 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
97 forceshow( FALSE ), nomaximize( FALSE ), keep_running( TRUE ), qpe_main_widget( 0 ) 97 notbusysent( false ), preloaded( false ), forceshow( false ), nomaximize( false ),
98 keep_running( true ), qpe_main_widget( 0 )
98 99
99 { 100 {
100 qcopq.setAutoDelete( TRUE ); 101 qcopq.setAutoDelete( TRUE );
101 } 102 }
102 103
103 int presstimer; 104 int presstimer;
104 QWidget* presswidget; 105 QWidget* presswidget;
105 int kbgrabber;
106 QString kbgrabber_appname;
107 QPoint presspos; 106 QPoint presspos;
108 107
109 bool rightpressed : 1; 108 bool rightpressed : 1;
110 bool kbregrab : 1; 109 bool kbgrabbed : 1;
111 bool notbusysent : 1; 110 bool notbusysent : 1;
112 bool preloaded : 1; 111 bool preloaded : 1;
113 bool forceshow : 1; 112 bool forceshow : 1;
114 bool nomaximize : 1; 113 bool nomaximize : 1;
115 bool keep_running : 1; 114 bool keep_running : 1;
116 115
@@ -752,14 +751,12 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
752 break; 751 break;
753 default: 752 default:
754 break; 753 break;
755 } 754 }
756 } 755 }
757 if ( e->type == QWSEvent::Key ) { 756 if ( e->type == QWSEvent::Key ) {
758 if ( d->kbgrabber == 1 )
759 return TRUE;
760 QWSKeyEvent *ke = ( QWSKeyEvent * ) e; 757 QWSKeyEvent *ke = ( QWSKeyEvent * ) e;
761 if ( ke->simpleData.keycode == Qt::Key_F33 ) { 758 if ( ke->simpleData.keycode == Qt::Key_F33 ) {
762 // Use special "OK" key to press "OK" on top level widgets 759 // Use special "OK" key to press "OK" on top level widgets
763 QWidget * active = activeWindow(); 760 QWidget * active = activeWindow();
764 QWidget *popup = 0; 761 QWidget *popup = 0;
765 if ( active && active->isPopup() ) { 762 if ( active && active->isPopup() ) {
@@ -806,45 +803,60 @@ bool QPEApplication::qwsEventFilter( QWSEvent * e )
806 } 803 }
807 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { 804 else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) {
808 active->close(); 805 active->close();
809 } 806 }
810 } 807 }
811 } 808 }
812 809 else if ( ke->simpleData.keycode >= Qt::Key_F1 && ke->simpleData.keycode <= Qt::Key_F29 ) {
813#if QT_VERSION < 231 810 // this should be if ( ODevice::inst ( )-> buttonForKeycode ( ... ))
814 // Filter out the F4/Launcher key from apps 811 // but we cannot access libopie function within libqpe :(
815 // ### The launcher key may not always be F4 on all devices 812
816 if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) 813 QWidget * active = activeWindow ( );
817 return TRUE; 814 if ( active && ((int) active-> winId ( ) == ke-> simpleData.window )) {
818#endif 815 if ( d-> kbgrabbed ) { // we grabbed the keyboard
819 816 QChar ch ( ke-> simpleData.unicode );
817 QKeyEvent qke ( ke-> simpleData. is_press ? QEvent::KeyPress : QEvent::KeyRelease,
818 ke-> simpleData.keycode,
819 ch. latin1 ( ),
820 ke-> simpleData.modifiers,
821 QString ( ch ),
822 ke-> simpleData.is_auto_repeat, 1 );
823
824 QObject *which = QWidget::keyboardGrabber ( );
825 if ( !which )
826 which = QApplication::focusWidget ( );
827 if ( !which )
828 which = QApplication::activeWindow ( );
829 if ( !which )
830 which = qApp;
831
832 QApplication::sendEvent ( which, &qke );
833 }
834 else { // we didn't grab the keyboard, so send the event to the launcher
835 QCopEnvelope e ( "QPE/Launcher", "deviceButton(int,int,int)" );
836 e << int( ke-> simpleData.keycode ) << int( ke-> simpleData. is_press ) << int( ke-> simpleData.is_auto_repeat );
837 }
838 }
839 return true;
840 }
820 } 841 }
821 if ( e->type == QWSEvent::Focus ) { 842 if ( e->type == QWSEvent::Focus ) {
822 QWSFocusEvent * fe = ( QWSFocusEvent* ) e; 843 QWSFocusEvent * fe = ( QWSFocusEvent* ) e;
823 QWidget* nfw = QWidget::find( e->window() );
824 if ( !fe->simpleData.get_focus ) { 844 if ( !fe->simpleData.get_focus ) {
825 QWidget * active = activeWindow(); 845 QWidget * active = activeWindow();
826 while ( active && active->isPopup() ) { 846 while ( active && active->isPopup() ) {
827 active->close(); 847 active->close();
828 active = activeWindow(); 848 active = activeWindow();
829 } 849 }
830 if ( !nfw && d->kbgrabber == 2 ) {
831 ungrabKeyboard();
832 d->kbregrab = TRUE; // want kb back when we're active
833 }
834 } 850 }
835 else { 851 else {
836 // make sure our modal widget is ALWAYS on top 852 // make sure our modal widget is ALWAYS on top
837 QWidget *topm = activeModalWidget(); 853 QWidget *topm = activeModalWidget();
838 if ( topm ) { 854 if ( topm ) {
839 topm->raise(); 855 topm->raise();
840 } 856 }
841 if ( d->kbregrab ) {
842 grabKeyboard();
843 d->kbregrab = FALSE;
844 }
845 } 857 }
846 if ( fe->simpleData.get_focus && inputMethodDict ) { 858 if ( fe->simpleData.get_focus && inputMethodDict ) {
847 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); 859 InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) );
848 if ( m == AlwaysOff ) 860 if ( m == AlwaysOff )
849 Global::hideInputMethod(); 861 Global::hideInputMethod();
850 if ( m == AlwaysOn ) 862 if ( m == AlwaysOn )
@@ -1030,12 +1042,26 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
1030{ 1042{
1031#ifdef Q_WS_QWS 1043#ifdef Q_WS_QWS
1032 QDataStream stream( data, IO_ReadOnly ); 1044 QDataStream stream( data, IO_ReadOnly );
1033 if ( msg == "applyStyle()" ) { 1045 if ( msg == "applyStyle()" ) {
1034 applyStyle(); 1046 applyStyle();
1035 } 1047 }
1048 else if ( msg == "toggleApplicationMenu()" ) {
1049 QWidget *active = activeWindow ( );
1050
1051 if ( active ) {
1052 QPEMenuToolFocusManager *man = QPEMenuToolFocusManager::manager ( );
1053 bool oldactive = man-> isActive ( );
1054
1055 man-> setActive( !man-> isActive() );
1056
1057 if ( !oldactive && !man-> isActive ( )) { // no menubar to toggle -> try O-Menu
1058 QCopEnvelope e ( "QPE/TaskBar", "toggleStartMenu()" );
1059 }
1060 }
1061 }
1036 else if ( msg == "setDefaultRotation(int)" ) { 1062 else if ( msg == "setDefaultRotation(int)" ) {
1037 if ( type() == GuiServer ) { 1063 if ( type() == GuiServer ) {
1038 int r; 1064 int r;
1039 stream >> r; 1065 stream >> r;
1040 setDefaultRotation( r ); 1066 setDefaultRotation( r );
1041 } 1067 }
@@ -1053,24 +1079,12 @@ void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data
1053 quit(); 1079 quit();
1054 } 1080 }
1055 else if ( msg == "restart()" ) { 1081 else if ( msg == "restart()" ) {
1056 if ( type() == GuiServer ) 1082 if ( type() == GuiServer )
1057 restart(); 1083 restart();
1058 } 1084 }
1059 else if ( msg == "grabKeyboard(QString)" ) {
1060 QString who;
1061 stream >> who;
1062 if ( who.isEmpty() )
1063 d->kbgrabber = 0;
1064 else if ( who != d->appName )
1065 d->kbgrabber = 1;
1066 else
1067 d->kbgrabber = 2;
1068
1069 d-> kbgrabber_appname = who;
1070 }
1071 else if ( msg == "language(QString)" ) { 1085 else if ( msg == "language(QString)" ) {
1072 if ( type() == GuiServer ) { 1086 if ( type() == GuiServer ) {
1073 QString l; 1087 QString l;
1074 stream >> l; 1088 stream >> l;
1075 QString cl = getenv( "LANG" ); 1089 QString cl = getenv( "LANG" );
1076 if ( cl != l ) { 1090 if ( cl != l ) {
@@ -1621,40 +1635,23 @@ void QPEApplication::removeSenderFromStylusDict()
1621 1635
1622/*! 1636/*!
1623 \internal 1637 \internal
1624*/ 1638*/
1625bool QPEApplication::keyboardGrabbed() const 1639bool QPEApplication::keyboardGrabbed() const
1626{ 1640{
1627 return d->kbgrabber; 1641 return d->kbgrabbed;
1628}
1629
1630/*!
1631 \internal
1632*/
1633QString QPEApplication::keyboardGrabbedBy() const
1634{
1635 return d->kbgrabber_appname;
1636} 1642}
1637 1643
1638 1644
1639/*! 1645/*!
1640 Reverses the effect of grabKeyboard(). This is called automatically 1646 Reverses the effect of grabKeyboard(). This is called automatically
1641 on program exit. 1647 on program exit.
1642*/ 1648*/
1643void QPEApplication::ungrabKeyboard() 1649void QPEApplication::ungrabKeyboard()
1644{ 1650{
1645 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1651 ((QPEApplication *) qApp )-> d-> kbgrabbed = false;
1646 if ( d->kbgrabber == 2 ) {
1647#ifndef QT_NO_COP
1648 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1649 e << QString::null;
1650#endif
1651
1652 d->kbregrab = FALSE;
1653 d->kbgrabber = 0;
1654 }
1655} 1652}
1656 1653
1657/*! 1654/*!
1658 Grabs the physical keyboard keys, e.g. the application's launching 1655 Grabs the physical keyboard keys, e.g. the application's launching
1659 keys. Instead of launching applications when these keys are pressed 1656 keys. Instead of launching applications when these keys are pressed
1660 the signals emitted are sent to this application instead. Some games 1657 the signals emitted are sent to this application instead. Some games
@@ -1662,23 +1659,13 @@ void QPEApplication::ungrabKeyboard()
1662 easier. 1659 easier.
1663 1660
1664 \sa ungrabKeyboard() 1661 \sa ungrabKeyboard()
1665*/ 1662*/
1666void QPEApplication::grabKeyboard() 1663void QPEApplication::grabKeyboard()
1667{ 1664{
1668 QPEApplicationData * d = ( ( QPEApplication* ) qApp ) ->d; 1665 ((QPEApplication *) qApp )-> d-> kbgrabbed = true;
1669 if ( qApp->type() == QApplication::GuiServer )
1670 d->kbgrabber = 0;
1671 else {
1672#ifndef QT_NO_COP
1673 QCopEnvelope e( "QPE/System", "grabKeyboard(QString)" );
1674 e << d->appName;
1675#endif
1676
1677 d->kbgrabber = 2; // me
1678 }
1679} 1666}
1680 1667
1681/*! 1668/*!
1682 \reimp 1669 \reimp
1683*/ 1670*/
1684int QPEApplication::exec() 1671int 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:
80 static int execDialog( QDialog*, bool nomax=FALSE ); 80 static int execDialog( QDialog*, bool nomax=FALSE );
81 81
82 static void setKeepRunning(); 82 static void setKeepRunning();
83 bool keepRunning() const; 83 bool keepRunning() const;
84 84
85 bool keyboardGrabbed() const; 85 bool keyboardGrabbed() const;
86 QString keyboardGrabbedBy ( ) const;
87 86
88 int exec(); 87 int exec();
89 88
90signals: 89signals:
91 void clientMoused(); 90 void clientMoused();
92 void timeChanged(); 91 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 )
222 break; 222 break;
223 } 223 }
224 } 224 }
225 } 225 }
226 } 226 }
227 } 227 }
228 if ( ke->key() == Key_F11 ) {
229 setActive( !isActive() );
230 return TRUE;
231 }
232 } else if ( event->type() == QEvent::KeyRelease ) { 228 } else if ( event->type() == QEvent::KeyRelease ) {
233 QKeyEvent *ke = (QKeyEvent *)event; 229 QKeyEvent *ke = (QKeyEvent *)event;
234 if ( isActive() ) { 230 if ( isActive() ) {
235 if ( object->inherits( "QButton" ) ) { 231 if ( object->inherits( "QButton" ) ) {
236 // Deactivate when a button is selected 232 // Deactivate when a button is selected
237 if ( ke->key() == Key_Space ) 233 if ( ke->key() == Key_Space )