summaryrefslogtreecommitdiff
path: root/library/qpeapplication.cpp
Unidiff
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
@@ -1,206 +1,205 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19** $Id$ 19** $Id$
20** 20**
21**********************************************************************/ 21**********************************************************************/
22#define QTOPIA_INTERNAL_LANGLIST 22#define QTOPIA_INTERNAL_LANGLIST
23#include <stdlib.h> 23#include <stdlib.h>
24#include <unistd.h> 24#include <unistd.h>
25#include <linux/limits.h> // needed for some toolchains (PATH_MAX) 25#include <linux/limits.h> // needed for some toolchains (PATH_MAX)
26#include <qfile.h> 26#include <qfile.h>
27#ifdef Q_WS_QWS 27#ifdef Q_WS_QWS
28#ifndef QT_NO_COP 28#ifndef QT_NO_COP
29#if QT_VERSION <= 231 29#if QT_VERSION <= 231
30#define private public 30#define private public
31#define sendLocally processEvent 31#define sendLocally processEvent
32#include "qcopenvelope_qws.h" 32#include "qcopenvelope_qws.h"
33#undef private 33#undef private
34#else 34#else
35#include "qcopenvelope_qws.h" 35#include "qcopenvelope_qws.h"
36#endif 36#endif
37#endif 37#endif
38#include <qwindowsystem_qws.h> 38#include <qwindowsystem_qws.h>
39#endif 39#endif
40#include <qtextstream.h> 40#include <qtextstream.h>
41#include <qpalette.h> 41#include <qpalette.h>
42#include <qbuffer.h> 42#include <qbuffer.h>
43#include <qptrdict.h> 43#include <qptrdict.h>
44#include <qregexp.h> 44#include <qregexp.h>
45#include <qdir.h> 45#include <qdir.h>
46#include <qlabel.h> 46#include <qlabel.h>
47#include <qdialog.h> 47#include <qdialog.h>
48#include <qdragobject.h> 48#include <qdragobject.h>
49#include <qtextcodec.h> 49#include <qtextcodec.h>
50#include <qevent.h> 50#include <qevent.h>
51#include <qtooltip.h> 51#include <qtooltip.h>
52#include <qsignal.h> 52#include <qsignal.h>
53#include "qpeapplication.h" 53#include "qpeapplication.h"
54#include "qpestyle.h" 54#include "qpestyle.h"
55#include "styleinterface.h" 55#include "styleinterface.h"
56#if QT_VERSION >= 300 56#if QT_VERSION >= 300
57#include <qstylefactory.h> 57#include <qstylefactory.h>
58#else 58#else
59#include <qplatinumstyle.h> 59#include <qplatinumstyle.h>
60#include <qwindowsstyle.h> 60#include <qwindowsstyle.h>
61#include <qmotifstyle.h> 61#include <qmotifstyle.h>
62#include <qmotifplusstyle.h> 62#include <qmotifplusstyle.h>
63#include "lightstyle.h" 63#include "lightstyle.h"
64 64
65#include <qpe/qlibrary.h> 65#include <qpe/qlibrary.h>
66#endif 66#endif
67#include "global.h" 67#include "global.h"
68#include "resource.h" 68#include "resource.h"
69#if QT_VERSION <= 230 && defined(QT_NO_CODECS) 69#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
70#include "qutfcodec.h" 70#include "qutfcodec.h"
71#endif 71#endif
72#include "config.h" 72#include "config.h"
73#include "network.h" 73#include "network.h"
74#ifdef QWS 74#ifdef QWS
75#include "fontmanager.h" 75#include "fontmanager.h"
76#endif 76#endif
77 77
78#include "alarmserver.h" 78#include "alarmserver.h"
79#include "applnk.h" 79#include "applnk.h"
80#include "qpemenubar.h" 80#include "qpemenubar.h"
81#include "textcodecinterface.h" 81#include "textcodecinterface.h"
82#include "imagecodecinterface.h" 82#include "imagecodecinterface.h"
83 83
84#include <unistd.h> 84#include <unistd.h>
85#include <sys/file.h> 85#include <sys/file.h>
86#include <sys/ioctl.h> 86#include <sys/ioctl.h>
87#include <sys/soundcard.h> 87#include <sys/soundcard.h>
88 88
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
117 QString appName; 116 QString appName;
118 struct QCopRec 117 struct QCopRec
119 { 118 {
120 QCopRec( const QCString &ch, const QCString &msg, 119 QCopRec( const QCString &ch, const QCString &msg,
121 const QByteArray &d ) : 120 const QByteArray &d ) :
122 channel( ch ), message( msg ), data( d ) 121 channel( ch ), message( msg ), data( d )
123 { } 122 { }
124 123
125 QCString channel; 124 QCString channel;
126 QCString message; 125 QCString message;
127 QByteArray data; 126 QByteArray data;
128 }; 127 };
129 QWidget* qpe_main_widget; 128 QWidget* qpe_main_widget;
130 QList<QCopRec> qcopq; 129 QList<QCopRec> qcopq;
131 130
132 void enqueueQCop( const QCString &ch, const QCString &msg, 131 void enqueueQCop( const QCString &ch, const QCString &msg,
133 const QByteArray &data ) 132 const QByteArray &data )
134 { 133 {
135 qcopq.append( new QCopRec( ch, msg, data ) ); 134 qcopq.append( new QCopRec( ch, msg, data ) );
136 } 135 }
137 void sendQCopQ() 136 void sendQCopQ()
138 { 137 {
139 QCopRec * r; 138 QCopRec * r;
140#ifndef QT_NO_COP 139#ifndef QT_NO_COP
141 140
142 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it ) 141 for ( QListIterator<QCopRec> it( qcopq ); ( r = it.current() ); ++it )
143 QCopChannel::sendLocally( r->channel, r->message, r->data ); 142 QCopChannel::sendLocally( r->channel, r->message, r->data );
144#endif 143#endif
145 144
146 qcopq.clear(); 145 qcopq.clear();
147 } 146 }
148 static void show_mx(QWidget* mw, bool nomaximize) 147 static void show_mx(QWidget* mw, bool nomaximize)
149 { 148 {
150 if ( mw->layout() && mw->inherits("QDialog") ) { 149 if ( mw->layout() && mw->inherits("QDialog") ) {
151 QPEApplication::showDialog((QDialog*)mw, nomaximize); 150 QPEApplication::showDialog((QDialog*)mw, nomaximize);
152 } 151 }
153 else { 152 else {
154#ifdef Q_WS_QWS 153#ifdef Q_WS_QWS
155 if ( !nomaximize ) 154 if ( !nomaximize )
156 mw->showMaximized(); 155 mw->showMaximized();
157 else 156 else
158#endif 157#endif
159 158
160 mw->show(); 159 mw->show();
161 } 160 }
162 } 161 }
163 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 162 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
164 { 163 {
165 /* 164 /*
166 // This works but disable it for now until it is safe to apply 165 // This works but disable it for now until it is safe to apply
167 // What is does is scan the .desktop files of all the apps for 166 // What is does is scan the .desktop files of all the apps for
168 // the applnk that has the corresponding argv[0] as this program 167 // the applnk that has the corresponding argv[0] as this program
169 // then it uses the name stored in the .desktop file as the caption 168 // then it uses the name stored in the .desktop file as the caption
170 // for the main widget. This saves duplicating translations for 169 // for the main widget. This saves duplicating translations for
171 // the app name in the program and in the .desktop files. 170 // the app name in the program and in the .desktop files.
172 171
173 AppLnkSet apps( appsPath ); 172 AppLnkSet apps( appsPath );
174 173
175 QList<AppLnk> appsList = apps.children(); 174 QList<AppLnk> appsList = apps.children();
176 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) { 175 for ( QListIterator<AppLnk> it(appsList); it.current(); ++it ) {
177 if ( (*it)->exec() == appName ) { 176 if ( (*it)->exec() == appName ) {
178 mw->setCaption( (*it)->name() ); 177 mw->setCaption( (*it)->name() );
179 return TRUE; 178 return TRUE;
180 } 179 }
181 } 180 }
182 */ 181 */
183 return FALSE; 182 return FALSE;
184 } 183 }
185 184
186 185
187 void show(QWidget* mw, bool nomax) 186 void show(QWidget* mw, bool nomax)
188 { 187 {
189 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" ); 188 setWidgetCaptionFromAppName( mw, appName, QPEApplication::qpeDir() + "apps" );
190 nomaximize = nomax; 189 nomaximize = nomax;
191 qpe_main_widget = mw; 190 qpe_main_widget = mw;
192#ifndef QT_NO_COP 191#ifndef QT_NO_COP
193 192
194 sendQCopQ(); 193 sendQCopQ();
195#endif 194#endif
196 195
197 if ( preloaded ) { 196 if ( preloaded ) {
198 if (forceshow) 197 if (forceshow)
199 show_mx(mw, nomax); 198 show_mx(mw, nomax);
200 } 199 }
201 else if ( keep_running ) { 200 else if ( keep_running ) {
202 show_mx(mw, nomax); 201 show_mx(mw, nomax);
203 } 202 }
204 } 203 }
205 204
206 void loadTextCodecs() 205 void loadTextCodecs()
@@ -662,505 +661,520 @@ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w )
662 return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); 661 return ( InputMethodHint ) ( int ) inputMethodDict->find( w );
663 return Normal; 662 return Normal;
664} 663}
665 664
666/*! 665/*!
667 \enum QPEApplication::InputMethodHint 666 \enum QPEApplication::InputMethodHint
668 667
669 \value Normal the application sometimes needs text input (the default). 668 \value Normal the application sometimes needs text input (the default).
670 \value AlwaysOff the application never needs text input. 669 \value AlwaysOff the application never needs text input.
671 \value AlwaysOn the application always needs text input. 670 \value AlwaysOn the application always needs text input.
672*/ 671*/
673 672
674/*! 673/*!
675 Hints to the system that widget \a w has use for text input methods 674 Hints to the system that widget \a w has use for text input methods
676 as specified by \a mode. 675 as specified by \a mode.
677 676
678 \sa inputMethodHint() InputMethodHint 677 \sa inputMethodHint() InputMethodHint
679*/ 678*/
680void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) 679void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode )
681{ 680{
682 createInputMethodDict(); 681 createInputMethodDict();
683 if ( mode == Normal ) { 682 if ( mode == Normal ) {
684 inputMethodDict->remove 683 inputMethodDict->remove
685 ( w ); 684 ( w );
686 } 685 }
687 else { 686 else {
688 inputMethodDict->insert( w, ( void* ) mode ); 687 inputMethodDict->insert( w, ( void* ) mode );
689 } 688 }
690} 689}
691 690
692class HackDialog : public QDialog 691class HackDialog : public QDialog
693{ 692{
694public: 693public:
695 void acceptIt() 694 void acceptIt()
696 { 695 {
697 accept(); 696 accept();
698 } 697 }
699 void rejectIt() 698 void rejectIt()
700 { 699 {
701 reject(); 700 reject();
702 } 701 }
703}; 702};
704 703
705 704
706void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) 705void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
707{ 706{
708 // specialised actions for certain widgets. May want to 707 // specialised actions for certain widgets. May want to
709 // add more stuff here. 708 // add more stuff here.
710 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) 709 if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" )
711 && activePopupWidget() ->parentWidget() 710 && activePopupWidget() ->parentWidget()
712 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) 711 && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) )
713 key = Qt::Key_Return; 712 key = Qt::Key_Return;
714 713
715 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) 714 if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) )
716 key = Qt::Key_Return; 715 key = Qt::Key_Return;
717 716
718#ifdef QWS 717#ifdef QWS
719 718
720 ke->simpleData.keycode = key; 719 ke->simpleData.keycode = key;
721#endif 720#endif
722} 721}
723 722
724class HackWidget : public QWidget 723class HackWidget : public QWidget
725{ 724{
726public: 725public:
727 bool needsOk() 726 bool needsOk()
728 { 727 {
729 return ( getWState() & WState_Reserved1 ); 728 return ( getWState() & WState_Reserved1 );
730 } 729 }
731}; 730};
732 731
733/*! 732/*!
734 \internal 733 \internal
735*/ 734*/
736 735
737#ifdef QWS 736#ifdef QWS
738bool QPEApplication::qwsEventFilter( QWSEvent * e ) 737bool QPEApplication::qwsEventFilter( QWSEvent * e )
739{ 738{
740 if ( !d->notbusysent && e->type == QWSEvent::Focus ) { 739 if ( !d->notbusysent && e->type == QWSEvent::Focus ) {
741 if ( qApp->type() != QApplication::GuiServer ) { 740 if ( qApp->type() != QApplication::GuiServer ) {
742 QCopEnvelope e( "QPE/System", "notBusy(QString)" ); 741 QCopEnvelope e( "QPE/System", "notBusy(QString)" );
743 e << d->appName; 742 e << d->appName;
744 } 743 }
745 d->notbusysent = TRUE; 744 d->notbusysent = TRUE;
746 } 745 }
747 if ( type() == GuiServer ) { 746 if ( type() == GuiServer ) {
748 switch ( e->type ) { 747 switch ( e->type ) {
749 case QWSEvent::Mouse: 748 case QWSEvent::Mouse:
750 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) 749 if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) )
751 emit clientMoused(); 750 emit clientMoused();
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() ) {
766 popup = active; 763 popup = active;
767 active = active->parentWidget(); 764 active = active->parentWidget();
768 } 765 }
769 if ( active && ( int ) active->winId() == ke->simpleData.window && 766 if ( active && ( int ) active->winId() == ke->simpleData.window &&
770 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { 767 !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) {
771 if ( ke->simpleData.is_press ) { 768 if ( ke->simpleData.is_press ) {
772 if ( popup ) 769 if ( popup )
773 popup->close(); 770 popup->close();
774 if ( active->inherits( "QDialog" ) ) { 771 if ( active->inherits( "QDialog" ) ) {
775 HackDialog * d = ( HackDialog * ) active; 772 HackDialog * d = ( HackDialog * ) active;
776 d->acceptIt(); 773 d->acceptIt();
777 return TRUE; 774 return TRUE;
778 } 775 }
779 else if ( ( ( HackWidget * ) active ) ->needsOk() ) { 776 else if ( ( ( HackWidget * ) active ) ->needsOk() ) {
780 QSignal s; 777 QSignal s;
781 s.connect( active, SLOT( accept() ) ); 778 s.connect( active, SLOT( accept() ) );
782 s.activate(); 779 s.activate();
783 } 780 }
784 else { 781 else {
785 // do the same as with the select key: Map to the default action of the widget: 782 // do the same as with the select key: Map to the default action of the widget:
786 mapToDefaultAction( ke, Qt::Key_Return ); 783 mapToDefaultAction( ke, Qt::Key_Return );
787 } 784 }
788 } 785 }
789 } 786 }
790 } 787 }
791 else if ( ke->simpleData.keycode == Qt::Key_F30 ) { 788 else if ( ke->simpleData.keycode == Qt::Key_F30 ) {
792 // Use special "select" key to do whatever default action a widget has 789 // Use special "select" key to do whatever default action a widget has
793 mapToDefaultAction( ke, Qt::Key_Space ); 790 mapToDefaultAction( ke, Qt::Key_Space );
794 } 791 }
795 else if ( ke->simpleData.keycode == Qt::Key_Escape && 792 else if ( ke->simpleData.keycode == Qt::Key_Escape &&
796 ke->simpleData.is_press ) { 793 ke->simpleData.is_press ) {
797 // Escape key closes app if focus on toplevel 794 // Escape key closes app if focus on toplevel
798 QWidget * active = activeWindow(); 795 QWidget * active = activeWindow();
799 if ( active && active->testWFlags( WType_TopLevel ) && 796 if ( active && active->testWFlags( WType_TopLevel ) &&
800 ( int ) active->winId() == ke->simpleData.window && 797 ( int ) active->winId() == ke->simpleData.window &&
801 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { 798 !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) {
802 if ( active->inherits( "QDialog" ) ) { 799 if ( active->inherits( "QDialog" ) ) {
803 HackDialog * d = ( HackDialog * ) active; 800 HackDialog * d = ( HackDialog * ) active;
804 d->rejectIt(); 801 d->rejectIt();
805 return TRUE; 802 return TRUE;
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 )
851 Global::showInputMethod(); 863 Global::showInputMethod();
852 } 864 }
853 } 865 }
854 return QApplication::qwsEventFilter( e ); 866 return QApplication::qwsEventFilter( e );
855} 867}
856#endif 868#endif
857 869
858/*! 870/*!
859 Destroys the QPEApplication. 871 Destroys the QPEApplication.
860*/ 872*/
861QPEApplication::~QPEApplication() 873QPEApplication::~QPEApplication()
862{ 874{
863 ungrabKeyboard(); 875 ungrabKeyboard();
864#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 876#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
865 // Need to delete QCopChannels early, since the display will 877 // Need to delete QCopChannels early, since the display will
866 // be gone by the time we get to ~QObject(). 878 // be gone by the time we get to ~QObject().
867 delete sysChannel; 879 delete sysChannel;
868 delete pidChannel; 880 delete pidChannel;
869#endif 881#endif
870 882
871 delete d; 883 delete d;
872} 884}
873 885
874/*! 886/*!
875 Returns <tt>$OPIEDIR/</tt>. 887 Returns <tt>$OPIEDIR/</tt>.
876*/ 888*/
877QString QPEApplication::qpeDir() 889QString QPEApplication::qpeDir()
878{ 890{
879 const char * base = getenv( "OPIEDIR" ); 891 const char * base = getenv( "OPIEDIR" );
880 if ( base ) 892 if ( base )
881 return QString( base ) + "/"; 893 return QString( base ) + "/";
882 894
883 return QString( "../" ); 895 return QString( "../" );
884} 896}
885 897
886/*! 898/*!
887 Returns the user's current Document directory. There is a trailing "/". 899 Returns the user's current Document directory. There is a trailing "/".
888 .. well, it does now,, and there's no trailing '/' 900 .. well, it does now,, and there's no trailing '/'
889*/ 901*/
890QString QPEApplication::documentDir() 902QString QPEApplication::documentDir()
891{ 903{
892 const char* base = getenv( "HOME"); 904 const char* base = getenv( "HOME");
893 if ( base ) 905 if ( base )
894 return QString( base ) + "/Documents"; 906 return QString( base ) + "/Documents";
895 907
896 return QString( "../Documents" ); 908 return QString( "../Documents" );
897} 909}
898 910
899static int deforient = -1; 911static int deforient = -1;
900 912
901/*! 913/*!
902 \internal 914 \internal
903*/ 915*/
904int QPEApplication::defaultRotation() 916int QPEApplication::defaultRotation()
905{ 917{
906 if ( deforient < 0 ) { 918 if ( deforient < 0 ) {
907 QString d = getenv( "QWS_DISPLAY" ); 919 QString d = getenv( "QWS_DISPLAY" );
908 if ( d.contains( "Rot90" ) ) { 920 if ( d.contains( "Rot90" ) ) {
909 deforient = 90; 921 deforient = 90;
910 } 922 }
911 else if ( d.contains( "Rot180" ) ) { 923 else if ( d.contains( "Rot180" ) ) {
912 deforient = 180; 924 deforient = 180;
913 } 925 }
914 else if ( d.contains( "Rot270" ) ) { 926 else if ( d.contains( "Rot270" ) ) {
915 deforient = 270; 927 deforient = 270;
916 } 928 }
917 else { 929 else {
918 deforient = 0; 930 deforient = 0;
919 } 931 }
920 } 932 }
921 return deforient; 933 return deforient;
922} 934}
923 935
924/*! 936/*!
925 \internal 937 \internal
926*/ 938*/
927void QPEApplication::setDefaultRotation( int r ) 939void QPEApplication::setDefaultRotation( int r )
928{ 940{
929 if ( qApp->type() == GuiServer ) { 941 if ( qApp->type() == GuiServer ) {
930 deforient = r; 942 deforient = r;
931 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); 943 setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 );
932 Config config("qpe"); 944 Config config("qpe");
933 config.setGroup( "Rotation" ); 945 config.setGroup( "Rotation" );
934 config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); 946 config.writeEntry( "Screen", getenv("QWS_DISPLAY") );
935 } 947 }
936 else { 948 else {
937#ifndef QT_NO_COP 949#ifndef QT_NO_COP
938 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); 950 { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" );
939 e << r; 951 e << r;
940 } 952 }
941#endif 953#endif
942 954
943 } 955 }
944} 956}
945 957
946 958
947/*! 959/*!
948 \internal 960 \internal
949*/ 961*/
950void QPEApplication::applyStyle() 962void QPEApplication::applyStyle()
951{ 963{
952 Config config( "qpe" ); 964 Config config( "qpe" );
953 config.setGroup( "Appearance" ); 965 config.setGroup( "Appearance" );
954 966
955 // don't block ourselves ... 967 // don't block ourselves ...
956 Opie::force_appearance = 0; 968 Opie::force_appearance = 0;
957 969
958 static QString appname = Opie::binaryName ( ); 970 static QString appname = Opie::binaryName ( );
959 971
960 QStringList ex = config. readListEntry ( "NoStyle", ';' ); 972 QStringList ex = config. readListEntry ( "NoStyle", ';' );
961 int nostyle = 0; 973 int nostyle = 0;
962 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { 974 for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) {
963 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { 975 if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) {
964 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); 976 nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 );
965 break; 977 break;
966 } 978 }
967 } 979 }
968 980
969 // Widget style 981 // Widget style
970 QString style = config.readEntry( "Style", "Light" ); 982 QString style = config.readEntry( "Style", "Light" );
971 983
972 // don't set a custom style 984 // don't set a custom style
973 if ( nostyle & Opie::Force_Style ) 985 if ( nostyle & Opie::Force_Style )
974 style = "Light"; 986 style = "Light";
975 987
976 internalSetStyle ( style ); 988 internalSetStyle ( style );
977 989
978 // Colors 990 // Colors
979 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); 991 QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) );
980 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); 992 QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) );
981 QPalette pal( btncolor, bgcolor ); 993 QPalette pal( btncolor, bgcolor );
982 QString color = config.readEntry( "Highlight", "#800000" ); 994 QString color = config.readEntry( "Highlight", "#800000" );
983 pal.setColor( QColorGroup::Highlight, QColor( color ) ); 995 pal.setColor( QColorGroup::Highlight, QColor( color ) );
984 color = config.readEntry( "HighlightedText", "#FFFFFF" ); 996 color = config.readEntry( "HighlightedText", "#FFFFFF" );
985 pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); 997 pal.setColor( QColorGroup::HighlightedText, QColor( color ) );
986 color = config.readEntry( "Text", "#000000" ); 998 color = config.readEntry( "Text", "#000000" );
987 pal.setColor( QColorGroup::Text, QColor( color ) ); 999 pal.setColor( QColorGroup::Text, QColor( color ) );
988 color = config.readEntry( "ButtonText", "#000000" ); 1000 color = config.readEntry( "ButtonText", "#000000" );
989 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); 1001 pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) );
990 color = config.readEntry( "Base", "#FFFFFF" ); 1002 color = config.readEntry( "Base", "#FFFFFF" );
991 pal.setColor( QColorGroup::Base, QColor( color ) ); 1003 pal.setColor( QColorGroup::Base, QColor( color ) );
992 1004
993 pal.setColor( QPalette::Disabled, QColorGroup::Text, 1005 pal.setColor( QPalette::Disabled, QColorGroup::Text,
994 pal.color( QPalette::Active, QColorGroup::Background ).dark() ); 1006 pal.color( QPalette::Active, QColorGroup::Background ).dark() );
995 1007
996 setPalette( pal, TRUE ); 1008 setPalette( pal, TRUE );
997 1009
998 // Window Decoration 1010 // Window Decoration
999 QString dec = config.readEntry( "Decoration", "Qtopia" ); 1011 QString dec = config.readEntry( "Decoration", "Qtopia" );
1000 1012
1001 // don't set a custom deco 1013 // don't set a custom deco
1002 if ( nostyle & Opie::Force_Decoration ) 1014 if ( nostyle & Opie::Force_Decoration )
1003 dec = ""; 1015 dec = "";
1004 1016
1005 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); 1017 //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle);
1006 1018
1007 if ( dec != d->decorationName ) { 1019 if ( dec != d->decorationName ) {
1008 qwsSetDecoration( new QPEDecoration( dec ) ); 1020 qwsSetDecoration( new QPEDecoration( dec ) );
1009 d->decorationName = dec; 1021 d->decorationName = dec;
1010 } 1022 }
1011 1023
1012 // Font 1024 // Font
1013 QString ff = config.readEntry( "FontFamily", font().family() ); 1025 QString ff = config.readEntry( "FontFamily", font().family() );
1014 int fs = config.readNumEntry( "FontSize", font().pointSize() ); 1026 int fs = config.readNumEntry( "FontSize", font().pointSize() );
1015 1027
1016 // don't set a custom font 1028 // don't set a custom font
1017 if ( nostyle & Opie::Force_Font ) { 1029 if ( nostyle & Opie::Force_Font ) {
1018 ff = "Helvetica"; 1030 ff = "Helvetica";
1019 fs = 10; 1031 fs = 10;
1020 } 1032 }
1021 1033
1022 setFont ( QFont ( ff, fs ), true ); 1034 setFont ( QFont ( ff, fs ), true );
1023 1035
1024 // revert to global blocking policy ... 1036 // revert to global blocking policy ...
1025 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; 1037 Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None;
1026 Opie::force_appearance &= ~nostyle; 1038 Opie::force_appearance &= ~nostyle;
1027} 1039}
1028 1040
1029void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) 1041void 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 }
1042 } 1068 }
1043 else if ( msg == "shutdown()" ) { 1069 else if ( msg == "shutdown()" ) {
1044 if ( type() == GuiServer ) 1070 if ( type() == GuiServer )
1045 shutdown(); 1071 shutdown();
1046 } 1072 }
1047 else if ( msg == "quit()" ) { 1073 else if ( msg == "quit()" ) {
1048 if ( type() != GuiServer ) 1074 if ( type() != GuiServer )
1049 tryQuit(); 1075 tryQuit();
1050 } 1076 }
1051 else if ( msg == "forceQuit()" ) { 1077 else if ( msg == "forceQuit()" ) {
1052 if ( type() != GuiServer ) 1078 if ( type() != GuiServer )
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 ) {
1077 if ( l.isNull() ) 1091 if ( l.isNull() )
1078 unsetenv( "LANG" ); 1092 unsetenv( "LANG" );
1079 else 1093 else
1080 setenv( "LANG", l.latin1(), 1 ); 1094 setenv( "LANG", l.latin1(), 1 );
1081 restart(); 1095 restart();
1082 } 1096 }
1083 } 1097 }
1084 } 1098 }
1085 else if ( msg == "timeChange(QString)" ) { 1099 else if ( msg == "timeChange(QString)" ) {
1086 QString t; 1100 QString t;
1087 stream >> t; 1101 stream >> t;
1088 if ( t.isNull() ) 1102 if ( t.isNull() )
1089 unsetenv( "TZ" ); 1103 unsetenv( "TZ" );
1090 else 1104 else
1091 setenv( "TZ", t.latin1(), 1 ); 1105 setenv( "TZ", t.latin1(), 1 );
1092 // emit the signal so everyone else knows... 1106 // emit the signal so everyone else knows...
1093 emit timeChanged(); 1107 emit timeChanged();
1094 } 1108 }
1095 else if ( msg == "execute(QString)" ) { 1109 else if ( msg == "execute(QString)" ) {
1096 if ( type() == GuiServer ) { 1110 if ( type() == GuiServer ) {
1097 QString t; 1111 QString t;
1098 stream >> t; 1112 stream >> t;
1099 Global::execute( t ); 1113 Global::execute( t );
1100 } 1114 }
1101 } 1115 }
1102 else if ( msg == "execute(QString,QString)" ) { 1116 else if ( msg == "execute(QString,QString)" ) {
1103 if ( type() == GuiServer ) { 1117 if ( type() == GuiServer ) {
1104 QString t, d; 1118 QString t, d;
1105 stream >> t >> d; 1119 stream >> t >> d;
1106 Global::execute( t, d ); 1120 Global::execute( t, d );
1107 } 1121 }
1108 } 1122 }
1109 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) { 1123 else if ( msg == "addAlarm(QDateTime,QCString,QCString,int)" ) {
1110 if ( type() == GuiServer ) { 1124 if ( type() == GuiServer ) {
1111 QDateTime when; 1125 QDateTime when;
1112 QCString channel, message; 1126 QCString channel, message;
1113 int data; 1127 int data;
1114 stream >> when >> channel >> message >> data; 1128 stream >> when >> channel >> message >> data;
1115 AlarmServer::addAlarm( when, channel, message, data ); 1129 AlarmServer::addAlarm( when, channel, message, data );
1116 } 1130 }
1117 } 1131 }
1118 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) { 1132 else if ( msg == "deleteAlarm(QDateTime,QCString,QCString,int)" ) {
1119 if ( type() == GuiServer ) { 1133 if ( type() == GuiServer ) {
1120 QDateTime when; 1134 QDateTime when;
1121 QCString channel, message; 1135 QCString channel, message;
1122 int data; 1136 int data;
1123 stream >> when >> channel >> message >> data; 1137 stream >> when >> channel >> message >> data;
1124 AlarmServer::deleteAlarm( when, channel, message, data ); 1138 AlarmServer::deleteAlarm( when, channel, message, data );
1125 } 1139 }
1126 } 1140 }
1127 else if ( msg == "clockChange(bool)" ) { 1141 else if ( msg == "clockChange(bool)" ) {
1128 int tmp; 1142 int tmp;
1129 stream >> tmp; 1143 stream >> tmp;
1130 emit clockChanged( tmp ); 1144 emit clockChanged( tmp );
1131 } 1145 }
1132 else if ( msg == "weekChange(bool)" ) { 1146 else if ( msg == "weekChange(bool)" ) {
1133 int tmp; 1147 int tmp;
1134 stream >> tmp; 1148 stream >> tmp;
1135 emit weekChanged( tmp ); 1149 emit weekChanged( tmp );
1136 } 1150 }
1137 else if ( msg == "setDateFormat(DateFormat)" ) { 1151 else if ( msg == "setDateFormat(DateFormat)" ) {
1138 DateFormat tmp; 1152 DateFormat tmp;
1139 stream >> tmp; 1153 stream >> tmp;
1140 emit dateFormatChanged( tmp ); 1154 emit dateFormatChanged( tmp );
1141 } 1155 }
1142 else if ( msg == "setVolume(int,int)" ) { 1156 else if ( msg == "setVolume(int,int)" ) {
1143 int t, v; 1157 int t, v;
1144 stream >> t >> v; 1158 stream >> t >> v;
1145 setVolume( t, v ); 1159 setVolume( t, v );
1146 emit volumeChanged( muted ); 1160 emit volumeChanged( muted );
1147 } 1161 }
1148 else if ( msg == "volumeChange(bool)" ) { 1162 else if ( msg == "volumeChange(bool)" ) {
1149 stream >> muted; 1163 stream >> muted;
1150 setVolume(); 1164 setVolume();
1151 emit volumeChanged( muted ); 1165 emit volumeChanged( muted );
1152 } 1166 }
1153 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1167 else if ( msg == "setMic(int,int)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1154 int t, v; 1168 int t, v;
1155 stream >> t >> v; 1169 stream >> t >> v;
1156 setMic( t, v ); 1170 setMic( t, v );
1157 emit micChanged( micMuted ); 1171 emit micChanged( micMuted );
1158 } 1172 }
1159 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com> 1173 else if ( msg == "micChange(bool)" ) { // Added: 2002-02-08 by Jeremy Cowgar <jc@cowgar.com>
1160 stream >> micMuted; 1174 stream >> micMuted;
1161 setMic(); 1175 setMic();
1162 emit micChanged( micMuted ); 1176 emit micChanged( micMuted );
1163 } 1177 }
1164 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org> 1178 else if ( msg == "setBass(int,int)" ) { // Added: 2002-12-13 by Maximilian Reiss <harlekin@handhelds.org>
1165 int t, v; 1179 int t, v;
1166 stream >> t >> v; 1180 stream >> t >> v;
@@ -1531,244 +1545,217 @@ void QPEApplication::setStylusOperation( QWidget * w, StylusMode mode )
1531*/ 1545*/
1532bool QPEApplication::eventFilter( QObject *o, QEvent *e ) 1546bool QPEApplication::eventFilter( QObject *o, QEvent *e )
1533{ 1547{
1534 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 1548 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
1535 QMouseEvent * me = ( QMouseEvent* ) e; 1549 QMouseEvent * me = ( QMouseEvent* ) e;
1536 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 1550 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
1537 switch (mode) { 1551 switch (mode) {
1538 case RightOnHold: 1552 case RightOnHold:
1539 switch ( me->type() ) { 1553 switch ( me->type() ) {
1540 case QEvent::MouseButtonPress: 1554 case QEvent::MouseButtonPress:
1541 if ( me->button() == LeftButton ) { 1555 if ( me->button() == LeftButton ) {
1542 d->presstimer = startTimer(500); // #### pref. 1556 d->presstimer = startTimer(500); // #### pref.
1543 d->presswidget = (QWidget*)o; 1557 d->presswidget = (QWidget*)o;
1544 d->presspos = me->pos(); 1558 d->presspos = me->pos();
1545 d->rightpressed = FALSE; 1559 d->rightpressed = FALSE;
1546 } 1560 }
1547 break; 1561 break;
1548 case QEvent::MouseMove: 1562 case QEvent::MouseMove:
1549 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 1563 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
1550 killTimer(d->presstimer); 1564 killTimer(d->presstimer);
1551 d->presstimer = 0; 1565 d->presstimer = 0;
1552 } 1566 }
1553 break; 1567 break;
1554 case QEvent::MouseButtonRelease: 1568 case QEvent::MouseButtonRelease:
1555 if ( me->button() == LeftButton ) { 1569 if ( me->button() == LeftButton ) {
1556 if ( d->presstimer ) { 1570 if ( d->presstimer ) {
1557 killTimer(d->presstimer); 1571 killTimer(d->presstimer);
1558 d->presstimer = 0; 1572 d->presstimer = 0;
1559 } 1573 }
1560 if ( d->rightpressed && d->presswidget ) { 1574 if ( d->rightpressed && d->presswidget ) {
1561 // Right released 1575 // Right released
1562 postEvent( d->presswidget, 1576 postEvent( d->presswidget,
1563 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 1577 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
1564 RightButton, LeftButton + RightButton ) ); 1578 RightButton, LeftButton + RightButton ) );
1565 // Left released, off-widget 1579 // Left released, off-widget
1566 postEvent( d->presswidget, 1580 postEvent( d->presswidget,
1567 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1), 1581 new QMouseEvent( QEvent::MouseMove, QPoint( -1, -1),
1568 LeftButton, LeftButton ) ); 1582 LeftButton, LeftButton ) );
1569 postEvent( d->presswidget, 1583 postEvent( d->presswidget,
1570 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1), 1584 new QMouseEvent( QEvent::MouseButtonRelease, QPoint( -1, -1),
1571 LeftButton, LeftButton ) ); 1585 LeftButton, LeftButton ) );
1572 d->rightpressed = FALSE; 1586 d->rightpressed = FALSE;
1573 return TRUE; // don't send the real Left release 1587 return TRUE; // don't send the real Left release
1574 } 1588 }
1575 } 1589 }
1576 break; 1590 break;
1577 default: 1591 default:
1578 break; 1592 break;
1579 } 1593 }
1580 break; 1594 break;
1581 default: 1595 default:
1582 ; 1596 ;
1583 } 1597 }
1584 } 1598 }
1585 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) { 1599 else if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
1586 QKeyEvent *ke = (QKeyEvent *)e; 1600 QKeyEvent *ke = (QKeyEvent *)e;
1587 if ( ke->key() == Key_Enter ) { 1601 if ( ke->key() == Key_Enter ) {
1588 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) { 1602 if ( o->isA( "QRadioButton" ) || o->isA( "QCheckBox" ) ) {
1589 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ', 1603 postEvent( o, new QKeyEvent( e->type(), Key_Space, ' ',
1590 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) ); 1604 ke->state(), " ", ke->isAutoRepeat(), ke->count() ) );
1591 return TRUE; 1605 return TRUE;
1592 } 1606 }
1593 } 1607 }
1594 } 1608 }
1595 return FALSE; 1609 return FALSE;
1596} 1610}
1597 1611
1598/*! 1612/*!
1599 \reimp 1613 \reimp
1600*/ 1614*/
1601void QPEApplication::timerEvent( QTimerEvent *e ) 1615void QPEApplication::timerEvent( QTimerEvent *e )
1602{ 1616{
1603 if ( e->timerId() == d->presstimer && d->presswidget ) { 1617 if ( e->timerId() == d->presstimer && d->presswidget ) {
1604 // Right pressed 1618 // Right pressed
1605 postEvent( d->presswidget, 1619 postEvent( d->presswidget,
1606 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 1620 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
1607 RightButton, LeftButton ) ); 1621 RightButton, LeftButton ) );
1608 killTimer( d->presstimer ); 1622 killTimer( d->presstimer );
1609 d->presstimer = 0; 1623 d->presstimer = 0;
1610 d->rightpressed = TRUE; 1624 d->rightpressed = TRUE;
1611 } 1625 }
1612} 1626}
1613 1627
1614void QPEApplication::removeSenderFromStylusDict() 1628void QPEApplication::removeSenderFromStylusDict()
1615{ 1629{
1616 stylusDict->remove 1630 stylusDict->remove
1617 ( ( void* ) sender() ); 1631 ( ( void* ) sender() );
1618 if ( d->presswidget == sender() ) 1632 if ( d->presswidget == sender() )
1619 d->presswidget = 0; 1633 d->presswidget = 0;
1620} 1634}
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
1661 programs take over the launch keys in this way to make interaction 1658 programs take over the launch keys in this way to make interaction
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()
1685{ 1672{
1686#ifndef QT_NO_COP 1673#ifndef QT_NO_COP
1687 d->sendQCopQ(); 1674 d->sendQCopQ();
1688#endif 1675#endif
1689 1676
1690 if ( d->keep_running ) 1677 if ( d->keep_running )
1691 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() ) 1678 //|| d->qpe_main_widget && d->qpe_main_widget->isVisible() )
1692 return QApplication::exec(); 1679 return QApplication::exec();
1693 1680
1694#ifndef QT_NO_COP 1681#ifndef QT_NO_COP
1695 1682
1696 { 1683 {
1697 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1684 QCopEnvelope e( "QPE/System", "closing(QString)" );
1698 e << d->appName; 1685 e << d->appName;
1699 } 1686 }
1700#endif 1687#endif
1701 processEvents(); 1688 processEvents();
1702 return 0; 1689 return 0;
1703} 1690}
1704 1691
1705/*! 1692/*!
1706 \internal 1693 \internal
1707 External request for application to quit. Quits if possible without 1694 External request for application to quit. Quits if possible without
1708 loosing state. 1695 loosing state.
1709*/ 1696*/
1710void QPEApplication::tryQuit() 1697void QPEApplication::tryQuit()
1711{ 1698{
1712 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 ) 1699 if ( activeModalWidget() || strcmp( argv() [ 0 ], "embeddedkonsole" ) == 0 )
1713 return ; // Inside modal loop or konsole. Too hard to save state. 1700 return ; // Inside modal loop or konsole. Too hard to save state.
1714#ifndef QT_NO_COP 1701#ifndef QT_NO_COP
1715 1702
1716 { 1703 {
1717 QCopEnvelope e( "QPE/System", "closing(QString)" ); 1704 QCopEnvelope e( "QPE/System", "closing(QString)" );
1718 e << d->appName; 1705 e << d->appName;
1719 } 1706 }
1720#endif 1707#endif
1721 processEvents(); 1708 processEvents();
1722 1709
1723 quit(); 1710 quit();
1724} 1711}
1725 1712
1726/*! 1713/*!
1727 \internal 1714 \internal
1728 User initiated quit. Makes the window 'Go Away'. If preloaded this means 1715 User initiated quit. Makes the window 'Go Away'. If preloaded this means
1729 hiding the window. If not it means quitting the application. 1716 hiding the window. If not it means quitting the application.
1730 As this is user initiated we don't need to check state. 1717 As this is user initiated we don't need to check state.
1731*/ 1718*/
1732void QPEApplication::hideOrQuit() 1719void QPEApplication::hideOrQuit()
1733{ 1720{
1734 processEvents(); 1721 processEvents();
1735 1722
1736 // If we are a preloaded application we don't actually quit, so emit 1723 // If we are a preloaded application we don't actually quit, so emit
1737 // a System message indicating we're quasi-closing. 1724 // a System message indicating we're quasi-closing.
1738 if ( d->preloaded && d->qpe_main_widget ) 1725 if ( d->preloaded && d->qpe_main_widget )
1739#ifndef QT_NO_COP 1726#ifndef QT_NO_COP
1740 1727
1741 { 1728 {
1742 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); 1729 QCopEnvelope e("QPE/System", "fastAppHiding(QString)" );
1743 e << d->appName; 1730 e << d->appName;
1744 d->qpe_main_widget->hide(); 1731 d->qpe_main_widget->hide();
1745 } 1732 }
1746#endif 1733#endif
1747 else 1734 else
1748 quit(); 1735 quit();
1749} 1736}
1750 1737
1751 1738
1752#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP) 1739#if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP)
1753 1740
1754// The libraries with the skiff package (and possibly others) have 1741// The libraries with the skiff package (and possibly others) have
1755// completely useless implementations of builtin new and delete that 1742// completely useless implementations of builtin new and delete that
1756// use about 50% of your CPU. Here we revert to the simple libc 1743// use about 50% of your CPU. Here we revert to the simple libc
1757// functions. 1744// functions.
1758 1745
1759void* operator new[]( size_t size ) 1746void* operator new[]( size_t size )
1760{ 1747{
1761 return malloc( size ); 1748 return malloc( size );
1762} 1749}
1763 1750
1764void* operator new( size_t size ) 1751void* operator new( size_t size )
1765{ 1752{
1766 return malloc( size ); 1753 return malloc( size );
1767} 1754}
1768 1755
1769void operator delete[]( void* p ) 1756void operator delete[]( void* p )
1770{ 1757{
1771 free( p ); 1758 free( p );
1772} 1759}
1773 1760
1774void operator delete[]( void* p, size_t /*size*/ ) 1761void operator delete[]( void* p, size_t /*size*/ )