Usermode/libaxwin4 - Handle demarshal failure
[tpg/acess2.git] / AcessNative / acesskernel_src / ui_sdl.c
index 7e97cbe..a3e4d4b 100644 (file)
@@ -27,6 +27,7 @@ SDL_Thread    *gInputThread;
  int   giUI_Pitch = 0;
 tUI_KeybardCallback    gUI_KeyboardCallback;
 Uint32 gUI_Keymap[2][SDLK_LAST];       // Upper/Lower case
+ int   gbUpdateTriggered = 0;
 
 // === FUNCTIONS ===
 int UI_Initialise(int MaxWidth, int MaxHeight)
@@ -78,6 +79,7 @@ Uint32 UI_GetAcessKeyFromSDL(SDLKey Sym)
        case SDLK_0 ... SDLK_9:
                ret = Sym - SDLK_0 + KEYSYM_0;
                break;
+       case SDLK_SLASH:        ret = KEYSYM_SLASH;     break;
        case SDLK_CAPSLOCK:     ret = KEYSYM_CAPS;      break;
        case SDLK_TAB:  ret = KEYSYM_TAB;       break;
        case SDLK_UP:   ret = KEYSYM_UPARROW;   break;
@@ -105,6 +107,7 @@ Uint32 UI_GetAcessKeyFromSDL(SDLKey Sym)
        case SDLK_RCTRL:        ret = KEYSYM_RIGHTCTRL; break;
        case SDLK_RSHIFT:       ret = KEYSYM_RIGHTSHIFT;        break;
        case SDLK_RSUPER:       ret = KEYSYM_RIGHTGUI;  break;
+       case SDLK_BACKSPACE:    ret = KEYSYM_BACKSP;    break;
        default:
                printf("Unhandled key code %i\n", Sym);
                break;
@@ -130,56 +133,57 @@ void UI_MainLoop(void)
        SDL_Event       event;
        Uint32  acess_sym;
 
-       for( ;; )
+       while( SDL_WaitEvent(&event) )
        {
-               while(SDL_PollEvent(&event))
+               switch(event.type)
                {
-                       switch(event.type)
-                       {
-                       case SDL_QUIT:
-                               AcessNative_Exit();
-                               return ;
-                               
-                       case SDL_KEYDOWN:
-                               acess_sym = UI_GetAcessKeyFromSDL(event.key.keysym.sym);
-                               // Enter key on acess returns \n, but SDL returns \r
-                               if(event.key.keysym.sym == SDLK_RETURN)
-                                       event.key.keysym.unicode = '\n';                                
-
-                               if( gUI_KeyboardCallback ) {
-                                       gUI_KeyboardCallback(KEY_ACTION_RAWSYM|acess_sym);
-                                       gUI_KeyboardCallback(KEY_ACTION_PRESS|event.key.keysym.unicode);
-                               }
-                               break;
+               case SDL_QUIT:
+                       AcessNative_Exit();
+                       return ;
+                       
+               case SDL_KEYDOWN:
+                       acess_sym = UI_GetAcessKeyFromSDL(event.key.keysym.sym);
+                       // Enter key on acess returns \n, but SDL returns \r
+                       if(event.key.keysym.sym == SDLK_RETURN)
+                               event.key.keysym.unicode = '\n';                                
+
+                       if( gUI_KeyboardCallback ) {
+                               gUI_KeyboardCallback(KEY_ACTION_RAWSYM|acess_sym);
+                               gUI_KeyboardCallback(KEY_ACTION_PRESS|event.key.keysym.unicode);
+                       }
+                       break;
+               
+               case SDL_KEYUP:
+                       acess_sym = UI_GetAcessKeyFromSDL(event.key.keysym.sym);
                        
-                       case SDL_KEYUP:
-                               acess_sym = UI_GetAcessKeyFromSDL(event.key.keysym.sym);
-                               
-                               if( gUI_KeyboardCallback ) {
-                                       gUI_KeyboardCallback(KEY_ACTION_RAWSYM|acess_sym);
-                                       gUI_KeyboardCallback(KEY_ACTION_RELEASE|0);
-                               }
-                               break;
-
-                       case SDL_USEREVENT:
+                       if( gUI_KeyboardCallback ) {
+                               gUI_KeyboardCallback(KEY_ACTION_RAWSYM|acess_sym);
+                               gUI_KeyboardCallback(KEY_ACTION_RELEASE|0);
+                       }
+                       break;
+
+               case SDL_USEREVENT:
+                       if( gbUpdateTriggered )
+                       {
+                               gbUpdateTriggered = 0;
                                SDL_UpdateRect(gScreen, 0, 0, giUI_Width, giUI_Height);
                                SDL_Flip(gScreen);
-                               break;
-                       
-                       case SDL_MOUSEMOTION: {
-                               int abs[] = {event.motion.x, event.motion.y};
-                               int delta[] = {event.motion.xrel, event.motion.yrel};
-                               Mouse_HandleEvent(UI_GetButtonBits(SDL_GetMouseState(NULL, NULL)), delta, abs);
-                               break; }
-                       case SDL_MOUSEBUTTONUP:
-                       case SDL_MOUSEBUTTONDOWN: {
-                               int abs[] = {event.button.x, event.button.y};
-                               Mouse_HandleEvent(UI_GetButtonBits(SDL_GetMouseState(NULL, NULL)), NULL, abs);
-                               break; }
-       
-                       default:
-                               break;
                        }
+                       break;
+               
+               case SDL_MOUSEMOTION: {
+                       int abs[] = {event.motion.x, event.motion.y};
+                       int delta[] = {event.motion.xrel, event.motion.yrel};
+                       Mouse_HandleEvent(UI_GetButtonBits(SDL_GetMouseState(NULL, NULL)), delta, abs);
+                       break; }
+               case SDL_MOUSEBUTTONUP:
+               case SDL_MOUSEBUTTONDOWN: {
+                       int abs[] = {event.button.x, event.button.y};
+                       Mouse_HandleEvent(UI_GetButtonBits(SDL_GetMouseState(NULL, NULL)), NULL, abs);
+                       break; }
+
+               default:
+                       break;
                }
        }
 }
@@ -233,12 +237,16 @@ void UI_Redraw(void)
 {
        // TODO: Keep track of changed rectangle
 //     SDL_UpdateRect(gScreen, 0, 0, giUI_Width, giUI_Height);
-       SDL_Event       e;
+       if( gbUpdateTriggered == 0 )
+       {
+               gbUpdateTriggered = 1;
+               SDL_Event       e;
 
-       e.type = SDL_USEREVENT;
-       e.user.code = 0;
-       e.user.data1 = 0;
-       e.user.data2 = 0;       
+               e.type = SDL_USEREVENT;
+               e.user.code = 0;
+               e.user.data1 = 0;
+               e.user.data2 = 0;       
 
-       SDL_PushEvent( &e );
+               SDL_PushEvent( &e );
+       }
 }

UCC git Repository :: git.ucc.asn.au