1 /* bzflag
2  * Copyright (c) 1993-2021 Tim Riker
3  *
4  * This package is free software;  you can redistribute it and/or
5  * modify it under the terms of the license found in the file
6  * named COPYING that should have accompanied this file.
7  *
8  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
9  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11  */
12 
13 #ifndef __BZFWINDOW_H__
14 #define __BZFWINDOW_H__
15 
16 #include "common.h"
17 
18 /* system headers */
19 #include <vector>
20 
21 
22 class BzfDisplay;
23 
24 class BzfWindowCB
25 {
26 public:
27     void        (*cb)(void*);
28     void*       data;
29 };
30 
31 /** BzfWindow:
32  *  Abstract, platform independent base for OpenGL windows.
33  */
34 class BzfWindow
35 {
36 public:
37     BzfWindow(const BzfDisplay*);
38     virtual     ~BzfWindow();
39 
getDisplay()40     const BzfDisplay*   getDisplay() const
41     {
42         return display;
43     }
44     virtual bool    isValid() const = 0;
45 
46     virtual void    showWindow(bool) = 0;
47 
48     virtual void    getPosition(int& x, int& y) = 0;
49     virtual void    getSize(int& width, int& height) const = 0;
50 
51     virtual void    setTitle(const char*) = 0;
52     virtual void    setPosition(int x, int y) = 0;
53     virtual void    setSize(int width, int height) = 0;
54     virtual void    setMinSize(int width, int height) = 0;
55     virtual void    setFullscreen(bool) = 0;
iconify(void)56     virtual void    iconify(void)
57     {
58         ;
59     };
create(void)60     virtual bool    create(void)
61     {
62         return true;
63     };
64 
65     virtual void    warpMouse(int x, int y) = 0;
66     virtual void    getMouse(int& x, int& y) const = 0;
67     virtual void    grabMouse() = 0;
68     virtual void    ungrabMouse() = 0;
enableGrabMouse(bool)69     virtual void    enableGrabMouse(bool)
70     {
71         ;
72     };
73     // TODO: Refactor our handling of confining the mouse to the window or
74     // the motionbox to be a bit cleaner.
disableConfineToMotionbox()75     virtual void    disableConfineToMotionbox()
76     {
77         ;
78     }
79     virtual void    confineToMotionbox(int x1, int y1, int x2, int y2);
80     virtual void    showMouse() = 0;
81     virtual void    hideMouse() = 0;
82 
83     virtual void    setGamma(float) = 0;
84     virtual float   getGamma() const = 0;
85     virtual bool    hasGammaControl() const = 0;
86 
hasVerticalSync()87     virtual bool    hasVerticalSync() const
88     {
89         return false;
90     }
setVerticalSync(bool)91     virtual void    setVerticalSync(bool)
92     {
93         ;
94     }
95 
96     virtual void    makeCurrent() = 0;
97     virtual void    yieldCurrent();
98     virtual void    releaseCurrent();
99     virtual void    swapBuffers() = 0;
100     virtual void    makeContext() = 0;
101     virtual void    freeContext() = 0;
102 
103     void        callExposeCallbacks() const;
104     void        addExposeCallback(void (*cb)(void*), void* data);
105     void        removeExposeCallback(void (*cb)(void*), void* data);
106 
107     void        callResizeCallbacks() const;
108     void        addResizeCallback(void (*cb)(void*), void* data);
109     void        removeResizeCallback(void (*cb)(void*), void* data);
110 
111 private:
112     const BzfDisplay*   display;
113     std::vector<BzfWindowCB>    exposeCallbacks;
114     std::vector<BzfWindowCB>    resizeCallbacks;
115 };
116 
117 
118 #endif /* __BZFWINDOW_H__ */
119 
120 // Local Variables: ***
121 // mode: C++ ***
122 // tab-width: 4 ***
123 // c-basic-offset: 4 ***
124 // indent-tabs-mode: nil ***
125 // End: ***
126 // ex: shiftwidth=4 tabstop=4
127