linux-dist/evdev: Support custom mapping files

This commit is contained in:
Jan Holthuis 2015-08-18 20:57:18 +02:00
parent 3eee909801
commit 5c01098cab
5 changed files with 831 additions and 33 deletions

View File

@ -3,10 +3,79 @@
#include <linux/input.h>
#include "linux-dist/evdev.h"
#include "linux-dist/main.h"
#include "cfg/ini.h"
#include <vector>
#include <map>
#if defined(USE_EVDEV)
std::map<std::string, ControllerMapping> 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", "<Unknown>").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

View File

@ -1,6 +1,7 @@
#include "types.h"
#include "linux-dist/evdev_mappings.h"
#include <linux/input.h>
#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);

View File

@ -0,0 +1,665 @@
#include <linux/input.h>
#include "linux-dist/evdev_keycodes.h"
#define ADD_KEYCODE(code) evdev_keycodes.insert(std::make_pair (#code, code))
std::map<std::string,int> 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
};

View File

@ -0,0 +1,7 @@
#pragma once
#include <map>
#include <string>
extern std::map<std::string,int> evdev_keycodes;
extern void evdev_init_keycodes();

View File

@ -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
}