int setactive_mouse(usbdevice* kb, int active){ if(NEEDS_FW_UPDATE(kb)) return 0; uchar msg[2][MSG_SIZE] = { { 0x07, 0x04, 0 }, // Disables or enables HW control for DPI and Sniper button { 0x07, 0x40, 0x08, 0, 1, 0x80, 2, 0x80, 3, 0x80, 4, 0x80, 5, 0x80, 6, 0x80, 7, 0x80, 8, 0x80 }, // Enable button input. This is similar to the keyboard input selection, but we want everything to come through the HID reports. }; if(active) // Put the mouse into SW mode msg[0][2] = 2; else // Restore HW mode msg[0][2] = 1; pthread_mutex_lock(imutex(kb)); kb->active = !!active; kb->profile->lastlight.forceupdate = 1; // Clear input memset(&kb->input.keys, 0, sizeof(kb->input.keys)); inputupdate(kb); pthread_mutex_unlock(imutex(kb)); if(!usbsend(kb, msg[0], 1)) return -1; if(active && !usbsend(kb, msg[1], 1)) return -1; return 0; }
void os_updateindicators(usbdevice* kb, int force){ if(!IS_CONNECTED(kb) || NEEDS_FW_UPDATE(kb)) return; // Set NumLock on permanently char ileds = 1; // Set Caps Lock if enabled. Unlike Linux, OSX keyboards have independent caps lock states, so // we use the last-assigned value rather than fetching it from the system if(kb->eventflags & kCGEventFlagMaskAlphaShift) ileds |= 2; usbmode* mode = kb->profile.currentmode; if(mode && kb->active) ileds = (ileds & ~mode->ioff) | mode->ion; if(force || ileds != kb->ileds){ kb->ileds = ileds; // Set the LEDs CFArrayRef leds = IOHIDDeviceCopyMatchingElements(kb->handles[0], 0, kIOHIDOptionsTypeNone); CFIndex count = CFArrayGetCount(leds); for(CFIndex i = 0; i < count; i++){ IOHIDElementRef led = (void*)CFArrayGetValueAtIndex(leds, i); uint32_t page = IOHIDElementGetUsagePage(led); if(page != kHIDPage_LEDs) continue; uint32_t usage = IOHIDElementGetUsage(led); IOHIDValueRef value = IOHIDValueCreateWithIntegerValue(kCFAllocatorDefault, led, 0, !!(ileds & (1 << (usage - 1)))); IOHIDDeviceSetValue(kb->handles[0], led, value); CFRelease(value); } CFRelease(leds); } }
int revertusb(usbdevice* kb){ if(NEEDS_FW_UPDATE(kb)) return 0; if(!HAS_FEATURES(kb, FEAT_RGB)){ nk95cmd(kb, NK95_HWON); return 0; } if(setactive(kb, 0)) return -1; return 0; }