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
00050 virtual RE_IDType openWindow( int isMain = 0, int show=1 ) = 0;
00051 virtual void showWindow();
00052 virtual void closeWindow() = 0;
00053
00054 virtual void initMaxSize( short w, short h ) = 0;
00055 virtual void initMinSize( short w, short h ) = 0;
00056 virtual void initClass( char *name, char *rclass ) = 0;
00057 virtual void initVisual( RE_Visual *visual );
00058 void setLimitPositions(bool limitpos)
00059 { myLimitPositions = limitpos; }
00060 bool getLimitPositions() const
00061 { return myLimitPositions; }
00062
00063 virtual void updateMaxSize(int w,int h);
00064
00065
00066
00067
00068
00069 virtual void moveWindow( short x, short y, int force = 1 ) = 0;
00070 virtual void sizeWindow( short w, short h, int force = 1 ) = 0;
00071 virtual void resizeWindow( short w, short h ) = 0;
00072 virtual void moveAndSizeWindow(short x, short y, short w, short h,
00073 int force = 1 ) = 0;
00074
00075
00076
00077
00078 virtual void maximizeWindow();
00079 virtual void restoreWindow();
00080
00081 bool isMaximized() const { return winFlags.maximized; }
00082
00083
00084
00085
00086
00087 virtual void fullscreenWindow(bool full);
00088 bool isFullscreenWindow() const { return winFlags.fullscreen; }
00089
00090 virtual short getX() const = 0;
00091 virtual short getY() const = 0;
00092 virtual short getW() const = 0;
00093 virtual short getH() const = 0;
00094
00095 virtual void lowerWindow() = 0;
00096 virtual void raiseWindow() = 0;
00097
00098 int getBorderWidth() const
00099 { return myLeftBorder+myRightBorder; }
00100 int getBorderHeight() const
00101 { return myTopBorder+myBottomBorder; }
00102 int getBorderTopSize() const
00103 { return myTopBorder; }
00104 int getBorderLeftSize() const
00105 { return myLeftBorder; }
00106 int getBorderBottomSize() const
00107 { return myBottomBorder; }
00108 int getBorderRightSize() const
00109 { return myRightBorder; }
00110
00111
00112 virtual bool makeCurrent(bool &needs_initialization);
00113 virtual void unmakeCurrent();
00114
00115 virtual void findLocation(short *x, short *y, short *w, short *h,
00116 char topMostParent = 0) = 0;
00117
00118
00119
00120 virtual void setWindowAlwaysOnTop(bool newstate);
00121 virtual void setWindowAlwaysOnTopAndHideWhenInactive(bool newstate);
00122 int getWindowAlwaysOnTop() const
00123 { return winFlags.alwaysOnTop; }
00124
00125 int getDepth() const;
00126 RE_DisplayMode getMode() const;
00127 int getNumColors() const;
00128
00129 RE_VisualType getVisualType() const
00130 { return visualType; }
00131 void setVisualType(RE_VisualType t) { visualType = t; }
00132
00133
00134 void setWindowType(RE_WindowType t)
00135 { myWindowType = t; }
00136 RE_WindowType getWindowType() const
00137 { return myWindowType; }
00138
00139 void setWindowID(RE_IDType id) { windowID = id; }
00140 RE_IDType getWindowID() const
00141 { return windowID; }
00142 int matchID( RE_IDType wid ) const
00143 { return wid == windowID; }
00144
00145 virtual RE_IDType getBufferID() const { return 0; }
00146
00147 virtual OGLDrawable getGraphicsDrawable() = 0;
00148 virtual OGLDrawable getAlternateDrawable() = 0;
00149 virtual void setGraphicsDrawable(OGLDrawable ) { }
00150 virtual void setAlternateDrawable(OGLDrawable) { }
00151
00152 void setIconPixmap(unsigned long pm) { iconPixmap = pm; }
00153 unsigned long getIconPixmap() const { return iconPixmap; }
00154
00155 void setIconLoader(RE_IconLoader loader);
00156
00157
00158 UT_Bool isOffscreen() const
00159 { return winFlags.doOffScreen ==RE_WINDOW_OFFSCREEN; }
00160
00161 virtual void grabWindowFocusLock(bool ) { }
00162 virtual void releaseWindowFocusLock() { }
00163
00164 void setWindowBorders(int left, int right, int top, int bottom)
00165 {
00166 myLeftBorder = left;
00167 myRightBorder = right;
00168 myTopBorder = top;
00169 myBottomBorder = bottom;
00170 }
00171
00172 OGLDrawable getDrawable()
00173 {
00174 return winFlags.doOffScreen
00175 ? getAlternateDrawable() : getGraphicsDrawable();
00176 }
00177
00178 protected:
00179 RE_OGLContext getContext(bool &needs_initialization);
00180
00181 RE_Server *myServer;
00182 RE_Visual *visualResource;
00183 RE_VisualType visualType;
00184 RE_IDType windowID;
00185
00186 #if ! RE_OGL_SINGLE_CONTEXT
00187 RE_Render *myRender;
00188 #endif
00189
00190 unsigned long iconPixmap;
00191 RE_IconLoader iconLoader;
00192 RE_WindowFlags winFlags;
00193 RE_WindowFlags storeFlags;
00194 RE_Window *parentWindow;
00195
00196 RE_WindowType myWindowType;
00197
00198 int myLeftBorder;
00199 int myTopBorder;
00200 int myRightBorder;
00201 int myBottomBorder;
00202
00203 unsigned int myLimitPositions:1;
00204 };
00205
00206 class RE_API RE_WindowList
00207 {
00208 public:
00209 RE_WindowList()
00210 { }
00211 ~RE_WindowList()
00212 { }
00213
00214 void lock()
00215 { myLock.lock(); }
00216 void unlock()
00217 { myLock.unlock(); }
00218 void addWindow(RE_Window *w)
00219 { lock(); myWindows.append(w); unlock(); }
00220 void removeWindow(RE_Window *w)
00221 { lock(); myWindows.remove(w); unlock(); }
00222 int getNumWindows() const
00223 { return myWindows.entries(); }
00224 RE_Window *getWindow(int index) const
00225 { return myWindows(index); }
00226 void removeWindow(RE_IDType wid);
00227 RE_Window *isWindowHere(RE_IDType wid);
00228
00229 private:
00230 UT_PtrArray<RE_Window *> myWindows;
00231 UT_Lock myLock;
00232 };
00233
00234 #endif