pax_global_header00006660000000000000000000000064136205500440014511gustar00rootroot0000000000000052 comment=d7360d05e1e7540af7e7fb566d8d4bff254bd309 libevdevPlus-0.1.1/000077500000000000000000000000001362055004400141545ustar00rootroot00000000000000libevdevPlus-0.1.1/.gitlab-ci.yml000066400000000000000000000024741362055004400166170ustar00rootroot00000000000000before_script: - apt update - apt install -y build-essential cmake git rpm build:debian:9: stage: build image: debian:9 artifacts: untracked: true script: - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS='-O1 -g' .. - make package:debian:9: stage: deploy dependencies: - build:debian:9 script: - cd build && make package artifacts: paths: - "build/*.deb" - "build/*.a" - "build/*.so.*.*.*" build:ubuntu:18.04: stage: build image: ubuntu:18.04 artifacts: untracked: true script: - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS='-O1 -g' .. - make package:ubuntu:18.04: stage: deploy dependencies: - build:ubuntu:18.04 script: - cd build && make package artifacts: paths: - "build/*.deb" - "build/*.a" - "build/*.so.*.*.*" build:ubuntu:19.04: stage: build image: ubuntu:19.04 artifacts: untracked: true script: - mkdir build - cd build - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS='-O1 -g' .. - make package:ubuntu:19.04: stage: deploy dependencies: - build:ubuntu:19.04 script: - cd build && make package artifacts: paths: - "build/*.deb" - "build/*.a" - "build/*.so.*.*.*"libevdevPlus-0.1.1/CMakeLists.txt000066400000000000000000000035321362055004400167170ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.0) project(libevdevPlus) set(CMAKE_CXX_STANDARD 11) set(PROJECT_VERSION "0.1.1") set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_VERSION_MAJOR "0") set(CPACK_PACKAGE_VERSION_MINOR "1") set(CPACK_PACKAGE_VERSION_PATCH "1") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "An easy-to-use C++ event device library") set(CPACK_PACKAGE_CONTACT "Yuki Workshop ") set(CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/YukiWorkshop/libevdevPlus") set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CMAKE_PROJECT_HOMEPAGE_URL}) set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.14), libstdc++6 (>= 5.2)") set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME}_${PROJECT_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}) set(CPACK_DEBIAN_DEBUGINFO_PACKAGE yes) set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") set(CPACK_GENERATOR "DEB;RPM;TXZ") set(CPACK_SOURCE_GENERATOR "DEB;RPM;TXZ") include(CPack) include(GNUInstallDirs) set(SOURCE_FILES evdevPlus.cpp evdevPlus.hpp CommonIncludes.hpp InputEvent.hpp Resource.cpp) add_library(evdevPlus SHARED ${SOURCE_FILES}) add_library(evdevPlus_Static STATIC ${SOURCE_FILES}) set_target_properties(evdevPlus PROPERTIES VERSION ${PROJECT_VERSION}) set_target_properties(evdevPlus PROPERTIES SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) set_target_properties(evdevPlus_Static PROPERTIES OUTPUT_NAME evdevPlus) add_executable(evdevPlus_test test.cpp) target_link_libraries(evdevPlus_test evdevPlus) configure_file(evdevPlus.pc.in evdevPlus.pc @ONLY) install(TARGETS evdevPlus LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS evdevPlus_Static DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(FILES evdevPlus.hpp InputEvent.hpp CommonIncludes.hpp DESTINATION include/evdevPlus/) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/evdevPlus.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/) libevdevPlus-0.1.1/CommonIncludes.hpp000066400000000000000000000015761362055004400176150ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef LIBEVDEVPLUS_COMMONINCLUDES_HPP #define LIBEVDEVPLUS_COMMONINCLUDES_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif //LIBEVDEVPLUS_COMMONINCLUDES_HPP libevdevPlus-0.1.1/InputEvent.hpp000066400000000000000000000026621362055004400167740ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef LIBEVDEVPLUS_INPUTEVENT_HPP #define LIBEVDEVPLUS_INPUTEVENT_HPP #include "CommonIncludes.hpp" namespace evdevPlus { class InputEvent { public: input_event event{}; timeval &Time = event.time; uint16_t &Type = event.type; uint16_t &Code = event.code; int32_t &Value = event.value; InputEvent() = default; InputEvent(input_event *__event) { memcpy(&event, __event, sizeof(input_event)); } InputEvent(uint16_t type, uint16_t code, uint16_t value, timeval *time = NULL) { Type = type; Code = code; Value = value; if (time) memcpy(&event.time, time, sizeof(timeval)); } friend void swap(InputEvent &first, InputEvent &second) { using std::swap; swap(first.event, second.event); } InputEvent(InputEvent &&other) noexcept : InputEvent() { swap(*this, other); } InputEvent& operator= (InputEvent other) { swap(*this, other); return *this; } InputEvent(const InputEvent &other) { memcpy(&event, &(other.event), sizeof(input_event)); } }; } #endif //LIBEVDEVPLUS_INPUTEVENT_HPP libevdevPlus-0.1.1/LICENSE000066400000000000000000000020551362055004400151630ustar00rootroot00000000000000MIT License Copyright (c) 2018 YukiWorkshop Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. libevdevPlus-0.1.1/README.md000066400000000000000000000010341362055004400154310ustar00rootroot00000000000000# libevdevPlus [![pipeline status](https://gitlab.com/ReimuNotMoe/libevdevPlus/badges/master/pipeline.svg)](https://gitlab.com/ReimuNotMoe/libevdevPlus/pipelines) ## Releases - [Ubuntu 18.04](https://gitlab.com/ReimuNotMoe/libevdevPlus/-/jobs/artifacts/master/browse/build?job=package:ubuntu:18.04) - [Ubuntu 19.04](https://gitlab.com/ReimuNotMoe/libevdevPlus/-/jobs/artifacts/master/browse/build?job=package:ubuntu:19.04) - [Debian 9](https://gitlab.com/ReimuNotMoe/libevdevPlus/-/jobs/artifacts/master/browse/build?job=package:debian:9)libevdevPlus-0.1.1/Resource.cpp000066400000000000000000000502661362055004400164600ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "evdevPlus.hpp" const std::unordered_map evdevPlus::Table_ModifierKeys = { {"ALT", KEY_LEFTALT}, {"ALT_L", KEY_LEFTALT}, {"ALT_R", KEY_RIGHTALT}, {"SHIFT", KEY_LEFTSHIFT}, {"SHIFT_L", KEY_LEFTSHIFT}, {"SHIFT_R", KEY_RIGHTSHIFT}, {"CTRL", KEY_LEFTCTRL}, {"CTRL_L", KEY_LEFTCTRL}, {"CTRL_R", KEY_RIGHTCTRL}, {"SUPER", KEY_LEFTMETA}, {"SUPER_L", KEY_LEFTMETA}, {"SUPER_R", KEY_RIGHTMETA}, {"META", KEY_LEFTMETA}, {"META_L", KEY_LEFTMETA}, {"META_R", KEY_RIGHTMETA} }; const std::unordered_map evdevPlus::Table_FunctionKeys = { {"UP", KEY_UP}, {"DOWN", KEY_DOWN}, {"LEFT", KEY_LEFT}, {"RIGHT", KEY_RIGHT}, {"TAB", KEY_TAB}, {"CAPSLOCK", KEY_CAPSLOCK}, {"NUMLOCK", KEY_NUMLOCK}, {"SCROLLLOCK", KEY_SCROLLLOCK}, {"ESC", KEY_ESC}, {"ENTER", KEY_ENTER}, {"BACKSPACE", KEY_BACKSPACE}, {"DELETE", KEY_DELETE}, {"INSERT", KEY_INSERT}, {"HOME", KEY_HOME}, {"END", KEY_END}, {"PAGEUP", KEY_PAGEUP}, {"PAGEDOWN", KEY_PAGEDOWN}, {"SYSRQ", KEY_SYSRQ}, {"PAUSE", KEY_PAUSE}, {"F1", KEY_F1}, {"F2", KEY_F2}, {"F3", KEY_F3}, {"F4", KEY_F4}, {"F5", KEY_F5}, {"F6", KEY_F6}, {"F7", KEY_F7}, {"F8", KEY_F8}, {"F9", KEY_F9}, {"F10", KEY_F10}, {"F11", KEY_F11}, {"F12", KEY_F12} }; const std::unordered_map evdevPlus::Table_LowerKeys = { {'\n', KEY_ENTER}, {'\t', KEY_TAB}, {' ', KEY_SPACE}, {'.', KEY_DOT}, {',', KEY_COMMA}, {'/', KEY_SLASH}, {'\\', KEY_BACKSLASH}, {';', KEY_SEMICOLON}, {'-', KEY_MINUS}, {'=', KEY_EQUAL}, {'`', KEY_GRAVE}, {'\'', KEY_APOSTROPHE}, {'[', KEY_LEFTBRACE}, {']', KEY_RIGHTBRACE}, {'0', KEY_0}, {'1', KEY_1}, {'2', KEY_2}, {'3', KEY_3}, {'4', KEY_4}, {'5', KEY_5}, {'6', KEY_6}, {'7', KEY_7}, {'8', KEY_8}, {'9', KEY_9}, {'a', KEY_A}, {'b', KEY_B}, {'c', KEY_C}, {'d', KEY_D}, {'e', KEY_E}, {'f', KEY_F}, {'g', KEY_G}, {'h', KEY_H}, {'i', KEY_I}, {'j', KEY_J}, {'k', KEY_K}, {'l', KEY_L}, {'m', KEY_M}, {'n', KEY_N}, {'o', KEY_O}, {'p', KEY_P}, {'q', KEY_Q}, {'r', KEY_R}, {'s', KEY_S}, {'t', KEY_T}, {'u', KEY_U}, {'v', KEY_V}, {'w', KEY_W}, {'x', KEY_X}, {'y', KEY_Y}, {'z', KEY_Z} }; const std::unordered_map evdevPlus::Table_UpperKeys = { {'>', KEY_DOT}, {'<', KEY_COMMA}, {'?', KEY_SLASH}, {'|', KEY_BACKSLASH}, {':', KEY_SEMICOLON}, {'_', KEY_MINUS}, {'+', KEY_EQUAL}, {'~', KEY_GRAVE}, {'"', KEY_APOSTROPHE}, {'{', KEY_LEFTBRACE}, {'}', KEY_RIGHTBRACE}, {')', KEY_0}, {'!', KEY_1}, {'@', KEY_2}, {'#', KEY_3}, {'$', KEY_4}, {'%', KEY_5}, {'^', KEY_6}, {'&', KEY_7}, {'*', KEY_8}, {'(', KEY_9}, {'A', KEY_A}, {'B', KEY_B}, {'C', KEY_C}, {'D', KEY_D}, {'E', KEY_E}, {'F', KEY_F}, {'G', KEY_G}, {'H', KEY_H}, {'I', KEY_I}, {'J', KEY_J}, {'K', KEY_K}, {'L', KEY_L}, {'M', KEY_M}, {'N', KEY_N}, {'O', KEY_O}, {'P', KEY_P}, {'Q', KEY_Q}, {'R', KEY_R}, {'S', KEY_S}, {'T', KEY_T}, {'U', KEY_U}, {'V', KEY_V}, {'W', KEY_W}, {'X', KEY_X}, {'Y', KEY_Y}, {'Z', KEY_Z} }; const std::unordered_map evdevPlus::Table_KeyCodes = { {"EV_KEY", EV_KEY}, {"EV_REL", EV_REL}, {"EV_ABS", EV_ABS}, {"KEY_ESC", KEY_ESC}, {"KEY_1", KEY_1}, {"KEY_2", KEY_2}, {"KEY_3", KEY_3}, {"KEY_4", KEY_4}, {"KEY_5", KEY_5}, {"KEY_6", KEY_6}, {"KEY_7", KEY_7}, {"KEY_8", KEY_8}, {"KEY_9", KEY_9}, {"KEY_0", KEY_0}, {"KEY_MINUS", KEY_MINUS}, {"KEY_EQUAL", KEY_EQUAL}, {"KEY_BACKSPACE", KEY_BACKSPACE}, {"KEY_TAB", KEY_TAB}, {"KEY_Q", KEY_Q}, {"KEY_W", KEY_W}, {"KEY_E", KEY_E}, {"KEY_R", KEY_R}, {"KEY_T", KEY_T}, {"KEY_Y", KEY_Y}, {"KEY_U", KEY_U}, {"KEY_I", KEY_I}, {"KEY_O", KEY_O}, {"KEY_P", KEY_P}, {"KEY_LEFTBRACE", KEY_LEFTBRACE}, {"KEY_RIGHTBRACE", KEY_RIGHTBRACE}, {"KEY_ENTER", KEY_ENTER}, {"KEY_LEFTCTRL", KEY_LEFTCTRL}, {"KEY_A", KEY_A}, {"KEY_S", KEY_S}, {"KEY_D", KEY_D}, {"KEY_F", KEY_F}, {"KEY_G", KEY_G}, {"KEY_H", KEY_H}, {"KEY_J", KEY_J}, {"KEY_K", KEY_K}, {"KEY_L", KEY_L}, {"KEY_SEMICOLON", KEY_SEMICOLON}, {"KEY_APOSTROPHE", KEY_APOSTROPHE}, {"KEY_GRAVE", KEY_GRAVE}, {"KEY_LEFTSHIFT", KEY_LEFTSHIFT}, {"KEY_BACKSLASH", KEY_BACKSLASH}, {"KEY_Z", KEY_Z}, {"KEY_X", KEY_X}, {"KEY_C", KEY_C}, {"KEY_V", KEY_V}, {"KEY_B", KEY_B}, {"KEY_N", KEY_N}, {"KEY_M", KEY_M}, {"KEY_COMMA", KEY_COMMA}, {"KEY_DOT", KEY_DOT}, {"KEY_SLASH", KEY_SLASH}, {"KEY_RIGHTSHIFT", KEY_RIGHTSHIFT}, {"KEY_KPASTERISK", KEY_KPASTERISK}, {"KEY_LEFTALT", KEY_LEFTALT}, {"KEY_SPACE", KEY_SPACE}, {"KEY_CAPSLOCK", KEY_CAPSLOCK}, {"KEY_F1", KEY_F1}, {"KEY_F2", KEY_F2}, {"KEY_F3", KEY_F3}, {"KEY_F4", KEY_F4}, {"KEY_F5", KEY_F5}, {"KEY_F6", KEY_F6}, {"KEY_F7", KEY_F7}, {"KEY_F8", KEY_F8}, {"KEY_F9", KEY_F9}, {"KEY_F10", KEY_F10}, {"KEY_NUMLOCK", KEY_NUMLOCK}, {"KEY_SCROLLLOCK", KEY_SCROLLLOCK}, {"KEY_KP7", KEY_KP7}, {"KEY_KP8", KEY_KP8}, {"KEY_KP9", KEY_KP9}, {"KEY_KPMINUS", KEY_KPMINUS}, {"KEY_KP4", KEY_KP4}, {"KEY_KP5", KEY_KP5}, {"KEY_KP6", KEY_KP6}, {"KEY_KPPLUS", KEY_KPPLUS}, {"KEY_KP1", KEY_KP1}, {"KEY_KP2", KEY_KP2}, {"KEY_KP3", KEY_KP3}, {"KEY_KP0", KEY_KP0}, {"KEY_KPDOT", KEY_KPDOT}, {"KEY_ZENKAKUHANKAKU", KEY_ZENKAKUHANKAKU}, {"KEY_102ND", KEY_102ND}, {"KEY_F11", KEY_F11}, {"KEY_F12", KEY_F12}, {"KEY_RO", KEY_RO}, {"KEY_KATAKANA", KEY_KATAKANA}, {"KEY_HIRAGANA", KEY_HIRAGANA}, {"KEY_HENKAN", KEY_HENKAN}, {"KEY_KATAKANAHIRAGANA", KEY_KATAKANAHIRAGANA}, {"KEY_MUHENKAN", KEY_MUHENKAN}, {"KEY_KPJPCOMMA", KEY_KPJPCOMMA}, {"KEY_KPENTER", KEY_KPENTER}, {"KEY_RIGHTCTRL", KEY_RIGHTCTRL}, {"KEY_KPSLASH", KEY_KPSLASH}, {"KEY_SYSRQ", KEY_SYSRQ}, {"KEY_RIGHTALT", KEY_RIGHTALT}, {"KEY_LINEFEED", KEY_LINEFEED}, {"KEY_HOME", KEY_HOME}, {"KEY_UP", KEY_UP}, {"KEY_PAGEUP", KEY_PAGEUP}, {"KEY_LEFT", KEY_LEFT}, {"KEY_RIGHT", KEY_RIGHT}, {"KEY_END", KEY_END}, {"KEY_DOWN", KEY_DOWN}, {"KEY_PAGEDOWN", KEY_PAGEDOWN}, {"KEY_INSERT", KEY_INSERT}, {"KEY_DELETE", KEY_DELETE}, {"KEY_MACRO", KEY_MACRO}, {"KEY_MUTE", KEY_MUTE}, {"KEY_VOLUMEDOWN", KEY_VOLUMEDOWN}, {"KEY_VOLUMEUP", KEY_VOLUMEUP}, {"KEY_POWER", KEY_POWER}, {"KEY_KPEQUAL", KEY_KPEQUAL}, {"KEY_KPPLUSMINUS", KEY_KPPLUSMINUS}, {"KEY_PAUSE", KEY_PAUSE}, {"KEY_SCALE", KEY_SCALE}, {"KEY_KPCOMMA", KEY_KPCOMMA}, {"KEY_HANGEUL", KEY_HANGEUL}, {"KEY_HANGUEL", KEY_HANGUEL}, {"KEY_HANJA", KEY_HANJA}, {"KEY_YEN", KEY_YEN}, {"KEY_LEFTMETA", KEY_LEFTMETA}, {"KEY_RIGHTMETA", KEY_RIGHTMETA}, {"KEY_COMPOSE", KEY_COMPOSE}, {"KEY_STOP", KEY_STOP}, {"KEY_AGAIN", KEY_AGAIN}, {"KEY_PROPS", KEY_PROPS}, {"KEY_UNDO", KEY_UNDO}, {"KEY_FRONT", KEY_FRONT}, {"KEY_COPY", KEY_COPY}, {"KEY_OPEN", KEY_OPEN}, {"KEY_PASTE", KEY_PASTE}, {"KEY_FIND", KEY_FIND}, {"KEY_CUT", KEY_CUT}, {"KEY_HELP", KEY_HELP}, {"KEY_MENU", KEY_MENU}, {"KEY_CALC", KEY_CALC}, {"KEY_SETUP", KEY_SETUP}, {"KEY_SLEEP", KEY_SLEEP}, {"KEY_WAKEUP", KEY_WAKEUP}, {"KEY_FILE", KEY_FILE}, {"KEY_SENDFILE", KEY_SENDFILE}, {"KEY_DELETEFILE", KEY_DELETEFILE}, {"KEY_XFER", KEY_XFER}, {"KEY_PROG1", KEY_PROG1}, {"KEY_PROG2", KEY_PROG2}, {"KEY_WWW", KEY_WWW}, {"KEY_MSDOS", KEY_MSDOS}, {"KEY_COFFEE", KEY_COFFEE}, {"KEY_SCREENLOCK", KEY_SCREENLOCK}, {"KEY_ROTATE_DISPLAY", KEY_ROTATE_DISPLAY}, {"KEY_DIRECTION", KEY_DIRECTION}, {"KEY_CYCLEWINDOWS", KEY_CYCLEWINDOWS}, {"KEY_MAIL", KEY_MAIL}, {"KEY_BOOKMARKS", KEY_BOOKMARKS}, {"KEY_COMPUTER", KEY_COMPUTER}, {"KEY_BACK", KEY_BACK}, {"KEY_FORWARD", KEY_FORWARD}, {"KEY_CLOSECD", KEY_CLOSECD}, {"KEY_EJECTCD", KEY_EJECTCD}, {"KEY_EJECTCLOSECD", KEY_EJECTCLOSECD}, {"KEY_NEXTSONG", KEY_NEXTSONG}, {"KEY_PLAYPAUSE", KEY_PLAYPAUSE}, {"KEY_PREVIOUSSONG", KEY_PREVIOUSSONG}, {"KEY_STOPCD", KEY_STOPCD}, {"KEY_RECORD", KEY_RECORD}, {"KEY_REWIND", KEY_REWIND}, {"KEY_PHONE", KEY_PHONE}, {"KEY_ISO", KEY_ISO}, {"KEY_CONFIG", KEY_CONFIG}, {"KEY_HOMEPAGE", KEY_HOMEPAGE}, {"KEY_REFRESH", KEY_REFRESH}, {"KEY_EXIT", KEY_EXIT}, {"KEY_MOVE", KEY_MOVE}, {"KEY_EDIT", KEY_EDIT}, {"KEY_SCROLLUP", KEY_SCROLLUP}, {"KEY_SCROLLDOWN", KEY_SCROLLDOWN}, {"KEY_KPLEFTPAREN", KEY_KPLEFTPAREN}, {"KEY_KPRIGHTPAREN", KEY_KPRIGHTPAREN}, {"KEY_NEW", KEY_NEW}, {"KEY_REDO", KEY_REDO}, {"KEY_F13", KEY_F13}, {"KEY_F14", KEY_F14}, {"KEY_F15", KEY_F15}, {"KEY_F16", KEY_F16}, {"KEY_F17", KEY_F17}, {"KEY_F18", KEY_F18}, {"KEY_F19", KEY_F19}, {"KEY_F20", KEY_F20}, {"KEY_F21", KEY_F21}, {"KEY_F22", KEY_F22}, {"KEY_F23", KEY_F23}, {"KEY_F24", KEY_F24}, {"KEY_PLAYCD", KEY_PLAYCD}, {"KEY_PAUSECD", KEY_PAUSECD}, {"KEY_PROG3", KEY_PROG3}, {"KEY_PROG4", KEY_PROG4}, {"KEY_DASHBOARD", KEY_DASHBOARD}, {"KEY_SUSPEND", KEY_SUSPEND}, {"KEY_CLOSE", KEY_CLOSE}, {"KEY_PLAY", KEY_PLAY}, {"KEY_FASTFORWARD", KEY_FASTFORWARD}, {"KEY_BASSBOOST", KEY_BASSBOOST}, {"KEY_PRINT", KEY_PRINT}, {"KEY_HP", KEY_HP}, {"KEY_CAMERA", KEY_CAMERA}, {"KEY_SOUND", KEY_SOUND}, {"KEY_QUESTION", KEY_QUESTION}, {"KEY_EMAIL", KEY_EMAIL}, {"KEY_CHAT", KEY_CHAT}, {"KEY_SEARCH", KEY_SEARCH}, {"KEY_CONNECT", KEY_CONNECT}, {"KEY_FINANCE", KEY_FINANCE}, {"KEY_SPORT", KEY_SPORT}, {"KEY_SHOP", KEY_SHOP}, {"KEY_ALTERASE", KEY_ALTERASE}, {"KEY_CANCEL", KEY_CANCEL}, {"KEY_BRIGHTNESSDOWN", KEY_BRIGHTNESSDOWN}, {"KEY_BRIGHTNESSUP", KEY_BRIGHTNESSUP}, {"KEY_MEDIA", KEY_MEDIA}, {"KEY_SWITCHVIDEOMODE", KEY_SWITCHVIDEOMODE}, {"KEY_KBDILLUMTOGGLE", KEY_KBDILLUMTOGGLE}, {"KEY_KBDILLUMDOWN", KEY_KBDILLUMDOWN}, {"KEY_KBDILLUMUP", KEY_KBDILLUMUP}, {"KEY_SEND", KEY_SEND}, {"KEY_REPLY", KEY_REPLY}, {"KEY_FORWARDMAIL", KEY_FORWARDMAIL}, {"KEY_SAVE", KEY_SAVE}, {"KEY_DOCUMENTS", KEY_DOCUMENTS}, {"KEY_BATTERY", KEY_BATTERY}, {"KEY_BLUETOOTH", KEY_BLUETOOTH}, {"KEY_WLAN", KEY_WLAN}, {"KEY_UWB", KEY_UWB}, {"KEY_UNKNOWN", KEY_UNKNOWN}, {"KEY_VIDEO_NEXT", KEY_VIDEO_NEXT}, {"KEY_VIDEO_PREV", KEY_VIDEO_PREV}, {"KEY_BRIGHTNESS_CYCLE", KEY_BRIGHTNESS_CYCLE}, {"KEY_BRIGHTNESS_AUTO", KEY_BRIGHTNESS_AUTO}, {"KEY_BRIGHTNESS_ZERO", KEY_BRIGHTNESS_ZERO}, {"KEY_DISPLAY_OFF", KEY_DISPLAY_OFF}, {"KEY_WWAN", KEY_WWAN}, {"KEY_WIMAX", KEY_WIMAX}, {"KEY_RFKILL", KEY_RFKILL}, {"KEY_MICMUTE", KEY_MICMUTE}, {"KEY_OK", KEY_OK}, {"KEY_SELECT", KEY_SELECT}, {"KEY_GOTO", KEY_GOTO}, {"KEY_CLEAR", KEY_CLEAR}, {"KEY_POWER2", KEY_POWER2}, {"KEY_OPTION", KEY_OPTION}, {"KEY_INFO", KEY_INFO}, {"KEY_TIME", KEY_TIME}, {"KEY_VENDOR", KEY_VENDOR}, {"KEY_ARCHIVE", KEY_ARCHIVE}, {"KEY_PROGRAM", KEY_PROGRAM}, {"KEY_CHANNEL", KEY_CHANNEL}, {"KEY_FAVORITES", KEY_FAVORITES}, {"KEY_EPG", KEY_EPG}, {"KEY_PVR", KEY_PVR}, {"KEY_MHP", KEY_MHP}, {"KEY_LANGUAGE", KEY_LANGUAGE}, {"KEY_TITLE", KEY_TITLE}, {"KEY_SUBTITLE", KEY_SUBTITLE}, {"KEY_ANGLE", KEY_ANGLE}, {"KEY_ZOOM", KEY_ZOOM}, {"KEY_MODE", KEY_MODE}, {"KEY_KEYBOARD", KEY_KEYBOARD}, {"KEY_SCREEN", KEY_SCREEN}, {"KEY_PC", KEY_PC}, {"KEY_TV", KEY_TV}, {"KEY_TV2", KEY_TV2}, {"KEY_VCR", KEY_VCR}, {"KEY_VCR2", KEY_VCR2}, {"KEY_SAT", KEY_SAT}, {"KEY_SAT2", KEY_SAT2}, {"KEY_CD", KEY_CD}, {"KEY_TAPE", KEY_TAPE}, {"KEY_RADIO", KEY_RADIO}, {"KEY_TUNER", KEY_TUNER}, {"KEY_PLAYER", KEY_PLAYER}, {"KEY_TEXT", KEY_TEXT}, {"KEY_DVD", KEY_DVD}, {"KEY_AUX", KEY_AUX}, {"KEY_MP3", KEY_MP3}, {"KEY_AUDIO", KEY_AUDIO}, {"KEY_VIDEO", KEY_VIDEO}, {"KEY_DIRECTORY", KEY_DIRECTORY}, {"KEY_LIST", KEY_LIST}, {"KEY_MEMO", KEY_MEMO}, {"KEY_CALENDAR", KEY_CALENDAR}, {"KEY_RED", KEY_RED}, {"KEY_GREEN", KEY_GREEN}, {"KEY_YELLOW", KEY_YELLOW}, {"KEY_BLUE", KEY_BLUE}, {"KEY_CHANNELUP", KEY_CHANNELUP}, {"KEY_CHANNELDOWN", KEY_CHANNELDOWN}, {"KEY_FIRST", KEY_FIRST}, {"KEY_LAST", KEY_LAST}, {"KEY_AB", KEY_AB}, {"KEY_NEXT", KEY_NEXT}, {"KEY_RESTART", KEY_RESTART}, {"KEY_SLOW", KEY_SLOW}, {"KEY_SHUFFLE", KEY_SHUFFLE}, {"KEY_BREAK", KEY_BREAK}, {"KEY_PREVIOUS", KEY_PREVIOUS}, {"KEY_DIGITS", KEY_DIGITS}, {"KEY_TEEN", KEY_TEEN}, {"KEY_TWEN", KEY_TWEN}, {"KEY_VIDEOPHONE", KEY_VIDEOPHONE}, {"KEY_GAMES", KEY_GAMES}, {"KEY_ZOOMIN", KEY_ZOOMIN}, {"KEY_ZOOMOUT", KEY_ZOOMOUT}, {"KEY_ZOOMRESET", KEY_ZOOMRESET}, {"KEY_WORDPROCESSOR", KEY_WORDPROCESSOR}, {"KEY_EDITOR", KEY_EDITOR}, {"KEY_SPREADSHEET", KEY_SPREADSHEET}, {"KEY_GRAPHICSEDITOR", KEY_GRAPHICSEDITOR}, {"KEY_PRESENTATION", KEY_PRESENTATION}, {"KEY_DATABASE", KEY_DATABASE}, {"KEY_NEWS", KEY_NEWS}, {"KEY_VOICEMAIL", KEY_VOICEMAIL}, {"KEY_ADDRESSBOOK", KEY_ADDRESSBOOK}, {"KEY_MESSENGER", KEY_MESSENGER}, {"KEY_DISPLAYTOGGLE", KEY_DISPLAYTOGGLE}, {"KEY_BRIGHTNESS_TOGGLE", KEY_BRIGHTNESS_TOGGLE}, {"KEY_SPELLCHECK", KEY_SPELLCHECK}, {"KEY_LOGOFF", KEY_LOGOFF}, {"KEY_DOLLAR", KEY_DOLLAR}, {"KEY_EURO", KEY_EURO}, {"KEY_FRAMEBACK", KEY_FRAMEBACK}, {"KEY_FRAMEFORWARD", KEY_FRAMEFORWARD}, {"KEY_CONTEXT_MENU", KEY_CONTEXT_MENU}, {"KEY_MEDIA_REPEAT", KEY_MEDIA_REPEAT}, {"KEY_10CHANNELSUP", KEY_10CHANNELSUP}, {"KEY_10CHANNELSDOWN", KEY_10CHANNELSDOWN}, {"KEY_IMAGES", KEY_IMAGES}, {"KEY_DEL_EOL", KEY_DEL_EOL}, {"KEY_DEL_EOS", KEY_DEL_EOS}, {"KEY_INS_LINE", KEY_INS_LINE}, {"KEY_DEL_LINE", KEY_DEL_LINE}, {"KEY_FN", KEY_FN}, {"KEY_FN_ESC", KEY_FN_ESC}, {"KEY_FN_F1", KEY_FN_F1}, {"KEY_FN_F2", KEY_FN_F2}, {"KEY_FN_F3", KEY_FN_F3}, {"KEY_FN_F4", KEY_FN_F4}, {"KEY_FN_F5", KEY_FN_F5}, {"KEY_FN_F6", KEY_FN_F6}, {"KEY_FN_F7", KEY_FN_F7}, {"KEY_FN_F8", KEY_FN_F8}, {"KEY_FN_F9", KEY_FN_F9}, {"KEY_FN_F10", KEY_FN_F10}, {"KEY_FN_F11", KEY_FN_F11}, {"KEY_FN_F12", KEY_FN_F12}, {"KEY_FN_1", KEY_FN_1}, {"KEY_FN_2", KEY_FN_2}, {"KEY_FN_D", KEY_FN_D}, {"KEY_FN_E", KEY_FN_E}, {"KEY_FN_F", KEY_FN_F}, {"KEY_FN_S", KEY_FN_S}, {"KEY_FN_B", KEY_FN_B}, {"KEY_BRL_DOT1", KEY_BRL_DOT1}, {"KEY_BRL_DOT2", KEY_BRL_DOT2}, {"KEY_BRL_DOT3", KEY_BRL_DOT3}, {"KEY_BRL_DOT4", KEY_BRL_DOT4}, {"KEY_BRL_DOT5", KEY_BRL_DOT5}, {"KEY_BRL_DOT6", KEY_BRL_DOT6}, {"KEY_BRL_DOT7", KEY_BRL_DOT7}, {"KEY_BRL_DOT8", KEY_BRL_DOT8}, {"KEY_BRL_DOT9", KEY_BRL_DOT9}, {"KEY_BRL_DOT10", KEY_BRL_DOT10}, {"KEY_NUMERIC_0", KEY_NUMERIC_0}, {"KEY_NUMERIC_1", KEY_NUMERIC_1}, {"KEY_NUMERIC_2", KEY_NUMERIC_2}, {"KEY_NUMERIC_3", KEY_NUMERIC_3}, {"KEY_NUMERIC_4", KEY_NUMERIC_4}, {"KEY_NUMERIC_5", KEY_NUMERIC_5}, {"KEY_NUMERIC_6", KEY_NUMERIC_6}, {"KEY_NUMERIC_7", KEY_NUMERIC_7}, {"KEY_NUMERIC_8", KEY_NUMERIC_8}, {"KEY_NUMERIC_9", KEY_NUMERIC_9}, {"KEY_NUMERIC_STAR", KEY_NUMERIC_STAR}, {"KEY_NUMERIC_POUND", KEY_NUMERIC_POUND}, {"KEY_NUMERIC_A", KEY_NUMERIC_A}, {"KEY_NUMERIC_B", KEY_NUMERIC_B}, {"KEY_NUMERIC_C", KEY_NUMERIC_C}, {"KEY_NUMERIC_D", KEY_NUMERIC_D}, {"KEY_CAMERA_FOCUS", KEY_CAMERA_FOCUS}, {"KEY_WPS_BUTTON", KEY_WPS_BUTTON}, {"KEY_TOUCHPAD_TOGGLE", KEY_TOUCHPAD_TOGGLE}, {"KEY_TOUCHPAD_ON", KEY_TOUCHPAD_ON}, {"KEY_TOUCHPAD_OFF", KEY_TOUCHPAD_OFF}, {"KEY_CAMERA_ZOOMIN", KEY_CAMERA_ZOOMIN}, {"KEY_CAMERA_ZOOMOUT", KEY_CAMERA_ZOOMOUT}, {"KEY_CAMERA_UP", KEY_CAMERA_UP}, {"KEY_CAMERA_DOWN", KEY_CAMERA_DOWN}, {"KEY_CAMERA_LEFT", KEY_CAMERA_LEFT}, {"KEY_CAMERA_RIGHT", KEY_CAMERA_RIGHT}, {"KEY_ATTENDANT_ON", KEY_ATTENDANT_ON}, {"KEY_ATTENDANT_OFF", KEY_ATTENDANT_OFF}, {"KEY_ATTENDANT_TOGGLE", KEY_ATTENDANT_TOGGLE}, {"KEY_LIGHTS_TOGGLE", KEY_LIGHTS_TOGGLE}, {"KEY_ALS_TOGGLE", KEY_ALS_TOGGLE}, {"KEY_TASKMANAGER", KEY_TASKMANAGER}, {"KEY_JOURNAL", KEY_JOURNAL}, {"KEY_CONTROLPANEL", KEY_CONTROLPANEL}, {"KEY_APPSELECT", KEY_APPSELECT}, {"KEY_SCREENSAVER", KEY_SCREENSAVER}, {"KEY_VOICECOMMAND", KEY_VOICECOMMAND}, {"KEY_BRIGHTNESS_MIN", KEY_BRIGHTNESS_MIN}, {"KEY_BRIGHTNESS_MAX", KEY_BRIGHTNESS_MAX}, {"KEY_KBDINPUTASSIST_PREV", KEY_KBDINPUTASSIST_PREV}, {"KEY_KBDINPUTASSIST_NEXT", KEY_KBDINPUTASSIST_NEXT}, {"KEY_KBDINPUTASSIST_PREVGROUP", KEY_KBDINPUTASSIST_PREVGROUP}, {"KEY_KBDINPUTASSIST_NEXTGROUP", KEY_KBDINPUTASSIST_NEXTGROUP}, {"KEY_KBDINPUTASSIST_ACCEPT", KEY_KBDINPUTASSIST_ACCEPT}, {"KEY_KBDINPUTASSIST_CANCEL", KEY_KBDINPUTASSIST_CANCEL}, {"KEY_RIGHT_UP", KEY_RIGHT_UP}, {"KEY_RIGHT_DOWN", KEY_RIGHT_DOWN}, {"KEY_LEFT_UP", KEY_LEFT_UP}, {"KEY_LEFT_DOWN", KEY_LEFT_DOWN}, {"KEY_ROOT_MENU", KEY_ROOT_MENU}, {"KEY_MEDIA_TOP_MENU", KEY_MEDIA_TOP_MENU}, {"KEY_NUMERIC_11", KEY_NUMERIC_11}, {"KEY_NUMERIC_12", KEY_NUMERIC_12}, {"KEY_AUDIO_DESC", KEY_AUDIO_DESC}, {"KEY_3D_MODE", KEY_3D_MODE}, {"KEY_NEXT_FAVORITE", KEY_NEXT_FAVORITE}, {"KEY_STOP_RECORD", KEY_STOP_RECORD}, {"KEY_PAUSE_RECORD", KEY_PAUSE_RECORD}, {"KEY_VOD", KEY_VOD}, {"KEY_UNMUTE", KEY_UNMUTE}, {"KEY_FASTREVERSE", KEY_FASTREVERSE}, {"KEY_SLOWREVERSE", KEY_SLOWREVERSE}, {"KEY_DATA", KEY_DATA}, {"KEY_MIN_INTERESTING", KEY_MIN_INTERESTING}, {"BTN_MISC", BTN_MISC}, {"BTN_0", BTN_0}, {"BTN_1", BTN_1}, {"BTN_2", BTN_2}, {"BTN_3", BTN_3}, {"BTN_4", BTN_4}, {"BTN_5", BTN_5}, {"BTN_6", BTN_6}, {"BTN_7", BTN_7}, {"BTN_8", BTN_8}, {"BTN_9", BTN_9}, {"BTN_MOUSE", BTN_MOUSE}, {"BTN_LEFT", BTN_LEFT}, {"BTN_RIGHT", BTN_RIGHT}, {"BTN_MIDDLE", BTN_MIDDLE}, {"BTN_SIDE", BTN_SIDE}, {"BTN_EXTRA", BTN_EXTRA}, {"BTN_FORWARD", BTN_FORWARD}, {"BTN_BACK", BTN_BACK}, {"BTN_TASK", BTN_TASK}, {"BTN_JOYSTICK", BTN_JOYSTICK}, {"BTN_TRIGGER", BTN_TRIGGER}, {"BTN_THUMB", BTN_THUMB}, {"BTN_THUMB2", BTN_THUMB2}, {"BTN_TOP", BTN_TOP}, {"BTN_TOP2", BTN_TOP2}, {"BTN_PINKIE", BTN_PINKIE}, {"BTN_BASE", BTN_BASE}, {"BTN_BASE2", BTN_BASE2}, {"BTN_BASE3", BTN_BASE3}, {"BTN_BASE4", BTN_BASE4}, {"BTN_BASE5", BTN_BASE5}, {"BTN_BASE6", BTN_BASE6}, {"BTN_DEAD", BTN_DEAD}, {"BTN_GAMEPAD", BTN_GAMEPAD}, {"BTN_SOUTH", BTN_SOUTH}, {"BTN_A", BTN_A}, {"BTN_EAST", BTN_EAST}, {"BTN_B", BTN_B}, {"BTN_C", BTN_C}, {"BTN_NORTH", BTN_NORTH}, {"BTN_X", BTN_X}, {"BTN_WEST", BTN_WEST}, {"BTN_Y", BTN_Y}, {"BTN_Z", BTN_Z}, {"BTN_TL", BTN_TL}, {"BTN_TR", BTN_TR}, {"BTN_TL2", BTN_TL2}, {"BTN_TR2", BTN_TR2}, {"BTN_SELECT", BTN_SELECT}, {"BTN_START", BTN_START}, {"BTN_MODE", BTN_MODE}, {"BTN_THUMBL", BTN_THUMBL}, {"BTN_THUMBR", BTN_THUMBR}, {"BTN_DIGI", BTN_DIGI}, {"BTN_TOOL_PEN", BTN_TOOL_PEN}, {"BTN_TOOL_RUBBER", BTN_TOOL_RUBBER}, {"BTN_TOOL_BRUSH", BTN_TOOL_BRUSH}, {"BTN_TOOL_PENCIL", BTN_TOOL_PENCIL}, {"BTN_TOOL_AIRBRUSH", BTN_TOOL_AIRBRUSH}, {"BTN_TOOL_FINGER", BTN_TOOL_FINGER}, {"BTN_TOOL_MOUSE", BTN_TOOL_MOUSE}, {"BTN_TOOL_LENS", BTN_TOOL_LENS}, {"BTN_TOOL_QUINTTAP", BTN_TOOL_QUINTTAP}, {"BTN_TOUCH", BTN_TOUCH}, {"BTN_STYLUS", BTN_STYLUS}, {"BTN_STYLUS2", BTN_STYLUS2}, {"BTN_TOOL_DOUBLETAP", BTN_TOOL_DOUBLETAP}, {"BTN_TOOL_TRIPLETAP", BTN_TOOL_TRIPLETAP}, {"BTN_TOOL_QUADTAP", BTN_TOOL_QUADTAP}, {"BTN_WHEEL", BTN_WHEEL}, {"BTN_GEAR_DOWN", BTN_GEAR_DOWN}, {"BTN_GEAR_UP", BTN_GEAR_UP}, {"BTN_DPAD_UP", BTN_DPAD_UP}, {"BTN_DPAD_DOWN", BTN_DPAD_DOWN}, {"BTN_DPAD_LEFT", BTN_DPAD_LEFT}, {"BTN_DPAD_RIGHT", BTN_DPAD_RIGHT}, {"BTN_TRIGGER_HAPPY", BTN_TRIGGER_HAPPY}, {"BTN_TRIGGER_HAPPY1", BTN_TRIGGER_HAPPY1}, {"BTN_TRIGGER_HAPPY2", BTN_TRIGGER_HAPPY2}, {"BTN_TRIGGER_HAPPY3", BTN_TRIGGER_HAPPY3}, {"BTN_TRIGGER_HAPPY4", BTN_TRIGGER_HAPPY4}, {"BTN_TRIGGER_HAPPY5", BTN_TRIGGER_HAPPY5}, {"BTN_TRIGGER_HAPPY6", BTN_TRIGGER_HAPPY6}, {"BTN_TRIGGER_HAPPY7", BTN_TRIGGER_HAPPY7}, {"BTN_TRIGGER_HAPPY8", BTN_TRIGGER_HAPPY8}, {"BTN_TRIGGER_HAPPY9", BTN_TRIGGER_HAPPY9}, {"BTN_TRIGGER_HAPPY10", BTN_TRIGGER_HAPPY10}, {"BTN_TRIGGER_HAPPY11", BTN_TRIGGER_HAPPY11}, {"BTN_TRIGGER_HAPPY12", BTN_TRIGGER_HAPPY12}, {"BTN_TRIGGER_HAPPY13", BTN_TRIGGER_HAPPY13}, {"BTN_TRIGGER_HAPPY14", BTN_TRIGGER_HAPPY14}, {"BTN_TRIGGER_HAPPY15", BTN_TRIGGER_HAPPY15}, {"BTN_TRIGGER_HAPPY16", BTN_TRIGGER_HAPPY16}, {"BTN_TRIGGER_HAPPY17", BTN_TRIGGER_HAPPY17}, {"BTN_TRIGGER_HAPPY18", BTN_TRIGGER_HAPPY18}, {"BTN_TRIGGER_HAPPY19", BTN_TRIGGER_HAPPY19}, {"BTN_TRIGGER_HAPPY20", BTN_TRIGGER_HAPPY20}, {"BTN_TRIGGER_HAPPY21", BTN_TRIGGER_HAPPY21}, {"BTN_TRIGGER_HAPPY22", BTN_TRIGGER_HAPPY22}, {"BTN_TRIGGER_HAPPY23", BTN_TRIGGER_HAPPY23}, {"BTN_TRIGGER_HAPPY24", BTN_TRIGGER_HAPPY24}, {"BTN_TRIGGER_HAPPY25", BTN_TRIGGER_HAPPY25}, {"BTN_TRIGGER_HAPPY26", BTN_TRIGGER_HAPPY26}, {"BTN_TRIGGER_HAPPY27", BTN_TRIGGER_HAPPY27}, {"BTN_TRIGGER_HAPPY28", BTN_TRIGGER_HAPPY28}, {"BTN_TRIGGER_HAPPY29", BTN_TRIGGER_HAPPY29}, {"BTN_TRIGGER_HAPPY30", BTN_TRIGGER_HAPPY30}, {"BTN_TRIGGER_HAPPY31", BTN_TRIGGER_HAPPY31}, {"BTN_TRIGGER_HAPPY32", BTN_TRIGGER_HAPPY32}, {"BTN_TRIGGER_HAPPY33", BTN_TRIGGER_HAPPY33}, {"BTN_TRIGGER_HAPPY34", BTN_TRIGGER_HAPPY34}, {"BTN_TRIGGER_HAPPY35", BTN_TRIGGER_HAPPY35}, {"BTN_TRIGGER_HAPPY36", BTN_TRIGGER_HAPPY36}, {"BTN_TRIGGER_HAPPY37", BTN_TRIGGER_HAPPY37}, {"BTN_TRIGGER_HAPPY38", BTN_TRIGGER_HAPPY38}, {"BTN_TRIGGER_HAPPY39", BTN_TRIGGER_HAPPY39}, {"BTN_TRIGGER_HAPPY40", BTN_TRIGGER_HAPPY40}, {"REL_X", REL_X}, {"REL_Y", REL_Y}, {"REL_Z", REL_Z}, {"REL_WHEEL", REL_WHEEL}, {"REL_HWHEEL", REL_HWHEEL}, {"ABS_X", ABS_X}, {"ABS_Y", ABS_Y}, {"ABS_MT_SLOT", ABS_MT_SLOT}, {"ABS_MT_TRACKING_ID", ABS_MT_TRACKING_ID}, {"ABS_MT_POSITION_X", ABS_MT_POSITION_X}, {"ABS_MT_POSITION_Y", ABS_MT_POSITION_Y}, {"ABS_PRESSURE", ABS_PRESSURE}, {"ABS_MT_PRESSURE", ABS_MT_PRESSURE} };libevdevPlus-0.1.1/evdevPlus.cpp000066400000000000000000000041031362055004400166330ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "evdevPlus.hpp" using namespace evdevPlus; void EventDevice::Open(const std::string &path, int open_flags) { int fd = open(path.c_str(), open_flags); if (fd < 0) throw std::runtime_error("failed to open device: " + std::string(strerror(errno))); Open(fd); } void EventDevice::Open(int fd) { if (!IsValidDevice(fd)) throw std::runtime_error("not a valid event device"); FD = fd; Init(); } void EventDevice::Close() { if (FD != -1) close(FD); } bool EventDevice::IsValidDevice(int fd) { if (fcntl(fd, F_GETFD) == -1) return false; int _; return ioctl(fd, EVIOCGVERSION, &_) == 0; } bool EventDevice::IsValidDevice() { return IsValidDevice(FD); } void EventDevice::Init() { if (ioctl(FD, EVIOCGVERSION, &DriverVersion)) throw std::runtime_error(std::string("EVIOCGVERSION") + " failed"); if (ioctl(FD, EVIOCGID, &(DeviceID.inputId))) throw std::runtime_error(std::string("EVIOCGID") + " failed"); char name[256] = "Unknown"; ioctl(FD, EVIOCGNAME(sizeof(name)), name); DeviceName = name; long evtypes; if (ioctl(FD, EVIOCGBIT(0, sizeof(long)), &evtypes) == -1) throw std::runtime_error(std::string("EVIOCGBIT") + " failed"); // TODO } void EventDevice::Grab() { if (ioctl(FD, EVIOCGRAB, 1)) throw std::runtime_error(std::string("EVIOCGRAB") + "failed"); } void EventDevice::Ungrab() { if (ioctl(FD, EVIOCGRAB, 0)) throw std::runtime_error(std::string("EVIOCGRAB") + "failed"); } InputEvent EventDevice::Read() { InputEvent ret; ssize_t rc = read(FD, &ret.event, sizeof(input_event)); if (rc != sizeof(input_event)) { if (rc < 0) throw std::runtime_error(strerror(errno)); else throw std::runtime_error("truncated read"); } return ret; } libevdevPlus-0.1.1/evdevPlus.hpp000066400000000000000000000046321362055004400166470ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef LIBEVDEVPLUS_HPP #define LIBEVDEVPLUS_HPP #include "CommonIncludes.hpp" #include "InputEvent.hpp" namespace evdevPlus { extern const std::unordered_map Table_FunctionKeys; extern const std::unordered_map Table_ModifierKeys; extern const std::unordered_map Table_LowerKeys; extern const std::unordered_map Table_UpperKeys; extern const std::unordered_map Table_KeyCodes; class EventDeviceID { public: input_id inputId{}; uint16_t &BusType = inputId.bustype; uint16_t &Vendor = inputId.vendor; uint16_t &Product = inputId.product; uint16_t &Version = inputId.version; EventDeviceID() = default; EventDeviceID(uint16_t bus_type, uint16_t vid, uint16_t pid, uint16_t version) { BusType = bus_type; Vendor = vid; Product = pid; Version = version; } friend void swap(EventDeviceID &first, EventDeviceID &second) { using std::swap; swap(first.inputId, second.inputId); } EventDeviceID(EventDeviceID &&other) noexcept : EventDeviceID() { swap(*this, other); } EventDeviceID& operator= (EventDeviceID other) { swap(*this, other); return *this; } EventDeviceID(const EventDeviceID &other) { memcpy(&inputId, &(other.inputId), sizeof(uinput_setup)); } }; class EventDevice { public: int FD = -1; std::string Path; int DriverVersion = -1; EventDeviceID DeviceID; std::string DeviceName; std::set EventTypes; EventDevice() = default; EventDevice(const std::string &path, int open_flags = O_RDONLY) { Open(path, open_flags); } EventDevice(int fd) { Open(fd); } ~EventDevice() { Close(); } void Open(const std::string &path, int open_flags = O_RDONLY); void Open(int fd); void Close(); void Init(); void Grab(); void Ungrab(); InputEvent Read(); static bool IsValidDevice(int fd); bool IsValidDevice(); bool const operator== (const EventDevice &o) const { return (Path == o.Path) && (FD == o.FD); } }; } #endif //LIBEVDEVPLUS_HPP libevdevPlus-0.1.1/evdevPlus.pc.in000066400000000000000000000004171362055004400170640ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} includedir=${prefix}/include libdir= ${prefix}/@CMAKE_INSTALL_LIBDIR@ Name: evdevPlus Description: Easy-to-use event device library in C++ Version: 0.1.0 Cflags: -I${includedir}/evdevPlus Libs: -L${libdir} -levdevPlus libevdevPlus-0.1.1/test.cpp000066400000000000000000000021761362055004400156450ustar00rootroot00000000000000/* This file is part of libevdevPlus. Copyright (C) 2018 YukiWorkshop This program is free software: you can redistribute it and/or modify it under the terms of the MIT License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "evdevPlus.hpp" using namespace evdevPlus; int main(int argc, char **argv) { if (!argv[1]) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } EventDevice ev(argv[1]); std::cout << "Device name: " << ev.DeviceName << "\n"; std::cout << "Bus type: " << ev.DeviceID.BusType << "\n"; std::cout << "VID: " << ev.DeviceID.Vendor << "\n"; std::cout << "PID: " << ev.DeviceID.Product << "\n"; std::cout << "Version: " << ev.DeviceID.Version << "\n"; std::cout << "Driver version: " << ev.DriverVersion << "\n"; ev.Grab(); while (true) { auto ie = ev.Read(); std::cout << "Event type: " << ie.Type << "\n"; std::cout << "Event code: " << ie.Code << "\n"; std::cout << "Event value: " << ie.Value << "\n"; } }