-rw-r--r-- | library/qpeapplication.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index 187a7e2..8448352 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -262,786 +262,792 @@ static int backlight() { if ( curbl == -1 ) { // Read from config Config config( "qpe" ); config.setGroup( "Screensaver" ); curbl = config.readNumEntry( "Brightness", 255 ); } return curbl; } static void setBacklight( int bright ) { if ( bright == -3 ) { // Forced on forced_off = FALSE; bright = -1; } if ( forced_off && bright != -2 ) return ; if ( bright == -2 ) { // Toggle between off and on bright = curbl ? 0 : -1; forced_off = !bright; } if ( bright == -1 ) { // Read from config Config config( "qpe" ); config.setGroup( "Screensaver" ); bright = config.readNumEntry( "Brightness", 255 ); } #if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) if ( QFile::exists( "/usr/bin/bl" ) ) { QString cmd = "/usr/bin/bl 1 "; cmd += bright <= 0 ? "0 " : "1 "; cmd += QString::number( bright ); system( cmd.latin1() ); #if defined(QT_QWS_EBX) } else if ( QFile::exists( "/dev/fl" ) ) { #define FL_IOCTL_STEP_CONTRAST 100 int fd = open( "/dev/fl", O_WRONLY ); if ( fd >= 0 ) { int steps = qpe_sysBrightnessSteps(); int bl = ( bright * steps + 127 ) / 255; if ( bright && !bl ) bl = 1; bl = ioctl( fd, FL_IOCTL_STEP_CONTRAST, bl ); close( fd ); } } #elif defined(QT_QWS_IPAQ) } else if ( QFile::exists( "/dev/ts" ) || QFile::exists( "/dev/h3600_ts" ) ) { typedef struct { unsigned char mode; unsigned char pwr; unsigned char brightness; } FLITE_IN; # ifndef FLITE_ON # ifndef _LINUX_IOCTL_H # include <linux/ioctl.h> # endif # define FLITE_ON _IOW('f', 7, FLITE_IN) # endif int fd; if ( QFile::exists( "/dev/ts" ) ) fd = open( "/dev/ts", O_WRONLY ); else fd = open( "/dev/h3600_ts", O_WRONLY ); if ( fd >= 0 ) { FLITE_IN bl; bl.mode = 1; bl.pwr = bright ? 1 : 0; bl.brightness = bright; ioctl( fd, FLITE_ON, &bl ); close( fd ); } } #endif #endif curbl = bright; } void qpe_setBacklight( int bright ) { setBacklight( bright ); } static bool dim_on = FALSE; static bool lightoff_on = FALSE; static int disable_suspend = 100; static bool powerOnline() { return PowerStatusManager::readStatus().acStatus() == PowerStatus::Online; } static bool networkOnline() { return Network::networkOnline(); } class QPEScreenSaver : public QWSScreenSaver { private: int LcdOn; public: QPEScreenSaver() { int fd; LcdOn = TRUE; // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off) fd = open( "/dev/fb0", O_RDWR ); if ( fd != -1 ) { ioctl( fd, FBIOBLANK, VESA_NO_BLANKING ); close( fd ); } } void restore() { if ( !LcdOn ) // We must have turned it off { int fd; fd = open( "/dev/fb0", O_RDWR ); if ( fd != -1 ) { ioctl( fd, FBIOBLANK, VESA_NO_BLANKING ); close( fd ); } } setBacklight( -1 ); } bool save( int level ) { int fd; switch ( level ) { case 0: if ( disable_suspend > 0 && dim_on ) { if ( backlight() > 1 ) setBacklight( 1 ); // lowest non-off } return TRUE; break; case 1: if ( disable_suspend > 1 && lightoff_on ) { setBacklight( 0 ); // off } return TRUE; break; case 2: Config config( "qpe" ); config.setGroup( "Screensaver" ); if ( config.readNumEntry( "LcdOffOnly", 0 ) != 0 ) // We're only turning off the LCD { fd = open( "/dev/fb0", O_RDWR ); if ( fd != -1 ) { ioctl( fd, FBIOBLANK, VESA_POWERDOWN ); close( fd ); } LcdOn = FALSE; } else // We're going to suspend the whole machine { if ( disable_suspend > 2 && !powerOnline() && !networkOnline() ) { QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE ); return TRUE; } } break; } return FALSE; } }; static int ssi( int interval, Config & config, const QString & enable, const QString & value, int def ) { if ( !enable.isEmpty() && config.readNumEntry( enable, 0 ) == 0 ) return 0; if ( interval < 0 ) { // Restore screen blanking and power saving state interval = config.readNumEntry( value, def ); } return interval; } static void setScreenSaverIntervals( int i1, int i2, int i3 ) { Config config( "qpe" ); config.setGroup( "Screensaver" ); int v[ 4 ]; i1 = ssi( i1, config, "Dim", "Interval_Dim", 30 ); i2 = ssi( i2, config, "LightOff", "Interval_LightOff", 20 ); i3 = ssi( i3, config, "", "Interval", 60 ); //qDebug("screen saver intervals: %d %d %d", i1, i2, i3); v[ 0 ] = QMAX( 1000 * i1, 100 ); v[ 1 ] = QMAX( 1000 * i2, 100 ); v[ 2 ] = QMAX( 1000 * i3, 100 ); v[ 3 ] = 0; dim_on = ( ( i1 != 0 ) ? config.readNumEntry( "Dim", 1 ) : FALSE ); lightoff_on = ( ( i2 != 0 ) ? config.readNumEntry( "LightOff", 1 ) : FALSE ); if ( !i1 && !i2 && !i3 ) QWSServer::setScreenSaverInterval( 0 ); else QWSServer::setScreenSaverIntervals( v ); } static void setScreenSaverInterval( int interval ) { setScreenSaverIntervals( -1, -1, interval ); } /*! \class QPEApplication qpeapplication.h \brief The QPEApplication class implements various system services that are available to all Qtopia applications. Simply by using QPEApplication instead of QApplication, a plain Qt application becomes a Qtopia application. It automatically follows style changes, quits and raises, and in the case of \link docwidget.html document-oriented\endlink applications, changes the current displayed document in response to the environment. */ /*! \fn void QPEApplication::clientMoused() \internal */ /*! \fn void QPEApplication::timeChanged(); This signal is emitted when the time jumps forward or backwards by more than the normal passage of time. */ /*! \fn void QPEApplication::clockChanged( bool ampm ); This signal is emitted when the user changes the style of clock. If \a ampm is TRUE, the user wants a 12-hour AM/PM close, otherwise, they want a 24-hour clock. */ /*! \fn void QPEApplication::appMessage( const QCString& msg, const QByteArray& data ) This signal is emitted when a message is received on the QPE/Application/<i>appname</i> QCop channel for this application. The slot to which you connect this signal uses \a msg and \a data in the following way: \code void MyWidget::receive( const QCString& msg, const QByteArray& data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "someMessage(int,int,int)" ) { int a,b,c; stream >> a >> b >> c; ... } else if ( msg == "otherMessage(QString)" ) { ... } } \endcode \sa qcop.html */ /*! Constructs a QPEApplication just as you would construct a QApplication, passing \a argc, \a argv, and \a t. */ QPEApplication::QPEApplication( int & argc, char **argv, Type t ) : QApplication( hack( argc ), argv, t ) { int dw = desktop() ->width(); if ( dw < 200 ) { // setFont( QFont( "helvetica", 8 ) ); AppLnk::setSmallIconSize( 10 ); AppLnk::setBigIconSize( 28 ); } d = new QPEApplicationData; QMimeSourceFactory::setDefaultFactory( new ResourceMimeFactory ); connect( this, SIGNAL( lastWindowClosed() ), this, SLOT( hideOrQuit() ) ); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) QString qcopfn( "/tmp/qcop-msg-" ); qcopfn += QString( argv[ 0 ] ); // append command name QFile f( qcopfn ); if ( f.open( IO_ReadOnly ) ) { flock( f.handle(), LOCK_EX ); } sysChannel = new QCopChannel( "QPE/System", this ); connect( sysChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), this, SLOT( systemMessage( const QCString &, const QByteArray & ) ) ); QCString channel = QCString( argv[ 0 ] ); channel.replace( QRegExp( ".*/" ), "" ); d->appName = channel; channel = "QPE/Application/" + channel; pidChannel = new QCopChannel( channel, this ); connect( pidChannel, SIGNAL( received( const QCString &, const QByteArray & ) ), this, SLOT( pidMessage( const QCString &, const QByteArray & ) ) ); if ( f.isOpen() ) { d->keep_running = FALSE; QDataStream ds( &f ); QCString channel, message; QByteArray data; while ( !ds.atEnd() ) { ds >> channel >> message >> data; d->enqueueQCop( channel, message, data ); } flock( f.handle(), LOCK_UN ); f.close(); f.remove(); } for ( int a = 0; a < argc; a++ ) { if ( qstrcmp( argv[ a ], "-preload" ) == 0 ) { argv[ a ] = argv[ a + 1 ]; a++; d->preloaded = TRUE; argc -= 1; } else if ( qstrcmp( argv[ a ], "-preload-show" ) == 0 ) { argv[ a ] = argv[ a + 1 ]; a++; d->preloaded = TRUE; d->forceshow = TRUE; argc -= 1; } } /* overide stored arguments */ setArgs( argc, argv ); #endif qwsSetDecoration( new QPEDecoration() ); #ifndef QT_NO_TRANSLATION QStringList langs = Global::languageList(); for ( QStringList::ConstIterator it = langs.begin(); it != langs.end(); ++it ) { QString lang = *it; QTranslator * trans; QString tfn; trans = new QTranslator( this ); tfn = qpeDir() + "/i18n/" + lang + "/libqpe.qm"; if ( trans->load( tfn ) ) installTranslator( trans ); else delete trans; trans = new QTranslator( this ); tfn = qpeDir() + "/i18n/" + lang + "/" + d->appName + ".qm"; if ( trans->load( tfn ) ) installTranslator( trans ); else delete trans; + /* + * not required. if using one of these languages, you might as well install + * a custom font. + //###language/font hack; should look it up somewhere if ( lang == "ja" || lang == "zh_CN" || lang == "zh_TW" || lang == "ko" ) { QFont fn = FontManager::unicodeFont( FontManager::Proportional ); setFont( fn ); } + else { + */ Config config( "qpe" ); config.setGroup( "Appearance" ); QString familyStr = config.readEntry( "FontFamily", "helvetica" ); QString styleStr = config.readEntry( "FontStyle", "Regular" ); QString sizeStr = config.readEntry( "FontSize", "10" ); QString charSetStr = config.readEntry( "FontCharSet", QString::null ); bool ok; int i_size = sizeStr.toInt( &ok, 10 ); FontDatabase fdb; QFont selectedFont = fdb.font( familyStr, styleStr, i_size, charSetStr ); setFont( selectedFont ); - } + //} } #endif applyStyle(); if ( type() == GuiServer ) { setScreenSaverInterval( -1 ); setVolume(); QWSServer::setScreenSaver( new QPEScreenSaver ); } installEventFilter( this ); QPEMenuToolFocusManager::initialize(); #ifdef QT_NO_QWS_CURSOR // if we have no cursor, probably don't want tooltips QToolTip::setEnabled( FALSE ); #endif } static QPtrDict<void>* inputMethodDict = 0; static void createInputMethodDict() { if ( !inputMethodDict ) inputMethodDict = new QPtrDict<void>; } /*! Returns the currently set hint to the system as to whether \a w has any use for text input methods. \sa setInputMethodHint() */ QPEApplication::InputMethodHint QPEApplication::inputMethodHint( QWidget * w ) { if ( inputMethodDict && w ) return ( InputMethodHint ) ( int ) inputMethodDict->find( w ); return Normal; } /*! \enum QPEApplication::InputMethodHint \value Normal the application sometimes needs text input (the default). \value AlwaysOff the application never needs text input. \value AlwaysOn the application always needs text input. */ /*! Hints to the system that \a w has use for text input methods as specified by \a mode. \sa inputMethodHint() */ void QPEApplication::setInputMethodHint( QWidget * w, InputMethodHint mode ) { createInputMethodDict(); if ( mode == Normal ) { inputMethodDict->remove ( w ); } else { inputMethodDict->insert( w, ( void* ) mode ); } } class HackDialog : public QDialog { public: void acceptIt() { accept(); } void rejectIt() { reject(); } }; void QPEApplication::mapToDefaultAction( QWSKeyEvent * ke, int key ) { // specialised actions for certain widgets. May want to // add more stuff here. if ( activePopupWidget() && activePopupWidget() ->inherits( "QListBox" ) && activePopupWidget() ->parentWidget() && activePopupWidget() ->parentWidget() ->inherits( "QComboBox" ) ) key = Qt::Key_Return; if ( activePopupWidget() && activePopupWidget() ->inherits( "QPopupMenu" ) ) key = Qt::Key_Return; ke->simpleData.keycode = key; } class HackWidget : public QWidget { public: bool needsOk() { return ( getWState() & WState_Reserved1 ); } }; /*! \internal */ bool QPEApplication::qwsEventFilter( QWSEvent * e ) { if ( !d->notbusysent && e->type == QWSEvent::Focus ) { if ( qApp->type() != QApplication::GuiServer ) { QCopEnvelope e( "QPE/System", "notBusy(QString)" ); e << d->appName; } d->notbusysent = TRUE; } if ( type() == GuiServer ) { switch ( e->type ) { case QWSEvent::Mouse: if ( e->asMouse() ->simpleData.state && !QWidget::find( e->window() ) ) emit clientMoused(); } } if ( e->type == QWSEvent::Key ) { if ( d->kbgrabber == 1 ) return TRUE; QWSKeyEvent *ke = ( QWSKeyEvent * ) e; if ( ke->simpleData.keycode == Qt::Key_F33 ) { // Use special "OK" key to press "OK" on top level widgets QWidget * active = activeWindow(); QWidget *popup = 0; if ( active && active->isPopup() ) { popup = active; active = active->parentWidget(); } if ( active && ( int ) active->winId() == ke->simpleData.window && !active->testWFlags( WStyle_Customize | WType_Popup | WType_Desktop ) ) { if ( ke->simpleData.is_press ) { if ( popup ) popup->close(); if ( active->inherits( "QDialog" ) ) { HackDialog * d = ( HackDialog * ) active; d->acceptIt(); return TRUE; } else if ( ( ( HackWidget * ) active ) ->needsOk() ) { QSignal s; s.connect( active, SLOT( accept() ) ); s.activate(); } else { // do the same as with the select key: Map to the default action of the widget: mapToDefaultAction( ke, Qt::Key_Return ); } } } } else if ( ke->simpleData.keycode == Qt::Key_F30 ) { // Use special "select" key to do whatever default action a widget has mapToDefaultAction( ke, Qt::Key_Space ); } else if ( ke->simpleData.keycode == Qt::Key_Escape && ke->simpleData.is_press ) { // Escape key closes app if focus on toplevel QWidget * active = activeWindow(); if ( active && active->testWFlags( WType_TopLevel ) && ( int ) active->winId() == ke->simpleData.window && !active->testWFlags( WStyle_Dialog | WStyle_Customize | WType_Popup | WType_Desktop ) ) { if ( active->inherits( "QDialog" ) ) { HackDialog * d = ( HackDialog * ) active; d->rejectIt(); return TRUE; } else if ( strcmp( argv() [ 0 ], "embeddedkonsole" ) != 0 ) { active->close(); } } } #if QT_VERSION < 231 // Filter out the F4/Launcher key from apps // ### The launcher key may not always be F4 on all devices if ( ( ( QWSKeyEvent * ) e ) ->simpleData.keycode == Qt::Key_F4 ) return TRUE; #endif } if ( e->type == QWSEvent::Focus ) { QWSFocusEvent * fe = ( QWSFocusEvent* ) e; QWidget* nfw = QWidget::find( e->window() ); if ( !fe->simpleData.get_focus ) { QWidget * active = activeWindow(); while ( active && active->isPopup() ) { active->close(); active = activeWindow(); } if ( !nfw && d->kbgrabber == 2 ) { ungrabKeyboard(); d->kbregrab = TRUE; // want kb back when we're active } } else { // make sure our modal widget is ALWAYS on top QWidget *topm = activeModalWidget(); if ( topm ) { topm->raise(); } if ( d->kbregrab ) { grabKeyboard(); d->kbregrab = FALSE; } } if ( fe->simpleData.get_focus && inputMethodDict ) { InputMethodHint m = inputMethodHint( QWidget::find( e->window() ) ); if ( m == AlwaysOff ) Global::hideInputMethod(); if ( m == AlwaysOn ) Global::showInputMethod(); } } return QApplication::qwsEventFilter( e ); } /*! Destroys the QPEApplication. */ QPEApplication::~QPEApplication() { ungrabKeyboard(); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) // Need to delete QCopChannels early, since the display will // be gone by the time we get to ~QObject(). delete sysChannel; delete pidChannel; #endif delete d; } /*! Returns <tt>$OPIEDIR/</tt>. */ QString QPEApplication::qpeDir() { const char * base = getenv( "OPIEDIR" ); if ( base ) return QString( base ) + "/"; return QString( "../" ); } /*! Returns the user's current Document directory. There is a trailing "/". */ QString QPEApplication::documentDir() { const char * base = getenv( "HOME" ); if ( base ) return QString( base ) + "/Documents/"; return QString( "../Documents/" ); } static int deforient = -1; /*! \internal */ int QPEApplication::defaultRotation() { if ( deforient < 0 ) { QString d = getenv( "QWS_DISPLAY" ); if ( d.contains( "Rot90" ) ) { deforient = 90; } else if ( d.contains( "Rot180" ) ) { deforient = 180; } else if ( d.contains( "Rot270" ) ) { deforient = 270; } else { deforient = 0; } } return deforient; } /*! \internal */ void QPEApplication::setDefaultRotation( int r ) { if ( qApp->type() == GuiServer ) { deforient = r; setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); } else { QCopEnvelope( "QPE/System", "setDefaultRotation(int)" ) << r; } } /*! \internal */ void QPEApplication::applyStyle() { Config config( "qpe" ); config.setGroup( "Appearance" ); // Widget style QString style = config.readEntry( "Style", "Light" ); internalSetStyle( style ); // Colors QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); QPalette pal( btncolor, bgcolor ); QString color = config.readEntry( "Highlight", "#800000" ); pal.setColor( QColorGroup::Highlight, QColor( color ) ); color = config.readEntry( "HighlightedText", "#FFFFFF" ); pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); color = config.readEntry( "Text", "#000000" ); pal.setColor( QColorGroup::Text, QColor( color ) ); color = config.readEntry( "ButtonText", "#000000" ); pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); color = config.readEntry( "Base", "#FFFFFF" ); pal.setColor( QColorGroup::Base, QColor( color ) ); pal.setColor( QPalette::Disabled, QColorGroup::Text, pal.color( QPalette::Active, QColorGroup::Background ).dark() ); setPalette( pal, TRUE ); } void QPEApplication::systemMessage( const QCString & msg, const QByteArray & data ) { #ifdef Q_WS_QWS QDataStream stream( data, IO_ReadOnly ); if ( msg == "applyStyle()" ) { applyStyle(); } else if ( msg == "setScreenSaverInterval(int)" ) { if ( type() == GuiServer ) { int time; stream >> time; setScreenSaverInterval( time ); } } else if ( msg == "setScreenSaverIntervals(int,int,int)" ) { if ( type() == GuiServer ) { int t1, t2, t3; stream >> t1 >> t2 >> t3; setScreenSaverIntervals( t1, t2, t3 ); } } else if ( msg == "setBacklight(int)" ) { if ( type() == GuiServer ) { int bright; stream >> bright; setBacklight( bright ); } } else if ( msg == "setDefaultRotation(int)" ) { if ( type() == GuiServer ) { int r; stream >> r; setDefaultRotation( r ); } } else if ( msg == "shutdown()" ) { if ( type() == GuiServer ) shutdown(); } else if ( msg == "quit()" ) { if ( type() != GuiServer ) tryQuit(); } else if ( msg == "forceQuit()" ) { if ( type() != GuiServer ) quit(); |