KeyAxisEventHandler* KeyAxisEventHandler::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)); std::auto_ptr<KeyAxisEventHandler> ev(new KeyAxisEventHandler); int j = 0; for(tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i, ++j) { switch(j) { case 0: { int k = 0; tokenizer ev_tokens(*i, boost::char_separator<char>("+", "", boost::keep_empty_tokens)); for(tokenizer::iterator m = ev_tokens.begin(); m != ev_tokens.end(); ++m, ++k) { ev->m_up_codes[k] = str2key_event(*m); } } break; case 1: { tokenizer ev_tokens(*i, boost::char_separator<char>("+", "", boost::keep_empty_tokens)); int k = 0; for(tokenizer::iterator m = ev_tokens.begin(); m != ev_tokens.end(); ++m, ++k) { ev->m_down_codes[k] = str2key_event(*m); } } break; case 2: ev->m_threshold = boost::lexical_cast<int>(*i); break; default: throw std::runtime_error("AxisEvent::key_from_string(): to many arguments: " + str); } } if (j == 0) { throw std::runtime_error("AxisEvent::key_from_string(): at least one argument required: " + str); } return ev.release(); }
UIEvent UIEvent::from_string(const std::string& str) { switch(get_event_type(str)) { case EV_REL: return str2rel_event(str); break; case EV_ABS: return str2abs_event(str); break; case EV_KEY: return str2key_event(str); break; default: throw std::runtime_error("unknown event type"); } }