// Qt Virtual Keys (platform independant)
QScanCodeArray QKeyToScanCode(int key)
{
    if (scanCodeHash.empty())
        InitScanCodeMap();

    ScanCodeHash::iterator it = scanCodeHash.find(key);
    if (it == scanCodeHash.end())
        return QScanCodeArray();
    else
        return it.value();
}
void InitScanCodeMap()
{
    // SPICE protocol use PC AT scan codes for keyboard
    // See for: http://philipstorr.id.au/pcbook/book3/scancode.htm
    // WARNING: (Prnt, Scrn) <-> (Keypad *)
    scanCodeHash.clear();
    scanCodeHash.insert(Qt::Key_Space,          0x39);
    scanCodeHash.insert(Qt::Key_A,              0x1E);
    scanCodeHash.insert(Qt::Key_B,              0x30);
    scanCodeHash.insert(Qt::Key_C,              0x2E);
    scanCodeHash.insert(Qt::Key_D,              0x20);
    scanCodeHash.insert(Qt::Key_E,              0x12);
    scanCodeHash.insert(Qt::Key_F,              0x21);
    scanCodeHash.insert(Qt::Key_G,              0x22);
    scanCodeHash.insert(Qt::Key_H,              0x23);
    scanCodeHash.insert(Qt::Key_I,              0x17);
    scanCodeHash.insert(Qt::Key_J,              0x24);
    scanCodeHash.insert(Qt::Key_K,              0x25);
    scanCodeHash.insert(Qt::Key_L,              0x26);
    scanCodeHash.insert(Qt::Key_M,              0x32);
    scanCodeHash.insert(Qt::Key_N,              0x31);
    scanCodeHash.insert(Qt::Key_O,              0x18);
    scanCodeHash.insert(Qt::Key_P,              0x19);
    scanCodeHash.insert(Qt::Key_Q,              0x10);
    scanCodeHash.insert(Qt::Key_R,              0x13);
    scanCodeHash.insert(Qt::Key_S,              0x1F);
    scanCodeHash.insert(Qt::Key_T,              0x14);
    scanCodeHash.insert(Qt::Key_U,              0x16);
    scanCodeHash.insert(Qt::Key_V,              0x2F);
    scanCodeHash.insert(Qt::Key_W,              0x11);
    scanCodeHash.insert(Qt::Key_X,              0x2D);
    scanCodeHash.insert(Qt::Key_Y,              0x15);
    scanCodeHash.insert(Qt::Key_Z,              0x2C);
    scanCodeHash.insert(Qt::Key_QuoteLeft,      0x29);
    scanCodeHash.insert(Qt::Key_AsciiTilde,     0x29);
    scanCodeHash.insert(Qt::Key_1,              0x02);
    scanCodeHash.insert(Qt::Key_Exclam,         0x02);
    scanCodeHash.insert(Qt::Key_At,             0x03);
    scanCodeHash.insert(Qt::Key_2,              0x03);
    scanCodeHash.insert(Qt::Key_3,              0x04);
    scanCodeHash.insert(Qt::Key_NumberSign,     0x04);
    scanCodeHash.insert(Qt::Key_4,              0x05);
    scanCodeHash.insert(Qt::Key_Dollar,         0x05);
    scanCodeHash.insert(Qt::Key_5,              0x06);
    scanCodeHash.insert(Qt::Key_Percent,        0x06);
    scanCodeHash.insert(Qt::Key_6,              0x07);
    scanCodeHash.insert(Qt::Key_AsciiCircum,    0x07);
    scanCodeHash.insert(Qt::Key_7,              0x08);
    scanCodeHash.insert(Qt::Key_Ampersand,      0x08);
    scanCodeHash.insert(Qt::Key_8,              0x09);
    ADD_SCAN2          (Qt::Key_Asterisk,       0x2A, 0x37);
    scanCodeHash.insert(Qt::Key_9,              0x0A);
    scanCodeHash.insert(Qt::Key_ParenLeft,      0x0A);
    scanCodeHash.insert(Qt::Key_0,              0x0B);
    scanCodeHash.insert(Qt::Key_ParenRight,     0x0B);
    scanCodeHash.insert(Qt::Key_Comma,          0x33);
    scanCodeHash.insert(Qt::Key_Less,           0x33);
    scanCodeHash.insert(Qt::Key_Period,         0x34);
    scanCodeHash.insert(Qt::Key_Greater,        0x34);
    scanCodeHash.insert(Qt::Key_Minus,          0x0C);
    scanCodeHash.insert(Qt::Key_Underscore,     0x0C);
    scanCodeHash.insert(Qt::Key_Equal,          0x0D);
    scanCodeHash.insert(Qt::Key_Plus,           0x4E);
    scanCodeHash.insert(Qt::Key_Slash,          0x35);
    scanCodeHash.insert(Qt::Key_Question,       0x35);
    scanCodeHash.insert(Qt::Key_Backslash,      0x2B);
    scanCodeHash.insert(Qt::Key_Bar,            0x2B);
    scanCodeHash.insert(Qt::Key_Apostrophe,     0x28);
    scanCodeHash.insert(Qt::Key_QuoteDbl,       0x28);
    scanCodeHash.insert(Qt::Key_Semicolon,      0x27);
    scanCodeHash.insert(Qt::Key_Colon,          0x27);
    scanCodeHash.insert(Qt::Key_BracketLeft,    0x1A);
    scanCodeHash.insert(Qt::Key_BraceLeft,      0x1A);
    scanCodeHash.insert(Qt::Key_BracketRight,   0x1B);
    scanCodeHash.insert(Qt::Key_BraceRight,     0x1B);

    // Misc
    scanCodeHash.insert(Qt::Key_Escape,         0x01);
    scanCodeHash.insert(Qt::Key_Tab,            0x0F);
    scanCodeHash.insert(Qt::Key_Backtab,        0x0F);
    // not applicable in PC AT keyboard
    // ADD_SCAN2(Qt::Key_Super_L,               0xE0, 0x5B);
    // ADD_SCAN2(Qt::Key_Super_R,               0xE0, 0x5C);
    // ADD_SCAN2(Qt::Key_Meta, 0x00,            0x00);

    // Specials
    scanCodeHash.insert(Qt::Key_Shift,          0x2A);
    scanCodeHash.insert(Qt::Key_CapsLock,       0x3A);
    scanCodeHash.insert(Qt::Key_Return,         0x1C);
    ADD_SCAN2          (Qt::Key_Enter,          0xE0, 0x1C);
    scanCodeHash.insert(Qt::Key_Backspace,      0x0E);
    scanCodeHash.insert(Qt::Key_Control,        0x1D);
    scanCodeHash.insert(Qt::Key_Alt,            0x38);
    ADD_SCAN2          (Qt::Key_AltGr,          0xE0, 0x38);
    // not applicable in PC AT keyboard
    // scanCodeHash.insert(Qt::Key_Menu,        0x00);

    // Cursor Keys/Num pad
    ADD_SCAN2          (Qt::Key_Print,          0xE0, 0x37);
    scanCodeHash.insert(Qt::Key_ScrollLock,     0x46);
    ADD_SCAN2          (Qt::Key_Pause,          0xE0, 0x52);

    ADD_SCAN2          (Qt::Key_Insert,         0xE0, 0x52);
    ADD_SCAN2          (Qt::Key_Home,           0xE0, 0x47);
    ADD_SCAN2          (Qt::Key_PageUp,         0xE0, 0x49);
    ADD_SCAN2          (Qt::Key_Delete,         0xE0, 0x53);
    ADD_SCAN2          (Qt::Key_End,            0xE0, 0x4F);
    ADD_SCAN2          (Qt::Key_PageDown,       0xE0, 0x51);

    ADD_SCAN2          (Qt::Key_Up,             0xE0, 0x48);
    ADD_SCAN2          (Qt::Key_Left,           0xE0, 0x4B);
    ADD_SCAN2          (Qt::Key_Down,           0xE0, 0x50);
    ADD_SCAN2          (Qt::Key_Right,          0xE0, 0x4D);
    ADD_SCAN2          (Qt::Key_NumLock,        0x45, 0xC5);

    scanCodeHash.insert(Qt::Key_Clear,          0x39);

    // functional keys
    scanCodeHash.insert(Qt::Key_F1,             0x3B);
    scanCodeHash.insert(Qt::Key_F2,             0x3C);
    scanCodeHash.insert(Qt::Key_F3,             0x3D);
    scanCodeHash.insert(Qt::Key_F4,             0x3E);
    scanCodeHash.insert(Qt::Key_F5,             0x3F);
    scanCodeHash.insert(Qt::Key_F6,             0x40);
    scanCodeHash.insert(Qt::Key_F7,             0x41);
    scanCodeHash.insert(Qt::Key_F8,             0x42);
    scanCodeHash.insert(Qt::Key_F9,             0x43);
    scanCodeHash.insert(Qt::Key_F10,            0x44);
    scanCodeHash.insert(Qt::Key_F11,            0xD9);
    scanCodeHash.insert(Qt::Key_F12,            0xDA);

    // additional non-keyboard called keys :
    // not applicable in PC AT keyboard,
    // therefore used for send key sequence
    ADD_SCAN3          (Qt::Key_Launch1,        0x1D, 0x38, 0x3B);          // CtrlAltF1
    ADD_SCAN3          (Qt::Key_Launch2,        0x1D, 0x38, 0x3C);          // CtrlAltF2
    ADD_SCAN3          (Qt::Key_Launch3,        0x1D, 0x38, 0x3D);          // CtrlAltF3
    ADD_SCAN3          (Qt::Key_Launch4,        0x1D, 0x38, 0x3E);          // CtrlAltF4
    ADD_SCAN3          (Qt::Key_Launch5,        0x1D, 0x38, 0x3F);          // CtrlAltF5
    ADD_SCAN3          (Qt::Key_Launch6,        0x1D, 0x38, 0x40);          // CtrlAltF6
    ADD_SCAN3          (Qt::Key_Launch7,        0x1D, 0x38, 0x41);          // CtrlAltF7
    ADD_SCAN3          (Qt::Key_Launch8,        0x1D, 0x38, 0x42);          // CtrlAltF8
    ADD_SCAN3          (Qt::Key_LaunchB,        0x1D, 0x38, 0x0E);          // CtrlAltBackSpc
    ADD_SCAN4          (Qt::Key_LaunchD,        0x1D, 0x38, 0xE0, 0x53);    // CtrlAltDel
}
void InitScanCodeMap()
{
    scanCodeHash.clear();
    scanCodeHash.insert(Qt::Key_Space, 0x39);
    scanCodeHash.insert(Qt::Key_A, 0x1E);
    scanCodeHash.insert(Qt::Key_B, 0x30);
    scanCodeHash.insert(Qt::Key_C, 0x2E);
    scanCodeHash.insert(Qt::Key_D, 0x20);
    scanCodeHash.insert(Qt::Key_E, 0x12);
    scanCodeHash.insert(Qt::Key_F, 0x21);
    scanCodeHash.insert(Qt::Key_G, 0x22);
    scanCodeHash.insert(Qt::Key_H, 0x23);
    scanCodeHash.insert(Qt::Key_I, 0x17);
    scanCodeHash.insert(Qt::Key_J, 0x24);
    scanCodeHash.insert(Qt::Key_K, 0x25);
    scanCodeHash.insert(Qt::Key_L, 0x26);
    scanCodeHash.insert(Qt::Key_M, 0x32);
    scanCodeHash.insert(Qt::Key_N, 0x31);
    scanCodeHash.insert(Qt::Key_O, 0x18);
    scanCodeHash.insert(Qt::Key_P, 0x19);
    scanCodeHash.insert(Qt::Key_Q, 0x10);
    scanCodeHash.insert(Qt::Key_R, 0x13);
    scanCodeHash.insert(Qt::Key_S, 0x1F);
    scanCodeHash.insert(Qt::Key_T, 0x14);
    scanCodeHash.insert(Qt::Key_U, 0x16);
    scanCodeHash.insert(Qt::Key_V, 0x2F);
    scanCodeHash.insert(Qt::Key_W, 0x11);
    scanCodeHash.insert(Qt::Key_X, 0x2D);
    scanCodeHash.insert(Qt::Key_Y, 0x15);
    scanCodeHash.insert(Qt::Key_Z, 0x2C);
    scanCodeHash.insert(Qt::Key_0, 0x0B);
    scanCodeHash.insert(Qt::Key_1, 0x02);
    scanCodeHash.insert(Qt::Key_2, 0x03);
    scanCodeHash.insert(Qt::Key_3, 0x04);
    scanCodeHash.insert(Qt::Key_4, 0x05);
    scanCodeHash.insert(Qt::Key_5, 0x06);
    scanCodeHash.insert(Qt::Key_6, 0x07);
    scanCodeHash.insert(Qt::Key_7, 0x08);
    scanCodeHash.insert(Qt::Key_8, 0x09);
    scanCodeHash.insert(Qt::Key_9, 0x0A);

    // Misc
    scanCodeHash.insert(Qt::Key_Escape, 0x01);
    scanCodeHash.insert(Qt::Key_Tab, 0x0F);
    ADD_SCAN2(Qt::Key_Super_L, 0xE0, 0x5B);
    ADD_SCAN2(Qt::Key_Super_R, 0xE0, 0x5C);
    ADD_SCAN2(Qt::Key_Meta, 0xE0, 0x5B);

    // Specials
    scanCodeHash.insert(Qt::Key_Shift, 0x2A);
    scanCodeHash.insert(Qt::Key_CapsLock, 0x3A);
    scanCodeHash.insert(Qt::Key_Enter, 0x1C);
    scanCodeHash.insert(Qt::Key_Return, 0x1C);
    scanCodeHash.insert(Qt::Key_Backspace, 0x0E);
    scanCodeHash.insert(Qt::Key_Control, 0x1D);
    scanCodeHash.insert(Qt::Key_Alt, 0x38);

    // Cursor Keys/Num pad
    ADD_SCAN2(Qt::Key_Insert,    0xE0, 0x52);
    ADD_SCAN2(Qt::Key_Home,      0xE0, 0x47);
    ADD_SCAN2(Qt::Key_PageUp,    0xE0, 0x49);
    ADD_SCAN2(Qt::Key_Delete,    0xE0, 0x53);
    ADD_SCAN2(Qt::Key_End,       0xE0, 0x4F);
    ADD_SCAN2(Qt::Key_PageDown,  0xE0, 0x51);

    ADD_SCAN2(Qt::Key_Up,    0xE0, 0x48);
    ADD_SCAN2(Qt::Key_Left,  0xE0, 0x4B);
    ADD_SCAN2(Qt::Key_Down,  0xE0, 0x50);
    ADD_SCAN2(Qt::Key_Right, 0xE0, 0x4D);
    ADD_SCAN1(Qt::Key_NumLock, 0x45);

}