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) (ignore whitespace changes)
-rw-r--r--library/qpeapplication.cpp271
1 files changed, 240 insertions, 31 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 755fb19..90cd5f1 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -96,6 +96,15 @@
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{
@@ -118,10 +127,10 @@ public:
118 bool forceshow : 1; 127 bool forceshow : 1;
119 bool nomaximize : 1; 128 bool nomaximize : 1;
120 bool keep_running : 1; 129 bool keep_running : 1;
121 bool qcopQok : 1; 130 bool qcopQok : 1;
122 131
123 132
124 QStringList langs; 133 QStringList langs;
125 QString appName; 134 QString appName;
126 struct QCopRec 135 struct QCopRec
127 { 136 {
@@ -163,32 +172,228 @@ public:
163 delete r; 172 delete r;
164 } 173 }
165 } 174 }
166 static void show_mx(QWidget* mw, bool nomaximize, const QString & = QString::null ) 175
176 static void show_mx(QWidget* mw, bool nomaximize, QString &strName/* = QString::null */)
167 { 177 {
178 if ( mw->isVisible() ) {
179 mw->raise();
180 } else {
181 QPoint p;
182 QSize s;
183
184 if ( mw->layout() && mw->inherits("QDialog") ) {
185 bool max;
186 if ( read_widget_rect(strName, max, p, s) && validate_widget_size(mw, p, s) ) {
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) );
206#ifdef Q_WS_QWS
207 if ( !nomaximize )
208 mw->showMaximized();
209#endif
210 }
211 if ( max && !nomaximize )
212 mw->showMaximized();
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());
168 249
169 // ugly hack, remove that later after finding a sane solution 250 if ( d->parentWidget() && !d->parentWidget()->topLevelWidget()->isMaximized() )
170 // Addendum: Only Sharp currently has models with high resolution but (physically) small displays, 251 nomax = TRUE;
171 // so this is only useful if QT_QWS_SIMPAD is NOT defined. E.g. SIMpad has 800x600 but has 252
172 // a (physically) large enough display to use the small icons 253#ifndef Q_WS_QWS
173#if defined(OPIE_HIGH_RES_SMALL_PHY) 254 QSize s(qApp->desktop()->width(), qApp->desktop()->height() );
174 if ( QPEApplication::desktop() ->width() >= 600 && ( mw->inherits("QMainWindow") || mw->isA("QMainWindow") ) ) { 255#else
175 ( ( QMainWindow* ) mw )->setUsesBigPixmaps( true ); 256 QSize s(qt_maxWindowRect.width(), qt_maxWindowRect.height() );
176 }
177#endif 257#endif
178 258
179 if ( mw->layout() && mw->inherits("QDialog") ) { 259 int maxX = s.width() - (d->frameGeometry().width() - d->geometry().width());
180 QPEApplication::showDialog((QDialog*)mw, nomaximize); 260 int maxY = s.height() - (d->frameGeometry().height() - d->geometry().height());
181 } 261
182 else { 262 if ( (w >= maxX && h >= maxY) || ( (!nomax) && ( w > s.width()*3/4 || h > s.height()*3/4 ) ) ) {
183#ifdef Q_WS_QWS 263 d->showMaximized();
184 if ( !nomaximize ) 264 } else {
185 mw->showMaximized(); 265 // try centering the dialog around its parent
186 else 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 );
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();
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();
187#endif 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() );
188 340
189 mw->show(); 341 // total window size is not allowed to be larger than desktop window size
190 } 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;
191 } 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 /*
@@ -226,10 +431,10 @@ public:
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
@@ -863,14 +1068,14 @@ void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int 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
@@ -1978,6 +2183,8 @@ void QPEApplication::tryQuit()
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();
@@ -2003,6 +2210,8 @@ void QPEApplication::installTranslation( const QString& baseName ) {
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