Files
OpenSceneGraph/src/osgViewer/DarwinUtils.h

173 lines
5.1 KiB
Objective-C

/*
* DarwinUtils.h
* OpenSceneGraph
*
* Created by Stephan Huber on 27.06.08.
* Copyright 2008 Stephan Maximilian Huber, digital mind. All rights reserved.
*
*/
#ifdef __APPLE__
#ifndef DARWIN_UTILS_HEADER_
#define DARWIN_UTILS_HEADER_
#include <osg/DeleteHandler>
#include <osg/GraphicsContext>
#include <osgViewer/GraphicsWindow>
#include <Carbon/Carbon.h>
//#define USE_DARWIN_COCOA_IMPLEMENTATION 1
//#define USE_DARWIN_CARBON_IMPLEMENTATION 1
#ifdef __OBJC__
@class MenubarToggler;
#else
class MenubarToggler;
#endif
namespace osgDarwin {
/** the MenubarController class checks all open windows if they intersect with the menubar / dock and hide the menubar/dock if necessary */
class MenubarController : public osg::Referenced
{
public:
class WindowAdapter : public osg::Referenced {
public:
WindowAdapter() : osg::Referenced() {}
virtual bool valid() = 0;
virtual void getWindowBounds(CGRect& rect) = 0;
virtual osgViewer::GraphicsWindow* getWindow() = 0;
protected:
virtual ~WindowAdapter() {}
};
MenubarController();
static MenubarController* instance();
void attachWindow(WindowAdapter* win);
void update();
void detachWindow(osgViewer::GraphicsWindow* win);
void setDisplaySettings(osg::DisplaySettings* display_settings);
protected:
~MenubarController();
private:
typedef std::list< osg::ref_ptr< WindowAdapter > > WindowList;
WindowList _list;
bool _menubarShown;
CGRect _availRect;
CGRect _mainScreenBounds;
OpenThreads::Mutex _mutex;
MenubarToggler* _toggler;
};
struct DarwinWindowingSystemInterface : public osg::GraphicsContext::WindowingSystemInterface
{
public:
DarwinWindowingSystemInterface();
/** dtor */
~DarwinWindowingSystemInterface();
/** @return a CGDirectDisplayID for a ScreenIdentifier */
CGDirectDisplayID getDisplayID(const osg::GraphicsContext::ScreenIdentifier& si);
/** @return count of attached screens */
virtual unsigned int getNumScreens(const osg::GraphicsContext::ScreenIdentifier& si) ;
virtual void getScreenSettings(const osg::GraphicsContext::ScreenIdentifier& si, osg::GraphicsContext::ScreenSettings & resolution);
virtual void enumerateScreenSettings(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, osg::GraphicsContext::ScreenSettingsList & resolutionList);
virtual bool setScreenSettings (const osg::GraphicsContext::ScreenIdentifier & si, const osg::GraphicsContext::ScreenSettings & settings);
/** return the top left coord of a specific screen in global screen space */
void getScreenTopLeft(const osg::GraphicsContext::ScreenIdentifier& si, int& x, int& y);
/** returns screen-ndx containing rect x,y,w,h */
unsigned int getScreenContaining(int x, int y, int w, int h);
virtual void setDisplaySettings(osg::DisplaySettings* display_settings) {
MenubarController::instance()->setDisplaySettings(display_settings);
}
protected:
virtual void _init();
/** implementation of setScreenResolution */
bool setScreenResolutionImpl(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, unsigned int width, unsigned int height) ;
/** implementation of setScreenRefreshRate */
bool setScreenRefreshRateImpl(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, double refreshRate);
template<class PixelBufferImplementation, class GraphicsWindowImplementation>
osg::GraphicsContext* createGraphicsContextImplementation(osg::GraphicsContext::Traits* traits)
{
if (traits->pbuffer)
{
osg::ref_ptr<PixelBufferImplementation> pbuffer = new PixelBufferImplementation(traits);
if (pbuffer->valid()) return pbuffer.release();
else return 0;
}
else
{
osg::ref_ptr<GraphicsWindowImplementation> window = new GraphicsWindowImplementation(traits);
if (window->valid()) return window.release();
else return 0;
}
}
protected:
bool _initialized;
CGDisplayCount _displayCount;
CGDirectDisplayID* _displayIds;
};
template <class WSI>
struct RegisterWindowingSystemInterfaceProxy
{
RegisterWindowingSystemInterfaceProxy()
{
osg::GraphicsContext::setWindowingSystemInterface(new WSI);
}
~RegisterWindowingSystemInterfaceProxy()
{
if (osg::Referenced::getDeleteHandler())
{
osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0);
osg::Referenced::getDeleteHandler()->flushAll();
}
osg::GraphicsContext::setWindowingSystemInterface(0);
}
};
}
#endif
#endif // __APPLE__