Annotation of uae/src/sdlgfx.c, revision 1.1.1.1

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * SDL interface
                      5:   *
                      6:   * Copyright 2001 Bernd Lachner (EMail: [email protected])
                      7:   *
                      8:   * Partialy based on the UAE X interface (xwin.c)
                      9:   *
                     10:   * Copyright 1995, 1996 Bernd Schmidt
                     11:   * Copyright 1996 Ed Hanway, Andre Beck, Samuel Devulder, Bruno Coste
                     12:   * Copyright 1998 Marcus Sundberg
                     13:   * DGA support by Kai Kollmorgen
                     14:   * X11/DGA merge, hotkeys and grabmouse by Marcus Sundberg
                     15:   */
                     16: 
                     17: #include "sysconfig.h"
                     18: #include "sysdeps.h"
                     19: 
                     20: #include <unistd.h>
                     21: #include <signal.h>
                     22: 
                     23: #include <SDL/SDL.h>
                     24: #include <SDL/SDL_endian.h>
                     25: 
                     26: #include "config.h"
                     27: #include "options.h"
                     28: #include "uae.h"
                     29: #include "memory.h"
                     30: #include "xwin.h"
                     31: #include "custom.h"
                     32: #include "drawing.h"
                     33: #include "newcpu.h"
                     34: #include "keyboard.h"
                     35: #include "keybuf.h"
                     36: #include "gui.h"
                     37: #include "debug.h"
                     38: #include "picasso96.h"
                     39: 
                     40: #define DEBUG
                     41: /* Uncomment for debugging output */
                     42: /* #define DEBUG */
                     43: 
                     44: #ifdef __cplusplus
                     45: static RETSIGTYPE sigbrkhandler(...)
                     46: #else
                     47: static RETSIGTYPE sigbrkhandler (int foo)
                     48: #endif
                     49: {
                     50:        activate_debugger();
                     51: #if !defined(__unix) || defined(__NeXT__)
                     52:        signal (SIGINT, sigbrkhandler);
                     53: #endif
                     54: }
                     55: 
                     56: void setup_brkhandler (void)
                     57: {
                     58: #if defined(__unix) && !defined(__NeXT__)
                     59:     struct sigaction sa;
                     60:     sa.sa_handler = sigbrkhandler;
                     61:     sa.sa_flags = 0;
                     62: #ifdef SA_RESTART
                     63:     sa.sa_flags = SA_RESTART;
                     64: #endif
                     65:     sigemptyset (&sa.sa_mask);
                     66:     sigaction (SIGINT, &sa, NULL);
                     67: #else
                     68:     signal (SIGINT, sigbrkhandler);
                     69: #endif
                     70: }
                     71: 
                     72: /* SDL variable for output surface */
                     73: static SDL_Surface *prSDLScreen = NULL;
                     74: /* Possible screen modes (x and y resolutions) */
                     75: #define MAX_SCREEN_MODES 11
                     76: static int x_size_table[MAX_SCREEN_MODES] = { 320, 320, 320, 320, 640, 640, 640, 800, 1024, 1152, 1280 };
                     77: static int y_size_table[MAX_SCREEN_MODES] = { 200, 240, 256, 400, 350, 480, 512, 600, 768, 864, 1024 };
                     78: /* Possible screen depth (0 terminated) */
                     79: static int aScreenDepth[] = {16, 15, 12, 0};
                     80: 
                     81: static int red_bits, green_bits, blue_bits;
                     82: static int red_shift, green_shift, blue_shift;
                     83: 
                     84: static int screen_is_picasso;
                     85: static char picasso_invalid_lines[1201];
                     86: static int picasso_has_invalid_lines;
                     87: static int picasso_invalid_start, picasso_invalid_stop;
                     88: static int picasso_maxw = 0, picasso_maxh = 0;
                     89: 
                     90: static int bitdepth, bit_unit;
                     91: 
                     92: static int current_width, current_height;
                     93: static SDL_Color arSDLColors[256];
                     94: static int ncolors = 0;
                     95: 
                     96: /* Keyboard and mouse */
                     97: static int keystate[256];
                     98: 
                     99: static void handle_mousegrab(void);
                    100: static void handle_inhibit(void);
                    101: static void framerate_up(void);
                    102: static void framerate_down(void);
                    103: static void togglefullscreen(void)
                    104: {
                    105:        SDL_WM_ToggleFullScreen(prSDLScreen);
                    106: };
                    107: 
                    108: static void handle_interpol (void);
                    109: 
                    110: struct SDLHotKey
                    111: {
                    112:        SDLKey aHotKeys[2];
                    113:        void (*pfHandler)(void);
                    114:        long aPressedKeys[2];
                    115: };
                    116: 
                    117: 
                    118: static struct SDLHotKey arHotKeys[] =
                    119: {
                    120:     {{ SDLK_F12, SDLK_s}, togglefullscreen, {0, 0} },
                    121:     {{ SDLK_F12, SDLK_q}, uae_quit, {0, 0} },
                    122:     {{ SDLK_F12, SDLK_m}, togglemouse, {0, 0} },
                    123:     {{ SDLK_F12, SDLK_g}, handle_mousegrab, {0, 0} },
                    124:     {{ SDLK_F12, SDLK_i}, handle_inhibit, {0, 0} },
                    125:     {{ SDLK_F12, SDLK_p}, handle_interpol, {0, 0} },
                    126:     {{ SDLK_F12, SDLK_KP_PLUS}, framerate_up, {0, 0} },
                    127:     {{ SDLK_F12, SDLK_KP_MINUS}, framerate_down, {0, 0} },
                    128:     {{ 0, 0 }, NULL, {0, 0} }  /* List must be terminated */
                    129: };
                    130: 
                    131: void flush_line (int y)
                    132: {
                    133:     /* Not implemented for SDL output */
                    134: #ifdef DEBUG
                    135:     fprintf(stderr, "Function: flush_line\n");
                    136: #endif
                    137: }
                    138: 
                    139: void flush_block (int ystart, int ystop)
                    140: {
                    141: #ifdef DEBUG
                    142:     fprintf(stderr, "Function: flush_block %d %d\n", ystart, ystop);
                    143: #endif
                    144:     SDL_UnlockSurface (prSDLScreen);
                    145:     SDL_UpdateRect(prSDLScreen, 0, ystart, current_width, ystop-ystart+1);
                    146:     SDL_LockSurface (prSDLScreen);
                    147: }
                    148: 
                    149: void flush_screen (int ystart, int ystop)
                    150: {
                    151: #ifdef DEBUG
                    152:     fprintf(stderr, "Function: flush_screen\n");
                    153: #endif
                    154: 
                    155: #if 0
                    156:     SDL_UpdateRect(prSDLScreen, 0, 0, current_width, current_height);
                    157: #endif
                    158: }
                    159: 
                    160: STATIC_INLINE int bitsInMask (unsigned long mask)
                    161: {
                    162:        /* count bits in mask */
                    163:        int n = 0;
                    164:        while (mask)
                    165:        {
                    166:                n += mask & 1;
                    167:                mask >>= 1;
                    168:        }
                    169:        return n;
                    170: }
                    171: 
                    172: STATIC_INLINE int maskShift (unsigned long mask)
                    173: {
                    174:        /* determine how far mask is shifted */
                    175:        int n = 0;
                    176:        while (!(mask & 1))
                    177:        {
                    178:                n++;
                    179:                mask >>= 1;
                    180:        }
                    181:        return n;
                    182: }
                    183: 
                    184: static int get_color (int r, int g, int b, xcolnr *cnp)
                    185: {
                    186: #ifdef DEBUG
                    187:        fprintf(stderr, "Function: get_color\n");
                    188: #endif
                    189: 
                    190:        *cnp = SDL_MapRGB(prSDLScreen->format, r, g, b);
                    191:        arSDLColors[ncolors].r = r;
                    192:        arSDLColors[ncolors].g = g;
                    193:        arSDLColors[ncolors].b = b;
                    194: 
                    195:        ncolors++;
                    196:        return 1;
                    197: }
                    198: 
                    199: static int init_colors (void)
                    200: {
                    201:        int i;
                    202: 
                    203: #ifdef DEBUG
                    204:        fprintf(stderr, "Function: init_colors\n");
                    205: #endif
                    206: 
                    207:        if (bitdepth > 8)
                    208:        {
                    209:                /* Truecolor: */
                    210:                red_bits = bitsInMask(prSDLScreen->format->Rmask);
                    211:                green_bits = bitsInMask(prSDLScreen->format->Gmask);
                    212:                blue_bits = bitsInMask(prSDLScreen->format->Bmask);
                    213:                red_shift = maskShift(prSDLScreen->format->Rmask);
                    214:                green_shift = maskShift(prSDLScreen->format->Gmask);
                    215:                blue_shift = maskShift(prSDLScreen->format->Bmask);
                    216:                alloc_colors64k (red_bits, green_bits, blue_bits, red_shift, green_shift, blue_shift);
                    217:        }
                    218:        else
                    219:        {
                    220:                alloc_colors256 (get_color);
                    221:                SDL_SetColors(prSDLScreen, arSDLColors, 0, 256);
                    222:        }
                    223: 
                    224:        switch (gfxvidinfo.pixbytes)
                    225:        {
                    226:        case 2:
                    227:                for (i = 0; i < 4096; i++)
                    228:                xcolors[i] = xcolors[i] * 0x00010001;
                    229:                gfxvidinfo.can_double = 1;
                    230:                break;
                    231:        case 1:
                    232:                for (i = 0; i < 4096; i++)
                    233:                xcolors[i] = xcolors[i] * 0x01010101;
                    234:                gfxvidinfo.can_double = 1;
                    235:                break;
                    236:        default:
                    237:                gfxvidinfo.can_double = 0;
                    238:                break;
                    239:        }
                    240:        if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
                    241:        {
                    242:                switch (gfxvidinfo.pixbytes)
                    243:                {
                    244:                case 4:
                    245:                        for(i = 0; i < 4096; i++)
                    246:                                SDL_Swap32(xcolors[i]);
                    247:                        break;
                    248:                case 2:
                    249:                        for (i = 0; i < 4096; i++)
                    250:                                SDL_Swap16(xcolors[i]);
                    251:                        break;
                    252:                }
                    253:        }
                    254:        return 1;
                    255: }
                    256: 
                    257: int graphics_setup (void)
                    258: {
                    259: #ifdef DEBUG
                    260:     fprintf(stderr, "Function: graphics_setup\n");
                    261: #endif
                    262: 
                    263:     /* Initialize the SDL library */
                    264:     if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
                    265:     {
                    266:         fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
                    267:         return 0;
                    268:     }
                    269: 
                    270:     return 1;
                    271: }
                    272: 
                    273: 
                    274: static void graphics_subinit (void)
                    275: {
                    276:        int i, j;
                    277:        Uint32 uiSDLVidModFlags;
                    278: 
                    279: #ifdef DEBUG
                    280:        fprintf(stderr, "Function: graphics_subinit\n");
                    281: #endif
                    282: 
                    283:        /* Open SDL Window in current mode */
                    284:        uiSDLVidModFlags = SDL_SWSURFACE;
                    285:        if (bitdepth == 8)
                    286:        {
                    287:                uiSDLVidModFlags |= SDL_HWPALETTE;
                    288:        }
                    289:        if (currprefs.gfx_afullscreen || currprefs.gfx_pfullscreen)
                    290:        {
                    291:                uiSDLVidModFlags |= SDL_FULLSCREEN;
                    292:        }
                    293:        fprintf(stderr, "Resolution: %d x %d x %d\n", current_width, current_height, bitdepth);
                    294: 
                    295:        prSDLScreen = SDL_SetVideoMode(current_width, current_height, bitdepth, uiSDLVidModFlags);
                    296:        if (prSDLScreen == NULL)
                    297:        {
                    298:                fprintf(stderr, "Unable to set video mode: %s\n", SDL_GetError());
                    299:                return;
                    300:        }
                    301:        else
                    302:        {
                    303: #ifdef DEBUG
                    304:                fprintf(stderr, "Bytes per Pixel: %d\n", prSDLScreen->format->BytesPerPixel);
                    305:                fprintf(stderr, "Bytes per Line: %d\n", prSDLScreen->pitch);
                    306: #endif
                    307:                SDL_LockSurface(prSDLScreen);
                    308:                memset(prSDLScreen->pixels, 0xff, current_width * current_height * prSDLScreen->format->BytesPerPixel);
                    309:                SDL_UnlockSurface(prSDLScreen);
                    310:                SDL_UpdateRect(prSDLScreen, 0, 0, current_width, current_height);
                    311:                /* Set UAE window title and icon name */
                    312:                SDL_WM_SetCaption("UAE","UAE");
                    313:                /* Hide mouse cursor */
                    314:                SDL_ShowCursor(SDL_DISABLE);
                    315:                /* Initialize structure for Amiga video modes */
                    316:                gfxvidinfo.bufmem = prSDLScreen->pixels;
                    317:                gfxvidinfo.linemem = 0;
                    318:                gfxvidinfo.emergmem = 0;
                    319:                gfxvidinfo.pixbytes = prSDLScreen->format->BytesPerPixel;
                    320:                bit_unit = prSDLScreen->format->BytesPerPixel * 8;
                    321:                gfxvidinfo.rowbytes = prSDLScreen->pitch;
                    322:                gfxvidinfo.maxblocklines = 100;
                    323:                gfxvidinfo.can_double = 0;
                    324:                /* Initialize structure for Picasso96 video modes */
                    325:                picasso_vidinfo.rowbytes = current_width * gfxvidinfo.pixbytes;
                    326:                picasso_vidinfo.extra_mem = 1;
                    327:                picasso_vidinfo.depth = bitdepth;
                    328:                picasso_has_invalid_lines = 0;
                    329:                picasso_invalid_start = picasso_vidinfo.height + 1;
                    330:                picasso_invalid_stop = -1;
                    331:                memset (picasso_invalid_lines, 0, sizeof picasso_invalid_lines);
                    332:        }
                    333:        lastmx = lastmy = 0;
                    334:        newmousecounters = 0;
                    335: }
                    336: 
                    337: 
                    338: int graphics_init (void)
                    339: {
                    340:        int i,j;
                    341: 
                    342: #ifdef DEBUG
                    343:        fprintf(stderr, "Function: graphics_init\n");
                    344: #endif
                    345: 
                    346:        if (currprefs.color_mode > 5)
                    347:                fprintf (stderr, "Bad color mode selected. Using default.\n"), currprefs.color_mode = 0;
                    348: 
                    349:        screen_is_picasso = 0;
                    350: 
                    351:        fixup_prefs_dimensions (&currprefs);
                    352: 
                    353: 
                    354:        gfxvidinfo.width = currprefs.gfx_width;
                    355:        gfxvidinfo.height = currprefs.gfx_height;
                    356:        current_width = currprefs.gfx_width;
                    357:        current_height = currprefs.gfx_height;
                    358: 
                    359:        /* Find a SDL video mode with exact width and height */
                    360:        for (i = 0; aScreenDepth[i] != 0; i++)
                    361:        {
                    362:                bitdepth = SDL_VideoModeOK(current_width, current_height, aScreenDepth[i], SDL_SWSURFACE);
                    363:                if (bitdepth)
                    364:                {
                    365:                        #ifdef DEBUG
                    366:                        fprintf(stderr, "Bit depth: %d\n", bitdepth);
                    367:                        #endif
                    368:                        break;
                    369:                }
                    370:                else
                    371:                {
                    372:                        fprintf(stderr, "Video mode %dx%d@%d not available\n", current_width, current_height, aScreenDepth[i]);
                    373:                }
                    374:        }
                    375:        if (bitdepth == 0)
                    376:        {
                    377:                /* Find a SDL video mode from standard resolutions */
                    378:                for (j = 0; j < MAX_SCREEN_MODES && !bitdepth; j++)
                    379:                {
                    380:                        if (x_size_table[j] < current_width || y_size_table[j] < current_height)
                    381:                                continue;
                    382:                        for (i = 0; aScreenDepth[i] != 0 && !bitdepth; i++)
                    383:                        {
                    384:                                bitdepth = SDL_VideoModeOK(x_size_table[j], y_size_table[j], aScreenDepth[i], SDL_SWSURFACE);
                    385:                                if (bitdepth)
                    386:                                {
                    387:                                        #ifdef DEBUG
                    388:                                        fprintf(stderr, "Bit depth: %d\n", bitdepth);
                    389:                                        #endif
                    390:                                        gfxvidinfo.width = current_width = x_size_table[j];
                    391:                                        gfxvidinfo.height = current_height = y_size_table[j];
                    392:                                        break;
                    393:                                }
                    394:                                else
                    395:                                {
                    396:                                        fprintf(stderr, "Video mode %dx%d@%d not available\n", current_width, current_height, aScreenDepth[i]);
                    397:                                }
                    398:                        }
                    399:                }
                    400:                if (bitdepth == 0)
                    401:                {
                    402:                        fprintf(stderr, "No video mode found!\n");
                    403:                        return 0;
                    404:                }
                    405:        }
                    406: 
                    407:        graphics_subinit ();
                    408: 
                    409: 
                    410:     if (!init_colors ())
                    411:                return 0;
                    412: 
                    413:     buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
                    414:     for (i = 0; i < 256; i++)
                    415:        keystate[i] = 0;
                    416: 
                    417:     return 1;
                    418: }
                    419: 
                    420: static void graphics_subshutdown (void)
                    421: {
                    422: #ifdef DEBUG
                    423:     fprintf(stderr, "Function: graphics_subshutdown\n");
                    424: #endif
                    425: 
                    426:     SDL_FreeSurface(prSDLScreen);
                    427: }
                    428: 
                    429: void graphics_leave (void)
                    430: {
                    431: #ifdef DEBUG
                    432:     fprintf(stderr, "Function: graphics_leave\n");
                    433: #endif
                    434: 
                    435:     graphics_subshutdown ();
                    436: 
                    437:        SDL_Quit();
                    438: 
                    439:     dumpcustom ();
                    440: }
                    441: 
                    442: /* Decode KeySyms. This function knows about all keys that are common
                    443:  * between different keyboard languages. */
                    444: static int kc_decode (SDL_keysym *prKeySym)
                    445: {
                    446:     switch (prKeySym->sym)
                    447:     {
                    448:     case SDLK_b: return AK_B;
                    449:     case SDLK_c: return AK_C;
                    450:     case SDLK_d: return AK_D;
                    451:     case SDLK_e: return AK_E;
                    452:     case SDLK_f: return AK_F;
                    453:     case SDLK_g: return AK_G;
                    454:     case SDLK_h: return AK_H;
                    455:     case SDLK_i: return AK_I;
                    456:     case SDLK_j: return AK_J;
                    457:     case SDLK_k: return AK_K;
                    458:     case SDLK_l: return AK_L;
                    459:     case SDLK_n: return AK_N;
                    460:     case SDLK_o: return AK_O;
                    461:     case SDLK_p: return AK_P;
                    462:     case SDLK_r: return AK_R;
                    463:     case SDLK_s: return AK_S;
                    464:     case SDLK_t: return AK_T;
                    465:     case SDLK_u: return AK_U;
                    466:     case SDLK_v: return AK_V;
                    467:     case SDLK_x: return AK_X;
                    468: 
                    469:     case SDLK_0: return AK_0;
                    470:     case SDLK_1: return AK_1;
                    471:     case SDLK_2: return AK_2;
                    472:     case SDLK_3: return AK_3;
                    473:     case SDLK_4: return AK_4;
                    474:     case SDLK_5: return AK_5;
                    475:     case SDLK_6: return AK_6;
                    476:     case SDLK_7: return AK_7;
                    477:     case SDLK_8: return AK_8;
                    478:     case SDLK_9: return AK_9;
                    479: 
                    480:     case SDLK_KP0: return AK_NP0;
                    481:     case SDLK_KP1: return AK_NP1;
                    482:     case SDLK_KP2: return AK_NP2;
                    483:     case SDLK_KP3: return AK_NP3;
                    484:     case SDLK_KP4: return AK_NP4;
                    485:     case SDLK_KP5: return AK_NP5;
                    486:     case SDLK_KP6: return AK_NP6;
                    487:     case SDLK_KP7: return AK_NP7;
                    488:     case SDLK_KP8: return AK_NP8;
                    489:     case SDLK_KP9: return AK_NP9;
                    490:     case SDLK_KP_DIVIDE: return AK_NPDIV;
                    491:     case SDLK_KP_MULTIPLY: return AK_NPMUL;
                    492:     case SDLK_KP_MINUS: return AK_NPSUB;
                    493:     case SDLK_KP_PLUS: return AK_NPADD;
                    494:     case SDLK_KP_PERIOD: return AK_NPDEL;
                    495:     case SDLK_KP_ENTER: return AK_ENT;
                    496: 
                    497:     case SDLK_F1: return AK_F1;
                    498:     case SDLK_F2: return AK_F2;
                    499:     case SDLK_F3: return AK_F3;
                    500:     case SDLK_F4: return AK_F4;
                    501:     case SDLK_F5: return AK_F5;
                    502:     case SDLK_F6: return AK_F6;
                    503:     case SDLK_F7: return AK_F7;
                    504:     case SDLK_F8: return AK_F8;
                    505:     case SDLK_F9: return AK_F9;
                    506:     case SDLK_F10: return AK_F10;
                    507: 
                    508:     case SDLK_BACKSPACE: return AK_BS;
                    509:     case SDLK_DELETE: return AK_DEL;
                    510:     case SDLK_LCTRL: return AK_CTRL;
                    511:     case SDLK_RCTRL: return AK_RCTRL;
                    512:     case SDLK_TAB: return AK_TAB;
                    513:     case SDLK_LALT: return AK_LALT;
                    514:     case SDLK_RALT: return AK_RALT;
                    515:     case SDLK_RMETA: return AK_RAMI;
                    516:     case SDLK_LMETA: return AK_LAMI;
                    517:     case SDLK_RETURN: return AK_RET;
                    518:     case SDLK_SPACE: return AK_SPC;
                    519:     case SDLK_LSHIFT: return AK_LSH;
                    520:     case SDLK_RSHIFT: return AK_RSH;
                    521:     case SDLK_ESCAPE: return AK_ESC;
                    522: 
                    523:     case SDLK_INSERT: return AK_HELP;
                    524:     case SDLK_HOME: return AK_NPLPAREN;
                    525:     case SDLK_END: return AK_NPRPAREN;
                    526:     case SDLK_CAPSLOCK: return AK_CAPSLOCK;
                    527: 
                    528:     case SDLK_UP: return AK_UP;
                    529:     case SDLK_DOWN: return AK_DN;
                    530:     case SDLK_LEFT: return AK_LF;
                    531:     case SDLK_RIGHT: return AK_RT;
                    532: 
                    533:     case SDLK_PAGEUP: return AK_RAMI;          /* PgUp mapped to right amiga */
                    534:     case SDLK_PAGEDOWN: return AK_LAMI;        /* PgDn mapped to left amiga */
                    535: 
                    536:     default: return -1;
                    537:     }
                    538: }
                    539: 
                    540: static int decode_fr (SDL_keysym *prKeySym)
                    541: {
                    542:     switch(prKeySym->sym)
                    543:     {
                    544:        /* FR specific */
                    545:     case SDLK_a: return AK_Q;
                    546:     case SDLK_m: return AK_SEMICOLON;
                    547:     case SDLK_q: return AK_A;
                    548:     case SDLK_y: return AK_Y;
                    549:     case SDLK_w: return AK_Z;
                    550:     case SDLK_z: return AK_W;
                    551:     case SDLK_LEFTBRACKET: return AK_LBRACKET;
                    552:     case SDLK_RIGHTBRACKET: return AK_RBRACKET;
                    553:     case SDLK_COMMA: return AK_M;
                    554:     case SDLK_LESS: case SDLK_GREATER: return AK_LTGT;
                    555:     case SDLK_PERIOD: case SDLK_SEMICOLON: return AK_COMMA;
                    556:     case SDLK_RIGHTPAREN: return AK_MINUS;
                    557:     case SDLK_EQUALS: return AK_SLASH;
                    558:     case SDLK_HASH: return AK_NUMBERSIGN;
                    559:     case SDLK_SLASH: return AK_PERIOD;
                    560:     case SDLK_MINUS: return AK_EQUAL;
                    561:     case SDLK_BACKSLASH: return AK_BACKSLASH;
                    562:     default: return -1;
                    563:     }
                    564: }
                    565: 
                    566: static int decode_us (SDL_keysym *prKeySym)
                    567: {
                    568:     switch(prKeySym->sym)
                    569:     {
                    570:        /* US specific */
                    571:     case SDLK_a: return AK_A;
                    572:     case SDLK_m: return AK_M;
                    573:     case SDLK_q: return AK_Q;
                    574:     case SDLK_y: return AK_Y;
                    575:     case SDLK_w: return AK_W;
                    576:     case SDLK_z: return AK_Z;
                    577:     case SDLK_LEFTBRACKET: return AK_LBRACKET;
                    578:     case SDLK_RIGHTBRACKET: return AK_RBRACKET;
                    579:     case SDLK_COMMA: return AK_COMMA;
                    580:     case SDLK_PERIOD: return AK_PERIOD;
                    581:     case SDLK_SLASH: return AK_SLASH;
                    582:     case SDLK_SEMICOLON: return AK_SEMICOLON;
                    583:     case SDLK_MINUS: return AK_MINUS;
                    584:     case SDLK_EQUALS: return AK_EQUAL;
                    585:        /* this doesn't work: */
                    586:     case SDLK_BACKQUOTE: return AK_QUOTE;
                    587:     case SDLK_QUOTE: return AK_BACKQUOTE;
                    588:     case SDLK_BACKSLASH: return AK_BACKSLASH;
                    589:     default: return -1;
                    590:     }
                    591: }
                    592: 
                    593: static int decode_de (SDL_keysym *prKeySym)
                    594: {
                    595:     switch(prKeySym->sym)
                    596:     {
                    597:        /* DE specific */
                    598:     case SDLK_a: return AK_A;
                    599:     case SDLK_m: return AK_M;
                    600:     case SDLK_q: return AK_Q;
                    601:     case SDLK_w: return AK_W;
                    602:     case SDLK_y: return AK_Z;
                    603:     case SDLK_z: return AK_Y;
                    604:        /* German umlaut oe */
                    605:     case SDLK_WORLD_86: return AK_SEMICOLON;
                    606:        /* German umlaut ae */
                    607:     case SDLK_WORLD_68: return AK_QUOTE;
                    608:        /* German umlaut ue */
                    609:     case SDLK_WORLD_92: return AK_LBRACKET;
                    610:     case SDLK_PLUS: case SDLK_ASTERISK: return AK_RBRACKET;
                    611:     case SDLK_COMMA: return AK_COMMA;
                    612:     case SDLK_PERIOD: return AK_PERIOD;
                    613:     case SDLK_LESS: case SDLK_GREATER: return AK_LTGT;
                    614:     case SDLK_HASH: return AK_NUMBERSIGN;
                    615:        /* German sharp s */
                    616:     case SDLK_WORLD_63: return AK_MINUS;
                    617:     case SDLK_QUOTE: return AK_EQUAL;
                    618:     case SDLK_CARET: return AK_BACKQUOTE;
                    619:     case SDLK_MINUS: return AK_SLASH;
                    620:     default: return -1;
                    621:     }
                    622: }
                    623: 
                    624: static int decode_se (SDL_keysym *prKeySym)
                    625: {
                    626:     switch(prKeySym->sym)
                    627:     {
                    628:        /* SE specific */
                    629:     case SDLK_a: return AK_A;
                    630:     case SDLK_m: return AK_M;
                    631:     case SDLK_q: return AK_Q;
                    632:     case SDLK_w: return AK_W;
                    633:     case SDLK_y: return AK_Y;
                    634:     case SDLK_z: return AK_Z;
                    635:     case SDLK_WORLD_86: return AK_SEMICOLON;
                    636:     case SDLK_WORLD_68: return AK_QUOTE;
                    637:     case SDLK_WORLD_69: return AK_LBRACKET;
                    638:     case SDLK_COMMA: return AK_COMMA;
                    639:     case SDLK_PERIOD: return AK_PERIOD;
                    640:     case SDLK_MINUS: return AK_SLASH;
                    641:     case SDLK_LESS: case SDLK_GREATER: return AK_LTGT;
                    642:     case SDLK_PLUS: case SDLK_QUESTION: return AK_EQUAL;
                    643:     case SDLK_AT: case SDLK_WORLD_29: return AK_BACKQUOTE;
                    644:     case SDLK_CARET: return AK_RBRACKET;
                    645:     case SDLK_BACKSLASH: return AK_MINUS;
                    646:     case SDLK_HASH: return AK_NUMBERSIGN;
                    647:     default: return -1;
                    648:     }
                    649: }
                    650: 
                    651: static int decode_it (SDL_keysym *prKeySym)
                    652: {
                    653:     switch(prKeySym->sym)
                    654:     {
                    655:        /* IT specific */
                    656:     case SDLK_a: return AK_A;
                    657:     case SDLK_m: return AK_M;
                    658:     case SDLK_q: return AK_Q;
                    659:     case SDLK_w: return AK_W;
                    660:     case SDLK_y: return AK_Y;
                    661:     case SDLK_z: return AK_Z;
                    662:     case SDLK_WORLD_82: return AK_SEMICOLON;
                    663:     case SDLK_WORLD_64: return AK_QUOTE;
                    664:     case SDLK_WORLD_72: return AK_LBRACKET;
                    665:     case SDLK_PLUS: case SDLK_ASTERISK: return AK_RBRACKET;
                    666:     case SDLK_COMMA: return AK_COMMA;
                    667:     case SDLK_PERIOD: return AK_PERIOD;
                    668:     case SDLK_LESS: case SDLK_GREATER: return AK_LTGT;
                    669:     case SDLK_BACKSLASH: return AK_BACKQUOTE;
                    670:     case SDLK_QUOTE: return AK_MINUS;
                    671:     case SDLK_WORLD_76: return AK_EQUAL;
                    672:     case SDLK_MINUS: return AK_SLASH;
                    673:     case SDLK_HASH: return AK_NUMBERSIGN;
                    674:     default: return -1;
                    675:     }
                    676: }
                    677: 
                    678: static int decode_es (SDL_keysym *prKeySym)
                    679: {
                    680:     switch(prKeySym->sym)
                    681:     {
                    682:        /* ES specific */
                    683:     case SDLK_a: return AK_A;
                    684:     case SDLK_m: return AK_M;
                    685:     case SDLK_q: return AK_Q;
                    686:     case SDLK_w: return AK_W;
                    687:     case SDLK_y: return AK_Y;
                    688:     case SDLK_z: return AK_Z;
                    689:     case SDLK_WORLD_81: return AK_SEMICOLON;
                    690:     case SDLK_PLUS: case SDLK_ASTERISK: return AK_RBRACKET;
                    691:     case SDLK_COMMA: return AK_COMMA;
                    692:     case SDLK_PERIOD: return AK_PERIOD;
                    693:     case SDLK_LESS: case SDLK_GREATER: return AK_LTGT;
                    694:     case SDLK_BACKSLASH: return AK_BACKQUOTE;
                    695:     case SDLK_QUOTE: return AK_MINUS;
                    696:     case SDLK_WORLD_76: return AK_EQUAL;
                    697:     case SDLK_MINUS: return AK_SLASH;
                    698:     case SDLK_HASH: return AK_NUMBERSIGN;
                    699:     default: return -1;
                    700:     }
                    701: }
                    702: 
                    703: static int keycode2amiga(SDL_keysym *prKeySym)
                    704: {
                    705:     int iAmigaKeycode = kc_decode(prKeySym);
                    706:     if (iAmigaKeycode == -1)
                    707:     {
                    708:         switch (currprefs.keyboard_lang)
                    709:         {
                    710:         case KBD_LANG_FR:
                    711:             return decode_fr(prKeySym);
                    712:         case KBD_LANG_US:
                    713:             return decode_us(prKeySym);
                    714:         case KBD_LANG_DE:
                    715:             return decode_de(prKeySym);
                    716:         case KBD_LANG_SE:
                    717:             return decode_se (prKeySym);
                    718:         case KBD_LANG_IT:
                    719:             return decode_it (prKeySym);
                    720:         case KBD_LANG_ES:
                    721:             return decode_es (prKeySym);
                    722:         default:
                    723:             return -1;
                    724:         }
                    725:     }
                    726:     return iAmigaKeycode;
                    727: }
                    728: 
                    729: static int refresh_necessary = 0;
                    730: 
                    731: void handle_events (void)
                    732: {
                    733:     SDL_Event rEvent;
                    734:     int iAmigaKeyCode;
                    735:     int i, j;
                    736:     int iIsHotKey = 0;
                    737: #ifdef DEBUG
                    738:     fprintf(stderr, "Function: handle_events\n");
                    739: #endif
                    740: 
                    741:     /* Handle GUI events */
                    742:     gui_handle_events ();
                    743: 
                    744:     while (SDL_PollEvent(&rEvent))
                    745:     {
                    746:        switch (rEvent.type)
                    747:        {
                    748:        case SDL_QUIT:
                    749: #ifdef DEBUG
                    750:            fprintf(stderr, "Event: quit\n");
                    751: #endif
                    752:            uae_quit();
                    753:            break;
                    754:         case SDL_KEYDOWN:
                    755: #ifdef DEBUG
                    756:            fprintf(stderr, "Event: key down\n");
                    757: #endif
                    758:            /* Check for hotkey sequence */
                    759:            i = 0;
                    760:            while (arHotKeys[i].pfHandler != NULL)
                    761:            {
                    762:                if (rEvent.key.keysym.sym == arHotKeys[i].aHotKeys[0])
                    763:                {
                    764:                    arHotKeys[i].aPressedKeys[0] = 1;
                    765:                    iIsHotKey = 1;
                    766:                }
                    767:                if (arHotKeys[i].aPressedKeys[0] == 1 &&
                    768:                    rEvent.key.keysym.sym == arHotKeys[i].aHotKeys[1])
                    769:                {
                    770:                    arHotKeys[i].aPressedKeys[1] = 1;
                    771:                    arHotKeys[i].pfHandler();
                    772:                    iIsHotKey = 1;
                    773:                }
                    774:                i++;
                    775:            }
                    776:            if (iIsHotKey == 0)
                    777:            {
                    778:                                /* No hotkey sequence */
                    779:                iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym));
                    780:                if (iAmigaKeyCode >= 0)
                    781:                {
                    782:                    if (!keystate[iAmigaKeyCode])
                    783:                    {
                    784:                        keystate[iAmigaKeyCode] = 1;
                    785:                        record_key(iAmigaKeyCode << 1);
                    786:                    }
                    787:                }
                    788:            }
                    789:            break;
                    790:        case SDL_KEYUP:
                    791: #ifdef DEBUG
                    792:            fprintf(stderr, "Event: key up\n");
                    793: #endif
                    794:            /* Check for hotkey sequence */
                    795:            i = 0;
                    796:            while (arHotKeys[i].pfHandler != NULL)
                    797:            {
                    798:                for (j = 0; j < 2; j++)
                    799:                {
                    800:                    if (rEvent.key.keysym.sym == arHotKeys[i].aHotKeys[j] &&
                    801:                        arHotKeys[i].aPressedKeys[j] == 1)
                    802:                    {
                    803:                        arHotKeys[i].aPressedKeys[j] = 0;
                    804:                        iIsHotKey = 1;
                    805:                    }
                    806:                }
                    807:                i++;
                    808:            }
                    809:            if (iIsHotKey == 0)
                    810:            {
                    811:                iAmigaKeyCode = keycode2amiga(&(rEvent.key.keysym));
                    812:                if (iAmigaKeyCode >= 0)
                    813:                {
                    814:                    keystate[iAmigaKeyCode] = 0;
                    815:                    record_key((iAmigaKeyCode << 1) | 1);
                    816:                }
                    817:            }
                    818:            break;
                    819:        case SDL_MOUSEBUTTONDOWN:
                    820: #ifdef DEBUG
                    821:            fprintf(stderr, "Event: mouse button down\n");
                    822: #endif
                    823:            buttonstate[rEvent.button.button-1] = 1;
                    824:            break;
                    825:        case SDL_MOUSEBUTTONUP:
                    826: #ifdef DEBUG
                    827:            fprintf(stderr, "Event: mouse button up\n");
                    828: #endif
                    829:            buttonstate[rEvent.button.button-1] = 0;
                    830:            break;
                    831:        case SDL_MOUSEMOTION:
                    832: #ifdef DEBUG
                    833:            fprintf(stderr, "Event: mouse motion\n");
                    834: #endif
                    835:            newmousecounters = 1;
                    836:            lastmx += rEvent.motion.xrel;
                    837:            lastmy += rEvent.motion.yrel;
                    838:            break;
                    839:        }
                    840:     }
                    841: #if defined PICASSO96
                    842:     if (screen_is_picasso && refresh_necessary)
                    843:     {
                    844:        SDL_UpdateRect(prSDLScreen, 0, 0, picasso_vidinfo.width, picasso_vidinfo.height);
                    845:        refresh_necessary = 0;
                    846:        memset (picasso_invalid_lines, 0, sizeof picasso_invalid_lines);
                    847:     }
                    848:     else if (screen_is_picasso && picasso_has_invalid_lines)
                    849:     {
                    850:        int i;
                    851:        int strt = -1;
                    852:        picasso_invalid_lines[picasso_vidinfo.height] = 0;
                    853:        for (i = picasso_invalid_start; i < picasso_invalid_stop + 2; i++)
                    854:        {
                    855:            if (picasso_invalid_lines[i])
                    856:            {
                    857:                picasso_invalid_lines[i] = 0;
                    858:                if (strt != -1)
                    859:                    continue;
                    860:                strt = i;
                    861:            }
                    862:            else
                    863:            {
                    864:                if (strt == -1)
                    865:                    continue;
                    866:                SDL_UpdateRect(prSDLScreen, 0, strt, picasso_vidinfo.width, i-strt);
                    867:                strt = -1;
                    868:            }
                    869:        }
                    870:        if (strt != -1)
                    871:            abort ();
                    872:     }
                    873:     picasso_has_invalid_lines = 0;
                    874:     picasso_invalid_start = picasso_vidinfo.height + 1;
                    875:     picasso_invalid_stop = -1;
                    876: #endif
                    877: 
                    878:     /* Handle UAE reset */
                    879:     if ((keystate[AK_CTRL] || keystate[AK_RCTRL]) && keystate[AK_LAMI] && keystate[AK_RAMI])
                    880:        uae_reset ();
                    881: }
                    882: 
                    883: int check_prefs_changed_gfx (void)
                    884: {
                    885: 
                    886:     if (changed_prefs.gfx_width != currprefs.gfx_width
                    887:        || changed_prefs.gfx_height != currprefs.gfx_height)
                    888:     {
                    889:        fixup_prefs_dimensions (&changed_prefs);
                    890:     }
                    891: 
                    892:     if (changed_prefs.gfx_width == currprefs.gfx_width
                    893:        && changed_prefs.gfx_height == currprefs.gfx_height
                    894:        && changed_prefs.gfx_lores == currprefs.gfx_lores
                    895:        && changed_prefs.gfx_linedbl == currprefs.gfx_linedbl
                    896:        && changed_prefs.gfx_correct_aspect == currprefs.gfx_correct_aspect
                    897:        && changed_prefs.gfx_xcenter == currprefs.gfx_xcenter
                    898:        && changed_prefs.gfx_ycenter == currprefs.gfx_ycenter
                    899:        && changed_prefs.gfx_afullscreen == currprefs.gfx_afullscreen
                    900:        && changed_prefs.gfx_pfullscreen == currprefs.gfx_pfullscreen)
                    901:     {
                    902:        return 0;
                    903:     }
                    904: #ifdef DEBUG
                    905:     fprintf(stderr, "Function: check_prefs_changed_gfx\n");
                    906: #endif
                    907:     graphics_subshutdown ();
                    908:     currprefs.gfx_width = changed_prefs.gfx_width;
                    909:     currprefs.gfx_height = changed_prefs.gfx_height;
                    910:     currprefs.gfx_lores = changed_prefs.gfx_lores;
                    911:     currprefs.gfx_linedbl = changed_prefs.gfx_linedbl;
                    912:     currprefs.gfx_correct_aspect = changed_prefs.gfx_correct_aspect;
                    913:     currprefs.gfx_xcenter = changed_prefs.gfx_xcenter;
                    914:     currprefs.gfx_ycenter = changed_prefs.gfx_ycenter;
                    915:     currprefs.gfx_afullscreen = changed_prefs.gfx_afullscreen;
                    916:     currprefs.gfx_pfullscreen = changed_prefs.gfx_pfullscreen;
                    917: 
                    918:     gui_update_gfx ();
                    919: 
                    920:     graphics_subinit ();
                    921: 
                    922:     /*    if (! inwindow)
                    923:          XWarpPointer (display, None, mywin, 0, 0, 0, 0,
                    924:          current_width / 2, current_height / 2);
                    925:     */
                    926:     notice_screen_contents_lost ();
                    927:     init_row_map ();
                    928:     if (screen_is_picasso)
                    929:        picasso_enablescreen (1);
                    930:     return 0;
                    931: }
                    932: 
                    933: int debuggable (void)
                    934: {
                    935:     return 1;
                    936: }
                    937: 
                    938: int needmousehack (void)
                    939: {
                    940:     return 1;
                    941: }
                    942: 
                    943: void LED (int on)
                    944: {
                    945: #if 0 /* Maybe that is responsible for the joystick emulation problems on SunOS? */
                    946:     static int last_on = -1;
                    947:     XKeyboardControl control;
                    948: 
                    949:     if (last_on == on)
                    950:        return;
                    951:     last_on = on;
                    952:     control.led = 1; /* implementation defined */
                    953:     control.led_mode = on ? LedModeOn : LedModeOff;
                    954:     XChangeKeyboardControl(display, KBLed | KBLedMode, &control);
                    955: #endif
                    956: }
                    957: 
                    958: #ifdef PICASSO96
                    959: 
                    960: void DX_Invalidate (int first, int last)
                    961: {
                    962: #ifdef DEBUG
                    963:     fprintf(stderr, "Function: DX_Invalidate %i - %i\n", first, last);
                    964: #endif
                    965: 
                    966:     if (first > last)
                    967:        return;
                    968: 
                    969:     picasso_has_invalid_lines = 1;
                    970:     if (first < picasso_invalid_start)
                    971:        picasso_invalid_start = first;
                    972:     if (last > picasso_invalid_stop)
                    973:        picasso_invalid_stop = last;
                    974: 
                    975:     while (first <= last)
                    976:     {
                    977:        picasso_invalid_lines[first] = 1;
                    978:        first++;
                    979:     }
                    980: }
                    981: 
                    982: int DX_BitsPerCannon (void)
                    983: {
                    984:     return 8;
                    985: }
                    986: 
                    987: static int palette_update_start=256;
                    988: static int palette_update_end=0;
                    989: 
                    990: void DX_SetPalette (int start, int count)
                    991: {
                    992: #ifdef DEBUG
                    993:     fprintf(stderr, "Function: DX_SetPalette_real\n");
                    994: #endif
                    995: 
                    996:     if (! screen_is_picasso || picasso96_state.RGBFormat != RGBFB_CHUNKY)
                    997:        return;
                    998: 
                    999:     if (picasso_vidinfo.pixbytes != 1)
                   1000:     {
                   1001:        /* This is the case when we're emulating a 256 color display.  */
                   1002:        while (count-- > 0)
                   1003:        {
                   1004:            int r = picasso96_state.CLUT[start].Red;
                   1005:            int g = picasso96_state.CLUT[start].Green;
                   1006:            int b = picasso96_state.CLUT[start].Blue;
                   1007:            picasso_vidinfo.clut[start++] = (doMask256 (r, red_bits, red_shift)
                   1008:                                             | doMask256 (g, green_bits, green_shift)
                   1009:                                             | doMask256 (b, blue_bits, blue_shift));
                   1010:        }
                   1011:        return;
                   1012:     }
                   1013: 
                   1014:     while (count-- > 0)
                   1015:     {
                   1016: #if 0
                   1017:        XColor col = parsed_xcolors[start];
                   1018:        col.red = picasso96_state.CLUT[start].Red * 0x0101;
                   1019:        col.green = picasso96_state.CLUT[start].Green * 0x0101;
                   1020:        col.blue = picasso96_state.CLUT[start].Blue * 0x0101;
                   1021:        XStoreColor (display, cmap, &col);
                   1022: #endif
                   1023:        start++;
                   1024:     }
                   1025: }
                   1026: 
                   1027: int DX_FillResolutions (uae_u16 *ppixel_format)
                   1028: {
                   1029:     int i, count = 0;
                   1030:     int w = 0;
                   1031:     int h = 0;
                   1032:     int emulate_chunky = 0;
                   1033: 
                   1034: #ifdef DEBUG
                   1035:     fprintf(stderr, "Function: DX_FillResolutions\n");
                   1036: #endif
                   1037: 
                   1038:     /* Find out, which is the highest resolution the SDL can offer */
                   1039:     for (i = MAX_SCREEN_MODES-1; i>=0; i--)
                   1040:     {
                   1041:        if (bitdepth == SDL_VideoModeOK(x_size_table[i], y_size_table[i], bitdepth, SDL_SWSURFACE))
                   1042:        {
                   1043:            w = x_size_table[i];
                   1044:            h = y_size_table[i];
                   1045:            break;
                   1046:        }
                   1047:     }
                   1048: 
                   1049: #ifdef DEBUG
                   1050:     fprintf(stderr, "Max. Picasso screen size: %d x %d\n", w, h);
                   1051: #endif
                   1052: 
                   1053:     picasso_vidinfo.rgbformat = (bit_unit == 8 ? RGBFB_CHUNKY
                   1054:                                 : bitdepth == 15 && bit_unit == 16 ? RGBFB_R5G5B5PC
                   1055:                                 : bitdepth == 16 && bit_unit == 16 ? RGBFB_R5G6B5PC
                   1056:                                 : bit_unit == 24 ? RGBFB_B8G8R8
                   1057:                                 : bit_unit == 32 ? RGBFB_B8G8R8A8
                   1058:                                 : RGBFB_NONE);
                   1059: 
                   1060:     *ppixel_format = 1 << picasso_vidinfo.rgbformat;
                   1061:     if (bit_unit == 16 || bit_unit == 32)
                   1062:     {
                   1063:        *ppixel_format |= RGBFF_CHUNKY;
                   1064:        emulate_chunky = 1;
                   1065:     }
                   1066: 
                   1067:     for (i = 0; i < MAX_SCREEN_MODES && count < MAX_PICASSO_MODES; i++)
                   1068:     {
                   1069:        int j;
                   1070:        for (j = 0; j <= emulate_chunky && count < MAX_PICASSO_MODES; j++)
                   1071:        {
                   1072:            if (x_size_table[i] <= w && y_size_table[i] <= h)
                   1073:            {
                   1074:                if (x_size_table[i] > picasso_maxw)
                   1075:                    picasso_maxw = x_size_table[i];
                   1076:                if (y_size_table[i] > picasso_maxh)
                   1077:                    picasso_maxh = y_size_table[i];
                   1078:                DisplayModes[count].res.width = x_size_table[i];
                   1079:                DisplayModes[count].res.height = y_size_table[i];
                   1080:                DisplayModes[count].depth = j == 1 ? 1 : bit_unit >> 3;
                   1081:                DisplayModes[count].refresh = 75;
                   1082: #ifdef DEBUG
                   1083:                fprintf(stderr, "Picasso resolution %d x %d @ %d allowed\n", DisplayModes[count].res.width, DisplayModes[count].res.height, DisplayModes[count].depth);
                   1084: #endif
                   1085: 
                   1086:                count++;
                   1087:            }
                   1088:        }
                   1089:     }
                   1090: #ifdef DEBUG
                   1091:     fprintf(stderr, "Max. Picasso screen size: %d x %d\n", picasso_maxw, picasso_maxh);
                   1092: #endif
                   1093:     return count;
                   1094: }
                   1095: 
                   1096: static void set_window_for_picasso (void)
                   1097: {
                   1098: #ifdef DEBUG
                   1099:     fprintf(stderr, "Function: set_window_for_picasso\n");
                   1100: #endif
                   1101: 
                   1102:     if (current_width == picasso_vidinfo.width && current_height == picasso_vidinfo.height)
                   1103:                return;
                   1104: 
                   1105:     current_width = picasso_vidinfo.width;
                   1106:     current_height = picasso_vidinfo.height;
                   1107: //     XResizeWindow (display, mywin, current_width, current_height);
                   1108: }
                   1109: 
                   1110: void gfx_set_picasso_modeinfo (int w, int h, int depth, int rgbfmt)
                   1111: {
                   1112: #ifdef DEBUG
                   1113:     fprintf(stderr, "Function: gfx_set_picasso_modeinfo w: %i h: %i depth: %i rgbfmt: %i\n",w, h, depth, rgbfmt);
                   1114: #endif
                   1115: 
                   1116:     picasso_vidinfo.width = w;
                   1117:     picasso_vidinfo.height = h;
                   1118:     picasso_vidinfo.depth = depth;
                   1119:     picasso_vidinfo.pixbytes = bit_unit >> 3;
                   1120:     if (screen_is_picasso)
                   1121:        set_window_for_picasso();
                   1122: }
                   1123: 
                   1124: void gfx_set_picasso_baseaddr (uaecptr a)
                   1125: {
                   1126: }
                   1127: 
                   1128: void gfx_set_picasso_state (int on)
                   1129: {
                   1130: #ifdef DEBUG
                   1131:     fprintf(stderr, "Function: gfx_set_picasso_state\n");
                   1132: #endif
                   1133: 
                   1134:     if (on == screen_is_picasso)
                   1135:        return;
                   1136:     graphics_subshutdown ();
                   1137:     screen_is_picasso = on;
                   1138:     if (on)
                   1139:     {
                   1140:        // Set height, width for Picasso gfx
                   1141:        current_width = picasso_vidinfo.width;
                   1142:        current_height = picasso_vidinfo.height;
                   1143:     }
                   1144:     else
                   1145:     {
                   1146:        // Set height, width for Amiga gfx
                   1147:        current_width = gfxvidinfo.width;
                   1148:        current_height = gfxvidinfo.height;
                   1149:     }
                   1150:     graphics_subinit ();
                   1151:     if (on)
                   1152:        DX_SetPalette (0, 256);
                   1153: }
                   1154: 
                   1155: uae_u8 *gfx_lock_picasso (void)
                   1156: {
                   1157: #ifdef DEBUG
                   1158:     fprintf(stderr, "Function: gfx_lock_picasso\n");
                   1159: #endif
                   1160:     SDL_LockSurface(prSDLScreen);
                   1161:     return prSDLScreen->pixels;
                   1162: }
                   1163: 
                   1164: void gfx_unlock_picasso (void)
                   1165: {
                   1166: #ifdef DEBUG
                   1167:     fprintf(stderr, "Function: gfx_unlock_picasso\n");
                   1168: #endif
                   1169:     SDL_UnlockSurface(prSDLScreen);
                   1170: }
                   1171: #endif
                   1172: 
                   1173: int lockscr (void)
                   1174: {
                   1175: #ifdef DEBUG
                   1176:     fprintf(stderr, "Function: lockscr\n");
                   1177: #endif
                   1178:     SDL_LockSurface(prSDLScreen);
                   1179:     return 1;
                   1180: }
                   1181: 
                   1182: void unlockscr (void)
                   1183: {
                   1184: #ifdef DEBUG
                   1185:     fprintf(stderr, "Function: unlockscr\n");
                   1186: #endif
                   1187:     SDL_UnlockSurface(prSDLScreen);
                   1188: }
                   1189: 
                   1190: static void handle_mousegrab (void)
                   1191: {
                   1192:     if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF)
                   1193:     {
                   1194:        SDL_WM_GrabInput(SDL_GRAB_ON);
                   1195:        SDL_WarpMouse(0, 0);
                   1196:     }
                   1197:     else
                   1198:     {
                   1199:        SDL_WM_GrabInput(SDL_GRAB_OFF);
                   1200:     }
                   1201: }
                   1202: 
                   1203: static void handle_inhibit (void)
                   1204: {
                   1205:     toggle_inhibit_frame (IHF_SCROLLLOCK);
                   1206: }
                   1207: 
                   1208: 
                   1209: static void handle_interpol (void)
                   1210: {
                   1211:     if (currprefs.sound_interpol == 0)
                   1212:     {
                   1213:        currprefs.sound_interpol = 1;
                   1214:        printf ("Interpol on: rh\n");
                   1215:     }
                   1216:     else if (currprefs.sound_interpol == 1)
                   1217:     {
                   1218:        currprefs.sound_interpol = 2;
                   1219:        printf ("Interpol on: crux\n");
                   1220:     }
                   1221:     else
                   1222:     {
                   1223:        currprefs.sound_interpol = 0;
                   1224:        printf ("Interpol off\n");
                   1225:     }
                   1226: }
                   1227: 
                   1228: static void framerate_up (void)
                   1229: {
                   1230:     if (currprefs.gfx_framerate < 20)
                   1231:        changed_prefs.gfx_framerate = currprefs.gfx_framerate + 1;
                   1232: }
                   1233: 
                   1234: static void framerate_down (void)
                   1235: {
                   1236:     if (currprefs.gfx_framerate > 1)
                   1237:        changed_prefs.gfx_framerate = currprefs.gfx_framerate - 1;
                   1238: }
                   1239: 
                   1240: void target_save_options (FILE *f, struct uae_prefs *p)
                   1241: {
                   1242: }
                   1243: 
                   1244: int target_parse_option (struct uae_prefs *p, char *option, char *value)
                   1245: {
                   1246:     return 0;
                   1247: }

unix.superglobalmegacorp.com

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