bool operator==(const entry& other) const { return get_device_id() == other.get_device_id() && get_event_time_stamp() == other.get_event_time_stamp() && get_valid() == other.get_valid() && get_lazy() == other.get_lazy() && get_event() == other.get_event() && get_event_type() == other.get_event_type() && get_original_event() == other.get_original_event(); }
void push_back_entry(const entry& entry) { emplace_back_entry(entry.get_device_id(), entry.get_event_time_stamp(), entry.get_event(), entry.get_event_type(), entry.get_original_event(), entry.get_lazy()); events_.back().set_valid(entry.get_valid()); }
static bool needs_swap(const entry& v1, const entry& v2) { // Some devices are send modifier flag and key at the same HID report. // For example, a key sends control+up-arrow by this reports. // // modifiers: 0x0 // keys: 0x0 0x0 0x0 0x0 0x0 0x0 // // modifiers: 0x1 // keys: 0x52 0x0 0x0 0x0 0x0 0x0 // // In this case, macOS does not guarantee the value event order to be modifier first. // At least macOS 10.12 or prior sends the up-arrow event first. // // ---------------------------------------- // Example of hid value events in a single queue at control+up-arrow // // 1. up-arrow keydown // usage_page:0x7 // usage:0x4f // integer_value:1 // // 2. control keydown // usage_page:0x7 // usage:0xe1 // integer_value:1 // // 3. up-arrow keyup // usage_page:0x7 // usage:0x4f // integer_value:0 // // 4. control keyup // usage_page:0x7 // usage:0xe1 // integer_value:0 // ---------------------------------------- // // These events will not be interpreted as intended in this order. // Thus, we have to reorder the events. if (v1.get_event_time_stamp().get_time_stamp() == v2.get_event_time_stamp().get_time_stamp()) { auto key_code1 = v1.get_event().get_key_code(); auto key_code2 = v2.get_event().get_key_code(); if (key_code1 && key_code2) { auto modifier_flag1 = types::make_modifier_flag(*key_code1); auto modifier_flag2 = types::make_modifier_flag(*key_code2); // If either modifier_flag1 or modifier_flag2 is modifier, reorder it before. if (!modifier_flag1 && modifier_flag2) { // v2 is modifier_flag if (v2.get_event_type() == event_type::key_up) { return false; } else { // reorder to v2,v1 if v2 is pressed. return true; } } if (modifier_flag1 && !modifier_flag2) { // v1 is modifier_flag if (v1.get_event_type() == event_type::key_up) { // reorder to v2,v1 if v1 is released. return true; } else { return false; } } } } return false; }