Code: Select all
EnableExplicit
; #NSLeftMouseUp ; #NSRightMouseUp ; #NSMouseMoved ; #NSScrollWheel ; …
Global keyTime, lastKeyTime = -99999 ; for doublecommand
Procedure.s modifierFlagsInfo(modifierFlags)
   Protected r1.s, flags
   flags = modifierFlags & $FFFF0000
   If modifierFlags & #NSCommandKeyMask
      r1 + "Command "
   EndIf
   If modifierFlags & #NSControlKeyMask
      r1 + "Control "
   EndIf
   If modifierFlags & #NSAlternateKeyMask
      r1 + "Alt "
   EndIf
   If modifierFlags & #NSShiftKeyMask
      r1 + "Shift "
   EndIf
   If modifierFlags & #NSAlphaShiftKeyMask
      r1 + "Caps Lock "
   EndIf
   If modifierFlags & #NSFunctionKeyMask
      if not modifierFlags & #NSNumericPadKeyMask ; for arrow keys…
         r1 + "fn "
      EndIf
   EndIf
   ProcedureReturn r1
EndProcedure
ImportC "" ;{
   sel_registerName(str.p-ascii)
   class_addMethod(class, selector, imp, types.p-ascii)
EndImport ;}
Macro Print(s)
   AddGadgetItem(0, -1, s)
   SetGadgetState(0, CountGadgetItems(0)-1)
   SetGadgetState(0, -1)
EndMacro
Procedure PrintKey(Ev.s, CurEv)
   Print(Ev + ": keyCode = " + CocoaMessage(0, CurEv, "keyCode"))
   Define Long = CocoaMessage(0, CurEv, "characters")
   CocoaMessage(@Long, Long, "UTF8String")
   Print(Ev + ": keyChar = " + Chr(Asc(PeekS(Long, -1, #PB_UTF8))))
   Protected modkeys.s = modifierFlagsInfo(CocoaMessage(0, CurEv, "modifierFlags"))
   if modkeys : Print("Modifiers: " + modkeys) : EndIf
   Print("")
EndProcedure
ProcedureC OS_CallBackEventsHandler(obj, sel, notification)
   Define sharedApplication = CocoaMessage(0, 0, "NSApplication sharedApplication")
   Define currentEvent = CocoaMessage(0, sharedApplication, "currentEvent")
   Static lastEvent
   If currentEvent = lastEvent : ProcedureReturn : EndIf
   lastEvent = currentEvent
   If currentEvent
      Select CocoaMessage(0, currentEvent, "type")
         Case #NSKeyDown
            PrintKey("Key Down", currentEvent)
         Case #NSKeyUp
            PrintKey("Key Up", currentEvent)
         Case #NSLeftMouseUp
            Debug "NSLeftMouseUp" ; whole window
         Case #NSFlagsChanged ; SHIFT, CMD, ALT, CTRL, CAPS, fn…
            If (CocoaMessage(0, currentEvent, "modifierFlags") & $FFFF0000) = #NSCommandKeyMask
               keyTime = ElapsedMilliseconds()
               If keyTime - lastKeyTime < DoubleClickTime()
                  Print("Double Command!") : Print("")
               EndIf
               lastKeyTime = keyTime
            EndIf
      EndSelect
   EndIf
EndProcedure
ProcedureC PerformKeyEquivalent(Sender, sel, event)
   ProcedureReturn #YES ; avoid beeps
EndProcedure
OpenWindow(0, 0, 0, 300, 300, "Keys Info")
ListViewGadget(0, 5, 5, 290, 290)
Define notificationCenter = CocoaMessage(0, 0, "NSNotificationCenter defaultCenter")
Define appDelegate = CocoaMessage(0, CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
Define delegateClass = CocoaMessage(0, appDelegate, "class")
Define selector = sel_registerName("EventsHandlerCallback:")
class_addMethod(delegateClass, selector, @OS_CallBackEventsHandler(), "v@:@")
CocoaMessage(0, notificationCenter, "addObserver:", appDelegate, "selector:", selector, "name:", #Null, "object:", WindowID(0))
; avoid beeps
Define class = CocoaMessage(0, WindowID(0), "class")
Define selector = sel_registerName("performKeyEquivalent:") 
class_addMethod(class, selector, @PerformKeyEquivalent(), "v@:@")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow ; or EventMenu() = #PB_Menu_Quit