Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
  3.  *
  4.  * This file is part of libnsfb, http://www.netsurf-browser.org/
  5.  * Licenced under the MIT License,
  6.  *                http://www.opensource.org/licenses/mit-license.php
  7.  */
  8.  
  9. #include <stdbool.h>
  10. #include <stdlib.h>
  11. #include <SDL/SDL.h>
  12.  
  13. #include "libnsfb.h"
  14. #include "libnsfb_event.h"
  15. #include "libnsfb_plot.h"
  16. #include "libnsfb_plot_util.h"
  17.  
  18. #include "nsfb.h"
  19. #include "surface.h"
  20. #include "palette.h"
  21. #include "plot.h"
  22. #include "cursor.h"
  23.  
  24. enum nsfb_key_code_e sdl_nsfb_map[] = {
  25.     NSFB_KEY_UNKNOWN,
  26.     NSFB_KEY_UNKNOWN,
  27.     NSFB_KEY_UNKNOWN,
  28.     NSFB_KEY_UNKNOWN,
  29.     NSFB_KEY_UNKNOWN,
  30.     NSFB_KEY_UNKNOWN,
  31.     NSFB_KEY_UNKNOWN,
  32.     NSFB_KEY_UNKNOWN,
  33.     NSFB_KEY_BACKSPACE,
  34.     NSFB_KEY_TAB,
  35.     NSFB_KEY_UNKNOWN,
  36.     NSFB_KEY_UNKNOWN,
  37.     NSFB_KEY_CLEAR,
  38.     NSFB_KEY_RETURN,
  39.     NSFB_KEY_UNKNOWN,
  40.     NSFB_KEY_UNKNOWN,
  41.     NSFB_KEY_UNKNOWN,
  42.     NSFB_KEY_UNKNOWN,
  43.     NSFB_KEY_UNKNOWN,
  44.     NSFB_KEY_PAUSE,
  45.     NSFB_KEY_UNKNOWN,
  46.     NSFB_KEY_UNKNOWN,
  47.     NSFB_KEY_UNKNOWN,
  48.     NSFB_KEY_UNKNOWN,
  49.     NSFB_KEY_UNKNOWN,
  50.     NSFB_KEY_UNKNOWN,
  51.     NSFB_KEY_UNKNOWN,
  52.     NSFB_KEY_ESCAPE,
  53.     NSFB_KEY_UNKNOWN,
  54.     NSFB_KEY_UNKNOWN,
  55.     NSFB_KEY_UNKNOWN,
  56.     NSFB_KEY_UNKNOWN,
  57.     NSFB_KEY_SPACE,
  58.     NSFB_KEY_EXCLAIM,
  59.     NSFB_KEY_QUOTEDBL,
  60.     NSFB_KEY_HASH,
  61.     NSFB_KEY_DOLLAR,
  62.     NSFB_KEY_UNKNOWN,
  63.     NSFB_KEY_AMPERSAND,
  64.     NSFB_KEY_QUOTE,
  65.     NSFB_KEY_LEFTPAREN,
  66.     NSFB_KEY_RIGHTPAREN,
  67.     NSFB_KEY_ASTERISK,
  68.     NSFB_KEY_PLUS,
  69.     NSFB_KEY_COMMA,
  70.     NSFB_KEY_MINUS,
  71.     NSFB_KEY_PERIOD,
  72.     NSFB_KEY_SLASH,
  73.     NSFB_KEY_0,
  74.     NSFB_KEY_1,
  75.     NSFB_KEY_2,
  76.     NSFB_KEY_3,
  77.     NSFB_KEY_4,
  78.     NSFB_KEY_5,
  79.     NSFB_KEY_6,
  80.     NSFB_KEY_7,
  81.     NSFB_KEY_8,
  82.     NSFB_KEY_9,
  83.     NSFB_KEY_COLON,
  84.     NSFB_KEY_SEMICOLON,
  85.     NSFB_KEY_LESS,
  86.     NSFB_KEY_EQUALS,
  87.     NSFB_KEY_GREATER,
  88.     NSFB_KEY_QUESTION,
  89.     NSFB_KEY_AT,
  90.     NSFB_KEY_UNKNOWN,
  91.     NSFB_KEY_UNKNOWN,
  92.     NSFB_KEY_UNKNOWN,
  93.     NSFB_KEY_UNKNOWN,
  94.     NSFB_KEY_UNKNOWN,
  95.     NSFB_KEY_UNKNOWN,
  96.     NSFB_KEY_UNKNOWN,
  97.     NSFB_KEY_UNKNOWN,
  98.     NSFB_KEY_UNKNOWN,
  99.     NSFB_KEY_UNKNOWN,
  100.     NSFB_KEY_UNKNOWN,
  101.     NSFB_KEY_UNKNOWN,
  102.     NSFB_KEY_UNKNOWN,
  103.     NSFB_KEY_UNKNOWN,
  104.     NSFB_KEY_UNKNOWN,
  105.     NSFB_KEY_UNKNOWN,
  106.     NSFB_KEY_UNKNOWN,
  107.     NSFB_KEY_UNKNOWN,
  108.     NSFB_KEY_UNKNOWN,
  109.     NSFB_KEY_UNKNOWN,
  110.     NSFB_KEY_UNKNOWN,
  111.     NSFB_KEY_UNKNOWN,
  112.     NSFB_KEY_UNKNOWN,
  113.     NSFB_KEY_UNKNOWN,
  114.     NSFB_KEY_UNKNOWN,
  115.     NSFB_KEY_UNKNOWN,
  116.     NSFB_KEY_LEFTBRACKET,
  117.     NSFB_KEY_BACKSLASH,
  118.     NSFB_KEY_RIGHTBRACKET,
  119.     NSFB_KEY_CARET,
  120.     NSFB_KEY_UNDERSCORE,
  121.     NSFB_KEY_BACKQUOTE,
  122.     NSFB_KEY_a,
  123.     NSFB_KEY_b,
  124.     NSFB_KEY_c,
  125.     NSFB_KEY_d,
  126.     NSFB_KEY_e,
  127.     NSFB_KEY_f,
  128.     NSFB_KEY_g,
  129.     NSFB_KEY_h,
  130.     NSFB_KEY_i,
  131.     NSFB_KEY_j,
  132.     NSFB_KEY_k,
  133.     NSFB_KEY_l,
  134.     NSFB_KEY_m,
  135.     NSFB_KEY_n,
  136.     NSFB_KEY_o,
  137.     NSFB_KEY_p,
  138.     NSFB_KEY_q,
  139.     NSFB_KEY_r,
  140.     NSFB_KEY_s,
  141.     NSFB_KEY_t,
  142.     NSFB_KEY_u,
  143.     NSFB_KEY_v,
  144.     NSFB_KEY_w,
  145.     NSFB_KEY_x,
  146.     NSFB_KEY_y,
  147.     NSFB_KEY_z,
  148.     NSFB_KEY_UNKNOWN,
  149.     NSFB_KEY_UNKNOWN,
  150.     NSFB_KEY_UNKNOWN,
  151.     NSFB_KEY_UNKNOWN,
  152.     NSFB_KEY_DELETE,
  153.     NSFB_KEY_UNKNOWN,
  154.     NSFB_KEY_UNKNOWN,
  155.     NSFB_KEY_UNKNOWN,
  156.     NSFB_KEY_UNKNOWN,
  157.     NSFB_KEY_UNKNOWN,
  158.     NSFB_KEY_UNKNOWN,
  159.     NSFB_KEY_UNKNOWN,
  160.     NSFB_KEY_UNKNOWN,
  161.     NSFB_KEY_UNKNOWN,
  162.     NSFB_KEY_UNKNOWN,
  163.     NSFB_KEY_UNKNOWN,
  164.     NSFB_KEY_UNKNOWN,
  165.     NSFB_KEY_UNKNOWN,
  166.     NSFB_KEY_UNKNOWN,
  167.     NSFB_KEY_UNKNOWN,
  168.     NSFB_KEY_UNKNOWN,
  169.     NSFB_KEY_UNKNOWN,
  170.     NSFB_KEY_UNKNOWN,
  171.     NSFB_KEY_UNKNOWN,
  172.     NSFB_KEY_UNKNOWN,
  173.     NSFB_KEY_UNKNOWN,
  174.     NSFB_KEY_UNKNOWN,
  175.     NSFB_KEY_UNKNOWN,
  176.     NSFB_KEY_UNKNOWN,
  177.     NSFB_KEY_UNKNOWN,
  178.     NSFB_KEY_UNKNOWN,
  179.     NSFB_KEY_UNKNOWN,
  180.     NSFB_KEY_UNKNOWN,
  181.     NSFB_KEY_UNKNOWN,
  182.     NSFB_KEY_UNKNOWN,
  183.     NSFB_KEY_UNKNOWN,
  184.     NSFB_KEY_UNKNOWN,
  185.     NSFB_KEY_UNKNOWN,
  186.     NSFB_KEY_UNKNOWN,
  187.     NSFB_KEY_UNKNOWN,
  188.     NSFB_KEY_UNKNOWN,
  189.     NSFB_KEY_UNKNOWN,
  190.     NSFB_KEY_UNKNOWN,
  191.     NSFB_KEY_UNKNOWN,
  192.     NSFB_KEY_UNKNOWN,
  193.     NSFB_KEY_UNKNOWN,
  194.     NSFB_KEY_UNKNOWN,
  195.     NSFB_KEY_UNKNOWN,
  196.     NSFB_KEY_UNKNOWN,
  197.     NSFB_KEY_UNKNOWN,
  198.     NSFB_KEY_UNKNOWN,
  199.     NSFB_KEY_UNKNOWN,
  200.     NSFB_KEY_UNKNOWN,
  201.     NSFB_KEY_UNKNOWN,
  202.     NSFB_KEY_UNKNOWN,
  203.     NSFB_KEY_UNKNOWN,
  204.     NSFB_KEY_UNKNOWN,
  205.     NSFB_KEY_UNKNOWN,
  206.     NSFB_KEY_UNKNOWN,
  207.     NSFB_KEY_UNKNOWN,
  208.     NSFB_KEY_UNKNOWN,
  209.     NSFB_KEY_UNKNOWN,
  210.     NSFB_KEY_UNKNOWN,
  211.     NSFB_KEY_UNKNOWN,
  212.     NSFB_KEY_UNKNOWN,
  213.     NSFB_KEY_UNKNOWN,
  214.     NSFB_KEY_UNKNOWN,
  215.     NSFB_KEY_UNKNOWN,
  216.     NSFB_KEY_UNKNOWN,
  217.     NSFB_KEY_UNKNOWN,
  218.     NSFB_KEY_UNKNOWN,
  219.     NSFB_KEY_UNKNOWN,
  220.     NSFB_KEY_UNKNOWN,
  221.     NSFB_KEY_UNKNOWN,
  222.     NSFB_KEY_UNKNOWN,
  223.     NSFB_KEY_UNKNOWN,
  224.     NSFB_KEY_UNKNOWN,
  225.     NSFB_KEY_UNKNOWN,
  226.     NSFB_KEY_UNKNOWN,
  227.     NSFB_KEY_UNKNOWN,
  228.     NSFB_KEY_UNKNOWN,
  229.     NSFB_KEY_UNKNOWN,
  230.     NSFB_KEY_UNKNOWN,
  231.     NSFB_KEY_UNKNOWN,
  232.     NSFB_KEY_UNKNOWN,
  233.     NSFB_KEY_UNKNOWN,
  234.     NSFB_KEY_UNKNOWN,
  235.     NSFB_KEY_UNKNOWN,
  236.     NSFB_KEY_UNKNOWN,
  237.     NSFB_KEY_UNKNOWN,
  238.     NSFB_KEY_UNKNOWN,
  239.     NSFB_KEY_UNKNOWN,
  240.     NSFB_KEY_UNKNOWN,
  241.     NSFB_KEY_UNKNOWN,
  242.     NSFB_KEY_UNKNOWN,
  243.     NSFB_KEY_UNKNOWN,
  244.     NSFB_KEY_UNKNOWN,
  245.     NSFB_KEY_UNKNOWN,
  246.     NSFB_KEY_UNKNOWN,
  247.     NSFB_KEY_UNKNOWN,
  248.     NSFB_KEY_UNKNOWN,
  249.     NSFB_KEY_UNKNOWN,
  250.     NSFB_KEY_UNKNOWN,
  251.     NSFB_KEY_UNKNOWN,
  252.     NSFB_KEY_UNKNOWN,
  253.     NSFB_KEY_UNKNOWN,
  254.     NSFB_KEY_UNKNOWN,
  255.     NSFB_KEY_UNKNOWN,
  256.     NSFB_KEY_UNKNOWN,
  257.     NSFB_KEY_UNKNOWN,
  258.     NSFB_KEY_UNKNOWN,
  259.     NSFB_KEY_UNKNOWN,
  260.     NSFB_KEY_UNKNOWN,
  261.     NSFB_KEY_UNKNOWN,
  262.     NSFB_KEY_UNKNOWN,
  263.     NSFB_KEY_UNKNOWN,
  264.     NSFB_KEY_UNKNOWN,
  265.     NSFB_KEY_UNKNOWN,
  266.     NSFB_KEY_UNKNOWN,
  267.     NSFB_KEY_UNKNOWN,
  268.     NSFB_KEY_UNKNOWN,
  269.     NSFB_KEY_UNKNOWN,
  270.     NSFB_KEY_UNKNOWN,
  271.     NSFB_KEY_UNKNOWN,
  272.     NSFB_KEY_UNKNOWN,
  273.     NSFB_KEY_UNKNOWN,
  274.     NSFB_KEY_UNKNOWN,
  275.     NSFB_KEY_UNKNOWN,
  276.     NSFB_KEY_UNKNOWN,
  277.     NSFB_KEY_UNKNOWN,
  278.     NSFB_KEY_UNKNOWN,
  279.     NSFB_KEY_UNKNOWN,
  280.     NSFB_KEY_UNKNOWN,
  281.     NSFB_KEY_KP0,
  282.     NSFB_KEY_KP1,
  283.     NSFB_KEY_KP2,
  284.     NSFB_KEY_KP3,
  285.     NSFB_KEY_KP4,
  286.     NSFB_KEY_KP5,
  287.     NSFB_KEY_KP6,
  288.     NSFB_KEY_KP7,
  289.     NSFB_KEY_KP8,
  290.     NSFB_KEY_KP9,
  291.     NSFB_KEY_KP_PERIOD,
  292.     NSFB_KEY_KP_DIVIDE,
  293.     NSFB_KEY_KP_MULTIPLY,
  294.     NSFB_KEY_KP_MINUS,
  295.     NSFB_KEY_KP_PLUS,
  296.     NSFB_KEY_KP_ENTER,
  297.     NSFB_KEY_KP_EQUALS,
  298.     NSFB_KEY_UP,
  299.     NSFB_KEY_DOWN,
  300.     NSFB_KEY_RIGHT,
  301.     NSFB_KEY_LEFT,
  302.     NSFB_KEY_INSERT,
  303.     NSFB_KEY_HOME,
  304.     NSFB_KEY_END,
  305.     NSFB_KEY_PAGEUP,
  306.     NSFB_KEY_PAGEDOWN,
  307.     NSFB_KEY_F1,
  308.     NSFB_KEY_F2,
  309.     NSFB_KEY_F3,
  310.     NSFB_KEY_F4,
  311.     NSFB_KEY_F5,
  312.     NSFB_KEY_F6,
  313.     NSFB_KEY_F7,
  314.     NSFB_KEY_F8,
  315.     NSFB_KEY_F9,
  316.     NSFB_KEY_F10,
  317.     NSFB_KEY_F11,
  318.     NSFB_KEY_F12,
  319.     NSFB_KEY_F13,
  320.     NSFB_KEY_F14,
  321.     NSFB_KEY_F15,
  322.     NSFB_KEY_UNKNOWN,
  323.     NSFB_KEY_UNKNOWN,
  324.     NSFB_KEY_UNKNOWN,
  325.     NSFB_KEY_NUMLOCK,
  326.     NSFB_KEY_CAPSLOCK,
  327.     NSFB_KEY_SCROLLOCK,
  328.     NSFB_KEY_RSHIFT,
  329.     NSFB_KEY_LSHIFT,
  330.     NSFB_KEY_RCTRL,
  331.     NSFB_KEY_LCTRL,
  332.     NSFB_KEY_RALT,
  333.     NSFB_KEY_LALT,
  334.     NSFB_KEY_RMETA,
  335.     NSFB_KEY_LMETA,
  336.     NSFB_KEY_LSUPER,
  337.     NSFB_KEY_RSUPER,
  338.     NSFB_KEY_MODE,
  339.     NSFB_KEY_COMPOSE,
  340.     NSFB_KEY_HELP,
  341.     NSFB_KEY_PRINT,
  342.     NSFB_KEY_SYSREQ,
  343.     NSFB_KEY_BREAK,
  344.     NSFB_KEY_MENU,
  345.     NSFB_KEY_POWER,
  346.     NSFB_KEY_EURO,
  347.     NSFB_KEY_UNDO,
  348. };
  349.  
  350.  
  351. static void
  352. set_palette(nsfb_t *nsfb)
  353. {
  354.     SDL_Surface *sdl_screen = nsfb->surface_priv;
  355.     SDL_Color palette[256];
  356.     int loop = 0;
  357.  
  358.     /* Get libnsfb palette */
  359.     nsfb_palette_generate_nsfb_8bpp(nsfb->palette);
  360.  
  361.     /* Create SDL palette from nsfb palette */
  362.     for (loop = 0; loop < 256; loop++) {
  363.         palette[loop].r = (nsfb->palette->data[loop]      ) & 0xFF;
  364.         palette[loop].g = (nsfb->palette->data[loop] >>  8) & 0xFF;
  365.         palette[loop].b = (nsfb->palette->data[loop] >> 16) & 0xFF;
  366.     }
  367.  
  368.     /* Set SDL palette */
  369.     SDL_SetColors(sdl_screen, palette, 0, 256);
  370.  
  371. }
  372.  
  373. static bool
  374. sdlcopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox)
  375. {
  376.     SDL_Rect src;
  377.     SDL_Rect dst;
  378.     SDL_Surface *sdl_screen = nsfb->surface_priv;
  379.     nsfb_bbox_t allbox;
  380.     struct nsfb_cursor_s *cursor = nsfb->cursor;
  381.  
  382.     nsfb_plot_add_rect(srcbox, dstbox, &allbox);
  383.  
  384.     /* clear the cursor if its within the region to be altered */
  385.     if ((cursor != NULL) &&
  386.         (cursor->plotted == true) &&
  387.         (nsfb_plot_bbox_intersect(&allbox, &cursor->loc))) {
  388.         nsfb_cursor_clear(nsfb, cursor);
  389.     }
  390.  
  391.     src.x = srcbox->x0;
  392.     src.y = srcbox->y0;
  393.     src.w = srcbox->x1 - srcbox->x0;
  394.     src.h = srcbox->y1 - srcbox->y0;
  395.  
  396.     dst.x = dstbox->x0;
  397.     dst.y = dstbox->y0;
  398.     dst.w = dstbox->x1 - dstbox->x0;
  399.     dst.h = dstbox->y1 - dstbox->y0;
  400.  
  401.     SDL_BlitSurface(sdl_screen, &src, sdl_screen , &dst);
  402.  
  403.     if ((cursor != NULL) &&
  404.         (cursor->plotted == false)) {
  405.         nsfb_cursor_plot(nsfb, cursor);
  406.     }
  407.  
  408.     SDL_UpdateRect(sdl_screen, dst.x, dst.y, dst.w, dst.h);
  409.  
  410.     return true;
  411.  
  412. }
  413.  
  414. static int sdl_set_geometry(nsfb_t *nsfb, int width, int height,
  415.         enum nsfb_format_e format)
  416. {
  417.     if (nsfb->surface_priv != NULL)
  418.         return -1; /* fail if surface already initialised */
  419.  
  420.     nsfb->width = width;
  421.     nsfb->height = height;
  422.     nsfb->format = format;
  423.  
  424.     /* select default sw plotters for format */
  425.     select_plotters(nsfb);
  426.  
  427.     nsfb->plotter_fns->copy = sdlcopy;
  428.  
  429.     return 0;
  430. }
  431.  
  432. static int sdl_initialise(nsfb_t *nsfb)
  433. {
  434.     SDL_Surface *sdl_screen;
  435.     SDL_PixelFormat *sdl_fmt;
  436.     enum nsfb_format_e fmt;
  437.  
  438.     if (nsfb->surface_priv != NULL)
  439.         return -1;
  440.  
  441.     /* sanity checked depth. */
  442.     if ((nsfb->bpp != 32) && (nsfb->bpp != 16) && (nsfb->bpp != 8))
  443.         return -1;
  444.  
  445.        
  446.        
  447.     /* initialise SDL library */
  448.     if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO) < 0 ) {
  449.         fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
  450.         return -1;
  451.     }
  452.  
  453.     sdl_screen = SDL_SetVideoMode(nsfb->width,
  454.                                   nsfb->height,
  455.                                   nsfb->bpp,
  456.                                   SDL_SWSURFACE);
  457.  
  458.     if (sdl_screen == NULL ) {
  459.         fprintf(stderr, "Unable to set video: %s\n", SDL_GetError());
  460.         return -1;
  461.     }
  462.  
  463.     /* find out what pixel format we got */
  464.     sdl_fmt = sdl_screen->format;
  465.  
  466.     switch (sdl_fmt->BitsPerPixel) {
  467.     case 32:
  468.         if (sdl_fmt->Rshift == 0)
  469.             fmt = NSFB_FMT_XBGR8888;
  470.         else
  471.             fmt = NSFB_FMT_XRGB8888;
  472.         break;
  473.  
  474.     default:
  475.         fmt = nsfb->format;
  476.         break;
  477.     }
  478.  
  479.     /* If we didn't get what we asked for, reselect plotters */
  480.     if (nsfb->format != fmt) {
  481.         nsfb->format = fmt;
  482.  
  483.         if (sdl_set_geometry(nsfb, nsfb->width, nsfb->height,
  484.                 nsfb->format) != 0) {
  485.             return -1;
  486.         }
  487.     }
  488.  
  489.     nsfb->surface_priv = sdl_screen;
  490.  
  491.     if (nsfb->bpp == 8) {
  492.         nsfb_palette_new(&nsfb->palette, nsfb->width);
  493.         set_palette(nsfb);
  494.     }
  495.  
  496.     nsfb->ptr = sdl_screen->pixels;
  497.     nsfb->linelen = sdl_screen->pitch;
  498.  
  499.     SDL_ShowCursor(SDL_DISABLE);
  500.     SDL_EnableKeyRepeat(300, 50);
  501.  
  502.     return 0;
  503. }
  504.  
  505. static int sdl_finalise(nsfb_t *nsfb)
  506. {
  507.     nsfb=nsfb;
  508.     SDL_Quit();
  509.     return 0;
  510. }
  511.  
  512. static uint32_t wakeeventtimer(uint32_t ival, void *param)
  513. {
  514.     SDL_Event event;
  515.     ival = ival;
  516.     param = param;
  517.  
  518.     event.type = SDL_USEREVENT;
  519.     event.user.code = 0;
  520.     event.user.data1 = 0;
  521.     event.user.data2 = 0;
  522.    
  523.     SDL_PushEvent(&event);
  524.  
  525.     return 0;
  526. }
  527.  
  528. static bool sdl_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout)
  529. {
  530.     int got_event;
  531.     SDL_Event sdlevent;
  532.  
  533.     nsfb = nsfb; /* unused */
  534.  
  535.     //if (timeout == 0) {
  536.        got_event = SDL_PollEvent(&sdlevent);
  537.     /*}  else {
  538.         if (timeout > 0) {
  539.             /* setup wake timer to ensure the wait event below exits no later
  540.              * than when the timeout has occoured.
  541.              */
  542.       //      SDL_TimerID tid;
  543.       //      tid = SDL_AddTimer(timeout, wakeeventtimer, NULL);
  544.       //      got_event = SDL_WaitEvent(&sdlevent);
  545.       //      if ((got_event == 0) || (sdlevent.type != SDL_USEREVENT)) {
  546.       //          SDL_RemoveTimer(tid);
  547.       //      }
  548.       //  } else {
  549.           //  got_event = SDL_WaitEvent(&sdlevent);
  550.       //  }
  551.     //}
  552.  
  553.     /* Do nothing if there was no event */
  554.     if (got_event == 0) {
  555.         return false;
  556.     }
  557.  
  558.     event->type = NSFB_EVENT_NONE;
  559.  
  560.     switch (sdlevent.type) {
  561.     case SDL_KEYDOWN:
  562.         event->type = NSFB_EVENT_KEY_DOWN;
  563.         event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym];
  564.         break;
  565.  
  566.     case SDL_KEYUP:
  567.         event->type = NSFB_EVENT_KEY_UP;
  568.         event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym];
  569.         break;
  570.  
  571.     case SDL_MOUSEBUTTONDOWN:
  572.         event->type = NSFB_EVENT_KEY_DOWN;
  573.  
  574.         switch (sdlevent.button.button) {
  575.  
  576.         case SDL_BUTTON_LEFT:
  577.             event->value.keycode = NSFB_KEY_MOUSE_1;
  578.             break;
  579.  
  580.         case SDL_BUTTON_MIDDLE:
  581.             event->value.keycode = NSFB_KEY_MOUSE_2;
  582.             break;
  583.  
  584.         case SDL_BUTTON_RIGHT:
  585.             event->value.keycode = NSFB_KEY_MOUSE_3;
  586.             break;
  587.  
  588.         /*case SDL_BUTTON_WHEELUP:
  589.             event->value.keycode = NSFB_KEY_MOUSE_4;
  590.             break;
  591.  
  592.         case SDL_BUTTON_WHEELDOWN:
  593.             event->value.keycode = NSFB_KEY_MOUSE_5;
  594.             break;
  595.             */
  596.         }
  597.         break;
  598.  
  599.     case SDL_MOUSEBUTTONUP:
  600.         event->type = NSFB_EVENT_KEY_UP;
  601.  
  602.         switch (sdlevent.button.button) {
  603.  
  604.         case SDL_BUTTON_LEFT:
  605.             event->value.keycode = NSFB_KEY_MOUSE_1;
  606.             break;
  607.  
  608.         case SDL_BUTTON_MIDDLE:
  609.             event->value.keycode = NSFB_KEY_MOUSE_2;
  610.             break;
  611.  
  612.         case SDL_BUTTON_RIGHT:
  613.             event->value.keycode = NSFB_KEY_MOUSE_3;
  614.             break;
  615.  
  616.         /*case SDL_BUTTON_WHEELUP:
  617.             event->value.keycode = NSFB_KEY_MOUSE_4;
  618.             break;
  619.  
  620.         case SDL_BUTTON_WHEELDOWN:
  621.             event->value.keycode = NSFB_KEY_MOUSE_5;
  622.             break;*/
  623.         }
  624.         break;
  625.  
  626.     case SDL_MOUSEMOTION:
  627.         event->type = NSFB_EVENT_MOVE_ABSOLUTE;
  628.         event->value.vector.x = sdlevent.motion.x;
  629.         event->value.vector.y = sdlevent.motion.y;
  630.         event->value.vector.z = 0;
  631.         break;
  632.  
  633.     case SDL_QUIT:
  634.         event->type = NSFB_EVENT_CONTROL;
  635.         event->value.controlcode = NSFB_CONTROL_QUIT;
  636.         break;
  637.  
  638.     case SDL_USEREVENT:
  639.         event->type = NSFB_EVENT_CONTROL;
  640.         event->value.controlcode = NSFB_CONTROL_TIMEOUT;
  641.         break;
  642.  
  643.     }
  644.  
  645.     return true;
  646. }
  647.  
  648. static int sdl_claim(nsfb_t *nsfb, nsfb_bbox_t *box)
  649. {
  650.     struct nsfb_cursor_s *cursor = nsfb->cursor;
  651.  
  652.     if ((cursor != NULL) &&
  653.         (cursor->plotted == true) &&
  654.         (nsfb_plot_bbox_intersect(box, &cursor->loc))) {
  655.         nsfb_cursor_clear(nsfb, cursor);
  656.     }
  657.     return 0;
  658. }
  659.  
  660. static int
  661. sdl_cursor(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
  662. {
  663.     SDL_Surface *sdl_screen = nsfb->surface_priv;
  664.     nsfb_bbox_t redraw;
  665.     nsfb_bbox_t fbarea;
  666.  
  667.     if ((cursor != NULL) && (cursor->plotted == true)) {
  668.         nsfb_bbox_t loc_shift = cursor->loc;
  669.         loc_shift.x0 -= cursor->hotspot_x;
  670.         loc_shift.y0 -= cursor->hotspot_y;
  671.         loc_shift.x1 -= cursor->hotspot_x;
  672.         loc_shift.y1 -= cursor->hotspot_y;
  673.  
  674.         nsfb_plot_add_rect(&cursor->savloc, &loc_shift, &redraw);
  675.  
  676.         /* screen area */
  677.         fbarea.x0 = 0;
  678.         fbarea.y0 = 0;
  679.         fbarea.x1 = nsfb->width;
  680.         fbarea.y1 = nsfb->height;
  681.  
  682.         nsfb_plot_clip(&fbarea, &redraw);
  683.  
  684.         nsfb_cursor_clear(nsfb, cursor);
  685.  
  686.         nsfb_cursor_plot(nsfb, cursor);
  687.  
  688.         SDL_UpdateRect(sdl_screen,
  689.                        redraw.x0,
  690.                        redraw.y0,
  691.                        redraw.x1 - redraw.x0,
  692.                        redraw.y1 - redraw.y0);
  693.  
  694.  
  695.     }
  696.     return true;
  697. }
  698.  
  699.  
  700. static int sdl_update(nsfb_t *nsfb, nsfb_bbox_t *box)
  701. {
  702.     SDL_Surface *sdl_screen = nsfb->surface_priv;
  703.     struct nsfb_cursor_s *cursor = nsfb->cursor;
  704.  
  705.     if ((cursor != NULL) &&
  706.         (cursor->plotted == false)) {
  707.         nsfb_cursor_plot(nsfb, cursor);
  708.     }
  709.  
  710.     SDL_UpdateRect(sdl_screen,
  711.                    box->x0,
  712.                    box->y0,
  713.                    box->x1 - box->x0,
  714.                    box->y1 - box->y0);
  715.  
  716.     return 0;
  717. }
  718.  
  719. const nsfb_surface_rtns_t sdl_rtns = {
  720.     .initialise = sdl_initialise,
  721.     .finalise = sdl_finalise,
  722.     .input = sdl_input,
  723.     .claim = sdl_claim,
  724.     .update = sdl_update,
  725.     .cursor = sdl_cursor,
  726.     .geometry = sdl_set_geometry,
  727. };
  728.  
  729. NSFB_SURFACE_DEF(sdl, NSFB_SURFACE_SDL, &sdl_rtns)
  730.  
  731. /*
  732.  * Local variables:
  733.  *  c-basic-offset: 4
  734.  *  tab-width: 8
  735.  * End:
  736.  */
  737.