linux: reorganise keyboard stuff
This commit is contained in:
parent
d5f98bcd31
commit
68f76ec02e
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Mr. 4th Dimention - Allen Webster
|
|
||||||
*
|
|
||||||
* 14.11.2015
|
|
||||||
*
|
|
||||||
* Linux-US Keyboard layer for 4coder
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// TOP
|
|
||||||
|
|
||||||
// TODO(allen): Let's go ahead and eliminate this file
|
|
||||||
// like I did with the win32 keyboard files.
|
|
||||||
|
|
||||||
// NOTE(allen): Old contents of 4ed_keyboard.cpp
|
|
||||||
globalvar u8 keycode_lookup_table[255];
|
|
||||||
|
|
||||||
inline u8
|
|
||||||
keycode_lookup(u8 system_code){
|
|
||||||
return keycode_lookup_table[system_code];
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
keycode_init(Display* dpy){
|
|
||||||
|
|
||||||
// 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 },
|
|
||||||
{ XK_F1, key_f1 },
|
|
||||||
{ XK_F2, key_f2 },
|
|
||||||
{ XK_F3, key_f3 },
|
|
||||||
{ XK_F4, key_f4 },
|
|
||||||
{ XK_F5, key_f5 },
|
|
||||||
{ XK_F6, key_f6 },
|
|
||||||
{ XK_F7, key_f7 },
|
|
||||||
{ XK_F8, key_f8 },
|
|
||||||
{ XK_F9, key_f9 },
|
|
||||||
{ XK_F10, key_f10 },
|
|
||||||
{ XK_F11, key_f11 },
|
|
||||||
{ XK_F12, key_f12 },
|
|
||||||
};
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
@ -67,7 +67,6 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "4ed_internal.h"
|
#include "4ed_internal.h"
|
||||||
#include "4ed_linux_keyboard.cpp"
|
|
||||||
#include "system_shared.h"
|
#include "system_shared.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -1664,6 +1663,90 @@ InitializeXInput(Display *dpy, Window XWindow)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
globalvar u8 keycode_lookup_table[255];
|
||||||
|
|
||||||
|
inline u8
|
||||||
|
keycode_lookup(u8 system_code){
|
||||||
|
return keycode_lookup_table[system_code];
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
keycode_init(Display* dpy){
|
||||||
|
|
||||||
|
// 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 },
|
||||||
|
{ XK_F1, key_f1 },
|
||||||
|
{ XK_F2, key_f2 },
|
||||||
|
{ XK_F3, key_f3 },
|
||||||
|
{ XK_F4, key_f4 },
|
||||||
|
{ XK_F5, key_f5 },
|
||||||
|
{ XK_F6, key_f6 },
|
||||||
|
{ XK_F7, key_f7 },
|
||||||
|
{ XK_F8, key_f8 },
|
||||||
|
{ XK_F9, key_f9 },
|
||||||
|
{ XK_F10, key_f10 },
|
||||||
|
{ XK_F11, key_f11 },
|
||||||
|
{ XK_F12, key_f12 },
|
||||||
|
{ XK_F13, key_f13 },
|
||||||
|
{ XK_F14, key_f14 },
|
||||||
|
{ XK_F15, key_f15 },
|
||||||
|
{ XK_F16, key_f16 },
|
||||||
|
};
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
LinuxPushKey(u8 code, u8 chr, u8 chr_nocaps, b8 (*mods)[MDFR_INDEX_COUNT], b32 is_hold)
|
LinuxPushKey(u8 code, u8 chr, u8 chr_nocaps, b8 (*mods)[MDFR_INDEX_COUNT], b32 is_hold)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue