Annotation of Examples/AppKit/Backspace/Thinker.m, revision 1.1.1.1

1.1       root        1: //  Thinker.m
                      2: //
                      3: //  This class is the brains behind the BackSpace app; it is the Application
                      4: //  object's delegate, and it watches the system to determine when to
                      5: //  initiate the screen saver mode.
                      6: //
                      7: //  You may freely copy, distribute, and reuse the code in this example.
                      8: //  NeXT disclaims any warranty of any kind, expressed or  implied, as to its
                      9: //  fitness for any particular use.
                     10: 
                     11: 
                     12: #import "Thinker.h"
                     13: #import "BackWindow.h"
                     14: #import "BackView.h"
                     15: #import "SpaceView.h"
                     16: #import "MySlider.h"
                     17: #import "Password.h"
                     18: #import "psfuncts.h"
                     19: 
                     20: #import <appkit/appkit.h>
                     21: #import <objc/NXBundle.h>
                     22: 
                     23: // convert vertical blank time to milliseconds
                     24: #define SEC2MS(x) ((x * 1000) + 20)
                     25: 
                     26: //#define SHOWITERATIONSPERSEC
                     27: 
                     28: #ifdef SHOWITERATIONSPERSEC
                     29: unsigned iterations;
                     30: BStimeval then, now, targetTime;
                     31: #endif
                     32: 
                     33: static id _BSThinker;
                     34: 
                     35: id BSThinker()
                     36: {      return _BSThinker;
                     37: }
                     38: 
                     39: 
                     40: @implementation Thinker
                     41: 
                     42: - appDidInit:sender
                     43: {
                     44:        const char *autoLaunch;
                     45:        globalTier = BACKGROUNDTIER;
                     46:        openAnother = YES;
                     47:        _BSThinker = self;
                     48: 
                     49:        backZone = NXCreateZone(vm_page_size, vm_page_size, YES);
                     50: 
                     51:        NXSetRect(&windowRect, 475, 300, 500, 450);
                     52: 
                     53:        [NXApp getScreens:&screens count:&screenCount];
                     54: 
                     55:        [commonImageInspector getFrame: &inspectorFrame];
                     56:        currentInspector = commonImageInspector;
                     57:        
                     58:        [self getViewType];
                     59:        [self setVirtualViewIndexAndIncrement:NO];
                     60:        [self getWindowType];
                     61: 
                     62:        [self getScreenSaverSetting];
                     63:        [self getScreenLockerSetting];
                     64:        [self getPrioritySetting];
                     65:        [self getImageFile];
                     66:        [self getHotCornerSetting];
                     67: 
                     68:        autoLaunch = NXGetDefaultValue([NXApp appName], "NXAutoLaunch");
                     69:        if (strcmp(autoLaunch,"YES"))
                     70:        {
                     71:                [[windMatrix window] makeKeyAndOrderFront:self];
                     72:                windowHasBeenDisplayed = YES;
                     73:        }
                     74:        else [NXApp hide:self];
                     75:        
                     76: #ifdef SHOWITERATIONSPERSEC
                     77:        then = currentTimeInMs();
                     78:        targetTime = then + 10000;
                     79: #endif
                     80:        
                     81:        srandom(time(0));
                     82: 
                     83:        return self;
                     84: }
                     85: 
                     86: - appDidHide:sender
                     87: {
                     88:        if (windowType != BACKWINDOW) [self removeTimer];
                     89:        return self;
                     90: }
                     91: 
                     92: - appDidUnhide:sender
                     93: {
                     94:        if (!windowHasBeenDisplayed)
                     95:        {
                     96:                [[windMatrix window] makeKeyAndOrderFront:self];
                     97:                windowHasBeenDisplayed = YES;
                     98:        }
                     99: 
                    100:        if (windowType != NOWINDOW) [self createTimer];
                    101:        return self;
                    102: }
                    103: 
                    104: 
                    105: 
                    106: // Pretty much a dummy function to invoke the step method.
                    107: 
                    108: void timedEntryFunction (DPSTimedEntry timedEntry, double timeNow, void *theObject)
                    109: {      [(id)theObject doDistributorLoop];
                    110: }
                    111: 
                    112: - createTimer
                    113: {
                    114:        if (!timerValid)
                    115:        {
                    116:                timerValid = YES;
                    117:                timer = DPSAddTimedEntry(0.02, &timedEntryFunction, self, NX_BASETHRESHOLD);
                    118:        }
                    119:        return self;
                    120: }
                    121: 
                    122: - removeTimer
                    123: {
                    124:        if (timerValid) DPSRemoveTimedEntry (timer);
                    125:        timerValid = NO;
                    126:        return self;
                    127: }
                    128: 
                    129: - doDistributorLoop
                    130: {
                    131:     NXEvent dummyEvent;
                    132:        
                    133:        keepLooping = YES;
                    134:        [spaceView lockFocus];
                    135:        if ([spaceView respondsTo:@selector(didLockFocus)]) [spaceView didLockFocus];
                    136: 
                    137:        do {
                    138:                [spaceView oneStep];
                    139:                [spaceWindow flushWindow];
                    140:                NXPing ();      // Synchronize postscript for smoother animation
                    141: 
                    142:                [spaceView oneStep];
                    143:                [spaceWindow flushWindow];
                    144:                NXPing ();      // Synchronize postscript for smoother animation
                    145: 
                    146: #ifdef SHOWITERATIONSPERSEC
                    147:                        iterations++;
                    148:                        if ((now = currentTimeInMs()) > targetTime)
                    149:                        {
                    150:                                printf("BackSpace: %5.1f its/sec\n",
                    151:                                        (double)iterations*1000.0/(double)(now - then));
                    152:                                iterations = 0;
                    153:                                targetTime = now + 10000;
                    154:                                then = now;
                    155:                        }
                    156: #endif
                    157:                        
                    158:           } while (timerValid && keepLooping &&
                    159:                        ([NXApp peekNextEvent:NX_ALLEVENTS into:&dummyEvent 
                    160:                                waitFor:0 threshold:NX_BASETHRESHOLD] == NULL));
                    161: 
                    162:        [spaceView unlockFocus];
                    163:        
                    164:        return self;
                    165: 
                    166: }
                    167: 
                    168: - installSpaceViewIntoWindow:w
                    169: {
                    170:        NXRect cvrect;
                    171:        int i;
                    172:        id subviews, contentView;
                    173:        
                    174:        if (!w) return nil;
                    175:        contentView = [w contentView];
                    176: 
                    177:        // get size of content view
                    178:        [contentView getBounds:&cvrect];
                    179:        
                    180:        // remove old subviews, this is overkill really...
                    181:        subviews = [contentView subviews];
                    182:        for (i=([subviews count]-1); i>=0; i--)
                    183:        {       [[subviews objectAt:i] removeFromSuperview];
                    184:        }
                    185:        
                    186:        // install it into the window's content view
                    187:        [contentView addSubview:spaceView];
                    188:        [contentView setAutoresizeSubviews:YES];
                    189:        [spaceView setAutosizing:NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE];
                    190: 
                    191:        // size the spaceview
                    192:        [spaceView sizeTo:cvrect.size.width :cvrect.size.height];
                    193:        
                    194:        return self;
                    195: }
                    196: 
                    197: - useNormalWindow
                    198: {
                    199:        int myBacking;
                    200:        
                    201:        spaceView = [self backView];
                    202:        myBacking = [self backingTypeForView:spaceView];
                    203: 
                    204:        if (!normalWindow)
                    205:        {
                    206:                normalWindow = [[Window allocFromZone:backZone]
                    207:                        initContent:&windowRect style:NX_RESIZEBARSTYLE
                    208:                        backing:myBacking 
                    209:                        buttonMask:NX_CLOSEBUTTONMASK
                    210:                        defer:NO];
                    211:                
                    212:                [self setWindowTitle];
                    213:                [normalWindow useOptimizedDrawing:YES];
                    214:                [normalWindow setDynamicDepthLimit:YES]; //want window depth to match device!
                    215:                [normalWindow setOneShot:YES];
                    216:                [normalWindow setDelegate:self];
                    217:                [normalWindow setBackgroundGray:NX_BLACK];
                    218:        }
                    219: 
                    220:        spaceWindow = normalWindow;
                    221:        [self installSpaceViewIntoWindow:spaceWindow];
                    222: 
                    223:        if ([spaceView respondsTo:@selector(setImage:)])
                    224:                [spaceView setImage: image];
                    225:        if ([spaceView respondsTo:@selector(newWindow)]) [spaceView newWindow];
                    226:        [spaceWindow display];
                    227: 
                    228:        [spaceWindow makeKeyAndOrderFront:self];
                    229:        
                    230:        // need to do this so flushing always works!
                    231:        // must do it late because kit does lazy window creation ie the PostScript
                    232:        // window might not exist until you actually draw to it
                    233:        
                    234:        if (myBacking == NX_RETAINED)
                    235:                [spaceWindow setBackingType:NX_RETAINED];
                    236:        else [spaceWindow setBackingType:NX_BUFFERED];
                    237: 
                    238:        return self;
                    239: }
                    240: 
                    241: - (int) backingTypeForView:aView
                    242: {
                    243:        if ([aView respondsTo:@selector(useBufferedWindow)] 
                    244:                && [aView useBufferedWindow])
                    245:                return NX_BUFFERED;
                    246:        return NX_RETAINED;
                    247: }
                    248: 
                    249: - useBackWindow:(int)tier
                    250: {
                    251:        NXRect r={{0, 0}};
                    252:        int myBacking;
                    253:        
                    254:        [NXApp getScreenSize:&(r.size)];
                    255: 
                    256:        spaceView = [self backView];
                    257:        myBacking = [self backingTypeForView:spaceView];
                    258:        
                    259:        [self createBigWindowIfNecessaryForView:spaceView];
                    260: 
                    261:        if (myBacking == NX_RETAINED)
                    262:        {       spaceWindow = bigUnbufferedWindow;
                    263:                tweakWindow([spaceWindow windowNum], tier);
                    264:        }
                    265:        else
                    266:        {       spaceWindow = bigBufferedWindow;
                    267:        }
                    268: 
                    269:        [self installSpaceViewIntoWindow:spaceWindow];
                    270: 
                    271:        if ([spaceView respondsTo:@selector(setImage:)])
                    272:                [spaceView setImage: image];
                    273: 
                    274:        [spaceWindow placeWindow:&r];
                    275:        if (myBacking == NX_BUFFERED) [spaceWindow display];
                    276: 
                    277:        [spaceWindow orderFront:self];
                    278:        if (myBacking == NX_BUFFERED) tweakWindow([spaceWindow windowNum], tier);
                    279:        else [spaceWindow display];
                    280: 
                    281:        if ([spaceView respondsTo:@selector(newWindow)]) [spaceView newWindow];
                    282: 
                    283:        return self;
                    284: }
                    285: 
                    286: - createBigWindowIfNecessaryForView:aView
                    287: {
                    288:        NXRect r={{0, 0}};
                    289:        int myBacking = [self backingTypeForView:aView];
                    290:        
                    291:        [NXApp getScreenSize:&(r.size)];
                    292: 
                    293:        if ((myBacking == NX_RETAINED) && !bigUnbufferedWindow)
                    294:        {
                    295:        
                    296:                bigUnbufferedWindow = [[BackWindow allocFromZone:backZone]
                    297:                        initContent:&r style:NX_TOKENSTYLE
                    298:                        backing:NX_NONRETAINED buttonMask:0 defer:NO];
                    299: 
                    300:                [bigUnbufferedWindow useOptimizedDrawing:YES];
                    301: 
                    302:                [bigUnbufferedWindow removeFromEventMask:(NX_LMOUSEDOWNMASK | NX_LMOUSEUPMASK
                    303:                           | NX_MOUSEMOVEDMASK | NX_LMOUSEDRAGGEDMASK
                    304:                           | NX_MOUSEENTEREDMASK | NX_MOUSEEXITEDMASK
                    305:                           | NX_KEYDOWNMASK | NX_KEYUPMASK
                    306:                           | NX_CURSORUPDATEMASK)];
                    307:                [bigUnbufferedWindow setBackgroundGray:NX_BLACK];
                    308:        }
                    309: 
                    310:        if ((myBacking == NX_BUFFERED) && !bigBufferedWindow)
                    311:        {
                    312: 
                    313:                bigBufferedWindow = [[BackWindow allocFromZone:backZone]
                    314:                        initContent:&r style:NX_TOKENSTYLE
                    315:                        backing:NX_BUFFERED buttonMask:0 defer:NO];
                    316: 
                    317:                [bigBufferedWindow useOptimizedDrawing:YES];
                    318: 
                    319:                [bigBufferedWindow removeFromEventMask:(NX_LMOUSEDOWNMASK | NX_LMOUSEUPMASK
                    320:                           | NX_MOUSEMOVEDMASK | NX_LMOUSEDRAGGEDMASK
                    321:                           | NX_MOUSEENTEREDMASK | NX_MOUSEEXITEDMASK
                    322:                           | NX_KEYDOWNMASK | NX_KEYUPMASK
                    323:                           | NX_CURSORUPDATEMASK)];
                    324: 
                    325:                [bigBufferedWindow setDynamicDepthLimit:YES]; //want window depth to match device!
                    326:                [bigBufferedWindow setOneShot:YES];
                    327:                [bigBufferedWindow setBackgroundGray:NX_BLACK];
                    328:        }
                    329: 
                    330:        return self;
                    331: }
                    332: 
                    333: - changeWindowType:sender
                    334: {
                    335:        [self changeWindowTypeAndRemember:YES];
                    336:        return self;
                    337: }
                    338: 
                    339: - changeWindowTypeAndRemember:(BOOL)rem
                    340: {
                    341:        char str[10];
                    342:        int newWindowType;
                    343: 
                    344:        newWindowType = [windMatrix selectedRow];
                    345:        if (newWindowType == windowType) return self;
                    346:        
                    347:        windowType = newWindowType;
                    348: 
                    349:        if (rem)
                    350:        {
                    351:                sprintf(str,"%1d", windowType);
                    352:                NXWriteDefault([NXApp appName], "windowType", str);
                    353:        }
                    354: 
                    355:        [spaceWindow orderOut:self];
                    356:        
                    357:        switch (windowType)
                    358:        {
                    359:                case NOWINDOW:
                    360:                        [self removeTimer];
                    361:                        break;
                    362:                case NORMALWINDOW:
                    363:                        [self useNormalWindow];
                    364:                        [self createTimer];
                    365:                        break;
                    366:                case BACKWINDOW:
                    367:                        [self useBackWindow: globalTier];
                    368:                        [self createTimer];
                    369:                        break;
                    370:        }
                    371:        
                    372:        return self;
                    373: }
                    374: 
                    375: - getWindowType
                    376: {
                    377:        int tWindowType = NORMALWINDOW;
                    378:        const char *ptr;
                    379:        int val;
                    380: 
                    381:        ptr = NXGetDefaultValue([NXApp appName], "windowType");
                    382:        if (ptr)
                    383:        {
                    384:                sscanf(ptr,"%d",&val);
                    385:                if (val >= 0 && val <= 2) tWindowType = val;
                    386:        }
                    387:        
                    388:        [windMatrix selectCellAt:tWindowType :0];
                    389:        [self changeWindowTypeAndRemember:NO];
                    390: 
                    391:        return self;
                    392: }
                    393: 
                    394: - getScreenSaverSetting
                    395: {
                    396:        const char *ptr;
                    397:        
                    398:        if((evs = NXOpenEventStatus()) == 0)
                    399:        {       perror("NXOpenEventStatus failed.");
                    400:         exit(10);
                    401:        }
                    402:        
                    403:        [self getDimBrightness:&dimBrightness];
                    404:        
                    405:        //in case the old dim brightness is somehow invalid, I reset it
                    406:        if (dimBrightness > .25)
                    407:        {
                    408:                dimBrightness = .25;
                    409:                [self _setDimBrightness:&dimBrightness];
                    410:        }
                    411: 
                    412:        [screenSaver setState:0];
                    413:        
                    414:        ptr = NXGetDefaultValue([NXApp appName], "screenSaver");
                    415: 
                    416:        if (!ptr || !strcmp(ptr,"Off")) [self setScreenSaver:NO andRemember:NO];
                    417:        else [self setScreenSaver:YES andRemember:NO];
                    418:        
                    419:        return self;
                    420: }
                    421: 
                    422: - changeScreenSaverSetting:sender
                    423: {
                    424:        [self setScreenSaver:([screenSaver state])andRemember:YES];
                    425:        return self;
                    426: }
                    427: 
                    428: - setScreenSaver:(BOOL)val andRemember:(BOOL)rem
                    429: {
                    430:        [screenSaver setState:val];
                    431:        screenSaverVal = val;
                    432:        
                    433:        if (val)
                    434:        {
                    435:                // turn it on...
                    436:                [self calcDimTime];
                    437:                if (rem) NXWriteDefault([NXApp appName], "screenSaver", "On");
                    438:        }
                    439:        else
                    440:        {
                    441:                // turn it off...
                    442:                if (rem) NXRemoveDefault([NXApp appName], "screenSaver");
                    443:        }
                    444:        
                    445:        return self;
                    446: }
                    447: 
                    448: - calcDimTime
                    449: {
                    450:        double dimTime;
                    451:        [self getDimTime :&dimTime];
                    452:        
                    453:        if (dimTime < 0) dimTime = .1;
                    454:        
                    455:        if (screenSaverVal && !doingSaver)
                    456:        {
                    457:                // printf("BackSpace calcDimTime: dims in %f seconds\n",dimTime);
                    458:        
                    459:                [self perform:@selector(maybeDoScreenSaver:)
                    460:                        with:self
                    461:                        afterDelay:SEC2MS(dimTime)
                    462:                        cancelPrevious:YES];
                    463:        }
                    464:                        
                    465:        return self;
                    466: }
                    467: 
                    468: - maybeDoScreenSaver:sender
                    469: {
                    470:        NXEvent anEvent;
                    471:        BOOL autoDimmed;
                    472: 
                    473:        // in case timed entry fires but user has killed screen saver
                    474:        if (!screenSaverVal || doingSaver) return self;
                    475:        
                    476:        autoDimmed = NXAutoDimState(evs);
                    477:        if (!autoDimmed)
                    478:        {
                    479:                [self calcDimTime];
                    480:                return self;
                    481:        }
                    482: 
                    483:        // The perform:afterDelay: method starts a timed entry to
                    484:        // invoke maybeDoScreenSaver, so we are in a timed entry
                    485:        // right now.  If we just jumped into doScreenSaver:, we
                    486:        // would interrupt the doDistributorLoop method while
                    487:        // it's still focused on the spaceView.  By posting an
                    488:        // event, we force that loop to bail out so we can jump
                    489:        // into the screen saver cleanly.
                    490:        
                    491:        keepLooping = NO;       // There was a bug related to this at one point.
                    492:                                                // I don't think it's necessary anymore.
                    493:        anEvent.type = NX_APPDEFINED;
                    494:        anEvent.data.compound.subtype = BSDOSAVER;
                    495:        anEvent.ctxt = [NXApp context];
                    496:        DPSPostEvent(&anEvent,0);
                    497:        
                    498:        return self;
                    499: }
                    500: 
                    501: - applicationDefined:(NXEvent *)theEvent
                    502: {
                    503:        switch (theEvent->data.compound.subtype)
                    504:        {
                    505:        case BSDOSAVER:
                    506:                [self doScreenSaver:self];
                    507:                [self calcDimTime];                     // reset to fire again
                    508:                break;
                    509:        case BSOPENFILE:
                    510:                [self doDelayedOpenFile];
                    511:                break;
                    512:        default:
                    513:                break;
                    514:        }
                    515:        return self;
                    516: }
                    517: 
                    518: - showFakeScreenSaverAfterPause:sender
                    519: {
                    520:        usleep(250000);
                    521:        return [self showFakeScreenSaver:sender];
                    522: }
                    523: 
                    524: - showFakeScreenSaver:sender
                    525: {
                    526:        [self screenSaverMode];
                    527:        NXSetAutoDimState(evs, YES);
                    528:        [self doScreenSaver:self];
                    529:        NXSetAutoDimState(evs, NO);
                    530:        [self normalMode];                      //usually not necessary
                    531:        
                    532:        // reset to fire again
                    533:        [self calcDimTime];
                    534:                
                    535:        return self;
                    536: }
                    537: 
                    538: 
                    539: - doScreenSaver:sender
                    540: {
                    541:        BOOL autoDimmed;
                    542:        int oldWindowType;
                    543:        BOOL mouseOK, oldTimerValid;
                    544:        BOOL ignoreMouseMovement = NO;
                    545:        BOOL isHidden;
                    546:        NXRect trackingRect;
                    547:        NXPoint mouseLoc;
                    548:        BOOL passwordOK;
                    549:        BOOL stoleActivation = NO;
                    550:        int oldActiveApp = 0;
                    551:        int iterationCount = 0;
                    552:                
                    553:        // must be sure we don't enter on timed entry after faking saver
                    554:        doingSaver = YES;
                    555:        
                    556:        isHidden = [NXApp isHidden];
                    557:        if (isHidden)
                    558:        {
                    559:                [NXApp unhideWithoutActivation:self];
                    560:        }
                    561: 
                    562:        // force activation here so we get keystrokes if someone
                    563:        // just types his password.
                    564:        if ([password isLocked])
                    565:        {
                    566:                oldActiveApp = [NXApp activateSelf:YES];
                    567:                stoleActivation = YES;
                    568:        }
                    569:        
                    570:        [self setVirtualViewIndexAndIncrement:YES];
                    571: 
                    572:        //save old window state
                    573:        oldWindowType = [windMatrix selectedRow];
                    574: 
                    575:        globalTier = SAVERTIER;
                    576: 
                    577:        [self blackOutAllScreens];
                    578:        
                    579:        //background window on screen
                    580:        [windMatrix selectCellAt:BACKWINDOW :0];
                    581:        [self changeWindowTypeAndRemember:NO];
                    582:        
                    583:        //nuke timer so timed entry doesn't fire
                    584:        oldTimerValid = timerValid;
                    585:        [self removeTimer];
                    586: 
                    587: 
                    588:        //set background window tier to SAVERTIER
                    589:        if ([self backingTypeForView:spaceView] == NX_BUFFERED)
                    590:        {
                    591:                // make sure the one shot buffer really exists
                    592:                //[spaceWindow display];        //xxx
                    593:                if ([spaceWindow windowNum] <= 0) [spaceWindow display];
                    594:                PSsetwindowlevel(SAVERTIER, [spaceWindow windowNum]);
                    595:        }
                    596:        else 
                    597:        {
                    598:                PSsetwindowlevel(SAVERTIER, [spaceWindow windowNum]);
                    599:                [spaceView fillBoundsWithBlack];
                    600:                [spaceView display];
                    601:        }
                    602: 
                    603:        NXPing();
                    604:        [self screenSaverMode];
                    605: 
                    606:        PSsetwaitcursorenabled(NO);
                    607: 
                    608:        if ([spaceView respondsTo:@selector(enteredScreenSaverMode)])
                    609:                [spaceView enteredScreenSaverMode];
                    610: 
                    611:        do {
                    612:                //obscure cursor
                    613:                PSobscurecursor();
                    614:        
                    615:                [spaceView lockFocus];
                    616:                if ([spaceView respondsTo:@selector(didLockFocus)])
                    617:                        [spaceView didLockFocus];
                    618: 
                    619: 
                    620:                if ([spaceView respondsTo:@selector(ignoreMouseMovement)])
                    621:                        ignoreMouseMovement = [spaceView ignoreMouseMovement];
                    622: 
                    623:                [spaceWindow getMouseLocation:&mouseLoc];
                    624:                trackingRect.origin.x = mouseLoc.x - 100;
                    625:                trackingRect.origin.y = mouseLoc.y - 100;
                    626:                trackingRect.size.width = trackingRect.size.height = 200;
                    627:        
                    628:                do {
                    629:                        if ((++iterationCount & 0x7f)==0) PSobscurecursor();
                    630: 
                    631:                        [spaceView oneStep];
                    632:                        [spaceWindow flushWindow];
                    633:                        NXPing();       // Synchronize postscript for smoother animation
                    634: 
                    635:                        // note: window and view coordinates the same!
                    636:                        // so I don't have to convert to view coord system
                    637:                        if (ignoreMouseMovement) mouseOK = YES;
                    638:                        else
                    639:                        {
                    640:                                [spaceWindow getMouseLocation:&mouseLoc];
                    641:                                mouseOK = [spaceView mouse:&mouseLoc inRect:&trackingRect];
                    642:                        }
                    643:                
                    644:                        [spaceView oneStep];
                    645:                        [spaceWindow flushWindow];
                    646:                        NXPing();       // Synchronize postscript for smoother animation
                    647: 
                    648:                        autoDimmed = NXAutoDimState(evs);
                    649:                } while (autoDimmed && mouseOK);
                    650:        
                    651:                [spaceView unlockFocus];
                    652: 
                    653:                // force activation here in case anyone changed it out
                    654:                // from under me.  (workspace does this, dog gone it!)
                    655:                if ([password isLocked])
                    656:                {
                    657:                        [NXApp activateSelf:YES];
                    658:                }
                    659: 
                    660:                passwordOK = [password checkPassword: 
                    661:                        NXLocalString("Screen is locked.  Enter password to unlock:",0,0) 
                    662:                        randomPos:YES checkLock:YES withView:spaceView];
                    663: 
                    664:                if (!passwordOK) NXSetAutoDimState(evs, YES);
                    665: 
                    666:        } while (!passwordOK);
                    667: 
                    668:        if ([spaceView respondsTo:@selector(willExitScreenSaverMode)])
                    669:                [spaceView willExitScreenSaverMode];
                    670: 
                    671:        NXSetAutoDimState(evs, NO);
                    672: 
                    673:        PSsetwaitcursorenabled(YES);
                    674: 
                    675:        [self normalMode];
                    676: 
                    677:        //background window tier to BACKGROUNDTIER
                    678:        PSsetwindowlevel(BACKGROUNDTIER, [spaceWindow windowNum]);
                    679:        globalTier = BACKGROUNDTIER;
                    680:        
                    681:        if (([self backingTypeForView:spaceView] != NX_BUFFERED) &&
                    682:                        oldWindowType == BACKWINDOW)
                    683:                // this justs fixes a display bug for really lazy nonretained windows
                    684:        {
                    685:                [spaceView fillBoundsWithBlack];
                    686:                [spaceView display];
                    687:        }
                    688: 
                    689:        if (oldTimerValid)      [self createTimer];
                    690: 
                    691:        [self unBlackOutAllScreens];
                    692:        
                    693:        //restore old window state
                    694:        [windMatrix selectCellAt:oldWindowType :0];
                    695:        [self changeWindowTypeAndRemember:NO];
                    696: 
                    697:        if (stoleActivation) 
                    698:        {
                    699:                if (oldActiveApp) [NXApp activate:oldActiveApp];
                    700:                else [NXApp deactivateSelf];
                    701:        }
                    702: 
                    703:        if (isHidden)
                    704:        {
                    705:                [NXApp hide:self];
                    706:        }
                    707: 
                    708:        doingSaver = NO;
                    709: 
                    710:        return self;
                    711: }
                    712: 
                    713: - appWillTerminate:sender
                    714: {
                    715:        [self normalMode];
                    716:        return self;
                    717: }
                    718: 
                    719: - appDidBecomeActive:sender
                    720: {
                    721:        id theMatrix;
                    722: 
                    723:        theMatrix = [viewSelectionBrowser matrixInColumn:0];
                    724:        [theMatrix scrollCellToVisible:realViewIndex :0];
                    725:        return self;
                    726: }
                    727: 
                    728: - app:sender powerOffIn:(int)ms andSave:(int)aFlag
                    729: {
                    730:        return [NXApp terminate:self];
                    731: }
                    732: 
                    733: - getPrioritySetting
                    734: {
                    735:        const char *ptr;
                    736:        int val;
                    737: 
                    738:        [mySlider setMinValue: 0];
                    739:        [mySlider setMaxValue: 10];
                    740:        
                    741:        ptr = NXGetDefaultValue([NXApp appName], "priority");
                    742:        if (ptr)
                    743:        {
                    744:                sscanf(ptr,"%d",&val);
                    745:                if (val >= 0 && val <= 10) priority = val;
                    746:                else priority = 4;
                    747:        }
                    748:        else priority = 4;
                    749:        
                    750:        [[mySlider cell] setIntValue:priority];
                    751:        [[priorityLevel cell] setIntValue:priority];
                    752: 
                    753: //     use mach call rather than unix - mach lets me increase priority!
                    754: //     setpriority(PRIO_PROCESS, 0, priority);
                    755:        cthread_priority(cthread_self(), priority, FALSE);
                    756: 
                    757:        return self;
                    758: }
                    759: 
                    760: - changeSliderValue:sender
                    761: {
                    762:        priority = [[mySlider cell] intValue];
                    763:        [[priorityLevel cell] setIntValue:priority];
                    764:        return self;
                    765: }
                    766: 
                    767: - saveSliderValue
                    768: {
                    769:        char str[50];
                    770: //     setpriority(PRIO_PROCESS, 0, priority);
                    771:        cthread_priority(cthread_self(), priority, FALSE);
                    772: 
                    773:        sprintf(str,"%d", priority);
                    774:        NXWriteDefault([NXApp appName], "priority", str);
                    775:        return self;
                    776: }
                    777: 
                    778: - windowWillResize:sender toSize:(NXSize *)frameSize
                    779: {
                    780:        if (frameSize->width < 100) frameSize->width = 100;
                    781:        if (frameSize->height < 100) frameSize->height = 100;
                    782:        return self;
                    783: }
                    784: 
                    785: - windowWillClose:sender
                    786: {
                    787:        [windMatrix selectCellAt:NOWINDOW :0];
                    788:        [self perform:@selector(changeWindowType:) with:self
                    789:                afterDelay:1 cancelPrevious:YES];
                    790:        return nil;
                    791: }
                    792: 
                    793: BStimeval currentTimeInMs()
                    794: {
                    795:     struct timeval curTime;
                    796:     gettimeofday (&curTime, NULL);
                    797:     return (curTime.tv_sec) * 1000 + curTime.tv_usec / 1000;
                    798: }
                    799: 
                    800: //
                    801: //  Additional methods to handle a common image object for views.
                    802: //  Lennart Lovstrad, Rank Xerox EuroPARC, August 1991.
                    803: //
                    804: 
                    805: - setImageFromFile: (const char *) filename
                    806: {
                    807:        [image free];
                    808: 
                    809:     image = [[NXImage alloc] initFromFile: filename];
                    810:     if (image == nil)
                    811:        {
                    812:                NXRunAlertPanel([NXApp appName], NXLocalString("Could not open %s",0,0),
                    813:                                NULL, NULL, NULL, filename);
                    814:                image = nil;
                    815:                //return nil;   //can't return, image is invalid
                    816:     }
                    817:        
                    818:        return [self commonImageInit];
                    819: }
                    820: 
                    821: - setImageFromName: (const char *) name
                    822: {
                    823:        [image free];
                    824:     image = [[NXImage alloc] initFromSection: name];
                    825:        
                    826:        return [self commonImageInit];
                    827: }
                    828: 
                    829: - commonImageInit
                    830: {
                    831:     [imageView setImage: image];
                    832:     [imageView display];
                    833: 
                    834:     if ([spaceView respondsTo:@selector(setImage:)])
                    835:                [spaceView setImage: image];
                    836: 
                    837:        if ([self backingTypeForView:spaceView] != NX_BUFFERED)
                    838:        {
                    839:                [spaceView fillBoundsWithBlack];
                    840:                [spaceView display];
                    841:        }
                    842: 
                    843:     return self;
                    844: }
                    845: 
                    846: - getImageFile
                    847: {
                    848:     const char *filename;
                    849: 
                    850:     filename = NXGetDefaultValue([NXApp appName], "imageFile");
                    851:     if (filename)
                    852:                [self setImageFromFile: filename];
                    853:        else [self setImageFromName: "defaultImage"];
                    854: 
                    855:     return self;
                    856: }
                    857: 
                    858: - setImageFileFrom: sender
                    859: {
                    860:     id openPanel = [OpenPanel new];
                    861:     const char *fileTypes[] = {"tiff", "eps", NULL};
                    862:     
                    863:     if ([openPanel runModalForTypes: fileTypes])
                    864:        {
                    865:                [self setImageFromFile: [openPanel filename]];
                    866:                NXWriteDefault([NXApp appName], "imageFile", [openPanel filename]);
                    867:     }
                    868: 
                    869:        [spaceView display];    //don't know why this is necessary...
                    870: 
                    871:     return self;
                    872: }
                    873: 
                    874: // This should return a float between 0 and 1
                    875: float frandom()
                    876: {
                    877:        float val = (random() & 0x7fffffff);
                    878:        val /= 0x7fffffff;
                    879:        return val;
                    880: }
                    881: 
                    882: float randBetween(float a, float b)
                    883: {
                    884:        float val, scale, t;
                    885: 
                    886:        if (a > b)
                    887:        {       t = a; a = b; b = t;
                    888:        }
                    889:        
                    890:        scale = (b-a);
                    891:        val = scale * frandom();
                    892:        return (a + val);
                    893: }
                    894: 
                    895: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.