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

1.1       root        1: //  ThinkMore.m
                      2: //
                      3: //  Contains additional methods used in the Thinker class.
                      4: //
                      5: //  You may freely copy, distribute, and reuse the code in this example.
                      6: //  NeXT disclaims any warranty of any kind, expressed or  implied, as to its
                      7: //  fitness for any particular use.
                      8: 
                      9: #import "Thinker.h"
                     10: #import "SpaceView.h"
                     11: #import "BackView.h"
                     12: #import "SleepView.h"
                     13: #import "BlackView.h"
                     14: #import "Password.h"
                     15: #import "psfuncts.h"
                     16: 
                     17: 
                     18: #import <appkit/appkit.h>
                     19: #import <objc/NXBundle.h>
                     20: 
                     21: 
                     22: #define VIEWDIRECTORY  "/LocalLibrary/BackSpaceViews"
                     23: 
                     24: static char *compiledViewNames[] = {
                     25:        "Space",
                     26:        "Boink",
                     27:        "Black",
                     28:        };
                     29: 
                     30: #define COMVIEWCOUNT   (sizeof(compiledViewNames)/sizeof(*compiledViewNames))
                     31: 
                     32: @implementation Thinker(thinkMore)
                     33: 
                     34: 
                     35: //must invoke this before creating window or setting up the views
                     36: - getViewType
                     37: {
                     38:        int i;
                     39:        id theMatrix;
                     40:        char buf[MAXPATHLEN];
                     41:        ModuleInfo *m;
                     42: 
                     43:        strcpy( buf, NXHomeDirectory());
                     44:        strcat( buf, "/Library/BackSpaceViews");
                     45: 
                     46:        moduleList = [[ModuleList alloc] init];
                     47: 
                     48:        [self loadViewsFrom:buf];
                     49:        [self loadViewsFrom: [self appDirectory]];
                     50:        [self loadViewsFrom: VIEWDIRECTORY];
                     51: 
                     52:        for (i = 0; i < COMVIEWCOUNT; i++)
                     53:        {
                     54:                m = [[ModuleInfo alloc] 
                     55:                        initWithView:nil name:compiledViewNames[i] path:NULL];
                     56:            [moduleList addObject: m];
                     57:        }
                     58: 
                     59:        [moduleList sort];
                     60:        [viewSelectionBrowser loadColumnZero];
                     61:        theMatrix = [viewSelectionBrowser matrixInColumn:0];
                     62:        [theMatrix selectCellAt:realViewIndex :0];
                     63:        [theMatrix scrollCellToVisible:realViewIndex :0];
                     64: 
                     65:        return self;
                     66: }
                     67: 
                     68: 
                     69: - selectRealViewIndex:sender
                     70: {
                     71:        //sender is the NXBrowser
                     72:        int index = [[viewSelectionBrowser matrixInColumn:0] selectedRow];
                     73: 
                     74:        if (index == realViewIndex) return self;
                     75:        if (index == -1)
                     76:        {
                     77:                id theMatrix = [viewSelectionBrowser matrixInColumn:0];
                     78:                [theMatrix selectCellAt:realViewIndex :0];
                     79:                [theMatrix scrollCellToVisible:realViewIndex :0];
                     80:                return self;
                     81:        }
                     82:        
                     83:        realViewIndex = index;
                     84:        [self setVirtualViewIndexAndIncrement:NO];
                     85:        
                     86:        return self;
                     87: }
                     88: 
                     89: 
                     90: // this method is the actual view setting mechanism,
                     91: // guaranteed to get called to set the view
                     92: 
                     93: - setVirtualViewIndexAndIncrement:(BOOL)flag
                     94: {
                     95:        id myView;
                     96:        id newInspector;
                     97:        
                     98:        if (realViewIndex)
                     99:        {
                    100:                virtualViewIndex = realViewIndex-1;
                    101:                [self selectScreenSaverViews];
                    102:        }
                    103: 
                    104:        else
                    105:        {
                    106:                if (flag)
                    107:                {
                    108:                        virtualViewIndex = random() % [moduleList count];
                    109:                        [self selectScreenSaverViews];
                    110:                        myView = [self backView];
                    111:                        
                    112:                        while ([myView respondsTo:@selector(isBoringScreenSaver)]
                    113:                                && [myView isBoringScreenSaver])
                    114:                        {
                    115:                                if (++virtualViewIndex >= [moduleList count])
                    116:                                        virtualViewIndex = 0;
                    117: 
                    118:                                [self selectScreenSaverViews];
                    119:                                myView = [self backView];
                    120:                        }
                    121:                }
                    122:                else [self selectScreenSaverViews];
                    123:        }
                    124: 
                    125: 
                    126:        //---------------------------------------------
                    127:        // now plug in the inspector
                    128:        //---------------------------------------------
                    129:        myView = [self backView];
                    130: 
                    131:        if ([myView respondsTo:@selector(inspector:)])
                    132:        {
                    133:                newInspector = [myView inspector:self];
                    134:                if (!newInspector) newInspector = [self nullInspector];
                    135:        }
                    136:        else newInspector = [self nullInspector];
                    137:        
                    138:        if (newInspector != currentInspector)
                    139:        {
                    140:                if ([oldInspectorOwner respondsTo:@selector(inspectorWillBeRemoved)])
                    141:                        [oldInspectorOwner inspectorWillBeRemoved];
                    142:                // either myView will be the inspector owner, or it won't care
                    143:                oldInspectorOwner = myView;
                    144:                
                    145:                // don't want it to resize the box.  Suboptimal technique...
                    146:                [newInspector setFrame:&inspectorFrame];
                    147: 
                    148:                [invisibleInspectorBox setContentView: newInspector];
                    149:                currentInspector = newInspector;
                    150: 
                    151:                if ([myView respondsTo:@selector(inspectorInstalled)])
                    152:                        [myView inspectorInstalled];
                    153: 
                    154:                [invisibleInspectorBox display];
                    155:        }
                    156: 
                    157:        return self;
                    158: }
                    159: 
                    160: 
                    161: - selectScreenSaverViews
                    162: {
                    163:        id theView, bigWindow;
                    164:        int myBacking;
                    165: 
                    166:        //need to order out big window if that's the type and buffering changed
                    167:        
                    168:        theView = [self backView];
                    169: 
                    170:        myBacking = [self backingTypeForView:theView];
                    171: 
                    172:        [self createBigWindowIfNecessaryForView:theView];
                    173: 
                    174:        if (myBacking == NX_BUFFERED) bigWindow = bigBufferedWindow;
                    175:        else bigWindow = bigUnbufferedWindow;
                    176: 
                    177:        if (windowType == BACKWINDOW)
                    178:        {
                    179:                if (spaceWindow != bigWindow)
                    180:                {
                    181:                        [spaceWindow orderOut:self];
                    182:                        [self useBackWindow:globalTier];
                    183:                }
                    184:        }
                    185: 
                    186:        spaceView = theView;
                    187:        [self installSpaceViewIntoWindow:spaceWindow];
                    188: 
                    189:        if ([spaceView respondsTo:@selector(setImage:)])
                    190:                [spaceView setImage: image];
                    191:        if ([spaceView respondsTo:@selector(newWindow)]) [spaceView newWindow];
                    192: 
                    193:        [self setWindowTitle];
                    194: 
                    195:        NXWriteDefault([NXApp appName], "viewType", (realViewIndex ? 
                    196:                        ([moduleList nameAt: realViewIndex-1]) : "All"));
                    197: 
                    198: 
                    199:        if (windowType) 
                    200:        {
                    201:                // the unbuffered window looks better if you just display
                    202:                // its contents, but for a buffered oneshot window, you must
                    203:                // display the window to make sure the window server window exists.
                    204: 
                    205:                if (myBacking == NX_BUFFERED) 
                    206:                        [spaceWindow display];
                    207:                else 
                    208:                {
                    209:                        [spaceView fillBoundsWithBlack];
                    210:                        [spaceView display];
                    211:                }
                    212:        }
                    213: 
                    214:        if (normalWindow && (windowType == NORMALWINDOW))
                    215:        {
                    216:                if (myBacking == NX_BUFFERED)
                    217:                        [normalWindow setBackingType:NX_BUFFERED];
                    218:                else[normalWindow setBackingType:NX_RETAINED];
                    219:        }
                    220: 
                    221:        return self;
                    222: }
                    223: 
                    224: - setWindowTitle
                    225: {
                    226:        if ([spaceView respondsTo:@selector(windowTitle)])
                    227:        {
                    228:                [normalWindow setTitle: NXLocalString([spaceView windowTitle],0,0)];
                    229:        }
                    230:        else [normalWindow setTitle: NXLocalString("BackSpace",0,0)];
                    231:        return self;
                    232: }
                    233: 
                    234: 
                    235: - getScreenLockerSetting
                    236: {
                    237:        const char *ptr;
                    238:        
                    239:        [screenLocker setState:0];
                    240:        
                    241:        ptr = NXGetDefaultValue([NXApp appName], "screenLocker");
                    242: 
                    243:        if (!ptr || !strcmp(ptr,"Off")) [self setScreenLocker:NO andRemember:NO];
                    244:        else [self setScreenLocker:YES andRemember:NO];
                    245:        
                    246:        return self;
                    247: }
                    248: 
                    249: - changeScreenLockerSetting:sender
                    250: {
                    251:        if (![password checkPassword:
                    252:                NXLocalString("Enter password to change screen lock setting:",0,0)
                    253:                randomPos:NO checkLock:NO withView:nil])
                    254:        {
                    255:                [screenLocker setState:[password isLocked]];
                    256:                return self;
                    257:        }
                    258: 
                    259:        if (![password validPassword] && ![password setPassword:self])
                    260:        {
                    261:                [screenLocker setState:[password isLocked]];
                    262:                return self;
                    263:        }
                    264:        
                    265:        [self setScreenLocker:([screenLocker state])andRemember:YES];
                    266:        return self;
                    267: }
                    268: 
                    269: - setScreenLocker:(BOOL)val andRemember:(BOOL)rem
                    270: {
                    271:        [screenLocker setState:val];
                    272:        [password setLock: val];
                    273: 
                    274:        if (rem)
                    275:        {       
                    276:                if (val) NXWriteDefault([NXApp appName], "screenLocker", "On");
                    277:                else NXRemoveDefault([NXApp appName], "screenLocker");
                    278:        }
                    279:        
                    280:        return self;
                    281: }
                    282: 
                    283: 
                    284: 
                    285: 
                    286: //---------------------------------------------------
                    287: //                     View manager routines   
                    288: //---------------------------------------------------
                    289: 
                    290: - backView
                    291: {
                    292:        NXRect aFrame = {{0,0},{200,200}};
                    293:        id theView;
                    294:        
                    295:        if (![moduleList viewAt:virtualViewIndex])
                    296:        {
                    297:                char path[MAXPATHLEN];
                    298:                id myClass;
                    299:                const char *name;
                    300:                char *filenames[] = {path, NULL};
                    301:                ModuleInfo *mp;
                    302:                struct mach_header *header;
                    303: 
                    304:                mp = [moduleList objectAt: virtualViewIndex];
                    305:                name = [mp viewName];
                    306: 
                    307:                // before I loaded all classes at launch time; now classes are
                    308:                // loaded only as needed.  This idea and some of the code here is
                    309:                // from bill bumgarner, thanx!
                    310: 
                    311:                if ([mp path])  // we have path but no instance, must load class
                    312:                {
                    313:                        long ret;
                    314:                        do
                    315:                        {
                    316:                                sprintf(path, "%s/%sView.BackO", [mp path], name);
                    317:                                ret = objc_loadModules(filenames, NULL, NULL, &header, NULL);
                    318: 
                    319:                                // objc_loadModules succeeds with a warning if the architecture of the
                    320:                                // object file is wrong, so we better check if we really got a class
                    321: 
                    322:                                if (!ret)       // load succeeded or was wrong architecture
                    323:                                {
                    324:                                        sprintf(path,"%sView", name);
                    325:                                        myClass = objc_getClass(path);
                    326:                                        if (!myClass) ret = -1;
                    327:                                }
                    328: 
                    329:                        } while (ret && [mp useNextPath]);
                    330: 
                    331:                        [mp discardAltPaths];
                    332: 
                    333:                        if (ret)
                    334:                        {
                    335:                                // Ugh, failed.  Will instantiate a BlackView instead...
                    336:                                NXRunAlertPanel([NXApp appName], NXLocalString(
                    337:                                        "Could not dynamically load class: %sView",0,0),
                    338:                                        NULL, NULL, NULL, name);
                    339:                                name = "Black";
                    340:                        }
                    341:                        else
                    342:                        {
                    343:                                [mp setHeader:header];
                    344:                        }
                    345:                }
                    346: 
                    347:                //at this point we must have a valid name for a loaded class
                    348:                
                    349:                sprintf(path,"%sView", name);
                    350:                myClass = objc_getClass(path);
                    351: 
                    352:                theView = [[myClass allocFromZone:backZone] initFrame:&aFrame];
                    353:                [[moduleList objectAt:virtualViewIndex] setView:theView];
                    354:        }
                    355: 
                    356:        theView = [moduleList viewAt:virtualViewIndex];
                    357:        
                    358:        return theView;
                    359: }
                    360: 
                    361: - showInfoPanel:sender
                    362: {
                    363:        if (!infoPanel)
                    364:        {
                    365:                if (![NXApp loadNibSection:"Info.nib" owner:self withNames:NO fromZone:[self zone]])
                    366:                        NXLogError ("Can't find Info.nib!");    
                    367:        }
                    368:        [infoPanel makeKeyAndOrderFront:sender];
                    369:        return self;
                    370: }
                    371: 
                    372: #define SLEEPSIZE (3.0)
                    373: 
                    374: - createSleepWindow
                    375: {
                    376:        if (!sleepWindow)
                    377:        {
                    378:                NXRect sleep={{0, 0},{SLEEPSIZE, SLEEPSIZE}};
                    379:                id aView = [[SleepView alloc] initFrame:&sleep];
                    380: 
                    381:                sleepWindow = [[Window alloc]
                    382:                        initContent:&sleep style:NX_TOKENSTYLE
                    383:                        backing:NX_NONRETAINED buttonMask:0 defer:NO];
                    384: 
                    385:                [sleepWindow setEventMask:(NX_MOUSEENTEREDMASK | NX_MOUSEEXITEDMASK)];
                    386:                PSsetwindowlevel(SLEEPTIER, [sleepWindow windowNum]);
                    387:                PSWmakeWindowGray([sleepWindow windowNum]);
                    388:                [[sleepWindow setContentView: aView] free];
                    389: 
                    390:                [sleepWindow setTrackingRect:&sleep inside:YES owner:aView
                    391:                        tag:3 left:NO right:NO];
                    392:        }
                    393: 
                    394:        return self;
                    395: }
                    396: 
                    397: - setSleepCorner:(int)val
                    398: {
                    399:        NXRect screen={{0, 0}};
                    400:        NXCoord x = 0.0, y = 0.0;
                    401: 
                    402:        if (val)
                    403:        {
                    404:                [NXApp getScreenSize:&(screen.size)];
                    405:                [self createSleepWindow];
                    406:                if (val == 2 || val == 3) x = screen.size.width - SLEEPSIZE;
                    407:                if (val == 3 || val == 4) y = screen.size.height - SLEEPSIZE;
                    408:                [sleepWindow moveTo:x :y];
                    409:                [sleepWindow orderFront:self];
                    410:        }
                    411:        else [sleepWindow orderOut:self];
                    412:        return self;
                    413: }
                    414: 
                    415: - getHotCornerSetting
                    416: {
                    417:        const char *ptr;
                    418:        int tval, val=0;
                    419:        
                    420:        ptr = NXGetDefaultValue([NXApp appName], "hotCorner");
                    421:        if (ptr)
                    422:        {
                    423:                sscanf(ptr,"%d",&tval);
                    424:                if (tval >= 0 && tval <= 4) val = tval;
                    425:        }
                    426:        
                    427:        [cornerView setState:val];
                    428:        [self setSleepCorner:val];
                    429: 
                    430:        return self;
                    431: }
                    432: 
                    433: 
                    434: @end

unix.superglobalmegacorp.com

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