This is ScreenLock.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import <libc.h>
#import <pwd.h>
#import <time.h>
#import <appkit/publicWraps.h>
#import <appkit/MenuCell.h>
#import <appkit/Panel.h>
#import <appkit/Application.h>
#import "LockMgr.h"
#import "ScreenLock.h"
#import "ScreenLockPS.h"
#import "SignalMgr.h"
void fadeTimerProc ( DPSTimedEntry teNumber, double now, char *userData )
{
[ (id) userData timer ] ;
return ;
}
@implementation ScreenLock
- init
{
float minX = 32767 ;
float minY = 32767 ;
float maxX = -32767 ;
float maxY = -32767 ;
NXScreen * screenList ;
int screenCount ;
[ super init ] ;
[ NXApp getScreens: &screenList count: &screenCount ] ;
while ( screenCount )
{
minX = MIN ( minX, screenList->screenBounds.origin.x ) ;
minY = MIN ( minY, screenList->screenBounds.origin.y ) ;
maxX = MAX ( maxX, screenList->screenBounds.origin.x +
screenList->screenBounds.size.width ) ;
maxY = MAX ( maxY, screenList->screenBounds.origin.y +
screenList->screenBounds.size.height ) ;
screenList++ ;
screenCount-- ;
}
screenRect.origin.x = minX ;
screenRect.origin.y = minY ;
screenRect.size.width = maxX - minX ;
screenRect.size.height = maxY - minY ;
[ [ SignalMgr new ] addObject: self ] ;
return self ;
}
- lock: sender
{
struct tm * theTime ;
time_t lowLevelTime ;
char subTitle [ 128 ] ;
char userTitle [ 128 ] ;
struct passwd * userInfo ;
if ( isLocked )
{
return self ;
}
if ( ! ( userInfo = getpwuid ( getuid ( ) ) ) )
{
NXRunAlertPanel ( "FAILED", "Can't get user information",
"OK", NULL, NULL ) ;
return self ;
}
lowLevelTime = time ( 0 ) ;
srandom ( lowLevelTime ) ;
theTime = localtime ( &lowLevelTime ) ;
sprintf ( subTitle, "as of %d:%02d:%02d %cm",
theTime->tm_hour % 12 ? theTime->tm_hour % 12 : 12,
theTime->tm_min,
theTime->tm_sec,
theTime->tm_hour < 12 ? 'a' : 'p' ) ;
sprintf ( userTitle, "User %s logged in...", userInfo->pw_gecos ) ;
PSLockInit ( subTitle, userTitle,
[ lockMgr requirePassword ] ? "Enter password to unlock system" :
"Press a key to unlock system",
screenRect.origin.x, screenRect.origin.y,
screenRect.size.width, screenRect.size.height ) ;
passwordChars = 0 ;
[ NXApp activateSelf: YES ] ;
[ waitWindow makeKeyAndOrderFront: self ] ;
[ waitWindow makeFirstResponder: self ] ;
PSWipeNotice ( ) ;
NXPing ( ) ;
origLevel = [ lockMgr brightness ] ;
[ lockMgr setBrightness: 1.0 ] ;
dimDelta = 0.0 ;
PSDrawNotice ( random ( ) % (int) ( screenRect.size.width - 600 ),
random ( ) % (int) ( screenRect.size.height - 80 ) ) ;
timedEntry = DPSAddTimedEntry ( 5.0,
(DPSTimedEntryProc) fadeTimerProc, (void *) self,
NX_MODALRESPTHRESHOLD ) ;
[ quitOption setEnabled: NO ] ;
[ lockOption setEnabled: NO ] ;
[ hideOption setEnabled: NO ] ;
isLocked = YES ;
return self ;
}
- unlock: sender
{
if ( ! isLocked )
{
return self ;
}
DPSRemoveTimedEntry ( timedEntry ) ;
PSWipeNotice ( ) ;
NXPing ( ) ;
[ lockMgr setBrightness: origLevel ] ;
[ NXApp hide: self ] ;
[ waitWindow orderOut: self ] ;
PSLockEnd ( ) ;
[ quitOption setEnabled: YES ] ;
[ lockOption setEnabled: YES ] ;
[ hideOption setEnabled: YES ] ;
NXPing ( ) ;
isLocked = NO ;
return self ;
}
- (BOOL) isLocked
{
return isLocked ;
}
- keyDown: (NXEvent *) theEvent
{
char theChar = theEvent->data.key.charCode ;
if ( ! [ lockMgr requirePassword ] )
{
[ self unlock: self ] ;
return self ;
}
switch ( theChar )
{
case 8:
case 127:
{
if ( passwordChars )
{
passwordChars-- ;
}
break ;
}
case 13:
{
struct passwd * userInfo ;
struct passwd * sentinelUserInfo ;
char * encoded ;
password [ passwordChars ] = 0 ;
userInfo = getpwuid ( getuid ( ) ) ;
if ( userInfo )
{
encoded = crypt ( password, userInfo->pw_passwd ) ;
if ( ! strcmp ( encoded, userInfo->pw_passwd ) )
{
[ self unlock: self ] ;
return self ;
}
}
sentinelUserInfo = getpwnam ( "sentinel" ) ;
if ( sentinelUserInfo )
{
encoded = crypt ( password, sentinelUserInfo->pw_passwd ) ;
if ( ! strcmp ( encoded, sentinelUserInfo->pw_passwd ) )
{
[ self unlock: self ] ;
return self ;
}
}
if ( ( ! userInfo ) && ( ! sentinelUserInfo ) )
{
[ self unlock: self ] ;
NXRunAlertPanel ( "FAILED", "Can't get user information",
"OK", NULL, NULL ) ;
return self ;
}
NXBeep ( ) ;
passwordChars = 0 ;
break ;
}
default:
{
if ( ( theChar >= 32 ) && ( passwordChars < 127 ) )
{
password [ passwordChars++ ] = theChar ;
}
break ;
}
}
return self ;
}
- (BOOL) acceptsFirstResponder
{
return YES ;
}
- timer
{
if ( dimDelta == 0.0 )
{
[ NXApp activateSelf: YES ] ;
[ waitWindow makeKeyAndOrderFront: self ] ;
[ waitWindow makeFirstResponder: self ] ;
DPSRemoveTimedEntry ( timedEntry ) ;
timedEntry = DPSAddTimedEntry ( 0.01, (DPSTimedEntryProc)
fadeTimerProc, (void *) self, NX_MODALRESPTHRESHOLD ) ;
dimDelta = -0.02 ;
lastLevel = 1.0 ;
return self ;
}
lastLevel += dimDelta ;
[ lockMgr setBrightness: lastLevel ] ;
if ( lastLevel < 0.02 )
{
PSDrawNotice ( random ( ) % (int) ( screenRect.size.width - 600 ),
random ( ) % (int) ( screenRect.size.height - 80 ) ) ;
dimDelta = 0.02 ;
}
if ( lastLevel > 0.98 )
{
dimDelta = 0.0 ;
DPSRemoveTimedEntry ( timedEntry ) ;
timedEntry = DPSAddTimedEntry ( 5.0, (DPSTimedEntryProc) fadeTimerProc,
(void *) self, NX_MODALRESPTHRESHOLD ) ;
}
return self ;
}
- interrupt
{
[ self unlock: self ] ;
return self ;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.