Subversion Repositories Kolibri OS

Rev

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

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