root/OpenSceneGraph/branches/osg-cocoa-dev/src/osgViewer/DarwinUtils.h @ 9845

Revision 9845, 4.0 kB (checked in by shuber, 5 years ago)

* added support for tablet events in GraphicsWindowCocoa?
* fixed a bug in CMake and XCode project

  • Property svn:executable set to *
Line 
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        protected:
92       
93                template<class PixelBufferImplementation, class GraphicsWindowImplementation>
94                osg::GraphicsContext* createGraphicsContextImplementation(osg::GraphicsContext::Traits* traits)
95                {
96                        if (traits->pbuffer)
97                        {
98                                osg::ref_ptr<PixelBufferImplementation> pbuffer = new PixelBufferImplementation(traits);
99                                if (pbuffer->valid()) return pbuffer.release();
100                                else return 0;
101                        }
102                        else
103                        {
104                                osg::ref_ptr<GraphicsWindowImplementation> window = new GraphicsWindowImplementation(traits);
105                                if (window->valid()) return window.release();
106                                else return 0;
107                        }
108                }
109       
110   
111        private:
112        CGDisplayCount        _displayCount;
113        CGDirectDisplayID*    _displayIds;
114
115
116};
117
118template <class WSI>
119struct RegisterWindowingSystemInterfaceProxy
120{
121    RegisterWindowingSystemInterfaceProxy()
122    {
123        osg::GraphicsContext::setWindowingSystemInterface(new WSI);
124    }
125
126    ~RegisterWindowingSystemInterfaceProxy()
127    {
128        if (osg::Referenced::getDeleteHandler())
129        {
130            osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0);
131            osg::Referenced::getDeleteHandler()->flushAll();
132        }
133
134        osg::GraphicsContext::setWindowingSystemInterface(0);
135    }
136};
137
138
139
140}
141
142#endif
143
144#endif // __APPLE__
Note: See TracBrowser for help on using the browser.