summaryrefslogtreecommitdiff
authorsandman <sandman>2002-10-28 04:48:35 (UTC)
committer sandman <sandman>2002-10-28 04:48:35 (UTC)
commitcb687974f9e97c0ce6117b0ac4551ad4d4342b6a (patch) (side-by-side diff)
tree3128de5e3647a786bcc47a5fb14af06ba65f2a09
parentf3c9e44d9d694a0a803fb6a7d79cfa8d173b9864 (diff)
downloadopie-cb687974f9e97c0ce6117b0ac4551ad4d4342b6a.zip
opie-cb687974f9e97c0ce6117b0ac4551ad4d4342b6a.tar.gz
opie-cb687974f9e97c0ce6117b0ac4551ad4d4342b6a.tar.bz2
- moved the QPEScreenSaver to screensaver.cpp/.h and renamed the class to
OpieScreenSaver - (hopefully) fixed all outstanding bugs regarding the new on batt/on ac handling - first (primitive) version of light sensor control (but it works)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/desktop.cpp317
-rw-r--r--core/launcher/desktop.h7
-rw-r--r--core/launcher/launcher.pro2
-rw-r--r--core/launcher/screensaver.cpp237
-rw-r--r--core/launcher/screensaver.h61
5 files changed, 340 insertions, 284 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index 2ea6d27..bc43475 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -7,48 +7,49 @@
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "desktop.h"
#include "info.h"
#include "launcher.h"
#include "qcopbridge.h"
#include "shutdownimpl.h"
#include "startmenu.h"
#include "taskbar.h"
#include "transferserver.h"
#include "irserver.h"
#include "packageslave.h"
+#include "screensaver.h"
#include <qpe/applnk.h>
#include <qpe/mimetype.h>
#include <qpe/password.h>
#include <qpe/config.h>
#include <qpe/power.h>
#include <qpe/timeconversion.h>
#include <qpe/qcopenvelope_qws.h>
#include <qpe/network.h>
#include <qpe/global.h>
#if defined( QT_QWS_CUSTOM ) || defined( QT_QWS_IPAQ )
#include <qpe/custom.h>
#endif
#include <opie/odevice.h>
#include <qgfx_qws.h>
#include <qmainwindow.h>
#include <qmessagebox.h>
#include <qtimer.h>
#include <qwindowsystem_qws.h>
#include <qvaluelist.h>
@@ -130,373 +131,162 @@ private:
int currentPriority;
int alertCount;
};
void DesktopPowerAlerter::alert( const QString &text, int priority )
{
alertCount++;
if ( alertCount < priority )
return ;
if ( priority > currentPriority )
return ;
currentPriority = priority;
setText( text );
show();
}
void DesktopPowerAlerter::hideEvent( QHideEvent *e )
{
QMessageBox::hideEvent( e );
alertCount = 0;
currentPriority = INT_MAX;
}
-class QPEScreenSaver : public QWSScreenSaver
-{
-private:
- int LcdOn;
-
-public:
- QPEScreenSaver()
- {
- m_disable_suspend = 100;
- m_enable_dim = false;
- m_enable_lightoff = false;
- m_enable_onlylcdoff = false;
-
- m_disable_suspend_ac = 100;
- m_enable_dim_ac = false;
- m_enable_lightoff_ac = false;
- m_enable_onlylcdoff_ac = false;
- m_disable_apm_ac = false;
-
- m_lcd_status = true;
-
- m_backlight_normal = -1;
- m_backlight_current = -1;
- m_backlight_forcedoff = false;
-
- // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off)
- ODevice::inst ( )-> setDisplayStatus ( true );
- setBacklight ( -1 );
- }
- void restore()
- {
- if ( !m_lcd_status ) { // We must have turned it off
- ODevice::inst ( ) -> setDisplayStatus ( true );
- m_lcd_status = true;
- }
-
- setBacklightInternal ( -1 );
- }
- bool save( int level )
- {
- bool onAC = ( PowerStatusManager::readStatus().acStatus() == PowerStatus::Online );
-
- switch ( level ) {
- case 0:
-
- if ( m_disable_suspend_ac > 0 && m_enable_dim_ac && onAC ) {
- if ( m_backlight_current > 1 )
- setBacklight( 1 ); // lowest non-off
- } else if ( !onAC && m_disable_suspend > 0 && m_enable_dim ) {
- if ( m_backlight_current > 1 )
- setBacklightInternal( 1 ); // lowest non-off
- }
- return true;
- break;
- case 1:
-
- if ( m_disable_suspend_ac > 1 && m_enable_lightoff_ac && onAC ) {
- setBacklightInternal( 0 ); // off
- } else if ( !onAC && m_disable_suspend > 1 && m_enable_lightoff ) {
- setBacklightInternal( 0 ); // off
- }
- return true;
- break;
- case 2:
- if ( m_disable_apm_ac && onAC ) {
- return true;
- }
-
- if ( m_enable_onlylcdoff_ac && onAC ) {
- ODevice::inst ( ) -> setDisplayStatus ( false );
- m_lcd_status = false;
- return true;
- }
- else if ( !onAC && m_enable_onlylcdoff ) {
- ODevice::inst ( ) -> setDisplayStatus ( false );
- m_lcd_status = false;
- return true;
- }
- else // We're going to suspend the whole machine
- {
- if ( ( m_disable_suspend_ac > 2 && onAC ) && ( !Network::networkOnline ( ) ) ) {
- QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
- return true;
- }
- if ( !onAC && ( m_disable_suspend > 2 ) && ( !Network::networkOnline ( ) ) ) {
- QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
- return true;
- }
- }
- break;
- }
- return false;
- }
-
-private:
- 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;
- }
-
-public:
- void setIntervals( 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;
- m_enable_dim = ( ( i1 != 0 ) ? config. readNumEntry ( "Dim", 1 ) : false );
- m_enable_lightoff = ( ( i2 != 0 ) ? config. readNumEntry ( "LightOff", 1 ) : false );
- m_enable_onlylcdoff = config.readNumEntry ( "LcdOffOnly", 0 );
-
- if ( !i1 && !i2 && !i3 )
- QWSServer::setScreenSaverInterval( 0 );
- else
- QWSServer::setScreenSaverIntervals( v );
- }
-
- void setIntervalsAC( int i1, int i2, int i3 )
- {
- Config config( "qpe" );
- config.setGroup( "Screensaver" );
-
- int v[ 4 ];
- i1 = ssi( i1, config, "DimAC", "Interval_DimAC", 30 );
- i2 = ssi( i2, config, "LightOffAC", "Interval_LightOffAC", 20 );
- i3 = ssi( i3, config, "", "IntervalAC", 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;
- m_enable_dim_ac = ( ( i1 != 0 ) ? config.readNumEntry ( "DimAC", 1 ) : false );
- m_enable_lightoff_ac = ( ( i2 != 0 ) ? config.readNumEntry ( "LightOffAC", 1 ) : false );
- m_enable_onlylcdoff_ac = config.readNumEntry ( "LcdOffOnlyAC", 0 );
- m_disable_apm_ac = config.readNumEntry ( "NoApmAC", 0 );
-
- if ( !i1 && !i2 && !i3 )
- QWSServer::setScreenSaverInterval( 0 );
- else
- QWSServer::setScreenSaverIntervals( v );
- }
-
- void setInterval ( int interval )
- {
- setIntervals ( -1, -1, interval );
- setIntervalsAC ( -1, -1, interval );
- }
-
- void setMode ( int mode )
- {
- if ( mode > m_disable_suspend )
- setInterval( -1 );
- m_disable_suspend = mode;
- }
-
- void setBacklight ( int bright )
- {
- // Read from config
- Config config ( "qpe" );
- config. setGroup ( "Screensaver" );
- m_backlight_normal = config. readNumEntry ( "Brightness", 255 );
-
- setBacklightInternal ( bright );
- }
-
-private:
- void setBacklightInternal ( int bright )
- {
- if ( bright == -3 ) {
- // Forced on
- m_backlight_forcedoff = false;
- bright = -1;
- }
- if ( m_backlight_forcedoff && bright != -2 )
- return ;
- if ( bright == -2 ) {
- // Toggle between off and on
- bright = m_backlight_current ? 0 : -1;
- m_backlight_forcedoff = !bright;
- }
- if ( bright == -1 )
- bright = m_backlight_normal;
-
- if ( bright != m_backlight_current ) {
- ODevice::inst ( )-> setDisplayBrightness ( bright );
- m_backlight_current = bright;
- }
- }
-
-public:
- void setDisplayState ( bool on )
- {
- if ( m_lcd_status != on ) {
- ODevice::inst ( ) -> setDisplayStatus ( on );
- m_lcd_status = on;
- }
- }
-
-private:
- int m_disable_suspend;
- bool m_enable_dim;
- bool m_enable_lightoff;
- bool m_enable_onlylcdoff;
-
- int m_disable_suspend_ac;
- bool m_enable_dim_ac;
- bool m_enable_lightoff_ac;
- bool m_enable_onlylcdoff_ac;
- bool m_disable_apm_ac;
-
- bool m_lcd_status;
-
- int m_backlight_normal;
- int m_backlight_current;
- bool m_backlight_forcedoff;
-};
void DesktopApplication::switchLCD ( bool on )
{
if ( qApp ) {
DesktopApplication *dapp = (DesktopApplication *) qApp;
if ( dapp-> m_screensaver ) {
if ( on ) {
dapp-> m_screensaver-> setDisplayState ( true );
dapp-> m_screensaver-> setBacklight ( -3 );
}
else {
dapp-> m_screensaver-> setDisplayState ( false );
}
}
}
}
DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
: QPEApplication( argc, argv, appType )
{
- m_timer = new QTimer( this );
- connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) );
Config cfg( "apm" );
cfg.setGroup( "Warnings" );
- m_timer->start( 5000 );
//cfg.readNumEntry( "checkinterval", 10000 )
m_powerVeryLow = cfg.readNumEntry( "powerverylow", 10 );
m_powerCritical = cfg.readNumEntry( "powercritical", 5 );
- ps = new PowerStatus;
+
+ m_ps = new PowerStatus;
+ m_ps_last = new PowerStatus;
pa = new DesktopPowerAlerter( 0 );
+ m_timer = new QTimer( this );
+ connect( m_timer, SIGNAL( timeout() ), this, SLOT( apmTimeout() ) );
+ m_timer->start( 5000 );
+
channel = new QCopChannel( "QPE/Desktop", this );
connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) );
channel = new QCopChannel( "QPE/System", this );
connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
- m_screensaver = new QPEScreenSaver;
-
+ m_screensaver = new OpieScreenSaver ( );
m_screensaver-> setInterval ( -1 );
QWSServer::setScreenSaver( m_screensaver );
+
+ apmTimeout ( );
}
DesktopApplication::~DesktopApplication()
{
- delete ps;
+ delete m_ps;
+ delete m_ps_last;
delete pa;
}
+void DesktopApplication::apmTimeout()
+{
+ qpedesktop->checkMemory(); // in case no events are being generated
+
+ *m_ps_last = *m_ps;
+ *m_ps = PowerStatusManager::readStatus();
+
+ if ( m_ps-> acStatus ( ) != m_ps_last-> acStatus ( ))
+ m_screensaver-> powerStatusChanged ( *m_ps );
+
+ int bat = m_ps-> batteryPercentRemaining ( );
+
+ if ( m_ps_last-> batteryPercentRemaining ( ) != bat ) {
+ if ( bat <= m_powerCritical )
+ pa->alert( tr( "Battery level is critical!\nKeep power off until power restored!" ), 1 );
+ else if ( bat <= m_powerVeryLow )
+ pa->alert( tr( "Battery is running very low." ), 2 );
+
+
+ if ( m_ps-> backupBatteryStatus ( ) == PowerStatus::VeryLow )
+ pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 2 );
+ }
+}
+
void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &data )
{
QDataStream stream( data, IO_ReadOnly );
if ( msg == "keyRegister(int key, QString channel, QString message)" ) {
int k;
QString c, m;
stream >> k;
stream >> c;
stream >> m;
qWarning( "KeyRegisterReceived: %i, %s, %s", k, ( const char* ) c, ( const char * ) m );
keyRegisterList.append( QCopKeyRegister( k, c, m ) );
}
}
void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
{
QDataStream stream ( data, IO_ReadOnly );
if ( msg == "setScreenSaverInterval(int)" ) {
int time;
stream >> time;
m_screensaver-> setInterval( time );
}
else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
int t1, t2, t3;
stream >> t1 >> t2 >> t3;
m_screensaver-> setIntervals( t1, t2, t3 );
}
- else if ( msg == "setScreenSaverIntervalsAC(int,int,int)" ) {
- int t1, t2, t3;
- stream >> t1 >> t2 >> t3;
- m_screensaver-> setIntervalsAC( t1, t2, t3 );
- }
else if ( msg == "setBacklight(int)" ) {
int bright;
stream >> bright;
m_screensaver-> setBacklight( bright );
}
else if ( msg == "setScreenSaverMode(int)" ) {
int mode;
stream >> mode;
m_screensaver-> setMode ( mode );
}
else if ( msg == "reloadPowerWarnSettings()" ) {
reloadPowerWarnSettings();
}
else if ( msg == "setDisplayState(int)" ) {
int state;
stream >> state;
m_screensaver-> setDisplayState ( state != 0 );
}
else if ( msg == "suspend()" ) {
emit power();
}
}
void DesktopApplication::reloadPowerWarnSettings() {
@@ -618,81 +408,48 @@ bool DesktopApplication::qwsEventFilter( QWSEvent *e )
}
if ( ( press && !autoRepeat ) || ( !press && autoRepeat ) )
qpedesktop->keyClick();
}
else {
if ( e->type == QWSEvent::Mouse ) {
QWSMouseEvent * me = ( QWSMouseEvent * ) e;
static bool up = TRUE;
if ( me->simpleData.state & LeftButton ) {
if ( up ) {
up = FALSE;
qpedesktop->screenClick();
}
}
else {
up = TRUE;
}
}
}
return QPEApplication::qwsEventFilter( e );
}
#endif
-void DesktopApplication::psTimeout( int batRemaining )
-{
- *ps = PowerStatusManager::readStatus();
-
- // maybe now since its triggered by apm change there might be to few warnings
- // if ( ( ps->batteryStatus() == PowerStatus::VeryLow ) ) {
- if ( ( batRemaining == m_powerVeryLow ) ) {
- pa->alert( tr( "Battery is running very low." ), 2 );
- }
-
- // if ( ps->batteryStatus() == PowerStatus::Critical ) {
- if ( batRemaining == m_powerCritical ) {
- pa->alert( tr( "Battery level is critical!\n"
- "Keep power off until power restored!" ), 1 );
- }
-
- if ( ps->backupBatteryStatus() == PowerStatus::VeryLow ) {
- pa->alert( tr( "The Back-up battery is very low.\nPlease charge the back-up battery." ), 2 );
- }
-}
-
-void DesktopApplication::apmTimeout()
-{
- qpedesktop->checkMemory(); // in case no events are being generated
-
- *ps = PowerStatusManager::readStatus();
-
- if ( m_currentPowerLevel != ps->batteryPercentRemaining() ) {
- // not very nice, since psTimeout parses the again
- m_currentPowerLevel = ps->batteryPercentRemaining();
- psTimeout( m_currentPowerLevel );
- }
-}
void DesktopApplication::sendCard()
{
delete cardSendTimer;
cardSendTimer = 0;
QString card = getenv( "HOME" );
card += "/Applications/addressbook/businesscard.vcf";
if ( QFile::exists( card ) ) {
QCopEnvelope e( "QPE/Obex", "send(QString,QString,QString)" );
QString mimetype = "text/x-vCard";
e << tr( "business card" ) << card << mimetype;
}
}
#if defined(QPE_HAVE_MEMALERTER)
QPE_MEMALERTER_IMPL
#endif
//===========================================================================
Desktop::Desktop() :
QWidget( 0, 0, WStyle_Tool | WStyle_Customize ),
qcopBridge( 0 ),
diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h
index 8308811..f6059b8 100644
--- a/core/launcher/desktop.h
+++ b/core/launcher/desktop.h
@@ -16,98 +16,97 @@
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef __DESKTOP_H__
#define __DESKTOP_H__
#include "shutdownimpl.h"
#include <qpe/qpeapplication.h>
#include <qwidget.h>
#include <qdatetime.h>
class Background;
class Launcher;
class TaskBar;
class PowerStatus;
class QCopBridge;
class TransferServer;
class DesktopPowerAlerter;
class PackageSlave;
-class QPEScreenSaver;
+class OpieScreenSaver;
class DesktopApplication : public QPEApplication
{
Q_OBJECT
public:
DesktopApplication( int& argc, char **argv, Type t );
~DesktopApplication();
static void switchLCD ( bool on ); // only for togglePower in Desktop
signals:
void menu();
void home();
void datebook();
void contacts();
void launch();
void email();
void backlight();
void power();
void symbol();
void numLockStateToggle();
void capsLockStateToggle();
void prepareForRestart();
protected:
#ifdef Q_WS_QWS
bool qwsEventFilter( QWSEvent * );
#endif
void shutdown();
void restart();
public slots:
virtual void desktopMessage ( const QCString &msg, const QByteArray &data );
virtual void systemMessage ( const QCString &msg, const QByteArray &data );
protected slots:
void shutdown( ShutdownImpl::Type );
- void psTimeout( int );
void apmTimeout();
void sendCard();
private:
void reloadPowerWarnSettings();
DesktopPowerAlerter *pa;
- PowerStatus *ps;
+ PowerStatus *m_ps, *m_ps_last;
QTimer *cardSendTimer;
QCopChannel *channel;
- QPEScreenSaver *m_screensaver;
+ OpieScreenSaver *m_screensaver;
QTimer * m_timer;
int m_powerVeryLow;
int m_powerCritical;
int m_currentPowerLevel;
};
class Desktop : public QWidget
{
Q_OBJECT
public:
Desktop();
~Desktop();
static bool screenLocked();
void show();
void checkMemory();
void keyClick();
void screenClick();
static void soundAlarm();
public slots:
diff --git a/core/launcher/launcher.pro b/core/launcher/launcher.pro
index 95642af..83f8b5c 100644
--- a/core/launcher/launcher.pro
+++ b/core/launcher/launcher.pro
@@ -1,70 +1,72 @@
TEMPLATE = app
CONFIG = qt warn_on release
DESTDIR = ../../bin
HEADERS = background.h \
desktop.h \
+ screensaver.h \
qprocess.h \
mediummountgui.h \
info.h \
appicons.h \
taskbar.h \
sidething.h \
runningappbar.h \
stabmon.h \
inputmethods.h \
systray.h \
wait.h \
shutdownimpl.h \
launcher.h \
launcherview.h \
../../core/apps/calibrate/calibrate.h \
startmenu.h \
transferserver.h \
qcopbridge.h \
packageslave.h \
irserver.h \
../../rsync/buf.h \
../../rsync/checksum.h \
../../rsync/command.h \
../../rsync/emit.h \
../../rsync/job.h \
../../rsync/netint.h \
../../rsync/protocol.h \
../../rsync/prototab.h \
../../rsync/rsync.h \
../../rsync/search.h \
../../rsync/stream.h \
../../rsync/sumset.h \
../../rsync/trace.h \
../../rsync/types.h \
../../rsync/util.h \
../../rsync/whole.h \
../../rsync/config_rsync.h \
../../rsync/qrsync.h \
quicklauncher.h
SOURCES = background.cpp \
desktop.cpp \
+ screensaver.cpp \
mediummountgui.cpp \
qprocess.cpp qprocess_unix.cpp \
info.cpp \
appicons.cpp \
taskbar.cpp \
sidething.cpp \
runningappbar.cpp \
stabmon.cpp \
inputmethods.cpp \
systray.cpp \
wait.cpp \
shutdownimpl.cpp \
launcher.cpp \
launcherview.cpp \
../../core/apps/calibrate/calibrate.cpp \
transferserver.cpp \
packageslave.cpp \
irserver.cpp \
qcopbridge.cpp \
startmenu.cpp \
main.cpp \
../../rsync/base64.c \
../../rsync/buf.c \
../../rsync/checksum.c \
diff --git a/core/launcher/screensaver.cpp b/core/launcher/screensaver.cpp
new file mode 100644
index 0000000..9e823ff
--- a/dev/null
+++ b/core/launcher/screensaver.cpp
@@ -0,0 +1,237 @@
+
+#include "screensaver.h"
+
+#include <qpe/config.h>
+#include <qpe/power.h>
+#include <qpe/network.h>
+
+#include <opie/odevice.h>
+
+
+using namespace Opie;
+
+
+OpieScreenSaver::OpieScreenSaver ( )
+ : QObject ( 0, "screensaver" ), QWSScreenSaver ( )
+{
+ m_disable_suspend = 100;
+ m_enable_dim = false;
+ m_enable_lightoff = false;
+ m_enable_suspend = false;
+ m_onlylcdoff = false;
+
+ m_enable_dim_ac = false;
+ m_enable_lightoff_ac = false;
+ m_enable_suspend_ac = false;
+ m_onlylcdoff_ac = false;
+
+ m_use_light_sensor = false;
+ m_backlight_sensor = -1;
+
+ m_lcd_status = true;
+
+ m_backlight_normal = -1;
+ m_backlight_current = -1;
+ m_backlight_forcedoff = false;
+
+ m_on_ac = false;
+
+ m_level = -1;
+
+ // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off)
+ ODevice::inst ( )-> setDisplayStatus ( true );
+ setBacklight ( -1 );
+}
+
+
+void OpieScreenSaver::restore()
+{
+ m_level = -1;
+
+ if ( !m_lcd_status ) { // We must have turned it off
+ ODevice::inst ( ) -> setDisplayStatus ( true );
+ m_lcd_status = true;
+ }
+
+ setBacklightInternal ( -1 );
+}
+
+
+bool OpieScreenSaver::save( int level )
+{
+ m_level = level;
+
+ switch ( level ) {
+ case 0:
+ if (( m_on_ac && m_enable_dim_ac ) ||
+ ( !m_on_ac && m_enable_dim )) {
+ if (( m_disable_suspend > 0 ) && ( m_backlight_current > 1 ) && !m_use_light_sensor )
+ setBacklightInternal ( 1 ); // lowest non-off
+ }
+ return true;
+ break;
+
+ case 1:
+ if (( m_on_ac && m_enable_lightoff_ac ) ||
+ ( !m_on_ac && m_enable_lightoff )) {
+ if ( m_disable_suspend > 1 )
+ setBacklightInternal ( 0 ); // off
+ }
+ return true;
+ break;
+
+ case 2:
+ if (( m_on_ac && !m_enable_suspend_ac ) ||
+ ( !m_on_ac && !m_enable_suspend )) {
+ return true;
+ }
+
+ if (( m_on_ac && m_onlylcdoff_ac ) ||
+ ( !m_on_ac && m_onlylcdoff )) {
+ ODevice::inst ( ) -> setDisplayStatus ( false );
+ m_lcd_status = false;
+ return true;
+ }
+
+ // We're going to suspend the whole machine
+
+ if (( m_disable_suspend > 2 ) && !Network::networkOnline ( )) {
+ QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
+ return true;
+ }
+
+ break;
+ }
+ return false;
+}
+
+
+void OpieScreenSaver::setIntervals ( int i1, int i2, int i3 )
+{
+ Config config ( "apm" );
+ config. setGroup ( m_on_ac ? "AC" : "Battery" );
+
+ int v[ 4 ];
+ if ( i1 < 0 )
+ i1 = config. readNumEntry ( "Dim", 30 );
+ if ( i2 < 0 )
+ i2 = config. readNumEntry ( "LightOff", 20 );
+ if ( i3 < 0 )
+ i3 = config. readNumEntry ( "Suspend", 60 );
+
+ if ( m_on_ac ) {
+ m_enable_dim_ac = ( i1 > 0 );
+ m_enable_lightoff_ac = ( i2 > 0 );
+ m_enable_suspend_ac = ( i3 > 0 );
+ m_onlylcdoff_ac = config.readNumEntry ( "LcdOffOnly", 0 );
+ }
+ else {
+ m_enable_dim = ( i1 > 0 );
+ m_enable_lightoff = ( i2 > 0 );
+ m_enable_suspend = ( i3 > 0 );
+ m_onlylcdoff = config.readNumEntry ( "LcdOffOnly", 0 );
+ }
+
+ 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;
+
+ if ( !i1 && !i2 && !i3 )
+ QWSServer::setScreenSaverInterval( 0 );
+ else
+ QWSServer::setScreenSaverIntervals( v );
+}
+
+
+void OpieScreenSaver::setInterval ( int interval )
+{
+ setIntervals ( -1, -1, interval );
+}
+
+
+void OpieScreenSaver::setMode ( int mode )
+{
+ if ( mode > m_disable_suspend )
+ setInterval ( -1 );
+ m_disable_suspend = mode;
+}
+
+
+void OpieScreenSaver::setBacklight ( int bright )
+{
+ // Read from config
+ Config config ( "apm" );
+ config. setGroup ( m_on_ac ? "AC" : "Battery" );
+ m_backlight_normal = config. readNumEntry ( "Brightness", 255 );
+
+ m_use_light_sensor = config. readBoolEntry ( "LightSensor", false );
+
+ qDebug ( "setBacklight: %d (ls: %d)", m_backlight_normal, m_use_light_sensor ? 1 : 0 );
+
+ killTimers ( );
+ if ( m_use_light_sensor ) {
+ timerEvent ( 0 );
+ startTimer ( 2000 );
+ }
+
+ setBacklightInternal ( bright );
+}
+
+
+void OpieScreenSaver::setBacklightInternal ( int bright )
+{
+ if ( bright == -3 ) {
+ // Forced on
+ m_backlight_forcedoff = false;
+ bright = -1;
+ }
+ if ( m_backlight_forcedoff && bright != -2 )
+ return ;
+ if ( bright == -2 ) {
+ // Toggle between off and on
+ bright = m_backlight_current ? 0 : -1;
+ m_backlight_forcedoff = !bright;
+ }
+ if ( bright == -1 )
+ bright = m_use_light_sensor ? m_backlight_sensor : m_backlight_normal;
+
+ if ( bright != m_backlight_current ) {
+ ODevice::inst ( )-> setDisplayBrightness ( bright );
+ m_backlight_current = bright;
+ }
+}
+
+
+void OpieScreenSaver::timerEvent ( QTimerEvent * )
+{
+ m_backlight_sensor = (( 255 - ODevice::inst ( )-> readLightSensor ( )) * m_backlight_normal ) / 255;
+
+ if ( m_level <= 0 )
+ setBacklightInternal ( -1 );
+}
+
+
+void OpieScreenSaver::setDisplayState ( bool on )
+{
+ if ( m_lcd_status != on ) {
+ ODevice::inst ( ) -> setDisplayStatus ( on );
+ m_lcd_status = on;
+ }
+}
+
+
+void OpieScreenSaver::powerStatusChanged ( PowerStatus ps )
+{
+ bool newonac = ( ps. acStatus ( ) == PowerStatus::Online );
+
+ if ( newonac != m_on_ac ) {
+ m_on_ac = newonac;
+ setInterval ( -1 );
+ setBacklight ( -1 );
+ restore ( );
+ }
+}
+
diff --git a/core/launcher/screensaver.h b/core/launcher/screensaver.h
new file mode 100644
index 0000000..9126f33
--- a/dev/null
+++ b/core/launcher/screensaver.h
@@ -0,0 +1,61 @@
+#ifndef __LAUNCHER_SCREENSAVER_H__
+#define __LAUNCHER_SCREENSAVER_H__
+
+#include <qwindowsystem_qws.h>
+#include <qobject.h>
+
+#include <qpe/power.h>
+
+class OpieScreenSaver : public QObject, public QWSScreenSaver
+{
+public:
+ OpieScreenSaver ( );
+
+ void restore ( );
+ bool save ( int level );
+
+ void setIntervals( int i1, int i2, int i3 );
+ void setIntervalsAC( int i1, int i2, int i3 );
+
+ void setInterval ( int interval );
+
+ void setMode ( int mode );
+
+ void setBacklight ( int bright );
+ void setDisplayState ( bool on );
+
+ void powerStatusChanged ( PowerStatus ps );
+
+private:
+ void setBacklightInternal ( int bright );
+
+protected:
+ virtual void timerEvent ( QTimerEvent * );
+
+private:
+ int m_disable_suspend;
+ bool m_enable_dim;
+ bool m_enable_lightoff;
+ bool m_enable_suspend;
+ bool m_onlylcdoff;
+
+ bool m_enable_dim_ac;
+ bool m_enable_lightoff_ac;
+ bool m_enable_suspend_ac;
+ bool m_onlylcdoff_ac;
+
+ bool m_use_light_sensor;
+ int m_backlight_sensor;
+
+ bool m_lcd_status;
+
+ int m_backlight_normal;
+ int m_backlight_current;
+ bool m_backlight_forcedoff;
+
+ bool m_on_ac;
+
+ int m_level;
+};
+
+#endif