Annotation of quake2/rhapsody/r_next.m, revision 1.1

1.1     ! root        1: 
        !             2: #import <AppKit/AppKit.h>
        !             3: #include "../ref_soft/r_local.h"
        !             4: 
        !             5: /*
        !             6: ====================================================================
        !             7: 
        !             8:  OPENSTEP specific stuff
        !             9: 
        !            10: ====================================================================
        !            11: */
        !            12: 
        !            13: @interface QuakeView : NSView
        !            14: @end
        !            15: 
        !            16: NSWindow       *vid_window_i;
        !            17: QuakeView      *vid_view_i;
        !            18: 
        !            19: unsigned       *buffernative;
        !            20: 
        !            21: //===========================================================
        !            22: 
        !            23: 
        !            24: int Draw_SetResolution (void);
        !            25: 
        !            26: #define        TYPE_FULLSCREEN 0
        !            27: #define        TYPE_WINDOWED   1
        !            28: #define        TYPE_STRETCHED  2
        !            29: 
        !            30: #define        NUM_RESOLUTIONS         7
        !            31: int    resolutions[NUM_RESOLUTIONS][2] = { 
        !            32:        {320,200}, {320,240}, {400,300}, {512,384}, {640,480}, {800,600}, {1024,768} };
        !            33: 
        !            34: qboolean       available[NUM_RESOLUTIONS][3];
        !            35: int                    mode_res = 0, mode_type = TYPE_WINDOWED;
        !            36: 
        !            37: byte           gammatable[256];        // palette is sent through this
        !            38: unsigned               current_palette[256];
        !            39: unsigned               gamma_palette[256];
        !            40: 
        !            41: int                    cursor_res, cursor_type;
        !            42: 
        !            43: cvar_t         *vid_x;
        !            44: cvar_t         *vid_y;
        !            45: cvar_t         *vid_mode;
        !            46: cvar_t         *vid_stretched;
        !            47: cvar_t         *vid_fullscreen;
        !            48: cvar_t         *draw_gamma;
        !            49: 
        !            50: void Draw_BuildGammaTable (void);
        !            51: 
        !            52: /*
        !            53: ====================================================================
        !            54: 
        !            55: MENU INTERACTION
        !            56: 
        !            57: ====================================================================
        !            58: */
        !            59: 
        !            60: void FindModes (void)
        !            61: {
        !            62:        if (mode_res < 0 || mode_res >= NUM_RESOLUTIONS)
        !            63:                mode_res = 0;
        !            64:        if (mode_type < 0 || mode_type > 3)
        !            65:                mode_type = 1;
        !            66: 
        !            67: }
        !            68: 
        !            69: void RM_Print (int x, int y, char *s)
        !            70: {
        !            71:        while (*s)
        !            72:        {
        !            73:                Draw_Char (x, y, (*s)+128);
        !            74:                s++;
        !            75:                x += 8;
        !            76:        }
        !            77: }
        !            78: 
        !            79: /*
        !            80: ================
        !            81: Draw_MenuDraw
        !            82: ================
        !            83: */
        !            84: void Draw_MenuDraw (void)
        !            85: {
        !            86:        int             i, j;
        !            87:        int             y;
        !            88:        char    string[32];
        !            89: 
        !            90:        Draw_Pic ( 4, 4, "vidmodes");
        !            91: 
        !            92:        RM_Print (80, 32, "fullscreen windowed stretched");
        !            93:        RM_Print (80, 40, "---------- -------- ---------");
        !            94:        y = 50;
        !            95: 
        !            96:        // draw background behind selected mode
        !            97:        Draw_Fill ( (mode_type+1)*80, y+(mode_res)*10, 40,10, 8);
        !            98: 
        !            99:        // draw available grid
        !           100:        for (i=0 ; i<NUM_RESOLUTIONS ; i++, y+= 10)
        !           101:        {
        !           102:                sprintf (string, "%ix%i", resolutions[i][0], resolutions[i][1]);
        !           103:                RM_Print (0, y, string);
        !           104:                for (j=0 ; j<3 ; j++)
        !           105:                        if (available[i][j])
        !           106:                                RM_Print ( 80 + j*80, y, "*");
        !           107:        }
        !           108: 
        !           109:        // draw the cursor
        !           110:        Draw_Char (80 + cursor_type*80, 50 + cursor_res*10, 128 + 12+((int)(r_newrefdef.time*4)&1));
        !           111: }
        !           112: 
        !           113: 
        !           114: #define        K_TAB                   9
        !           115: #define        K_ENTER                 13
        !           116: #define        K_ESCAPE                27
        !           117: #define        K_SPACE                 32
        !           118: 
        !           119: // normal keys should be passed as lowercased ascii
        !           120: 
        !           121: #define        K_BACKSPACE             127
        !           122: #define        K_UPARROW               128
        !           123: #define        K_DOWNARROW             129
        !           124: #define        K_LEFTARROW             130
        !           125: #define        K_RIGHTARROW    131
        !           126: 
        !           127: /*
        !           128: ================
        !           129: Draw_MenuKey
        !           130: ================
        !           131: */
        !           132: void Draw_MenuKey (int key)
        !           133: {
        !           134:        switch (key)
        !           135:        {
        !           136:        case K_LEFTARROW:
        !           137:                cursor_type--;
        !           138:                if (cursor_type < 0)
        !           139:                        cursor_type = 2;
        !           140:                break;
        !           141: 
        !           142:        case K_RIGHTARROW:
        !           143:                cursor_type++;
        !           144:                if (cursor_type > 2)
        !           145:                        cursor_type = 0;
        !           146:                break;
        !           147: 
        !           148:        case K_UPARROW:
        !           149:                cursor_res--;
        !           150:                if (cursor_res < 0)
        !           151:                        cursor_res = NUM_RESOLUTIONS-1;
        !           152:                break;
        !           153: 
        !           154:        case K_DOWNARROW:
        !           155:                cursor_res++;
        !           156:                if (cursor_res >= NUM_RESOLUTIONS)
        !           157:                        cursor_res = 0;
        !           158:                break;
        !           159: 
        !           160:        case K_ENTER:
        !           161:                ri.Cmd_ExecuteText (EXEC_NOW, va("vid_mode %i", cursor_res));
        !           162:                switch (cursor_type)
        !           163:                 {
        !           164:                     case TYPE_FULLSCREEN:
        !           165:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 1");
        !           166:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 0");
        !           167:                         break;
        !           168:                     case TYPE_WINDOWED:
        !           169:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 0");
        !           170:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 0");
        !           171:                         break;
        !           172:                     case TYPE_STRETCHED:
        !           173:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 0");
        !           174:                         ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 1");
        !           175:                         break;
        !           176:                }
        !           177:                     
        !           178:                mode_res = cursor_res;
        !           179:                mode_type = cursor_type;
        !           180:                Draw_SetResolution ();
        !           181:                break;
        !           182: 
        !           183:        default:
        !           184:                break;
        !           185:        }
        !           186: }
        !           187: 
        !           188: //===========================================================
        !           189: 
        !           190: 
        !           191: /*
        !           192: ================
        !           193: Draw_SetResolution
        !           194: 
        !           195: The vid structure will be filled in on return
        !           196: Also allocates the z buffer and surface cache
        !           197: ================
        !           198: */
        !           199: int Draw_SetResolution (void)
        !           200: {
        !           201:     NSRect     content;
        !           202:     
        !           203:        if (vid_mode->value < 0)
        !           204:                ri.Cmd_ExecuteText (EXEC_NOW, "vid_mode 0");
        !           205:        if (vid_mode->value >= NUM_RESOLUTIONS)
        !           206:                ri.Cmd_ExecuteText (EXEC_NOW, va("vid_mode %i", NUM_RESOLUTIONS-1));
        !           207: 
        !           208:        vid_mode->modified = false;
        !           209:         vid_fullscreen->modified = false;
        !           210:         vid_stretched->modified = false;
        !           211: 
        !           212:         // free nativebuffer
        !           213:         if (buffernative)
        !           214:         {
        !           215:             free (buffernative);
        !           216:             buffernative = NULL;
        !           217:         }
        !           218:         
        !           219:        // free z buffer
        !           220:        if (d_pzbuffer)
        !           221:        {
        !           222:                free (d_pzbuffer);
        !           223:                d_pzbuffer = NULL;
        !           224:        }
        !           225:        // free surface cache
        !           226:        if (sc_base)
        !           227:        {
        !           228:                D_FlushCaches ();
        !           229:                free (sc_base);
        !           230:                sc_base = NULL;
        !           231:        }
        !           232: 
        !           233:         vid.width = resolutions[(int)(vid_mode->value)][0];
        !           234:        vid.height = resolutions[(int)(vid_mode->value)][1];
        !           235: 
        !           236:        vid.win_width = vid.width;
        !           237:        vid.win_height = vid.height;
        !           238:        if (vid_stretched->value)
        !           239:        {
        !           240:                vid.win_width <<= 1;
        !           241:                vid.win_height <<= 1;
        !           242:        }
        !           243: 
        !           244:        vid.aspect = 1;
        !           245:        vid.buffer = malloc (vid.width*vid.height);
        !           246:        vid.rowbytes = vid.width;
        !           247:         d_pzbuffer = malloc(vid.width*vid.height*2);
        !           248:         buffernative = malloc(vid.width*vid.height*4);
        !           249: 
        !           250:        D_InitCaches ();
        !           251: 
        !           252:        Sys_SetPalette ((byte *)d_8to24table);
        !           253: 
        !           254:         if (vid_view_i)
        !           255:             [vid_view_i unlockFocus];
        !           256:         if (vid_window_i)
        !           257:             [vid_window_i close];
        !           258: //
        !           259: // open a window
        !           260: //
        !           261:         content = NSMakeRect (vid_x->value,vid_y->value,vid.win_width, vid.win_height);
        !           262:    vid_window_i = [[NSWindow alloc]
        !           263:                        initWithContentRect:    content
        !           264:                                  styleMask:    NSTitledWindowMask
        !           265:                                    backing:    NSBackingStoreRetained
        !           266:                                defer:  NO
        !           267:        ];
        !           268: 
        !           269:    [vid_window_i setDelegate: vid_window_i];
        !           270:    [vid_window_i display];
        !           271:    [NSApp activateIgnoringOtherApps: YES];
        !           272:    [vid_window_i makeKeyAndOrderFront: nil];
        !           273: 
        !           274: //   NSPing ();
        !           275: 
        !           276:    content.origin.x = content.origin.y = 0;
        !           277:    vid_view_i = [[QuakeView alloc] initWithFrame: content];
        !           278:    [vid_window_i setContentView: vid_view_i];
        !           279:    [vid_window_i makeFirstResponder: vid_view_i];
        !           280:    [vid_window_i setDelegate: vid_view_i];
        !           281: 
        !           282: //   [vid_window_i addToEventMask: NS_FLAGSCHANGEDMASK];
        !           283:    [vid_window_i setTitle: @"Bitmap Quake Console"];
        !           284:        [vid_window_i makeKeyAndOrderFront: nil];
        !           285:         
        !           286:    // leave focus locked forever
        !           287:    [vid_view_i lockFocus];
        !           288:    
        !           289:        ri.VID_SetSize (vid.width, vid.height);
        !           290: 
        !           291:        return 0;
        !           292: }
        !           293: 
        !           294: /*
        !           295: @@@@@@@@@@@@@@@@@@@@@
        !           296: Draw_Init
        !           297: 
        !           298: @@@@@@@@@@@@@@@@@@@@@
        !           299: */
        !           300: int Draw_Init (void *window)
        !           301: {
        !           302:     [NSApplication sharedApplication];
        !           303:        [NSApp finishLaunching];
        !           304:   
        !           305:        ri.Con_Printf (PRINT_ALL, "refresh version: "REF_VERSION"\n");
        !           306: 
        !           307:        vid_x = ri.Cvar_Get ("vid_x", "0", CVAR_ARCHIVE);
        !           308:        vid_y = ri.Cvar_Get ("vid_y", "0", CVAR_ARCHIVE);
        !           309:        vid_mode = ri.Cvar_Get ("vid_mode", "0", CVAR_ARCHIVE);
        !           310:         vid_fullscreen = ri.Cvar_Get ("vid_fullscreen", "0", CVAR_ARCHIVE);
        !           311:         vid_stretched = ri.Cvar_Get ("vid_stretched", "0", CVAR_ARCHIVE);
        !           312:        draw_gamma = ri.Cvar_Get ("gamma", "1", CVAR_ARCHIVE);
        !           313: 
        !           314:         Draw_GetPalette ();
        !           315: 
        !           316:        Draw_BuildGammaTable ();
        !           317: 
        !           318:        // get the lighting colormap
        !           319:        ri.FS_LoadFile ("gfx/colormap.lmp", (void **)&vid.colormap);
        !           320:        if (!vid.colormap)
        !           321:        {
        !           322:                ri.Con_Printf (PRINT_ALL, "ERROR: Couldn't load gfx/colormap.lmp");
        !           323:                return -1;
        !           324:        }
        !           325: 
        !           326:        Draw_SetResolution ();
        !           327: 
        !           328:        R_Init ();
        !           329: 
        !           330:        return 0;
        !           331: }
        !           332: 
        !           333: 
        !           334: /*
        !           335: @@@@@@@@@@@@@@@@@@@@@
        !           336: Draw_Shutdown
        !           337: 
        !           338: @@@@@@@@@@@@@@@@@@@@@
        !           339: */
        !           340: void Draw_Shutdown (void)
        !           341: {
        !           342:    R_Shutdown ();
        !           343: }
        !           344: 
        !           345: 
        !           346: /*
        !           347: @@@@@@@@@@@@@@@@@@@@@
        !           348: Draw_BuildGammaTable
        !           349: 
        !           350: @@@@@@@@@@@@@@@@@@@@@
        !           351: */
        !           352: void Draw_BuildGammaTable (void)
        !           353: {
        !           354:        int             i, inf;
        !           355:        float   g;
        !           356: 
        !           357:        draw_gamma->modified = false;
        !           358:        g = draw_gamma->value;
        !           359: 
        !           360:        if (g == 1.0)
        !           361:        {
        !           362:                for (i=0 ; i<256 ; i++)
        !           363:                        gammatable[i] = i;
        !           364:                return;
        !           365:        }
        !           366:        
        !           367:        for (i=0 ; i<256 ; i++)
        !           368:        {
        !           369:                inf = 255 * pow ( (i+0.5)/255.5 , g ) + 0.5;
        !           370:                if (inf < 0)
        !           371:                        inf = 0;
        !           372:                if (inf > 255)
        !           373:                        inf = 255;
        !           374:                gammatable[i] = inf;
        !           375:        }
        !           376: }
        !           377: 
        !           378: 
        !           379: /*
        !           380: @@@@@@@@@@@@@@@@@@@@@
        !           381: Draw_BeginFram
        !           382: 
        !           383: @@@@@@@@@@@@@@@@@@@@@
        !           384: */
        !           385: void Draw_BeginFrame (void)
        !           386: {
        !           387:        if (vid_mode->modified || vid_fullscreen->modified
        !           388:        || vid_stretched->modified)
        !           389:                Draw_SetResolution ();
        !           390: 
        !           391:        if (draw_gamma->modified)
        !           392:        {
        !           393:                Draw_BuildGammaTable ();
        !           394:                Sys_SetPalette ((byte *)current_palette);
        !           395:        }
        !           396: 
        !           397: //     MGL_beginDirectAccess();
        !           398: //     vid.buffer = mgldc->surface;
        !           399: //     vid.rowbytes = mgldc->mi.bytesPerLine;
        !           400: }
        !           401: 
        !           402: 
        !           403: /*
        !           404: @@@@@@@@@@@@@@@@@@@@@
        !           405: Draw_EndFrame
        !           406: 
        !           407: @@@@@@@@@@@@@@@@@@@@@
        !           408: */
        !           409: void Draw_EndFrame (void)
        !           410: {
        !           411:        int             i, c;
        !           412:        int             bps, spp, bpp, bpr;
        !           413:         unsigned char  *planes[5];
        !           414:         NSRect                 bounds;
        !           415: 
        !           416:        // translate to 24 bit color
        !           417:         c = vid.width*vid.height;
        !           418:        for (i=0 ; i<c ; i++)
        !           419:                buffernative[i] = gamma_palette[vid.buffer[i]];
        !           420:         
        !           421:      bps = 8;
        !           422:      spp = 3;
        !           423:      bpp = 32;
        !           424:      bpr = vid.width * 4;
        !           425:      planes[0] = (unsigned char *)buffernative;
        !           426: 
        !           427:     bounds = [vid_view_i bounds];
        !           428: 
        !           429:     NSDrawBitmap(
        !           430:                 bounds,
        !           431:                 vid.width,
        !           432:                 vid.height,
        !           433:                 bps,
        !           434:                 spp,
        !           435:                 bpp,
        !           436:                 bpr,
        !           437:                 NO,
        !           438:                 NO,
        !           439:                  @"NSDeviceRGBColorSpace",
        !           440:                 planes
        !           441:                 );
        !           442: }
        !           443: 
        !           444: 
        !           445: //===============================================================================
        !           446: 
        !           447: #define        HUNK_MAGIC      0xffaffaff
        !           448: typedef struct
        !           449: {
        !           450:     int                magic;
        !           451:     int                length;
        !           452:     int                pad[6];
        !           453: } hunkheader_t;
        !           454: 
        !           455: hunkheader_t   *membase;
        !           456: int            maxsize;
        !           457: int            cursize;
        !           458: 
        !           459: void *Hunk_Begin (void)
        !           460: {
        !           461:     kern_return_t      r;
        !           462: 
        !           463: // reserve a huge chunk of memory, but don't commit any yet
        !           464:     maxsize = 16*1024*1024;
        !           465:     cursize = 0;
        !           466:     membase = NULL;
        !           467:     r = vm_allocate(task_self(), (vm_address_t *)&membase, maxsize, 1);
        !           468:     if (!membase || r != KERN_SUCCESS)
        !           469:             ri.Sys_Error (ERR_FATAL,"vm_allocate failed");
        !           470:     membase->magic = HUNK_MAGIC;
        !           471:     membase->length = maxsize;
        !           472:     cursize = 32;
        !           473:     return (void *)((byte *)membase + cursize);
        !           474: }
        !           475: 
        !           476: void *Hunk_Alloc (int size)
        !           477: {
        !           478:        // round to cacheline
        !           479:        size = (size+31)&~31;
        !           480:        
        !           481:        cursize += size;
        !           482: 
        !           483:         if (cursize > maxsize)
        !           484:             ri.Sys_Error (ERR_DROP, "Hunk_Alloc overflow");
        !           485: 
        !           486:         memset ((byte *)membase+cursize-size,0,size);
        !           487: 
        !           488:         return (void *)((byte *)membase+cursize-size);
        !           489: }
        !           490: 
        !           491: int Hunk_End (void)
        !           492: {
        !           493:     kern_return_t      r;
        !           494:     
        !           495:     // round to pagesize
        !           496:     cursize = (cursize+vm_page_size)&~(vm_page_size-1);
        !           497:     membase->length = cursize;
        !           498:     r = vm_deallocate(task_self(),
        !           499:                   (vm_address_t)((byte *)membase + cursize),
        !           500:                   maxsize - cursize);
        !           501:     if ( r != KERN_SUCCESS )
        !           502:         ri.Sys_Error (ERR_DROP, "vm_deallocate failed");
        !           503:     return cursize;
        !           504: }
        !           505: 
        !           506: void Hunk_Free (void *base)
        !           507: {
        !           508:     hunkheader_t       *h;
        !           509:     kern_return_t      r;
        !           510:     
        !           511:     h = ((hunkheader_t *)base) - 1;
        !           512:     if (h->magic != HUNK_MAGIC)
        !           513:         ri.Sys_Error (ERR_FATAL, "Hunk_Free: bad magic");
        !           514: 
        !           515:     r = vm_deallocate(task_self(), (vm_address_t)h, h->length);
        !           516:     if ( r != KERN_SUCCESS )
        !           517:         ri.Sys_Error (ERR_DROP, "vm_deallocate failed");
        !           518: }
        !           519: 
        !           520: 
        !           521: /*
        !           522: ================
        !           523: Sys_MakeCodeWriteable
        !           524: ================
        !           525: */
        !           526: void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
        !           527: {
        !           528: }
        !           529: 
        !           530: 
        !           531: /*
        !           532: ================
        !           533: Sys_SetPalette
        !           534: ================
        !           535: */
        !           536: void Sys_SetPalette (byte *palette)
        !           537: {
        !           538:        byte    *p;
        !           539:        int             i;
        !           540: 
        !           541:         memcpy (current_palette, palette, sizeof(current_palette));
        !           542:         p = (byte *)gamma_palette;
        !           543:        // gamma correct and byte swap
        !           544:        for (i=0 ; i<256 ; i++, p+=4, palette+=4)
        !           545:        {
        !           546:                p[0] = gammatable[palette[0]];
        !           547:                p[1] = gammatable[palette[1]];
        !           548:                p[2] = gammatable[palette[2]];
        !           549:                 p[3] = 0xff;
        !           550:        }
        !           551: 
        !           552: }
        !           553: 
        !           554: 
        !           555: /*
        !           556:  ==========================================================================
        !           557: 
        !           558:  NEXTSTEP VIEW CLASS
        !           559: 
        !           560:  ==========================================================================
        !           561:  */
        !           562: #include "../client/keys.h"
        !           563: 
        !           564: void IN_ActivateMouse (void);
        !           565: void IN_DeactivateMouse (void);
        !           566: 
        !           567: @implementation QuakeView
        !           568: 
        !           569: -(BOOL) acceptsFirstResponder
        !           570: {
        !           571:     return YES;
        !           572: }
        !           573: 
        !           574: - (void)windowDidMove: (NSNotification *)note
        !           575: {
        !           576:     NSRect     r;
        !           577: 
        !           578:     r = [vid_window_i frame];
        !           579:     ri.Cmd_ExecuteText (EXEC_NOW, va("vid_x %i", (int)r.origin.x+1));
        !           580:     ri.Cmd_ExecuteText (EXEC_NOW, va("vid_y %i", (int)r.origin.y+1));    
        !           581: }
        !           582: 
        !           583: - (void)becomeKeyWindow
        !           584: {
        !           585:     IN_ActivateMouse ();
        !           586: }
        !           587: 
        !           588: - (void)resignKeyWindow
        !           589: {
        !           590:     IN_DeactivateMouse ();
        !           591: }
        !           592: 
        !           593: 
        !           594: typedef struct
        !           595: {
        !           596:     int                source, dest;
        !           597: } keymap_t;
        !           598: 
        !           599: keymap_t keymaps[] =
        !           600: {
        !           601:     {103, K_RIGHTARROW},
        !           602:     {102, K_LEFTARROW},
        !           603:     {100, K_UPARROW},
        !           604:     {101, K_DOWNARROW},
        !           605: 
        !           606:     {59, K_F1},
        !           607:     {60, K_F2},
        !           608:     {61, K_F3},
        !           609:     {62, K_F4},
        !           610:     {63, K_F5},
        !           611:     {64, K_F6},
        !           612:     {65, K_F7},
        !           613:     {66, K_F8},
        !           614:     {67, K_F9},
        !           615:     {68, K_F10},
        !           616:     {87, K_F11},
        !           617:     {88, K_F12},
        !           618: 
        !           619:     {-1,-1}
        !           620: };
        !           621: 
        !           622: keymap_t flagmaps[] =
        !           623: {
        !           624:     {NSShiftKeyMask, K_SHIFT},
        !           625:     {NSControlKeyMask, K_CTRL},
        !           626:     {NSAlternateKeyMask, K_ALT},
        !           627:     {NSCommandKeyMask, K_ALT},
        !           628: 
        !           629:     {-1,-1}
        !           630: };
        !           631: 
        !           632: - (void)mouseDown:(NSEvent *)theEvent
        !           633: {
        !           634:     Key_Event (K_MOUSE1, true);
        !           635: }
        !           636: - (void)mouseUp:(NSEvent *)theEvent
        !           637: {
        !           638:     Key_Event (K_MOUSE1, false);
        !           639: }
        !           640: - (void)rightMouseDown:(NSEvent *)theEvent
        !           641: {
        !           642:     Key_Event (K_MOUSE2, true);
        !           643: }
        !           644: - (void)rightMouseUp:(NSEvent *)theEvent
        !           645: {
        !           646:     Key_Event (K_MOUSE2, false);
        !           647: }
        !           648: 
        !           649: 
        !           650: /*
        !           651:  ===================
        !           652:  keyboard methods
        !           653:  ===================
        !           654:  */
        !           655: - (void)keyDown:(NSEvent *)theEvent
        !           656: {
        !           657:     int        ch;
        !           658:     keymap_t   *km;
        !           659: 
        !           660: //    PSobscurecursor ();
        !           661: 
        !           662: // check for non-ascii first
        !           663:     ch = [theEvent keyCode];
        !           664:     for (km=keymaps;km->source!=-1;km++)
        !           665:         if (ch == km->source)
        !           666:         {
        !           667:             Key_Event (km->dest, true);
        !           668:             return;
        !           669:         }
        !           670: 
        !           671:             ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
        !           672:     if (ch >= 'A' && ch <= 'Z')
        !           673:         ch += 'a' - 'A';
        !           674:     if (ch>=256)
        !           675:         return;
        !           676: 
        !           677:     Key_Event (ch, true);
        !           678: }
        !           679: 
        !           680: - (void)flagsChanged:(NSEvent *)theEvent
        !           681: {
        !           682:     static int oldflags;
        !           683:     int                newflags;
        !           684:     int                delta;
        !           685:     keymap_t   *km;
        !           686:     int                i;
        !           687: 
        !           688: //    PSobscurecursor ();
        !           689:     newflags = [theEvent modifierFlags];
        !           690:     delta = newflags ^ oldflags;
        !           691:     for (i=0 ; i<32 ; i++)
        !           692:     {
        !           693:         if ( !(delta & (1<<i)))
        !           694:             continue;
        !           695:         // changed
        !           696:         for (km=flagmaps;km->source!=-1;km++)
        !           697:             if ( (1<<i) == km->source)
        !           698:             {
        !           699:                 if (newflags & (1<<i))
        !           700:                     Key_Event (km->dest, true);
        !           701:                 else
        !           702:                     Key_Event (km->dest, false);
        !           703:             }
        !           704: 
        !           705:     }
        !           706: 
        !           707:         oldflags = newflags;
        !           708: }
        !           709: 
        !           710: 
        !           711: - (void)keyUp:(NSEvent *)theEvent
        !           712: {
        !           713:     int        ch;
        !           714:     keymap_t   *km;
        !           715: 
        !           716:  // check for non-ascii first
        !           717:     ch = [theEvent keyCode];
        !           718:     for (km=keymaps;km->source!=-1;km++)
        !           719:         if (ch == km->source)
        !           720:         {
        !           721:             Key_Event (km->dest, false);
        !           722:             return;
        !           723:         }
        !           724: 
        !           725:             ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
        !           726:     if (ch >= 'A' && ch <= 'Z')
        !           727:         ch += 'a' - 'A';
        !           728:     if (ch>=256)
        !           729:         return;
        !           730:     Key_Event (ch, false);
        !           731: }
        !           732: 
        !           733: @end
        !           734: 
        !           735: 

unix.superglobalmegacorp.com

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