Subversion Repositories Kolibri OS

Rev

Rev 6347 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include<menuet/os.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include "SDL.h"
  5. #include "SDL_sysevents.h"
  6. #include "SDL_sysvideo.h"
  7. #include "SDL_events_c.h"
  8. #include "SDL_menuetvideo.h"
  9.  
  10. extern void MenuetOS_SDL_RepaintWnd(void);
  11.  
  12. void MenuetOS_InitOSKeymap(_THIS)
  13. {
  14.         __asm__("int $0x40"::"a"(66),"b"(1),"c"(1));
  15. }
  16.  
  17. #define LSHIFT 1
  18. #define RSHIFT 2
  19. #define LCTRL 4
  20. #define RCTRL 8
  21. #define LALT 0x10
  22. #define RALT 0x20
  23. #define CAPS 0x40
  24. #define NUML 0x80
  25. #define SCRL 0x100
  26.  
  27. #define SHIFT (LSHIFT+RSHIFT)
  28. #define CTRL (LCTRL+RCTRL)
  29. #define ALT (LALT+RALT)
  30.  
  31. static SDLMod GetModState(void)
  32. {
  33.         unsigned controlstate;
  34.         __asm__("int $0x40":"=a"(controlstate):"a"(66),"b"(3));
  35.         SDLMod res = 0;
  36.         if (controlstate & LSHIFT)
  37.                 res |= KMOD_LSHIFT;
  38.         if (controlstate & RSHIFT)
  39.                 res |= KMOD_RSHIFT;
  40.         if (controlstate & LCTRL)
  41.                 res |= KMOD_LCTRL;
  42.         if (controlstate & RCTRL)
  43.                 res |= KMOD_RCTRL;
  44.         if (controlstate & LALT)
  45.                 res |= KMOD_LALT;
  46.         if (controlstate & RALT)
  47.                 res |= KMOD_RALT;
  48.         if (controlstate & CAPS)
  49.                 res |= KMOD_CAPS;
  50.         if (controlstate & NUML)
  51.                 res |= KMOD_NUM;
  52.         return res;
  53. }
  54.  
  55. /*static __u8 scan2ascii(__u8 n,SDLMod mod)
  56. {
  57.         __u8 layout[128];
  58.         int layouttype;
  59.         int bControlLayout = 0;
  60.         if (mod & KMOD_ALT)
  61.                 layouttype = 3;
  62.         else if (mod & KMOD_SHIFT)
  63.                 layouttype = 2;
  64.         else
  65.         {
  66.                 if (mod & KMOD_CTRL)
  67.                         bControlLayout = 1;
  68.                 layouttype = 1;
  69.         }
  70.         __asm__("int $0x40" :: "a"(26),"b"(2),"c"(layouttype),"d"(layout));
  71.         __u8 res = layout[n];
  72.         if (bControlLayout)
  73.                 res -= 0x60;
  74.         return res;
  75. }*/
  76. static SDLKey sdlkeys[0x80] =
  77. {
  78.         // 0x0*
  79.         0, SDLK_ESCAPE, SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5, SDLK_6,
  80.         SDLK_7, SDLK_8, SDLK_9, SDLK_0, SDLK_MINUS, SDLK_EQUALS, SDLK_BACKSPACE, SDLK_TAB,
  81.         // 0x1*
  82.         SDLK_q, SDLK_w, SDLK_e, SDLK_r, SDLK_t, SDLK_y, SDLK_u, SDLK_i,
  83.         SDLK_o, SDLK_p, SDLK_LEFTBRACKET, SDLK_RIGHTBRACKET, SDLK_RETURN, SDLK_LCTRL, SDLK_a, SDLK_s,
  84.         // 0x2*
  85.         SDLK_d, SDLK_f, SDLK_g, SDLK_h, SDLK_j, SDLK_k, SDLK_l, SDLK_SEMICOLON,
  86.         SDLK_QUOTE, SDLK_BACKQUOTE, SDLK_LSHIFT, SDLK_BACKSLASH, SDLK_z, SDLK_x, SDLK_c, SDLK_v,
  87.         // 0x3*
  88.         SDLK_b, SDLK_n, SDLK_m, SDLK_COMMA, SDLK_PERIOD, SDLK_SLASH, SDLK_RSHIFT, SDLK_KP_MULTIPLY,
  89.         SDLK_LALT, SDLK_SPACE, SDLK_CAPSLOCK, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5,
  90.         // 0x4*
  91.         SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9, SDLK_F10, SDLK_NUMLOCK, SDLK_SCROLLOCK, SDLK_KP7,
  92.         SDLK_KP8, SDLK_KP9, SDLK_KP_MINUS, SDLK_KP4, SDLK_KP5, SDLK_KP6, SDLK_KP_PLUS, SDLK_KP1,
  93.         // 0x5*
  94.         SDLK_KP2, SDLK_KP3, SDLK_KP0, SDLK_KP_PERIOD, 0, 0, 0, SDLK_F11,
  95.         SDLK_F12, 0, 0, 0, 0, 0, 0, 0,
  96.         // 0x6*
  97.         0, 0, 0, 0, 0, 0, 0, 0,
  98.         0, 0, 0, 0, 0, 0, 0, 0,
  99.         // 0x7*
  100.         0, 0, 0, 0, 0, 0, 0, 0,
  101.         0, 0, 0, 0, 0, 0, 0, 0
  102. };
  103. static SDLKey sdlkeys_shift[0x80] =
  104. {
  105.         // 0x0*
  106.         0, SDLK_ESCAPE, SDLK_EXCLAIM, SDLK_AT, SDLK_HASH, SDLK_DOLLAR, '%', SDLK_CARET,
  107.         SDLK_AMPERSAND, SDLK_ASTERISK, SDLK_LEFTPAREN, SDLK_RIGHTPAREN, SDLK_UNDERSCORE, SDLK_PLUS, SDLK_BACKSPACE, SDLK_TAB,
  108.         // 0x1*
  109.         SDLK_q, SDLK_w, SDLK_e, SDLK_r, SDLK_t, SDLK_y, SDLK_u, SDLK_i,
  110.         SDLK_o, SDLK_p, '{', '}', SDLK_RETURN, SDLK_LCTRL, SDLK_a, SDLK_s,
  111.         // 0x2*
  112.         SDLK_d, SDLK_f, SDLK_g, SDLK_h, SDLK_j, SDLK_k, SDLK_l, SDLK_COLON,
  113.         SDLK_QUOTEDBL, '~', SDLK_LSHIFT, '|', SDLK_z, SDLK_x, SDLK_c, SDLK_v,
  114.         // 0x3*
  115.         SDLK_b, SDLK_n, SDLK_m, SDLK_LESS, SDLK_GREATER, SDLK_QUESTION, SDLK_RSHIFT, SDLK_KP_MULTIPLY,
  116.         SDLK_LALT, SDLK_SPACE, SDLK_CAPSLOCK, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5,
  117.         // 0x4*
  118.         SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9, SDLK_F10, SDLK_NUMLOCK, SDLK_SCROLLOCK, SDLK_KP7,
  119.         SDLK_KP8, SDLK_KP9, SDLK_KP_MINUS, SDLK_KP4, SDLK_KP5, SDLK_KP6, SDLK_KP_PLUS, SDLK_KP1,
  120.         // 0x5*
  121.         SDLK_KP2, SDLK_KP3, SDLK_KP0, SDLK_KP_PERIOD, 0, 0, 0, SDLK_F11,
  122.         SDLK_F12, 0, 0, 0, 0, 0, 0, 0,
  123.         // 0x6*
  124.         0, 0, 0, 0, 0, 0, 0, 0,
  125.         0, 0, 0, 0, 0, 0, 0, 0,
  126.         // 0x7*
  127.         0, 0, 0, 0, 0, 0, 0, 0,
  128.         0, 0, 0, 0, 0, 0, 0, 0
  129. };
  130. static SDLKey sdlkeys_e0[0x80] =
  131. {
  132.         // 0x0*
  133.         0, 0, 0, 0, 0, 0, 0, 0,
  134.         0, 0, 0, 0, 0, 0, 0, 0,
  135.         // 0x1*
  136.         0, 0, 0, 0, 0, 0, 0, 0,
  137.         0, 0, 0, 0, SDLK_KP_ENTER, SDLK_RCTRL, 0, 0,
  138.         // 0x2*
  139.         0, 0, 0, 0, 0, 0, 0, 0,
  140.         0, 0, 0, 0, 0, 0, 0, 0,
  141.         // 0x3*
  142.         0, 0, 0, 0, 0, SDLK_KP_DIVIDE, 0, SDLK_PRINT,
  143.         SDLK_RALT, 0, 0, 0, 0, 0, 0, 0,
  144.         // 0x4*
  145.         0, 0, 0, 0, 0, 0, 0, SDLK_HOME,
  146.         SDLK_UP, SDLK_PAGEUP, 0, SDLK_LEFT, 0, SDLK_RIGHT, 0, SDLK_END,
  147.         // 0x5*
  148.         SDLK_DOWN, SDLK_PAGEDOWN, SDLK_INSERT, SDLK_DELETE, 0, 0, 0, 0,
  149.         0, 0, 0, SDLK_LSUPER, SDLK_RSUPER, SDLK_MENU, 0, 0,
  150.         // 0x6*
  151.         0, 0, 0, 0, 0, 0, 0, 0,
  152.         0, 0, 0, 0, 0, 0, 0, 0,
  153.         // 0x7*
  154.         0, 0, 0, 0, 0, 0, 0, 0,
  155.         0, 0, 0, 0, 0, 0, 0, 0,
  156. };
  157.  
  158. extern void KolibriOS_CheckMouseMode(_THIS);
  159. void MenuetOS_PumpEvents(_THIS)
  160. {
  161.  int i;
  162.  SDL_keysym key;
  163.  static int ext_code=0;
  164.  static __u8 old_mode=0;
  165.  for (;;) {
  166.   i=__menuet__check_for_event();
  167.   switch(i)
  168.   {
  169.    case 0:
  170.     return;
  171.    case 1:
  172.     MenuetOS_SDL_RepaintWnd();
  173.     break;
  174.    case 2:
  175.     key.scancode = __menuet__getkey();
  176.     if (key.scancode == 0xE0 || key.scancode == 0xE1)
  177.     {ext_code=key.scancode;break;}
  178.     if (ext_code == 0xE1 && (key.scancode & 0x7F) == 0x1D) break;
  179.     if (ext_code == 0xE1 && key.scancode == 0xC5) {ext_code=0;break;}
  180.     key.mod = GetModState();
  181.     if (ext_code == 0xE1) key.mod &= ~KMOD_CTRL;
  182.     if (!(key.scancode&0x80))
  183.       old_mode = key.mod;
  184.     SDL_SetModState(key.mod);
  185.     int code = (key.scancode & 0x80) ? SDL_RELEASED : SDL_PRESSED;
  186.     key.scancode &= 0x7F;
  187. //    key.sym = scan2ascii(key.scancode,key.mod);
  188.     if (ext_code == 0xE1 && key.scancode == 0x45)
  189.         key.sym = SDLK_PAUSE;
  190.     else if (ext_code == 0xE0)
  191.         key.sym = sdlkeys_e0[key.scancode];
  192.     else if (old_mode & KMOD_SHIFT)
  193.         key.sym = sdlkeys_shift[key.scancode];
  194.     else
  195.         key.sym = sdlkeys[key.scancode];
  196.     ext_code = 0;
  197.     if (!key.sym) break;       
  198.     SDL_PrivateKeyboard(code,&key);
  199.     break;
  200.    case 3:
  201.     if(__menuet__get_button_id()==1) exit(0);
  202.     break;
  203.    case 6: {
  204.     int __tmp,mx,my;
  205.     static int oldmousestate = 0;
  206.     __asm__("int $0x40":"=a"(__tmp):"a"(37),"b"(1));
  207.     mx=(__tmp>>16);
  208.     my=(__tmp&0xffff);
  209.     if(mx>=0 && mx<this->hidden->win_size_x &&
  210.        my>=0 && my<this->hidden->win_size_y || this->input_grab != SDL_GRAB_OFF)
  211.     {
  212.      if (this->input_grab != SDL_GRAB_OFF)
  213.      {
  214.       int dx=mx-this->hidden->win_size_x/2;
  215.       int dy=my-this->hidden->win_size_y/2;
  216.       if (dx||dy)
  217.       {
  218.        SDL_PrivateMouseMotion(0,1,dx,dy);
  219.        KolibriOS_CheckMouseMode(this);
  220.       }
  221.      }
  222.      else
  223.       SDL_PrivateMouseMotion(0,0,mx,my);
  224.      __asm__("int $0x40":"=a"(__tmp):"a"(37),"b"(2));
  225.      if ((__tmp^oldmousestate)&1) {
  226.      if(__tmp&1)
  227.      {
  228.       SDL_PrivateMouseButton(SDL_PRESSED,SDL_BUTTON_LMASK,0,0);
  229.      } else {
  230.      SDL_PrivateMouseButton(SDL_RELEASED,SDL_BUTTON_LMASK,0,0);
  231.      } }
  232.      if ((__tmp^oldmousestate)&2) {
  233.      if(__tmp&2)
  234.      {
  235.       SDL_PrivateMouseButton(SDL_PRESSED,SDL_BUTTON_RMASK,0,0);
  236.      } else {
  237.      SDL_PrivateMouseButton(SDL_RELEASED,SDL_BUTTON_RMASK,0,0);
  238.      } }
  239.      oldmousestate = __tmp;
  240.     }
  241.    }
  242.   }
  243.  }
  244. }
  245.