void XboxdrvDaemon::on_connect(ControllerSlotPtr slot) { ControllerPtr controller = slot->get_controller(); assert(controller); if (!m_opts.on_connect.empty()) { log_info("launching connect script: " << m_opts.on_connect); std::vector<std::string> args; args.push_back(m_opts.on_connect); args.push_back(controller->get_usbpath()); args.push_back(controller->get_usbid()); args.push_back(controller->get_name()); spawn_exe(args); } }
void XboxdrvMain::run() { m_controller = create_controller(); m_controller->set_disconnect_cb(boost::bind(&XboxdrvMain::on_controller_disconnect, this)); init_controller(m_controller); if (m_opts.instant_exit) { usleep(1000); } else { ControllerSlotConfigPtr config_set; if (m_opts.no_uinput) { if (!m_opts.quiet) { std::cout << "Starting without uinput" << std::endl; } } else { log_debug("creating UInput"); m_uinput.reset(new UInput(m_opts.extra_events)); m_uinput->set_device_names(m_opts.uinput_device_names); m_uinput->set_device_usbids(m_opts.uinput_device_usbids); log_debug("creating ControllerSlotConfig"); config_set = ControllerSlotConfig::create(*m_uinput, 0, m_opts.extra_devices, m_opts.get_controller_slot()); // After all the ControllerConfig registered their events, finish up // the device creation log_debug("finish UInput creation"); m_uinput->finish(); } if (!m_opts.quiet) { std::cout << "\nYour Xbox/Xbox360 controller should now be available as:" << std::endl << " /dev/input/js" << m_jsdev_number << std::endl << " /dev/input/event" << m_evdev_number << std::endl; if (m_opts.silent) { std::cout << "\nPress Ctrl-c to quit" << std::endl; } else { std::cout << "\nPress Ctrl-c to quit, use '--silent' to suppress the event output" << std::endl; } } { ControllerThread thread(m_controller, config_set, m_opts); log_debug("launching thread"); pid_t pid = 0; if (!m_opts.exec.empty()) { pid = spawn_exe(m_opts.exec); g_child_watch_add(pid, &XboxdrvMain::on_child_watch_wrap, this); } log_debug("launching main loop"); g_main_loop_run(m_gmain); m_controller.reset(); } if (!m_opts.quiet) { std::cout << "Shutdown complete" << std::endl; } } }
pid_t spawn_exe(const std::string& arg0) { std::vector<std::string> args; args.push_back(arg0); return spawn_exe(args); }