HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RE_Window.h
Go to the documentation of this file.
1 
2 #ifndef __RE_Window_h__
3 #define __RE_Window_h__
4 
5 #include "RE_API.h"
6 #include "RE_IDType.h"
7 #include "RE_Types.h"
8 
9 #include <UT/UT_Lock.h>
10 #include <UT/UT_Rect.h>
11 #include <UT/UT_UniquePtr.h>
12 #include <UT/UT_ValArray.h>
13 
14 #include <utility>
15 
16 class RE_Visual;
17 class RE_Server;
18 class RE_Render;
19 
20 class QWidget;
21 
22 
24 {
26  alwaysOnTop:1,
27  maximized:1,
28  fullscreen:1;
29 };
30 
32 {
33 public:
34  RE_Window(RE_Server *server,
36  RE_VisualType visType = RE_NORMAL_VIS);
37 
38  virtual ~RE_Window();
39 
40  void setName(const char *name);
41  void setIconName(const char *name);
42 
43  void setParentWindow(RE_Window *parent);
44  const RE_Window *getParentWindow() const { return parentWindow; }
45 
46  void setDialogParentHint(RE_IDType parent_hint);
47 
48  // TODO: No need for getServer(). Move getVisual() to RE_GLDrawable.
49  RE_Server *getServer() { return myServer; }
51  { return myVisualResource; }
52 
53  RE_Render *getRender();
55  { myRender = std::move(r); }
56 
57  // Opens a window but does not show it immediately.
58  // Call showWindow to show the window.
59  RE_IDType openWindow();
60  void showWindow();
61  void closeWindow();
62 
63  void initMaxSize(int w, int h );
64  void initMinSize(int w, int h );
65  void initVisual( RE_Visual *visual );
66  void setLimitPositions(bool limitpos)
67  { myLimitPositions = limitpos; }
68  bool getLimitPositions() const
69  { return myLimitPositions; }
70 
71  void moveWindow(int x, int y);
72  void sizeWindow(int w, int h);
73 
74  // Set the window's opacity (0.0 - 1.0).
75  // Values less than 1.0 will make the window translucent.
76  void setWindowOpacity(fpreal opacity);
77 
78 
79  // Maximize the window and/or mark it as maximized so that when openWindow
80  // is called, it can open the window maximized.
81  void maximizeWindow();
82  void restoreWindow();
83 
84  bool isMaximized() const;
85 
86  // Set the window as fullscreen. Depending on the windowing system, this
87  // either informs the window manager to set us as fullscreen or simply
88  // sets borders up so that higher-level classes can do the fullscreening
89  // themselves.
90  void fullscreenWindow(bool full);
91  bool isFullscreenWindow() const;
92  void lowerWindow();
93  void raiseWindow();
94 
95  // Show/Hide the Window Frame/ Titlebar
96  void setHasWindowFrame(bool b);
97  bool hasWindowFrame() const;
98 
99  int getBorderWidth() const
100  { return myLeftBorder+myRightBorder; }
101  int getBorderHeight() const
102  { return myTopBorder+myBottomBorder; }
103  int getBorderTopSize() const
104  { return myTopBorder; }
105  int getBorderLeftSize() const
106  { return myLeftBorder; }
108  { return myBottomBorder; }
109  int getBorderRightSize() const
110  { return myRightBorder; }
111 
112  UT_DimRect findLocation() const;
113  UT_DimRect getNormalGeometry() const;
114 
115  // Sets the window to sit on top of all other windows, or turns off that
116  // state, depending on whether newstate is true or false.
117  void setWindowAlwaysOnTop(bool newstate);
118  int getWindowAlwaysOnTop() const { return winFlags.alwaysOnTop; }
119 
120  void setWindowFloatOnTop(bool on_top);
121 
122  RE_DisplayMode getMode() const;
123 
125  { return myVisualType; }
126  void setVisualType(RE_VisualType t) { myVisualType = t; }
127 
128  // changes to the type will not occur until the window is opened again.
130  { myWindowType = t; }
131 
132  RE_WindowType getWindowType( bool extra=false) const;
133 
134 
135  void setWindowID(RE_IDType id) { myWindowID = id; }
137  { return myWindowID; }
138  int matchID( RE_IDType wid ) const
139  { return wid == myWindowID; }
140 
141  virtual RE_IDType getBufferID() const { return 0; }
142 
143  OGLDrawable getGraphicsDrawable() const { return myDrawable; }
144  void setGraphicsDrawable(OGLDrawable d) { myDrawable = d; }
145 
146 
147  void setIMESupport(bool enable);
148 
149  /// Return the Qt main window.
150  static QWidget * mainQtWindow();
151 
152  /// Initialize the given widget window with the desired
153  /// Houdini window properties, look and feel.
154  static void initQtWindow(
155  QWidget &window, RE_WindowType win_type,
156  bool always_on_top);
157 
158  /// Create a Qt window widget for the given window type.
159  /// The caller takes ownership of the returned object.
160  static QWidget * createQtWindow(RE_WindowType win_type);
161 
162  /// Returns true if Houdini or any of its sub windows are focused
163  static bool appActive();
164 
165  void setWindowBorders(int left, int right, int top, int bottom)
166  {
167  myLeftBorder = left;
168  myRightBorder = right;
169  myTopBorder = top;
170  myBottomBorder = bottom;
171  }
172 
173  // This is called by the native window to inform that it has changed its
174  // maximized state.
175  void updateMaximizedFlag(bool is_maximized)
176  {
177  winFlags.maximized = is_maximized;
178  }
179 
180  static bool isTabFocusEnabled();
181  static void enableTabFocus(bool enable);
182 
183  /// Return the string tag used to identify whether a Qt widget is the
184  /// window for an RE_Window object.
185  static const char * windowTag() { return "RE_Window"; }
186 
187  bool isQuadBufferStereo() const;
188 
189  /// Return the screen number containing this window.
190  /// If the underlying platform window has not been created
191  /// yet then return the primary screen number.
192  int screen() const;
193 
194  /// Get screen-to-window scale.
195  fpreal screenToDeviceScale() const;
196 
197  /// Get Default Window Border Sizes
198  static const int* getDefaultWindowBorderSizes();
199  static int getDefaultWindowTitleBarHeight();
200 
201 private:
202  /// Initialize window borders.
203  void initBorderSizes_();
204 
205  /// Move the underlying Qt window to the position specified by myFrame.
206  void moveQtWindow_();
207 
208 #if defined(WIN32)
209  /// Add the Always On Top menu item to the window's system menu.
210  void addAlwaysOnTopSystemMenuItem_();
211 #endif
212 
213 private:
214 
215  RE_Server *myServer;
216  UT_UniquePtr<RE_Render> myRender;
217  RE_Visual *myVisualResource;
218  RE_VisualType myVisualType;
219  RE_IDType myWindowID;
220 
221 #if defined(WIN32)
222  // This widget is for stashing away the Qt window when it closes and
223  // detaches from its parent window. There's a limitation on Windows
224  // where a Qt window cannot be gracefully detached from the parent.
225  // The workaround is to instead reparent the Qt window instead of
226  // completely detaching it.
227  QWidget *myStashWidget;
228 #endif
229 
230  UT_String myName;
231  UT_String myIconName;
232 
233  // Window geometry in native screen coordinates and scaling.
234  UT_DimRect myFrame;
235 
236  using IntPair = std::pair<int, int>;
237 
238  // Window sizes in native screen scaling.
239  IntPair myMinSize;
240  IntPair myMaxSize;
241 
242  OGLDrawable myDrawable;
243 
244  unsigned long myIconPixmap;
245  RE_WindowFlags winFlags;
246  RE_Window *parentWindow;
247  RE_IDType myDialogParentHint;
248 
249  RE_WindowType myWindowType;
250 
251  int myLeftBorder;
252  int myTopBorder;
253  int myRightBorder;
254  int myBottomBorder;
255 
256  unsigned int myLimitPositions:1;
257 
258  fpreal myWindowOpacity;
259 
260 #if defined(WIN32)
261  bool myAddedAlwaysOnTopMenuItem;
262 #endif
263 };
264 
266 {
267 public:
269  { }
271  { }
272 
273  void lock()
274  { myLock.lock(); }
275  void unlock()
276  { myLock.unlock(); }
278  { lock(); myWindows.append(w); unlock(); }
280  { lock(); myWindows.findAndRemove(w); unlock(); }
281  int getNumWindows() const
282  { return myWindows.entries(); }
284  { return myWindows(index); }
285  void removeWindow(RE_IDType wid);
286  RE_Window *isWindowHere(RE_IDType wid);
287 
288 private:
289  UT_ValArray<RE_Window *> myWindows;
290  UT_Lock myLock;
291 };
292 
293 #endif
void * RE_IDType
Definition: RE_IDType.h:20
void removeWindow(RE_Window *w)
Definition: RE_Window.h:279
const RE_Window * getParentWindow() const
Definition: RE_Window.h:44
bool isOriginReadjusted
Definition: RE_Window.h:25
#define RE_API
Definition: RE_API.h:10
void setWindowID(RE_IDType id)
Definition: RE_Window.h:135
RE_VisualType getVisualType() const
Definition: RE_Window.h:124
GLint left
Definition: glcorearb.h:2005
int getBorderLeftSize() const
Definition: RE_Window.h:105
int getBorderWidth() const
Definition: RE_Window.h:99
void setWindowType(RE_WindowType t)
Definition: RE_Window.h:129
GLdouble right
Definition: glad.h:2817
void addWindow(RE_Window *w)
Definition: RE_Window.h:277
GLint y
Definition: glcorearb.h:103
RE_Window * getWindow(int index) const
Definition: RE_Window.h:283
int getWindowAlwaysOnTop() const
Definition: RE_Window.h:118
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
bool alwaysOnTop
Definition: RE_Window.h:25
OGLDrawable getGraphicsDrawable() const
Definition: RE_Window.h:143
void setGraphicsDrawable(OGLDrawable d)
Definition: RE_Window.h:144
void unlock()
Definition: RE_Window.h:275
int getBorderBottomSize() const
Definition: RE_Window.h:107
void setVisualType(RE_VisualType t)
Definition: RE_Window.h:126
virtual RE_IDType getBufferID() const
Definition: RE_Window.h:141
int matchID(RE_IDType wid) const
Definition: RE_Window.h:138
int getNumWindows() const
Definition: RE_Window.h:281
int getBorderRightSize() const
Definition: RE_Window.h:109
GLuint id
Definition: glcorearb.h:655
GLuint const GLchar * name
Definition: glcorearb.h:786
RE_DisplayMode
Definition: RE_Types.h:573
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:1222
GLint GLenum GLint x
Definition: glcorearb.h:409
void setLimitPositions(bool limitpos)
Definition: RE_Window.h:66
GLdouble t
Definition: glad.h:2397
GLint GLint bottom
Definition: glcorearb.h:2005
GLfloat GLfloat GLfloat GLfloat h
Definition: glcorearb.h:2002
bool maximized
Definition: RE_Window.h:25
fpreal64 fpreal
Definition: SYS_Types.h:277
RE_Visual * getVisual()
Definition: RE_Window.h:50
int getBorderHeight() const
Definition: RE_Window.h:101
GLuint index
Definition: glcorearb.h:786
RE_VisualType
Definition: RE_Types.h:623
void lock()
Definition: RE_Window.h:273
GLdouble GLdouble GLdouble top
Definition: glad.h:2817
bool fullscreen
Definition: RE_Window.h:25
int getBorderTopSize() const
Definition: RE_Window.h:103
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:857
void setRender(UT_UniquePtr< RE_Render > r)
Definition: RE_Window.h:54
GLboolean r
Definition: glcorearb.h:1222
void updateMaximizedFlag(bool is_maximized)
Definition: RE_Window.h:175
void setWindowBorders(int left, int right, int top, int bottom)
Definition: RE_Window.h:165
RE_WindowType
Definition: RE_Types.h:20
type
Definition: core.h:1059
static const char * windowTag()
Definition: RE_Window.h:185
bool getLimitPositions() const
Definition: RE_Window.h:68
RE_IDType getWindowID() const
Definition: RE_Window.h:136
RE_Server * getServer()
Definition: RE_Window.h:49