#include "LinuxFbLocal.h" #define LLOG(x) //LOG(x) NAMESPACE_UPP dword modkeys = 0; enum KMOD { KMOD_NONE = 0x00, KMOD_LSHIFT= 0x01, KMOD_RSHIFT= 0x02, KMOD_LCTRL = 0x04, KMOD_RCTRL = 0x08, KMOD_LALT = 0x10, KMOD_RALT = 0x20, KMOD_CAPS = 0x40, KMOD_NUM = 0x80, KMOD_CTRL = KMOD_LCTRL | KMOD_RCTRL, KMOD_SHIFT = KMOD_LSHIFT | KMOD_RSHIFT, KMOD_ALT = KMOD_LALT | KMOD_RALT, }; #define CHFLAG(w, m, b) if(b) w |= m; else w &= ~m; void SaveModKeys(dword keycode, dword pressed) { switch(keycode) { case SCANCODE_LEFTSHIFT: CHFLAG(modkeys, KMOD_LSHIFT, pressed) break; case SCANCODE_RIGHTSHIFT: CHFLAG(modkeys, KMOD_RSHIFT, pressed) break; case SCANCODE_LEFTCONTROL: CHFLAG(modkeys, KMOD_LCTRL, pressed) break; case SCANCODE_RIGHTCONTROL: CHFLAG(modkeys, KMOD_RCTRL, pressed) break; case SCANCODE_LEFTALT: CHFLAG(modkeys, KMOD_LALT, pressed) break; case SCANCODE_RIGHTALT: CHFLAG(modkeys, KMOD_RALT, pressed) break; case SCANCODE_CAPSLOCK: CHFLAG(modkeys, KMOD_CAPS, pressed) break; case SCANCODE_NUMLOCK: CHFLAG(modkeys, KMOD_NUM, pressed) break; } } bool GetShift() { return modkeys & KMOD_SHIFT; } bool GetCtrl() { return modkeys & KMOD_CTRL; } bool GetAlt() { return modkeys & KMOD_ALT; } bool GetCapsLock() { return modkeys & KMOD_CAPS; } dword fbKEYtoK(dword chr) { if(chr == SCANCODE_TAB) chr = K_TAB; else if(chr == SCANCODE_SPACE) chr = K_SPACE; else if(chr == SCANCODE_ENTER) chr = K_RETURN; else chr = chr + K_DELTA; //if the mod keys themselves, no need to have CTRL+ xxx behaviour indicator if(chr == K_ALT_KEY || chr == K_CTRL_KEY || chr == K_SHIFT_KEY) return chr; if(GetCtrl()) chr |= K_CTRL; if(GetAlt()) chr |= K_ALT; if(GetShift()) chr |= K_SHIFT; return chr; } END_UPP_NAMESPACE //kernel defines conflict with some upp K_ enums, like K_SHIFT, K_ALT, K_CTRL //so we separate as much as possible #include NAMESPACE_UPP //The kernel copy of translation tables //from a console keycode in MEDIUMRAW to unicode static uint16 kmap[MAX_NR_KEYMAPS][NR_KEYS]; void dupkmap(int fd) { struct kbentry entry; if(fd < 0) return; for(int m=0; m