src/video/quartz/SDL_QuartzVideo.m
changeset 683 5d2f027b3349
parent 674 be597a247e20
child 761 c5b2b6d2d1fe
equal deleted inserted replaced
682:8b2b97e466bc 683:5d2f027b3349
   394         
   394         
   395         /* Restore original screen resolution/bpp */
   395         /* Restore original screen resolution/bpp */
   396         CGDisplaySwitchToMode (display_id, save_mode);
   396         CGDisplaySwitchToMode (display_id, save_mode);
   397         CGReleaseAllDisplays ();
   397         CGReleaseAllDisplays ();
   398         ShowMenuBar ();
   398         ShowMenuBar ();
   399 
       
   400         /* 
   399         /* 
   401             Reset the main screen's rectangle
   400             Reset the main screen's rectangle
   402             See comment in QZ_SetVideoFullscreen for why we do this
   401             See comment in QZ_SetVideoFullscreen for why we do this
   403         */
   402         */
   404         screen_rect = NSMakeRect(0,0,device_width,device_height);
   403         screen_rect = NSMakeRect(0,0,device_width,device_height);
   578 
   577 
   579 static SDL_Surface* QZ_SetVideoWindowed (_THIS, SDL_Surface *current, int width,
   578 static SDL_Surface* QZ_SetVideoWindowed (_THIS, SDL_Surface *current, int width,
   580                                          int height, int bpp, Uint32 flags) {
   579                                          int height, int bpp, Uint32 flags) {
   581     unsigned int style;
   580     unsigned int style;
   582     NSRect contentRect;
   581     NSRect contentRect;
       
   582     BOOL isCustom = NO;
   583     int center_window = 1;
   583     int center_window = 1;
   584     int origin_x, origin_y;
   584     int origin_x, origin_y;
   585 
   585 
   586     current->flags = 0;
   586     current->flags = 0;
   587     current->w = width;
   587     current->w = width;
   600         if ( (mode_flags & SDL_FULLSCREEN) ||
   600         if ( (mode_flags & SDL_FULLSCREEN) ||
   601              ((mode_flags ^ flags) & (SDL_NOFRAME|SDL_RESIZABLE)) ||
   601              ((mode_flags ^ flags) & (SDL_NOFRAME|SDL_RESIZABLE)) ||
   602              (mode_flags & SDL_OPENGL) || 
   602              (mode_flags & SDL_OPENGL) || 
   603              (flags & SDL_OPENGL) )
   603              (flags & SDL_OPENGL) )
   604             QZ_UnsetVideoMode (this);
   604             QZ_UnsetVideoMode (this);
   605         
   605     
       
   606     /* Check for user-specified window and view */
       
   607     {
       
   608         char *windowPtrString = getenv ("SDL_NSWindowPointer");
       
   609         char *viewPtrString = getenv ("SDL_NSQuickDrawViewPointer");
       
   610     
       
   611         if (windowPtrString && viewPtrString) {
       
   612             
       
   613             /* Release any previous window */
       
   614             if ( qz_window ) {
       
   615                 [ qz_window release ];
       
   616                 qz_window = nil;
       
   617             }
       
   618             
       
   619             qz_window = (NSWindow*)atoi(windowPtrString);
       
   620             window_view = (NSQuickDrawView*)atoi(viewPtrString);
       
   621             isCustom = YES;
       
   622             
       
   623             /* 
       
   624                 Retain reference to window because we
       
   625                 might release it in QZ_UnsetVideoMode
       
   626             */
       
   627             [ qz_window retain ];
       
   628             
       
   629             style = [ qz_window styleMask ];
       
   630             /* Check resizability */
       
   631             if ( style & NSResizableWindowMask )
       
   632                 current->flags |= SDL_RESIZABLE;
       
   633             
       
   634             /* Check frame */
       
   635             if ( style & NSBorderlessWindowMask )
       
   636                 current->flags |= SDL_NOFRAME;
       
   637         }
       
   638     }
       
   639     
   606     /* Check if we should recreate the window */
   640     /* Check if we should recreate the window */
   607     if (qz_window == nil) {
   641     if (qz_window == nil) {
   608     
   642     
   609         /* Set the window style based on input flags */
   643         /* Set the window style based on input flags */
   610         if ( flags & SDL_NOFRAME ) {
   644         if ( flags & SDL_NOFRAME ) {
   648             [ [ [ SDL_QuartzWindowDelegate alloc ] init ] autorelease ] ];
   682             [ [ [ SDL_QuartzWindowDelegate alloc ] init ] autorelease ] ];
   649     }
   683     }
   650     /* We already have a window, just change its size */
   684     /* We already have a window, just change its size */
   651     else {
   685     else {
   652     
   686     
   653         [ qz_window setContentSize:contentRect.size ];
   687         if (!isCustom) {
   654         current->flags |= (SDL_NOFRAME|SDL_RESIZABLE) & mode_flags;
   688             [ qz_window setContentSize:contentRect.size ];
       
   689             current->flags |= (SDL_NOFRAME|SDL_RESIZABLE) & mode_flags;
       
   690         }
   655     }
   691     }
   656 
   692 
   657     /* For OpenGL, we bind the context to a subview */
   693     /* For OpenGL, we bind the context to a subview */
   658     if ( flags & SDL_OPENGL ) {
   694     if ( flags & SDL_OPENGL ) {
   659 
   695 
   690 
   726 
   691         current->flags |= SDL_SWSURFACE;
   727         current->flags |= SDL_SWSURFACE;
   692         current->flags |= SDL_PREALLOC;
   728         current->flags |= SDL_PREALLOC;
   693         current->flags |= SDL_ASYNCBLIT;
   729         current->flags |= SDL_ASYNCBLIT;
   694         
   730         
   695         /* Offset below the title bar to fill the full content region */
   731         /* 
   696         current->pixels += ((int)([ qz_window frame ].size.height) - height) * current->pitch;
   732             current->pixels now points to the window's pixels
   697 
   733             We want it to point to the *view's* pixels 
       
   734         */
       
   735         { 
       
   736             int vOffset = [ qz_window frame ].size.height - 
       
   737                 [ window_view frame ].size.height - [ window_view frame ].origin.y;
       
   738             
       
   739             int hOffset = [ window_view frame ].origin.x;
       
   740                     
       
   741             current->pixels += (vOffset * current->pitch) + hOffset * (device_bpp/8);
       
   742         }
   698         this->UpdateRects     = QZ_UpdateRects;
   743         this->UpdateRects     = QZ_UpdateRects;
   699         this->LockHWSurface   = QZ_LockWindow;
   744         this->LockHWSurface   = QZ_LockWindow;
   700         this->UnlockHWSurface = QZ_UnlockWindow;
   745         this->UnlockHWSurface = QZ_UnlockWindow;
   701     }
   746     }
   702 
   747