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