Cleaned up stdout output somewhat
This commit is contained in:
parent
70a60dbd67
commit
f5f125b988
14 changed files with 103 additions and 87 deletions
7
TODO
7
TODO
|
@ -42,6 +42,13 @@ $ dput my-ppa ../xboxdrv_0.7.0-1~lucid1_source.changes
|
|||
Stuff to do before 0.7.0 release:
|
||||
=================================
|
||||
|
||||
* log levels:
|
||||
|
||||
debug: only shown when --debug is given
|
||||
info: shown when --verbose is given
|
||||
warn: shown by default
|
||||
error: shown by default
|
||||
|
||||
* figure out a good place to set the LEDs off when Xboxdrv is quit,
|
||||
just doing it in the destructor causes trouble
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ Chatpad::read_thread()
|
|||
{
|
||||
if (m_debug)
|
||||
{
|
||||
log_info << "[chatpad] read: " << len << "/5: data: " << std::flush;
|
||||
log_info << "read: " << len << "/5: data: " << std::flush;
|
||||
for(int i = 0; i < len; ++i)
|
||||
{
|
||||
log_info << boost::format("0x%02x ") % int(data[i]);
|
||||
|
|
|
@ -49,8 +49,6 @@ ControllerConfigSet::create(UInput& uinput, int slot, bool extra_devices, const
|
|||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
log_info << "UInput finish" << std::endl;
|
||||
|
||||
return m_config;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ DummyMessageProcessor::DummyMessageProcessor()
|
|||
void
|
||||
DummyMessageProcessor::send(const XboxGenericMsg& msg, int msec_delta)
|
||||
{
|
||||
//log_info << msg << std::endl;
|
||||
log_info << msg << std::endl;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -25,15 +25,16 @@
|
|||
#include <sys/time.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
void print_raw_data(std::ostream& out, uint8_t* data, int len)
|
||||
std::string raw2str(uint8_t* data, int len)
|
||||
{
|
||||
std::cout << "len: " << len
|
||||
<< " data: ";
|
||||
|
||||
std::ostringstream out;
|
||||
out << "len: " << len
|
||||
<< " data: ";
|
||||
|
||||
for(int i = 0; i < len; ++i)
|
||||
std::cout << boost::format("0x%02x ") % int(data[i]);
|
||||
out << boost::format("%02x ") % int(data[i]);
|
||||
|
||||
std::cout << std::endl;
|
||||
return out.str();
|
||||
}
|
||||
|
||||
std::string to_lower(const std::string &str)
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
#include <boost/function.hpp>
|
||||
|
||||
void print_raw_data(std::ostream& out, uint8_t* buffer, int len);
|
||||
std::string raw2str(uint8_t* buffer, int len);
|
||||
std::string to_lower(const std::string &str);
|
||||
bool is_number(const std::string& str);
|
||||
|
||||
|
|
|
@ -23,8 +23,9 @@
|
|||
#include <fcntl.h>
|
||||
|
||||
#include "evdev_helper.hpp"
|
||||
#include "log.hpp"
|
||||
#include "force_feedback_handler.hpp"
|
||||
#include "log.hpp"
|
||||
#include "raise_exception.hpp"
|
||||
|
||||
LinuxUinput::LinuxUinput(DeviceType device_type, const std::string& name_, uint16_t vendor_, uint16_t product_) :
|
||||
m_device_type(device_type),
|
||||
|
@ -43,7 +44,7 @@ LinuxUinput::LinuxUinput(DeviceType device_type, const std::string& name_, uint1
|
|||
ff_callback(),
|
||||
needs_sync(true)
|
||||
{
|
||||
log_info << name << " " << vendor << ":" << product << std::endl;
|
||||
log_debug << name << " " << vendor << ":" << product << std::endl;
|
||||
|
||||
std::fill_n(abs_lst, ABS_CNT, false);
|
||||
std::fill_n(rel_lst, REL_CNT, false);
|
||||
|
@ -96,7 +97,7 @@ LinuxUinput::~LinuxUinput()
|
|||
void
|
||||
LinuxUinput::add_abs(uint16_t code, int min, int max, int fuzz, int flat)
|
||||
{
|
||||
log_info << "add_abs: " << abs2str(code) << " (" << min << ", " << max << ") " << name << std::endl;
|
||||
log_debug << "add_abs: " << abs2str(code) << " (" << min << ", " << max << ") " << name << std::endl;
|
||||
|
||||
if (!abs_lst[code])
|
||||
{
|
||||
|
@ -120,7 +121,7 @@ LinuxUinput::add_abs(uint16_t code, int min, int max, int fuzz, int flat)
|
|||
void
|
||||
LinuxUinput::add_rel(uint16_t code)
|
||||
{
|
||||
log_info << "add_rel: " << rel2str(code) << " " << name << std::endl;
|
||||
log_debug << "add_rel: " << rel2str(code) << " " << name << std::endl;
|
||||
|
||||
if (!rel_lst[code])
|
||||
{
|
||||
|
@ -139,7 +140,7 @@ LinuxUinput::add_rel(uint16_t code)
|
|||
void
|
||||
LinuxUinput::add_key(uint16_t code)
|
||||
{
|
||||
log_info << "add_key: " << key2str(code) << " " << name << std::endl;
|
||||
log_debug << "add_key: " << key2str(code) << " " << name << std::endl;
|
||||
|
||||
if (!key_lst[code])
|
||||
{
|
||||
|
@ -225,7 +226,7 @@ LinuxUinput::finish()
|
|||
user_dev.id.vendor = vendor;
|
||||
user_dev.id.product = product;
|
||||
|
||||
log_info << "'" << user_dev.name << "' " << user_dev.id.vendor << ":" << user_dev.id.product << std::endl;
|
||||
log_debug << "'" << user_dev.name << "' " << user_dev.id.vendor << ":" << user_dev.id.product << std::endl;
|
||||
|
||||
if (ff_bit)
|
||||
user_dev.ff_effects_max = ff_handler->get_max_effects();
|
||||
|
@ -240,19 +241,17 @@ LinuxUinput::finish()
|
|||
}
|
||||
else
|
||||
{
|
||||
log_info << "write return value: " << write_ret << std::endl;
|
||||
log_debug << "write return value: " << write_ret << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: check that the config isn't empty and give a more
|
||||
// meaningful message when it is
|
||||
|
||||
log_info << "finish" << std::endl;
|
||||
log_debug << "finish" << std::endl;
|
||||
if (ioctl(fd, UI_DEV_CREATE))
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "LinuxUinput: Unable to create UINPUT device: '" << name << "': " << strerror(errno);
|
||||
throw std::runtime_error(out.str());
|
||||
raise_exception(std::runtime_error, "unable to create uinput device: '" << name << "': " << strerror(errno));
|
||||
}
|
||||
|
||||
m_finished = true;
|
||||
|
|
|
@ -38,7 +38,7 @@ std::string log_pretty_print(const std::string& str);
|
|||
#define log_error (std::cout << log_pretty_print(__PRETTY_FUNCTION__) << ": ")
|
||||
|
||||
/** extra verbose debugging messages */
|
||||
#define log_debug (std::cout << log_pretty_print(__PRETTY_FUNCTION__) << ": ")
|
||||
#define log_debug if (true); else (std::cout << log_pretty_print(__PRETTY_FUNCTION__) << ": ")
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ UInput::create_uinput_device(uint32_t device_id)
|
|||
}
|
||||
else
|
||||
{
|
||||
log_info << "create device: " << device_id << std::endl;
|
||||
log_debug << "create device: " << device_id << std::endl;
|
||||
LinuxUinput::DeviceType device_type = LinuxUinput::kGenericDevice;
|
||||
std::ostringstream dev_name;
|
||||
dev_name << "Xbox Gamepad (userspace driver)";
|
||||
|
@ -119,7 +119,7 @@ UInput::create_uinput_device(uint32_t device_id)
|
|||
boost::shared_ptr<LinuxUinput> dev(new LinuxUinput(device_type, dev_name.str(), 0x0000, 0x0000));
|
||||
uinput_devs.insert(std::pair<int, boost::shared_ptr<LinuxUinput> >(device_id, dev));
|
||||
|
||||
std::cout << "Creating uinput device: device_id: " << device_id << ", dev_name: " << dev_name.str() << std::endl;
|
||||
log_debug << "created uinput device: " << device_id << " - '" << dev_name.str() << "'" << std::endl;
|
||||
|
||||
return dev.get();
|
||||
}
|
||||
|
|
|
@ -41,15 +41,13 @@ Xbox360Controller::Xbox360Controller(libusb_device* dev_,
|
|||
m_headset()
|
||||
{
|
||||
find_endpoints();
|
||||
if (false)
|
||||
{
|
||||
std::cout << "EP(IN): " << endpoint_in << std::endl;
|
||||
std::cout << "EP(OUT): " << endpoint_out << std::endl;
|
||||
}
|
||||
|
||||
|
||||
log_debug << "EP(IN): " << endpoint_in << std::endl;
|
||||
log_debug << "EP(OUT): " << endpoint_out << std::endl;
|
||||
|
||||
int ret = libusb_open(dev, &handle);
|
||||
|
||||
if (0)
|
||||
if (0) // not needed I guess
|
||||
{
|
||||
int err;
|
||||
if ((err = libusb_set_configuration(handle, 0)) < 0)
|
||||
|
@ -62,7 +60,7 @@ Xbox360Controller::Xbox360Controller(libusb_device* dev_,
|
|||
|
||||
if (ret != LIBUSB_SUCCESS)
|
||||
{
|
||||
throw std::runtime_error("Error opening Xbox360 controller");
|
||||
raise_exception(std::runtime_error, "libusb_open() failed: " << usb_strerror(ret));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -235,13 +233,10 @@ Xbox360Controller::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
}
|
||||
else if (len == 3 && data[0] == 0x08 && data[1] == 0x03)
|
||||
{
|
||||
if (!g_options->quiet)
|
||||
{
|
||||
if (data[2] == 0x00)
|
||||
std::cout << "Headset: none";
|
||||
else if (data[2] == 0x02)
|
||||
std::cout << "Headset: none";
|
||||
}
|
||||
if (data[2] == 0x00)
|
||||
log_info << "headset: none" << std::endl;
|
||||
else if (data[2] == 0x02)
|
||||
log_info << "headset: none" << std::endl;
|
||||
}
|
||||
else if (len == 20 && data[0] == 0x00 && data[1] == 0x14)
|
||||
{
|
||||
|
@ -251,8 +246,7 @@ Xbox360Controller::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Unknown: ";
|
||||
print_raw_data(std::cout, data, len);
|
||||
log_debug << "unknown: " << raw2str(data, len) << std::endl;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -45,17 +45,16 @@ Xbox360WirelessController::Xbox360WirelessController(libusb_device* dev_, int co
|
|||
const int ret = libusb_open(dev, &handle);
|
||||
if (ret != LIBUSB_SUCCESS)
|
||||
{
|
||||
throw std::runtime_error("Xbox360WirelessController: Error opening Xbox360 controller");
|
||||
raise_exception(std::runtime_error, "libusb_open() failed: " << usb_strerror(ret));
|
||||
}
|
||||
else
|
||||
{
|
||||
int err = usb_claim_n_detach_interface(handle, interface, try_detach);
|
||||
if (err != 0)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Error couldn't claim the USB interface: " << usb_strerror(err) << std::endl
|
||||
<< "Try to run 'rmmod xpad' and then xboxdrv again or start xboxdrv with the option --detach-kernel-driver.";
|
||||
throw std::runtime_error(out.str());
|
||||
raise_exception(std::runtime_error,
|
||||
"Error couldn't claim the USB interface: " << usb_strerror(err) << std::endl <<
|
||||
"Try to run 'rmmod xpad' and then xboxdrv again or start xboxdrv with the option --detach-kernel-driver.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -121,25 +120,25 @@ Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
{ // Connection Status Message
|
||||
if (data[1] == 0x00)
|
||||
{
|
||||
std::cout << "Connection status: nothing" << std::endl;
|
||||
log_info << "Connection status: nothing" << std::endl;
|
||||
}
|
||||
else if (data[1] == 0x80)
|
||||
{
|
||||
std::cout << "Connection status: controller connected" << std::endl;
|
||||
log_info << "Connection status: controller connected" << std::endl;
|
||||
set_led(led_status);
|
||||
}
|
||||
else if (data[1] == 0x40)
|
||||
{
|
||||
std::cout << "Connection status: headset connected" << std::endl;
|
||||
log_info << "Connection status: headset connected" << std::endl;
|
||||
}
|
||||
else if (data[1] == 0xc0)
|
||||
{
|
||||
std::cout << "Connection status: controller and headset connected" << std::endl;
|
||||
log_info << "Connection status: controller and headset connected" << std::endl;
|
||||
set_led(led_status);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Connection status: unknown" << std::endl;
|
||||
log_info << "Connection status: unknown" << std::endl;
|
||||
}
|
||||
}
|
||||
else if (len == 29)
|
||||
|
@ -155,8 +154,8 @@ Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
% int(data[12])
|
||||
% int(data[13])).str();
|
||||
battery_status = data[17];
|
||||
std::cout << "Serial: " << serial << std::endl;
|
||||
std::cout << "Battery Status: " << battery_status << std::endl;
|
||||
log_info << "Serial: " << serial << std::endl;
|
||||
log_info << "Battery Status: " << battery_status << std::endl;
|
||||
}
|
||||
else if (data[0] == 0x00 && data[1] == 0x01 && data[2] == 0x00 && data[3] == 0xf0 && data[4] == 0x00 && data[5] == 0x13)
|
||||
{ // Event message
|
||||
|
@ -167,7 +166,7 @@ Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
else if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0x13)
|
||||
{ // Battery status
|
||||
battery_status = data[4];
|
||||
std::cout << "Battery Status: " << battery_status << std::endl;
|
||||
log_info << "Battery Status: " << battery_status << std::endl;
|
||||
}
|
||||
else if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00 && data[3] == 0xf0)
|
||||
{
|
||||
|
@ -176,8 +175,7 @@ Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Unknown: ";
|
||||
print_raw_data(std::cout, data, len);
|
||||
log_debug << "unknown: " << raw2str(data, len) << std::endl;
|
||||
}
|
||||
}
|
||||
else if (len == 0)
|
||||
|
@ -186,8 +184,7 @@ Xbox360WirelessController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Unknown: ";
|
||||
print_raw_data(std::cout, data, len);
|
||||
log_debug << "unknown: " << raw2str(data, len) << std::endl;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <stdexcept>
|
||||
#include <string.h>
|
||||
|
||||
#include "log.hpp"
|
||||
#include "usb_helper.hpp"
|
||||
#include "raise_exception.hpp"
|
||||
#include "xboxmsg.hpp"
|
||||
|
@ -36,7 +37,7 @@ XboxController::XboxController(libusb_device* dev_, bool try_detach) :
|
|||
int ret = libusb_open(dev, &handle);
|
||||
if (ret != LIBUSB_SUCCESS)
|
||||
{
|
||||
throw std::runtime_error("Error opening Xbox360 controller");
|
||||
raise_exception(std::runtime_error, "libusb_open() failed: " << usb_strerror(ret));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -44,10 +45,9 @@ XboxController::XboxController(libusb_device* dev_, bool try_detach) :
|
|||
int err = usb_claim_n_detach_interface(handle, 0, try_detach);
|
||||
if (err != 0)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Error couldn't claim the USB interface: " << strerror(-err) << std::endl
|
||||
<< "Try to run 'rmmod xpad' and then xboxdrv again or start xboxdrv with the option --detach-kernel-driver.";
|
||||
throw std::runtime_error(out.str());
|
||||
raise_exception(std::runtime_error,
|
||||
"Error couldn't claim the USB interface: " << strerror(-err) << std::endl <<
|
||||
"Try to run 'rmmod xpad' and then xboxdrv again or start xboxdrv with the option --detach-kernel-driver.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -143,10 +143,8 @@ XboxController::read(XboxGenericMsg& msg, bool verbose, int timeout)
|
|||
return false;
|
||||
}
|
||||
else if (ret != LIBUSB_SUCCESS)
|
||||
{ // Error
|
||||
std::ostringstream str;
|
||||
str << "USBError: " << ret << "\n" << usb_strerror(ret);
|
||||
throw std::runtime_error(str.str());
|
||||
{
|
||||
raise_exception(std::runtime_error, "libusb_interrupt_transfer() failed: " << usb_strerror(ret));
|
||||
}
|
||||
else if (len == 20 && data[0] == 0x00 && data[1] == 0x14)
|
||||
{
|
||||
|
|
|
@ -80,7 +80,9 @@ XboxdrvDaemon::cleanup_threads()
|
|||
|
||||
if (count > 0)
|
||||
{
|
||||
log_info << "cleaned up " << count << " thread(s)" << std::endl;
|
||||
log_info << "cleaned up " << count << " thread(s), free slots: "
|
||||
<< get_free_slot_count() << "/" << m_controller_slots.size()
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -124,11 +126,7 @@ XboxdrvDaemon::process_match(const Options& opts, UInput* uinput, struct udev_de
|
|||
if (find_xpad_device(vendor, product, &dev_type))
|
||||
{
|
||||
// 3) Launch thread to handle the device
|
||||
log_info << "Found a valid Xboxdrv controller: " << busnum_str << ":" << devnum_str
|
||||
<< " -- "
|
||||
<< boost::lexical_cast<int>(busnum_str) << ", "
|
||||
<< boost::lexical_cast<int>(devnum_str)
|
||||
<< std::endl;
|
||||
log_info << "controller detected at " << busnum_str << ":" << devnum_str << std::endl;
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -145,7 +143,7 @@ XboxdrvDaemon::process_match(const Options& opts, UInput* uinput, struct udev_de
|
|||
}
|
||||
catch(const std::exception& err)
|
||||
{
|
||||
std::cout << "[XboxdrvDaemon] child thread lauch failure: " << err.what() << std::endl;
|
||||
log_error << "child thread lauch failure: " << err.what() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -161,7 +159,7 @@ XboxdrvDaemon::run(const Options& opts)
|
|||
}
|
||||
catch(const std::exception& err)
|
||||
{
|
||||
log_error << "fatal exception in XboxdrvDaemon::run(): " << err.what() << std::endl;
|
||||
log_error << "fatal exception: " << err.what() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,7 +186,7 @@ XboxdrvDaemon::run_real(const Options& opts)
|
|||
std::auto_ptr<UInput> uinput;
|
||||
if (!opts.no_uinput)
|
||||
{
|
||||
if (!opts.quiet) std::cout << "Starting with uinput" << std::endl;
|
||||
log_info << "starting with UInput" << std::endl;
|
||||
|
||||
uinput.reset(new UInput());
|
||||
|
||||
|
@ -202,11 +200,12 @@ XboxdrvDaemon::run_real(const Options& opts)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!opts.quiet)
|
||||
std::cout << "Starting without uinput" << std::endl;
|
||||
log_info << "starting without UInput" << std::endl;
|
||||
}
|
||||
|
||||
{ // create controller slots
|
||||
if (uinput.get())
|
||||
{
|
||||
// create controller slots
|
||||
int slot_count = 0;
|
||||
|
||||
for(Options::ControllerSlots::const_iterator controller = opts.controller_slots.begin();
|
||||
|
@ -225,6 +224,11 @@ XboxdrvDaemon::run_real(const Options& opts)
|
|||
// the device creation
|
||||
uinput->finish();
|
||||
}
|
||||
else
|
||||
{
|
||||
// just create some empty controller slots
|
||||
m_controller_slots.resize(opts.controller_slots.size());
|
||||
}
|
||||
|
||||
// Setup udev monitor and enumerate
|
||||
m_monitor = udev_monitor_new_from_netlink(m_udev, "udev");
|
||||
|
@ -393,13 +397,6 @@ XboxdrvDaemon::launch_xboxdrv(UInput* uinput, const XPadDevice& dev_type, const
|
|||
}
|
||||
else
|
||||
{
|
||||
std::cout << "[XboxdrvDaemon] launching " << boost::format("%03d:%03d")
|
||||
% static_cast<int>(busnum)
|
||||
% static_cast<int>(devnum)
|
||||
<< std::endl;
|
||||
|
||||
log_info << "found a free slot: " << (it - m_controller_slots.begin()) << std::endl;
|
||||
|
||||
std::auto_ptr<XboxGenericController> controller = XboxControllerFactory::create(dev_type, dev, opts);
|
||||
|
||||
std::auto_ptr<MessageProcessor> message_proc;
|
||||
|
@ -414,8 +411,32 @@ XboxdrvDaemon::launch_xboxdrv(UInput* uinput, const XPadDevice& dev_type, const
|
|||
std::auto_ptr<XboxdrvThread> thread(new XboxdrvThread(message_proc, controller, opts));
|
||||
thread->start_thread(opts);
|
||||
it->thread = thread.release();
|
||||
|
||||
log_info << "launched XboxdrvThread for " << boost::format("%03d:%03d")
|
||||
% static_cast<int>(busnum)
|
||||
% static_cast<int>(devnum)
|
||||
<< " in slot " << (it - m_controller_slots.begin())
|
||||
<< ", free slots: "
|
||||
<< get_free_slot_count() << "/" << m_controller_slots.size()
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
XboxdrvDaemon::get_free_slot_count() const
|
||||
{
|
||||
int slot_count = 0;
|
||||
|
||||
for(ControllerSlots::const_iterator i = m_controller_slots.begin(); i != m_controller_slots.end(); ++i)
|
||||
{
|
||||
if (i->thread == 0)
|
||||
{
|
||||
slot_count += 1;
|
||||
}
|
||||
}
|
||||
|
||||
return slot_count;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -86,6 +86,7 @@ private:
|
|||
void launch_xboxdrv(UInput* uinput,
|
||||
const XPadDevice& dev_type, const Options& opts,
|
||||
uint8_t busnum, uint8_t devnum);
|
||||
int get_free_slot_count() const;
|
||||
|
||||
private:
|
||||
XboxdrvDaemon(const XboxdrvDaemon&);
|
||||
|
|
Loading…
Add table
Reference in a new issue