AbsAxisEventHandler* AbsAxisEventHandler::from_string(const std::string& str) { typedef boost::tokenizer<boost::char_separator<char> > tokenizer; tokenizer tokens(str, boost::char_separator<char>(":", "", boost::keep_empty_tokens)); int j = 0; int code = -1; for(tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i, ++j) { switch(j) { case 0: code = str2abs(*i); break; default: throw std::runtime_error("AxisEventHandlers::abs_from_string(): to many arguments: " + str); } } if (j == 0) { throw std::runtime_error("AxisEventHandler::abs_from_string(): at least one argument required: " + str); } else if (j > 1) { throw std::runtime_error("AxisEventHandler::abs_from_string(): invalid extra arguments in " + str); } else { return new AbsAxisEventHandler(DEVICEID_AUTO, code, -1, -1, 0, 0); } }
UIEvent str2abs_event(const std::string& str) { int slot_id; int device_id; std::string rest; split_event_name(str, &rest, &slot_id, &device_id); return UIEvent::create(device_id, EV_ABS, str2abs(rest)); }
void str2event(const std::string& name, int& type, int& code) { if (name == "void" || name == "none") { type = -1; code = -1; } else if (name.compare(0, 3, "REL") == 0) { type = EV_REL; code = str2rel(name); } else if (name.compare(0, 3, "ABS") == 0) { type = EV_ABS; code = str2abs(name); } else if (name.compare(0, 2, "XK") == 0) { type = EV_KEY; code = xkeysym2keycode(name); } else if (name.compare(0, 2, "JS") == 0) { type = EV_KEY; code = BTN_JOYSTICK + boost::lexical_cast<int>(name.substr(3)); } else if (name.compare(0, 3, "KEY") == 0 || name.compare(0, 3, "BTN") == 0) { type = EV_KEY; code = str2key(name); } else { throw std::runtime_error("str2event(): unknown event type prefix: " + name); } }