23 bool GLViewIsValidDrawable(ROOTOpenGLView *glView)
25 assert(glView != nil &&
"GLViewIsValid, glView parameter is nil");
27 if ([glView isHiddenOrHasHiddenAncestor]) {
33 const NSRect visibleRect = [glView visibleRect];
34 if (visibleRect.size.width < 1. || visibleRect.size.height < 1.) {
46 @implementation ROOTOpenGLView
48 @synthesize fOpenGLContext;
49 @synthesize fUpdateContext;
52 - (id) initWithFrame : (NSRect) frameRect pixelFormat : (NSOpenGLPixelFormat *) format
54 if (
self = [super initWithFrame : frameRect windowAttributes : 0]) {
55 [
self setHidden : YES];
57 fPixelFormat = [format retain];
59 if ([[NSScreen mainScreen] backingScaleFactor] > 1.)
60 [
self setWantsBestResolutionOpenGLSurface : YES];
69 if (fOpenGLContext && [fOpenGLContext view] ==
self)
70 [fOpenGLContext clearDrawable];
72 self.fOpenGLContext = nil;
73 [fPixelFormat release];
79 - (NSOpenGLPixelFormat *) pixelFormat
85 - (void) setPixelFormat : (NSOpenGLPixelFormat *) pixelFormat
87 if (fPixelFormat != pixelFormat) {
88 [fPixelFormat release];
89 fPixelFormat = [pixelFormat retain];
96 - (BOOL) fIsOpenGLWidget
102 - (QuartzPixmap *) fBackBuffer
109 - (void) setFBackBuffer : (QuartzPixmap *) notUsed
112 #pragma unused(notUsed)
118 [
self setHidden : NO];
122 - (void) mapSubwindows
125 assert([[
self subviews] count] == 0 &&
"mapSubwindows, GL-view has children");
129 - (void) configureNotifyTree
132 if (
self.fMapState == kIsViewable) {
133 if (
self.fEventMask & kStructureNotifyMask) {
134 assert(dynamic_cast<TGCocoa *>(gVirtualX) &&
135 "configureNotifyTree, gVirtualX is either null or has type different from TGCocoa");
136 TGCocoa *
const vx =
static_cast<TGCocoa *
>(gVirtualX);
137 vx->GetEventTranslator()->GenerateConfigureNotifyEvent(
self,
self.frame);
143 - (BOOL) fIsOverlapped
145 return fIsOverlapped;
149 - (void) setOverlapped : (BOOL) overlap
155 fIsOverlapped = overlap;
156 [
self setHidden : fIsOverlapped];
159 assert(dynamic_cast<TGCocoa *>(gVirtualX) != 0 &&
160 "setFrameSize:, gVirtualX is either null or has a type, different from TGCocoa");
161 [fOpenGLContext update];
164 TGCocoa *
const vx =
static_cast<TGCocoa *
>(gVirtualX);
165 vx->GetEventTranslator()->GenerateConfigureNotifyEvent(
self,
self.frame);
166 vx->GetEventTranslator()->GenerateExposeEvent(
self,
self.frame);
177 - (void) setFrame : (NSRect) newFrame
182 if (NSEqualRects(newFrame,
self.frame))
185 [
super setFrame : newFrame];
189 - (void) setFrameSize : (NSSize) newSize
193 [
super setFrameSize : newSize];
195 if (![
self isHiddenOrHasHiddenAncestor] && !fIsOverlapped)
196 [fOpenGLContext update];
198 fUpdateContext = YES;
200 if ((
self.fEventMask & kStructureNotifyMask) && (
self.fMapState == kIsViewable || fIsOverlapped == YES)) {
201 assert(dynamic_cast<TGCocoa *>(gVirtualX) != 0 &&
202 "setFrameSize:, gVirtualX is either null or has a type, different from TGCocoa");
203 TGCocoa *
const vx =
static_cast<TGCocoa *
>(gVirtualX);
204 vx->GetEventTranslator()->GenerateConfigureNotifyEvent(
self,
self.frame);
205 vx->GetEventTranslator()->GenerateExposeEvent(
self,
self.frame);
210 - (void) drawRect : (NSRect) dirtyRect
212 #pragma unused(dirtyRect)
224 - (void) setLayer:(CALayer *) layer
226 #pragma unused(layer)