BUT i want Cocoa not to emit an "error beep" each time a key is pressed (PB Keyboard Shortcuts are not usable in my case).
I have read that it is needed to subclass the NSView to return YES to the "performKeyEquivalent:" event to avoid the "error beep" from Cocoa when pressing a key :
http://stackoverflow.com/questions/8869 ... -in-nsview
But i don't know how to do it in PB. Can some Cocoa guru help me ?
Code: Select all
EnableExplicit
#NSKeyDown = 10
#NSKeyUp = 11
#NSFlagsChanged = 12
ImportC "" ;{
sel_registerName(str.p-ascii)
class_addMethod(class, selector, imp, types.p-ascii)
EndImport ;}
ProcedureC OS_CallBackEventsHandler(obj, sel, notification)
Define sharedApplication = CocoaMessage(0, 0, "NSApplication sharedApplication")
Define currentEvent = CocoaMessage(0, sharedApplication, "currentEvent")
Define Object = CocoaMessage(0, currentEvent, "window")
Static lastEvent
If currentEvent = lastEvent : ProcedureReturn : EndIf
lastEvent = currentEvent
If currentEvent
Select CocoaMessage(0, currentEvent, "type")
Case #NSKeyDown
Debug "KeyDown : keyCode = " + CocoaMessage(0, currentEvent, "keyCode")
Define Long = CocoaMessage(0, currentEvent, "characters")
CocoaMessage(@Long, Long, "UTF8String")
Debug "KeyDown : keyChar = " + Asc(PeekS(Long, -1, #PB_UTF8))
Case #NSKeyUp
Debug "KeyUp : keyCode = " + CocoaMessage(0, currentEvent, "keyCode")
Case #NSFlagsChanged ; SHIFT, CMD, ALT, CTRL, CAPS
Debug "Flags : " + Bin(CocoaMessage(0, currentEvent, "modifierFlags"))
EndSelect
EndIf
EndProcedure
OpenWindow(0, 100, 100, 300, 200, "Test")
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:") ; Necessary ?
class_addMethod(delegateClass, selector, @OS_CallBackEventsHandler(), "v@:@")
CocoaMessage(0, notificationCenter, "addObserver:", appDelegate, "selector:", selector, "name:", #Null, "object:", WindowID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow