Annotation of uae/xwin.c, revision 1.1.1.1

1.1       root        1:  /* 
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   * 
                      4:   * X interface
                      5:   * 
                      6:   * Copyright 1995, 1996 Bernd Schmidt
                      7:   * Copyright 1996 Ed Hanway, Andre Beck
                      8:   */
                      9: 
                     10: #include <stdio.h>
                     11: #include <stdlib.h>
                     12: #include <string.h>
                     13: #include <sys/time.h>
                     14: #include <X11/Xlib.h>
                     15: #include <X11/Xutil.h>
                     16: #include <X11/keysym.h>
                     17: #include <X11/cursorfont.h>
                     18: 
                     19: #ifndef DONT_WANT_SHM
                     20: #include <sys/ipc.h>
                     21: #include <sys/shm.h>
                     22: #include <X11/extensions/XShm.h>
                     23: #endif
                     24: 
                     25: #include "config.h"
                     26: #include "amiga.h"
                     27: #include "options.h"
                     28: #include "memory.h"
                     29: #include "custom.h"
                     30: #include "newcpu.h"
                     31: #include "xwin.h"
                     32: #include "keyboard.h"
                     33: #include "keybuf.h"
                     34: 
                     35: #ifdef LINUX_SVGALIB
                     36: #error Compiling xwin.c, but LINUX_SVGALIB set. Re-edit "config.h".
                     37: #endif
                     38: 
                     39: static Display *display;
                     40: static int screen;
                     41: static Window rootwin, mywin;
                     42: 
                     43: static GC whitegc,blackgc;
                     44: static XColor black,white;
                     45: static Colormap cmap;
                     46: 
                     47: static XImage *img;
                     48: static Visual *vis;
                     49: static XVisualInfo visualInfo;
                     50: static int bitdepth;
                     51: #ifndef DONT_WANT_SHM
                     52: static XShmSegmentInfo shminfo;
                     53: #endif
                     54: static Cursor blankCursor, xhairCursor;
                     55: static bool cursorOn;
                     56:  
                     57: #ifdef DONT_WANT_SHM
                     58: static char pixel_buffer[3200];
                     59: #endif
                     60: static char *xlinestart;
                     61: char *xlinebuffer;
                     62: long int xcolors[4096];
                     63: 
                     64:  /* Keyboard and mouse */
                     65: 
                     66: static bool keystate[256];
                     67: 
                     68: bool buttonstate[3];
                     69: int lastmx, lastmy;
                     70: bool newmousecounters;
                     71: static bool inwindow;
                     72: const long int eventmask = (KeyPressMask|KeyReleaseMask|ButtonPressMask
                     73:                            |ButtonReleaseMask|PointerMotionMask
                     74:                            |FocusChangeMask|EnterWindowMask
                     75:                            |LeaveWindowMask);
                     76: 
                     77: static bool next_line_double;
                     78: static int next_line_pos = 0;
                     79: 
                     80: void flush_screen (void)
                     81: {
                     82: #ifndef DONT_WANT_SHM
                     83:     if (next_line_pos > 0) {   
                     84:        XShmPutImage(display, mywin, blackgc, img, 0, 0, 0, 0, 796, next_line_pos, 0);
                     85:        XSync(display, 0);
                     86:        next_line_pos = 0;
                     87:     }
                     88: #endif
                     89: }
                     90: 
                     91: void prepare_line (int y, bool need_double)
                     92: {
                     93:     next_line_double = need_double;
                     94:     next_line_pos = y;
                     95:     
                     96: #ifdef DONT_WANT_SHM
                     97:     xlinebuffer = pixel_buffer;
                     98: #else
                     99:     xlinestart = xlinebuffer = img->data + y * img->bytes_per_line;
                    100: #endif
                    101: }
                    102: 
                    103: void flush_line(void)
                    104: {
                    105: #ifdef DONT_WANT_SHM
                    106:     XPutImage(display, mywin, blackgc, img, 0, 0, 0, next_line_pos, 796, 1);
                    107:     if (next_line_double)
                    108:        XPutImage(display, mywin, blackgc, img, 0, 0, 0, next_line_pos+1, 796, 1);
                    109: #else
                    110:     if (use_fast_draw && next_line_double) {   
                    111:        memcpy (xlinestart + img->bytes_per_line, xlinestart, img->bytes_per_line);
                    112:        next_line_pos++; /* For flush_screen(). */
                    113:     }
                    114: #endif
                    115: }
                    116: 
                    117: #ifndef INLINE_DRAWPIXEL
                    118: void (*DrawPixel)(int, xcolnr);
                    119: 
                    120: static void DrawPixel16(int x, xcolnr col)
                    121: {
                    122:     *(short *)xlinebuffer = col;
                    123:     xlinebuffer += 2;
                    124: }
                    125: 
                    126: static void DrawPixel32(int x, xcolnr col)
                    127: {
                    128:     *(long *)xlinebuffer = col;
                    129:     xlinebuffer += 4;
                    130: }
                    131: 
                    132: static void DrawPixel8(int x, xcolnr col)
                    133: {
                    134:     *(char *)xlinebuffer = col;
                    135:     xlinebuffer += 1;
                    136: }
                    137: 
                    138: static void DrawPixelGeneric(int x, xcolnr col)
                    139: {
                    140: #ifdef DONT_WANT_SHM
                    141:     XPutPixel(img, x, 0, col);
                    142: #else
                    143:     XPutPixel(img, x, next_line_pos, col);
                    144:     if (next_line_double) {
                    145:        XPutPixel(img, x, next_line_pos+1, col);
                    146:     }
                    147: #endif
                    148: }
                    149: #endif /* INLINE_DRAWPIXEL */
                    150: 
                    151: #ifndef DONT_WANT_SHM
                    152: static void initShm(int depth)
                    153: {
                    154:     int scale = dont_want_aspect ? 1 : 2;
                    155:     img = XShmCreateImage(display, vis, depth,
                    156:                          ZPixmap, 0, &shminfo, 800, (313-29) * scale);
                    157:     
                    158:     shminfo.shmid = shmget(IPC_PRIVATE, 512*1024*scale, IPC_CREAT|0777);
                    159:     shminfo.shmaddr = img->data = (char *)shmat(shminfo.shmid, 0, 0);
                    160:     shminfo.readOnly = False;
                    161:     /* let the xserver attach */
                    162:     XShmAttach(display, &shminfo);
                    163:     /* NOW ! */
                    164:     XSync(display,0);
                    165:     /* now deleting means making it temporary */
                    166:     shmctl(shminfo.shmid, IPC_RMID, 0);
                    167:     
                    168:     xlinestart = xlinebuffer = img->data;
                    169: }
                    170: #endif
                    171: 
                    172: static __inline__ int bitsInMask(unsigned long mask)
                    173: {
                    174:     /* count bits in mask */
                    175:     int n = 0;
                    176:     while(mask) {
                    177:        n += mask&1;
                    178:        mask >>= 1;
                    179:     }
                    180:     return n;
                    181: }
                    182: 
                    183: static __inline__ int maskShift(unsigned long mask)
                    184: {
                    185:     /* determine how far mask is shifted */
                    186:     int n = 0;
                    187:     while(!(mask&1)) {
                    188:        n++;
                    189:        mask >>= 1;
                    190:     }
                    191:     return n;
                    192: }
                    193: 
                    194: static __inline__ unsigned long doMask(int p, int bits, int shift)
                    195: {
                    196:     /* p is a value from 0 to 15 (Amiga color value)
                    197:      * scale to 0..255, shift to align msb with mask, and apply mask */
                    198: 
                    199:     unsigned long val = p * 0x11111111UL;
                    200:     val >>= (32 - bits);
                    201:     val <<= shift;
                    202: 
                    203:     return val;
                    204: }
                    205: 
                    206: static void InitXColors(void)
                    207: {
                    208: #ifdef INLINE_DRAWPIXEL
                    209: 
                    210: #ifdef X_8BIT_SCREEN
                    211:     if (visualInfo.depth != 8) {       
                    212:        fprintf(stderr, "Unsupported bit depth (%d)\n", visualInfo.depth);
                    213:        exit(1);
                    214:     }
                    215: #endif
                    216: 
                    217: #ifdef X_16BIT_SCREEN
                    218:     if (visualInfo.depth != 12 && visualInfo.depth != 16) {
                    219:        fprintf(stderr, "Unsupported bit depth (%d)\n", visualInfo.depth);
                    220:        exit(1);
                    221:     }
                    222: #endif
                    223: 
                    224: #else /* not INLINE_DRAWPIXEL */
                    225:     DrawPixel = DrawPixelGeneric;
                    226: 
                    227:     if(use_fast_draw) {
                    228:        /* this is probably a lot faster but makes nonportable assumptions
                    229:         * about image format */
                    230:        
                    231:        switch(visualInfo.depth) {
                    232:         case 12:
                    233:            DrawPixel = DrawPixel16;
                    234:            break;
                    235:            
                    236:         case 24:
                    237:            DrawPixel = DrawPixel32;
                    238:            break;
                    239: 
                    240:         case 16:
                    241:            DrawPixel = DrawPixel16;
                    242:            break;
                    243: 
                    244:         case 8:
                    245:            DrawPixel = DrawPixel8;
                    246:            break;
                    247: 
                    248:         default:
                    249:            fprintf(stderr, "Unsupported bit depth (%d)\n", visualInfo.depth);
                    250:            exit(1);
                    251:        }
                    252:     }
                    253: #endif /* not INLINE_DRAWPIXEL */
                    254:     
                    255: #ifdef __cplusplus
                    256:     switch(visualInfo.c_class) {
                    257: #else
                    258:     switch(visualInfo.class) {
                    259: #endif
                    260:      case TrueColor: 
                    261:        {           
                    262:            int red_bits = bitsInMask(visualInfo.red_mask);
                    263:            int green_bits = bitsInMask(visualInfo.green_mask);
                    264:            int blue_bits = bitsInMask(visualInfo.blue_mask);
                    265:            int red_shift = maskShift(visualInfo.red_mask);
                    266:            int green_shift = maskShift(visualInfo.green_mask);
                    267:            int blue_shift = maskShift(visualInfo.blue_mask);
                    268:            
                    269:            int i;
                    270:            for(i = 0; i < 4096; i++) {
                    271:                int r = i >> 8;
                    272:                int g = (i >> 4) & 0xF;
                    273:                int b = i & 0xF;
                    274:                xcolors[i] = (doMask(r, red_bits, red_shift) 
                    275:                              | doMask(g, green_bits, green_shift) 
                    276:                              | doMask(b, blue_bits, blue_shift));
                    277:            }
                    278:        }
                    279:        break;
                    280: 
                    281:      case GrayScale:
                    282:      case PseudoColor:
                    283:        {
                    284:            /* This is kind of kludgy...
                    285:             * Try to allocate as many different colors as possible. */
                    286:            int col;
                    287:            int step = 16;
                    288:            int allocated[4096];
                    289:            memset(allocated,0,sizeof allocated);
                    290:            
                    291:            while ((step/=2) > 0) {
                    292:                int r, g, b;
                    293:                for(r=0; r<16; r += step) {
                    294:                    for(g=0; g<16; g += step) {
                    295:                        for(b=0; b<16; b += step) {
                    296:                            int cnr = (r << 8) + (g << 4) + b;
                    297:                            if (!allocated[cnr]) {
                    298:                                XColor col;
                    299:                                char str[10];
                    300:                                sprintf(str, "rgb:%x/%x/%x", r,g,b);
                    301:                                XParseColor(display,cmap,str,&col);
                    302:                                if (XAllocColor(display,cmap,&col)) {                       
                    303:                                    allocated[cnr] = true;
                    304:                                    xcolors[cnr] = col.pixel;
                    305:                                } 
                    306:                            }
                    307:                        }
                    308:                    }
                    309:                }
                    310:            }
                    311: 
                    312:            for(col = 0; col < 4096; col++) {
                    313:                int cnr = col;
                    314:                if (!allocated[cnr]) {
                    315:                    int r = cnr >> 8;
                    316:                    int g = (cnr >> 4) & 0xF;
                    317:                    int b = cnr & 0xF;
                    318:                    int maxd = 4096,best = 0;
                    319:                    int c2;
                    320:                    for(c2 = 0; c2 < 4096; c2++)
                    321:                        if (allocated[c2]) {
                    322:                            int r2 = c2 >> 8;
                    323:                            int g2 = (c2 >> 4) & 0xF;
                    324:                            int b2 = c2 & 0xF;
                    325:                            int dist = abs(r2-r)*2 + abs(g2-g)*3 + abs(b2-b);
                    326:                            if (dist < maxd) {
                    327:                                maxd = dist;
                    328:                                best = c2;
                    329:                            }
                    330:                        }
                    331:                    cnr = best;
                    332:                }
                    333:                xcolors[col] = xcolors[cnr];
                    334:                
                    335:            }
                    336:        }
                    337:        break;
                    338:        
                    339:      default:
                    340: #ifdef __cplusplus
                    341:        fprintf(stderr, "Unsupported class (%d)\n", visualInfo.c_class);
                    342: #else
                    343:        fprintf(stderr, "Unsupported class (%d)\n", visualInfo.class);
                    344: #endif
                    345:        exit(1);
                    346:     }
                    347: }
                    348: 
                    349: void graphics_init(void)
                    350: {
                    351:     int i;
                    352:     char *display_name = 0;
                    353:     XSetWindowAttributes wattr;
                    354:     int vscale = dont_want_aspect ? 1 : 2;
                    355: 
                    356:     display = XOpenDisplay(display_name);
                    357:     if (display == 0)  {
                    358:        fprintf(stderr, "Can't connect to X server %s\n", XDisplayName(display_name));
                    359:        exit(-1);
                    360:     }
                    361:     screen = XDefaultScreen(display);
                    362:     rootwin = XRootWindow(display,screen);
                    363: 
                    364:     /* try for a 12 bit visual first, then a 16 bit, then a 24 bit, then 8 bit */
                    365:     if (XMatchVisualInfo(display, screen, 12, TrueColor, &visualInfo)) {
                    366:     } else if (XMatchVisualInfo(display, screen, 16, TrueColor, &visualInfo)) {
                    367:     } else if (XMatchVisualInfo(display, screen, 24, TrueColor, &visualInfo)) {
                    368:     } else if (XMatchVisualInfo(display, screen, 8, PseudoColor, &visualInfo)) {
                    369:       /* for our HP boxes */
                    370:     } else if (XMatchVisualInfo(display, screen, 8, GrayScale, &visualInfo)) {
                    371:     } else {
                    372:        fprintf(stderr, "Can't obtain appropriate X visual\n");
                    373:        exit(1);
                    374:     }
                    375: 
                    376:     vis = visualInfo.visual;
                    377:     bitdepth = visualInfo.depth;
                    378: 
                    379:     fprintf(stderr, "Using %d bit visual\n", bitdepth);
                    380: 
                    381:     cmap = XCreateColormap(display, rootwin, vis, AllocNone);
                    382:     XParseColor(display, cmap, "#000000", &black);
                    383:     if (!XAllocColor(display, cmap, &black))
                    384:        fprintf(stderr, "Whoops??\n");
                    385:     XParseColor(display, cmap, "#ffffff", &white);
                    386:     if (!XAllocColor(display, cmap, &white))
                    387:        fprintf(stderr, "Whoops??\n");
                    388: 
                    389:     wattr.event_mask = eventmask;
                    390:     wattr.background_pixel = black.pixel;
                    391:     wattr.backing_store = Always;
                    392:     wattr.backing_planes = bitdepth;
                    393:     wattr.border_pixmap = None;
                    394:     wattr.border_pixel = black.pixel;
                    395:     wattr.colormap = cmap;
                    396: 
                    397:     mywin = XCreateWindow(display,rootwin,0,0,796,vscale*(313-29),0,
                    398:                          bitdepth, InputOutput, vis,
                    399:                          CWEventMask|CWBackPixel|CWBorderPixel|CWBackingStore
                    400:                          |CWBackingPlanes|CWColormap,
                    401:                          &wattr);
                    402:     XMapWindow(display,mywin);
                    403:     
                    404:     blankCursor = XCreatePixmapCursor(display,
                    405:                                      XCreatePixmap(display, mywin, 1, 1, 1),
                    406:                                      XCreatePixmap(display, mywin, 1, 1, 1), 
                    407:                                      &black, &white, 0, 0);
                    408:     xhairCursor = XCreateFontCursor(display, XC_crosshair);
                    409: 
                    410:     whitegc = XCreateGC(display,mywin,0,0);
                    411:     blackgc = XCreateGC(display,mywin,0,0);
                    412:     
                    413:     XSetForeground(display,blackgc,black.pixel);
                    414:     XSetForeground(display,whitegc,white.pixel);
                    415: 
                    416: #ifdef DONT_WANT_SHM
                    417:     img = XCreateImage(display, vis, bitdepth, ZPixmap, 0, pixel_buffer, 800, 
                    418:                       1, 32, 0);
                    419: #else
                    420:     initShm (bitdepth);
                    421: #endif
                    422:     InitXColors();
                    423:     buttonstate[0] = buttonstate[1] = buttonstate[2] = false;
                    424:     for(i=0; i<256; i++) keystate[i] = false;
                    425:     
                    426:     lastmx = lastmy = 0; newmousecounters = false; inwindow = false;
                    427:        XDefineCursor(display, mywin, xhairCursor);
                    428:        cursorOn = true;
                    429: }
                    430: 
                    431: void graphics_leave(void)
                    432: {
                    433:     XAutoRepeatOn(display);
                    434: }
                    435: 
                    436: /* Decode KeySyms. This function knows about all keys that are common 
                    437:  * between different keyboard languages. */
                    438: static int kc_decode (KeySym ks)
                    439: {
                    440:     switch (ks) {      
                    441:      case XK_A: case XK_a: return AK_A;
                    442:      case XK_B: case XK_b: return AK_B;
                    443:      case XK_C: case XK_c: return AK_C;
                    444:      case XK_D: case XK_d: return AK_D;
                    445:      case XK_E: case XK_e: return AK_E;
                    446:      case XK_F: case XK_f: return AK_F;
                    447:      case XK_G: case XK_g: return AK_G;
                    448:      case XK_H: case XK_h: return AK_H;
                    449:      case XK_I: case XK_i: return AK_I;
                    450:      case XK_J: case XK_j: return AK_J;
                    451:      case XK_K: case XK_k: return AK_K;
                    452:      case XK_L: case XK_l: return AK_L;
                    453:      case XK_M: case XK_m: return AK_M;
                    454:      case XK_N: case XK_n: return AK_N;
                    455:      case XK_O: case XK_o: return AK_O;
                    456:      case XK_P: case XK_p: return AK_P;
                    457:      case XK_Q: case XK_q: return AK_Q;
                    458:      case XK_R: case XK_r: return AK_R;
                    459:      case XK_S: case XK_s: return AK_S;
                    460:      case XK_T: case XK_t: return AK_T;
                    461:      case XK_U: case XK_u: return AK_U;
                    462:      case XK_V: case XK_v: return AK_V;
                    463:      case XK_W: case XK_w: return AK_W;
                    464:      case XK_X: case XK_x: return AK_X;
                    465:        
                    466:      case XK_0: return AK_0;
                    467:      case XK_1: return AK_1;
                    468:      case XK_2: return AK_2;
                    469:      case XK_3: return AK_3;
                    470:      case XK_4: return AK_4;
                    471:      case XK_5: return AK_5;
                    472:      case XK_6: return AK_6;
                    473:      case XK_7: return AK_7;
                    474:      case XK_8: return AK_8;
                    475:      case XK_9: return AK_9;
                    476:        
                    477:      case XK_KP_0: return AK_NP0;
                    478:      case XK_KP_1: return AK_NP1;
                    479:      case XK_KP_2: return AK_NP2;
                    480:      case XK_KP_3: return AK_NP3;
                    481:      case XK_KP_4: return AK_NP4;
                    482:      case XK_KP_5: return AK_NP5;
                    483:      case XK_KP_6: return AK_NP6;
                    484:      case XK_KP_7: return AK_NP7;
                    485:      case XK_KP_8: return AK_NP8;
                    486:      case XK_KP_9: return AK_NP9;
                    487:        
                    488:      case XK_F1: return AK_F1;
                    489:      case XK_F2: return AK_F2;
                    490:      case XK_F3: return AK_F3;
                    491:      case XK_F4: return AK_F4;
                    492:      case XK_F5: return AK_F5;
                    493:      case XK_F6: return AK_F6;
                    494:      case XK_F7: return AK_F7;
                    495:      case XK_F8: return AK_F8;
                    496:      case XK_F9: return AK_F9;
                    497:      case XK_F10: return AK_F10;
                    498:            
                    499:      case XK_BackSpace: case XK_Delete: return AK_BS;
                    500:      case XK_Control_L: return AK_CTRL;
                    501:      case XK_Tab: return AK_TAB;
                    502:      case XK_Alt_L: case XK_Meta_L: return AK_LALT;
                    503:      case XK_Alt_R: case XK_Meta_R: return AK_RALT;
                    504:      case XK_Return: return AK_RET;
                    505:      case XK_space: return AK_SPC;
                    506:      case XK_Shift_L: return AK_LSH;
                    507:      case XK_Shift_R: return AK_RSH;
                    508:      case XK_Escape: return AK_ESC;
                    509: 
                    510:      case XK_Up: return AK_UP;
                    511:      case XK_Down: return AK_DN;
                    512:      case XK_Left: return AK_LF;
                    513:      case XK_Right: return AK_RT;
                    514:        
                    515:      case XK_F11: return AK_BACKSLASH;
                    516:      case XK_F12: return AK_mousestuff;
                    517:      case XK_Scroll_Lock: return AK_inhibit;
                    518: 
                    519: #ifdef XK_Page_Up /* These are missing occasionally */
                    520:      case XK_Page_Up: return AK_RAMI;          /* PgUp mapped to right amiga */
                    521:      case XK_Page_Down: return AK_LAMI;        /* PgDn mapped to left amiga */
                    522: #endif
                    523:     }
                    524:     return -1;
                    525: }
                    526: 
                    527: static int decode_us(KeySym ks)
                    528: {
                    529:     switch(ks) {       /* US specific */       
                    530:      case XK_Y: case XK_y: return AK_Y;
                    531:      case XK_Z: case XK_z: return AK_Z;
                    532:      case XK_bracketleft: return AK_LBRACKET;
                    533:      case XK_bracketright: return AK_RBRACKET;
                    534:      case XK_comma: return AK_COMMA;
                    535:      case XK_period: return AK_PERIOD;
                    536:      case XK_slash: return AK_SLASH;
                    537:      case XK_semicolon: return AK_SEMICOLON;
                    538:      case XK_minus: return AK_MINUS;
                    539:      case XK_equal: return AK_EQUAL;
                    540:        /* this doesn't work: */
                    541:      case XK_grave: return AK_QUOTE;
                    542:     }
                    543: 
                    544:     return -1;
                    545: }
                    546: 
                    547: static int decode_de(KeySym ks)
                    548: {
                    549:     switch(ks) {
                    550:        /* DE specific */
                    551:      case XK_Y: case XK_y: return AK_Z;
                    552:      case XK_Z: case XK_z: return AK_Y;
                    553:      case XK_Odiaeresis: case XK_odiaeresis: return AK_SEMICOLON;
                    554:      case XK_Adiaeresis: case XK_adiaeresis: return AK_QUOTE;
                    555:      case XK_Udiaeresis: case XK_udiaeresis: return AK_LBRACKET;
                    556:      case XK_plus: case XK_asterisk: return AK_RBRACKET;
                    557:      case XK_comma: return AK_COMMA;
                    558:      case XK_period: return AK_PERIOD;
                    559:      case XK_less: case XK_greater: return AK_LTGT;
                    560:      case XK_numbersign: return AK_NUMBERSIGN;
                    561:      case XK_ssharp: return AK_MINUS;
                    562:      case XK_apostrophe: return AK_EQUAL;
                    563:      case XK_asciicircum: return AK_00;
                    564:      case XK_minus: return AK_SLASH;       
                    565:     }
                    566: 
                    567:     return -1;
                    568: }
                    569: 
                    570: static int keycode2amiga(XKeyEvent *event)
                    571: {
                    572:     KeySym ks;
                    573:     int as;
                    574:     int index = 0;
                    575:     
                    576:     do {
                    577:        ks = XLookupKeysym(event, index);
                    578:        as = kc_decode (ks);
                    579:        
                    580:        if (as == -1) {     
                    581:            switch(keyboard_lang) {
                    582:             case KBD_LANG_US:
                    583:                as = decode_us(ks);
                    584:                break;
                    585:                
                    586:             case KBD_LANG_DE:
                    587:                as = decode_de(ks);
                    588:                break;
                    589:                
                    590:             default:
                    591:                as = -1;
                    592:                break;
                    593:            }
                    594:        }
                    595:        if(-1 != as)
                    596:                return as;
                    597:        index++;
                    598:     } while (ks != NoSymbol);
                    599:     return -1;
                    600: }
                    601: 
                    602: static struct timeval lastMotionTime;
                    603: 
                    604: void handle_events(void)
                    605: {
                    606:     bool repeat;
                    607:     newmousecounters = false;
                    608:     do {
                    609:        XEvent event;
                    610:        if (!XCheckMaskEvent(display, eventmask, &event)) break;
                    611:        repeat = false;
                    612:        
                    613:        switch(event.type) {
                    614:         case KeyPress: {               
                    615:             int kc = keycode2amiga((XKeyEvent *)&event);
                    616:             if (kc == -1) break;
                    617:             switch (kc) {
                    618:              case AK_mousestuff:
                    619: #if 0
                    620:                 if (keystate[AK_CTRL])
                    621:                     mousesetup();
                    622:                 else 
                    623: #endif
                    624:                     togglemouse();
                    625:                 break;
                    626: 
                    627:              case AK_inhibit:
                    628:                 inhibit_frame ^= 1;
                    629:                 break;
                    630: 
                    631:              default:
                    632:                 if (!keystate[kc]) {
                    633:                     keystate[kc] = true;
                    634:                     record_key (kc << 1);
                    635:                 }
                    636:                 break;
                    637:             }
                    638:             break;
                    639:         }
                    640:         case KeyRelease: {          
                    641:             int kc = keycode2amiga((XKeyEvent *)&event);
                    642:             if (kc == -1) break;
                    643:             keystate[kc] = false;
                    644:             record_key ((kc << 1) | 1);
                    645:             break;
                    646:         }
                    647:         case ButtonPress:
                    648:            buttonstate[((XButtonEvent *)&event)->button-1] = true;
                    649:            break;
                    650:         case ButtonRelease:
                    651:            buttonstate[((XButtonEvent *)&event)->button-1] = false;
                    652:            break;
                    653:         case EnterNotify:
                    654:            newmousecounters = true;
                    655:            lastmx = ((XCrossingEvent *)&event)->x;
                    656:            lastmy = ((XCrossingEvent *)&event)->y;
                    657:            repeat = true;
                    658:            inwindow = true;
                    659:            break;
                    660:         case LeaveNotify:
                    661:            inwindow = false;
                    662:            repeat = true;
                    663:            break;
                    664:         case FocusIn:
                    665:            XAutoRepeatOff(display);
                    666:            repeat = true;
                    667:            break;
                    668:         case FocusOut:
                    669:            XAutoRepeatOn(display);
                    670:            repeat = true;
                    671:            break;
                    672:         case MotionNotify:
                    673:            if (inwindow) {             
                    674:                lastmx = ((XMotionEvent *)&event)->x;
                    675:                lastmy = ((XMotionEvent *)&event)->y;
                    676:                if(!cursorOn) {
                    677:                    XDefineCursor(display, mywin, xhairCursor);
                    678:                    cursorOn = true;
                    679:                }
                    680:                gettimeofday(&lastMotionTime, NULL);
                    681:            }
                    682:            repeat = true;
                    683:            break;
                    684:        }
                    685:     } while (repeat);
                    686:     
                    687:     if(cursorOn) {
                    688:        struct timeval now;
                    689:        int diff;
                    690:        gettimeofday(&now, NULL);
                    691:        diff = (now.tv_sec - lastMotionTime.tv_sec) * 1000000 + 
                    692:            (now.tv_usec - lastMotionTime.tv_usec);
                    693:        if(diff > 1000000) {
                    694:            XDefineCursor(display, mywin, blankCursor);
                    695:            cursorOn = false;
                    696:        }
                    697:     }
                    698:        
                    699:     /* "Affengriff" */
                    700:     if(keystate[AK_CTRL] && keystate[AK_LAMI] && keystate[AK_RAMI])
                    701:        MC68000_reset();
                    702: }
                    703: 
                    704: bool debuggable(void)
                    705: {
                    706:     return true;
                    707: }
                    708: 
                    709: bool needmousehack(void)
                    710: {
                    711:     return true;
                    712: }
                    713: 
                    714: void LED(int on)
                    715: {
                    716:        XKeyboardControl control;
                    717:        control.led = 1; /* implementation defined */
                    718:        control.led_mode = on ? LedModeOn : LedModeOff;
                    719:        XChangeKeyboardControl(display, KBLed | KBLedMode, &control);
                    720: }

unix.superglobalmegacorp.com

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