00001
00002 #ifndef __RE_Window_h__
00003 #define __RE_Window_h__
00004
00005 #include "RE_API.h"
00006 #include <UT/UT_Defines.h>
00007 #include <UT/UT_PtrArray.h>
00008 #include <UT/UT_Lock.h>
00009 #include "RE_Types.h"
00010
00011 class RE_Visual;
00012 class RE_Server;
00013 class RE_Render;
00014
00015 typedef struct {
00016 unsigned int doOffScreen:1,
00017 isOriginReadjusted:1,
00018 alwaysOnTop:1,
00019 maximized:1,
00020 fullscreen:1;
00021 } RE_WindowFlags;
00022
00023 class RE_API RE_Window
00024 {
00025 public:
00026 RE_Window(RE_Server *server,
00027 RE_WindowType type,
00028 RE_VisualType visType = RE_NORMAL_VIS,
00029 RE_WindowVisibility doOffScreen = RE_WINDOW_VISIBLE,
00030 bool alwaysOnTop = false);
00031
00032 virtual ~RE_Window();
00033
00034 virtual void setName(const char *name) = 0;
00035 virtual void setIconName(const char *name) = 0;
00036
00037 void setParentWindow(RE_Window *parent);
00038 virtual void reparentWindow( RE_Window *newParent ) = 0;
00039 const RE_Window *getParentWindow() const { return parentWindow; }
00040
00041 virtual void setParentOfTransient(RE_IDType transient);
00042 virtual RE_IDType getParentOfTransient();
00043
00044
00045 RE_Server *getServer() { return myServer; }
00046 RE_Visual *getVisual()
00047 { return visualResource; }
00048 RE_Render *getRender();
00049 #if ! RE_OGL_SINGLE_CONTEXT
00050 void setRender(RE_Render *r) { myRender = r; }
00051 #endif
00052
00053 virtual RE_IDType openWindow( int isMain = 0, int show=1 ) = 0;
00054 virtual void showWindow();
00055 virtual void closeWindow() = 0;
00056
00057 virtual void initMaxSize( short w, short h ) = 0;
00058 virtual void initMinSize( short w, short h ) = 0;
00059 virtual void initClass(const char *name, const char *rclass ) = 0;
00060 virtual void initVisual( RE_Visual *visual );
00061 void setLimitPositions(bool limitpos)
00062 { myLimitPositions = limitpos; }
00063 bool getLimitPositions() const
00064 { return myLimitPositions; }
00065
00066 virtual void updateMaxSize(int w,int h);
00067
00068
00069
00070
00071
00072 virtual void moveWindow( short x, short y, int force = 1 ) = 0;
00073 virtual void sizeWindow( short w, short h, int force = 1 ) = 0;
00074 virtual void resizeWindow( short w, short h ) = 0;
00075 virtual void moveAndSizeWindow(short x, short y, short w, short h,
00076 int force = 1 ) = 0;
00077
00078
00079
00080
00081 virtual void maximizeWindow();
00082 virtual void restoreWindow();
00083
00084 bool isMaximized() const { return winFlags.maximized; }
00085
00086
00087
00088
00089
00090 virtual void fullscreenWindow(bool full);
00091 bool isFullscreenWindow() const { return winFlags.fullscreen; }
00092
00093 virtual short getX() const = 0;
00094 virtual short getY() const = 0;
00095 virtual short getW() const = 0;
00096 virtual short getH() const = 0;
00097
00098 virtual void lowerWindow() = 0;
00099 virtual void raiseWindow() = 0;
00100
00101 int getBorderWidth() const
00102 { return myLeftBorder+myRightBorder; }
00103 int getBorderHeight() const
00104 { return myTopBorder+myBottomBorder; }
00105 int getBorderTopSize() const
00106 { return myTopBorder; }
00107 int getBorderLeftSize() const
00108 { return myLeftBorder; }
00109 int getBorderBottomSize() const
00110 { return myBottomBorder; }
00111 int getBorderRightSize() const
00112 { return myRightBorder; }
00113
00114
00115 virtual bool makeCurrent(bool &needs_initialization);
00116 virtual void unmakeCurrent();
00117
00118 virtual void findLocation(short *x, short *y, short *w, short *h,
00119 char topMostParent = 0) = 0;
00120
00121
00122
00123 virtual void setWindowAlwaysOnTop(bool newstate);
00124 virtual void setWindowAlwaysOnTopAndHideWhenInactive(bool newstate);
00125 int getWindowAlwaysOnTop() const
00126 { return winFlags.alwaysOnTop; }
00127
00128 RE_DisplayMode getMode() const;
00129
00130 RE_VisualType getVisualType() const
00131 { return visualType; }
00132 void setVisualType(RE_VisualType t) { visualType = t; }
00133
00134
00135 void setWindowType(RE_WindowType t)
00136 { myWindowType = t; }
00137 RE_WindowType getWindowType() const
00138 { return myWindowType; }
00139
00140 void setWindowID(RE_IDType id) { windowID = id; }
00141 RE_IDType getWindowID() const
00142 { return windowID; }
00143 int matchID( RE_IDType wid ) const
00144 { return wid == windowID; }
00145
00146 virtual RE_IDType getBufferID() const { return 0; }
00147
00148 virtual OGLDrawable getGraphicsDrawable() = 0;
00149 virtual OGLDrawable getAlternateDrawable() = 0;
00150 virtual void setGraphicsDrawable(OGLDrawable ) { }
00151 virtual void setAlternateDrawable(OGLDrawable) { }
00152
00153 void setIconPixmap(unsigned long pm) { iconPixmap = pm; }
00154 unsigned long getIconPixmap() const { return iconPixmap; }
00155
00156 void setIconLoader(RE_IconLoader loader);
00157
00158
00159 UT_Bool isOffscreen() const
00160 { return winFlags.doOffScreen ==RE_WINDOW_OFFSCREEN; }
00161
00162 virtual void grabWindowFocusLock(bool ) { }
00163 virtual void releaseWindowFocusLock() { }
00164
00165 void setWindowBorders(int left, int right, int top, int bottom)
00166 {
00167 myLeftBorder = left;
00168 myRightBorder = right;
00169 myTopBorder = top;
00170 myBottomBorder = bottom;
00171 }
00172
00173 OGLDrawable getDrawable()
00174 {
00175 return winFlags.doOffScreen
00176 ? getAlternateDrawable() : getGraphicsDrawable();
00177 }
00178
00179 protected:
00180 RE_OGLContext getContext(bool &needs_initialization);
00181
00182 RE_Server *myServer;
00183 RE_Visual *visualResource;
00184 RE_VisualType visualType;
00185 RE_IDType windowID;
00186
00187 #if ! RE_OGL_SINGLE_CONTEXT
00188 RE_Render *myRender;
00189 #endif
00190
00191 unsigned long iconPixmap;
00192 RE_IconLoader iconLoader;
00193 RE_WindowFlags winFlags;
00194 RE_WindowFlags storeFlags;
00195 RE_Window *parentWindow;
00196
00197 RE_WindowType myWindowType;
00198
00199 int myLeftBorder;
00200 int myTopBorder;
00201 int myRightBorder;
00202 int myBottomBorder;
00203
00204 unsigned int myLimitPositions:1;
00205 };
00206
00207 class RE_API RE_WindowList
00208 {
00209 public:
00210 RE_WindowList()
00211 { }
00212 ~RE_WindowList()
00213 { }
00214
00215 void lock()
00216 { myLock.lock(); }
00217 void unlock()
00218 { myLock.unlock(); }
00219 void addWindow(RE_Window *w)
00220 { lock(); myWindows.append(w); unlock(); }
00221 void removeWindow(RE_Window *w)
00222 { lock(); myWindows.findAndRemove(w); unlock(); }
00223 int getNumWindows() const
00224 { return myWindows.entries(); }
00225 RE_Window *getWindow(int index) const
00226 { return myWindows(index); }
00227 void removeWindow(RE_IDType wid);
00228 RE_Window *isWindowHere(RE_IDType wid);
00229
00230 private:
00231 UT_PtrArray<RE_Window *> myWindows;
00232 UT_Lock myLock;
00233 };
00234
00235 #endif