summaryrefslogtreecommitdiff
authorsandman <sandman>2002-09-30 00:29:12 (UTC)
committer sandman <sandman>2002-09-30 00:29:12 (UTC)
commitf6e9cebd79044b1ca54648ecdadd13db8c4673dc (patch) (unidiff)
treee29985455734329ee31e14d04b2d613eafabb6a0
parentb53db7a5a334fdd53bd86e8b50587f1dae41cfba (diff)
downloadopie-f6e9cebd79044b1ca54648ecdadd13db8c4673dc.zip
opie-f6e9cebd79044b1ca54648ecdadd13db8c4673dc.tar.gz
opie-f6e9cebd79044b1ca54648ecdadd13db8c4673dc.tar.bz2
- added an option to quit to console
- launcher is now started via a login shell - font is "hardcoded" to helvetica - screen saver is "hardcoded" to 30/20/60 secs (this should make opie-login usable, regardless of any (miss)-configuration of the normal OPIE appearance)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/loginwindow.ui22
-rw-r--r--core/opie-login/loginwindowimpl.cpp120
-rw-r--r--core/opie-login/loginwindowimpl.h1
-rw-r--r--core/opie-login/main.cpp257
4 files changed, 231 insertions, 169 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
@@ -6,17 +6,17 @@
6 <name>name</name> 6 <name>name</name>
7 <cstring>LoginWindow</cstring> 7 <cstring>LoginWindow</cstring>
8 </property> 8 </property>
9 <property stdset="1"> 9 <property stdset="1">
10 <name>geometry</name> 10 <name>geometry</name>
11 <rect> 11 <rect>
12 <x>0</x> 12 <x>0</x>
13 <y>0</y> 13 <y>0</y>
14 <width>472</width> 14 <width>460</width>
15 <height>341</height> 15 <height>341</height>
16 </rect> 16 </rect>
17 </property> 17 </property>
18 <property stdset="1"> 18 <property stdset="1">
19 <name>caption</name> 19 <name>caption</name>
20 <string>Login</string> 20 <string>Login</string>
21 </property> 21 </property>
22 <property> 22 <property>
@@ -38,49 +38,65 @@
38 <class>QLayoutWidget</class> 38 <class>QLayoutWidget</class>
39 <property stdset="1"> 39 <property stdset="1">
40 <name>name</name> 40 <name>name</name>
41 <cstring>Layout7</cstring> 41 <cstring>Layout7</cstring>
42 </property> 42 </property>
43 <property> 43 <property>
44 <name>layoutMargin</name> 44 <name>layoutMargin</name>
45 </property> 45 </property>
46 <property>
47 <name>layoutSpacing</name>
48 </property>
46 <vbox> 49 <vbox>
47 <property stdset="1"> 50 <property stdset="1">
48 <name>margin</name> 51 <name>margin</name>
49 <number>4</number> 52 <number>4</number>
50 </property> 53 </property>
51 <property stdset="1"> 54 <property stdset="1">
52 <name>spacing</name> 55 <name>spacing</name>
53 <number>6</number> 56 <number>4</number>
54 </property> 57 </property>
55 <widget> 58 <widget>
56 <class>QLabel</class> 59 <class>QLabel</class>
57 <property stdset="1"> 60 <property stdset="1">
58 <name>name</name> 61 <name>name</name>
59 <cstring>m_caption</cstring> 62 <cstring>m_caption</cstring>
60 </property> 63 </property>
61 <property stdset="1"> 64 <property stdset="1">
62 <name>sizePolicy</name> 65 <name>sizePolicy</name>
63 <sizepolicy> 66 <sizepolicy>
64 <hsizetype>5</hsizetype> 67 <hsizetype>5</hsizetype>
65 <vsizetype>5</vsizetype> 68 <vsizetype>5</vsizetype>
66 </sizepolicy> 69 </sizepolicy>
67 </property> 70 </property>
68 <property stdset="1"> 71 <property stdset="1">
72 <name>font</name>
73 <font>
74 <family>helvetica</family>
75 <pointsize>18</pointsize>
76 <bold>1</bold>
77 <underline>1</underline>
78 </font>
79 </property>
80 <property stdset="1">
69 <name>autoMask</name> 81 <name>autoMask</name>
70 <bool>true</bool> 82 <bool>true</bool>
71 </property> 83 </property>
72 <property stdset="1"> 84 <property stdset="1">
73 <name>backgroundOrigin</name> 85 <name>backgroundOrigin</name>
74 <enum>ParentOrigin</enum> 86 <enum>ParentOrigin</enum>
75 </property> 87 </property>
76 <property stdset="1"> 88 <property stdset="1">
89 <name>margin</name>
90 <number>1</number>
91 </property>
92 <property stdset="1">
77 <name>text</name> 93 <name>text</name>
78 <string>&lt;center&gt;&lt;h1&gt;Welcome to OPIE&lt;/h1&gt;&lt;/center&gt;</string> 94 <string>&lt;center&gt;Welcome to OPIE&lt;/center&gt;</string>
79 </property> 95 </property>
80 </widget> 96 </widget>
81 <widget> 97 <widget>
82 <class>QLayoutWidget</class> 98 <class>QLayoutWidget</class>
83 <property stdset="1"> 99 <property stdset="1">
84 <name>name</name> 100 <name>name</name>
85 <cstring>Layout6</cstring> 101 <cstring>Layout6</cstring>
86 </property> 102 </property>
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
@@ -15,120 +15,124 @@
15#include <opie/odevice.h> 15#include <opie/odevice.h>
16 16
17#include <stdio.h> 17#include <stdio.h>
18 18
19#include <pwd.h> 19#include <pwd.h>
20#include <grp.h> 20#include <grp.h>
21#include <unistd.h> 21#include <unistd.h>
22#include <stdlib.h> 22#include <stdlib.h>
23#include <signal.h>
23 24
24#ifdef USEPAM 25#ifdef USEPAM
25extern "C" { 26extern "C" {
26#include <security/pam_appl.h> 27#include <security/pam_appl.h>
27} 28}
28#else 29#else
29#include <crypt.h> 30#include <crypt.h>
30#include <shadow.h> 31#include <shadow.h>
31#endif 32#endif
32 33
33#include "loginwindowimpl.h" 34#include "loginwindowimpl.h"
34#include "inputmethods.h" 35#include "inputmethods.h"
35 36
36LoginWindowImpl::LoginWindowImpl ( ) : LoginWindow ( 0, "LOGIN-WINDOW", WStyle_Customize | WStyle_NoBorder | WDestructiveClose ) 37LoginWindowImpl::LoginWindowImpl ( ) : LoginWindow ( 0, "LOGIN-WINDOW", WStyle_Customize | WStyle_NoBorder | WDestructiveClose )
37{ 38{
38 QPopupMenu *pop = new QPopupMenu ( this ); 39 QPopupMenu *pop = new QPopupMenu ( this );
39 pop-> insertItem ( tr( "Restart" ), this, SLOT( restart ( ))); 40 pop-> insertItem ( tr( "Restart" ), this, SLOT( restart ( )));
41 pop-> insertItem ( tr( "Quit" ), this, SLOT( quit ( )));
40 m_menu-> setPopup ( pop ); 42 m_menu-> setPopup ( pop );
41 43
42 QHBoxLayout *lay = new QHBoxLayout ( m_taskbar, 4, 4 ); 44 QHBoxLayout *lay = new QHBoxLayout ( m_taskbar, 4, 4 );
43 m_input = new InputMethods ( m_taskbar ); 45 m_input = new InputMethods ( m_taskbar );
44 lay-> addWidget ( m_input ); 46 lay-> addWidget ( m_input );
45 lay-> addStretch ( 10 ); 47 lay-> addStretch ( 10 );
46 48
47 setActiveWindow ( ); 49 setActiveWindow ( );
48 m_password-> setFocus ( ); 50 m_password-> setFocus ( );
49 51
50 m_user-> insertStringList ( getAllUsers ( )); 52 m_user-> insertStringList ( getAllUsers ( ));
51 53
52 QTimer::singleShot ( 0, this, SLOT( showIM ( ))); 54 QTimer::singleShot ( 0, this, SLOT( showIM ( )));
53 55
54 QString opiedir = ::getenv ( "OPIEDIR" ); 56 QString opiedir = ::getenv ( "OPIEDIR" );
55 QPixmap bgpix ( opiedir + "/pics/launcher/opie-background.jpg" ); 57 QPixmap bgpix ( opiedir + "/pics/launcher/opie-background.jpg" );
56 58
57 if ( !bgpix. isNull ( )) 59 if ( !bgpix. isNull ( ))
58 setBackgroundPixmap ( bgpix ); 60 setBackgroundPixmap ( bgpix );
59 61
60 m_caption-> setText ( m_caption-> text ( ) + tr( "<center><h1><u>%1 %2</u></h1></center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( ))); 62 m_caption-> setText ( m_caption-> text ( ) + tr( "<center>%1 %2</center>" ). arg ( ODevice::inst ( )-> systemString ( )). arg ( ODevice::inst ( )-> systemVersionString ( )));
61} 63}
62 64
63LoginWindowImpl::~LoginWindowImpl ( ) 65LoginWindowImpl::~LoginWindowImpl ( )
64{ 66{
65} 67}
66 68
67void LoginWindowImpl::keyPressEvent ( QKeyEvent *e ) 69void LoginWindowImpl::keyPressEvent ( QKeyEvent *e )
68{ 70{
69 switch ( e-> key ( )) { 71 switch ( e-> key ( )) {
70 case Key_F34: suspend ( ); 72 case HardKey_Suspend: suspend ( );
71 break; 73 break;
72 case Key_F35: backlight ( ); 74 case HardKey_Backlight: backlight ( );
73 break; 75 break;
74 default : e-> ignore ( ); 76 default: e-> ignore ( );
75 break; 77 break;
76 } 78 }
77 LoginWindow::keyPressEvent ( e ); 79 LoginWindow::keyPressEvent ( e );
78} 80}
79 81
80 82
81void LoginWindowImpl::toggleEchoMode ( bool t ) 83void LoginWindowImpl::toggleEchoMode ( bool t )
82{ 84{
83 m_password-> setEchoMode ( t ? QLineEdit::Normal : QLineEdit::Password ); 85 m_password-> setEchoMode ( t ? QLineEdit::Normal : QLineEdit::Password );
84} 86}
85 87
86QStringList LoginWindowImpl::getAllUsers ( ) 88QStringList LoginWindowImpl::getAllUsers ( )
87{ 89{
88 struct passwd *pwd; 90 struct passwd *pwd;
89 QStringList sl; 91 QStringList sl;
90 92
91 while (( pwd = getpwent ( ))) { 93 while (( pwd = ::getpwent ( ))) {
92 if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 )) 94 if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 ))
93 sl << QString ( pwd-> pw_name ); 95 sl << QString ( pwd-> pw_name );
94 } 96 }
95 97
96 endpwent ( ); 98 ::endpwent ( );
97 99
98 return sl; 100 return sl;
99} 101}
100 102
101void LoginWindowImpl::showIM ( ) 103void LoginWindowImpl::showIM ( )
102{ 104{
103 m_input-> showInputMethod ( ); 105 m_input-> showInputMethod ( );
104} 106}
105 107
106void LoginWindowImpl::restart ( ) 108void LoginWindowImpl::restart ( )
107{ 109{
108 qApp-> quit ( ); 110 qApp-> quit ( );
109} 111}
110 112
113void LoginWindowImpl::quit ( )
114{
115 qApp-> quit ( );
116 ::kill ( ::getppid ( ), SIGUSR1 );
117}
118
111void LoginWindowImpl::suspend ( ) 119void LoginWindowImpl::suspend ( )
112{ 120{
113 system ( "apm -s" ); 121 ODevice::inst ( )-> suspend ( );
114 usleep ( 1 * 1000 * 1000 ); 122
115 { 123 QCopEnvelope e("QPE/System", "setBacklight(int)");
116 QCopEnvelope e("QPE/System", "setBacklight(int)"); 124 e << -3; // Force on
117 e << -3; // Force on
118 }
119} 125}
120 126
121void LoginWindowImpl::backlight ( ) 127void LoginWindowImpl::backlight ( )
122{ 128{
123 { 129 QCopEnvelope e("QPE/System", "setBacklight(int)");
124 QCopEnvelope e("QPE/System", "setBacklight(int)"); 130 e << -2; // toggle
125 e << -2; // toggle
126 }
127} 131}
128 132
129#ifdef USEPAM 133#ifdef USEPAM
130 134
131static const char *_PAM_SERVICE = "xdm"; 135static const char *_PAM_SERVICE = "xdm";
132static const char *PAM_password; 136static const char *PAM_password;
133 137
134typedef const struct pam_message pam_message_type; 138typedef const struct pam_message pam_message_type;
@@ -153,17 +157,17 @@ static char *COPY_STRING( const char * s ) {
153 157
154 158
155static int PAM_conv( int num_msg, pam_message_type **msg, 159static int PAM_conv( int num_msg, pam_message_type **msg,
156 struct pam_response **resp, void *) 160 struct pam_response **resp, void *)
157{ 161{
158 int count = 0, replies = 0; 162 int count = 0, replies = 0;
159 struct pam_response *reply = NULL; 163 struct pam_response *reply = NULL;
160 int size = sizeof(struct pam_response); 164 int size = sizeof(struct pam_response);
161 165
162 for( count = 0; count < num_msg; count++ ) { 166 for( count = 0; count < num_msg; count++ ) {
163 switch (msg[count]->msg_style) { 167 switch (msg[count]->msg_style) {
164 case PAM_PROMPT_ECHO_ON: 168 case PAM_PROMPT_ECHO_ON:
165 /* user name given to PAM already */ 169 /* user name given to PAM already */
166 return PAM_CONV_ERR; 170 return PAM_CONV_ERR;
167 171
168 case PAM_PROMPT_ECHO_OFF: 172 case PAM_PROMPT_ECHO_OFF:
169 /* wants password */ 173 /* wants password */
@@ -188,17 +192,17 @@ static int PAM_conv( int num_msg, pam_message_type **msg,
188 192
189static bool pwcheck_PAM( const char *user, const char *password ) 193static bool pwcheck_PAM( const char *user, const char *password )
190{ 194{
191 bool pw_correct = false; 195 bool pw_correct = false;
192 int pam_error; 196 int pam_error;
193 int pam_return = 0; 197 int pam_return = 0;
194 pam_handle_t *pamh = 0; 198 pam_handle_t *pamh = 0;
195 PAM_password = password; 199 PAM_password = password;
196 200
197 pam_error = pam_start( _PAM_SERVICE, user, &PAM_conversation, &pamh ); 201 pam_error = pam_start( _PAM_SERVICE, user, &PAM_conversation, &pamh );
198 if( pam_error == PAM_SUCCESS ) { 202 if( pam_error == PAM_SUCCESS ) {
199 pam_error = pam_authenticate( pamh, 0 ); 203 pam_error = pam_authenticate( pamh, 0 );
200 if( pam_error == PAM_SUCCESS ) { 204 if( pam_error == PAM_SUCCESS ) {
201 //-- password correct 205 //-- password correct
202 pw_correct = true; 206 pw_correct = true;
203 pam_return = PAM_SUCCESS; 207 pam_return = PAM_SUCCESS;
204 } else { 208 } else {
@@ -217,28 +221,28 @@ static bool pwcheck_PAM( const char *user, const char *password )
217 221
218static bool pwcheck_Unix( const char *user, const char *pass ) 222static bool pwcheck_Unix( const char *user, const char *pass )
219{ 223{
220 char *encrypted, *correct; 224 char *encrypted, *correct;
221 struct passwd *pw; 225 struct passwd *pw;
222 226
223 if ( !user || !pass ) 227 if ( !user || !pass )
224 return false; 228 return false;
225 229
226 pw = getpwnam ( user ); 230 pw = getpwnam ( user );
227 231
228 if ( !pw ) 232 if ( !pw )
229 return false; 233 return false;
230 234
231 if (( strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( strcmp ( pw-> pw_passwd, "*" ) == 0 )) { 235 if (( strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( strcmp ( pw-> pw_passwd, "*" ) == 0 )) {
232 struct spwd *sp = getspnam ( pw-> pw_name ); 236 struct spwd *sp = getspnam ( pw-> pw_name );
233 237
234 if ( !sp ) 238 if ( !sp )
235 return false; 239 return false;
236 240
237 correct = sp-> sp_pwdp; 241 correct = sp-> sp_pwdp;
238 } 242 }
239 else 243 else
240 correct = pw-> pw_passwd; 244 correct = pw-> pw_passwd;
241 245
242 if ( correct == 0 || correct[0] == '\0' ) 246 if ( correct == 0 || correct[0] == '\0' )
243 return true; 247 return true;
244 248
@@ -251,69 +255,65 @@ static bool pwcheck_Unix( const char *user, const char *pass )
251 255
252bool LoginWindowImpl::changeIdentity ( const char *user ) 256bool LoginWindowImpl::changeIdentity ( const char *user )
253{ 257{
254 const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin"; 258 const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin";
255 const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin"; 259 const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin";
256 260
257 bool fail = false; 261 bool fail = false;
258 struct passwd *pw = getpwnam ( user ); 262 struct passwd *pw = getpwnam ( user );
259 263
260 fail |= ( pw == 0 ); 264 fail |= ( pw == 0 );
261 printf ( "1 %d\n", fail );
262 fail |= ( initgroups ( pw-> pw_name, pw-> pw_gid )); 265 fail |= ( initgroups ( pw-> pw_name, pw-> pw_gid ));
263 endgrent ( ); 266 endgrent ( );
264 printf ( "2 %d\n", fail );
265 fail |= ( setgid ( pw-> pw_gid )); 267 fail |= ( setgid ( pw-> pw_gid ));
266 printf ( "3 %d\n", fail );
267 fail |= ( setuid ( pw-> pw_uid )); 268 fail |= ( setuid ( pw-> pw_uid ));
268 269
269 printf ( "4 %d\n", fail );
270 fail |= ( chdir ( pw-> pw_dir ) && chdir ( "/" )); 270 fail |= ( chdir ( pw-> pw_dir ) && chdir ( "/" ));
271 271
272 printf ( "5 %d\n", fail );
273 fail |= ( setenv ( "HOME", pw-> pw_dir, 1 )); 272 fail |= ( setenv ( "HOME", pw-> pw_dir, 1 ));
274 printf ( "6 %d\n", fail );
275 fail |= ( setenv ( "SHELL", pw-> pw_shell, 1 )); 273 fail |= ( setenv ( "SHELL", pw-> pw_shell, 1 ));
276 printf ( "7 %d\n", fail );
277 fail |= ( setenv ( "USER", pw-> pw_name, 1 )); 274 fail |= ( setenv ( "USER", pw-> pw_name, 1 ));
278 printf ( "8 %d\n", fail );
279 fail |= ( setenv ( "LOGNAME", pw-> pw_name, 1 )); 275 fail |= ( setenv ( "LOGNAME", pw-> pw_name, 1 ));
280 printf ( "9 %d\n", fail );
281 fail |= ( setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); 276 fail |= ( setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 ));
282 printf ( "10 %d\n", fail ); 277
283
284 return !fail; 278 return !fail;
285} 279}
286 280
287void LoginWindowImpl::login ( ) 281void LoginWindowImpl::login ( )
288{ 282{
289 const char *user = strdup ( m_user-> currentText ( ). local8Bit ( )); 283 const char *user = ::strdup ( m_user-> currentText ( ). local8Bit ( ));
290 const char *pass = strdup ( m_password-> text ( ). local8Bit ( )); 284 const char *pass = ::strdup ( m_password-> text ( ). local8Bit ( ));
291 bool ok; 285 bool ok;
292 286
293 if ( !user || !user [0] ) 287 if ( !user || !user [0] )
294 return; 288 return;
295 if ( !pass ) 289 if ( !pass )
296 pass = ""; 290 pass = "";
297 291
298#if defined( USEPAM ) 292#if defined( USEPAM )
299 ok = pwcheck_PAM ( user, pass ); 293 ok = pwcheck_PAM ( user, pass );
300#else 294#else
301 ok = pwcheck_Unix ( user, pass ); 295 ok = pwcheck_Unix ( user, pass );
302#endif 296#endif
303 297
304 if ( ok ) { 298 if ( ok ) {
305 if ( changeIdentity ( user )) { 299 if ( changeIdentity ( user )) {
306 QString opie = getenv ( "OPIEDIR" ); 300 char *opie = ::getenv ( "OPIEDIR" );
307 opie += "/bin/qpe"; 301 char *arg = new char [::strlen ( opie ) + 8 + 1];
308 302
309 execl ( opie. latin1 ( ), "qpe", 0 ); 303 ::strcpy ( arg, opie );
310 304 ::strcat ( arg, "/bin/qpe" );
311 QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE." )); 305
306 // start qpe via a login shell
307 ::execl ( "/bin/sh", "-sh", "-c", arg, 0 );
308
309 QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not start OPIE\n(%1)." ). arg ( arg ));
310 delete [] arg;
311
312 restart ( ); 312 restart ( );
313 } 313 }
314 else { 314 else {
315 QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not switch to new user identity" )); 315 QMessageBox::critical ( this, tr( "Failure" ), tr( "Could not switch to new user identity" ));
316 restart ( ); 316 restart ( );
317 } 317 }
318 } 318 }
319 else { 319 else {
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
@@ -9,16 +9,17 @@ class LoginWindowImpl : public LoginWindow {
9 Q_OBJECT 9 Q_OBJECT
10 10
11public: 11public:
12 LoginWindowImpl ( ); 12 LoginWindowImpl ( );
13 virtual ~LoginWindowImpl ( ); 13 virtual ~LoginWindowImpl ( );
14 14
15protected slots: 15protected slots:
16 void restart ( ); 16 void restart ( );
17 void quit ( );
17 void showIM ( ); 18 void showIM ( );
18 void suspend ( ); 19 void suspend ( );
19 void backlight ( ); 20 void backlight ( );
20 void login ( ); 21 void login ( );
21 void toggleEchoMode ( bool ); 22 void toggleEchoMode ( bool );
22 23
23protected: 24protected:
24 virtual void keyPressEvent ( QKeyEvent *e ); 25 virtual void keyPressEvent ( QKeyEvent *e );
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 @@
1#include <sys/time.h> 1#include <sys/time.h>
2#include <sys/resource.h> 2#include <sys/resource.h>
3#include <unistd.h> 3#include <unistd.h>
4#include <syslog.h> 4#include <syslog.h>
5#include <sys/types.h> 5#include <sys/types.h>
6#include <sys/wait.h> 6#include <sys/wait.h>
7#include <stdio.h> 7#include <stdio.h>
8#include <stdlib.h> 8#include <stdlib.h>
9#include <signal.h>
9 10
10#include <qpe/qpeapplication.h> 11#include <qpe/qpeapplication.h>
11#include <qpe/qcopenvelope_qws.h> 12#include <qpe/qcopenvelope_qws.h>
13#include <qpe/qpestyle.h>
14#include <qpe/power.h>
12 15
13#include <opie/odevice.h> 16#include <opie/odevice.h>
14 17
15#include <qwindowsystem_qws.h> 18#include <qwindowsystem_qws.h>
16#include <qfile.h> 19#include <qfile.h>
17 20
18#include "loginwindowimpl.h" 21#include "loginwindowimpl.h"
19#include "calibrate.h" 22#include "calibrate.h"
20 23
21int login_main ( int argc, char **argv ); 24int login_main ( int argc, char **argv );
25void sigusr1 ( int sig );
26void exit_closelog ( );
27
22 28
23 29
24int main ( int argc, char **argv ) 30int main ( int argc, char **argv )
25{ 31{
26 if ( geteuid ( ) != 0 ) { 32 if ( ::geteuid ( ) != 0 ) {
27 fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] ); 33 ::fprintf ( stderr, "%s can only be executed by root. (or chmod +s)", argv [0] );
28 return 1; 34 return 1;
29 } 35 }
30 36
31 //struct rlimit rl; 37 //struct rlimit rl;
32 //getrlimit ( RLIMIT_NOFILE, &rl ); 38 //::getrlimit ( RLIMIT_NOFILE, &rl );
33 39
34 //for ( unsigned int i = 0; i < rl. rlim_cur; i++ ) 40 //for ( unsigned int i = 0; i < rl. rlim_cur; i++ )
35 // close ( i ); 41 // ::close ( i );
42
43 ::setpgid ( 0, 0 );
44 ::setsid ( );
45
46 ::signal ( SIGUSR1, sigusr1 );
47
48 ::openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
49 ::atexit ( exit_closelog );
36 50
37 setpgid ( 0, 0 );
38 setsid ( );
39
40 openlog ( "opie-login", LOG_CONS, LOG_AUTHPRIV );
41
42 while ( true ) { 51 while ( true ) {
43 pid_t child = fork ( ); 52 pid_t child = ::fork ( );
44 53
45 if ( child < 0 ) { 54 if ( child < 0 ) {
46 syslog ( LOG_ERR, "Could not fork process" ); 55 ::syslog ( LOG_ERR, "Could not fork process" );
47 break; 56 break;
48 57
49 } 58 }
50 else if ( child > 0 ) { 59 else if ( child > 0 ) {
51 int status = 0; 60 int status = 0;
52 61
53 while ( waitpid ( child, &status, 0 ) < 0 ) { } 62 while ( ::waitpid ( child, &status, 0 ) < 0 ) { }
54 } 63 }
55 else { 64 else {
56 exit ( login_main ( argc, argv )); 65 ::exit ( login_main ( argc, argv ));
57 } 66 }
58 } 67 }
59 closelog ( ); 68 return 0;
60} 69}
61 70
71void sigusr1 ( int /*sig*/ )
72{
73 ::exit ( 0 );
74}
62 75
63class ModelKeyFilter : public QObject, public QWSServer::KeyboardFilter 76void exit_closelog ( )
64{ 77{
65public: 78 ::closelog ( );
66 ModelKeyFilter ( ) : QObject ( 0, "MODEL_KEY_FILTER" ) 79}
67 {
68 bool doinst = false;
69
70 m_model = ODevice::inst ( )-> model ( );
71 m_power_timer = 0;
72
73 switch ( m_model ) {
74 case OMODEL_iPAQ_H31xx:
75 case OMODEL_iPAQ_H36xx:
76 case OMODEL_iPAQ_H37xx:
77 case OMODEL_iPAQ_H38xx: doinst = true;
78 break;
79 default : break;
80 }
81 if ( doinst )
82 QWSServer::setKeyboardFilter ( this );
83 }
84 80
85 virtual bool filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
86 {
87 bool kill = false;
88
89 // Rotate cursor keys 180°
90 switch ( m_model ) {
91 case OMODEL_iPAQ_H31xx:
92 case OMODEL_iPAQ_H38xx: {
93 int newkeycode = keycode;
94
95 switch ( keycode ) {
96 case Key_Left : newkeycode = Key_Right; break;
97 case Key_Right: newkeycode = Key_Left; break;
98 case Key_Up : newkeycode = Key_Down; break;
99 case Key_Down : newkeycode = Key_Up; break;
100 }
101 if ( newkeycode != keycode ) {
102 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
103 kill = true;
104 }
105 break;
106 }
107 default: break;
108 }
109
110 // map Power Button short/long press to F34/F35
111 switch ( m_model ) {
112 case OMODEL_iPAQ_H31xx:
113 case OMODEL_iPAQ_H36xx:
114 case OMODEL_iPAQ_H37xx:
115 case OMODEL_iPAQ_H38xx: {
116 if ( keycode == Key_SysReq ) {
117 if ( isPress ) {
118 m_power_timer = startTimer ( 500 );
119 }
120 else if ( m_power_timer ) {
121 killTimer ( m_power_timer );
122 m_power_timer = 0;
123 QWSServer::sendKeyEvent ( -1, Key_F34, 0, true, false );
124 QWSServer::sendKeyEvent ( -1, Key_F34, 0, false, false );
125 }
126 kill = true;
127 }
128 break;
129 }
130 default: break;
131 }
132 return kill;
133 }
134 81
135 virtual void timerEvent ( QTimerEvent * ) 82class LoginScreenSaver : public QWSScreenSaver
136 { 83{
137 killTimer ( m_power_timer ); 84public:
138 m_power_timer = 0; 85 LoginScreenSaver ( )
139 QWSServer::sendKeyEvent ( -1, Key_F35, 0, true, false ); 86 {
140 QWSServer::sendKeyEvent ( -1, Key_F35, 0, false, false ); 87 m_lcd_status = true;
141 } 88
89 m_backlight_bright = -1;
90 m_backlight_forcedoff = false;
91
92 // Make sure the LCD is in fact on, (if opie was killed while the LCD is off it would still be off)
93 ODevice::inst ( ) -> setDisplayStatus ( true );
94 }
95 void restore()
96 {
97 if ( !m_lcd_status ) // We must have turned it off
98 ODevice::inst ( ) -> setDisplayStatus ( true );
99
100 setBacklight ( -1 );
101 }
102 bool save( int level )
103 {
104 switch ( level ) {
105 case 0:
106 if ( backlight() > 1 )
107 setBacklight( 1 ); // lowest non-off
108 return true;
109 break;
110 case 1:
111 setBacklight( 0 ); // off
112 return true;
113 break;
114 case 2:
115 // We're going to suspend the whole machine
116 if ( PowerStatusManager::readStatus().acStatus() != PowerStatus::Online ) {
117 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
118 return true;
119 }
120 break;
121 }
122 return false;
123 }
142 124
143private: 125private:
144 OModel m_model; 126public:
145 int m_power_timer; 127 void setIntervals( int i1 = 30, int i2 = 20, int i3 = 60 )
146}; 128 {
129 int v [4];
130
131 v [ 0 ] = QMAX( 1000 * i1, 100 );
132 v [ 1 ] = QMAX( 1000 * i2, 100 );
133 v [ 2 ] = QMAX( 1000 * i3, 100 );
134 v [ 3 ] = 0;
135
136 if ( !i1 && !i2 && !i3 )
137 QWSServer::setScreenSaverInterval ( 0 );
138 else
139 QWSServer::setScreenSaverIntervals ( v );
140 }
141
142 int backlight ( )
143 {
144 if ( m_backlight_bright == -1 )
145 m_backlight_bright = 255;
146
147 return m_backlight_bright;
148 }
149
150 void setBacklight ( int bright )
151 {
152 if ( bright == -3 ) {
153 // Forced on
154 m_backlight_forcedoff = false;
155 bright = -1;
156 }
157 if ( m_backlight_forcedoff && bright != -2 )
158 return ;
159 if ( bright == -2 ) {
160 // Toggle between off and on
161 bright = m_backlight_bright ? 0 : -1;
162 m_backlight_forcedoff = !bright;
163 }
164
165 m_backlight_bright = bright;
166
167 bright = backlight ( );
168 ODevice::inst ( ) -> setDisplayBrightness ( bright );
169
170 m_backlight_bright = bright;
171 }
147 172
173private:
174 bool m_lcd_status;
175
176 int m_backlight_bright;
177 bool m_backlight_forcedoff;
178};
148 179
149 180
150 181
151int login_main ( int argc, char **argv ) 182int login_main ( int argc, char **argv )
152{ 183{
153 QWSServer::setDesktopBackground( QImage() ); 184 QWSServer::setDesktopBackground( QImage() );
154 QPEApplication app ( argc, argv, QApplication::GuiServer ); 185 QPEApplication app ( argc, argv, QApplication::GuiServer );
155 186
156 (void) new ModelKeyFilter ( ); 187 app. setFont ( QFont ( "Helvetica", 10 ));
157 188 app. setStyle ( new QPEStyle ( ));
158 { 189
159 QCopEnvelope e("QPE/System", "setBacklight(int)" ); 190 ODevice::inst ( )-> setSoftSuspend ( true );
160 e << -3; // Forced on 191
192 {
193 QCopEnvelope e("QPE/System", "setBacklight(int)" );
194 e << -3; // Forced on
161 } 195 }
162 196
163#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) 197#if defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX)
164 if ( !QFile::exists ( "/etc/pointercal" )) { 198 if ( !QFile::exists ( "/etc/pointercal" )) {
165 // Make sure calibration widget starts on top. 199 // Make sure calibration widget starts on top.
166 Calibrate *cal = new Calibrate; 200 Calibrate *cal = new Calibrate;
167 cal-> exec ( ); 201 cal-> exec ( );
168 delete cal; 202 delete cal;
169 } 203 }
170#endif 204#endif
171 205
206
207 LoginScreenSaver *saver = new LoginScreenSaver;
208
209 saver-> setIntervals ( );
210 QWSServer::setScreenSaver ( saver );
211
212
172 LoginWindowImpl *lw = new LoginWindowImpl ( ); 213 LoginWindowImpl *lw = new LoginWindowImpl ( );
173 app. setMainWidget ( lw ); 214 app. setMainWidget ( lw );
174 lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( )); 215 lw-> setGeometry ( 0, 0, app. desktop ( )-> width ( ), app. desktop ( )-> height ( ));
175 lw-> show ( ); 216 lw-> show ( );
176 217
177 return app. exec ( ); 218 int rc = app. exec ( );
219
220 ODevice::inst ( )-> setSoftSuspend ( false );
221
222 return rc;
178} 223}
179 224