fix build
[gltest.git] / glwindow.h
1 #ifndef GL_WINDOW_H
2 #define GL_WINDOW_H
3
4 /* gltest - small OpenGL tearing test program
5  * Copyright (C) 2012-2013 Ralf Jung <post@ralfj.de>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  */
21
22 #include <X11/Xlib.h>
23
24 /** Abstracts the GL binding API away */
25 class GLBackend {
26 public:
27         /** Create a GL window class, but does not do anything */
28         GLBackend() {}
29         /** Fre all resources */
30         virtual ~GLBackend() {}
31         
32         /** Initialize GL backend, choose visual configuration and return the ID */
33         virtual VisualID initialize(Display *display) = 0;
34         
35         /** create a GL context for the given window */
36         virtual void createContext(Window window) = 0;
37         
38         /** Swap back and front buffers */
39         virtual void swapBuffers() const = 0;
40         
41         /** Set the swap interval */
42         virtual void setSwapInterval(int i) const = 0;
43 };
44
45 /** A window to render GL stuff in */
46 class GLWindow {
47 public:
48         GLWindow(Display *display, GLBackend *backend) //!< Create the window class, but do not open it. Taks ownership of the backend and the X connection.
49          : display(display), backend(backend), window(0) {}
50         virtual ~GLWindow();
51
52         void open(unsigned int width, unsigned int height) { if (!window) create(width, height); }
53         void close();
54         void setFullscreen(bool fullscreen);
55         bool getFullscreen(void) { return fullscreen; }
56         
57         int getWidth() { return width; }
58         int getHeight() { return height; }
59
60         void exec();
61
62 protected:
63         const GLBackend * getBackend() { return backend; }
64
65         virtual void initGL() = 0;
66         virtual void resizeGL(unsigned int width, unsigned int height) = 0;
67         virtual void renderGL() = 0;
68         virtual void handleKeyPress(KeySym key) = 0;
69          
70 private:
71         void create(unsigned int width, unsigned int height);
72
73         Display *display;
74         GLBackend *backend;
75         Window window;
76         int width, height;
77         bool fullscreen;
78 };
79
80 #endif