#ifndef IOHIDUtility_h
#define IOHIDUtility_h
#include <IOKit/IOTypes.h>
#include <IOKit/hid/IOHIDUsageTables.h>
enum {
kKeyMaskCtrl = 0x0001,
kKeyMaskShift = 0x0002,
kKeyMaskAlt = 0x0004,
kKeyMaskLeftCommand = 0x0008,
kKeyMaskRightCommand = 0x0010,
kKeyMaskPeriod = 0x0020,
kKeyMaskComma = 0x0040,
kKeyMaskSlash = 0x0080,
kKeyMaskEsc = 0x0100,
kKeyMaskFn = 0x0200,
kKeyMaskDelete = 0x0400,
kKeyMaskPower = 0x0800,
kKeyMaskUnknown = 0x80000000
};
struct Key {
uint64_t _value;
bool _modified;
Key ():_value(0), _modified(false){}
Key (uint32_t usagePage, uint32_t usage):_value(((uint64_t)usagePage << 32) | usage), _modified(false) {}
Key (uint32_t usagePage, uint32_t usage, bool modified):_value(((uint64_t)usagePage << 32) | usage), _modified(modified) {}
Key (uint64_t usageAndUsagePage): _value (usageAndUsagePage), _modified(false) {}
friend bool operator==(const Key &lhs, const Key &rhs) {
return (lhs._value == rhs._value);
}
friend bool operator<(const Key &lhs, const Key &rhs) {
return (lhs._value < rhs._value);
}
uint32_t usage () const {return ((uint32_t*)&_value)[0];}
uint32_t usagePage () const {return((uint32_t*)&_value)[1];}
bool isValid () const {return _value != 0;}
bool isModifier () const;
bool isTopRow () const {
bool result = false;
if ((usagePage() == kHIDPage_KeyboardOrKeypad) &&
(((usage() >= kHIDUsage_Keyboard1) && (usage() <= kHIDUsage_Keyboard0)) ||
(usage() == kHIDUsage_KeyboardHyphen) ||
(usage() == kHIDUsage_KeyboardEqualSign) ||
(usage() == kHIDUsage_KeyboardGraveAccentAndTilde) ||
(usage() == kHIDUsage_KeyboardDeleteOrBackspace))) {
result = true;
}
return result;
}
};
struct KeyAttribute {
uint32_t _flags;
KeyAttribute (uint32_t flags = 0):_flags(flags) {};
};
#endif