1

I am trying to remap CAPS-LOCK.

I can successfully detect CAPS-LOCK key-down/up events using CGEventTap.

However, I am unable to consume them. (OTOH I am able to consume ordinary key-down/up events).

The below code excerpt illustrates this:

@implementation Intercept

- (BOOL) tapEvents
{
    _eventTap = CGEventTapCreate( kCGHIDEventTap, // kCGSessionEventTap,
                                  kCGHeadInsertEventTap,
                                  kCGEventTapOptionDefault,
                                       CGEventMaskBit( NSEventTypeKeyDown )
                                     | CGEventMaskBit( NSEventTypeFlagsChanged )
                                     | CGEventMaskBit( NSEventTypeSystemDefined ),
                                  (CGEventTapCallBack) tapCallback,
                                  (__bridge void *)(self));
    CGEventTapEnable( _eventTap, YES );
}


CGEventRef tapCallback(
                        CGEventTapProxy proxy,
                        CGEventType     type,
                        CGEventRef      event,
                        Intercept*     listener
                        )
{
    return [listener interceptEvent:event];
}


- (CGEventRef)interceptEvent:(CGEventRef)cgEvent
{    
    NSEvent* event = [NSEvent eventWithCGEvent:cgEvent];

    /*
     CAPSLOCK sends:
       (1) NSEventTypeSystemDefined
       (2) NSEventTypeFlagsChanged
     */

    switch( event.type ) {
        // if I return NULL here, it DOESN'T eat CAPS-LOCK
        case NSEventTypeFlagsChanged:
        case NSEventTypeSystemDefined:
            return NULL;

        // if I return NULL here, it DOES eat keystrokes
        case NSEventTypeKeyDown:
            return NULL;
    }

    CGEventRef ev = [event CGEvent];
    CFRetain(ev);
    return ev;
}

How come this one key escapes the rules that bind the rest?

Do I have to drop down to IOHID layer?

REF: Simulate/Toggle CAPS LOCK programatically in OS X

Alternatively, might it make sense to inject antidote CAPS-LOCK events that will cancel the effect of the real ones?

P i
  • 29,020
  • 36
  • 159
  • 267
  • "How come this one key escapes the rules that bind the rest?" The caps lock is a push on push off key. The caps lock can be switched with other keys in the System Prefs. Try it and see which events you get. If you consume all events, does the `kCGEventFlagMaskAlphaShift` flag of the events change? – Willeke May 26 '19 at 11:51
  • Not related the issue but Is `ev` the same instance as `cgEvent`? – Willeke May 26 '19 at 12:45
  • 1
    Maybe interesting: [Technical Note TN2450 Remapping Keys in macOS 10.12 Sierra](https://developer.apple.com/library/archive/technotes/tn2450/_index.html#//apple_ref/doc/uid/DTS40017618-CH1-TNTAG4) – Willeke May 26 '19 at 13:11
  • @Willeke Great find -- this does the job! – P i Jul 04 '19 at 13:11

0 Answers0