summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/inputmethods.cpp20
-rw-r--r--core/launcher/inputmethods.h1
-rw-r--r--core/launcher/taskbar.cpp13
-rw-r--r--core/launcher/taskbar.h5
-rw-r--r--core/settings/launcher/inputmethodsettings.cpp29
-rw-r--r--core/settings/launcher/inputmethodsettings.h9
6 files changed, 58 insertions, 19 deletions
diff --git a/core/launcher/inputmethods.cpp b/core/launcher/inputmethods.cpp
index a0e8939..7e99796 100644
--- a/core/launcher/inputmethods.cpp
+++ b/core/launcher/inputmethods.cpp
@@ -1,621 +1,627 @@
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**********************************************************************/ 19**********************************************************************/
20 20
21#define QTOPIA_INTERNAL_LANGLIST 21#define QTOPIA_INTERNAL_LANGLIST
22#include "inputmethods.h" 22#include "inputmethods.h"
23 23
24/* OPIE */ 24/* OPIE */
25#include <opie2/odebug.h> 25#include <opie2/odebug.h>
26#include <qpe/config.h> 26#include <qpe/config.h>
27#include <qpe/global.h> 27#include <qpe/global.h>
28#include <qpe/qpeapplication.h> 28#include <qpe/qpeapplication.h>
29using namespace Opie::Core; 29using namespace Opie::Core;
30 30
31/* QT */ 31/* QT */
32#include <qpopupmenu.h> 32#include <qpopupmenu.h>
33#include <qtoolbutton.h> 33#include <qtoolbutton.h>
34#include <qwidgetstack.h> 34#include <qwidgetstack.h>
35#include <qlayout.h> 35#include <qlayout.h>
36#include <qdir.h> 36#include <qdir.h>
37#include <qtl.h> 37#include <qtl.h>
38#ifdef Q_WS_QWS 38#ifdef Q_WS_QWS
39#include <qwindowsystem_qws.h> 39#include <qwindowsystem_qws.h>
40#include <qwsevent_qws.h> 40#include <qwsevent_qws.h>
41#include <qcopchannel_qws.h> 41#include <qcopchannel_qws.h>
42#endif 42#endif
43 43
44/* STD */ 44/* STD */
45#include <stdlib.h> 45#include <stdlib.h>
46 46
47/* XPM */ 47/* XPM */
48static const char * tri_xpm[]={ 48static const char * tri_xpm[]={
49"9 9 2 1", 49"9 9 2 1",
50"a c #000000", 50"a c #000000",
51". c None", 51". c None",
52".........", 52".........",
53".........", 53".........",
54".........", 54".........",
55"....a....", 55"....a....",
56"...aaa...", 56"...aaa...",
57"..aaaaa..", 57"..aaaaa..",
58".aaaaaaa.", 58".aaaaaaa.",
59".........", 59".........",
60"........."}; 60"........."};
61 61
62int InputMethod::operator <(const InputMethod& o) const 62int InputMethod::operator <(const InputMethod& o) const
63{ 63{
64 return name() < o.name(); 64 return name() < o.name();
65} 65}
66int InputMethod::operator >(const InputMethod& o) const 66int InputMethod::operator >(const InputMethod& o) const
67{ 67{
68 return name() > o.name(); 68 return name() > o.name();
69} 69}
70int InputMethod::operator <=(const InputMethod& o) const 70int InputMethod::operator <=(const InputMethod& o) const
71{ 71{
72 return name() <= o.name(); 72 return name() <= o.name();
73} 73}
74 74
75 75
76/* 76/*
77 Slightly hacky: We use WStyle_Tool as a flag to say "this widget 77 Slightly hacky: We use WStyle_Tool as a flag to say "this widget
78 belongs to the IM system, so clicking it should not cause a reset". 78 belongs to the IM system, so clicking it should not cause a reset".
79 */ 79 */
80class IMToolButton : public QToolButton 80class IMToolButton : public QToolButton
81{ 81{
82public: 82public:
83 IMToolButton::IMToolButton( QWidget *parent ) : QToolButton( parent ) 83 IMToolButton::IMToolButton( QWidget *parent ) : QToolButton( parent )
84 { setWFlags( WStyle_Tool ); } 84 { setWFlags( WStyle_Tool ); }
85}; 85};
86 86
87 87
88InputMethods::InputMethods( QWidget *parent ) : 88InputMethods::InputMethods( QWidget *parent ) :
89 QWidget( parent, "InputMethods", WStyle_Tool | WStyle_Customize ), 89 QWidget( parent, "InputMethods", WStyle_Tool | WStyle_Customize ),
90 mkeyboard(0), imethod(0) 90 mkeyboard(0), imethod(0)
91{ 91{
92 Config cfg( "Launcher" ); 92 readConfig();
93 cfg.setGroup( "InputMethods" );
94 inputWidgetStyle = QWidget::WStyle_Customize | QWidget::WStyle_StaysOnTop | QWidget::WGroupLeader | QWidget::WStyle_Tool;
95 inputWidgetStyle |= cfg.readBoolEntry( "Float", false ) ? QWidget::WStyle_DialogBorder : 0;
96 inputWidgetWidth = cfg.readNumEntry( "Width", 100 );
97 93
98 setBackgroundMode( PaletteBackground ); 94 setBackgroundMode( PaletteBackground );
99 QHBoxLayout *hbox = new QHBoxLayout( this ); 95 QHBoxLayout *hbox = new QHBoxLayout( this );
100 96
101 kbdButton = new IMToolButton( this); 97 kbdButton = new IMToolButton( this);
102 kbdButton->setFocusPolicy(NoFocus); 98 kbdButton->setFocusPolicy(NoFocus);
103 kbdButton->setToggleButton( TRUE ); 99 kbdButton->setToggleButton( TRUE );
104 if (parent->sizeHint().height() > 0) 100 if (parent->sizeHint().height() > 0)
105 kbdButton->setFixedHeight( parent->sizeHint().height() ); 101 kbdButton->setFixedHeight( parent->sizeHint().height() );
106 kbdButton->setFixedWidth( 32 ); 102 kbdButton->setFixedWidth( 32 );
107 kbdButton->setAutoRaise( TRUE ); 103 kbdButton->setAutoRaise( TRUE );
108 kbdButton->setUsesBigPixmap( TRUE ); 104 kbdButton->setUsesBigPixmap( TRUE );
109 hbox->addWidget( kbdButton ); 105 hbox->addWidget( kbdButton );
110 connect( kbdButton, SIGNAL(toggled(bool)), this, SLOT(showKbd(bool)) ); 106 connect( kbdButton, SIGNAL(toggled(bool)), this, SLOT(showKbd(bool)) );
111 107
112 kbdChoice = new IMToolButton( this ); 108 kbdChoice = new IMToolButton( this );
113 kbdChoice->setFocusPolicy(NoFocus); 109 kbdChoice->setFocusPolicy(NoFocus);
114 kbdChoice->setPixmap( QPixmap( (const char **)tri_xpm ) ); 110 kbdChoice->setPixmap( QPixmap( (const char **)tri_xpm ) );
115 if (parent->sizeHint().height() > 0) 111 if (parent->sizeHint().height() > 0)
116 kbdChoice->setFixedHeight( parent->sizeHint().height() ); 112 kbdChoice->setFixedHeight( parent->sizeHint().height() );
117 kbdChoice->setFixedWidth( 13 ); 113 kbdChoice->setFixedWidth( 13 );
118 kbdChoice->setAutoRaise( TRUE ); 114 kbdChoice->setAutoRaise( TRUE );
119 hbox->addWidget( kbdChoice ); 115 hbox->addWidget( kbdChoice );
120 connect( kbdChoice, SIGNAL(clicked()), this, SLOT(chooseKbd()) ); 116 connect( kbdChoice, SIGNAL(clicked()), this, SLOT(chooseKbd()) );
121 117
122 connect( (QPEApplication*)qApp, SIGNAL(clientMoused()), 118 connect( (QPEApplication*)qApp, SIGNAL(clientMoused()),
123 this, SLOT(resetStates()) ); 119 this, SLOT(resetStates()) );
124 120
125 121
126 imButton = new QWidgetStack( this ); // later a widget stack 122 imButton = new QWidgetStack( this ); // later a widget stack
127 imButton->setFocusPolicy(NoFocus); 123 imButton->setFocusPolicy(NoFocus);
128 if (parent->sizeHint().height() > 0) 124 if (parent->sizeHint().height() > 0)
129 imButton->setFixedHeight( parent->sizeHint().height() ); 125 imButton->setFixedHeight( parent->sizeHint().height() );
130 hbox->addWidget(imButton); 126 hbox->addWidget(imButton);
131 127
132 imChoice = new QToolButton( this ); 128 imChoice = new QToolButton( this );
133 imChoice->setFocusPolicy(NoFocus); 129 imChoice->setFocusPolicy(NoFocus);
134 imChoice->setPixmap( QPixmap( (const char **)tri_xpm ) ); 130 imChoice->setPixmap( QPixmap( (const char **)tri_xpm ) );
135 if (parent->sizeHint().height() > 0) 131 if (parent->sizeHint().height() > 0)
136 imChoice->setFixedHeight( parent->sizeHint().height() ); 132 imChoice->setFixedHeight( parent->sizeHint().height() );
137 imChoice->setFixedWidth( 13 ); 133 imChoice->setFixedWidth( 13 );
138 imChoice->setAutoRaise( TRUE ); 134 imChoice->setAutoRaise( TRUE );
139 hbox->addWidget( imChoice ); 135 hbox->addWidget( imChoice );
140 connect( imChoice, SIGNAL(clicked()), this, SLOT(chooseIm()) ); 136 connect( imChoice, SIGNAL(clicked()), this, SLOT(chooseIm()) );
141 137
142 loadInputMethods(); 138 loadInputMethods();
143 139
144 QCopChannel *channel = new QCopChannel( "QPE/IME", this ); 140 QCopChannel *channel = new QCopChannel( "QPE/IME", this );
145 connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), 141 connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
146 this, SLOT(qcopReceive(const QCString&,const QByteArray&)) ); 142 this, SLOT(qcopReceive(const QCString&,const QByteArray&)) );
147} 143}
148 144
149InputMethods::~InputMethods() 145InputMethods::~InputMethods()
150{ 146{
151 Config cfg("qpe"); 147 Config cfg("qpe");
152 cfg.setGroup("InputMethod"); 148 cfg.setGroup("InputMethod");
153 if (imethod) 149 if (imethod)
154 cfg.writeEntry("im", imethod->name() ); 150 cfg.writeEntry("im", imethod->name() );
155 if (mkeyboard) 151 if (mkeyboard)
156 cfg.writeEntry("current", mkeyboard->name() ); 152 cfg.writeEntry("current", mkeyboard->name() );
157 153
158 unloadInputMethods(); 154 unloadInputMethods();
159} 155}
160 156
161void InputMethods::hideInputMethod() 157void InputMethods::hideInputMethod()
162{ 158{
163 kbdButton->setOn( FALSE ); 159 kbdButton->setOn( FALSE );
164} 160}
165 161
166void InputMethods::showInputMethod() 162void InputMethods::showInputMethod()
167{ 163{
168 kbdButton->setOn( TRUE ); 164 kbdButton->setOn( TRUE );
169} 165}
170 166
171void InputMethods::showInputMethod(const QString& name) 167void InputMethods::showInputMethod(const QString& name)
172{ 168{
173 int i = 0; 169 int i = 0;
174 QValueList<InputMethod>::Iterator it; 170 QValueList<InputMethod>::Iterator it;
175 InputMethod *im = 0; 171 InputMethod *im = 0;
176 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) { 172 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
177 QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1); 173 QString lname = (*it).libName.mid((*it).libName.findRev('/') + 1);
178 if ( (*it).name() == name || lname == name ) { 174 if ( (*it).name() == name || lname == name ) {
179 im = &(*it); 175 im = &(*it);
180 break; 176 break;
181 } 177 }
182 } 178 }
183 if ( im ) 179 if ( im )
184 chooseKeyboard(im); 180 chooseKeyboard(im);
185} 181}
186 182
187void InputMethods::resetStates() 183void InputMethods::resetStates()
188{ 184{
189 if ( mkeyboard && !mkeyboard->newIM ) 185 if ( mkeyboard && !mkeyboard->newIM )
190 mkeyboard->interface->resetState(); 186 mkeyboard->interface->resetState();
191} 187}
192 188
193QRect InputMethods::inputRect() const 189QRect InputMethods::inputRect() const
194{ 190{
195 if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() ) 191 if ( !mkeyboard || !mkeyboard->widget || !mkeyboard->widget->isVisible() )
196 return QRect(); 192 return QRect();
197 else 193 else
198 return mkeyboard->widget->geometry(); 194 return mkeyboard->widget->geometry();
199} 195}
200 196
201void InputMethods::unloadInputMethods() 197void InputMethods::unloadInputMethods()
202{ 198{
203 unloadMethod( inputMethodList ); 199 unloadMethod( inputMethodList );
204 unloadMethod( inputModifierList ); 200 unloadMethod( inputModifierList );
205 inputMethodList.clear(); 201 inputMethodList.clear();
206 inputModifierList.clear(); 202 inputModifierList.clear();
207 203
208} 204}
209 205
210void InputMethods::unloadMethod( QValueList<InputMethod>& list ) { 206void InputMethods::unloadMethod( QValueList<InputMethod>& list ) {
211 QValueList<InputMethod>::Iterator it; 207 QValueList<InputMethod>::Iterator it;
212 208
213 for (it = list.begin(); it != list.end(); ++it ) 209 for (it = list.begin(); it != list.end(); ++it )
214 (*it).releaseInterface(); 210 (*it).releaseInterface();
215 211
216} 212}
217 213
218 214
219QStringList InputMethods::plugins()const { 215QStringList InputMethods::plugins()const {
220 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods"; 216 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
221#ifdef Q_OS_MACX 217#ifdef Q_OS_MACX
222 QDir dir( path, "lib*.dylib" ); 218 QDir dir( path, "lib*.dylib" );
223#else 219#else
224 QDir dir( path, "lib*.so" ); 220 QDir dir( path, "lib*.so" );
225#endif /* Q_OS_MACX */ 221#endif /* Q_OS_MACX */
226 return dir.entryList(); 222 return dir.entryList();
227} 223}
228 224
229void InputMethods::installTranslator( const QString& type ) { 225void InputMethods::installTranslator( const QString& type ) {
230 QStringList langs = Global::languageList(); 226 QStringList langs = Global::languageList();
231 QStringList::ConstIterator lit; 227 QStringList::ConstIterator lit;
232 for ( lit= langs.begin(); lit!=langs.end(); ++lit) { 228 for ( lit= langs.begin(); lit!=langs.end(); ++lit) {
233 QString lang = *lit; 229 QString lang = *lit;
234 QTranslator * trans = new QTranslator(qApp); 230 QTranslator * trans = new QTranslator(qApp);
235 231
236 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm"; 232 QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
237 233
238 if ( trans->load( tfn )) 234 if ( trans->load( tfn ))
239 qApp->installTranslator( trans ); 235 qApp->installTranslator( trans );
240 else 236 else
241 delete trans; 237 delete trans;
242 } 238 }
243} 239}
244 240
245void InputMethods::setPreferedHandlers() { 241void InputMethods::setPreferedHandlers() {
246 Config cfg("qpe"); 242 Config cfg("qpe");
247 cfg.setGroup("InputMethod"); 243 cfg.setGroup("InputMethod");
248 QString current = cfg.readEntry("current"); 244 QString current = cfg.readEntry("current");
249 QString im = cfg.readEntry("im"); 245 QString im = cfg.readEntry("im");
250 246
251 QValueList<InputMethod>::Iterator it; 247 QValueList<InputMethod>::Iterator it;
252 if (!inputModifierList.isEmpty() && !im.isEmpty() ) { 248 if (!inputModifierList.isEmpty() && !im.isEmpty() ) {
253 for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it ) 249 for (it = inputModifierList.begin(); it != inputModifierList.end(); ++it )
254 if ( (*it).name() == im ) { 250 if ( (*it).name() == im ) {
255 imethod = &(*it); break; 251 imethod = &(*it); break;
256 } 252 }
257 253
258 } 254 }
259 if (!inputMethodList.isEmpty() && !current.isEmpty() ) { 255 if (!inputMethodList.isEmpty() && !current.isEmpty() ) {
260 for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it ) 256 for (it = inputMethodList.begin(); it != inputMethodList.end(); ++it )
261 if ( (*it).name() == current ) { 257 if ( (*it).name() == current ) {
262 owarn << "preferred keyboard is " << current << "" << oendl; 258 owarn << "preferred keyboard is " << current << "" << oendl;
263 mkeyboard = &(*it); 259 mkeyboard = &(*it);
264 kbdButton->setPixmap( *mkeyboard->icon() ); 260 kbdButton->setPixmap( *mkeyboard->icon() );
265 break; 261 break;
266 } 262 }
267 } 263 }
268 264
269} 265}
270 266
271void InputMethods::loadInputMethods() 267void InputMethods::loadInputMethods()
272{ 268{
273#ifndef QT_NO_COMPONENT 269#ifndef QT_NO_COMPONENT
274 hideInputMethod(); 270 hideInputMethod();
275 mkeyboard = 0; 271 mkeyboard = 0;
276 272
277 unloadInputMethods(); 273 unloadInputMethods();
278 274
279 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods"; 275 QString path = QPEApplication::qpeDir() + "/plugins/inputmethods";
280 QStringList list = plugins(); 276 QStringList list = plugins();
281 QStringList::Iterator it; 277 QStringList::Iterator it;
282 for ( it = list.begin(); it != list.end(); ++it ) { 278 for ( it = list.begin(); it != list.end(); ++it ) {
283 InputMethodInterface *iface = 0; 279 InputMethodInterface *iface = 0;
284 ExtInputMethodInterface *eface = 0; 280 ExtInputMethodInterface *eface = 0;
285 QLibrary *lib = new QLibrary( path + "/" + *it ); 281 QLibrary *lib = new QLibrary( path + "/" + *it );
286 282
287 if ( lib->queryInterface( IID_InputMethod, (QUnknownInterface**)&iface ) == QS_OK ) { 283 if ( lib->queryInterface( IID_InputMethod, (QUnknownInterface**)&iface ) == QS_OK ) {
288 InputMethod input; 284 InputMethod input;
289 input.newIM = FALSE; 285 input.newIM = FALSE;
290 input.library = lib; 286 input.library = lib;
291 input.libName = *it; 287 input.libName = *it;
292 input.interface = iface; 288 input.interface = iface;
293 input.widget = input.interface->inputMethod( 0, inputWidgetStyle ); 289 input.widget = input.interface->inputMethod( 0, inputWidgetStyle );
294 input.interface->onKeyPress( this, SLOT(sendKey(ushort,ushort,ushort,bool,bool)) ); 290 input.interface->onKeyPress( this, SLOT(sendKey(ushort,ushort,ushort,bool,bool)) );
295 inputMethodList.append( input ); 291 inputMethodList.append( input );
296 } else if ( lib->queryInterface( IID_ExtInputMethod, (QUnknownInterface**)&eface ) == QS_OK ) { 292 } else if ( lib->queryInterface( IID_ExtInputMethod, (QUnknownInterface**)&eface ) == QS_OK ) {
297 InputMethod input; 293 InputMethod input;
298 input.newIM = TRUE; 294 input.newIM = TRUE;
299 input.library = lib; 295 input.library = lib;
300 input.libName = *it; 296 input.libName = *it;
301 input.extInterface = eface; 297 input.extInterface = eface;
302 input.widget = input.extInterface->keyboardWidget( 0, inputWidgetStyle ); 298 input.widget = input.extInterface->keyboardWidget( 0, inputWidgetStyle );
303 // may be either a simple, or advanced. 299 // may be either a simple, or advanced.
304 if (input.widget) { 300 if (input.widget) {
305 //odebug << "its a keyboard" << oendl; 301 //odebug << "its a keyboard" << oendl;
306 inputMethodList.append( input ); 302 inputMethodList.append( input );
307 } else { 303 } else {
308 //odebug << "its a real im" << oendl; 304 //odebug << "its a real im" << oendl;
309 input.widget = input.extInterface->statusWidget( 0, 0 ); 305 input.widget = input.extInterface->statusWidget( 0, 0 );
310 if (input.widget) { 306 if (input.widget) {
311 //odebug << "blah" << oendl; 307 //odebug << "blah" << oendl;
312 inputModifierList.append( input ); 308 inputModifierList.append( input );
313 imButton->addWidget(input.widget, inputModifierList.count()); 309 imButton->addWidget(input.widget, inputModifierList.count());
314 } 310 }
315 } 311 }
316 }else{ 312 }else{
317 delete lib; 313 delete lib;
318 lib = 0l; 314 lib = 0l;
319 } 315 }
320 installTranslator( (*it).left( (*it).find(".") ) ); 316 installTranslator( (*it).left( (*it).find(".") ) );
321 } 317 }
322 qHeapSort( inputMethodList ); 318 qHeapSort( inputMethodList );
323#endif /* killed BUILT in cause they would not compile */ 319#endif /* killed BUILT in cause they would not compile */
324 320
325 QWSServer::setCurrentInputMethod( 0 ); 321 QWSServer::setCurrentInputMethod( 0 );
326 322
327 /* set the prefered IM + handler */ 323 /* set the prefered IM + handler */
328 setPreferedHandlers(); 324 setPreferedHandlers();
329 if ( !inputModifierList.isEmpty() ) { 325 if ( !inputModifierList.isEmpty() ) {
330 if (!imethod) 326 if (!imethod)
331 imethod = &inputModifierList[0]; 327 imethod = &inputModifierList[0];
332 imButton->raiseWidget(imethod->widget); 328 imButton->raiseWidget(imethod->widget);
333 QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() ); 329 QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() );
334 } else { 330 } else {
335 imethod = 0; 331 imethod = 0;
336 } 332 }
337 333
338 // we need to update keyboards afterwards, as some of them may not be compatible with 334 // we need to update keyboards afterwards, as some of them may not be compatible with
339 // the current input method 335 // the current input method
340 updateKeyboards(imethod); 336 updateKeyboards(imethod);
341 337
342 if ( !inputModifierList.isEmpty() ) 338 if ( !inputModifierList.isEmpty() )
343 imButton->show(); 339 imButton->show();
344 else 340 else
345 imButton->hide(); 341 imButton->hide();
346 342
347 if ( inputModifierList.count() > 1 ) 343 if ( inputModifierList.count() > 1 )
348 imChoice->show(); 344 imChoice->show();
349 else 345 else
350 imChoice->hide(); 346 imChoice->hide();
351} 347}
352 348
353void InputMethods::chooseKbd() 349void InputMethods::chooseKbd()
354{ 350{
355 QPopupMenu pop( this ); 351 QPopupMenu pop( this );
356 pop.setFocusPolicy( NoFocus ); //don't reset IM 352 pop.setFocusPolicy( NoFocus ); //don't reset IM
357 353
358 QString imname; 354 QString imname;
359 if (imethod) 355 if (imethod)
360 imname = imethod->libName.mid(imethod->libName.findRev('/') + 1); 356 imname = imethod->libName.mid(imethod->libName.findRev('/') + 1);
361 357
362 int i = 0; 358 int i = 0;
363 int firstDepKbd = 0; 359 int firstDepKbd = 0;
364 360
365 QValueList<InputMethod>::Iterator it; 361 QValueList<InputMethod>::Iterator it;
366 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) { 362 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it, i++ ) {
367 // add empty new items, all old items. 363 // add empty new items, all old items.
368 if (!(*it).newIM || (*it).extInterface->compatible().count() == 0 ) { 364 if (!(*it).newIM || (*it).extInterface->compatible().count() == 0 ) {
369 pop.insertItem( (*it).name(), i, firstDepKbd); 365 pop.insertItem( (*it).name(), i, firstDepKbd);
370 if ( mkeyboard == &(*it) ) 366 if ( mkeyboard == &(*it) )
371 pop.setItemChecked( i, TRUE ); 367 pop.setItemChecked( i, TRUE );
372 368
373 firstDepKbd++; 369 firstDepKbd++;
374 } else if ( (*it).extInterface->compatible().contains(imname)) { 370 } else if ( (*it).extInterface->compatible().contains(imname)) {
375 // check if we need to insert a sep. 371 // check if we need to insert a sep.
376 if (firstDepKbd == i) 372 if (firstDepKbd == i)
377 pop.insertSeparator(); 373 pop.insertSeparator();
378 pop.insertItem( (*it).name(), i, -1); 374 pop.insertItem( (*it).name(), i, -1);
379 if ( mkeyboard == &(*it) ) 375 if ( mkeyboard == &(*it) )
380 pop.setItemChecked( i, TRUE ); 376 pop.setItemChecked( i, TRUE );
381 } 377 }
382 } 378 }
383 379
384 QPoint pt = mapToGlobal(kbdChoice->geometry().topRight()); 380 QPoint pt = mapToGlobal(kbdChoice->geometry().topRight());
385 QSize s = pop.sizeHint(); 381 QSize s = pop.sizeHint();
386 pt.ry() -= s.height(); 382 pt.ry() -= s.height();
387 pt.rx() -= s.width(); 383 pt.rx() -= s.width();
388 i = pop.exec( pt ); 384 i = pop.exec( pt );
389 if ( i == -1 ) 385 if ( i == -1 )
390 return; 386 return;
391 InputMethod *im = &inputMethodList[i]; 387 InputMethod *im = &inputMethodList[i];
392 chooseKeyboard(im); 388 chooseKeyboard(im);
393} 389}
394 390
395void InputMethods::chooseIm() 391void InputMethods::chooseIm()
396{ 392{
397 QPopupMenu pop( this ); 393 QPopupMenu pop( this );
398 394
399 int i = 0; 395 int i = 0;
400 QValueList<InputMethod>::Iterator it; 396 QValueList<InputMethod>::Iterator it;
401 for ( it = inputModifierList.begin(); it != inputModifierList.end(); ++it, i++ ) { 397 for ( it = inputModifierList.begin(); it != inputModifierList.end(); ++it, i++ ) {
402 pop.insertItem( (*it).name(), i ); 398 pop.insertItem( (*it).name(), i );
403 if ( imethod == &(*it) ) 399 if ( imethod == &(*it) )
404 pop.setItemChecked( i, TRUE ); 400 pop.setItemChecked( i, TRUE );
405 } 401 }
406 402
407 QPoint pt = mapToGlobal(imChoice->geometry().topRight()); 403 QPoint pt = mapToGlobal(imChoice->geometry().topRight());
408 QSize s = pop.sizeHint(); 404 QSize s = pop.sizeHint();
409 pt.ry() -= s.height(); 405 pt.ry() -= s.height();
410 pt.rx() -= s.width(); 406 pt.rx() -= s.width();
411 i = pop.exec( pt ); 407 i = pop.exec( pt );
412 if ( i == -1 ) 408 if ( i == -1 )
413 return; 409 return;
414 InputMethod *im = &inputModifierList[i]; 410 InputMethod *im = &inputModifierList[i];
415 411
416 chooseMethod(im); 412 chooseMethod(im);
417} 413}
418 414
419void InputMethods::chooseKeyboard(InputMethod* im) 415void InputMethods::chooseKeyboard(InputMethod* im)
420{ 416{
421 if ( im != mkeyboard ) { 417 if ( im != mkeyboard ) {
422 if ( mkeyboard && mkeyboard->widget->isVisible() ) 418 if ( mkeyboard && mkeyboard->widget->isVisible() )
423 mkeyboard->widget->hide(); 419 mkeyboard->widget->hide();
424 mkeyboard = im; 420 mkeyboard = im;
425 kbdButton->setPixmap( *mkeyboard->icon() ); 421 kbdButton->setPixmap( *mkeyboard->icon() );
426 } 422 }
427 if ( !kbdButton->isOn() ) 423 if ( !kbdButton->isOn() )
428 kbdButton->setOn( TRUE ); 424 kbdButton->setOn( TRUE );
429 else 425 else
430 showKbd( TRUE ); 426 showKbd( TRUE );
431} 427}
432 428
433static bool keyboardCompatible(InputMethod *keyb, const QString &imname ) 429static bool keyboardCompatible(InputMethod *keyb, const QString &imname )
434{ 430{
435 if ( !keyb || !keyb->newIM || !keyb->extInterface->compatible().count() ) 431 if ( !keyb || !keyb->newIM || !keyb->extInterface->compatible().count() )
436 return TRUE; 432 return TRUE;
437 433
438 if ( keyb->extInterface->compatible().contains(imname) ) 434 if ( keyb->extInterface->compatible().contains(imname) )
439 return TRUE; 435 return TRUE;
440 436
441 return FALSE; 437 return FALSE;
442} 438}
443 439
444// Updates the display of the soft keyboards available to the current input method 440// Updates the display of the soft keyboards available to the current input method
445void InputMethods::updateKeyboards(InputMethod *im ) 441void InputMethods::updateKeyboards(InputMethod *im )
446{ 442{
447 uint count; 443 uint count;
448 444
449 if ( im ) { 445 if ( im ) {
450 QString imname = im->libName.mid(im->libName.findRev('/') + 1); 446 QString imname = im->libName.mid(im->libName.findRev('/') + 1);
451 447
452 if ( mkeyboard && !keyboardCompatible(mkeyboard, imname) ) { 448 if ( mkeyboard && !keyboardCompatible(mkeyboard, imname) ) {
453 kbdButton->setOn( FALSE ); 449 kbdButton->setOn( FALSE );
454 showKbd( FALSE ); 450 showKbd( FALSE );
455 mkeyboard = 0; 451 mkeyboard = 0;
456 } 452 }
457 453
458 count = 0; 454 count = 0;
459 455
460 QValueList<InputMethod>::Iterator it; 456 QValueList<InputMethod>::Iterator it;
461 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it ) { 457 for ( it = inputMethodList.begin(); it != inputMethodList.end(); ++it ) {
462 if ( keyboardCompatible( &(*it), imname ) ) { 458 if ( keyboardCompatible( &(*it), imname ) ) {
463 if ( !mkeyboard ) { 459 if ( !mkeyboard ) {
464 mkeyboard = &(*it); 460 mkeyboard = &(*it);
465 kbdButton->setPixmap( *mkeyboard->icon() ); 461 kbdButton->setPixmap( *mkeyboard->icon() );
466 } 462 }
467 463
468 count++; 464 count++;
469 } 465 }
470 } 466 }
471 } else { 467 } else {
472 count = inputMethodList.count(); 468 count = inputMethodList.count();
473 if ( count && !mkeyboard ) { 469 if ( count && !mkeyboard ) {
474 mkeyboard = &inputMethodList[0]; 470 mkeyboard = &inputMethodList[0];
475 kbdButton->setPixmap( *mkeyboard->icon() ); 471 kbdButton->setPixmap( *mkeyboard->icon() );
476 } else if (!count){ 472 } else if (!count){
477 mkeyboard = 0; //might be redundant 473 mkeyboard = 0; //might be redundant
478 } 474 }
479 } 475 }
480 476
481 if ( count > 1 ) 477 if ( count > 1 )
482 kbdChoice->show(); 478 kbdChoice->show();
483 else 479 else
484 kbdChoice->hide(); 480 kbdChoice->hide();
485 481
486 if ( count ) 482 if ( count )
487 kbdButton->show(); 483 kbdButton->show();
488 else 484 else
489 kbdButton->hide(); 485 kbdButton->hide();
490} 486}
491 487
492void InputMethods::chooseMethod(InputMethod* im) 488void InputMethods::chooseMethod(InputMethod* im)
493{ 489{
494 if ( im != imethod ) { 490 if ( im != imethod ) {
495 updateKeyboards( im ); 491 updateKeyboards( im );
496 492
497 Config cfg("qpe"); 493 Config cfg("qpe");
498 cfg.setGroup("InputMethod"); 494 cfg.setGroup("InputMethod");
499 if (im ) 495 if (im )
500 cfg.writeEntry("im", im->name() ); 496 cfg.writeEntry("im", im->name() );
501 if (mkeyboard) 497 if (mkeyboard)
502 cfg.writeEntry("current", mkeyboard->name() ); 498 cfg.writeEntry("current", mkeyboard->name() );
503 499
504 QWSServer::setCurrentInputMethod( 0 ); 500 QWSServer::setCurrentInputMethod( 0 );
505 imethod = im; 501 imethod = im;
506 if ( imethod && imethod->newIM ) 502 if ( imethod && imethod->newIM )
507 QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() ); 503 QWSServer::setCurrentInputMethod( imethod->extInterface->inputMethod() );
508 else 504 else
509 QWSServer::setCurrentInputMethod( 0 ); 505 QWSServer::setCurrentInputMethod( 0 );
510 506
511 if ( im ) 507 if ( im )
512 imButton->raiseWidget(im->widget); 508 imButton->raiseWidget(im->widget);
513 else 509 else
514 imButton->hide(); //### good UI? make sure it is shown again! 510 imButton->hide(); //### good UI? make sure it is shown again!
515 } 511 }
516} 512}
517 513
518void InputMethods::qcopReceive( const QCString &msg, const QByteArray &data ) 514void InputMethods::qcopReceive( const QCString &msg, const QByteArray &data )
519{ 515{
520 if ( imethod && imethod->newIM ) 516 if ( imethod && imethod->newIM )
521 imethod->extInterface->qcopReceive( msg, data ); 517 imethod->extInterface->qcopReceive( msg, data );
522} 518}
523 519
524 520
525void InputMethods::showKbd( bool on ) 521void InputMethods::showKbd( bool on )
526{ 522{
527 if ( !mkeyboard ) 523 if ( !mkeyboard )
528 return; 524 return;
529 525
530 if ( on ) 526 if ( on )
531 { 527 {
532 mkeyboard->resetState(); 528 mkeyboard->resetState();
533 529
534 int height = QMIN( mkeyboard->widget->sizeHint().height(), 134 ); 530 int height = QMIN( mkeyboard->widget->sizeHint().height(), 134 );
535 int width = qApp->desktop()->width() * (inputWidgetWidth*0.01); 531 int width = static_cast<int>( qApp->desktop()->width() * (inputWidgetWidth*0.01) );
536 int left = 0; 532 int left = 0;
537 int top = mapToGlobal( QPoint() ).y() - height; 533 int top = mapToGlobal( QPoint() ).y() - height;
538 534
539 if ( inputWidgetStyle & QWidget::WStyle_DialogBorder ) 535 if ( inputWidgetStyle & QWidget::WStyle_DialogBorder )
540 { 536 {
541 odebug << "InputMethods: reading geometry." << oendl; 537 odebug << "InputMethods: reading geometry." << oendl;
542 Config cfg( "Launcher" ); 538 Config cfg( "Launcher" );
543 cfg.setGroup( "InputMethods" ); 539 cfg.setGroup( "InputMethods" );
544 int l = cfg.readNumEntry( "absX", -1 ); 540 int l = cfg.readNumEntry( "absX", -1 );
545 int t = cfg.readNumEntry( "absY", -1 ); 541 int t = cfg.readNumEntry( "absY", -1 );
546 int w = cfg.readNumEntry( "absWidth", -1 ); 542 int w = cfg.readNumEntry( "absWidth", -1 );
547 int h = cfg.readNumEntry( "absHeight", -1 ); 543 int h = cfg.readNumEntry( "absHeight", -1 );
548 544
549 if ( l > -1 && t > -1 && w > -1 && h > -1 ) 545 if ( l > -1 && t > -1 && w > -1 && h > -1 )
550 { 546 {
551 odebug << "InputMethods: config values ( " << l << ", " << t << ", " << w << ", " << h << " ) are ok." << oendl; 547 odebug << "InputMethods: config values ( " << l << ", " << t << ", " << w << ", " << h << " ) are ok." << oendl;
552 left = l; 548 left = l;
553 top = t; 549 top = t;
554 width = w; 550 width = w;
555 height = h; 551 height = h;
556 } 552 }
557 else 553 else
558 { 554 {
559 odebug << "InputMethods: config values are new or not ok." << oendl; 555 odebug << "InputMethods: config values are new or not ok." << oendl;
560 } 556 }
561 } 557 }
562 else 558 else
563 { 559 {
564 odebug << "InputMethods: no floating selected." << oendl; 560 odebug << "InputMethods: no floating selected." << oendl;
565 } 561 }
566 mkeyboard->widget->resize( width, height ); 562 mkeyboard->widget->resize( width, height );
567 mkeyboard->widget->move( left, top ); 563 mkeyboard->widget->move( left, top );
568 mkeyboard->widget->show(); 564 mkeyboard->widget->show();
569 mkeyboard->widget->installEventFilter( this ); 565 mkeyboard->widget->installEventFilter( this );
570 } 566 }
571 else 567 else
572 { 568 {
573 if ( inputWidgetStyle & QWidget::WStyle_DialogBorder ) 569 if ( inputWidgetStyle & QWidget::WStyle_DialogBorder )
574 { 570 {
575 QPoint pos = mkeyboard->widget->pos(); 571 QPoint pos = mkeyboard->widget->pos();
576 QSize siz = mkeyboard->widget->size(); 572 QSize siz = mkeyboard->widget->size();
577 odebug << "InputMethods: saving geometry." << oendl; 573 odebug << "InputMethods: saving geometry." << oendl;
578 Config cfg( "Launcher" ); 574 Config cfg( "Launcher" );
579 cfg.setGroup( "InputMethods" ); 575 cfg.setGroup( "InputMethods" );
580 cfg.writeEntry( "absX", pos.x() ); 576 cfg.writeEntry( "absX", pos.x() );
581 cfg.writeEntry( "absY", pos.y() ); 577 cfg.writeEntry( "absY", pos.y() );
582 cfg.writeEntry( "absWidth", siz.width() ); 578 cfg.writeEntry( "absWidth", siz.width() );
583 cfg.writeEntry( "absHeight", siz.height() ); 579 cfg.writeEntry( "absHeight", siz.height() );
584 cfg.write(); 580 cfg.write();
585 mkeyboard->widget->removeEventFilter( this ); 581 mkeyboard->widget->removeEventFilter( this );
586 } 582 }
587 mkeyboard->widget->hide(); 583 mkeyboard->widget->hide();
588 } 584 }
589 585
590 emit inputToggled( on ); 586 emit inputToggled( on );
591} 587}
592 588
593bool InputMethods::shown() const 589bool InputMethods::shown() const
594{ 590{
595 return mkeyboard && mkeyboard->widget->isVisible(); 591 return mkeyboard && mkeyboard->widget->isVisible();
596} 592}
597 593
598QString InputMethods::currentShown() const 594QString InputMethods::currentShown() const
599{ 595{
600 return mkeyboard && mkeyboard->widget->isVisible() 596 return mkeyboard && mkeyboard->widget->isVisible()
601 ? mkeyboard->name() : QString::null; 597 ? mkeyboard->name() : QString::null;
602} 598}
603 599
604void InputMethods::sendKey( ushort unicode, ushort scancode, ushort mod, bool press, bool repeat ) 600void InputMethods::sendKey( ushort unicode, ushort scancode, ushort mod, bool press, bool repeat )
605{ 601{
606#if defined(Q_WS_QWS) 602#if defined(Q_WS_QWS)
607 QWSServer::sendKeyEvent( unicode, scancode, mod, press, repeat ); 603 QWSServer::sendKeyEvent( unicode, scancode, mod, press, repeat );
608#endif 604#endif
609} 605}
610 606
611bool InputMethods::eventFilter( QObject* o, QEvent* e ) 607bool InputMethods::eventFilter( QObject* , QEvent* e )
612{ 608{
613 if ( e->type() == QEvent::Close ) 609 if ( e->type() == QEvent::Close )
614 { 610 {
615 ( (QCloseEvent*) e )->ignore(); 611 ( (QCloseEvent*) e )->ignore();
616 showKbd( false ); 612 showKbd( false );
617 kbdButton->setOn( false ); 613 kbdButton->setOn( false );
618 return true; 614 return true;
619 } 615 }
620 return false; 616 return false;
621} 617}
618
619void InputMethods::readConfig() {
620 Config cfg( "Launcher" );
621 cfg.setGroup( "InputMethods" );
622
623 inputWidgetStyle = QWidget::WStyle_Customize | QWidget::WStyle_StaysOnTop | QWidget::WGroupLeader | QWidget::WStyle_Tool;
624 inputWidgetStyle |= cfg.readBoolEntry( "Float", false ) ?
625 QWidget::WStyle_DialogBorder : 0;
626 inputWidgetWidth = cfg.readNumEntry( "Width", 100 );
627}
diff --git a/core/launcher/inputmethods.h b/core/launcher/inputmethods.h
index 55ac020..2e0b1e8 100644
--- a/core/launcher/inputmethods.h
+++ b/core/launcher/inputmethods.h
@@ -1,113 +1,114 @@
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**********************************************************************/ 19**********************************************************************/
20 20
21#ifndef __INPUT_METHODS_H__ 21#ifndef __INPUT_METHODS_H__
22#define __INPUT_METHODS_H__ 22#define __INPUT_METHODS_H__
23 23
24#include <qtopia/qlibrary.h> 24#include <qtopia/qlibrary.h>
25#include <qtopia/inputmethodinterface.h> 25#include <qtopia/inputmethodinterface.h>
26 26
27#include <qwidget.h> 27#include <qwidget.h>
28#include <qvaluelist.h> 28#include <qvaluelist.h>
29 29
30class QToolButton; 30class QToolButton;
31class QWidgetStack; 31class QWidgetStack;
32 32
33struct InputMethod 33struct InputMethod
34{ 34{
35#ifndef QT_NO_COMPONENT 35#ifndef QT_NO_COMPONENT
36 QLibrary *library; 36 QLibrary *library;
37#endif 37#endif
38 QWidget *widget; 38 QWidget *widget;
39 QString libName; 39 QString libName;
40 bool newIM; 40 bool newIM;
41 union { 41 union {
42 InputMethodInterface *interface; 42 InputMethodInterface *interface;
43 ExtInputMethodInterface *extInterface; 43 ExtInputMethodInterface *extInterface;
44 }; 44 };
45 45
46 inline void releaseInterface() { 46 inline void releaseInterface() {
47 newIM ? (void)extInterface->release() : (void)interface->release(); 47 newIM ? (void)extInterface->release() : (void)interface->release();
48 library->unload(); 48 library->unload();
49 delete library; library = 0l; 49 delete library; library = 0l;
50 } 50 }
51 inline QString name() const { return newIM ? extInterface->name() : interface->name(); } 51 inline QString name() const { return newIM ? extInterface->name() : interface->name(); }
52 inline QPixmap *icon() const { return newIM ? extInterface->icon() : interface->icon(); } 52 inline QPixmap *icon() const { return newIM ? extInterface->icon() : interface->icon(); }
53 inline QUnknownInterface *iface() { return newIM ? (QUnknownInterface *)extInterface : (QUnknownInterface *)interface; } 53 inline QUnknownInterface *iface() { return newIM ? (QUnknownInterface *)extInterface : (QUnknownInterface *)interface; }
54 inline void resetState() { if ( !newIM ) interface->resetState(); } 54 inline void resetState() { if ( !newIM ) interface->resetState(); }
55 55
56 int operator <(const InputMethod& o) const; 56 int operator <(const InputMethod& o) const;
57 int operator >(const InputMethod& o) const; 57 int operator >(const InputMethod& o) const;
58 int operator <=(const InputMethod& o) const; 58 int operator <=(const InputMethod& o) const;
59}; 59};
60 60
61class InputMethods : public QWidget 61class InputMethods : public QWidget
62{ 62{
63 Q_OBJECT 63 Q_OBJECT
64public: 64public:
65 InputMethods( QWidget * ); 65 InputMethods( QWidget * );
66 ~InputMethods(); 66 ~InputMethods();
67 67
68 QRect inputRect() const; 68 QRect inputRect() const;
69 bool shown() const; 69 bool shown() const;
70 QString currentShown() const; // name of interface 70 QString currentShown() const; // name of interface
71 void showInputMethod(const QString& id); 71 void showInputMethod(const QString& id);
72 void showInputMethod(); 72 void showInputMethod();
73 void hideInputMethod(); 73 void hideInputMethod();
74 void unloadInputMethods(); 74 void unloadInputMethods();
75 void loadInputMethods(); 75 void loadInputMethods();
76 virtual bool eventFilter( QObject *, QEvent * ); 76 virtual bool eventFilter( QObject *, QEvent * );
77 void readConfig();
77 78
78signals: 79signals:
79 void inputToggled( bool on ); 80 void inputToggled( bool on );
80 81
81private slots: 82private slots:
82 void chooseKbd(); 83 void chooseKbd();
83 void chooseIm(); 84 void chooseIm();
84 void showKbd( bool ); 85 void showKbd( bool );
85 void resetStates(); 86 void resetStates();
86 void sendKey( ushort unicode, ushort scancode, ushort modifiers, bool, bool ); 87 void sendKey( ushort unicode, ushort scancode, ushort modifiers, bool, bool );
87 void qcopReceive( const QCString &msg, const QByteArray &data ); 88 void qcopReceive( const QCString &msg, const QByteArray &data );
88 89
89private: 90private:
90 void setPreferedHandlers(); 91 void setPreferedHandlers();
91 /*static */QStringList plugins()const; 92 /*static */QStringList plugins()const;
92 /*static */void installTranslator( const QString& ); 93 /*static */void installTranslator( const QString& );
93 void unloadMethod( QValueList<InputMethod>& ); 94 void unloadMethod( QValueList<InputMethod>& );
94 void chooseMethod(InputMethod* im); 95 void chooseMethod(InputMethod* im);
95 void chooseKeyboard(InputMethod* im); 96 void chooseKeyboard(InputMethod* im);
96 void updateKeyboards(InputMethod *im); 97 void updateKeyboards(InputMethod *im);
97 98
98private: 99private:
99 QToolButton *kbdButton; 100 QToolButton *kbdButton;
100 QToolButton *kbdChoice; 101 QToolButton *kbdChoice;
101 QWidgetStack *imButton; // later will be widget stack 102 QWidgetStack *imButton; // later will be widget stack
102 QToolButton *imChoice; 103 QToolButton *imChoice;
103 InputMethod *mkeyboard; 104 InputMethod *mkeyboard;
104 InputMethod *imethod; 105 InputMethod *imethod;
105 QValueList<InputMethod> inputMethodList; 106 QValueList<InputMethod> inputMethodList;
106 QValueList<InputMethod> inputModifierList; 107 QValueList<InputMethod> inputModifierList;
107 int inputWidgetStyle; 108 int inputWidgetStyle;
108 int inputWidgetWidth; 109 int inputWidgetWidth;
109}; 110};
110 111
111 112
112#endif // __INPUT_METHODS_H__ 113#endif // __INPUT_METHODS_H__
113 114
diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp
index abe238f..63361fe 100644
--- a/core/launcher/taskbar.cpp
+++ b/core/launcher/taskbar.cpp
@@ -1,380 +1,387 @@
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**********************************************************************/ 19**********************************************************************/
20 20
21#include "startmenu.h" 21#include "startmenu.h"
22#include "inputmethods.h" 22#include "inputmethods.h"
23#include "runningappbar.h" 23#include "runningappbar.h"
24#include "systray.h" 24#include "systray.h"
25#include "wait.h" 25#include "wait.h"
26#include "appicons.h" 26#include "appicons.h"
27 27
28#include "taskbar.h" 28#include "taskbar.h"
29#include "server.h" 29#include "server.h"
30 30
31/* OPIE */ 31/* OPIE */
32#include <opie2/odebug.h> 32#include <opie2/odebug.h>
33#include <qtopia/config.h> 33#include <qtopia/config.h>
34#include <qtopia/qpeapplication.h> 34#include <qtopia/qpeapplication.h>
35#ifdef QWS 35#ifdef QWS
36#include <qtopia/qcopenvelope_qws.h> 36#include <qtopia/qcopenvelope_qws.h>
37#endif 37#endif
38#include <qtopia/global.h> 38#include <qtopia/global.h>
39using namespace Opie::Core; 39using namespace Opie::Core;
40 40
41/* QT */ 41/* QT */
42#include <qlabel.h> 42#include <qlabel.h>
43#include <qlayout.h> 43#include <qlayout.h>
44#include <qtimer.h> 44#include <qtimer.h>
45#ifdef QWS 45#ifdef QWS
46#include <qwindowsystem_qws.h> 46#include <qwindowsystem_qws.h>
47#endif 47#endif
48#include <qwidgetstack.h> 48#include <qwidgetstack.h>
49 49
50#if defined( Q_WS_QWS ) 50#if defined( Q_WS_QWS )
51#include <qwsdisplay_qws.h> 51#include <qwsdisplay_qws.h>
52#include <qgfx_qws.h> 52#include <qgfx_qws.h>
53#endif 53#endif
54 54
55 55
56static bool initNumLock() 56static bool initNumLock()
57{ 57{
58#ifdef QPE_INITIAL_NUMLOCK_STATE 58#ifdef QPE_INITIAL_NUMLOCK_STATE
59 QPE_INITIAL_NUMLOCK_STATE 59 QPE_INITIAL_NUMLOCK_STATE
60#endif 60#endif
61 return FALSE; 61 return FALSE;
62} 62}
63 63
64//--------------------------------------------------------------------------- 64//---------------------------------------------------------------------------
65 65
66class SafeMode : public QWidget 66class SafeMode : public QWidget
67{ 67{
68 Q_OBJECT 68 Q_OBJECT
69public: 69public:
70 SafeMode( QWidget *parent ) : QWidget( parent ), menu(0) 70 SafeMode( QWidget *parent ) : QWidget( parent ), menu(0)
71 { 71 {
72 message = tr("Safe Mode"); 72 message = tr("Safe Mode");
73 QFont f( font() ); 73 QFont f( font() );
74 f.setWeight( QFont::Bold ); 74 f.setWeight( QFont::Bold );
75 setFont( f ); 75 setFont( f );
76 } 76 }
77 77
78 void mousePressEvent( QMouseEvent *); 78 void mousePressEvent( QMouseEvent *);
79 QSize sizeHint() const; 79 QSize sizeHint() const;
80 void paintEvent( QPaintEvent* ); 80 void paintEvent( QPaintEvent* );
81 81
82private slots: 82private slots:
83 void action(int i); 83 void action(int i);
84 84
85private: 85private:
86 QString message; 86 QString message;
87 QPopupMenu *menu; 87 QPopupMenu *menu;
88}; 88};
89 89
90void SafeMode::mousePressEvent( QMouseEvent *) 90void SafeMode::mousePressEvent( QMouseEvent *)
91{ 91{
92 if ( !menu ) { 92 if ( !menu ) {
93 menu = new QPopupMenu(this); 93 menu = new QPopupMenu(this);
94 menu->insertItem( tr("Plugin Manager..."), 0 ); 94 menu->insertItem( tr("Plugin Manager..."), 0 );
95 menu->insertItem( tr("Restart Qtopia"), 1 ); 95 menu->insertItem( tr("Restart Qtopia"), 1 );
96 menu->insertItem( tr("Help..."), 2 ); 96 menu->insertItem( tr("Help..."), 2 );
97 connect(menu, SIGNAL(activated(int)), this, SLOT(action(int))); 97 connect(menu, SIGNAL(activated(int)), this, SLOT(action(int)));
98 } 98 }
99 QPoint curPos = mapToGlobal( QPoint(0,0) ); 99 QPoint curPos = mapToGlobal( QPoint(0,0) );
100 QSize sh = menu->sizeHint(); 100 QSize sh = menu->sizeHint();
101 menu->popup( curPos-QPoint((sh.width()-width())/2,sh.height()) ); 101 menu->popup( curPos-QPoint((sh.width()-width())/2,sh.height()) );
102} 102}
103 103
104void SafeMode::action(int i) 104void SafeMode::action(int i)
105{ 105{
106 switch (i) { 106 switch (i) {
107 case 0: 107 case 0:
108 Global::execute( "pluginmanager" ); 108 Global::execute( "pluginmanager" );
109 break; 109 break;
110 case 1: 110 case 1:
111 Global::restart(); 111 Global::restart();
112 break; 112 break;
113 case 2: 113 case 2:
114 Global::execute( "helpbrowser", "safemode.html" ); 114 Global::execute( "helpbrowser", "safemode.html" );
115 break; 115 break;
116 } 116 }
117} 117}
118 118
119QSize SafeMode::sizeHint() const 119QSize SafeMode::sizeHint() const
120{ 120{
121 QFontMetrics fm = fontMetrics(); 121 QFontMetrics fm = fontMetrics();
122 122
123 return QSize( fm.width(message), fm.height() ); 123 return QSize( fm.width(message), fm.height() );
124} 124}
125 125
126void SafeMode::paintEvent( QPaintEvent* ) 126void SafeMode::paintEvent( QPaintEvent* )
127{ 127{
128 QPainter p(this); 128 QPainter p(this);
129 p.drawText( rect(), AlignCenter, message ); 129 p.drawText( rect(), AlignCenter, message );
130} 130}
131 131
132//--------------------------------------------------------------------------- 132//---------------------------------------------------------------------------
133 133
134class LockKeyState : public QWidget 134class LockKeyState : public QWidget
135{ 135{
136public: 136public:
137 LockKeyState( QWidget *parent ) : 137 LockKeyState( QWidget *parent ) :
138 QWidget(parent), 138 QWidget(parent),
139 nl(initNumLock()), cl(FALSE) 139 nl(initNumLock()), cl(FALSE)
140 { 140 {
141 nl_pm = Resource::loadPixmap("numlock"); 141 nl_pm = Resource::loadPixmap("numlock");
142 cl_pm = Resource::loadPixmap("capslock"); 142 cl_pm = Resource::loadPixmap("capslock");
143 } 143 }
144 QSize sizeHint() const 144 QSize sizeHint() const
145 { 145 {
146 return QSize(nl_pm.width()+2,nl_pm.width()+nl_pm.height()+1); 146 return QSize(nl_pm.width()+2,nl_pm.width()+nl_pm.height()+1);
147 } 147 }
148 void toggleNumLockState() 148 void toggleNumLockState()
149 { 149 {
150 nl = !nl; repaint(); 150 nl = !nl; repaint();
151 } 151 }
152 void toggleCapsLockState() 152 void toggleCapsLockState()
153 { 153 {
154 cl = !cl; repaint(); 154 cl = !cl; repaint();
155 } 155 }
156 void paintEvent( QPaintEvent * ) 156 void paintEvent( QPaintEvent * )
157 { 157 {
158 int y = (height()-sizeHint().height())/2; 158 int y = (height()-sizeHint().height())/2;
159 QPainter p(this); 159 QPainter p(this);
160 if ( nl ) 160 if ( nl )
161 p.drawPixmap(1,y,nl_pm); 161 p.drawPixmap(1,y,nl_pm);
162 if ( cl ) 162 if ( cl )
163 p.drawPixmap(1,y+nl_pm.height()+1,cl_pm); 163 p.drawPixmap(1,y+nl_pm.height()+1,cl_pm);
164 } 164 }
165private: 165private:
166 QPixmap nl_pm, cl_pm; 166 QPixmap nl_pm, cl_pm;
167 bool nl, cl; 167 bool nl, cl;
168}; 168};
169 169
170//--------------------------------------------------------------------------- 170//---------------------------------------------------------------------------
171 171
172TaskBar::~TaskBar() 172TaskBar::~TaskBar()
173{ 173{
174} 174}
175 175
176 176
177TaskBar::TaskBar() : QHBox(0, 0, WStyle_Customize | WStyle_Tool | WStyle_StaysOnTop | WGroupLeader) 177TaskBar::TaskBar() : QHBox(0, 0, WStyle_Customize | WStyle_Tool | WStyle_StaysOnTop | WGroupLeader)
178{ 178{
179 Config cfg( "Launcher" ); 179 /* Read InputMethod Config */
180 cfg.setGroup( "InputMethods" ); 180 readConfig();
181 resizeRunningApp = cfg.readBoolEntry( "Resize", true );
182 181
183 sm = new StartMenu( this ); 182 sm = new StartMenu( this );
184 connect( sm, SIGNAL(tabSelected(const QString&)), this, 183 connect( sm, SIGNAL(tabSelected(const QString&)), this,
185 SIGNAL(tabSelected(const QString&)) ); 184 SIGNAL(tabSelected(const QString&)) );
186 185
187 inputMethods = new InputMethods( this ); 186 inputMethods = new InputMethods( this );
188 connect( inputMethods, SIGNAL(inputToggled(bool)), 187 connect( inputMethods, SIGNAL(inputToggled(bool)),
189 this, SLOT(calcMaxWindowRect()) ); 188 this, SLOT(calcMaxWindowRect()) );
190 189
191 stack = new QWidgetStack( this ); 190 stack = new QWidgetStack( this );
192 stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); 191 stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) );
193 label = new QLabel(stack); 192 label = new QLabel(stack);
194 193
195 runningAppBar = new RunningAppBar(stack); 194 runningAppBar = new RunningAppBar(stack);
196 stack->raiseWidget(runningAppBar); 195 stack->raiseWidget(runningAppBar);
197 196
198 waitIcon = new Wait( this ); 197 waitIcon = new Wait( this );
199 (void) new AppIcons( this ); 198 (void) new AppIcons( this );
200 199
201 sysTray = new SysTray( this ); 200 sysTray = new SysTray( this );
202 201
203 /* ### FIXME plugin loader and safe mode */ 202 /* ### FIXME plugin loader and safe mode */
204#if 0 203#if 0
205 if (PluginLoader::inSafeMode()) 204 if (PluginLoader::inSafeMode())
206 (void)new SafeMode( this ); 205 (void)new SafeMode( this );
207#endif 206#endif
208 207
209 // ## make customizable in some way? 208 // ## make customizable in some way?
210#ifdef OPIE_TASKBAR_LOCK_KEY_STATE 209#ifdef OPIE_TASKBAR_LOCK_KEY_STATE
211 lockState = new LockKeyState( this ); 210 lockState = new LockKeyState( this );
212#else 211#else
213 lockState = 0; 212 lockState = 0;
214#endif 213#endif
215 214
216#if defined(Q_WS_QWS) 215#if defined(Q_WS_QWS)
217#if !defined(QT_NO_COP) 216#if !defined(QT_NO_COP)
218 QCopChannel *channel = new QCopChannel( "QPE/TaskBar", this ); 217 QCopChannel *channel = new QCopChannel( "QPE/TaskBar", this );
219 connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), 218 connect( channel, SIGNAL(received(const QCString&,const QByteArray&)),
220 this, SLOT(receive(const QCString&,const QByteArray&)) ); 219 this, SLOT(receive(const QCString&,const QByteArray&)) );
221#endif 220#endif
222#endif 221#endif
223 waitTimer = new QTimer( this ); 222 waitTimer = new QTimer( this );
224 connect( waitTimer, SIGNAL( timeout() ), this, SLOT( stopWait() ) ); 223 connect( waitTimer, SIGNAL( timeout() ), this, SLOT( stopWait() ) );
225 clearer = new QTimer( this ); 224 clearer = new QTimer( this );
226 QObject::connect(clearer, SIGNAL(timeout()), SLOT(clearStatusBar())); 225 QObject::connect(clearer, SIGNAL(timeout()), SLOT(clearStatusBar()));
227 226
228 connect( qApp, SIGNAL(symbol()), this, SLOT(toggleSymbolInput()) ); 227 connect( qApp, SIGNAL(symbol()), this, SLOT(toggleSymbolInput()) );
229 connect( qApp, SIGNAL(numLockStateToggle()), this, SLOT(toggleNumLockState()) ); 228 connect( qApp, SIGNAL(numLockStateToggle()), this, SLOT(toggleNumLockState()) );
230 connect( qApp, SIGNAL(capsLockStateToggle()), this, SLOT(toggleCapsLockState()) ); 229 connect( qApp, SIGNAL(capsLockStateToggle()), this, SLOT(toggleCapsLockState()) );
231} 230}
232 231
233void TaskBar::setStatusMessage( const QString &text ) 232void TaskBar::setStatusMessage( const QString &text )
234{ 233{
235 if ( !text.isEmpty() ) { 234 if ( !text.isEmpty() ) {
236 label->setText( text ); 235 label->setText( text );
237 stack->raiseWidget( label ); 236 stack->raiseWidget( label );
238 if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) ) 237 if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) )
239 sysTray->hide(); 238 sysTray->hide();
240 clearer->start( 3000, TRUE ); 239 clearer->start( 3000, TRUE );
241 } else { 240 } else {
242 clearStatusBar(); 241 clearStatusBar();
243 } 242 }
244} 243}
245 244
246void TaskBar::clearStatusBar() 245void TaskBar::clearStatusBar()
247{ 246{
248 label->clear(); 247 label->clear();
249 stack->raiseWidget(runningAppBar); 248 stack->raiseWidget(runningAppBar);
250 if ( sysTray ) 249 if ( sysTray )
251 sysTray->show(); 250 sysTray->show();
252 // stack->raiseWidget( mru ); 251 // stack->raiseWidget( mru );
253} 252}
254 253
255void TaskBar::startWait() 254void TaskBar::startWait()
256{ 255{
257 waitIcon->setWaiting( true ); 256 waitIcon->setWaiting( true );
258 // a catchall stop after 10 seconds... 257 // a catchall stop after 10 seconds...
259 waitTimer->start( 10 * 1000, true ); 258 waitTimer->start( 10 * 1000, true );
260} 259}
261 260
262void TaskBar::stopWait(const QString&) 261void TaskBar::stopWait(const QString&)
263{ 262{
264 waitTimer->stop(); 263 waitTimer->stop();
265 waitIcon->setWaiting( false ); 264 waitIcon->setWaiting( false );
266} 265}
267 266
268void TaskBar::stopWait() 267void TaskBar::stopWait()
269{ 268{
270 waitTimer->stop(); 269 waitTimer->stop();
271 waitIcon->setWaiting( false ); 270 waitIcon->setWaiting( false );
272} 271}
273 272
274/* 273/*
275 * This resizeEvent will be captured by 274 * This resizeEvent will be captured by
276 * the ServerInterface and it'll layout 275 * the ServerInterface and it'll layout
277 * and calc rect. Now if we go from bigger 276 * and calc rect. Now if we go from bigger
278 * to smaller screen the SysTray is out of 277 * to smaller screen the SysTray is out of
279 * bounds and repaint() won't trigger an Event 278 * bounds and repaint() won't trigger an Event
280 */ 279 */
281void TaskBar::resizeEvent( QResizeEvent *e ) 280void TaskBar::resizeEvent( QResizeEvent *e )
282{ 281{
283 if ( sysTray ) 282 if ( sysTray )
284 sysTray->hide(); 283 sysTray->hide();
285 284
286 QHBox::resizeEvent( e ); 285 QHBox::resizeEvent( e );
287 286
288 if ( sysTray ) 287 if ( sysTray )
289 sysTray->show(); 288 sysTray->show();
290 289
291 owarn << "TaskBar::resize event" << oendl; 290 owarn << "TaskBar::resize event" << oendl;
292} 291}
293 292
294void TaskBar::styleChange( QStyle &s ) 293void TaskBar::styleChange( QStyle &s )
295{ 294{
296 QHBox::styleChange( s ); 295 QHBox::styleChange( s );
297 calcMaxWindowRect(); 296 calcMaxWindowRect();
298} 297}
299 298
300void TaskBar::calcMaxWindowRect() 299void TaskBar::calcMaxWindowRect()
301{ 300{
302 if ( resizeRunningApp ) 301 if ( resizeRunningApp )
303 { 302 {
304 #if defined(Q_WS_QWS) 303 #if defined(Q_WS_QWS)
305 QRect wr; 304 QRect wr;
306 int displayWidth = qApp->desktop()->width(); 305 int displayWidth = qApp->desktop()->width();
307 QRect ir = inputMethods->inputRect(); 306 QRect ir = inputMethods->inputRect();
308 if ( ir.isValid() ) { 307 if ( ir.isValid() ) {
309 wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 ); 308 wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 );
310 } else { 309 } else {
311 wr.setCoords( 0, 0, displayWidth-1, y()-1 ); 310 wr.setCoords( 0, 0, displayWidth-1, y()-1 );
312 } 311 }
313 #if QT_VERSION < 0x030000 312 #if QT_VERSION < 0x030000
314 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr,QSize(qt_screen->width(),qt_screen->height())) ); 313 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr,QSize(qt_screen->width(),qt_screen->height())) );
315 #else 314 #else
316 QWSServer::setMaxWindowRect( wr ); 315 QWSServer::setMaxWindowRect( wr );
317 #endif 316 #endif
318 #endif 317 #endif
319 } 318 }
320} 319}
321 320
322void TaskBar::receive( const QCString &msg, const QByteArray &data ) 321void TaskBar::receive( const QCString &msg, const QByteArray &data )
323{ 322{
324 QDataStream stream( data, IO_ReadOnly ); 323 QDataStream stream( data, IO_ReadOnly );
325 if ( msg == "message(QString)" ) { 324 if ( msg == "message(QString)" ) {
326 QString text; 325 QString text;
327 stream >> text; 326 stream >> text;
328 setStatusMessage( text ); 327 setStatusMessage( text );
329 } else if ( msg == "hideInputMethod()" ) { 328 } else if ( msg == "hideInputMethod()" ) {
330 inputMethods->hideInputMethod(); 329 inputMethods->hideInputMethod();
331 } else if ( msg == "showInputMethod()" ) { 330 } else if ( msg == "showInputMethod()" ) {
332 inputMethods->showInputMethod(); 331 inputMethods->showInputMethod();
333 } else if ( msg == "showInputMethod(QString)" ) { 332 } else if ( msg == "showInputMethod(QString)" ) {
334 QString name; 333 QString name;
335 stream >> name; 334 stream >> name;
336 inputMethods->showInputMethod(name); 335 inputMethods->showInputMethod(name);
337 } else if ( msg == "reloadInputMethods()" ) { 336 } else if ( msg == "reloadInputMethods()" ) {
337 readConfig();
338 inputMethods->readConfig();
338 inputMethods->loadInputMethods(); 339 inputMethods->loadInputMethods();
339 } else if ( msg == "reloadApplets()" ) { 340 } else if ( msg == "reloadApplets()" ) {
340 sysTray->clearApplets(); 341 sysTray->clearApplets();
341 sm->createMenu(); 342 sm->createMenu();
342 sysTray->addApplets(); 343 sysTray->addApplets();
343 }else if ( msg == "toggleMenu()" ) { 344 }else if ( msg == "toggleMenu()" ) {
344 if ( sm-> launchMenu-> isVisible() ) 345 if ( sm-> launchMenu-> isVisible() )
345 sm-> launch(); 346 sm-> launch();
346 else 347 else
347 QCopEnvelope e( "QPE/System", "toggleApplicationMenu()" ); 348 QCopEnvelope e( "QPE/System", "toggleApplicationMenu()" );
348 }else if ( msg == "toggleStartMenu()" ) 349 }else if ( msg == "toggleStartMenu()" )
349 sm->launch(); 350 sm->launch();
350} 351}
351 352
352void TaskBar::setApplicationState( const QString &name, ServerInterface::ApplicationState state ) 353void TaskBar::setApplicationState( const QString &name, ServerInterface::ApplicationState state )
353{ 354{
354 if ( state == ServerInterface::Launching ) 355 if ( state == ServerInterface::Launching )
355 runningAppBar->applicationLaunched( name ); 356 runningAppBar->applicationLaunched( name );
356 else if ( state == ServerInterface::Terminated ) 357 else if ( state == ServerInterface::Terminated )
357 runningAppBar->applicationTerminated( name ); 358 runningAppBar->applicationTerminated( name );
358} 359}
359 360
360void TaskBar::toggleNumLockState() 361void TaskBar::toggleNumLockState()
361{ 362{
362 if ( lockState ) lockState->toggleNumLockState(); 363 if ( lockState ) lockState->toggleNumLockState();
363} 364}
364 365
365void TaskBar::toggleCapsLockState() 366void TaskBar::toggleCapsLockState()
366{ 367{
367 if ( lockState ) lockState->toggleCapsLockState(); 368 if ( lockState ) lockState->toggleCapsLockState();
368} 369}
369 370
370void TaskBar::toggleSymbolInput() 371void TaskBar::toggleSymbolInput()
371{ 372{
372 QString unicodeInput = qApp->translate( "InputMethods", "Unicode" ); 373 QString unicodeInput = qApp->translate( "InputMethods", "Unicode" );
373 if ( inputMethods->currentShown() == unicodeInput ) { 374 if ( inputMethods->currentShown() == unicodeInput ) {
374 inputMethods->hideInputMethod(); 375 inputMethods->hideInputMethod();
375 } else { 376 } else {
376 inputMethods->showInputMethod( unicodeInput ); 377 inputMethods->showInputMethod( unicodeInput );
377 } 378 }
378} 379}
379 380
381void TaskBar::readConfig() {
382 Config cfg( "Launcher" );
383 cfg.setGroup( "InputMethods" );
384 resizeRunningApp = cfg.readBoolEntry( "Resize", true );
385}
386
380#include "taskbar.moc" 387#include "taskbar.moc"
diff --git a/core/launcher/taskbar.h b/core/launcher/taskbar.h
index ed558b1..be5fda8 100644
--- a/core/launcher/taskbar.h
+++ b/core/launcher/taskbar.h
@@ -1,87 +1,90 @@
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**********************************************************************/ 19**********************************************************************/
20 20
21#ifndef TASKBAR_H 21#ifndef TASKBAR_H
22#define TASKBAR_H 22#define TASKBAR_H
23 23
24#include <qhbox.h> 24#include <qhbox.h>
25#include "serverinterface.h" 25#include "serverinterface.h"
26#include "startmenu.h" 26#include "startmenu.h"
27 27
28class QLabel; 28class QLabel;
29class QTimer; 29class QTimer;
30class InputMethods; 30class InputMethods;
31class Wait; 31class Wait;
32class SysTray; 32class SysTray;
33class RunningAppBar; 33class RunningAppBar;
34class QWidgetStack; 34class QWidgetStack;
35class QTimer; 35class QTimer;
36class QLabel; 36class QLabel;
37class LockKeyState; 37class LockKeyState;
38class AppLnkSet; 38class AppLnkSet;
39 39
40class TaskBar : public QHBox { 40class TaskBar : public QHBox {
41 Q_OBJECT 41 Q_OBJECT
42public: 42public:
43 TaskBar(); 43 TaskBar();
44 ~TaskBar(); 44 ~TaskBar();
45 45
46 void launchStartMenu() { if (sm) sm->launch(); } 46 void launchStartMenu() { if (sm) sm->launch(); }
47 void refreshStartMenu() { if (sm) sm->refreshMenu(); } 47 void refreshStartMenu() { if (sm) sm->refreshMenu(); }
48 void setApplicationState( const QString &name, ServerInterface::ApplicationState state ); 48 void setApplicationState( const QString &name, ServerInterface::ApplicationState state );
49 49
50signals: 50signals:
51 void tabSelected(const QString&); 51 void tabSelected(const QString&);
52 52
53public slots: 53public slots:
54 void startWait(); 54 void startWait();
55 void stopWait(const QString&); 55 void stopWait(const QString&);
56 void stopWait(); 56 void stopWait();
57 57
58 void clearStatusBar(); 58 void clearStatusBar();
59 void toggleNumLockState(); 59 void toggleNumLockState();
60 void toggleCapsLockState(); 60 void toggleCapsLockState();
61 void toggleSymbolInput(); 61 void toggleSymbolInput();
62 void calcMaxWindowRect(); 62 void calcMaxWindowRect();
63 63
64protected: 64protected:
65 void resizeEvent( QResizeEvent * ); 65 void resizeEvent( QResizeEvent * );
66 void styleChange( QStyle & ); 66 void styleChange( QStyle & );
67 void setStatusMessage( const QString &text ); 67 void setStatusMessage( const QString &text );
68 68
69private slots: 69private slots:
70 void receive( const QCString &msg, const QByteArray &data ); 70 void receive( const QCString &msg, const QByteArray &data );
71 71
72private: 72private:
73 void readConfig();
74
75private:
73 QTimer *waitTimer; 76 QTimer *waitTimer;
74 Wait *waitIcon; 77 Wait *waitIcon;
75 InputMethods *inputMethods; 78 InputMethods *inputMethods;
76 SysTray *sysTray; 79 SysTray *sysTray;
77 RunningAppBar* runningAppBar; 80 RunningAppBar* runningAppBar;
78 QWidgetStack *stack; 81 QWidgetStack *stack;
79 QTimer *clearer; 82 QTimer *clearer;
80 QLabel *label; 83 QLabel *label;
81 LockKeyState* lockState; 84 LockKeyState* lockState;
82 StartMenu *sm; 85 StartMenu *sm;
83 bool resizeRunningApp; 86 bool resizeRunningApp;
84}; 87};
85 88
86 89
87#endif // TASKBAR_H 90#endif // TASKBAR_H
diff --git a/core/settings/launcher/inputmethodsettings.cpp b/core/settings/launcher/inputmethodsettings.cpp
index 0422075..125b178 100644
--- a/core/settings/launcher/inputmethodsettings.cpp
+++ b/core/settings/launcher/inputmethodsettings.cpp
@@ -1,88 +1,107 @@
1/* 1/*
2                This file is part of the OPIE Project 2                This file is part of the OPIE Project
3 =. Copyright (c) 2002 Trolltech AS <info@trolltech.com> 3 =. Copyright (c) 2002 Trolltech AS <info@trolltech.com>
4             .=l. Copyright (c) 2003 Michael Lauer <mickeyl@handhelds.org> 4             .=l. Copyright (c) 2003 Michael Lauer <mickeyl@handhelds.org>
5           .>+-= 5           .>+-=
6 _;:,     .>    :=|. This file is free software; you can 6 _;:,     .>    :=|. This file is free software; you can
7.> <`_,   >  .   <= redistribute it and/or modify it under 7.> <`_,   >  .   <= redistribute it and/or modify it under
8:`=1 )Y*s>-.--   : the terms of the GNU General Public 8:`=1 )Y*s>-.--   : the terms of the GNU General Public
9.="- .-=="i,     .._ License as published by the Free Software 9.="- .-=="i,     .._ License as published by the Free Software
10 - .   .-<_>     .<> Foundation; either version 2 of the License, 10 - .   .-<_>     .<> Foundation; either version 2 of the License,
11     ._= =}       : or (at your option) any later version. 11     ._= =}       : or (at your option) any later version.
12    .%`+i>       _;_. 12    .%`+i>       _;_.
13    .i_,=:_.      -<s. This file is distributed in the hope that 13    .i_,=:_.      -<s. This file is distributed in the hope that
14     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 14     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
15    : ..    .:,     . . . without even the implied warranty of 15    : ..    .:,     . . . without even the implied warranty of
16    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 16    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
17  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General 17  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General
18..}^=.=       =       ; Public License for more details. 18..}^=.=       =       ; Public License for more details.
19++=   -.     .`     .: 19++=   -.     .`     .:
20 :     =  ...= . :.=- You should have received a copy of the GNU 20 :     =  ...= . :.=- You should have received a copy of the GNU
21 -.   .:....=;==+<; General Public License along with this file; 21 -.   .:....=;==+<; General Public License along with this file;
22  -_. . .   )=.  = see the file COPYING. If not, write to the 22  -_. . .   )=.  = see the file COPYING. If not, write to the
23    --        :-=` Free Software Foundation, Inc., 23    --        :-=` Free Software Foundation, Inc.,
24 59 Temple Place - Suite 330, 24 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA. 25 Boston, MA 02111-1307, USA.
26 26
27*/ 27*/
28 28
29#include "inputmethodsettings.h" 29#include "inputmethodsettings.h"
30 30
31/* OPIE */ 31/* OPIE */
32#include <qpe/config.h> 32#include <qpe/config.h>
33#include <opie2/odebug.h> 33#include <opie2/odebug.h>
34#include <qpe/qcopenvelope_qws.h>
34 35
35/* QT */ 36/* QT */
36#include <qspinbox.h> 37#include <qspinbox.h>
37#include <qcheckbox.h> 38#include <qcheckbox.h>
38#include <qlayout.h> 39#include <qlayout.h>
39#include <qlabel.h> 40#include <qlabel.h>
40#include <qwhatsthis.h> 41#include <qwhatsthis.h>
41 42
42 43
43InputMethodSettings::InputMethodSettings( QWidget *parent, const char *name ):QWidget( parent, name ) 44InputMethodSettings::InputMethodSettings( QWidget *parent, const char *name ):QWidget( parent, name )
44{ 45{
45 QBoxLayout *lay = new QVBoxLayout( this, 4, 4 ); 46 QBoxLayout *lay = new QVBoxLayout( this, 4, 4 );
46 47
47 _resize = new QCheckBox( tr( "Resize application on Popup" ), this ); 48 _resize = new QCheckBox( tr( "Resize application on Popup" ), this );
48 _float = new QCheckBox( tr( "Enable floating and resizing" ), this ); 49 _float = new QCheckBox( tr( "Enable floating and resizing" ), this );
49 50
50 QHBoxLayout* hbox = new QHBoxLayout( lay, 4 ); 51 QHBoxLayout* hbox = new QHBoxLayout( lay, 4 );
51 hbox->addWidget( new QLabel( "Initial Width:", this ) ); 52 hbox->addWidget( new QLabel( "Initial Width:", this ) );
52 _size = new QSpinBox( 10, 100, 10, this ); 53 _size = new QSpinBox( 10, 100, 10, this );
53 _size->setSuffix( "%" ); 54 _size->setSuffix( "%" );
54 hbox->addWidget( _size ); 55 hbox->addWidget( _size );
55 hbox->addStretch(); 56 hbox->addStretch();
56 57
57 Config cfg( "Launcher" ); 58 Config cfg( "Launcher" );
58 cfg.setGroup( "InputMethods" ); 59 cfg.setGroup( "InputMethods" );
59 _resize->setChecked( cfg.readBoolEntry( "Resize", true ) ); 60
60 _float->setChecked( cfg.readBoolEntry( "Float", false ) ); 61 /*
61 _size->setValue( cfg.readNumEntry( "Width", 100 ) ); 62 * load the values to see if something was changed
63 */
64 _wasResize = cfg.readBoolEntry( "Resize", true );
65 _wasFloat = cfg.readBoolEntry( "Float", false );
66 _wasWidth = cfg.readNumEntry( "Width", 100 );
67
68 _resize->setChecked( _wasResize );
69 _float ->setChecked( _wasFloat );
70 _size ->setValue( _wasWidth );
62 71
63 lay->addWidget( _resize ); 72 lay->addWidget( _resize );
64 lay->addWidget( _float ); 73 lay->addWidget( _float );
65 lay->addWidget( new QLabel( tr( "<b>Note:</b> Changing these settings may need restarting Opie to become effective." ), this ) ); 74 lay->addWidget( new QLabel( tr( "<b>Note:</b> Changing these settings may need restarting Opie to become effective." ), this ) );
66 75
67 lay->addStretch(); 76 lay->addStretch();
68 77
69 QWhatsThis::add( _resize, tr( "Check, if you want the application to be automatically resized if the input method pops up." ) ); 78 QWhatsThis::add( _resize, tr( "Check, if you want the application to be automatically resized if the input method pops up." ) );
70 QWhatsThis::add( _float, tr( "Check, if you want to move and/or resize input methods" ) ); 79 QWhatsThis::add( _float, tr( "Check, if you want to move and/or resize input methods" ) );
71 QWhatsThis::add( _size, tr( "Specify the percentage of the screen width for the input method" ) ); 80 QWhatsThis::add( _size, tr( "Specify the percentage of the screen width for the input method" ) );
72} 81}
73 82
74void InputMethodSettings::appletChanged() 83bool InputMethodSettings::changed()const{
75{ 84 if ( _wasResize != _resize->isChecked() )
85 return true;
86 else if ( _wasFloat != _float->isChecked() )
87 return true;
88 else if ( _wasWidth != _size->value() )
89 return true;
90 else
91 return false;
76} 92}
77 93
78void InputMethodSettings::accept() 94void InputMethodSettings::accept()
79{ 95{
80 odebug << "InputMethodSettings::accept()" << oendl; 96 odebug << "InputMethodSettings::accept()" << oendl;
81 Config cfg( "Launcher" ); 97 Config cfg( "Launcher" );
82 cfg.setGroup( "InputMethods" ); 98 cfg.setGroup( "InputMethods" );
83 cfg.writeEntry( "Resize", _resize->isChecked() ); 99 cfg.writeEntry( "Resize", _resize->isChecked() );
84 cfg.writeEntry( "Float", _float->isChecked() ); 100 cfg.writeEntry( "Float", _float->isChecked() );
85 cfg.writeEntry( "Width", _size->value() ); 101 cfg.writeEntry( "Width", _size->value() );
86 cfg.write(); 102 cfg.write();
103
104 if ( changed() )
105 QCopEnvelope( "QPE/TaskBar", "reloadInputMethods()" );
87} 106}
88 107
diff --git a/core/settings/launcher/inputmethodsettings.h b/core/settings/launcher/inputmethodsettings.h
index 486ee5e..2ae43f2 100644
--- a/core/settings/launcher/inputmethodsettings.h
+++ b/core/settings/launcher/inputmethodsettings.h
@@ -1,57 +1,60 @@
1/* 1/*
2               =. This file is part of the OPIE Project 2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2003 Michael Lauer <mickeyl@handhelds.org> 3             .=l. Copyright (c) 2003 Michael Lauer <mickeyl@handhelds.org>
4           .>+-= 4           .>+-=
5 _;:,     .>    :=|. This file is free software; you can 5 _;:,     .>    :=|. This file is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under 6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU General Public 7:`=1 )Y*s>-.--   : the terms of the GNU General Public
8.="- .-=="i,     .._ License as published by the Free Software 8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License, 9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version. 10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_. 11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This file is distributed in the hope that 12    .i_,=:_.      -<s. This file is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of 14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General 16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU General
17..}^=.=       =       ; Public License for more details. 17..}^=.=       =       ; Public License for more details.
18++=   -.     .`     .: 18++=   -.     .`     .:
19 :     =  ...= . :.=- You should have received a copy of the GNU 19 :     =  ...= . :.=- You should have received a copy of the GNU
20 -.   .:....=;==+<; General Public License along with this file; 20 -.   .:....=;==+<; General Public License along with this file;
21  -_. . .   )=.  = see the file COPYING. If not, write to the 21  -_. . .   )=.  = see the file COPYING. If not, write to the
22    --        :-=` Free Software Foundation, Inc., 22    --        :-=` Free Software Foundation, Inc.,
23 59 Temple Place - Suite 330, 23 59 Temple Place - Suite 330,
24 Boston, MA 02111-1307, USA. 24 Boston, MA 02111-1307, USA.
25 25
26*/ 26*/
27 27
28#ifndef __IMETHOD_SETTINGS_H__ 28#ifndef __IMETHOD_SETTINGS_H__
29#define __IMETHOD_SETTINGS_H__ 29#define __IMETHOD_SETTINGS_H__
30 30
31#include <qwidget.h> 31#include <qwidget.h>
32 32
33class QCheckBox; 33class QCheckBox;
34class QSpinBox; 34class QSpinBox;
35 35
36class InputMethodSettings : public QWidget 36class InputMethodSettings : public QWidget
37{ 37{
38 Q_OBJECT 38 Q_OBJECT
39 39
40 public: 40 public:
41 InputMethodSettings ( QWidget *parent = 0, const char *name = 0 ); 41 InputMethodSettings ( QWidget *parent = 0, const char *name = 0 );
42 42
43 void accept ( ); 43 void accept ( );
44 44
45 protected slots:
46 void appletChanged ( );
47
48 protected: 45 protected:
49 void init ( ); 46 void init ( );
50 47
51 private: 48 private:
52 QCheckBox* _resize; 49 QCheckBox* _resize;
53 QCheckBox* _float; 50 QCheckBox* _float;
54 QSpinBox* _size; 51 QSpinBox* _size;
52
53 private:
54 bool changed()const;
55 bool _wasResize : 1;
56 bool _wasFloat : 1;
57 int _wasWidth;
55}; 58};
56 59
57#endif 60#endif