SDL_nxevents.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     Copyright (C) 2001  Hsieh-Fu Tsai
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 of the License, or (at your option) any later version.
  9.     This library is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.     Library General Public License for more details.
  13.     You should have received a copy of the GNU Library General Public
  14.     License along with this library; if not, write to the Free
  15.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  16.     Sam Lantinga
  17.     slouken@libsdl.org
  18.     
  19.     Hsieh-Fu Tsai
  20.     clare@setabox.com
  21. */
  22. #include "SDL_keysym.h"
  23. #include "SDL_events_c.h"
  24. #include "SDL_nxevents_c.h"
  25. #include "SDL_nximage_c.h"
  26. // The translation tables from a nanox keysym to a SDL keysym
  27. static SDLKey NX_NONASCII_keymap [MWKEY_LAST + 1] ;
  28. void NX_InitOSKeymap (_THIS)
  29. {
  30.     int i ;
  31.     Dprintf ("enter NX_InitOSKeymapn") ;
  32.     // Map the nanox scancodes to SDL keysyms
  33.     for (i = 0; i < SDL_TABLESIZE (NX_NONASCII_keymap); ++ i)
  34.         NX_NONASCII_keymap [i] = SDLK_UNKNOWN ;
  35.     NX_NONASCII_keymap [MWKEY_LEFT        & 0xFF] = SDLK_LEFT ;
  36.     NX_NONASCII_keymap [MWKEY_RIGHT       & 0xFF] = SDLK_RIGHT ;
  37.     NX_NONASCII_keymap [MWKEY_UP          & 0xFF] = SDLK_UP ;
  38.     NX_NONASCII_keymap [MWKEY_DOWN        & 0xFF] = SDLK_DOWN ;
  39.     NX_NONASCII_keymap [MWKEY_INSERT      & 0xFF] = SDLK_INSERT ;
  40.     NX_NONASCII_keymap [MWKEY_DELETE      & 0xFF] = SDLK_DELETE ;
  41.     NX_NONASCII_keymap [MWKEY_HOME        & 0xFF] = SDLK_HOME ;
  42.     NX_NONASCII_keymap [MWKEY_END         & 0xFF] = SDLK_END ;
  43.     NX_NONASCII_keymap [MWKEY_PAGEUP      & 0xFF] = SDLK_PAGEUP ;
  44.     NX_NONASCII_keymap [MWKEY_PAGEDOWN    & 0xFF] = SDLK_PAGEDOWN ;
  45.     NX_NONASCII_keymap [MWKEY_KP0         & 0xFF] = SDLK_KP0 ;
  46.     NX_NONASCII_keymap [MWKEY_KP1         & 0xFF] = SDLK_KP1 ;
  47.     NX_NONASCII_keymap [MWKEY_KP2         & 0xFF] = SDLK_KP2 ;
  48.     NX_NONASCII_keymap [MWKEY_KP3         & 0xFF] = SDLK_KP3 ;
  49.     NX_NONASCII_keymap [MWKEY_KP4         & 0xFF] = SDLK_KP4 ;
  50.     NX_NONASCII_keymap [MWKEY_KP5         & 0xFF] = SDLK_KP5 ;
  51.     NX_NONASCII_keymap [MWKEY_KP6         & 0xFF] = SDLK_KP6 ;
  52.     NX_NONASCII_keymap [MWKEY_KP7         & 0xFF] = SDLK_KP7 ;
  53.     NX_NONASCII_keymap [MWKEY_KP8         & 0xFF] = SDLK_KP8 ;
  54.     NX_NONASCII_keymap [MWKEY_KP9         & 0xFF] = SDLK_KP9 ;
  55.     NX_NONASCII_keymap [MWKEY_KP_PERIOD   & 0xFF] = SDLK_KP_PERIOD ;
  56.     NX_NONASCII_keymap [MWKEY_KP_DIVIDE   & 0xFF] = SDLK_KP_DIVIDE ;
  57.     NX_NONASCII_keymap [MWKEY_KP_MULTIPLY & 0xFF] = SDLK_KP_MULTIPLY ;
  58.     NX_NONASCII_keymap [MWKEY_KP_MINUS    & 0xFF] = SDLK_KP_MINUS ;
  59.     NX_NONASCII_keymap [MWKEY_KP_PLUS     & 0xFF] = SDLK_KP_PLUS ;
  60.     NX_NONASCII_keymap [MWKEY_KP_ENTER    & 0xFF] = SDLK_KP_ENTER ;
  61.     NX_NONASCII_keymap [MWKEY_KP_EQUALS   & 0xFF] = SDLK_KP_EQUALS ;
  62.     NX_NONASCII_keymap [MWKEY_F1          & 0xFF] = SDLK_F1 ;
  63.     NX_NONASCII_keymap [MWKEY_F2          & 0xFF] = SDLK_F2 ;
  64.     NX_NONASCII_keymap [MWKEY_F3          & 0xFF] = SDLK_F3 ;
  65.     NX_NONASCII_keymap [MWKEY_F4          & 0xFF] = SDLK_F4 ;
  66.     NX_NONASCII_keymap [MWKEY_F5          & 0xFF] = SDLK_F5 ;
  67.     NX_NONASCII_keymap [MWKEY_F6          & 0xFF] = SDLK_F6 ;
  68.     NX_NONASCII_keymap [MWKEY_F7          & 0xFF] = SDLK_F7 ;
  69.     NX_NONASCII_keymap [MWKEY_F8          & 0xFF] = SDLK_F8 ;
  70.     NX_NONASCII_keymap [MWKEY_F9          & 0xFF] = SDLK_F9 ;
  71.     NX_NONASCII_keymap [MWKEY_F10         & 0xFF] = SDLK_F10 ;
  72.     NX_NONASCII_keymap [MWKEY_F11         & 0xFF] = SDLK_F11 ;
  73.     NX_NONASCII_keymap [MWKEY_F12         & 0xFF] = SDLK_F12 ;
  74.     NX_NONASCII_keymap [MWKEY_NUMLOCK     & 0xFF] = SDLK_NUMLOCK ;
  75.     NX_NONASCII_keymap [MWKEY_CAPSLOCK    & 0xFF] = SDLK_CAPSLOCK ;
  76.     NX_NONASCII_keymap [MWKEY_SCROLLOCK   & 0xFF] = SDLK_SCROLLOCK ;
  77.     NX_NONASCII_keymap [MWKEY_LSHIFT      & 0xFF] = SDLK_LSHIFT ;
  78.     NX_NONASCII_keymap [MWKEY_RSHIFT      & 0xFF] = SDLK_RSHIFT ;
  79.     NX_NONASCII_keymap [MWKEY_LCTRL       & 0xFF] = SDLK_LCTRL ;
  80.     NX_NONASCII_keymap [MWKEY_RCTRL       & 0xFF] = SDLK_RCTRL ;
  81.     NX_NONASCII_keymap [MWKEY_LALT        & 0xFF] = SDLK_LALT ;
  82.     NX_NONASCII_keymap [MWKEY_RALT        & 0xFF] = SDLK_RALT ;
  83.     NX_NONASCII_keymap [MWKEY_LMETA       & 0xFF] = SDLK_LMETA ;
  84.     NX_NONASCII_keymap [MWKEY_RMETA       & 0xFF] = SDLK_RMETA ;
  85.     NX_NONASCII_keymap [MWKEY_ALTGR       & 0xFF] = SDLK_MODE ;
  86.     NX_NONASCII_keymap [MWKEY_PRINT       & 0xFF] = SDLK_PRINT ;
  87.     NX_NONASCII_keymap [MWKEY_SYSREQ      & 0xFF] = SDLK_SYSREQ ;
  88.     NX_NONASCII_keymap [MWKEY_PAUSE       & 0xFF] = SDLK_PAUSE ;
  89.     NX_NONASCII_keymap [MWKEY_BREAK       & 0xFF] = SDLK_BREAK ;
  90.     NX_NONASCII_keymap [MWKEY_MENU        & 0xFF] = SDLK_MENU ;
  91.     Dprintf ("leave NX_InitOSKeymapn") ;
  92. }
  93. SDL_keysym * NX_TranslateKey (GR_EVENT_KEYSTROKE * keystroke, SDL_keysym * keysym)
  94. {
  95.     GR_KEY ch = keystroke -> ch ;
  96.     Dprintf ("enter NX_TranslateKeyn") ;
  97.     keysym -> scancode = keystroke -> scancode ;
  98.     keysym -> sym = SDLK_UNKNOWN ;
  99.     if (ch & MWKEY_NONASCII_MASK) {
  100.         keysym -> sym = NX_NONASCII_keymap [ch & 0xFF] ;
  101.     } else {
  102.         keysym -> sym = ch & 0x7F ;
  103.     }
  104.     keysym -> mod = KMOD_NONE ;
  105.     
  106. #if 1   //   Retrieve more mode information
  107.     {
  108.         GR_KEYMOD   mod = keystroke -> modifiers ;
  109.         if (mod & MWKMOD_LSHIFT)
  110.             keysym -> mod |= KMOD_LSHIFT ;
  111.         if (mod & MWKMOD_RSHIFT)
  112.             keysym -> mod |= KMOD_RSHIFT ;
  113.         if (mod & MWKMOD_LCTRL)
  114.             keysym -> mod |= KMOD_LCTRL ;
  115.         if (mod & MWKMOD_RCTRL)
  116.             keysym -> mod |= KMOD_RCTRL ;
  117.         if (mod & MWKMOD_LALT)
  118.             keysym -> mod |= KMOD_LALT ;
  119.         if (mod & MWKMOD_RALT)
  120.             keysym -> mod |= KMOD_RALT ;
  121.         if (mod & MWKMOD_LMETA)
  122.             keysym -> mod |= KMOD_LMETA ;
  123.         if (mod & MWKMOD_RMETA)
  124.             keysym -> mod |= KMOD_RMETA ;
  125.         if (mod & MWKMOD_NUM)
  126.             keysym -> mod |= KMOD_NUM ;
  127.         if (mod & MWKMOD_CAPS)
  128.             keysym -> mod |= KMOD_CAPS ;
  129.         if (mod & MWKMOD_ALTGR)
  130.             keysym -> mod |= KMOD_MODE ;
  131.     }
  132. #endif
  133.     keysym -> unicode = ch ;
  134.     Dprintf ("leave NX_TranslateKeyn") ;
  135.     return keysym ;
  136. }
  137. static int check_boundary (_THIS, int x, int y)
  138. {
  139.     if (x < OffsetX || y < OffsetY || x > OffsetX + this -> screen -> w ||
  140.         y > OffsetY + this -> screen -> h)
  141.         return 0 ;
  142.             
  143.     return 1 ;
  144. }
  145. void NX_PumpEvents (_THIS)
  146. {
  147.     GR_EVENT         event ;
  148.     static GR_BUTTON last_button_down = 0 ;
  149.     GrCheckNextEvent (& event) ;
  150.     while (event.type != GR_EVENT_TYPE_NONE) {
  151.         // dispatch event
  152.         switch (event.type) {
  153.             case GR_EVENT_TYPE_MOUSE_ENTER :
  154.             {
  155.                 Dprintf ("mouse entern") ;
  156.                 SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS) ;
  157.                 break ;
  158.             }
  159.             case GR_EVENT_TYPE_MOUSE_EXIT :
  160.             {
  161.                 Dprintf ("mouse exitn") ;
  162.                 SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS) ;
  163.                 break ;
  164.             }
  165.             case GR_EVENT_TYPE_FOCUS_IN :
  166.             {
  167.                 Dprintf ("focus inn") ;
  168.                 SDL_PrivateAppActive (1, SDL_APPINPUTFOCUS) ;
  169.                 break ;
  170.             }
  171.             case GR_EVENT_TYPE_FOCUS_OUT :
  172.             {
  173.                 Dprintf ("focus outn") ;
  174.                 SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS) ;
  175.                 break ;
  176.             }
  177.             case GR_EVENT_TYPE_MOUSE_MOTION :
  178.             {               
  179.                 Dprintf ("mouse motionn") ;
  180.                 if (SDL_VideoSurface) {
  181.                     if (currently_fullscreen) {
  182.                         if (check_boundary (this, event.button.x, event.button.y)) {
  183.                             SDL_PrivateMouseMotion (0, 0, event.button.x - OffsetX, 
  184.                                 event.button.y - OffsetY) ;
  185.                         }
  186.                     } else {
  187.                         SDL_PrivateMouseMotion (0, 0, event.button.x, event.button.y) ;
  188.                     }
  189.                 }
  190.                 break ;
  191.             }
  192.             case GR_EVENT_TYPE_BUTTON_DOWN :
  193.             {
  194.                 int button = event.button.buttons ;
  195.                 
  196.                 Dprintf ("button downn") ;
  197.                 switch (button) {
  198.                     case MWBUTTON_L :
  199.                         button = 1 ;
  200.                         break ;
  201.                     case MWBUTTON_M :
  202.                         button = 2 ;
  203.                         break ;
  204.                     case MWBUTTON_R :
  205.                         button = 3 ;
  206.                         break ;
  207.                     default :
  208.                         button = 0 ;
  209.                 }
  210.                 last_button_down = button ;
  211.                 
  212.                 if (currently_fullscreen) {
  213.                     if (check_boundary (this, event.button.x, event.button.y)) {
  214.                         SDL_PrivateMouseButton (SDL_PRESSED, button, 
  215.                             event.button.x - OffsetX, event.button.y - OffsetY) ;
  216.                     }
  217.                 } else {
  218.                     SDL_PrivateMouseButton (SDL_PRESSED, button, 
  219.                         event.button.x, event.button.y) ;
  220.                 }
  221.                 break ;
  222.             }
  223.             // do not konw which button is released
  224.             case GR_EVENT_TYPE_BUTTON_UP :
  225.             {   
  226.                 Dprintf ("button upn") ;
  227.                 if (currently_fullscreen) {
  228.                     if (check_boundary (this, event.button.x, event.button.y)) {
  229.                         SDL_PrivateMouseButton (SDL_RELEASED, last_button_down, 
  230.                             event.button.x - OffsetX, event.button.y - OffsetY) ;
  231.                     }
  232.                 } else {
  233.                     SDL_PrivateMouseButton (SDL_RELEASED, last_button_down, 
  234.                         event.button.x, event.button.y) ;
  235.                 }
  236.                 last_button_down = 0 ;
  237.                 break ;
  238.             }
  239.             case GR_EVENT_TYPE_KEY_DOWN :
  240.             {
  241.                 SDL_keysym keysym ;
  242.                 Dprintf ("key downn") ;
  243.                 SDL_PrivateKeyboard (SDL_PRESSED,
  244.                     NX_TranslateKey (& event.keystroke, & keysym)) ;
  245.                 break ;
  246.             }
  247.             case GR_EVENT_TYPE_KEY_UP :
  248.             {
  249.                 SDL_keysym keysym ;
  250.                 Dprintf ("key upn") ;
  251.                 SDL_PrivateKeyboard (SDL_RELEASED,
  252.                     NX_TranslateKey (& event.keystroke, & keysym)) ;
  253.                 break ;
  254.             }
  255.             case GR_EVENT_TYPE_CLOSE_REQ :
  256.             {
  257.                 Dprintf ("close requiren") ;
  258.                 SDL_PrivateQuit () ;
  259.                 break ;
  260.             }
  261.             case GR_EVENT_TYPE_EXPOSURE :
  262.             {
  263.                 Dprintf ("event_type_exposuren") ;
  264.                 if (SDL_VideoSurface) {
  265.                     NX_RefreshDisplay (this) ;//, & event.exposure) ;
  266.                 }
  267.                 break ;
  268.             }
  269.             case GR_EVENT_TYPE_UPDATE :
  270.             {
  271.                 switch (event.update.utype) {
  272.                     case GR_UPDATE_MAP :
  273.                     {
  274.                         Dprintf ("GR_UPDATE_MAPn") ;
  275.                         // If we're not active, make ourselves active
  276.                         if (!(SDL_GetAppState () & SDL_APPACTIVE)) {
  277.                             // Send an internal activate event
  278.                             SDL_PrivateAppActive (1, SDL_APPACTIVE) ;
  279.                         }
  280.                         if (SDL_VideoSurface) {
  281.                             NX_RefreshDisplay (this) ;
  282.                         }
  283.                         break ;
  284.                     }
  285.                     
  286.                     case GR_UPDATE_UNMAP :
  287.                     case GR_UPDATE_UNMAPTEMP :
  288.                     {
  289.                         Dprintf ("GR_UPDATE_UNMAP or GR_UPDATE_UNMAPTEMPn") ;
  290.                         // If we're active, make ourselves inactive
  291.                         if (SDL_GetAppState () & SDL_APPACTIVE) {
  292.                             // Send an internal deactivate event
  293.                             SDL_PrivateAppActive (0, SDL_APPACTIVE | SDL_APPINPUTFOCUS) ;
  294.                         }
  295.                         break ; 
  296.                     }
  297.                     
  298.                     case GR_UPDATE_SIZE :
  299.                     {
  300.                         Dprintf ("GR_UPDATE_SIZEn") ;
  301.                         SDL_PrivateResize (event.update.width, event.update.height) ;
  302.                         break ; 
  303.                     }
  304.                     
  305.                     default :
  306.                         Dprintf ("unknown GR_EVENT_TYPE_UPDATEn") ;
  307.                         break ; 
  308.                 }
  309.                 break ; 
  310.             }
  311.                 
  312.             default :
  313.             {
  314.                 Dprintf ("pump event defaultn") ;
  315.             }
  316.         }
  317.         GrCheckNextEvent (& event) ;
  318.     }
  319. }