open_toontown_panda3d/panda/src/cocoadisplay/cocoaPandaView.mm

171 lines
4.1 KiB
Plaintext

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file cocoaPandaView.mm
* @author rdb
* @date 2012-05-17
*/
#include "config_cocoadisplay.h"
#import "cocoaPandaView.h"
#import "cocoaGraphicsWindow.h"
#include <OpenGL/gl.h>
@implementation CocoaPandaView
- (id) initWithFrame:(NSRect)frameRect context:(NSOpenGLContext*)context window:(CocoaGraphicsWindow*)window {
self = [super initWithFrame: frameRect];
_context = context;
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
[self setCanDrawConcurrently:YES];
#endif
cocoadisplay_cat.debug()
<< "Created CocoaPandaView " << self << " for GraphicsWindow " << window << "\n";
_graphicsWindow = window;
return self;
}
- (NSOpenGLContext*) openGLContext {
return _context;
}
- (GraphicsWindow*) graphicsWindow {
return _graphicsWindow;
}
- (void) drawRect:(NSRect)dirtyRect {
// Do nothing. We draw from another thread.
if (cocoadisplay_cat.is_spam()) {
cocoadisplay_cat.spam()
<< "drawRect was called.\n";
}
}
- (void) finalize {
_graphicsWindow->handle_close_event();
[super finalize];
}
- (BOOL) isFlipped {
// Apple uses a coordinate system where the lower-left corner represents (0,
// 0). In Panda, this is the upper-left corner.
return YES;
}
- (BOOL) needsDisplay {
// Never, we don't use drawRect. We draw from elsewhere.
return NO;
}
- (BOOL) acceptsFirstResponder {
return YES;
}
- (BOOL) becomeFirstResponder {
return YES;
}
- (BOOL) resignFirstResponder {
return YES;
}
- (void) resetCursorRects {
if (_graphicsWindow->_cursor != nil) {
[self addCursorRect:[self bounds] cursor:_graphicsWindow->_cursor];
}
}
- (void) setFrame: (NSRect) frame {
[super setFrame: frame];
// _graphicsWindow->handle_resize_event();
}
- (void) keyDown: (NSEvent *) event {
_graphicsWindow->handle_key_event(event);
}
- (void) keyUp: (NSEvent *) event {
_graphicsWindow->handle_key_event(event);
}
- (void) flagsChanged: (NSEvent *) event {
_graphicsWindow->handle_key_event(event);
}
- (void) mouseDown: (NSEvent *) event {
_graphicsWindow->handle_mouse_button_event(0, true);
}
- (void) mouseDragged: (NSEvent *) event {
[self mouseMoved: event];
}
- (void) mouseUp: (NSEvent *) event {
_graphicsWindow->handle_mouse_button_event(0, false);
}
- (void) mouseMoved: (NSEvent *) event {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
BOOL inside = [self mouse:loc inRect:[self bounds]];
// the correlation between mouse deltas and location are "debounced"
// apparently, so send deltas for both relative and confined modes
if (_graphicsWindow->get_properties().get_mouse_mode() != WindowProperties::M_absolute) {
_graphicsWindow->handle_mouse_moved_event(inside, [event deltaX], [event deltaY], false);
} else {
_graphicsWindow->handle_mouse_moved_event(inside, loc.x, loc.y, true);
}
}
- (void) rightMouseDown: (NSEvent *) event {
_graphicsWindow->handle_mouse_button_event(2, true);
}
- (void) rightMouseDragged: (NSEvent *) event {
[self mouseMoved: event];
}
- (void) rightMouseUp: (NSEvent *) event {
_graphicsWindow->handle_mouse_button_event(2, false);
}
- (void) otherMouseDown: (NSEvent *) event {
// 1 and 2 are swapped, for consistency with X11 implementation
if ([event buttonNumber] == 2) {
_graphicsWindow->handle_mouse_button_event(1, true);
} else {
_graphicsWindow->handle_mouse_button_event([event buttonNumber], true);
}
}
- (void) otherMouseDragged: (NSEvent *) event {
[self mouseMoved: event];
}
- (void) otherMouseUp: (NSEvent *) event {
// 1 and 2 are swapped, for consistency with X11 implementation
if ([event buttonNumber] == 2) {
_graphicsWindow->handle_mouse_button_event(1, false);
} else {
_graphicsWindow->handle_mouse_button_event([event buttonNumber], false);
}
}
- (void) scrollWheel: (NSEvent *) event {
_graphicsWindow->handle_wheel_event([event deltaX], [event deltaY]);
}
- (BOOL) isOpaque {
return YES;
}
@end