summaryrefslogtreecommitdiff
path: root/core/opie-login/main.cpp
authorsandman <sandman>2002-07-27 22:43:37 (UTC)
committer sandman <sandman>2002-07-27 22:43:37 (UTC)
commitdac5c073c3e04ceb6900aeb72e53cf6d7350c3c9 (patch) (side-by-side diff)
treed8c522214a94a437ccd5339957ca64ac4779755c /core/opie-login/main.cpp
parent9e728b734630d08ec5ee3ff695d1b66995a6d7c7 (diff)
downloadopie-dac5c073c3e04ceb6900aeb72e53cf6d7350c3c9.zip
opie-dac5c073c3e04ceb6900aeb72e53cf6d7350c3c9.tar.gz
opie-dac5c073c3e04ceb6900aeb72e53cf6d7350c3c9.tar.bz2
Initial checkin of the new opie-login
Just replace $OPIEDIR/bin/qpe with $OPIEDIR/bin/opie-login in /etc/init.d/opie
Diffstat (limited to 'core/opie-login/main.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/main.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp
new file mode 100644
index 0000000..9d52b75
--- a/dev/null
+++ b/core/opie-login/main.cpp
@@ -0,0 +1,178 @@
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdio.h>
+
+#include <qpe/qpeapplication.h>
+#include <qpe/qcopenvelope_qws.h>
+
+#include <opie/odevice.h>
+
+#include <qwindowsystem_qws.h>
+#include <qfile.h>
+
+#include "loginwindowimpl.h"
+#include "calibrate.h"
+
+int login_main ( int argc, char **argv );
+
+
+int main ( int argc, char **argv )
+{
+ if ( geteuid ( ) != 0 ) {
+ fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] );
+ return 1;
+ }
+
+// struct rlimit rl;
+// getrlimit ( RLIMIT_NOFILE, &rl );
+
+// for ( unsigned int i = 0; i < rl. rlim_cur; i++ )
+// close ( i );
+
+ setpgid ( 0, 0 );
+ setsid ( );
+
+ openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
+
+ while ( true ) {
+ pid_t child = fork ( );
+
+ if ( child < 0 ) {
+ syslog ( LOG_ERR, "Could not fork process" );
+ break;
+
+ }
+ else if ( child > 0 ) {
+ int status = 0;
+
+ while ( waitpid ( child, &status, 0 ) < 0 ) { }
+ }
+ else {
+ exit ( login_main ( argc, argv ));
+ }
+ }
+ closelog ( );
+}
+
+
+class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter
+{
+public:
+ ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" )
+ {
+ bool doinst = false;
+
+ m_model = ODevice::inst ( )-> model ( );
+ m_power_timer = 0;
+
+ switch ( m_model ) {
+ case OMODEL_iPAQ_H31xx:
+ case OMODEL_iPAQ_H36xx:
+ case OMODEL_iPAQ_H37xx:
+ case OMODEL_iPAQ_H38xx: doinst = true;
+ break;
+ default : break;
+ }
+ if ( doinst )
+ QWSServer::setKeyboardFilter ( this );
+ }
+
+ virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
+ {
+ bool kill = false;
+
+ // Rotate cursor keys 180°
+ switch ( m_model ) {
+ case OMODEL_iPAQ_H31xx:
+ case OMODEL_iPAQ_H38xx: {
+ int newkeycode = keycode;
+
+ switch ( keycode ) {
+ case Key_Left : newkeycode = Key_Right; break;
+ case Key_Right: newkeycode = Key_Left; break;
+ case Key_Up : newkeycode = Key_Down; break;
+ case Key_Down : newkeycode = Key_Up; break;
+ }
+ if ( newkeycode != keycode ) {
+ QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
+ kill = true;
+ }
+ break;
+ }
+ default: break;
+ }
+
+ // map Power Button short/long press to F34/F35
+ switch ( m_model ) {
+ case OMODEL_iPAQ_H31xx:
+ case OMODEL_iPAQ_H36xx:
+ case OMODEL_iPAQ_H37xx:
+ case OMODEL_iPAQ_H38xx: {
+ if ( keycode == Key_SysReq ) {
+ if ( isPress ) {
+ m_power_timer = startTimer ( 500 );
+ }
+ else if ( m_power_timer ) {
+ killTimer ( m_power_timer );
+ m_power_timer = 0;
+ QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false );
+ QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false );
+ }
+ kill = true;
+ }
+ break;
+ }
+ default: break;
+ }
+ return kill;
+ }
+
+ virtual void timerEvent ( QTimerEvent * )
+ {
+ killTimer ( m_power_timer );
+ m_power_timer = 0;
+ QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false );
+ QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false );
+ }
+
+private:
+ OModel m_model;
+ int m_power_timer;
+};
+
+
+
+
+int login_main ( int argc, char **argv )
+{
+ QWSServer::setDesktopBackground( QImage() );
+ QPEApplication app ( argc, argv, QApplication::GuiServer );
+
+ (void) new ModelKeyFilter ( );
+
+ {
+ QCopEnvelope e("QPE/System", "setBacklight(int)" );
+ e << -3; // Forced on
+ }
+
+#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
+ if ( !QFile::exists ( "/etc/pointercal" )) {
+ // Make sure calibration widget starts on top.
+ Calibrate *cal = new Calibrate;
+ cal-> exec ( );
+ delete cal;
+ }
+#endif
+
+ LoginWindowImpl *lw = new LoginWindowImpl ( );
+ app. setMainWidget ( lw );
+ lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( ));
+ lw-> show ( );
+
+ return app. exec ( );
+}
+