IOKit get X and Y from different USB Mice (MAC)
I have written some code to get informations from my USB mice.
I store the info in a list and would like to update the values for x and y somehow. Do I have to use some kind of eventing? Or can I just set the values?
ps: I know that this code retrieves the values only once right now but getting the Devices Information and maybe establishing some kind of direct eventing with it should be the first step, or not?
//
// Created by Rudolf Chrispens on 30.05.18.
//
#ifndef CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#define CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/usb/IOUSBLib.h>
#include <iostream>
#include <list>
class Device;
class Device {
private:
size_t device_id;
std::string device_name;
std::string device_path;
std::string service_path;
std::string class_name;
float x_previous = 0;
float y_previous = 0;
float x_current = 0;
float y_current = 0;
public:
Device( size_t _deviceID,
std::string _device_name,
std::string _device_path,
std::string _service_path,
std::string _class_name) {
//std::cout << "###### Create Device - 0.0/0.0" << std::endl;
this->device_id = _deviceID;
this->device_name = _device_name;
this->service_path = _service_path;
this->class_name = _class_name;
std::string device_path = _device_path;
}
Device(
size_t _deviceID,
std::string const& _device_name,
std::string const& _device_path,
std::string const& _service_path,
std::string const& _class_name,
float _xStart,
float _yStart) : Device(_deviceID,
_device_name,
_device_path,
_service_path,
_class_name){
//std::cout << "###### Create Device - " << _xStart << "/" << _yStart << std::endl;
this->x_previous = _xStart;
this->y_previous = _yStart;
this->x_current = _xStart;
this->y_current = _yStart;
}
~Device(){
//std::cout << "###### Destroyed Device" << std::endl;
}
const size_t getId () const{
return this->device_id;
};
const std::string getName() const{
return this->device_name;
};
const std::string getPath() const{
return this->device_path;
};
const std::string getService() const{
return this->service_path;
};
const std::string getClass() const{
return this->class_name;
};
const float getDeltaX() const{
return x_previous - x_current;
};
const float getDeltaY() const{
return y_previous - y_current;
};
};
class DevicesManager{
private:
std::list<Device> list = std::list<Device>();
public:
DevicesManager(){
//std::cout << "###### Created Empty DevicesManager List" << std::endl;
}
~DevicesManager(){
//std::cout << "###### Destroyed DevicesManager List" << std::endl;
}
void getDevicesArray() {
CFMutableDictionaryRef usb_dictionary;
io_iterator_t io_device_iterator;
kern_return_t assembler_kernel_return_value;
io_service_t device_id;
io_name_t device_name = "unkown device";
io_name_t location;
io_string_t service_path;
io_name_t className;
// set up a matching dictionary for the class
usb_dictionary = IOServiceMatching(kIOUSBDeviceClassName);
if (usb_dictionary == NULL) {
std::cerr << "failed to fetch USB dictionary" << std::endl;
return;
}
// now we have a dictionary, get an iterator.
assembler_kernel_return_value = IOServiceGetMatchingServices(kIOMasterPortDefault, usb_dictionary, &io_device_iterator);
if (assembler_kernel_return_value != KERN_SUCCESS) {
std::cerr << "failed to get a kern_return" << std::endl;
return;
}
device_id = IOIteratorNext(io_device_iterator);
while (device_id) {
// set name
IORegistryEntryGetName(device_id, device_name);
// set service path
IORegistryEntryGetPath(device_id, kIOServicePlane, service_path);
// set path
IORegistryEntryGetPath(device_id, kIOUSBPlane, location);
//get more info:
IOObjectGetClass(device_id, className);
// https://github.com/yene/USB-Lock/blob/master/USB-Lock/USBDevices.m
// TODO set current X or establish some kind of event to keep X up to date?
// TODO set current Y or establish some kind of event to keep Y up to date?
// add device
//TODO use overloaded constructor with x and y
this->list.emplace_back(device_id, device_name, location, service_path, className); //TODO use overloaded constructor with x and y
// next id
device_id = IOIteratorNext(io_device_iterator);
}
// release the iterator
IOObjectRelease(io_device_iterator);
}
void printDeviceIDs(){
for (Device const& device : this->list) {
std::cout << "# id: " << device.getId() << std::endl;
std::cout << "| name: " << "t" << device.getName() << std::endl;
std::cout << "| path: " << "t" << device.getPath() << std::endl;
std::cout << "| service: " << "t" << device.getService() << std::endl;
std::cout << "| class: " << "t" << device.getClass() << std::endl;
std::cout << "| x: " << "t" << device.getDeltaX() << std::endl;
std::cout << "| y: " << "t" << device.getDeltaY() << std::endl;
std::cout << "#-----------------------------------------------#" << std::endl;
}
}
};
int main(int argc, const char *argv)
{
DevicesManager devices;
devices.getDevicesArray();
devices.printDeviceIDs();
}
#endif //CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
Example print:
# id: 3331
| name: Corsair Gaming M65 Pro RGB Mouse
| path:
| service: IOService:/IOResources/AppleUSBHostResources/AppleUSBLegacyRoot/AppleUSBXHCI@14000000/Corsair Gaming M65 Pro RGB Mouse@14100000
| class: IOUSBDevice
| x: 0
| y: 0
#-----------------------------------------------#
Has someone experience with the IOKit and could help out?
Thanks in advance!
c++ c mouse mouselistener iokit
add a comment |
I have written some code to get informations from my USB mice.
I store the info in a list and would like to update the values for x and y somehow. Do I have to use some kind of eventing? Or can I just set the values?
ps: I know that this code retrieves the values only once right now but getting the Devices Information and maybe establishing some kind of direct eventing with it should be the first step, or not?
//
// Created by Rudolf Chrispens on 30.05.18.
//
#ifndef CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#define CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/usb/IOUSBLib.h>
#include <iostream>
#include <list>
class Device;
class Device {
private:
size_t device_id;
std::string device_name;
std::string device_path;
std::string service_path;
std::string class_name;
float x_previous = 0;
float y_previous = 0;
float x_current = 0;
float y_current = 0;
public:
Device( size_t _deviceID,
std::string _device_name,
std::string _device_path,
std::string _service_path,
std::string _class_name) {
//std::cout << "###### Create Device - 0.0/0.0" << std::endl;
this->device_id = _deviceID;
this->device_name = _device_name;
this->service_path = _service_path;
this->class_name = _class_name;
std::string device_path = _device_path;
}
Device(
size_t _deviceID,
std::string const& _device_name,
std::string const& _device_path,
std::string const& _service_path,
std::string const& _class_name,
float _xStart,
float _yStart) : Device(_deviceID,
_device_name,
_device_path,
_service_path,
_class_name){
//std::cout << "###### Create Device - " << _xStart << "/" << _yStart << std::endl;
this->x_previous = _xStart;
this->y_previous = _yStart;
this->x_current = _xStart;
this->y_current = _yStart;
}
~Device(){
//std::cout << "###### Destroyed Device" << std::endl;
}
const size_t getId () const{
return this->device_id;
};
const std::string getName() const{
return this->device_name;
};
const std::string getPath() const{
return this->device_path;
};
const std::string getService() const{
return this->service_path;
};
const std::string getClass() const{
return this->class_name;
};
const float getDeltaX() const{
return x_previous - x_current;
};
const float getDeltaY() const{
return y_previous - y_current;
};
};
class DevicesManager{
private:
std::list<Device> list = std::list<Device>();
public:
DevicesManager(){
//std::cout << "###### Created Empty DevicesManager List" << std::endl;
}
~DevicesManager(){
//std::cout << "###### Destroyed DevicesManager List" << std::endl;
}
void getDevicesArray() {
CFMutableDictionaryRef usb_dictionary;
io_iterator_t io_device_iterator;
kern_return_t assembler_kernel_return_value;
io_service_t device_id;
io_name_t device_name = "unkown device";
io_name_t location;
io_string_t service_path;
io_name_t className;
// set up a matching dictionary for the class
usb_dictionary = IOServiceMatching(kIOUSBDeviceClassName);
if (usb_dictionary == NULL) {
std::cerr << "failed to fetch USB dictionary" << std::endl;
return;
}
// now we have a dictionary, get an iterator.
assembler_kernel_return_value = IOServiceGetMatchingServices(kIOMasterPortDefault, usb_dictionary, &io_device_iterator);
if (assembler_kernel_return_value != KERN_SUCCESS) {
std::cerr << "failed to get a kern_return" << std::endl;
return;
}
device_id = IOIteratorNext(io_device_iterator);
while (device_id) {
// set name
IORegistryEntryGetName(device_id, device_name);
// set service path
IORegistryEntryGetPath(device_id, kIOServicePlane, service_path);
// set path
IORegistryEntryGetPath(device_id, kIOUSBPlane, location);
//get more info:
IOObjectGetClass(device_id, className);
// https://github.com/yene/USB-Lock/blob/master/USB-Lock/USBDevices.m
// TODO set current X or establish some kind of event to keep X up to date?
// TODO set current Y or establish some kind of event to keep Y up to date?
// add device
//TODO use overloaded constructor with x and y
this->list.emplace_back(device_id, device_name, location, service_path, className); //TODO use overloaded constructor with x and y
// next id
device_id = IOIteratorNext(io_device_iterator);
}
// release the iterator
IOObjectRelease(io_device_iterator);
}
void printDeviceIDs(){
for (Device const& device : this->list) {
std::cout << "# id: " << device.getId() << std::endl;
std::cout << "| name: " << "t" << device.getName() << std::endl;
std::cout << "| path: " << "t" << device.getPath() << std::endl;
std::cout << "| service: " << "t" << device.getService() << std::endl;
std::cout << "| class: " << "t" << device.getClass() << std::endl;
std::cout << "| x: " << "t" << device.getDeltaX() << std::endl;
std::cout << "| y: " << "t" << device.getDeltaY() << std::endl;
std::cout << "#-----------------------------------------------#" << std::endl;
}
}
};
int main(int argc, const char *argv)
{
DevicesManager devices;
devices.getDevicesArray();
devices.printDeviceIDs();
}
#endif //CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
Example print:
# id: 3331
| name: Corsair Gaming M65 Pro RGB Mouse
| path:
| service: IOService:/IOResources/AppleUSBHostResources/AppleUSBLegacyRoot/AppleUSBXHCI@14000000/Corsair Gaming M65 Pro RGB Mouse@14100000
| class: IOUSBDevice
| x: 0
| y: 0
#-----------------------------------------------#
Has someone experience with the IOKit and could help out?
Thanks in advance!
c++ c mouse mouselistener iokit
add a comment |
I have written some code to get informations from my USB mice.
I store the info in a list and would like to update the values for x and y somehow. Do I have to use some kind of eventing? Or can I just set the values?
ps: I know that this code retrieves the values only once right now but getting the Devices Information and maybe establishing some kind of direct eventing with it should be the first step, or not?
//
// Created by Rudolf Chrispens on 30.05.18.
//
#ifndef CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#define CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/usb/IOUSBLib.h>
#include <iostream>
#include <list>
class Device;
class Device {
private:
size_t device_id;
std::string device_name;
std::string device_path;
std::string service_path;
std::string class_name;
float x_previous = 0;
float y_previous = 0;
float x_current = 0;
float y_current = 0;
public:
Device( size_t _deviceID,
std::string _device_name,
std::string _device_path,
std::string _service_path,
std::string _class_name) {
//std::cout << "###### Create Device - 0.0/0.0" << std::endl;
this->device_id = _deviceID;
this->device_name = _device_name;
this->service_path = _service_path;
this->class_name = _class_name;
std::string device_path = _device_path;
}
Device(
size_t _deviceID,
std::string const& _device_name,
std::string const& _device_path,
std::string const& _service_path,
std::string const& _class_name,
float _xStart,
float _yStart) : Device(_deviceID,
_device_name,
_device_path,
_service_path,
_class_name){
//std::cout << "###### Create Device - " << _xStart << "/" << _yStart << std::endl;
this->x_previous = _xStart;
this->y_previous = _yStart;
this->x_current = _xStart;
this->y_current = _yStart;
}
~Device(){
//std::cout << "###### Destroyed Device" << std::endl;
}
const size_t getId () const{
return this->device_id;
};
const std::string getName() const{
return this->device_name;
};
const std::string getPath() const{
return this->device_path;
};
const std::string getService() const{
return this->service_path;
};
const std::string getClass() const{
return this->class_name;
};
const float getDeltaX() const{
return x_previous - x_current;
};
const float getDeltaY() const{
return y_previous - y_current;
};
};
class DevicesManager{
private:
std::list<Device> list = std::list<Device>();
public:
DevicesManager(){
//std::cout << "###### Created Empty DevicesManager List" << std::endl;
}
~DevicesManager(){
//std::cout << "###### Destroyed DevicesManager List" << std::endl;
}
void getDevicesArray() {
CFMutableDictionaryRef usb_dictionary;
io_iterator_t io_device_iterator;
kern_return_t assembler_kernel_return_value;
io_service_t device_id;
io_name_t device_name = "unkown device";
io_name_t location;
io_string_t service_path;
io_name_t className;
// set up a matching dictionary for the class
usb_dictionary = IOServiceMatching(kIOUSBDeviceClassName);
if (usb_dictionary == NULL) {
std::cerr << "failed to fetch USB dictionary" << std::endl;
return;
}
// now we have a dictionary, get an iterator.
assembler_kernel_return_value = IOServiceGetMatchingServices(kIOMasterPortDefault, usb_dictionary, &io_device_iterator);
if (assembler_kernel_return_value != KERN_SUCCESS) {
std::cerr << "failed to get a kern_return" << std::endl;
return;
}
device_id = IOIteratorNext(io_device_iterator);
while (device_id) {
// set name
IORegistryEntryGetName(device_id, device_name);
// set service path
IORegistryEntryGetPath(device_id, kIOServicePlane, service_path);
// set path
IORegistryEntryGetPath(device_id, kIOUSBPlane, location);
//get more info:
IOObjectGetClass(device_id, className);
// https://github.com/yene/USB-Lock/blob/master/USB-Lock/USBDevices.m
// TODO set current X or establish some kind of event to keep X up to date?
// TODO set current Y or establish some kind of event to keep Y up to date?
// add device
//TODO use overloaded constructor with x and y
this->list.emplace_back(device_id, device_name, location, service_path, className); //TODO use overloaded constructor with x and y
// next id
device_id = IOIteratorNext(io_device_iterator);
}
// release the iterator
IOObjectRelease(io_device_iterator);
}
void printDeviceIDs(){
for (Device const& device : this->list) {
std::cout << "# id: " << device.getId() << std::endl;
std::cout << "| name: " << "t" << device.getName() << std::endl;
std::cout << "| path: " << "t" << device.getPath() << std::endl;
std::cout << "| service: " << "t" << device.getService() << std::endl;
std::cout << "| class: " << "t" << device.getClass() << std::endl;
std::cout << "| x: " << "t" << device.getDeltaX() << std::endl;
std::cout << "| y: " << "t" << device.getDeltaY() << std::endl;
std::cout << "#-----------------------------------------------#" << std::endl;
}
}
};
int main(int argc, const char *argv)
{
DevicesManager devices;
devices.getDevicesArray();
devices.printDeviceIDs();
}
#endif //CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
Example print:
# id: 3331
| name: Corsair Gaming M65 Pro RGB Mouse
| path:
| service: IOService:/IOResources/AppleUSBHostResources/AppleUSBLegacyRoot/AppleUSBXHCI@14000000/Corsair Gaming M65 Pro RGB Mouse@14100000
| class: IOUSBDevice
| x: 0
| y: 0
#-----------------------------------------------#
Has someone experience with the IOKit and could help out?
Thanks in advance!
c++ c mouse mouselistener iokit
I have written some code to get informations from my USB mice.
I store the info in a list and would like to update the values for x and y somehow. Do I have to use some kind of eventing? Or can I just set the values?
ps: I know that this code retrieves the values only once right now but getting the Devices Information and maybe establishing some kind of direct eventing with it should be the first step, or not?
//
// Created by Rudolf Chrispens on 30.05.18.
//
#ifndef CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#define CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/usb/IOUSBLib.h>
#include <iostream>
#include <list>
class Device;
class Device {
private:
size_t device_id;
std::string device_name;
std::string device_path;
std::string service_path;
std::string class_name;
float x_previous = 0;
float y_previous = 0;
float x_current = 0;
float y_current = 0;
public:
Device( size_t _deviceID,
std::string _device_name,
std::string _device_path,
std::string _service_path,
std::string _class_name) {
//std::cout << "###### Create Device - 0.0/0.0" << std::endl;
this->device_id = _deviceID;
this->device_name = _device_name;
this->service_path = _service_path;
this->class_name = _class_name;
std::string device_path = _device_path;
}
Device(
size_t _deviceID,
std::string const& _device_name,
std::string const& _device_path,
std::string const& _service_path,
std::string const& _class_name,
float _xStart,
float _yStart) : Device(_deviceID,
_device_name,
_device_path,
_service_path,
_class_name){
//std::cout << "###### Create Device - " << _xStart << "/" << _yStart << std::endl;
this->x_previous = _xStart;
this->y_previous = _yStart;
this->x_current = _xStart;
this->y_current = _yStart;
}
~Device(){
//std::cout << "###### Destroyed Device" << std::endl;
}
const size_t getId () const{
return this->device_id;
};
const std::string getName() const{
return this->device_name;
};
const std::string getPath() const{
return this->device_path;
};
const std::string getService() const{
return this->service_path;
};
const std::string getClass() const{
return this->class_name;
};
const float getDeltaX() const{
return x_previous - x_current;
};
const float getDeltaY() const{
return y_previous - y_current;
};
};
class DevicesManager{
private:
std::list<Device> list = std::list<Device>();
public:
DevicesManager(){
//std::cout << "###### Created Empty DevicesManager List" << std::endl;
}
~DevicesManager(){
//std::cout << "###### Destroyed DevicesManager List" << std::endl;
}
void getDevicesArray() {
CFMutableDictionaryRef usb_dictionary;
io_iterator_t io_device_iterator;
kern_return_t assembler_kernel_return_value;
io_service_t device_id;
io_name_t device_name = "unkown device";
io_name_t location;
io_string_t service_path;
io_name_t className;
// set up a matching dictionary for the class
usb_dictionary = IOServiceMatching(kIOUSBDeviceClassName);
if (usb_dictionary == NULL) {
std::cerr << "failed to fetch USB dictionary" << std::endl;
return;
}
// now we have a dictionary, get an iterator.
assembler_kernel_return_value = IOServiceGetMatchingServices(kIOMasterPortDefault, usb_dictionary, &io_device_iterator);
if (assembler_kernel_return_value != KERN_SUCCESS) {
std::cerr << "failed to get a kern_return" << std::endl;
return;
}
device_id = IOIteratorNext(io_device_iterator);
while (device_id) {
// set name
IORegistryEntryGetName(device_id, device_name);
// set service path
IORegistryEntryGetPath(device_id, kIOServicePlane, service_path);
// set path
IORegistryEntryGetPath(device_id, kIOUSBPlane, location);
//get more info:
IOObjectGetClass(device_id, className);
// https://github.com/yene/USB-Lock/blob/master/USB-Lock/USBDevices.m
// TODO set current X or establish some kind of event to keep X up to date?
// TODO set current Y or establish some kind of event to keep Y up to date?
// add device
//TODO use overloaded constructor with x and y
this->list.emplace_back(device_id, device_name, location, service_path, className); //TODO use overloaded constructor with x and y
// next id
device_id = IOIteratorNext(io_device_iterator);
}
// release the iterator
IOObjectRelease(io_device_iterator);
}
void printDeviceIDs(){
for (Device const& device : this->list) {
std::cout << "# id: " << device.getId() << std::endl;
std::cout << "| name: " << "t" << device.getName() << std::endl;
std::cout << "| path: " << "t" << device.getPath() << std::endl;
std::cout << "| service: " << "t" << device.getService() << std::endl;
std::cout << "| class: " << "t" << device.getClass() << std::endl;
std::cout << "| x: " << "t" << device.getDeltaX() << std::endl;
std::cout << "| y: " << "t" << device.getDeltaY() << std::endl;
std::cout << "#-----------------------------------------------#" << std::endl;
}
}
};
int main(int argc, const char *argv)
{
DevicesManager devices;
devices.getDevicesArray();
devices.printDeviceIDs();
}
#endif //CPP_MULTIMOUSE_USBPRIVATEDATASAMPLE_H
Example print:
# id: 3331
| name: Corsair Gaming M65 Pro RGB Mouse
| path:
| service: IOService:/IOResources/AppleUSBHostResources/AppleUSBLegacyRoot/AppleUSBXHCI@14000000/Corsair Gaming M65 Pro RGB Mouse@14100000
| class: IOUSBDevice
| x: 0
| y: 0
#-----------------------------------------------#
Has someone experience with the IOKit and could help out?
Thanks in advance!
c++ c mouse mouselistener iokit
c++ c mouse mouselistener iokit
asked Jan 1 at 21:30
rufreakderufreakde
8411
8411
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53999092%2fiokit-get-x-and-y-from-different-usb-mice-mac%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53999092%2fiokit-get-x-and-y-from-different-usb-mice-mac%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown