VirtualBox

Changeset 1877 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 3, 2007 12:11:46 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
20115
Message:

FE/SDL: added support for Japanese and Brazilian keyboards

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp

    r1473 r1877  
    129129static bool    UseAbsoluteMouse(void);
    130130static void    ResetKeys(void);
    131 static uint8_t Keyevent2Keycode(const SDL_KeyboardEvent *ev);
    132131static void    ProcessKey(SDL_KeyboardEvent *ev);
    133132static void    InputGrabStart(void);
     
    25862585 * @param   ev SDL scancode
    25872586 */
    2588 static uint8_t Keyevent2KeycodeFallback(const SDL_KeyboardEvent *ev)
     2587static uint16_t Keyevent2KeycodeFallback(const SDL_KeyboardEvent *ev)
    25892588{
    25902589    const SDLKey sym = ev->keysym.sym;
     
    26332632        case SDLK_RIGHTBRACKET:     return 0x1b;
    26342633        case SDLK_RETURN:           return 0x1c;
    2635         case SDLK_KP_ENTER:         return 0x1c | 0x80;
     2634        case SDLK_KP_ENTER:         return 0x1c | 0x100;
    26362635        case SDLK_LCTRL:            return 0x1d;
    2637         case SDLK_RCTRL:            return 0x1d | 0x80;
     2636        case SDLK_RCTRL:            return 0x1d | 0x100;
    26382637        case SDLK_a:                return 0x1e;
    26392638        case SDLK_s:                return 0x1f;
     
    26712670        case SDLK_LALT:             return 0x38;
    26722671        case SDLK_MODE: /* alt gr*/
    2673         case SDLK_RALT:             return 0x38 | 0x80;
     2672        case SDLK_RALT:             return 0x38 | 0x100;
    26742673        case SDLK_SPACE:            return 0x39;
    26752674        case SDLK_CAPSLOCK:         return 0x3a;
     
    26882687        case SDLK_SCROLLOCK:        return 0x46;
    26892688        case SDLK_KP7:              return 0x47;
    2690         case SDLK_HOME:             return 0x47 | 0x80;
     2689        case SDLK_HOME:             return 0x47 | 0x100;
    26912690        case SDLK_KP8:              return 0x48;
    2692         case SDLK_UP:               return 0x48 | 0x80;
     2691        case SDLK_UP:               return 0x48 | 0x100;
    26932692        case SDLK_KP9:              return 0x49;
    2694         case SDLK_PAGEUP:           return 0x49 | 0x80;
     2693        case SDLK_PAGEUP:           return 0x49 | 0x100;
    26952694        case SDLK_KP_MINUS:         return 0x4a;
    26962695        case SDLK_KP4:              return 0x4b;
    2697         case SDLK_LEFT:             return 0x4b | 0x80;
     2696        case SDLK_LEFT:             return 0x4b | 0x100;
    26982697        case SDLK_KP5:              return 0x4c;
    26992698        case SDLK_KP6:              return 0x4d;
    2700         case SDLK_RIGHT:            return 0x4d | 0x80;
     2699        case SDLK_RIGHT:            return 0x4d | 0x100;
    27012700        case SDLK_KP_PLUS:          return 0x4e;
    27022701        case SDLK_KP1:              return 0x4f;
    2703         case SDLK_END:              return 0x4f | 0x80;
     2702        case SDLK_END:              return 0x4f | 0x100;
    27042703        case SDLK_KP2:              return 0x50;
    2705         case SDLK_DOWN:             return 0x50 | 0x80;
     2704        case SDLK_DOWN:             return 0x50 | 0x100;
    27062705        case SDLK_KP3:              return 0x51;
    2707         case SDLK_PAGEDOWN:         return 0x51 | 0x80;
     2706        case SDLK_PAGEDOWN:         return 0x51 | 0x100;
    27082707        case SDLK_KP0:              return 0x52;
    2709         case SDLK_INSERT:           return 0x52 | 0x80;
     2708        case SDLK_INSERT:           return 0x52 | 0x100;
    27102709        case SDLK_KP_PERIOD:        return 0x53;
    2711         case SDLK_DELETE:           return 0x53 | 0x80;
     2710        case SDLK_DELETE:           return 0x53 | 0x100;
    27122711        case SDLK_SYSREQ:           return 0x54;
    27132712        case SDLK_F11:              return 0x57;
     
    27152714        case SDLK_F13:              return 0x5b;
    27162715        case SDLK_LMETA:
    2717         case SDLK_LSUPER:           return 0x5b | 0x80;
     2716        case SDLK_LSUPER:           return 0x5b | 0x100;
    27182717        case SDLK_F14:              return 0x5c;
    27192718        case SDLK_RMETA:
    2720         case SDLK_RSUPER:           return 0x5c | 0x80;
     2719        case SDLK_RSUPER:           return 0x5c | 0x100;
    27212720        case SDLK_F15:              return 0x5d;
    2722         case SDLK_MENU:             return 0x5d | 0x80;
     2721        case SDLK_MENU:             return 0x5d | 0x100;
    27232722#if 0
    27242723        case SDLK_CLEAR:            return 0x;
     
    27452744 * @param   ev SDL scancode
    27462745 */
    2747 static uint8_t Keyevent2Keycode(const SDL_KeyboardEvent *ev)
     2746static uint16_t Keyevent2Keycode(const SDL_KeyboardEvent *ev)
    27482747{
    2749     int keycode;
    2750 
    27512748    // start with the scancode determined by SDL
    2752     keycode = ev->keysym.scancode;
     2749    int keycode = ev->keysym.scancode;
    27532750
    27542751#ifdef __LINUX__
    27552752    // workaround for SDL keyboard translation issues on Linux
    27562753    // keycodes > 0x80 are sent as 0xe0 keycode
    2757     static const uint8_t x_keycode_to_pc_keycode[61] =
    2758     {
    2759        0xc7,      /*  97  Home   */
    2760        0xc8,      /*  98  Up     */
    2761        0xc9,      /*  99  PgUp   */
    2762        0xcb,      /* 100  Left   */
    2763        0x4c,      /* 101  KP-5   */
    2764        0xcd,      /* 102  Right  */
    2765        0xcf,      /* 103  End    */
    2766        0xd0,      /* 104  Down   */
    2767        0xd1,      /* 105  PgDn   */
    2768        0xd2,      /* 106  Ins    */
    2769        0xd3,      /* 107  Del    */
    2770        0x9c,      /* 108  Enter  */
    2771        0x9d,      /* 109  Ctrl-R */
    2772        0x0,       /* 110  Pause  */
    2773        0xb7,      /* 111  Print  */
    2774        0xb5,      /* 112  Divide */
    2775        0xb8,      /* 113  Alt-R  */
    2776        0xc6,      /* 114  Break  */
    2777        0xdb,      /* 115  Win Left */
    2778        0xdc,      /* 116  Win Right */
    2779        0xdd,      /* 117  Win Menu */
    2780        0x0,       /* 118 */
    2781        0x0,       /* 119 */
    2782        0x70,      /* 120 Hiragana_Katakana */
    2783        0x0,       /* 121 */
    2784        0x0,       /* 122 */
    2785        0x73,      /* 123 backslash */
    2786        0x0,       /* 124 */
    2787        0x0,       /* 125 */
    2788        0x0,       /* 126 */
    2789        0x0,       /* 127 */
    2790        0x0,       /* 128 */
    2791        0x79,      /* 129 Henkan */
    2792        0x0,       /* 130 */
    2793        0x7b,      /* 131 Muhenkan */
    2794        0x0,       /* 132 */
    2795        0x7d,      /* 133 Yen */
    2796        0x0,       /* 134 */
    2797        0x0,       /* 135 */
    2798        0x47,      /* 136 KP_7 */
    2799        0x48,      /* 137 KP_8 */
    2800        0x49,      /* 138 KP_9 */
    2801        0x4b,      /* 139 KP_4 */
    2802        0x4c,      /* 140 KP_5 */
    2803        0x4d,      /* 141 KP_6 */
    2804        0x4f,      /* 142 KP_1 */
    2805        0x50,      /* 143 KP_2 */
    2806        0x51,      /* 144 KP_3 */
    2807        0x52,      /* 145 KP_0 */
    2808        0x53,      /* 146 KP_. */
    2809        0x47,      /* 147 KP_HOME */
    2810        0x48,      /* 148 KP_UP */
    2811        0x49,      /* 149 KP_PgUp */
    2812        0x4b,      /* 150 KP_Left */
    2813        0x4c,      /* 151 KP_ */
    2814        0x4d,      /* 152 KP_Right */
    2815        0x4f,      /* 153 KP_End */
    2816        0x50,      /* 154 KP_Down */
    2817        0x51,      /* 155 KP_PgDn */
    2818        0x52,      /* 156 KP_Ins */
    2819        0x53,      /* 157 KP_Del */
     2754    static const uint16_t x_keycode_to_pc_keycode[61] =
     2755    {
     2756       0x47|0x100,  /*  97  Home   */
     2757       0x48|0x100,  /*  98  Up     */
     2758       0x49|0x100,  /*  99  PgUp   */
     2759       0x4b|0x100,  /* 100  Left   */
     2760       0x4c,        /* 101  KP-5   */
     2761       0x4d|0x100,  /* 102  Right  */
     2762       0x4f|0x100,  /* 103  End    */
     2763       0x50|0x100,  /* 104  Down   */
     2764       0x51|0x100,  /* 105  PgDn   */
     2765       0x52|0x100,  /* 106  Ins    */
     2766       0x53|0x100,  /* 107  Del    */
     2767       0x1c|0x100,  /* 108  Enter  */
     2768       0x1d|0x100,  /* 109  Ctrl-R */
     2769       0x0,         /* 110  Pause  */
     2770       0x37|0x100,  /* 111  Print  */
     2771       0x35|0x100,  /* 112  Divide */
     2772       0x38|0x100,  /* 113  Alt-R  */
     2773       0x46|0x100,  /* 114  Break  */
     2774       0x5b|0x100,  /* 115  Win Left */
     2775       0x5c|0x100,  /* 116  Win Right */
     2776       0x5d|0x100,  /* 117  Win Menu */
     2777       0x0,         /* 118 */
     2778       0x0,         /* 119 */
     2779       0x0,         /* 120 */
     2780       0xf1,        /* 121  Korean Hangul to Latin?? */
     2781       0xf2,        /* 122  Korean Hangul to Hanja?? */
     2782       0x0,         /* 123 */
     2783       0x0,         /* 124 */
     2784       0x0,         /* 125 */
     2785       0x0,         /* 126 */
     2786       0x0,         /* 127 */
     2787       0x0,         /* 128 */
     2788       0x79,        /* 129  Japanese Henkan */
     2789       0x0,         /* 130 */
     2790       0x7b,        /* 131  Japanese Muhenkan */
     2791       0x0,         /* 132 */
     2792       0x7d,        /* 133  Japanese Yen */
     2793       0x7e,        /* 134  Brazilian keypad */
     2794       0x0,         /* 135 */
     2795       0x47,        /* 136 KP_7 */
     2796       0x48,        /* 137 KP_8 */
     2797       0x49,        /* 138 KP_9 */
     2798       0x4b,        /* 139 KP_4 */
     2799       0x4c,        /* 140 KP_5 */
     2800       0x4d,        /* 141 KP_6 */
     2801       0x4f,        /* 142 KP_1 */
     2802       0x50,        /* 143 KP_2 */
     2803       0x51,        /* 144 KP_3 */
     2804       0x52,        /* 145 KP_0 */
     2805       0x53,        /* 146 KP_. */
     2806       0x47,        /* 147 KP_HOME */
     2807       0x48,        /* 148 KP_UP */
     2808       0x49,        /* 149 KP_PgUp */
     2809       0x4b,        /* 150 KP_Left */
     2810       0x4c,        /* 151 KP_ */
     2811       0x4d,        /* 152 KP_Right */
     2812       0x4f,        /* 153 KP_End */
     2813       0x50,        /* 154 KP_Down */
     2814       0x51,        /* 155 KP_PgDn */
     2815       0x52,        /* 156 KP_Ins */
     2816       0x53,        /* 157 KP_Del */
    28202817    };
    28212818
     
    28342831        keycode = x_keycode_to_pc_keycode[keycode - 97];
    28352832    }
     2833    else if (keycode == 208)
     2834    {
     2835        // Japanese Hiragana to Katakana
     2836        keycode = 0x70;
     2837    }
     2838    else if (keycode == 211)
     2839    {
     2840        // Japanese backslash/underscore and Brazilian backslash/question mark
     2841        keycode = 0x73;
     2842    }
    28362843    else
    28372844    {
     
    28412848#elif defined(__DARWIN__)
    28422849    /* This is derived partially from SDL_QuartzKeys.h and partially from testing. */
    2843     static const uint8_t s_aMacToSet1[] =
     2850    static const uint16_t s_aMacToSet1[] =
    28442851    {
    28452852     /*  set-1            SDL_QuartzKeys.h    */
     
    28982905        0x9c,        /* QZ_IBOOK_ENTER  0x34 */
    28992906        0x01,        /* QZ_ESCAPE       0x35 */
    2900         0x5c|0x80,   /* QZ_RMETA        0x36 */
    2901         0x5b|0x80,   /* QZ_LMETA        0x37 */
     2907        0x5c|0x100,  /* QZ_RMETA        0x36 */
     2908        0x5b|0x100,  /* QZ_LMETA        0x37 */
    29022909        0x2a,        /* QZ_LSHIFT       0x38 */
    29032910        0x3a,        /* QZ_CAPSLOCK     0x39 */
     
    29052912        0x1d,        /* QZ_LCTRL        0x3B */
    29062913        0x36,        /* QZ_RSHIFT       0x3C */
    2907         0x38|0x80,   /* QZ_RALT         0x3D */
    2908         0x1d|0x80,   /* QZ_RCTRL        0x3E */
     2914        0x38|0x100,  /* QZ_RALT         0x3D */
     2915        0x1d|0x100,  /* QZ_RCTRL        0x3E */
    29092916           0,        /*                      */
    29102917           0,        /*                      */
     
    29192926           0,        /*                      */
    29202927           0,        /*                      */
    2921         0x35|0x80,   /* QZ_KP_DIVIDE    0x4B */
    2922         0x1c|0x80,   /* QZ_KP_ENTER     0x4C */
     2928        0x35|0x100,  /* QZ_KP_DIVIDE    0x4B */
     2929        0x1c|0x100,  /* QZ_KP_ENTER     0x4C */
    29232930           0,        /*                      */
    29242931        0x4a,        /* QZ_KP_MINUS     0x4E */
     
    29492956        0x57,        /* QZ_F11          0x67 */
    29502957           0,        /*                      */
    2951         0x37|0x80,   /* QZ_PRINT / F13  0x69 */
     2958        0x37|0x100,  /* QZ_PRINT / F13  0x69 */
    29522959        0x63,        /* QZ_F16          0x6A */
    29532960        0x46,        /* QZ_SCROLLOCK    0x6B */
    29542961           0,        /*                      */
    29552962        0x44,        /* QZ_F10          0x6D */
    2956         0x5d|0x80,   /*                      */
     2963        0x5d|0x100,  /*                      */
    29572964        0x58,        /* QZ_F12          0x6F */
    29582965           0,        /*                      */
    29592966           0/* 0xe1,0x1d,0x45*/, /* QZ_PAUSE        0x71 */
    2960         0x52|0x80,   /* QZ_INSERT / HELP 0x72 */
    2961         0x47|0x80,   /* QZ_HOME         0x73 */
    2962         0x49|0x80,   /* QZ_PAGEUP       0x74 */
    2963         0x53|0x80,   /* QZ_DELETE       0x75 */
     2967        0x52|0x100,  /* QZ_INSERT / HELP 0x72 */
     2968        0x47|0x100,  /* QZ_HOME         0x73 */
     2969        0x49|0x100,   /* QZ_PAGEUP       0x74 */
     2970        0x53|0x100,  /* QZ_DELETE       0x75 */
    29642971        0x3e,        /* QZ_F4           0x76 */
    2965         0x4f|0x80,   /* QZ_END          0x77 */
     2972        0x4f|0x100,  /* QZ_END          0x77 */
    29662973        0x3c,        /* QZ_F2           0x78 */
    2967         0x51|0x80,   /* QZ_PAGEDOWN     0x79 */
     2974        0x51|0x100,  /* QZ_PAGEDOWN     0x79 */
    29682975        0x3b,        /* QZ_F1           0x7A */
    2969         0x4b|0x80,   /* QZ_LEFT         0x7B */
    2970         0x4d|0x80,   /* QZ_RIGHT        0x7C */
    2971         0x50|0x80,   /* QZ_DOWN         0x7D */
    2972         0x48|0x80,   /* QZ_UP           0x7E */
    2973         0x5e|0x80,   /* QZ_POWER        0x7F */ /* have different break key! */
     2976        0x4b|0x100,  /* QZ_LEFT         0x7B */
     2977        0x4d|0x100,  /* QZ_RIGHT        0x7C */
     2978        0x50|0x100,  /* QZ_DOWN         0x7D */
     2979        0x48|0x100,  /* QZ_UP           0x7E */
     2980        0x5e|0x100,  /* QZ_POWER        0x7F */ /* have different break key! */
    29742981    };
    29752982
     
    29822989            case SDLK_RSHIFT:           keycode = 0x36; break;
    29832990            case SDLK_LCTRL:            keycode = 0x1d; break;
    2984             case SDLK_RCTRL:            keycode = 0x1d | 0x80; break;
     2991            case SDLK_RCTRL:            keycode = 0x1d | 0x100; break;
    29852992            case SDLK_LALT:             keycode = 0x38; break;
    29862993            case SDLK_MODE: /* alt gr */
    2987             case SDLK_RALT:             keycode = 0x38 | 0x80; break;
     2994            case SDLK_RALT:             keycode = 0x38 | 0x100; break;
    29882995            case SDLK_RMETA:
    2989             case SDLK_RSUPER:           keycode = 0x5c | 0x80; break;
     2996            case SDLK_RSUPER:           keycode = 0x5c | 0x100; break;
    29902997            case SDLK_LMETA:
    2991             case SDLK_LSUPER:           keycode = 0x5b | 0x80; break;
     2998            case SDLK_LSUPER:           keycode = 0x5b | 0x100; break;
    29922999            /* Sssumes normal key. */
    29933000            default:                    keycode = s_aMacToSet1[keycode]; break;
     
    30123019#endif
    30133020
    3014 #endif
     3021#endif /* __DARWIN__ */
    30153022    return keycode;
    30163023}
     
    31703177        }
    31713178
    3172         case 0x2a:  /* Left Shift */
    3173         case 0x36:  /* Right Shift */
    3174         case 0x1d:  /* Left CTRL */
    3175         case 0x9d:  /* Right CTRL */
    3176         case 0x38:  /* Left ALT */
    3177         case 0xb8:  /* Right ALT */
     3179        case 0x2a:        /* Left Shift */
     3180        case 0x36:        /* Right Shift */
     3181        case 0x1d:        /* Left CTRL */
     3182        case 0x1d|0x100:  /* Right CTRL */
     3183        case 0x38:        /* Left ALT */
     3184        case 0x38|0x100:  /* Right ALT */
    31783185        {
    31793186            if (ev->type == SDL_KEYUP)
     
    32303237     * Now we send the event. Apply extended and release prefixes.
    32313238     */
    3232     if (keycode & 0x80)
     3239    if (keycode & 0x100)
    32333240        gKeyboard->PutScancode(0xe0);
    32343241
    3235     gKeyboard->PutScancode(ev->type == SDL_KEYUP ? keycode | 0x80
    3236                                                  : keycode & 0x7f);
     3242    gKeyboard->PutScancode(ev->type == SDL_KEYUP ? (keycode & 0x7f) | 0x80
     3243                                                 : (keycode & 0x7f));
    32373244}
    32383245
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette