summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2004-04-25 07:56:02 (UTC)
committer llornkcor <llornkcor>2004-04-25 07:56:02 (UTC)
commit73f0c227fc94bc4dea12e4eb2384bdff2e9561eb (patch) (unidiff)
treec33525271239fbf69e5daf9223beaa5dd28e0bb6
parentcf9cab31dc8a46d3a2d74931b2a428ca87eed0a9 (diff)
downloadopie-73f0c227fc94bc4dea12e4eb2384bdff2e9561eb.zip
opie-73f0c227fc94bc4dea12e4eb2384bdff2e9561eb.tar.gz
opie-73f0c227fc94bc4dea12e4eb2384bdff2e9561eb.tar.bz2
fix nonmaximized apps, and make the state and position persistent. ported from Qtopia 1.7 :)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--library/qpeapplication.cpp259
1 files changed, 234 insertions, 25 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 755fb19..90cd5f1 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -93,12 +93,21 @@
93#include <sys/ioctl.h> 93#include <sys/ioctl.h>
94#ifndef QT_NO_SOUND 94#ifndef QT_NO_SOUND
95#include <sys/soundcard.h> 95#include <sys/soundcard.h>
96#endif 96#endif
97#include "qt_override_p.h" 97#include "qt_override_p.h"
98 98
99class HackWidget : public QWidget
100{
101public:
102 bool needsOk()
103 { return (getWState() & WState_Reserved1 ); }
104
105 QRect normalGeometry()
106 { return topData()->normalGeometry; };
107};
99 108
100class QPEApplicationData 109class QPEApplicationData
101{ 110{
102public: 111public:
103 QPEApplicationData ( ) 112 QPEApplicationData ( )
104 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ), 113 : presstimer( 0 ), presswidget( 0 ), rightpressed( false ), kbgrabbed( false ),
@@ -160,38 +169,234 @@ public:
160 QCopChannel::sendLocally( r->channel, r->message, r->data ); 169 QCopChannel::sendLocally( r->channel, r->message, r->data );
161#endif 170#endif
162 171
163 delete r; 172 delete r;
164 } 173 }
165 } 174 }
166 static void show_mx(QWidget* mw, bool nomaximize, const QString & = QString::null )
167 {
168 175
169 // ugly hack, remove that later after finding a sane solution 176 static void show_mx(QWidget* mw, bool nomaximize, QString &strName/* = QString::null */)
170 // Addendum: Only Sharp currently has models with high resolution but (physically) small displays, 177 {
171 // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has 178 if ( mw->isVisible() ) {
172 // a (physically) large enough display to use the small icons 179 mw->raise();
173#if defined(OPIE_HIGH_RES_SMALL_PHY) 180 } else {
174 if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) { 181 QPoint p;
175 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true ); 182 QSize s;
176 }
177#endif
178 183
179 if ( mw->layout() && mw->inherits("QDialog") ) { 184 if ( mw->layout() && mw->inherits("QDialog") ) {
180 QPEApplication::showDialog((QDialog*)mw, nomaximize); 185 bool max;
181 } 186 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
182 else { 187 mw->resize(s);
188 mw->move(p);
189
190 if ( max && !nomaximize )
191 mw->showMaximized();
192 else
193 mw->show();
194 } else {
195 qpe_show_dialog((QDialog*)mw,nomaximize);
196 }
197 } else {
198 bool max;
199 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
200 mw->resize(s);
201 mw->move(p);
202 } else { //no stored rectangle, make an estimation
203 int x = (qApp->desktop()->width()-mw->frameGeometry().width())/2;
204 int y = (qApp->desktop()->height()-mw->frameGeometry().height())/2;
205 mw->move( QMAX(x,0), QMAX(y,0) );
183#ifdef Q_WS_QWS 206#ifdef Q_WS_QWS
184 if ( !nomaximize ) 207 if ( !nomaximize )
185 mw->showMaximized(); 208 mw->showMaximized();
209#endif
210 }
211 if ( max && !nomaximize )
212 mw->showMaximized();
186 else 213 else
214 mw->show();
215 }
216 }
217 }
218// // ugly hack, remove that later after finding a sane solution
219// // Addendum: Only Sharp currently has models with high resolution but (physically) small displays,
220// // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has
221// // a (physically) large enough display to use the small icons
222// #if defined(OPIE_HIGH_RES_SMALL_PHY)
223// if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) {
224// ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true );
225// }
226// #endif
227
228 // if ( mw->layout() && mw->inherits("QDialog") ) {
229 // QPEApplication::showDialog((QDialog*)mw, nomaximize);
230 // }
231 // else {
232// #ifdef Q_WS_QWS
233 // if ( !nomaximize ) {
234 // qDebug("QDialog special case XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
235 // mw->showMaximized();
236 // //QPEApplication::showWidget( mw, !nomaximize );
237 // }else
238// #endif
239 // mw->show();
240 // }
241 //}
242
243
244static void qpe_show_dialog( QDialog* d, bool nomax )
245{
246 QSize sh = d->sizeHint();
247 int w = QMAX(sh.width(),d->width());
248 int h = QMAX(sh.height(),d->height());
249
250 if ( d->parentWidget() && !d->parentWidget()->topLevelWidget()->isMaximized() )
251 nomax = TRUE;
252
253#ifndef Q_WS_QWS
254 QSize s(qApp->desktop()->width(), qApp->desktop()->height() );
255#else
256 QSize s(qt_maxWindowRect.width(), qt_maxWindowRect.height() );
187#endif 257#endif
188 258
189 mw->show(); 259 int maxX = s.width() - (d->frameGeometry().width() - d->geometry().width());
260 int maxY = s.height() - (d->frameGeometry().height() - d->geometry().height());
261
262 if ( (w >= maxX && h >= maxY) || ( (!nomax) && ( w > s.width()*3/4 || h > s.height()*3/4 ) ) ) {
263 d->showMaximized();
264 } else {
265 // try centering the dialog around its parent
266 QPoint p(0,0);
267 if ( d->parentWidget() ) {
268 QPoint pp = d->parentWidget()->mapToGlobal( QPoint(0,0) );
269 p = QPoint( pp.x() + d->parentWidget()->width()/2,
270 pp.y() + d->parentWidget()->height()/ 2 );
271 } else {
272 p = QPoint( maxX/2, maxY/2 );
190 } 273 }
274
275 p = QPoint( p.x() - w/2, p.y() - h/2 );
276 //qDebug("p(x,y) is %d %d", p.x(), p.y() );
277
278 if ( w >= maxX ) {
279 if ( p.y() < 0 )
280 p.setY(0);
281 if ( p.y() + h > maxY )
282 p.setY( maxY - h);
283
284 d->resize(maxX, h);
285 d->move(0, p.y() );
286 } else if ( h >= maxY ) {
287 if ( p.x() < 0 )
288 p.setX(0);
289 if ( p.x() + w > maxX )
290 p.setX( maxX - w);
291
292 d->resize(w, maxY);
293 d->move(p.x(),0);
294 } else {
295 d->resize(w, h);
296 }
297
298 d->show();
191 } 299 }
300}
301
302 static bool read_widget_rect(const QString &app, bool &maximized, QPoint &p, QSize &s)
303 {
304 maximized = TRUE;
305
306 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
307 if ( qApp->desktop()->width() <= 350 )
308 return FALSE;
309
310 Config cfg( "qpe" );
311 cfg.setGroup("ApplicationPositions");
312 QString str = cfg.readEntry( app, QString::null );
313 QStringList l = QStringList::split(",", str);
314
315 if ( l.count() == 5) {
316 p.setX( l[0].toInt() );
317 p.setY( l[1].toInt() );
318
319 s.setWidth( l[2].toInt() );
320 s.setHeight( l[3].toInt() );
321
322 maximized = l[4].toInt();
323
324 return TRUE;
325 }
326
327 return FALSE;
328 }
329
330
331 static bool validate_widget_size(const QWidget *w, QPoint &p, QSize &s)
332 {
333#ifndef Q_WS_QWS
334 QRect qt_maxWindowRect = qApp->desktop()->geometry();
335#endif
336 int maxX = qt_maxWindowRect.width();
337 int maxY = qt_maxWindowRect.height();
338 int wWidth = s.width() + ( w->frameGeometry().width() - w->geometry().width() );
339 int wHeight = s.height() + ( w->frameGeometry().height() - w->geometry().height() );
340
341 // total window size is not allowed to be larger than desktop window size
342 if ( ( wWidth >= maxX ) && ( wHeight >= maxY ) )
343 return FALSE;
344
345 if ( wWidth > maxX ) {
346 s.setWidth( maxX - (w->frameGeometry().width() - w->geometry().width() ) );
347 wWidth = maxX;
348 }
349
350 if ( wHeight > maxY ) {
351 s.setHeight( maxY - (w->frameGeometry().height() - w->geometry().height() ) );
352 wHeight = maxY;
353 }
354
355 // any smaller than this and the maximize/close/help buttons will be overlapping
356 if ( wWidth < 80 || wHeight < 60 )
357 return FALSE;
358
359 if ( p.x() < 0 )
360 p.setX(0);
361 if ( p.y() < 0 )
362 p.setY(0);
363
364 if ( p.x() + wWidth > maxX )
365 p.setX( maxX - wWidth );
366 if ( p.y() + wHeight > maxY )
367 p.setY( maxY - wHeight );
368
369 return TRUE;
370 }
371
372 static void store_widget_rect(QWidget *w, QString &app)
373 {
374 // 350 is the trigger in qwsdefaultdecoration for providing a resize button
375 if ( qApp->desktop()->width() <= 350 )
376 return;
377
378 // we use these to map the offset of geometry and pos. ( we can only use normalGeometry to
379 // get the non-maximized version, so we have to do it the hard way )
380 int offsetX = w->x() - w->geometry().left();
381 int offsetY = w->y() - w->geometry().top();
382
383 QRect r;
384 if ( w->isMaximized() )
385 r = ( (HackWidget *) w)->normalGeometry();
386 else
387 r = w->geometry();
388
389 // Stores the window placement as pos(), size() (due to the offset mapping)
390 Config cfg( "qpe" );
391 cfg.setGroup("ApplicationPositions");
392 QString s;
393 s.sprintf("%d,%d,%d,%d,%d", r.left() + offsetX, r.top() + offsetY, r.width(), r.height(), w->isMaximized() );
394 cfg.writeEntry( app, s );
395 }
396
192 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ ) 397 static bool setWidgetCaptionFromAppName( QWidget* /*mw*/, const QString& /*appName*/, const QString& /*appsPath*/ )
193 { 398 {
194 /* 399 /*
195 // This works but disable it for now until it is safe to apply 400 // This works but disable it for now until it is safe to apply
196 // What is does is scan the .desktop files of all the apps for 401 // What is does is scan the .desktop files of all the apps for
197 // the applnk that has the corresponding argv[0] as this program 402 // the applnk that has the corresponding argv[0] as this program
@@ -223,16 +428,16 @@ public:
223 428
224 sendQCopQ(); 429 sendQCopQ();
225#endif 430#endif
226 431
227 if ( preloaded ) { 432 if ( preloaded ) {
228 if (forceshow) 433 if (forceshow)
229 show_mx(mw, nomax); 434 show_mx(mw, nomax, appName);
230 } 435 }
231 else if ( keep_running ) { 436 else if ( keep_running ) {
232 show_mx(mw, nomax); 437 show_mx(mw, nomax, appName);
233 } 438 }
234 } 439 }
235 440
236 void loadTextCodecs() 441 void loadTextCodecs()
237 { 442 {
238 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs"; 443 QString path = QPEApplication::qpeDir() + "/plugins/textcodecs";
@@ -860,20 +1065,20 @@ void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key )
860#ifdef QWS 1065#ifdef QWS
861 1066
862 ke->simpleData.keycode = key; 1067 ke->simpleData.keycode = key;
863#endif 1068#endif
864} 1069}
865 1070
866class HackWidget : public QWidget 1071// class HackWidget : public QWidget
867{ 1072// {
868public: 1073// public:
869 bool needsOk() 1074 // bool needsOk()
870 { 1075 // {
871 return ( getWState() & WState_Reserved1 ); 1076 // return ( getWState() & WState_Reserved1 );
872 } 1077 // }
873}; 1078// };
874 1079
875/*! 1080/*!
876 \internal 1081 \internal
877*/ 1082*/
878 1083
879#ifdef QWS 1084#ifdef QWS
@@ -1975,12 +2180,14 @@ void QPEApplication::tryQuit()
1975 2180
1976 { 2181 {
1977 QCopEnvelope e( "QPE/System", "closing(QString)" ); 2182 QCopEnvelope e( "QPE/System", "closing(QString)" );
1978 e << d->appName; 2183 e << d->appName;
1979 } 2184 }
1980#endif 2185#endif
2186 if ( d->keep_running )
2187 d->store_widget_rect(d->qpe_main_widget, d->appName);
1981 processEvents(); 2188 processEvents();
1982 2189
1983 quit(); 2190 quit();
1984} 2191}
1985 2192
1986/*! 2193/*!
@@ -2000,12 +2207,14 @@ void QPEApplication::installTranslation( const QString& baseName ) {
2000 User initiated quit. Makes the window 'Go Away'. If preloaded this means 2207 User initiated quit. Makes the window 'Go Away'. If preloaded this means
2001 hiding the window. If not it means quitting the application. 2208 hiding the window. If not it means quitting the application.
2002 As this is user initiated we don't need to check state. 2209 As this is user initiated we don't need to check state.
2003*/ 2210*/
2004void QPEApplication::hideOrQuit() 2211void QPEApplication::hideOrQuit()
2005{ 2212{
2213 if ( d->keep_running )
2214 d->store_widget_rect(d->qpe_main_widget, d->appName);
2006 processEvents(); 2215 processEvents();
2007 2216
2008 // If we are a preloaded application we don't actually quit, so emit 2217 // If we are a preloaded application we don't actually quit, so emit
2009 // a System message indicating we're quasi-closing. 2218 // a System message indicating we're quasi-closing.
2010 if ( d->preloaded && d->qpe_main_widget ) 2219 if ( d->preloaded && d->qpe_main_widget )
2011#ifndef QT_NO_COP 2220#ifndef QT_NO_COP