Blender  V2.59
GHOST_DisplayManagerCocoa.mm
Go to the documentation of this file.
00001 
00030 #include <Cocoa/Cocoa.h>
00031 
00032 #include "GHOST_DisplayManagerCocoa.h"
00033 #include "GHOST_Debug.h"
00034 
00035 // We do not support multiple monitors at the moment
00036 
00037 
00038 GHOST_DisplayManagerCocoa::GHOST_DisplayManagerCocoa(void)
00039 {
00040 }
00041 
00042 
00043 GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplays(GHOST_TUns8& numDisplays) const
00044 {
00045         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
00046         
00047         numDisplays = (GHOST_TUns8) [[NSScreen screens] count];
00048         
00049         [pool drain];
00050         return GHOST_kSuccess;
00051 }
00052 
00053 
00054 GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplaySettings(GHOST_TUns8 display, GHOST_TInt32& numSettings) const
00055 {
00056         GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getNumDisplaySettings(): only main display is supported");
00057         
00058         numSettings = (GHOST_TInt32)3; //Width, Height, BitsPerPixel
00059         
00060         return GHOST_kSuccess;
00061 }
00062 
00063 
00064 GHOST_TSuccess GHOST_DisplayManagerCocoa::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const
00065 {
00066         //Note that only current display setting is available
00067         NSScreen *askedDisplay;
00068         
00069         GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getDisplaySetting(): only main display is supported");
00070         
00071         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
00072         
00073         if (display == kMainDisplay) //Screen #0 may not be the main one
00074                 askedDisplay = [NSScreen mainScreen];
00075         else
00076                 askedDisplay = [[NSScreen screens] objectAtIndex:display];
00077         
00078         if(askedDisplay == nil) {
00079                 [pool drain];
00080                 return GHOST_kFailure;
00081         }
00082         
00083         NSRect frame = [askedDisplay visibleFrame];
00084         setting.xPixels = frame.size.width;
00085         setting.yPixels = frame.size.height;
00086         
00087         setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]);
00088         
00089         setting.frequency = 0; //No more CRT display...
00090                                 
00091 #ifdef GHOST_DEBUG
00092         printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency);
00093 #endif // GHOST_DEBUG
00094 
00095         [pool drain];
00096         return GHOST_kSuccess;
00097 }
00098 
00099 
00100 GHOST_TSuccess GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const
00101 {
00102         NSScreen *askedDisplay;
00103         
00104         GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(): only main display is supported");
00105     
00106         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];     
00107 
00108         if (display == kMainDisplay) //Screen #0 may not be the main one
00109                 askedDisplay = [NSScreen mainScreen];
00110         else
00111                 askedDisplay = [[NSScreen screens] objectAtIndex:display];
00112         
00113         if(askedDisplay == nil) {
00114                 [pool drain];
00115                 return GHOST_kFailure;
00116         }
00117         
00118         NSRect frame = [askedDisplay visibleFrame];
00119         setting.xPixels = frame.size.width;
00120         setting.yPixels = frame.size.height;
00121         
00122         setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]);
00123         
00124         setting.frequency = 0; //No more CRT display...
00125 
00126 #ifdef GHOST_DEBUG
00127         printf("current display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency);
00128 #endif // GHOST_DEBUG
00129 
00130         [pool drain];
00131         return GHOST_kSuccess;
00132 }
00133 
00134 
00135 GHOST_TSuccess GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting)
00136 {
00137         GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): only main display is supported");
00138 
00139 #ifdef GHOST_DEBUG
00140         printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): requested settings:\n");
00141         printf("  setting.xPixels=%d\n", setting.xPixels);
00142         printf("  setting.yPixels=%d\n", setting.yPixels);
00143         printf("  setting.bpp=%d\n", setting.bpp);
00144         printf("  setting.frequency=%d\n", setting.frequency);
00145 #endif // GHOST_DEBUG
00146 
00147         //Display configuration is no more available in 10.6
00148         
00149 /*      CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate(
00150                 m_displayIDs[display],
00151                 (size_t)setting.bpp,
00152                 (size_t)setting.xPixels,
00153                 (size_t)setting.yPixels,
00154                 (CGRefreshRate)setting.frequency,
00155                 NULL);*/
00156 
00157 #ifdef GHOST_DEBUG
00158 /*      printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): switching to:\n");
00159         printf("  setting.xPixels=%d\n", getValue(displayModeValues, kCGDisplayWidth));
00160         printf("  setting.yPixels=%d\n", getValue(displayModeValues, kCGDisplayHeight));
00161         printf("  setting.bpp=%d\n", getValue(displayModeValues, kCGDisplayBitsPerPixel));
00162         printf("  setting.frequency=%d\n", getValue(displayModeValues, kCGDisplayRefreshRate)); */
00163 #endif // GHOST_DEBUG
00164 
00165         //CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues);
00166         
00167         return /*err == CGDisplayNoErr ?*/ GHOST_kSuccess /*: GHOST_kFailure*/;
00168 }