diff --git a/core/linux-dist/evdev.cpp b/core/linux-dist/evdev.cpp index 5a1526ccd..1d14aea2d 100644 --- a/core/linux-dist/evdev.cpp +++ b/core/linux-dist/evdev.cpp @@ -3,10 +3,79 @@ #include #include "linux-dist/evdev.h" #include "linux-dist/main.h" +#include "cfg/ini.h" +#include +#include #if defined(USE_EVDEV) + std::map loaded_mappings; - int input_evdev_init(Controller* controller, const char* device) + int load_keycode(ConfigFile* cfg, string section, string dc_key) + { + int code; + string keycode = cfg->get(section, dc_key, "-1"); + if (strstr(keycode.c_str(), "KEY_") != NULL || + strstr(keycode.c_str(), "BTN_") != NULL || + strstr(keycode.c_str(), "ABS_") != NULL) + { + if(evdev_keycodes.count(keycode.c_str()) == 1) + { + code = evdev_keycodes[keycode.c_str()]; + printf("%s = %s (%d)\n", dc_key.c_str(), keycode.c_str(), code); + } + else + { + code = -1; + printf("evdev: failed to find keycode for '%s'", keycode.c_str()); + } + } + else + { + code = cfg->get_int(section, dc_key, -1); + printf("%s = %d\n", dc_key.c_str(), code); + } + return code; + } + + ControllerMapping load_mapping(FILE* fd) + { + ConfigFile mf; + mf.parse(fd); + + ControllerMapping mapping = { + mf.get("emulator", "mapping_name", "").c_str(), + load_keycode(&mf, "dreamcast", "btn_a"), + load_keycode(&mf, "dreamcast", "btn_b"), + load_keycode(&mf, "dreamcast", "btn_c"), + load_keycode(&mf, "dreamcast", "btn_d"), + load_keycode(&mf, "dreamcast", "btn_x"), + load_keycode(&mf, "dreamcast", "btn_y"), + load_keycode(&mf, "dreamcast", "btn_z"), + load_keycode(&mf, "dreamcast", "btn_start"), + load_keycode(&mf, "emulator", "btn_escape"), + load_keycode(&mf, "dreamcast", "dpad_left"), + load_keycode(&mf, "dreamcast", "dpad_right"), + load_keycode(&mf, "dreamcast", "dpad_up"), + load_keycode(&mf, "dreamcast", "dpad_down"), + load_keycode(&mf, "dreamcast", "dpad2_left"), + load_keycode(&mf, "dreamcast", "dpad2_right"), + load_keycode(&mf, "dreamcast", "dpad2_up"), + load_keycode(&mf, "dreamcast", "dpad2_down"), + load_keycode(&mf, "compat", "btn_trigger_left"), + load_keycode(&mf, "compat", "btn_trigger_right"), + load_keycode(&mf, "compat", "axis_dpad_x"), + load_keycode(&mf, "compat", "axis_dpad_y"), + load_keycode(&mf, "compat", "axis_dpad2_x"), + load_keycode(&mf, "compat", "axis_dpad2_y"), + load_keycode(&mf, "dreamcast", "axis_x"), + load_keycode(&mf, "dreamcast", "axis_y"), + load_keycode(&mf, "dreamcast", "axis_trigger_left"), + load_keycode(&mf, "dreamcast", "axis_trigger_right") + }; + return mapping; + } + + int input_evdev_init(Controller* controller, const char* device, const char* mapping_fname = NULL) { char name[256] = "Unknown"; @@ -28,33 +97,54 @@ controller->fd = fd; - #if defined(TARGET_PANDORA) - *controller.mapping = &controller_mapping_pandora; - #elif defined(TARGET_GCW0) - *controller.mapping = &controller_mapping_gcwz; - #else - if (strcmp(name, "Microsoft X-Box 360 pad") == 0 || - strcmp(name, "Xbox 360 Wireless Receiver") == 0 || - strcmp(name, "Xbox 360 Wireless Receiver (XBOX)") == 0) + if(mapping_fname != NULL) + { + if(loaded_mappings.count(string(mapping_fname)) == 0) { - controller->mapping = &controller_mapping_xpad; + FILE* mapping_fd = fopen(mapping_fname, "r"); + if(mapping_fd != NULL) + { + printf("evdev: reading custom mapping file: '%s'\n", mapping_fname); + loaded_mappings.insert(std::make_pair(string(mapping_fname), load_mapping(mapping_fd))); + fclose(mapping_fd); + } + else + { + printf("evdev: unable to open custom mapping file '%s'\n", mapping_fname); + return -3; + } } - else if (strstr(name, "Xbox Gamepad (userspace driver)") != NULL) - { - controller->mapping = &controller_mapping_xboxdrv; - } - else if (strstr(name, "keyboard") != NULL || - strstr(name, "Keyboard") != NULL) - { - controller->mapping = &controller_mapping_keyboard; - } - else - { - controller->mapping = &controller_mapping_generic; - } - #endif + controller->mapping = &loaded_mappings[string(mapping_fname)]; + } + else + { + #if defined(TARGET_PANDORA) + *controller.mapping = &controller_mapping_pandora; + #elif defined(TARGET_GCW0) + *controller.mapping = &controller_mapping_gcwz; + #else + if (strcmp(name, "Microsoft X-Box 360 pad") == 0 || + strcmp(name, "Xbox 360 Wireless Receiver") == 0 || + strcmp(name, "Xbox 360 Wireless Receiver (XBOX)") == 0) + { + controller->mapping = &controller_mapping_xpad; + } + else if (strstr(name, "Xbox Gamepad (userspace driver)") != NULL) + { + controller->mapping = &controller_mapping_xboxdrv; + } + else if (strstr(name, "keyboard") != NULL || + strstr(name, "Keyboard") != NULL) + { + controller->mapping = &controller_mapping_keyboard; + } + else + { + controller->mapping = &controller_mapping_generic; + } + #endif + } printf("evdev: Using '%s' mapping\n", controller->mapping->name); - return 0; } } @@ -219,3 +309,12 @@ } } #endif + + + + + + + + + diff --git a/core/linux-dist/evdev.h b/core/linux-dist/evdev.h index a0bdc4961..6dc2ccd75 100644 --- a/core/linux-dist/evdev.h +++ b/core/linux-dist/evdev.h @@ -1,6 +1,7 @@ #include "types.h" #include "linux-dist/evdev_mappings.h" #include +#include "evdev_keycodes.h" #pragma once @@ -13,7 +14,9 @@ struct s_controller typedef struct s_controller Controller; #define EVDEV_DEVICE_CONFIG_KEY "evdev_device_id_%d" +#define EVDEV_MAPPING_CONFIG_KEY "evdev_mapping_%d" #define EVDEV_DEVICE_STRING "/dev/input/event%d" +#define EVDEV_MAPPING_PATH "/mappings/%s" #ifdef TARGET_PANDORA #define EVDEV_DEFAULT_DEVICE_ID_1 4 @@ -23,5 +26,7 @@ typedef struct s_controller Controller; #define EVDEV_DEFAULT_DEVICE_ID(port) (port == 1 ? EVDEV_DEFAULT_DEVICE_ID_1 : -1) -extern int input_evdev_init(Controller* controller, const char* device); +extern int input_evdev_init(Controller* controller, const char* device, const char* mapping_fname); extern bool input_evdev_handle(Controller* controller, u32 port); + + diff --git a/core/linux-dist/evdev_keycodes.cpp b/core/linux-dist/evdev_keycodes.cpp new file mode 100644 index 000000000..cec0bb452 --- /dev/null +++ b/core/linux-dist/evdev_keycodes.cpp @@ -0,0 +1,665 @@ +#include +#include "linux-dist/evdev_keycodes.h" + +#define ADD_KEYCODE(code) evdev_keycodes.insert(std::make_pair (#code, code)) + +std::map evdev_keycodes; + +void evdev_init_keycodes() +{ + + ADD_KEYCODE(ABS_X); + ADD_KEYCODE(ABS_Y); + ADD_KEYCODE(ABS_Z); + ADD_KEYCODE(ABS_RX); + ADD_KEYCODE(ABS_RY); + ADD_KEYCODE(ABS_RZ); + ADD_KEYCODE(ABS_THROTTLE); + ADD_KEYCODE(ABS_RUDDER); + ADD_KEYCODE(ABS_WHEEL); + ADD_KEYCODE(ABS_GAS); + ADD_KEYCODE(ABS_BRAKE); + ADD_KEYCODE(ABS_HAT0X); + ADD_KEYCODE(ABS_HAT0Y); + ADD_KEYCODE(ABS_HAT1X); + ADD_KEYCODE(ABS_HAT1Y); + ADD_KEYCODE(ABS_HAT2X); + ADD_KEYCODE(ABS_HAT2Y); + ADD_KEYCODE(ABS_HAT3X); + ADD_KEYCODE(ABS_HAT3Y); + ADD_KEYCODE(ABS_PRESSURE); + ADD_KEYCODE(ABS_DISTANCE); + ADD_KEYCODE(ABS_TILT_X); + ADD_KEYCODE(ABS_TILT_Y); + ADD_KEYCODE(ABS_TOOL_WIDTH); + ADD_KEYCODE(ABS_VOLUME); + ADD_KEYCODE(ABS_MISC); + + ADD_KEYCODE(KEY_RESERVED); + ADD_KEYCODE(KEY_ESC); + ADD_KEYCODE(KEY_1); + ADD_KEYCODE(KEY_2); + ADD_KEYCODE(KEY_3); + ADD_KEYCODE(KEY_4); + ADD_KEYCODE(KEY_5); + ADD_KEYCODE(KEY_6); + ADD_KEYCODE(KEY_7); + ADD_KEYCODE(KEY_8); + ADD_KEYCODE(KEY_9); + ADD_KEYCODE(KEY_0); + ADD_KEYCODE(KEY_MINUS); + ADD_KEYCODE(KEY_EQUAL); + ADD_KEYCODE(KEY_BACKSPACE); + ADD_KEYCODE(KEY_TAB); + ADD_KEYCODE(KEY_Q); + ADD_KEYCODE(KEY_W); + ADD_KEYCODE(KEY_E); + ADD_KEYCODE(KEY_R); + ADD_KEYCODE(KEY_T); + ADD_KEYCODE(KEY_Y); + ADD_KEYCODE(KEY_U); + ADD_KEYCODE(KEY_I); + ADD_KEYCODE(KEY_O); + ADD_KEYCODE(KEY_P); + ADD_KEYCODE(KEY_LEFTBRACE); + ADD_KEYCODE(KEY_RIGHTBRACE); + ADD_KEYCODE(KEY_ENTER); + ADD_KEYCODE(KEY_LEFTCTRL); + ADD_KEYCODE(KEY_A); + ADD_KEYCODE(KEY_S); + ADD_KEYCODE(KEY_D); + ADD_KEYCODE(KEY_F); + ADD_KEYCODE(KEY_G); + ADD_KEYCODE(KEY_H); + ADD_KEYCODE(KEY_J); + ADD_KEYCODE(KEY_K); + ADD_KEYCODE(KEY_L); + ADD_KEYCODE(KEY_SEMICOLON); + ADD_KEYCODE(KEY_APOSTROPHE); + ADD_KEYCODE(KEY_GRAVE); + ADD_KEYCODE(KEY_LEFTSHIFT); + ADD_KEYCODE(KEY_BACKSLASH); + ADD_KEYCODE(KEY_Z); + ADD_KEYCODE(KEY_X); + ADD_KEYCODE(KEY_C); + ADD_KEYCODE(KEY_V); + ADD_KEYCODE(KEY_B); + ADD_KEYCODE(KEY_N); + ADD_KEYCODE(KEY_M); + ADD_KEYCODE(KEY_COMMA); + ADD_KEYCODE(KEY_DOT); + ADD_KEYCODE(KEY_SLASH); + ADD_KEYCODE(KEY_RIGHTSHIFT); + ADD_KEYCODE(KEY_KPASTERISK); + ADD_KEYCODE(KEY_LEFTALT); + ADD_KEYCODE(KEY_SPACE); + ADD_KEYCODE(KEY_CAPSLOCK); + ADD_KEYCODE(KEY_F1); + ADD_KEYCODE(KEY_F2); + ADD_KEYCODE(KEY_F3); + ADD_KEYCODE(KEY_F4); + ADD_KEYCODE(KEY_F5); + ADD_KEYCODE(KEY_F6); + ADD_KEYCODE(KEY_F7); + ADD_KEYCODE(KEY_F8); + ADD_KEYCODE(KEY_F9); + ADD_KEYCODE(KEY_F10); + ADD_KEYCODE(KEY_NUMLOCK); + ADD_KEYCODE(KEY_SCROLLLOCK); + ADD_KEYCODE(KEY_KP7); + ADD_KEYCODE(KEY_KP8); + ADD_KEYCODE(KEY_KP9); + ADD_KEYCODE(KEY_KPMINUS); + ADD_KEYCODE(KEY_KP4); + ADD_KEYCODE(KEY_KP5); + ADD_KEYCODE(KEY_KP6); + ADD_KEYCODE(KEY_KPPLUS); + ADD_KEYCODE(KEY_KP1); + ADD_KEYCODE(KEY_KP2); + ADD_KEYCODE(KEY_KP3); + ADD_KEYCODE(KEY_KP0); + ADD_KEYCODE(KEY_KPDOT); + ADD_KEYCODE(KEY_ZENKAKUHANKAKU); + ADD_KEYCODE(KEY_102ND); + ADD_KEYCODE(KEY_F11); + ADD_KEYCODE(KEY_F12); + ADD_KEYCODE(KEY_RO); + ADD_KEYCODE(KEY_KATAKANA); + ADD_KEYCODE(KEY_HIRAGANA); + ADD_KEYCODE(KEY_HENKAN); + ADD_KEYCODE(KEY_KATAKANAHIRAGANA); + ADD_KEYCODE(KEY_MUHENKAN); + ADD_KEYCODE(KEY_KPJPCOMMA); + ADD_KEYCODE(KEY_KPENTER); + ADD_KEYCODE(KEY_RIGHTCTRL); + ADD_KEYCODE(KEY_KPSLASH); + ADD_KEYCODE(KEY_SYSRQ); + ADD_KEYCODE(KEY_RIGHTALT); + ADD_KEYCODE(KEY_LINEFEED); + ADD_KEYCODE(KEY_HOME); + ADD_KEYCODE(KEY_UP); + ADD_KEYCODE(KEY_PAGEUP); + ADD_KEYCODE(KEY_LEFT); + ADD_KEYCODE(KEY_RIGHT); + ADD_KEYCODE(KEY_END); + ADD_KEYCODE(KEY_DOWN); + ADD_KEYCODE(KEY_PAGEDOWN); + ADD_KEYCODE(KEY_INSERT); + ADD_KEYCODE(KEY_DELETE); + ADD_KEYCODE(KEY_MACRO); + ADD_KEYCODE(KEY_MUTE); + ADD_KEYCODE(KEY_VOLUMEDOWN); + ADD_KEYCODE(KEY_VOLUMEUP); + ADD_KEYCODE(KEY_POWER); + ADD_KEYCODE(KEY_KPEQUAL); + ADD_KEYCODE(KEY_KPPLUSMINUS); + ADD_KEYCODE(KEY_PAUSE); + ADD_KEYCODE(KEY_KPCOMMA); + ADD_KEYCODE(KEY_HANGUEL); + ADD_KEYCODE(KEY_HANJA); + ADD_KEYCODE(KEY_YEN); + ADD_KEYCODE(KEY_LEFTMETA); + ADD_KEYCODE(KEY_RIGHTMETA); + ADD_KEYCODE(KEY_COMPOSE); + ADD_KEYCODE(KEY_STOP); + ADD_KEYCODE(KEY_AGAIN); + ADD_KEYCODE(KEY_PROPS); + ADD_KEYCODE(KEY_UNDO); + ADD_KEYCODE(KEY_FRONT); + ADD_KEYCODE(KEY_COPY); + ADD_KEYCODE(KEY_OPEN); + ADD_KEYCODE(KEY_PASTE); + ADD_KEYCODE(KEY_FIND); + ADD_KEYCODE(KEY_CUT); + ADD_KEYCODE(KEY_HELP); + ADD_KEYCODE(KEY_MENU); + ADD_KEYCODE(KEY_CALC); + ADD_KEYCODE(KEY_SETUP); + ADD_KEYCODE(KEY_SLEEP); + ADD_KEYCODE(KEY_WAKEUP); + ADD_KEYCODE(KEY_FILE); + ADD_KEYCODE(KEY_SENDFILE); + ADD_KEYCODE(KEY_DELETEFILE); + ADD_KEYCODE(KEY_XFER); + ADD_KEYCODE(KEY_PROG1); + ADD_KEYCODE(KEY_PROG2); + ADD_KEYCODE(KEY_WWW); + ADD_KEYCODE(KEY_MSDOS); + ADD_KEYCODE(KEY_COFFEE); + ADD_KEYCODE(KEY_DIRECTION); + ADD_KEYCODE(KEY_CYCLEWINDOWS); + ADD_KEYCODE(KEY_MAIL); + ADD_KEYCODE(KEY_BOOKMARKS); + ADD_KEYCODE(KEY_COMPUTER); + ADD_KEYCODE(KEY_BACK); + ADD_KEYCODE(KEY_FORWARD); + ADD_KEYCODE(KEY_CLOSECD); + ADD_KEYCODE(KEY_EJECTCD); + ADD_KEYCODE(KEY_EJECTCLOSECD); + ADD_KEYCODE(KEY_NEXTSONG); + ADD_KEYCODE(KEY_PLAYPAUSE); + ADD_KEYCODE(KEY_PREVIOUSSONG); + ADD_KEYCODE(KEY_STOPCD); + ADD_KEYCODE(KEY_RECORD); + ADD_KEYCODE(KEY_REWIND); + ADD_KEYCODE(KEY_PHONE); + ADD_KEYCODE(KEY_ISO); + ADD_KEYCODE(KEY_CONFIG); + ADD_KEYCODE(KEY_HOMEPAGE); + ADD_KEYCODE(KEY_REFRESH); + ADD_KEYCODE(KEY_EXIT); + ADD_KEYCODE(KEY_MOVE); + ADD_KEYCODE(KEY_EDIT); + ADD_KEYCODE(KEY_SCROLLUP); + ADD_KEYCODE(KEY_SCROLLDOWN); + ADD_KEYCODE(KEY_KPLEFTPAREN); + ADD_KEYCODE(KEY_KPRIGHTPAREN); + ADD_KEYCODE(KEY_F13); + ADD_KEYCODE(KEY_F14); + ADD_KEYCODE(KEY_F15); + ADD_KEYCODE(KEY_F16); + ADD_KEYCODE(KEY_F17); + ADD_KEYCODE(KEY_F18); + ADD_KEYCODE(KEY_F19); + ADD_KEYCODE(KEY_F20); + ADD_KEYCODE(KEY_F21); + ADD_KEYCODE(KEY_F22); + ADD_KEYCODE(KEY_F23); + ADD_KEYCODE(KEY_F24); + ADD_KEYCODE(KEY_PLAYCD); + ADD_KEYCODE(KEY_PAUSECD); + ADD_KEYCODE(KEY_PROG3); + ADD_KEYCODE(KEY_PROG4); + ADD_KEYCODE(KEY_SUSPEND); + ADD_KEYCODE(KEY_CLOSE); + ADD_KEYCODE(KEY_PLAY); + ADD_KEYCODE(KEY_FASTFORWARD); + ADD_KEYCODE(KEY_BASSBOOST); + ADD_KEYCODE(KEY_PRINT); + ADD_KEYCODE(KEY_HP); + ADD_KEYCODE(KEY_CAMERA); + ADD_KEYCODE(KEY_SOUND); + ADD_KEYCODE(KEY_QUESTION); + ADD_KEYCODE(KEY_EMAIL); + ADD_KEYCODE(KEY_CHAT); + ADD_KEYCODE(KEY_SEARCH); + ADD_KEYCODE(KEY_CONNECT); + ADD_KEYCODE(KEY_FINANCE); + ADD_KEYCODE(KEY_SPORT); + ADD_KEYCODE(KEY_SHOP); + ADD_KEYCODE(KEY_ALTERASE); + ADD_KEYCODE(KEY_CANCEL); + ADD_KEYCODE(KEY_BRIGHTNESSDOWN); + ADD_KEYCODE(KEY_BRIGHTNESSUP); + ADD_KEYCODE(KEY_MEDIA); + ADD_KEYCODE(KEY_UNKNOWN); + ADD_KEYCODE(KEY_OK); + ADD_KEYCODE(KEY_SELECT); + ADD_KEYCODE(KEY_GOTO); + ADD_KEYCODE(KEY_CLEAR); + ADD_KEYCODE(KEY_POWER2); + ADD_KEYCODE(KEY_OPTION); + ADD_KEYCODE(KEY_INFO); + ADD_KEYCODE(KEY_TIME); + ADD_KEYCODE(KEY_VENDOR); + ADD_KEYCODE(KEY_ARCHIVE); + ADD_KEYCODE(KEY_PROGRAM); + ADD_KEYCODE(KEY_CHANNEL); + ADD_KEYCODE(KEY_FAVORITES); + ADD_KEYCODE(KEY_EPG); + ADD_KEYCODE(KEY_PVR); + ADD_KEYCODE(KEY_MHP); + ADD_KEYCODE(KEY_LANGUAGE); + ADD_KEYCODE(KEY_TITLE); + ADD_KEYCODE(KEY_SUBTITLE); + ADD_KEYCODE(KEY_ANGLE); + ADD_KEYCODE(KEY_ZOOM); + ADD_KEYCODE(KEY_MODE); + ADD_KEYCODE(KEY_KEYBOARD); + ADD_KEYCODE(KEY_SCREEN); + ADD_KEYCODE(KEY_PC); + ADD_KEYCODE(KEY_TV); + ADD_KEYCODE(KEY_TV2); + ADD_KEYCODE(KEY_VCR); + ADD_KEYCODE(KEY_VCR2); + ADD_KEYCODE(KEY_SAT); + ADD_KEYCODE(KEY_SAT2); + ADD_KEYCODE(KEY_CD); + ADD_KEYCODE(KEY_TAPE); + ADD_KEYCODE(KEY_RADIO); + ADD_KEYCODE(KEY_TUNER); + ADD_KEYCODE(KEY_PLAYER); + ADD_KEYCODE(KEY_TEXT); + ADD_KEYCODE(KEY_DVD); + ADD_KEYCODE(KEY_AUX); + ADD_KEYCODE(KEY_MP3); + ADD_KEYCODE(KEY_AUDIO); + ADD_KEYCODE(KEY_VIDEO); + ADD_KEYCODE(KEY_DIRECTORY); + ADD_KEYCODE(KEY_LIST); + ADD_KEYCODE(KEY_MEMO); + ADD_KEYCODE(KEY_CALENDAR); + ADD_KEYCODE(KEY_RED); + ADD_KEYCODE(KEY_GREEN); + ADD_KEYCODE(KEY_YELLOW); + ADD_KEYCODE(KEY_BLUE); + ADD_KEYCODE(KEY_CHANNELUP); + ADD_KEYCODE(KEY_CHANNELDOWN); + ADD_KEYCODE(KEY_FIRST); + ADD_KEYCODE(KEY_LAST); + ADD_KEYCODE(KEY_AB); + ADD_KEYCODE(KEY_NEXT); + ADD_KEYCODE(KEY_RESTART); + ADD_KEYCODE(KEY_SLOW); + ADD_KEYCODE(KEY_SHUFFLE); + ADD_KEYCODE(KEY_BREAK); + ADD_KEYCODE(KEY_PREVIOUS); + ADD_KEYCODE(KEY_DIGITS); + ADD_KEYCODE(KEY_TEEN); + ADD_KEYCODE(KEY_TWEN); + ADD_KEYCODE(KEY_DEL_EOL); + ADD_KEYCODE(KEY_DEL_EOS); + ADD_KEYCODE(KEY_INS_LINE); + ADD_KEYCODE(KEY_DEL_LINE); + ADD_KEYCODE(KEY_VIDEOPHONE); + ADD_KEYCODE(KEY_GAMES); + ADD_KEYCODE(KEY_ZOOMIN); + ADD_KEYCODE(KEY_ZOOMOUT); + ADD_KEYCODE(KEY_ZOOMRESET); + ADD_KEYCODE(KEY_WORDPROCESSOR); + ADD_KEYCODE(KEY_EDITOR); + ADD_KEYCODE(KEY_SPREADSHEET); + ADD_KEYCODE(KEY_GRAPHICSEDITOR); + ADD_KEYCODE(KEY_PRESENTATION); + ADD_KEYCODE(KEY_DATABASE); + ADD_KEYCODE(KEY_NEWS); + ADD_KEYCODE(KEY_VOICEMAIL); + ADD_KEYCODE(KEY_ADDRESSBOOK); + ADD_KEYCODE(KEY_MESSENGER); + ADD_KEYCODE(KEY_DISPLAYTOGGLE); + #ifdef KEY_SPELLCHECK + ADD_KEYCODE(KEY_SPELLCHECK); + #endif + #ifdef KEY_LOGOFF + ADD_KEYCODE(KEY_LOGOFF); + #endif + #ifdef KEY_DOLLAR + ADD_KEYCODE(KEY_DOLLAR); + #endif + #ifdef KEY_EURO + ADD_KEYCODE(KEY_EURO); + #endif + #ifdef KEY_FRAMEBACK + ADD_KEYCODE(KEY_FRAMEBACK); + #endif + #ifdef KEY_FRAMEFORWARD + ADD_KEYCODE(KEY_FRAMEFORWARD); + #endif + #ifdef KEY_CONTEXT_MENU + ADD_KEYCODE(KEY_CONTEXT_MENU); + #endif + #ifdef KEY_MEDIA_REPEAT + ADD_KEYCODE(KEY_MEDIA_REPEAT); + #endif + #ifdef KEY_10CHANNELSUP + ADD_KEYCODE(KEY_10CHANNELSUP); + #endif + #ifdef KEY_10CHANNELSDOWN + ADD_KEYCODE(KEY_10CHANNELSDOWN); + #endif + #ifdef KEY_IMAGES + ADD_KEYCODE(KEY_IMAGES); + #endif + ADD_KEYCODE(KEY_DEL_EOL); + ADD_KEYCODE(KEY_DEL_EOS); + ADD_KEYCODE(KEY_INS_LINE); + ADD_KEYCODE(KEY_DEL_LINE); + ADD_KEYCODE(KEY_FN); + ADD_KEYCODE(KEY_FN_ESC); + ADD_KEYCODE(KEY_FN_F1); + ADD_KEYCODE(KEY_FN_F2); + ADD_KEYCODE(KEY_FN_F3); + ADD_KEYCODE(KEY_FN_F4); + ADD_KEYCODE(KEY_FN_F5); + ADD_KEYCODE(KEY_FN_F6); + ADD_KEYCODE(KEY_FN_F7); + ADD_KEYCODE(KEY_FN_F8); + ADD_KEYCODE(KEY_FN_F9); + ADD_KEYCODE(KEY_FN_F10); + ADD_KEYCODE(KEY_FN_F11); + ADD_KEYCODE(KEY_FN_F12); + ADD_KEYCODE(KEY_FN_1); + ADD_KEYCODE(KEY_FN_2); + ADD_KEYCODE(KEY_FN_D); + ADD_KEYCODE(KEY_FN_E); + ADD_KEYCODE(KEY_FN_F); + ADD_KEYCODE(KEY_FN_S); + ADD_KEYCODE(KEY_FN_B); + ADD_KEYCODE(KEY_BRL_DOT1); + ADD_KEYCODE(KEY_BRL_DOT2); + ADD_KEYCODE(KEY_BRL_DOT3); + ADD_KEYCODE(KEY_BRL_DOT4); + ADD_KEYCODE(KEY_BRL_DOT5); + ADD_KEYCODE(KEY_BRL_DOT6); + ADD_KEYCODE(KEY_BRL_DOT7); + ADD_KEYCODE(KEY_BRL_DOT8); + ADD_KEYCODE(KEY_BRL_DOT9); + ADD_KEYCODE(KEY_BRL_DOT10); + #ifdef KEY_NUMERIC_0 + ADD_KEYCODE(KEY_NUMERIC_0); + ADD_KEYCODE(KEY_NUMERIC_1); + ADD_KEYCODE(KEY_NUMERIC_2); + ADD_KEYCODE(KEY_NUMERIC_3); + ADD_KEYCODE(KEY_NUMERIC_4); + ADD_KEYCODE(KEY_NUMERIC_5); + ADD_KEYCODE(KEY_NUMERIC_6); + ADD_KEYCODE(KEY_NUMERIC_7); + ADD_KEYCODE(KEY_NUMERIC_8); + ADD_KEYCODE(KEY_NUMERIC_9); + ADD_KEYCODE(KEY_NUMERIC_STAR); + ADD_KEYCODE(KEY_NUMERIC_POUND); + #endif + ADD_KEYCODE(KEY_BATTERY); + ADD_KEYCODE(KEY_BLUETOOTH); + ADD_KEYCODE(KEY_BRIGHTNESS_CYCLE); + ADD_KEYCODE(KEY_BRIGHTNESS_ZERO); + #ifdef KEY_DASHBOARD + ADD_KEYCODE(KEY_DASHBOARD); + #endif + ADD_KEYCODE(KEY_DISPLAY_OFF); + ADD_KEYCODE(KEY_DOCUMENTS); + ADD_KEYCODE(KEY_FORWARDMAIL); + ADD_KEYCODE(KEY_NEW); + ADD_KEYCODE(KEY_KBDILLUMDOWN); + ADD_KEYCODE(KEY_KBDILLUMUP); + ADD_KEYCODE(KEY_KBDILLUMTOGGLE); + ADD_KEYCODE(KEY_REDO); + ADD_KEYCODE(KEY_REPLY); + ADD_KEYCODE(KEY_SAVE); + #ifdef KEY_SCALE + ADD_KEYCODE(KEY_SCALE); + #endif + ADD_KEYCODE(KEY_SEND); + ADD_KEYCODE(KEY_SCREENLOCK); + ADD_KEYCODE(KEY_SWITCHVIDEOMODE); + #ifdef KEY_UWB + ADD_KEYCODE(KEY_UWB); + #endif + #ifdef KEY_VIDEO_NEXT + ADD_KEYCODE(KEY_VIDEO_NEXT); + #endif + #ifdef KEY_VIDEO_PREV + ADD_KEYCODE(KEY_VIDEO_PREV); + #endif + #ifdef KEY_WIMAX + ADD_KEYCODE(KEY_WIMAX); + #endif + #ifdef KEY_WLAN + ADD_KEYCODE(KEY_WLAN); + #endif + #ifdef KEY_RFKILL + ADD_KEYCODE(KEY_RFKILL); + #endif + #ifdef KEY_MICMUTE + ADD_KEYCODE(KEY_MICMUTE); + #endif + #ifdef KEY_CAMERA_FOCUS + ADD_KEYCODE(KEY_CAMERA_FOCUS); + #endif + #ifdef KEY_WPS_BUTTON + ADD_KEYCODE(KEY_WPS_BUTTON); + #endif + #ifdef KEY_TOUCHPAD_TOGGLE + ADD_KEYCODE(KEY_TOUCHPAD_TOGGLE); + ADD_KEYCODE(KEY_TOUCHPAD_ON); + ADD_KEYCODE(KEY_TOUCHPAD_OFF); + #endif + #ifdef KEY_CAMERA_ZOOMIN + ADD_KEYCODE(KEY_CAMERA_ZOOMIN); + ADD_KEYCODE(KEY_CAMERA_ZOOMOUT); + ADD_KEYCODE(KEY_CAMERA_UP); + ADD_KEYCODE(KEY_CAMERA_DOWN); + ADD_KEYCODE(KEY_CAMERA_LEFT); + ADD_KEYCODE(KEY_CAMERA_RIGHT); + #endif + #ifdef KEY_ATTENDANT_ON + ADD_KEYCODE(KEY_ATTENDANT_ON); + ADD_KEYCODE(KEY_ATTENDANT_OFF); + ADD_KEYCODE(KEY_ATTENDANT_TOGGLE); + ADD_KEYCODE(KEY_LIGHTS_TOGGLE); + #endif + + ADD_KEYCODE(BTN_0); + ADD_KEYCODE(BTN_1); + ADD_KEYCODE(BTN_2); + ADD_KEYCODE(BTN_3); + ADD_KEYCODE(BTN_4); + ADD_KEYCODE(BTN_5); + ADD_KEYCODE(BTN_6); + ADD_KEYCODE(BTN_7); + ADD_KEYCODE(BTN_8); + ADD_KEYCODE(BTN_9); + ADD_KEYCODE(BTN_LEFT); + ADD_KEYCODE(BTN_RIGHT); + ADD_KEYCODE(BTN_MIDDLE); + ADD_KEYCODE(BTN_SIDE); + ADD_KEYCODE(BTN_EXTRA); + ADD_KEYCODE(BTN_FORWARD); + ADD_KEYCODE(BTN_BACK); + ADD_KEYCODE(BTN_TASK); + ADD_KEYCODE(BTN_TRIGGER); + ADD_KEYCODE(BTN_THUMB); + ADD_KEYCODE(BTN_THUMB2); + ADD_KEYCODE(BTN_TOP); + ADD_KEYCODE(BTN_TOP2); + ADD_KEYCODE(BTN_PINKIE); + ADD_KEYCODE(BTN_BASE); + ADD_KEYCODE(BTN_BASE2); + ADD_KEYCODE(BTN_BASE3); + ADD_KEYCODE(BTN_BASE4); + ADD_KEYCODE(BTN_BASE5); + ADD_KEYCODE(BTN_BASE6); + ADD_KEYCODE(BTN_DEAD); + ADD_KEYCODE(BTN_C); + #ifdef BTN_SOUTH + ADD_KEYCODE(BTN_SOUTH); + ADD_KEYCODE(BTN_EAST); + ADD_KEYCODE(BTN_NORTH); + ADD_KEYCODE(BTN_WEST); + #endif + ADD_KEYCODE(BTN_A); + ADD_KEYCODE(BTN_B); + ADD_KEYCODE(BTN_X); + ADD_KEYCODE(BTN_Y); + ADD_KEYCODE(BTN_Z); + ADD_KEYCODE(BTN_TL); + ADD_KEYCODE(BTN_TR); + ADD_KEYCODE(BTN_TL2); + ADD_KEYCODE(BTN_TR2); + ADD_KEYCODE(BTN_SELECT); + ADD_KEYCODE(BTN_START); + ADD_KEYCODE(BTN_MODE); + ADD_KEYCODE(BTN_THUMBL); + ADD_KEYCODE(BTN_THUMBR); + ADD_KEYCODE(BTN_TOOL_PEN); + ADD_KEYCODE(BTN_TOOL_RUBBER); + ADD_KEYCODE(BTN_TOOL_BRUSH); + ADD_KEYCODE(BTN_TOOL_PENCIL); + ADD_KEYCODE(BTN_TOOL_AIRBRUSH); + ADD_KEYCODE(BTN_TOOL_FINGER); + ADD_KEYCODE(BTN_TOOL_MOUSE); + ADD_KEYCODE(BTN_TOOL_LENS); + ADD_KEYCODE(BTN_TOUCH); + ADD_KEYCODE(BTN_STYLUS); + ADD_KEYCODE(BTN_STYLUS2); + ADD_KEYCODE(BTN_TOOL_DOUBLETAP); + ADD_KEYCODE(BTN_TOOL_TRIPLETAP); + #ifdef BTN_TOOL_QUADTAP + ADD_KEYCODE(BTN_TOOL_QUADTAP); + #endif + ADD_KEYCODE(BTN_GEAR_DOWN); + ADD_KEYCODE(BTN_GEAR_UP); + + #ifdef BTN_DPAD_UP + ADD_KEYCODE(BTN_DPAD_UP); + ADD_KEYCODE(BTN_DPAD_DOWN); + ADD_KEYCODE(BTN_DPAD_LEFT); + ADD_KEYCODE(BTN_DPAD_RIGHT); + #endif + #ifdef KEY_ALS_TOGGLE + ADD_KEYCODE(KEY_ALS_TOGGLE); + #endif + #ifdef KEY_BUTTONCONFIG + ADD_KEYCODE(KEY_BUTTONCONFIG); + #endif + #ifdef KEY_TASKMANAGER + ADD_KEYCODE(KEY_TASKMANAGER); + #endif + #ifdef KEY_JOURNAL + ADD_KEYCODE(KEY_JOURNAL); + #endif + #ifdef KEY_CONTROLPANEL + ADD_KEYCODE(KEY_CONTROLPANEL); + #endif + #ifdef KEY_APPSELECT + ADD_KEYCODE(KEY_APPSELECT); + #endif + #ifdef KEY_SCREENSAVER + ADD_KEYCODE(KEY_SCREENSAVER); + #endif + #ifdef KEY_VOICECOMMAND + ADD_KEYCODE(KEY_VOICECOMMAND); + #endif + #ifdef KEY_BRIGHTNESS_MIN + ADD_KEYCODE(KEY_BRIGHTNESS_MIN); + #endif + #ifdef KEY_BRIGHTNESS_MAX + ADD_KEYCODE(KEY_BRIGHTNESS_MAX); + #endif + #ifdef KEY_KBDINPUTASSIST_PREV + ADD_KEYCODE(KEY_KBDINPUTASSIST_PREV); + #endif + #ifdef KEY_KBDINPUTASSIST_NEXT + ADD_KEYCODE(KEY_KBDINPUTASSIST_NEXT); + #endif + #ifdef KEY_KBDINPUTASSIST_PREVGROUP + ADD_KEYCODE(KEY_KBDINPUTASSIST_PREVGROUP); + #endif + #ifdef KEY_KBDINPUTASSIST_NEXTGROUP + ADD_KEYCODE(KEY_KBDINPUTASSIST_NEXTGROUP); + #endif + #ifdef KEY_KBDINPUTASSIST_ACCEPT + ADD_KEYCODE(KEY_KBDINPUTASSIST_ACCEPT); + #endif + #ifdef KEY_KBDINPUTASSIST_CANCEL + ADD_KEYCODE(KEY_KBDINPUTASSIST_CANCEL); + #endif + #ifdef BTN_TRIGGER_HAPPY + ADD_KEYCODE(BTN_TRIGGER_HAPPY1); + ADD_KEYCODE(BTN_TRIGGER_HAPPY2); + ADD_KEYCODE(BTN_TRIGGER_HAPPY3); + ADD_KEYCODE(BTN_TRIGGER_HAPPY4); + ADD_KEYCODE(BTN_TRIGGER_HAPPY5); + ADD_KEYCODE(BTN_TRIGGER_HAPPY6); + ADD_KEYCODE(BTN_TRIGGER_HAPPY7); + ADD_KEYCODE(BTN_TRIGGER_HAPPY8); + ADD_KEYCODE(BTN_TRIGGER_HAPPY9); + ADD_KEYCODE(BTN_TRIGGER_HAPPY10); + ADD_KEYCODE(BTN_TRIGGER_HAPPY11); + ADD_KEYCODE(BTN_TRIGGER_HAPPY12); + ADD_KEYCODE(BTN_TRIGGER_HAPPY13); + ADD_KEYCODE(BTN_TRIGGER_HAPPY14); + ADD_KEYCODE(BTN_TRIGGER_HAPPY15); + ADD_KEYCODE(BTN_TRIGGER_HAPPY16); + ADD_KEYCODE(BTN_TRIGGER_HAPPY17); + ADD_KEYCODE(BTN_TRIGGER_HAPPY18); + ADD_KEYCODE(BTN_TRIGGER_HAPPY19); + ADD_KEYCODE(BTN_TRIGGER_HAPPY20); + ADD_KEYCODE(BTN_TRIGGER_HAPPY21); + ADD_KEYCODE(BTN_TRIGGER_HAPPY22); + ADD_KEYCODE(BTN_TRIGGER_HAPPY23); + ADD_KEYCODE(BTN_TRIGGER_HAPPY24); + ADD_KEYCODE(BTN_TRIGGER_HAPPY25); + ADD_KEYCODE(BTN_TRIGGER_HAPPY26); + ADD_KEYCODE(BTN_TRIGGER_HAPPY27); + ADD_KEYCODE(BTN_TRIGGER_HAPPY28); + ADD_KEYCODE(BTN_TRIGGER_HAPPY29); + ADD_KEYCODE(BTN_TRIGGER_HAPPY30); + ADD_KEYCODE(BTN_TRIGGER_HAPPY31); + ADD_KEYCODE(BTN_TRIGGER_HAPPY32); + ADD_KEYCODE(BTN_TRIGGER_HAPPY33); + ADD_KEYCODE(BTN_TRIGGER_HAPPY34); + ADD_KEYCODE(BTN_TRIGGER_HAPPY35); + ADD_KEYCODE(BTN_TRIGGER_HAPPY36); + ADD_KEYCODE(BTN_TRIGGER_HAPPY37); + ADD_KEYCODE(BTN_TRIGGER_HAPPY38); + ADD_KEYCODE(BTN_TRIGGER_HAPPY39); + ADD_KEYCODE(BTN_TRIGGER_HAPPY40); + #endif + #ifdef BTN_TOOL_QUINTTAP + ADD_KEYCODE(BTN_TOOL_QUINTTAP); + #endif +}; + + + diff --git a/core/linux-dist/evdev_keycodes.h b/core/linux-dist/evdev_keycodes.h new file mode 100644 index 000000000..66877e6c0 --- /dev/null +++ b/core/linux-dist/evdev_keycodes.h @@ -0,0 +1,7 @@ +#pragma once +#include +#include +extern std::map evdev_keycodes; +extern void evdev_init_keycodes(); + + diff --git a/core/linux-dist/main.cpp b/core/linux-dist/main.cpp index 3df0bd1ea..1c2dbf3a0 100755 --- a/core/linux-dist/main.cpp +++ b/core/linux-dist/main.cpp @@ -95,10 +95,14 @@ void emit_WriteCodeCache(); void SetupInput() { #if defined(USE_EVDEV) + evdev_init_keycodes(); //FIXME: This sucks, but initializer lists for maps are only available with std=c++0x + int evdev_device_id[4] = { -1, -1, -1, -1 }; + char* mapping = NULL; size_t size_needed; - int evdev_device_length, port, i; + int port, i; + char* evdev_device; for (port = 0; port < 4; port++) @@ -106,8 +110,8 @@ void SetupInput() size_needed = snprintf(NULL, 0, EVDEV_DEVICE_CONFIG_KEY, port+1) + 1; char* evdev_config_key = (char*)malloc(size_needed); sprintf(evdev_config_key, EVDEV_DEVICE_CONFIG_KEY, port+1); - evdev_device_id[port] = cfgLoadInt("input", evdev_config_key, EVDEV_DEFAULT_DEVICE_ID(port+1)); + free(evdev_config_key); // Check if the same device is already in use on another port if (evdev_device_id[port] < 0) @@ -124,14 +128,30 @@ void SetupInput() } } - evdev_device_length = snprintf(NULL, 0, EVDEV_DEVICE_STRING, evdev_device_id[port]); - evdev_device = (char*)malloc(evdev_device_length + 1); + size_needed = snprintf(NULL, 0, EVDEV_DEVICE_STRING, evdev_device_id[port]) + 1; + evdev_device = (char*)malloc(size_needed); sprintf(evdev_device, EVDEV_DEVICE_STRING, evdev_device_id[port]); - input_evdev_init(&controllers[port], evdev_device); + + mapping = NULL; + + size_needed = snprintf(NULL, 0, EVDEV_MAPPING_CONFIG_KEY, port+1) + 1; + evdev_config_key = (char*)malloc(size_needed); + sprintf(evdev_config_key, EVDEV_MAPPING_CONFIG_KEY, port+1); + if (cfgExists("input", evdev_config_key) == 2) + { + string mapping_name = cfgLoadStr("input", evdev_config_key, ""); + + size_needed = snprintf(NULL, 0, EVDEV_MAPPING_PATH, mapping_name.c_str()) + 1; + char* evdev_mapping_fname = (char*)malloc(size_needed); + sprintf(evdev_mapping_fname, EVDEV_MAPPING_PATH, mapping_name.c_str()); + mapping = (char*)GetPath(evdev_mapping_fname).c_str(); + free(evdev_mapping_fname); + } + free(evdev_config_key); + + input_evdev_init(&controllers[port], evdev_device, mapping); free(evdev_device); } - - free(evdev_config_key); } #endif @@ -287,3 +307,5 @@ void os_DebugBreak() exit(-1); #endif } + +