IOKit get X and Y from different USB Mice (MAC)












0















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!










share|improve this question



























    0















    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!










    share|improve this question

























      0












      0








      0








      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!










      share|improve this question














      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 1 at 21:30









      rufreakderufreakde

      8411




      8411
























          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          Monofisismo

          Angular Downloading a file using contenturl with Basic Authentication

          Olmecas