summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/opie-login/loginwindow.ui22
-rw-r--r--core/opie-login/loginwindowimpl.cpp54
-rw-r--r--core/opie-login/loginwindowimpl.h1
-rw-r--r--core/opie-login/main.cpp197
4 files changed, 168 insertions, 106 deletions
diff --git a/core/opie-login/loginwindow.ui b/core/opie-login/loginwindow.ui
index 86d5469..edd0819 100644
--- a/core/opie-login/loginwindow.ui
+++ b/core/opie-login/loginwindow.ui
@@ -1,110 +1,126 @@
<!DOCTYPE UI><UI>
<class>LoginWindow</class>
<widget>
<class>QWidget</class>
<property stdset="1">
<name>name</name>
<cstring>LoginWindow</cstring>
</property>
<property stdset="1">
<name>geometry</name>
<rect>
<x>0</x>
<y>0</y>
- <width>472</width>
+ <width>460</width>
<height>341</height>
</rect>
</property>
<property stdset="1">
<name>caption</name>
<string>Login</string>
</property>
<property>
<name>layoutMargin</name>
</property>
<property>
<name>layoutSpacing</name>
</property>
<vbox>
<property stdset="1">
<name>margin</name>
<number>0</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>0</number>
</property>
<widget>
<class>QLayoutWidget</class>
<property stdset="1">
<name>name</name>
<cstring>Layout7</cstring>
</property>
<property>
<name>layoutMargin</name>
</property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
<vbox>
<property stdset="1">
<name>margin</name>
<number>4</number>
</property>
<property stdset="1">
<name>spacing</name>
- <number>6</number>
+ <number>4</number>
</property>
<widget>
<class>QLabel</class>
<property stdset="1">
<name>name</name>
<cstring>m_caption</cstring>
</property>
<property stdset="1">
<name>sizePolicy</name>
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>5</vsizetype>
</sizepolicy>
</property>
<property stdset="1">
+ <name>font</name>
+ <font>
+ <family>helvetica</family>
+ <pointsize>18</pointsize>
+ <bold>1</bold>
+ <underline>1</underline>
+ </font>
+ </property>
+ <property stdset="1">
<name>autoMask</name>
<bool>true</bool>
</property>
<property stdset="1">
<name>backgroundOrigin</name>
<enum>ParentOrigin</enum>
</property>
<property stdset="1">
+ <name>margin</name>
+ <number>1</number>
+ </property>
+ <property stdset="1">
<name>text</name>
- <string>&lt;center&gt;&lt;h1&gt;Welcome to OPIE&lt;/h1&gt;&lt;/center&gt;</string>
+ <string>&lt;center&gt;Welcome to OPIE&lt;/center&gt;</string>
</property>
</widget>
<widget>
<class>QLayoutWidget</class>
<property stdset="1">
<name>name</name>
<cstring>Layout6</cstring>
</property>
<property>
<name>layoutSpacing</name>
</property>
<grid>
<property stdset="1">
<name>margin</name>
<number>0</number>
</property>
<property stdset="1">
<name>spacing</name>
<number>4</number>
</property>
<widget row="0" column="1" >
<class>QComboBox</class>
<property stdset="1">
<name>name</name>
<cstring>m_user</cstring>
</property>
<property stdset="1">
<name>autoMask</name>
<bool>true</bool>
</property>
<property stdset="1">
<name>editable</name>
diff --git a/core/opie-login/loginwindowimpl.cpp b/core/opie-login/loginwindowimpl.cpp
index 3265b46..f24ebb3 100644
--- a/core/opie-login/loginwindowimpl.cpp
+++ b/core/opie-login/loginwindowimpl.cpp
@@ -1,159 +1,163 @@
#include <qapplication.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qframe.h>
#include <qlineedit.h>
#include <qtimer.h>
#include <qcombobox.h>
#include <qpixmap.h>
#include <qlabel.h>
#include <qpopupmenu.h>
#include <qmessagebox.h>
#include <qpe/qcopenvelope_qws.h>
#include <opie/odevice.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include <stdlib.h>
+#include <signal.h>
#ifdef USEPAM
extern "C" {
#include <security/pam_appl.h>
}
#else
#include <crypt.h>
#include <shadow.h>
#endif
#include "loginwindowimpl.h"
#include "inputmethods.h"
LoginWindowImpl::LoginWindowImpl ( ) : LoginWindow ( 0, "LOGIN-WINDOW", WStyle_Customize | WStyle_NoBorder | WDestructiveClose )
{
QPopupMenu *pop = new QPopupMenu ( this );
pop-> insertItem ( tr( "Restart" ), this, SLOT( restart ( )));
+ pop-> insertItem ( tr( "Quit" ), this, SLOT( quit ( )));
m_menu-> setPopup ( pop );
QHBoxLayout *lay = new QHBoxLayout ( m_taskbar, 4, 4 );
m_input = new InputMethods ( m_taskbar );
lay-> addWidget ( m_input );
lay-> addStretch ( 10 );
setActiveWindow ( );
m_password-> setFocus ( );
m_user-> insertStringList ( getAllUsers ( ));
QTimer::singleShot ( 0, this, SLOT( showIM ( )));
QString opiedir = ::getenv ( "OPIEDIR" );
QPixmap bgpix ( opiedir + "/pics/launcher/opie-background.jpg" );
if ( !bgpix. isNull ( ))
setBackgroundPixmap ( bgpix );
- m_caption-> setText ( m_caption-> text ( ) + tr( "<center><h1><u>%1 %2</u></h1></center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( )));
+ m_caption-> setText ( m_caption-> text ( ) + tr( "<center>%1 %2</center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( )));
}
LoginWindowImpl::~LoginWindowImpl ( )
{
}
void LoginWindowImpl::keyPressEvent ( QKeyEvent *e )
{
switch ( e-> key ( )) {
- case Key_F34: suspend ( );
+ case HardKey_Suspend: suspend ( );
break;
- case Key_F35: backlight ( );
+ case HardKey_Backlight: backlight ( );
break;
default : e-> ignore ( );
break;
}
LoginWindow::keyPressEvent ( e );
}
void LoginWindowImpl::toggleEchoMode ( bool t )
{
m_password-> setEchoMode ( t ? QLineEdit::Normal : QLineEdit::Password );
}
QStringList LoginWindowImpl::getAllUsers ( )
{
struct passwd *pwd;
QStringList sl;
- while (( pwd = getpwent ( ))) {
+ while (( pwd = ::getpwent ( ))) {
if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 ))
sl << QString ( pwd-> pw_name );
}
- endpwent ( );
+ ::endpwent ( );
return sl;
}
void LoginWindowImpl::showIM ( )
{
m_input-> showInputMethod ( );
}
void LoginWindowImpl::restart ( )
{
qApp-> quit ( );
}
-void LoginWindowImpl::suspend ( )
+void LoginWindowImpl::quit ( )
{
- system ( "apm -s" );
- usleep ( 1 * 1000 * 1000 );
+ qApp-> quit ( );
+ ::kill ( ::getppid ( ), SIGUSR1 );
+}
+
+void LoginWindowImpl::suspend ( )
{
+ ODevice::inst ( )-> suspend ( );
+
QCopEnvelope e("QPE/System", "setBacklight(int)");
e << -3; // Force on
}
-}
void LoginWindowImpl::backlight ( )
{
- {
QCopEnvelope e("QPE/System", "setBacklight(int)");
e << -2; // toggle
}
-}
#ifdef USEPAM
static const char *_PAM_SERVICE = "xdm";
static const char *PAM_password;
typedef const struct pam_message pam_message_type;
static int PAM_conv( int, pam_message_type **, struct pam_response **, void * );
static struct pam_conv PAM_conversation = {
&PAM_conv,
NULL
};
//----------------------------------------------------------------------------
static char *COPY_STRING( const char * s ) {
return (s) ? strdup(s) : (char *)NULL;
}
#define GET_MEM if (reply) realloc(reply, size);\
else reply = (struct pam_response *)malloc(size); \
if (!reply) return PAM_CONV_ERR; \
size += sizeof(struct pam_response)
static int PAM_conv( int num_msg, pam_message_type **msg,
struct pam_response **resp, void *)
{
int count = 0, replies = 0;
struct pam_response *reply = NULL;
@@ -229,95 +233,91 @@ static bool pwcheck_Unix( const char *user, const char *pass )
return false;
if (( strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( strcmp ( pw-> pw_passwd, "*" ) == 0 )) {
struct spwd *sp = getspnam ( pw-> pw_name );
if ( !sp )
return false;
correct = sp-> sp_pwdp;
}
else
correct = pw-> pw_passwd;
if ( correct == 0 || correct[0] == '\0' )
return true;
encrypted = crypt ( pass, correct );
return ( strcmp ( encrypted, correct ) == 0 );
}
#endif
bool LoginWindowImpl::changeIdentity ( const char *user )
{
const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin";
const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin";
bool fail = false;
struct passwd *pw = getpwnam ( user );
fail |= ( pw == 0 );
- printf ( "1 %d\n", fail );
fail |= ( initgroups ( pw-> pw_name, pw-> pw_gid ));
endgrent ( );
- printf ( "2 %d\n", fail );
fail |= ( setgid ( pw-> pw_gid ));
- printf ( "3 %d\n", fail );
fail |= ( setuid ( pw-> pw_uid ));
- printf ( "4 %d\n", fail );
fail |= ( chdir ( pw-> pw_dir ) && chdir ( "/" ));
- printf ( "5 %d\n", fail );
fail |= ( setenv ( "HOME", pw-> pw_dir, 1 ));
- printf ( "6 %d\n", fail );
fail |= ( setenv ( "SHELL", pw-> pw_shell, 1 ));
- printf ( "7 %d\n", fail );
fail |= ( setenv ( "USER", pw-> pw_name, 1 ));
- printf ( "8 %d\n", fail );
fail |= ( setenv ( "LOGNAME", pw-> pw_name, 1 ));
- printf ( "9 %d\n", fail );
fail |= ( setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 ));
- printf ( "10 %d\n", fail );
return !fail;
}
void LoginWindowImpl::login ( )
{
- const char *user = strdup ( m_user-> currentText ( ). local8Bit ( ));
- const char *pass = strdup ( m_password-> text ( ). local8Bit ( ));
+ const char *user = ::strdup ( m_user-> currentText ( ). local8Bit ( ));
+ const char *pass = ::strdup ( m_password-> text ( ). local8Bit ( ));
bool ok;
if ( !user || !user [0] )
return;
if ( !pass )
pass = "";
#if defined( USEPAM )
ok = pwcheck_PAM ( user, pass );
#else
ok = pwcheck_Unix ( user, pass );
#endif
if ( ok ) {
if ( changeIdentity ( user )) {
- QString opie = getenv ( "OPIEDIR" );
- opie += "/bin/qpe";
+ char *opie = ::getenv ( "OPIEDIR" );
+ char *arg = new char [::strlen ( opie ) + 8 + 1];
+
+ ::strcpy ( arg, opie );
+ ::strcat ( arg, "/bin/qpe" );
+
+ // start qpe via a login shell
+ ::execl ( "/bin/sh", "-sh", "-c", arg, 0 );
- execl ( opie. latin1 ( ), "qpe", 0 );
+ QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE\n(%1)." ). arg ( arg ));
+ delete [] arg;
- QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE." ));
restart ( );
}
else {
QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not switch to new user identity" ));
restart ( );
}
}
else {
QMessageBox::warning ( this, tr( "Wrong password" ), tr( "The given password is incorrect." ));
m_password-> clear ( );
}
}
diff --git a/core/opie-login/loginwindowimpl.h b/core/opie-login/loginwindowimpl.h
index 16c42e6..2e2ba0d 100644
--- a/core/opie-login/loginwindowimpl.h
+++ b/core/opie-login/loginwindowimpl.h
@@ -1,33 +1,34 @@
#ifndef __OPIE_LOGINWINDOW_IMPL_H__
#define __OPIE_LOGINWINDOW_IMPL_H__
#include "loginwindow.h"
class InputMethods;
class LoginWindowImpl : public LoginWindow {
Q_OBJECT
public:
LoginWindowImpl ( );
virtual ~LoginWindowImpl ( );
protected slots:
void restart ( );
+ void quit ( );
void showIM ( );
void suspend ( );
void backlight ( );
void login ( );
void toggleEchoMode ( bool );
protected:
virtual void keyPressEvent ( QKeyEvent *e );
QStringList getAllUsers ( );
bool changeIdentity ( const char *user );
private:
InputMethods *m_input;
};
#endif
diff --git a/core/opie-login/main.cpp b/core/opie-login/main.cpp
index 44d6f8d..718009a 100644
--- a/core/opie-login/main.cpp
+++ b/core/opie-login/main.cpp
@@ -1,179 +1,224 @@
#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 <stdlib.h>
+#include <signal.h>
#include <qpe/qpeapplication.h>
#include <qpe/qcopenvelope_qws.h>
+#include <qpe/qpestyle.h>
+#include <qpe/power.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 );
+void sigusr1 ( int sig );
+void exit_closelog ( );
+
int main ( int argc, char **argv )
{
- if ( geteuid ( ) != 0 ) {
- fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] );
+ 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 );
+// ::getrlimit ( RLIMIT_NOFILE, &rl );
// for ( unsigned int i = 0; i < rl. rlim_cur; i++ )
-// close ( i );
+// ::close ( i );
+
+ ::setpgid ( 0, 0 );
+ ::setsid ( );
- setpgid ( 0, 0 );
- setsid ( );
+ ::signal ( SIGUSR1, sigusr1 );
- openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
+ ::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
+ ::atexit ( exit_closelog );
while ( true ) {
- pid_t child = fork ( );
+ pid_t child = ::fork ( );
if ( child < 0 ) {
- syslog ( LOG_ERR, "Could not fork process" );
+ ::syslog ( LOG_ERR, "Could not fork process" );
break;
}
else if ( child > 0 ) {
int status = 0;
- while ( waitpid ( child, &status, 0 ) < 0 ) { }
+ while ( ::waitpid ( child, &status, 0 ) < 0 ) { }
}
else {
- exit ( login_main ( argc, argv ));
+ ::exit ( login_main ( argc, argv ));
+ }
}
+ return 0;
+}
+
+void sigusr1 ( int /*sig*/ )
+{
+ ::exit ( 0 );
}
- closelog ( );
+
+void exit_closelog ( )
+{
+ ::closelog ( );
}
-class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter
+class LoginScreenSaver : public QWSScreenSaver
{
public:
- ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" )
+ LoginScreenSaver ( )
{
- bool doinst = false;
+ m_lcd_status = true;
- m_model = ODevice::inst ( )-> model ( );
- m_power_timer = 0;
+ m_backlight_bright = -1;
+ m_backlight_forcedoff = false;
- 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 );
+ // 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 );
}
-
- virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
+ void restore()
{
- bool kill = false;
-
- // Rotate cursor keys 180°
- switch ( m_model ) {
- case OMODEL_iPAQ_H31xx:
- case OMODEL_iPAQ_H38xx: {
- int newkeycode = keycode;
+ if ( !m_lcd_status ) // We must have turned it off
+ ODevice::inst ( ) -> setDisplayStatus ( true );
- 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;
+ setBacklight ( -1 );
}
- if ( newkeycode != keycode ) {
- QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
- kill = true;
+ bool save( int level )
+ {
+ switch ( level ) {
+ case 0:
+ if ( backlight() > 1 )
+ setBacklight( 1 ); // lowest non-off
+ return true;
+ break;
+ case 1:
+ setBacklight( 0 ); // off
+ return true;
+ break;
+ case 2:
+ // We're going to suspend the whole machine
+ if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) {
+ QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
+ return true;
}
break;
}
- default: break;
+ return false;
}
- // 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;
+private:
+public:
+ void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 )
+ {
+ int v [4];
+
+ 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 );
}
- break;
+
+ int backlight ( )
+ {
+ if ( m_backlight_bright == -1 )
+ m_backlight_bright = 255;
+
+ return m_backlight_bright;
}
- default: break;
+
+ void setBacklight ( int bright )
+ {
+ if ( bright == -3 ) {
+ // Forced on
+ m_backlight_forcedoff = false;
+ bright = -1;
}
- return kill;
+ if ( m_backlight_forcedoff && bright != -2 )
+ return ;
+ if ( bright == -2 ) {
+ // Toggle between off and on
+ bright = m_backlight_bright ? 0 : -1;
+ m_backlight_forcedoff = !bright;
}
- 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 );
+ m_backlight_bright = bright;
+
+ bright = backlight ( );
+ ODevice::inst ( ) -> setDisplayBrightness ( bright );
+
+ m_backlight_bright = bright;
}
private:
- OModel m_model;
- int m_power_timer;
-};
+ bool m_lcd_status;
+ int m_backlight_bright;
+ bool m_backlight_forcedoff;
+};
int login_main ( int argc, char **argv )
{
QWSServer::setDesktopBackground( QImage() );
QPEApplication app ( argc, argv, QApplication::GuiServer );
- (void) new ModelKeyFilter ( );
+ app. setFont ( QFont ( "Helvetica", 10 ));
+ app. setStyle ( new QPEStyle ( ));
+
+ ODevice::inst ( )-> setSoftSuspend ( true );
{
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
+
+ LoginScreenSaver *saver = new LoginScreenSaver;
+
+ saver-> setIntervals ( );
+ QWSServer::setScreenSaver ( saver );
+
+
LoginWindowImpl *lw = new LoginWindowImpl ( );
app. setMainWidget ( lw );
lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( ));
lw-> show ( );
- return app. exec ( );
+ int rc = app. exec ( );
+
+ ODevice::inst ( )-> setSoftSuspend ( false );
+
+ return rc;
}