93 lines
2.7 KiB
C++
93 lines
2.7 KiB
C++
|
/*
|
||
|
* Mr. 4th Dimention - Allen Webster
|
||
|
*
|
||
|
* 14.11.2015
|
||
|
*
|
||
|
* Linux-US Keyboard layer for 4coder
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
// TOP
|
||
|
|
||
|
#include "4ed_keyboard.cpp"
|
||
|
|
||
|
internal void
|
||
|
keycode_init(Display* dpy){
|
||
|
#if 0
|
||
|
// NOTE(inso): these are for XInput, currently not used.
|
||
|
|
||
|
keycode_lookup_table[KEY_BACKSPACE] = codes->back;
|
||
|
keycode_lookup_table[KEY_DELETE] = codes->del;
|
||
|
keycode_lookup_table[KEY_UP] = codes->up;
|
||
|
keycode_lookup_table[KEY_DOWN] = codes->down;
|
||
|
keycode_lookup_table[KEY_LEFT] = codes->left;
|
||
|
keycode_lookup_table[KEY_RIGHT] = codes->right;
|
||
|
keycode_lookup_table[KEY_INSERT] = codes->insert;
|
||
|
keycode_lookup_table[KEY_HOME] = codes->home;
|
||
|
keycode_lookup_table[KEY_END] = codes->end;
|
||
|
keycode_lookup_table[KEY_PAGEUP] = codes->page_up;
|
||
|
keycode_lookup_table[KEY_PAGEDOWN] = codes->page_down;
|
||
|
keycode_lookup_table[KEY_ESC] = codes->esc;
|
||
|
#endif
|
||
|
|
||
|
// NOTE(inso): This looks a bit dumb, but it's the best way I can think of to do it, since:
|
||
|
// KeySyms are the type representing "virtual" keys, like XK_BackSpace, but they are 32-bit ints.
|
||
|
// KeyCodes are guaranteed to fit in 1 byte (and therefore the keycode_lookup_table) but
|
||
|
// have dynamic numbers assigned by the XServer.
|
||
|
// There is XKeysymToKeycode, but it only returns 1 KeyCode for a KeySym. I have my capslock
|
||
|
// rebound to esc, so there are two KeyCodes for the XK_Escape KeyCode but XKeysymToKeycode only
|
||
|
// gets one of them, hence the need for this crazy lookup which works correctly with rebound keys.
|
||
|
|
||
|
memset(keycode_lookup_table, 0, sizeof(keycode_lookup_table));
|
||
|
|
||
|
struct SymMapping {
|
||
|
KeySym sym;
|
||
|
Code code;
|
||
|
} sym_table[] = {
|
||
|
{ XK_BackSpace, key_back },
|
||
|
{ XK_Delete, key_del },
|
||
|
{ XK_Up, key_up },
|
||
|
{ XK_Down, key_down },
|
||
|
{ XK_Left, key_left },
|
||
|
{ XK_Right, key_right },
|
||
|
{ XK_Insert, key_insert },
|
||
|
{ XK_Home, key_home },
|
||
|
{ XK_End, key_end },
|
||
|
{ XK_Page_Up, key_page_up },
|
||
|
{ XK_Page_Down, key_page_down },
|
||
|
{ XK_Escape, key_esc }
|
||
|
};
|
||
|
|
||
|
const int table_size = sizeof(sym_table) / sizeof(struct SymMapping);
|
||
|
|
||
|
int key_min, key_max, syms_per_code;
|
||
|
XDisplayKeycodes(dpy, &key_min, &key_max);
|
||
|
|
||
|
int key_count = (key_max - key_min) + 1;
|
||
|
|
||
|
KeySym* syms = XGetKeyboardMapping(
|
||
|
dpy,
|
||
|
key_min,
|
||
|
key_count,
|
||
|
&syms_per_code
|
||
|
);
|
||
|
|
||
|
if(!syms) return;
|
||
|
|
||
|
int key = key_min;
|
||
|
for(int i = 0; i < key_count * syms_per_code; ++i){
|
||
|
for(int j = 0; j < table_size; ++j){
|
||
|
if(sym_table[j].sym == syms[i]){
|
||
|
keycode_lookup_table[key + (i/syms_per_code)] = sym_table[j].code;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
XFree(syms);
|
||
|
|
||
|
}
|
||
|
|
||
|
// BOTTOM
|
||
|
|