[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23603] trunk/blender/intern/ghost/intern: Cocoa port : first Cocoa version of GHOST_DisplayManagerCocoa

Damien Plisson damien.plisson at yahoo.fr
Fri Oct 2 09:20:34 CEST 2009


Revision: 23603
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23603
Author:   damien78
Date:     2009-10-02 09:20:33 +0200 (Fri, 02 Oct 2009)

Log Message:
-----------
Cocoa port : first Cocoa version of GHOST_DisplayManagerCocoa

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.h
    trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm

Modified: trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.h	2009-10-02 07:20:07 UTC (rev 23602)
+++ trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.h	2009-10-02 07:20:33 UTC (rev 23603)
@@ -93,19 +93,12 @@
 	 */
 	virtual GHOST_TSuccess setCurrentDisplaySetting(GHOST_TUns8 display, const GHOST_DisplaySetting& setting);
 
-protected:
-	/**
-	 * Returns a value from a dictionary.
-	 * @param	values	Dictionary to return value from.
-	 * @param	key	Key to return value for.
-	 * @return The value for this key.
-	 */
-	long getValue(CFDictionaryRef values, CFStringRef key) const;
-	
+protected:	
+	//Do not cache values as OS X supports screen hot plug
 	/** Cached number of displays. */
-	CGDisplayCount m_numDisplays;
+	//CGDisplayCount m_numDisplays;
 	/** Cached display id's for each display. */
-	CGDirectDisplayID* m_displayIDs;
+	//CGDirectDisplayID* m_displayIDs;
 };
 
 

Modified: trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm	2009-10-02 07:20:07 UTC (rev 23602)
+++ trunk/blender/intern/ghost/intern/GHOST_DisplayManagerCocoa.mm	2009-10-02 07:20:33 UTC (rev 23603)
@@ -21,23 +21,14 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s):	Maarten Gribnau	09/2001
+					Damien Plisson	10/2009
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/**
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author	Maarten Gribnau
- * @date	September 21, 2001
- */
+#include <Cocoa/Cocoa.h>
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <Carbon/Carbon.h>
-
 #include "GHOST_DisplayManagerCocoa.h"
 #include "GHOST_Debug.h"
 
@@ -46,23 +37,16 @@
 
 GHOST_DisplayManagerCocoa::GHOST_DisplayManagerCocoa(void)
 {
-	if (::CGGetActiveDisplayList(0, NULL, &m_numDisplays) != CGDisplayNoErr)
-	{
-		m_numDisplays = 0;
-		m_displayIDs = NULL;
-	}
-	if (m_numDisplays > 0)
-	{
-		m_displayIDs = new CGDirectDisplayID [m_numDisplays];
-		GHOST_ASSERT((m_displayIDs!=NULL), "GHOST_DisplayManagerCocoa::GHOST_DisplayManagerCocoa(): memory allocation failed");
-		::CGGetActiveDisplayList(m_numDisplays, m_displayIDs, &m_numDisplays);
-	}
 }
 
 
 GHOST_TSuccess GHOST_DisplayManagerCocoa::getNumDisplays(GHOST_TUns8& numDisplays) const
 {
-	numDisplays = (GHOST_TUns8) m_numDisplays;
+	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+	
+	numDisplays = (GHOST_TUns8) [[NSScreen screens] count];
+	
+	[pool drain];
 	return GHOST_kSuccess;
 }
 
@@ -71,10 +55,7 @@
 {
 	GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getNumDisplaySettings(): only main display is supported");
 	
-	CFArrayRef displayModes;
-	displayModes = ::CGDisplayAvailableModes(m_displayIDs[display]);
-	CFIndex numModes = ::CFArrayGetCount(displayModes);
-	numSettings = (GHOST_TInt32)numModes;
+	numSettings = (GHOST_TInt32)3; //Width, Height, BitsPerPixel
 	
 	return GHOST_kSuccess;
 }
@@ -82,43 +63,71 @@
 
 GHOST_TSuccess GHOST_DisplayManagerCocoa::getDisplaySetting(GHOST_TUns8 display, GHOST_TInt32 index, GHOST_DisplaySetting& setting) const
 {
+	//Note that only current display setting is available
+	NSScreen *askedDisplay;
+	
 	GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getDisplaySetting(): only main display is supported");
 	
-	CFArrayRef displayModes;
-	CGDirectDisplayID d = m_displayIDs[display];
-	displayModes = ::CGDisplayAvailableModes(d);
-	//CFIndex numModes = ::CFArrayGetCount(displayModes);/*unused*/
-	//GHOST_TInt32 numSettings = (GHOST_TInt32)numModes; /*unused*/
-	 CFDictionaryRef displayModeValues = (CFDictionaryRef)::CFArrayGetValueAtIndex(displayModes, index);
-			
-	setting.xPixels		= getValue(displayModeValues, kCGDisplayWidth);
-	setting.yPixels		= getValue(displayModeValues, kCGDisplayHeight);
-	setting.bpp			= getValue(displayModeValues, kCGDisplayBitsPerPixel);
-	setting.frequency	= getValue(displayModeValues, kCGDisplayRefreshRate);
-			
+	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+	
+	if (display == kMainDisplay) //Screen #0 may not be the main one
+		askedDisplay = [NSScreen mainScreen];
+	else
+		askedDisplay = [[NSScreen screens] objectAtIndex:display];
+	
+	if(askedDisplay == nil) {
+		[pool drain];
+		return GHOST_kFailure;
+	}
+	
+	NSRect frame = [askedDisplay visibleFrame];
+	setting.xPixels = frame.size.width;
+	setting.yPixels = frame.size.height;
+	
+	setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]);
+	
+	setting.frequency = 0; //No more CRT display...
+				
 #ifdef GHOST_DEBUG
 	printf("display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency);
 #endif // GHOST_DEBUG
 
+	[pool drain];
 	return GHOST_kSuccess;
 }
 
 
 GHOST_TSuccess GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(GHOST_TUns8 display, GHOST_DisplaySetting& setting) const
 {
+	NSScreen *askedDisplay;
+	
 	GHOST_ASSERT((display==kMainDisplay), "GHOST_DisplayManagerCocoa::getCurrentDisplaySetting(): only main display is supported");
-        
-	CFDictionaryRef displayModeValues = ::CGDisplayCurrentMode(m_displayIDs[display]);
+    
+	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];	
+
+	if (display == kMainDisplay) //Screen #0 may not be the main one
+		askedDisplay = [NSScreen mainScreen];
+	else
+		askedDisplay = [[NSScreen screens] objectAtIndex:display];
 	
-	setting.xPixels		= getValue(displayModeValues, kCGDisplayWidth);
-	setting.yPixels		= getValue(displayModeValues, kCGDisplayHeight);
-	setting.bpp			= getValue(displayModeValues, kCGDisplayBitsPerPixel);
-	setting.frequency	= getValue(displayModeValues, kCGDisplayRefreshRate);
+	if(askedDisplay == nil) {
+		[pool drain];
+		return GHOST_kFailure;
+	}
+	
+	NSRect frame = [askedDisplay visibleFrame];
+	setting.xPixels = frame.size.width;
+	setting.yPixels = frame.size.height;
+	
+	setting.bpp = NSBitsPerPixelFromDepth([askedDisplay depth]);
+	
+	setting.frequency = 0; //No more CRT display...
 
 #ifdef GHOST_DEBUG
 	printf("current display mode: width=%d, height=%d, bpp=%d, frequency=%d\n", setting.xPixels, setting.yPixels, setting.bpp, setting.frequency);
 #endif // GHOST_DEBUG
 
+	[pool drain];
 	return GHOST_kSuccess;
 }
 
@@ -135,13 +144,15 @@
 	printf("  setting.frequency=%d\n", setting.frequency);
 #endif // GHOST_DEBUG
 
-	CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate(
+	//Display configuration is no more available in 10.6
+	
+/*	CFDictionaryRef displayModeValues = ::CGDisplayBestModeForParametersAndRefreshRate(
 		m_displayIDs[display],
 		(size_t)setting.bpp,
 		(size_t)setting.xPixels,
 		(size_t)setting.yPixels,
 		(CGRefreshRate)setting.frequency,
-		NULL);
+		NULL);*/
 
 #ifdef GHOST_DEBUG
 	printf("GHOST_DisplayManagerCocoa::setCurrentDisplaySetting(): switching to:\n");
@@ -151,28 +162,7 @@
 	printf("  setting.frequency=%d\n", getValue(displayModeValues, kCGDisplayRefreshRate));
 #endif // GHOST_DEBUG
 
-	CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues);
+	//CGDisplayErr err = ::CGDisplaySwitchToMode(m_displayIDs[display], displayModeValues);
         
-	return err == CGDisplayNoErr ? GHOST_kSuccess : GHOST_kFailure;
+	return /*err == CGDisplayNoErr ? GHOST_kSuccess :*/ GHOST_kFailure;
 }
-
-
-long GHOST_DisplayManagerCocoa::getValue(CFDictionaryRef values, CFStringRef key) const
-{
-    CFNumberRef numberValue = (CFNumberRef) CFDictionaryGetValue(values, key);
-    
-    if (!numberValue)
-    {
-        return -1;
-    }
-    
-    long intValue;
-    
-    if (!CFNumberGetValue(numberValue, kCFNumberLongType, &intValue))
-    {
-        return -1;
-    }
-    
-    return intValue;
-}
-





More information about the Bf-blender-cvs mailing list