Creating windows and managing events with Cocoa
Aug 17, 2010 at 11:01am
Creating windows and managing events with Cocoa
I have written several Max externals, using Carbon to create windows and manage the events. Since Carbon is no longer supported by Apple, I want to switch to Cocoa and re-write my externals.
So far I have managed to create an NSWindow, open it and draw to it. What I haven’t managed yet is to find out how to retrieve (mouse and keyboard) events for my windows.
In Carbon I invoked an “InitializeWindowEvents” function from the _new function in which I installed the events for the window, for example:
handlerUPP = NewEventHandlerUPP (HandleMouseEventsMyWindow);
HandleMouseEventsWindowmyWindow is the function to which the (mouse) events are dispatched (in order to be processed’), myWindowRef is a Carbon WindowRef of the window (myWindow).
Can anyone show me how to do this with Cocoa? How can I register events for the window in order to receive events?
Aug 17, 2010 at 4:38pm
I think this is a more general Cocoa issue than anything to do with Max… The code I’ve pasted below may not get you 100% of the way there but, hopefully it might get you going in the right direction. This is excerpted from the audiounit~ object, which supports both Carbon views and Cocoa views — the Cocoa views requiring a (drum roll…) Cocoa window.
x->a_nsWindow = [[NSWindow alloc] initWithContentRect:bounds styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask backing:NSBackingStoreBuffered defer:NO]; [x->a_nsWindow setReleasedWhenClosed:YES]; [x->a_nsWindow setContentView:auView]; NSString* nsTitle = [[NSString alloc] initWithCString:cWindowTitle]; AUCocoaWindowDelegate* windowDelegate = [[AUCocoaWindowDelegate alloc] init]; [x->a_nsWindow setTitle:nsTitle]; [x->a_nsWindow setDelegate:windowDelegate]; [x->a_nsWindow orderFrontRegardless]; [x->a_nsWindow makeKeyWindow]; [x->a_view setPostsBoundsChangedNotifications:YES]; [x->a_view setPostsFrameChangedNotifications:YES]; [[NSNotificationCenter defaultCenter] addObserver:windowDelegate selector:@selector(didResizeView:) name:@"NSViewFrameDidChangeNotification" object:x->a_view];
A couple of points to make:
1. It requires writing a delegate Cocoa class, creating an instance of that class, and then passing that instance to the window. Then the window calls methods on your delegate.
2. For some events, the window doesn’t pass the events that we look for in audiounit~, so we register for global notifications in the last line of code. You wouldn’t have to use the same class for these two different mechanisms, even though that’s what we did here.
Hope this helps!
Aug 17, 2010 at 8:02pm
thanks very much for your response. As I can gather from your code, your NSWindow seems to be part of your object struct. As a basis of my studies I used the “plussz2″ example provided in the SDK.
In order to add a NSWindow to the plussz struct, I have to add the Cocoa framework (and some others) to the project.
When I tried to add #include
In the function void *plussz2_new(long n) I iallocate and initialize the window:
void *plussz2_new(long n) // n = int argument typed into object box (A_DEFLONG) — defaults to 0 if no args are typed
x = (t_plussz2 *)object_alloc(plussz2_class); // create a new instance of this object
// initialize L and R inlet atoms to (int)0
x->a_nsWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(100,100,400,300)
NSString *nsTitle = @”MyNSWindow”; // window title
return(x); // return a reference to the object instance
I use the function void plussz2_bang(t_plussz2 *x) to open and close the window:
void plussz2_bang(t_plussz2 *x)
if (toggle == 0)
Whenever I send a bang to plussz, the variable toggle in turn opens and closes the window.
So far I managed to create a window and open / close it. Fine.
Since I am new to Cocoa, I am not familiar with all the details yet:
What have I got to do to write a delegate class? What does [x->a_nsWindow setDelegate:windowDelegate]; mean?
How can I receive events to the window? Which are the functions to retrieve them?
Sorry for the banal questions, but I am new to all this, and the Apple Documentaton is huge and very confusing in the beginning…
Aug 17, 2010 at 8:58pm
Yes, navigating Apple’s documentation can be a bit of a maze.
I googled for “NSWindow delegate”, and this came up:
Maybe that’s relevant to what you are trying to do. It also turned-up this, which looks really helpful:
And finally, the first result returned by Google was: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html
If you do a Find on this page for “delegate” it shows a lot of places it comes up. Probably there is a coherent list somewhere, or you can just glean from this what you are looking for.
Sep 4, 2010 at 7:41am
Thanks, I will try to explore it.
Mar 23, 2011 at 5:20pm
what is the best way to deal with memory management ;
i’m on X.4.11 so i don’t use the garbage collector ;
do i have to alloc the
i’m a bit lost ; thanks for clues ;-)
You must be logged in to reply to this topic.