summaryrefslogtreecommitdiff
authorzecke <zecke>2003-08-28 14:38:14 (UTC)
committer zecke <zecke>2003-08-28 14:38:14 (UTC)
commitcee2ebb839cdb7d586210e6f99c5e2c4d535c722 (patch) (side-by-side diff)
tree012f80f0b7ee353f0e1b29f5d4bc6d3534dbeb42
parent245dcac2f79d7409f80da37f9c6c47fff70dc949 (diff)
downloadopie-cee2ebb839cdb7d586210e6f99c5e2c4d535c722.zip
opie-cee2ebb839cdb7d586210e6f99c5e2c4d535c722.tar.gz
opie-cee2ebb839cdb7d586210e6f99c5e2c4d535c722.tar.bz2
-kill casiopai support
-Opie Rotation -Opie init -proper killing to clean up
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/main.cpp306
1 files changed, 234 insertions, 72 deletions
diff --git a/core/launcher/main.cpp b/core/launcher/main.cpp
index 69a7fea..075985d 100644
--- a/core/launcher/main.cpp
+++ b/core/launcher/main.cpp
@@ -1,191 +1,353 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
-** This file is part of Qtopia Environment.
+** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** 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"
+#ifndef QTOPIA_INTERNAL_FILEOPERATIONS
+#define QTOPIA_INTERNAL_FILEOPERATIONS
+#endif
+#include "server.h"
+#include "serverapp.h"
#include "taskbar.h"
#include "stabmon.h"
+#include "launcher.h"
+#include "firstuse.h"
+#include "launcherglobal.h"
-#include <qpe/qpeapplication.h>
-#include <qpe/network.h>
-#include <qpe/config.h>
-#if defined( QT_QWS_SL5XXX ) || defined( QT_QWS_IPAQ ) || defined (QT_QWS_RAMSES)
-#include <qpe/custom.h>
-#endif
+#include <qtopia/qpeapplication.h>
+#include <qtopia/network.h>
+#include <qtopia/config.h>
+#include <qtopia/custom.h>
+#include <qtopia/global.h>
-#include <opie/odevice.h>
-
-#include <qmessagebox.h>
#include <qfile.h>
-#include <qimage.h>
+#include <qdir.h>
+#ifdef QWS
#include <qwindowsystem_qws.h>
-#include <qwsmouse_qws.h>
-#include <qpe/qcopenvelope_qws.h>
-#include <qpe/alarmserver.h>
+#include <qtopia/qcopenvelope_qws.h>
+#endif
+#include <qtopia/alarmserver.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
+#ifndef Q_OS_WIN32
#include <unistd.h>
+#else
+#include <process.h>
+#endif
+
+#include "calibrate.h"
-#include "../calibrate/calibrate.h"
+
+#ifdef QT_QWS_LOGIN
+#include "../login/qdmdialogimpl.h"
+#endif
+
+#ifdef Q_WS_QWS
+#include <qkeyboard_qws.h>
+#endif
+
+#include <qmessagebox.h>
+#include <opie/odevice.h>
using namespace Opie;
+
+static void cleanup()
+{
+ QDir dir( Opie::Global::tempDir(), "qcop-msg-*" );
+
+ QStringList stale = dir.entryList();
+ QStringList::Iterator it;
+ for ( it = stale.begin(); it != stale.end(); ++it ) {
+ dir.remove( *it );
+ }
+}
+
+static void refreshTimeZoneConfig()
+{
+ /* ### FIXME timezone handling */
+#if 0
+ // We need to help WorldTime in setting up its configuration for
+ // the current translation
+ // BEGIN no tr
+ const char *defaultTz[] = {
+ "America/New_York",
+ "America/Los_Angeles",
+ "Europe/Oslo",
+ "Asia/Tokyo",
+ "Asia/Hong_Kong",
+ "Australia/Brisbane",
+ 0
+ };
+ // END no tr
+
+ TimeZone curZone;
+ QString zoneID;
+ int zoneIndex;
+ Config cfg = Config( "WorldTime" );
+ cfg.setGroup( "TimeZones" );
+ if (!cfg.hasKey( "Zone0" )){
+ // We have no existing timezones use the defaults which are untranslated strings
+ QString currTz = TimeZone::current().id();
+ QStringList zoneDefaults;
+ zoneDefaults.append( currTz );
+ for ( int i = 0; defaultTz[i] && zoneDefaults.count() < 6; i++ ) {
+ if ( defaultTz[i] != currTz )
+ zoneDefaults.append( defaultTz[i] );
+ }
+ zoneIndex = 0;
+ for (QStringList::Iterator it = zoneDefaults.begin(); it != zoneDefaults.end() ; ++it){
+ cfg.writeEntry( "Zone" + QString::number( zoneIndex ) , *it);
+ zoneIndex++;
+ }
+ }
+ // We have an existing list of timezones refresh the
+ // translations of TimeZone name
+ zoneIndex = 0;
+ while (cfg.hasKey( "Zone"+ QString::number( zoneIndex ))){
+ zoneID = cfg.readEntry( "Zone" + QString::number( zoneIndex ));
+ curZone = TimeZone( zoneID );
+ if ( !curZone.isValid() ){
+ qDebug( "initEnvironment() Invalid TimeZone %s", zoneID.latin1() );
+ break;
+ }
+ cfg.writeEntry( "ZoneName" + QString::number( zoneIndex ), curZone.city() );
+ zoneIndex++;
+ }
+#endif
+}
+
void initEnvironment()
{
- int rot;
+#ifdef Q_OS_WIN32
+ // Config file requires HOME dir which uses QDir which needs the winver
+ qt_init_winver();
+#endif
Config config("locale");
-
config.setGroup( "Location" );
- QString tz = config.readEntry( "Timezone", getenv("TZ") );
+ QString tz = config.readEntry( "Timezone", getenv("TZ") ).stripWhiteSpace();
- // if not timezone set, pick New York
- if (tz.isNull())
- tz = "America/New_York";
+ // if not timezone set, pick New York
+ if (tz.isNull() || tz.isEmpty())
+ tz = "America/New_York";
setenv( "TZ", tz, 1 );
config.writeEntry( "Timezone", tz);
config.setGroup( "Language" );
- QString lang = config.readEntry( "Language", getenv("LANG") );
- if ( !lang.isNull() )
- setenv( "LANG", lang, 1 );
+ QString lang = config.readEntry( "Language", getenv("LANG") ).stripWhiteSpace();
+ if( lang.isNull() || lang.isEmpty())
+ lang = "en_US";
+
+ setenv( "LANG", lang, 1 );
+ config.writeEntry("Language", lang);
+ config.write();
#if !defined(QT_QWS_CASSIOPEIA) && !defined(QT_QWS_IPAQ) && !defined(QT_QWS_SL5XXX)
- setenv( "QWS_SIZE", "240x320", 0 );
+ setenv( "QWS_SIZE", "240x320", 0 );
#endif
- QString env(getenv("QWS_DISPLAY"));
- if (env.contains("Transformed")) {
- // transformed driver default rotation is controlled by the hardware.
- Config config("qpe");
- config.setGroup( "Rotation" );
- if ( ( rot = config.readNumEntry( "Rot", -1 ) ) == -1 )
- rot = ODevice::inst ( )-> rotation ( ) * 90;
- setenv("QWS_DISPLAY", QString("Transformed:Rot%1:0").arg(rot), 1);
- QPEApplication::defaultRotation ( ); /* to ensure deforient matches reality */
- }
+
+ QString env(getenv("QWS_DISPLAY"));
+ if (env.contains("Transformed")) {
+ int rot;
+ // transformed driver default rotation is controlled by the hardware.
+ Config config("qpe");
+ config.setGroup( "Rotation" );
+ if ( ( rot = config.readNumEntry( "Rot", -1 ) ) == -1 )
+ rot = ODevice::inst ( )-> rotation ( ) * 90;
+
+ setenv("QWS_DISPLAY", QString("Transformed:Rot%1:0").arg(rot), 1);
+ QPEApplication::defaultRotation ( ); /* to ensure deforient matches reality */
+ }
}
+static void initKeyboard()
+{
+ Config config("qpe");
+
+ config.setGroup( "Keyboard" );
+
+ int ard = config.readNumEntry( "RepeatDelay" );
+ int arp = config.readNumEntry( "RepeatPeriod" );
+ if ( ard > 0 && arp > 0 )
+ qwsSetKeyboardAutoRepeat( ard, arp );
+
+ QString layout = config.readEntry( "Layout", "us101" );
+ Server::setKeyboardLayout( layout );
+}
+
+static bool firstUse()
+{
+ bool needFirstUse = FALSE;
+ if ( QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) {
+ if ( !QFile::exists( "/etc/pointercal" ) )
+ needFirstUse = TRUE;
+ }
+
+ {
+ Config config( "qpe" );
+ config.setGroup( "Startup" );
+ needFirstUse |= config.readBoolEntry( "FirstUse", TRUE );
+ }
+
+ if ( !needFirstUse )
+ return FALSE;
+
+ FirstUse *fu = new FirstUse();
+ fu->exec();
+ bool rs = fu->restartNeeded();
+ delete fu;
+ return rs;
+}
int initApplication( int argc, char ** argv )
{
+ cleanup();
+
+
initEnvironment();
//Don't flicker at startup:
+#ifdef QWS
QWSServer::setDesktopBackground( QImage() );
+#endif
+ ServerApplication a( argc, argv, QApplication::GuiServer );
+
+ refreshTimeZoneConfig();
- DesktopApplication a( argc, argv, QApplication::GuiServer );
+ initKeyboard();
+
+ // Don't use first use under Windows
+ if ( firstUse() ) {
+ a.restart();
+ return 0;
+ }
ODevice::inst ( )-> setSoftSuspend ( true );
- { // init backlight
+ {
QCopEnvelope e("QPE/System", "setBacklight(int)" );
e << -3; // Forced on
}
AlarmServer::initialize();
- Desktop *d = new Desktop();
- QObject::connect( &a, SIGNAL(power()), d, SLOT(togglePower()) );
- QObject::connect( &a, SIGNAL(backlight()), d, SLOT(toggleLight()) );
- QObject::connect( &a, SIGNAL(symbol()), d, SLOT(toggleSymbolInput()) );
- QObject::connect( &a, SIGNAL(numLockStateToggle()), d, SLOT(toggleNumLockState()) );
- QObject::connect( &a, SIGNAL(capsLockStateToggle()), d, SLOT(toggleCapsLockState()) );
- QObject::connect( &a, SIGNAL(prepareForRestart()), d, SLOT(terminateServers()) );
- (void)new SysFileMonitor(d);
- Network::createServer(d);
+ Server *s = new Server();
- if ( QWSServer::mouseHandler() ->inherits("QCalibratedMouseHandler") ) {
- if ( !QFile::exists( "/etc/pointercal" ) ) {
- // Make sure calibration widget starts on top.
- Calibrate *cal = new Calibrate;
- cal->exec();
- delete cal;
- }
- }
+ (void)new SysFileMonitor(s);
+#ifdef QWS
+ Network::createServer(s);
+#endif
- d->show();
+ s->show();
- if ( QDate::currentDate ( ). year ( ) < 2000 ) {
- if ( QMessageBox::information ( 0, DesktopApplication::tr( "Information" ), DesktopApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
- QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" );
- e << QString ( );
- }
- }
+ /* THE ARM rtc has problem holdings the time on reset */
+ if ( QDate::currentDate ( ). year ( ) < 2000 ) {
+ if ( QMessageBox::information ( 0, ServerApplication::tr( "Information" ), ServerApplication::tr( "<p>The system date doesn't seem to be valid.\n(%1)</p><p>Do you want to correct the clock ?</p>" ). arg( TimeString::dateString ( QDate::currentDate ( ))), QMessageBox::Yes, QMessageBox::No ) == QMessageBox::Yes ) {
+ QCopEnvelope e ( "QPE/Application/systemtime", "setDocument(QString)" );
+ e << QString ( );
+ }
+ }
int rv = a.exec();
- delete d;
+ qDebug("exiting...");
+ delete s;
- ODevice::inst ( )-> setSoftSuspend ( false );
+ ODevice::inst()->setSoftSuspend( false );
return rv;
}
static const char *pidfile_path = "/var/run/opie.pid";
void create_pidfile ( )
{
FILE *f;
if (( f = ::fopen ( pidfile_path, "w" ))) {
::fprintf ( f, "%d", getpid ( ));
::fclose ( f );
}
}
void remove_pidfile ( )
{
::unlink ( pidfile_path );
}
void handle_sigterm ( int /* sig */ )
{
if ( qApp )
qApp-> quit ( );
}
+#ifndef Q_OS_WIN32
int main( int argc, char ** argv )
{
+
::signal ( SIGCHLD, SIG_IGN );
- ::signal ( SIGTERM, handle_sigterm );
- ::signal ( SIGINT, handle_sigterm );
+ ::signal ( SIGTERM, handle_sigterm );
+ ::signal ( SIGINT, handle_sigterm );
- ::setsid ( );
- ::setpgid ( 0, 0 );
+ ::setsid ( );
+ ::setpgid ( 0, 0 );
- ::atexit ( remove_pidfile );
- create_pidfile ( );
+ ::atexit ( remove_pidfile );
+ create_pidfile ( );
- int retVal = initApplication ( argc, argv );
+ int retVal = initApplication( argc, argv );
+
+ // Have we been asked to restart?
+ if ( ServerApplication::doRestart ) {
+ for ( int fd = 3; fd < 100; fd++ )
+ close( fd );
+
+ execl( (QPEApplication::qpeDir()+"bin/qpe").latin1(), "qpe", 0 );
+ }
// Kill them. Kill them all.
::kill ( 0, SIGTERM );
::sleep ( 1 );
::kill ( 0, SIGKILL );
return retVal;
}
+#else
+
+int main( int argc, char ** argv )
+{
+ int retVal = initApplication( argc, argv );
+
+ if ( DesktopApplication::doRestart ) {
+ qDebug("Trying to restart");
+ execl( (QPEApplication::qpeDir()+"bin\\qpe").latin1(), "qpe", 0 );
+ }
+
+ return retVal;
+}
+
+#endif