#ifndef X11_OPENGL_WINDOW_H
#define X11_OPENGL_WINDOW_H

#define b3gDefaultOpenGLWindow X11OpenGLWindow

#include "CommonWindowInterface.h"

class X11OpenGLWindow : public CommonWindowInterface
{

	struct InternalData2*   m_data;
        bool m_OpenGLInitialized;
	bool m_requestedExit;

protected:

        void enableOpenGL();

        void disableOpenGL();

        void pumpMessage();

        int getAsciiCodeFromVirtualKeycode(int orgCode);

public:

        X11OpenGLWindow();

        virtual ~X11OpenGLWindow();

        virtual void    createWindow(const b3gWindowConstructionInfo& ci);

        virtual void    closeWindow();

        virtual void    startRendering();

        virtual void    renderAllObjects();

        virtual void    endRendering();

        virtual float getRetinaScale() const {return 1.f;}
	virtual void setAllowRetina(bool /*allowRetina*/) {};

	virtual void    runMainLoop();
        virtual float   getTimeInSeconds();

        virtual bool    requestedExit() const;
        virtual void    setRequestExit() ;

	virtual bool isModifierKeyPressed(int key);

        virtual void setMouseMoveCallback(b3MouseMoveCallback   mouseCallback);
        virtual void setMouseButtonCallback(b3MouseButtonCallback       mouseCallback);
        virtual void setResizeCallback(b3ResizeCallback resizeCallback);
        virtual void setWheelCallback(b3WheelCallback wheelCallback);
        virtual void setKeyboardCallback( b3KeyboardCallback    keyboardCallback);

		virtual b3MouseMoveCallback getMouseMoveCallback();
		virtual b3MouseButtonCallback getMouseButtonCallback();
		virtual b3ResizeCallback getResizeCallback();
		virtual b3WheelCallback getWheelCallback();
		virtual b3KeyboardCallback      getKeyboardCallback();

        virtual void setRenderCallback( b3RenderCallback renderCallback);

        virtual void setWindowTitle(const char* title);

        virtual int   getWidth() const;

        virtual int   getHeight() const;

	int fileOpenDialog(char* filename, int maxNameLength);
};



#endif

