root/OpenSceneGraph/trunk/src/osgViewer/DarwinUtils.h @ 9879

Revision 9879, 4.1 kB (checked in by robert, 6 years ago)

From Stephan Huber, support for Cocoa windowing under OSX.

  • Property svn:executable set to *
RevLine 
[9879]1/*
2 *  DarwinUtils.h
3 *  OpenSceneGraph
4 *
5 *  Created by Stephan Huber on 27.06.08.
6 *  Copyright 2008 Stephan Maximilian Huber, digital mind. All rights reserved.
7 *
8 */
9
10#ifdef __APPLE__
11 
12#ifndef DARWIN_UTILS_HEADER_
13#define DARWIN_UTILS_HEADER_
14
15#include <osg/DeleteHandler>
16#include <osg/GraphicsContext>
17#include <osgViewer/GraphicsWindow>
18#include <Carbon/Carbon.h>
19
20
21//#define USE_DARWIN_COCOA_IMPLEMENTATION 1
22//#define USE_DARWIN_CARBON_IMPLEMENTATION 1
23
24namespace osgDarwin {
25
26
27/** the MenubarController class checks all open windows if they intersect with the menubar / dock and hide the menubar/dock if necessary */
28class MenubarController : public osg::Referenced
29{
30
31    public:
32                class WindowAdapter : public osg::Referenced {
33                       
34                        public:
35                                WindowAdapter() : osg::Referenced() {}
36                               
37                                virtual bool valid() = 0;
38                                virtual void getWindowBounds(CGRect& rect) = 0;
39                                virtual osgViewer::GraphicsWindow* getWindow() = 0;
40                               
41                        protected:
42                                virtual ~WindowAdapter() {}
43                };
44               
45        MenubarController();       
46        static MenubarController* instance();
47       
48        void attachWindow(WindowAdapter* win);
49        void update();
50        void detachWindow(osgViewer::GraphicsWindow* win);
51       
52    private:
53        typedef std::list< osg::ref_ptr< WindowAdapter > > WindowList;
54        WindowList                              _list;
55        bool                                    _menubarShown;
56        CGRect                                  _availRect;
57        CGRect                                  _mainScreenBounds;
58        OpenThreads::Mutex              _mutex;
59       
60};
61
62
63
64struct DarwinWindowingSystemInterface : public osg::GraphicsContext::WindowingSystemInterface
65{
66    public:
67                DarwinWindowingSystemInterface();
68               
69                /** dtor */
70                ~DarwinWindowingSystemInterface();
71               
72        /** @return a CGDirectDisplayID for a ScreenIdentifier */
73        CGDirectDisplayID getDisplayID(const osg::GraphicsContext::ScreenIdentifier& si);
74       
75        /** @return count of attached screens */
76        virtual unsigned int getNumScreens(const osg::GraphicsContext::ScreenIdentifier& si) ;
77       
78        virtual void getScreenSettings(const osg::GraphicsContext::ScreenIdentifier& si, osg::GraphicsContext::ScreenSettings & resolution);
79
80        virtual void enumerateScreenSettings(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, osg::GraphicsContext::ScreenSettingsList & resolutionList);
81
82        /** return the top left coord of a specific screen in global screen space */
83        void getScreenTopLeft(const osg::GraphicsContext::ScreenIdentifier& si, int& x, int& y);
84       
85        /** implementation of setScreenResolution */
86        virtual bool setScreenResolution(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, unsigned int width, unsigned int height) ;
87
88        /** implementation of setScreenRefreshRate */
89        virtual bool setScreenRefreshRate(const osg::GraphicsContext::ScreenIdentifier& screenIdentifier, double refreshRate);
90       
91       
92        /** returns screen-ndx containing rect x,y,w,h */
93        unsigned int getScreenContaining(int x, int y, int w, int h);
94       
95        protected:
96       
97                template<class PixelBufferImplementation, class GraphicsWindowImplementation>
98                osg::GraphicsContext* createGraphicsContextImplementation(osg::GraphicsContext::Traits* traits)
99                {
100                        if (traits->pbuffer)
101                        {
102                                osg::ref_ptr<PixelBufferImplementation> pbuffer = new PixelBufferImplementation(traits);
103                                if (pbuffer->valid()) return pbuffer.release();
104                                else return 0;
105                        }
106                        else
107                        {
108                                osg::ref_ptr<GraphicsWindowImplementation> window = new GraphicsWindowImplementation(traits);
109                                if (window->valid()) return window.release();
110                                else return 0;
111                        }
112                }
113       
114   
115        private:
116        CGDisplayCount        _displayCount;
117        CGDirectDisplayID*    _displayIds;
118
119
120};
121
122template <class WSI>
123struct RegisterWindowingSystemInterfaceProxy
124{
125    RegisterWindowingSystemInterfaceProxy()
126    {
127        osg::GraphicsContext::setWindowingSystemInterface(new WSI);
128    }
129
130    ~RegisterWindowingSystemInterfaceProxy()
131    {
132        if (osg::Referenced::getDeleteHandler())
133        {
134            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0);
135            osg::Referenced::getDeleteHandler()->flushAll();
136        }
137
138        osg::GraphicsContext::setWindowingSystemInterface(0);
139    }
140};
141
142
143
144}
145
146#endif
147
148#endif // __APPLE__
Note: See TracBrowser for help on using the browser.