[commit][3706] JMM work on full screen mode SK-44.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[commit][3706] JMM work on full screen mode SK-44.

commits-3
 
Revision: 3706
Author:   johnmci
Date:     2016-05-06 19:54:05 -0700 (Fri, 06 May 2016)
Log Message:
-----------
JMM work on full screen mode SK-44. Issue was on a screen size change we have to wait for TheDisplay form to change before we can draw again, otherwise we show garbage, or cause a memory violation by running off the end of the squeak bitmap. There are three ways to resize, by resize the window, use of window max/min green dot, and fullscreen primitive. All have different execution paths

Modified Paths:
--------------
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.h
    branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.m

Modified: branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.h
===================================================================
--- branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.h 2016-05-07 01:29:48 UTC (rev 3705)
+++ branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.h 2016-05-07 02:54:05 UTC (rev 3706)
@@ -59,9 +59,7 @@
  CGColorSpaceRef colorspace;
  unsigned int*      colorMap32;
     BOOL clippyIsEmpty;
-    BOOL fullScreenInProgress;
  CGRect clippy;
-    void* fullScreendispBitsIndex;
 }
 @property (nonatomic,assign) NSTrackingRectTag squeakTrackingRectForCursor;
 @property (nonatomic,strong) keyBoardStrokeDetails* lastSeenKeyBoardStrokeDetails;
@@ -70,9 +68,8 @@
 @property (nonatomic,assign) int dragCount;
 @property (nonatomic,strong) NSMutableArray* dragItems;
 @property (nonatomic,weak) sqSqueakOSXScreenAndWindow *windowLogic;
-@property (nonatomic,assign) BOOL fullScreenInProgress;
-@property (nonatomic,assign) void* fullScreendispBitsIndex;
 
+
 - (void) initializeVariables;
 - (void) fakeKeyDownUp: (NSEvent*) theEvent;
 - (NSString*) dragFileNameStringAtIndex:(sqInt) index;

Modified: branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.m
===================================================================
--- branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.m 2016-05-07 01:29:48 UTC (rev 3705)
+++ branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXOpenGLView.m 2016-05-07 02:54:05 UTC (rev 3706)
@@ -62,6 +62,12 @@
  return [NSString stringWithCharacters: &character length: 1];
 }
 
+@interface sqSqueakOSXOpenGLView ()
+@property (nonatomic, assign) NSRect lastFrameSize;
+@property (nonatomic,assign) BOOL fullScreenInProgress;
+@property (nonatomic,assign) void* fullScreendispBitsIndex;
+@end
+
 @implementation sqSqueakOSXOpenGLView
 @synthesize squeakTrackingRectForCursor,lastSeenKeyBoardStrokeDetails,
 lastSeenKeyBoardModifierDetails,dragInProgress,dragCount,dragItems,windowLogic,fullScreenInProgress,fullScreendispBitsIndex;
@@ -79,12 +85,10 @@
 
 - (id)initWithFrame:(NSRect)frameRect {
     self = [self initWithFrame:frameRect pixelFormat:[[self class] defaultPixelFormat]];
-
     [self setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
     [self setAutoresizesSubviews:YES];
     
     [self initialize];
-
     return self;
 }
 
@@ -100,14 +104,23 @@
     fullScreenInProgress = NO;
  colorspace = CGColorSpaceCreateDeviceRGB();
  [self initializeSqueakColorMap];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(didEnterFullScreen:) name:@"NSWindowDidEnterFullScreenNotification" object:nil];
+
 }
 
+- (void) didEnterFullScreen: (NSNotification*) aNotification {
+    //NSLog(@"Notification didEnterFullScreen");
+    [self setupFullScreendispBitsIndex];
+    self.fullScreenInProgress = NO;
+}
+
 - (void) initializeVariables {
 }
 
 - (void) dealloc {
  free(colorMap32);
  CGColorSpaceRelease(colorspace);
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
     SUPERDEALLOC
 }
 
@@ -137,15 +150,16 @@
 }
 
 - (void) viewWillStartLiveResize {
-// [self.window setShowsResizeIndicator: YES];
+    //NSLog(@"viewWillStartLiveResize");
+    self.fullScreenInProgress = YES;
  [[NSCursor arrowCursor] set];
 }
 
 - (void) viewDidEndLiveResize {
-// [self.window setShowsResizeIndicator: NO];
+    //NSLog(@"viewDidEndLiveResize");
     dispatch_async(dispatch_get_main_queue(), ^{
         [((sqSqueakOSXApplication*) gDelegateApp.squeakApplication).squeakCursor  set];
-    });
+     });
 
 }
 
@@ -166,18 +180,8 @@
         firstDrawCompleted = YES;
         return;
     }
-    
-    if (self.fullScreenInProgress) {
-        sqInt formObj = interpreterProxy->displayObject();
-        sqInt formPtrOop = interpreterProxy->fetchPointerofObject(0, formObj);
-        void* dispBitsIndex = interpreterProxy->firstIndexableField(formPtrOop);
-        if (self.fullScreendispBitsIndex == dispBitsIndex) {
-            return;
-        }
-        self.fullScreenInProgress = NO;
-    }
-    
- if (syncNeeded) {
+
+    if (syncNeeded) {
  [self drawRect: NSRectFromCGRect(clippy)];
  syncNeeded = NO;
  clippyIsEmpty = YES;
@@ -187,6 +191,7 @@
  }
  if (!firstDrawCompleted) {
  firstDrawCompleted = YES;
+        extern sqInt getFullScreenFlag(void);
  if (getFullScreenFlag() == 0) {
  [self.window makeKeyAndOrderFront: self];
         }
@@ -196,6 +201,7 @@
 -(void)setupOpenGL {
 // CGL_MACRO_DECLARE_VARIABLES();
 // Enable the multithreading
+    //NSLog(@"setupOpenGL runs");
  CGLContextObj ctx = [[self openGLContext] CGLContextObj];
  CGLEnable( ctx, kCGLCEMPEngine);
 
@@ -237,8 +243,22 @@
 // CGL_MACRO_DECLARE_VARIABLES();
  static void *previousLastBitsIndex=null;
     
- NSRect r=[self frame];
- if (!(previousLastBitsIndex == lastBitsIndex)) {
+    NSRect r = self.frame;
+    
+    if (!NSEqualRects(_lastFrameSize,r)) {
+        //NSLog(@"old %f %f %f %f new %f %f %f %f",_lastFrameSize.origin.x,_lastFrameSize.origin.y,_lastFrameSize.size.width,_lastFrameSize.size.height,self.frame.origin.x,r.origin.y,r.size.width,r.size.height);
+        _lastFrameSize = r;
+        glPixelStorei( GL_UNPACK_ROW_LENGTH, r.size.width );
+        glMatrixMode(GL_PROJECTION);
+        glLoadIdentity();
+        
+        glMatrixMode(GL_MODELVIEW);
+        glLoadIdentity();
+        [[self openGLContext] update];
+    }
+
+    if (!(previousLastBitsIndex == lastBitsIndex)) {
+        //NSLog(@"previousLastBitsIndex %#010x changed to %#010x",previousLastBitsIndex,lastBitsIndex);
  previousLastBitsIndex = lastBitsIndex;
  glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_ARB, r.size.width*r.size.height*4,lastBitsIndex);
  }
@@ -246,7 +266,7 @@
  glViewport( subRect.origin.x,subRect.origin.y, subRect.size.width,subRect.size.height );
  char *subimg = ((char*)lastBitsIndex) + (unsigned int)(subRect.origin.x + (r.size.height-subRect.origin.y-subRect.size.height)*r.size.width)*4;
  glTexImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, subRect.size.width, subRect.size.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, subimg );
- // NSLog(@" draw %f %f %f %f",subRect.origin.x,subRect.origin.y,subRect.size.width,subRect.size.height);
+ //NSLog(@" glTexImage2D %f %f %f %f",subRect.origin.x,subRect.origin.y,subRect.size.width,subRect.size.height);
 }
 
 -(void)defineQuad:(NSRect)r
@@ -261,78 +281,37 @@
  glEnd();
 }
 
-- (void)update  // moved or resized
-{
- NSRect rect;
- NSOpenGLContext *oldContext = [NSOpenGLContext currentContext];
-    
- [super update];
-
- [[self openGLContext] makeCurrentContext];
-// CGL_MACRO_DECLARE_VARIABLES();
- [[self openGLContext] update];
-
- rect = [self bounds];
-
-    glViewport(0, 0, rect.size.width, rect.size.height);
- glPixelStorei( GL_UNPACK_ROW_LENGTH, rect.size.width );
-
- glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-
- glMatrixMode(GL_MODELVIEW);
-    glLoadIdentity();
-
- [self setNeedsDisplay:true];
-
-    if (oldContext != nil) {
-        [oldContext makeCurrentContext];
-    }
+- (void) setupFullScreendispBitsIndex {
+    sqInt formObj = interpreterProxy->displayObject();
+    sqInt formPtrOop = interpreterProxy->fetchPointerofObject(0, formObj);
+    self.fullScreendispBitsIndex = interpreterProxy->firstIndexableField(formPtrOop);
 }
 
-- (void)reshape // scrolled, moved or resized
+-(void)drawRect:(NSRect)rect
 {
+    if (self.fullScreenInProgress) {
+        sqInt formObj = interpreterProxy->displayObject();
+        sqInt formPtrOop = interpreterProxy->fetchPointerofObject(0, formObj);
+        void* dispBitsIndex = interpreterProxy->firstIndexableField(formPtrOop);
+        if (self.fullScreendispBitsIndex == dispBitsIndex) {
+            [self clearScreen];
+            //NSLog(@"drawRect but fullScreenInProgress %f %f %f %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
+            return;
+        }
+        self.fullScreenInProgress = NO;
+    }
+    
+ //NSLog(@" draw %f %f %f %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
  NSOpenGLContext *oldContext = [NSOpenGLContext currentContext];
- NSRect rect;
 
- [super reshape];
-
- [[self openGLContext] makeCurrentContext];
-// CGL_MACRO_DECLARE_VARIABLES();
- [[self openGLContext] update];
-
- rect = [self bounds];
-
- glViewport(0, 0, rect.size.width, rect.size.height);
- glPixelStorei( GL_UNPACK_ROW_LENGTH, rect.size.width );
- glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-
- glMatrixMode(GL_MODELVIEW);
-    glLoadIdentity();
-
- [self setNeedsDisplay:true];
+    [self setupFullScreendispBitsIndex];
     
-    if (oldContext != nil) {
-        [oldContext makeCurrentContext];
-    }
-}
-
--(void)drawRect:(NSRect)rect
-{
-// NSLog(@" draw %f %f %f %f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
- NSOpenGLContext *oldContext = [NSOpenGLContext currentContext];
- sqInt formObj = interpreterProxy->displayObject();
- sqInt formPtrOop = interpreterProxy->fetchPointerofObject(0, formObj);
-    self.fullScreendispBitsIndex = interpreterProxy->firstIndexableField(formPtrOop);
-    
-    static int inited=NO;
     if ( fullScreendispBitsIndex ) {
  [[self openGLContext] makeCurrentContext];
- if (!inited) {
- [self setupOpenGL];
- inited=YES;
- }
+        static dispatch_once_t once;
+        dispatch_once(&once, ^{
+            [self setupOpenGL];
+        });
  [self loadTexturesFrom:fullScreendispBitsIndex subRectangle: rect];
  [self defineQuad:rect];
     }
@@ -727,6 +706,17 @@
  return YES;
 }
 
+- (void) clearScreen {
+    NSOpenGLContext *oldContext = [NSOpenGLContext currentContext];
+    [self.openGLContext makeCurrentContext];
+    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+    glFlush();
+    if (oldContext != nil) {
+        [oldContext makeCurrentContext];
+    }
+
+}
+
 - (void)  ioSetFullScreen: (sqInt) fullScreen {
 
  if ([self isInFullScreenMode] == YES && (fullScreen == 1))