0032308: Configuration - make Xlib dependency optional
[occt.git] / src / Draw / Draw_Window.hxx
1 // Created on: 1994-07-27
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #ifndef Draw_Window_HeaderFile
18 #define Draw_Window_HeaderFile
19
20 #if defined(_WIN32)
21   #include <windows.h>
22 #endif
23
24 #include <Aspect_Drawable.hxx>
25 #include <NCollection_Vec2.hxx>
26 #include <Standard_Boolean.hxx>
27 #include <Standard_Integer.hxx>
28 #include <TCollection_AsciiString.hxx>
29
30 #include <memory>
31
32 const Standard_Integer MAXCOLOR = 15;
33
34 //! Segment definition.
35 struct Draw_XSegment
36 {
37   NCollection_Vec2<short> Points[2]; // same as XSegment
38
39   NCollection_Vec2<short>&       operator[](int theIndex)       { return Points[theIndex]; }
40   const NCollection_Vec2<short>& operator[](int theIndex) const { return Points[theIndex]; }
41
42   void Init (Standard_Integer theXStart, Standard_Integer theYStart, Standard_Integer theXEnd, Standard_Integer theYEnd)
43   {
44     Points[0].SetValues ((short )theXStart, (short )theYStart);
45     Points[1].SetValues ((short )theXEnd,   (short )theYEnd);
46   }
47 };
48
49 #if defined(_WIN32)
50
51 #define DRAWCLASS L"DRAWWINDOW"
52 #define DRAWTITLE L"Draw View"
53
54 enum console_semaphore_value
55 {
56   STOP_CONSOLE,
57   WAIT_CONSOLE_COMMAND,
58   HAS_CONSOLE_COMMAND
59 };
60
61 // global variable describing console state
62 extern console_semaphore_value volatile console_semaphore;
63
64 // Console command buffer
65 #define DRAW_COMMAND_SIZE 1000
66 extern wchar_t console_command[DRAW_COMMAND_SIZE + 1];
67
68 // PROCEDURE DE DRAW WINDOW
69 Standard_EXPORT Standard_Boolean Init_Appli(HINSTANCE,HINSTANCE,int,HWND&);
70 Standard_EXPORT void Run_Appli(HWND);
71 Standard_EXPORT void Destroy_Appli(HINSTANCE);
72
73 #else
74
75 //! Run the application.
76 //! interp will be called to interpret a command and return True if the command is complete.
77 void Run_Appli (Standard_Boolean (*inteprete) (const char*));
78
79 //! Initialize application.
80 Standard_Boolean Init_Appli();
81
82 //! Destroy application.
83 void Destroy_Appli();
84
85 #if defined(HAVE_XLIB)
86
87 typedef unsigned long Window;
88 typedef unsigned long Pixmap;
89 typedef unsigned long Drawable;
90
91 #elif defined(__APPLE__)
92 #ifdef __OBJC__
93   @class NSView;
94   @class NSWindow;
95   @class NSImage;
96   @class Draw_CocoaView;
97 #else
98   struct NSView;
99   struct NSWindow;
100   struct NSImage;
101   struct Draw_CocoaView;
102 #endif
103 #endif
104
105 #endif
106
107 //! Draw window.
108 class Draw_Window
109 {
110 public:
111
112   //! Type of the callback function that is to be passed to the method AddCallbackBeforeTerminate().
113   typedef void (*FCallbackBeforeTerminate)();
114
115   //! This method registers a callback function that will be called just before exit.
116   //! This is useful especially for Windows platform, on which Draw is normally self-terminated instead of exiting.
117   Standard_EXPORT static void AddCallbackBeforeTerminate (FCallbackBeforeTerminate theCB);
118
119   //! Just in case method for un-registering a callback previously registered by AddCallbackBeforeTerminate().
120   Standard_EXPORT static void RemoveCallbackBeforeTerminate (FCallbackBeforeTerminate theCB);
121
122   //! @sa SetColor()
123   Standard_EXPORT static Standard_Boolean DefineColor (const Standard_Integer theIndex,
124                                                        const char* theColorName);
125
126   //! XFlush() wrapper (X11), has no effect on other platforms.
127   Standard_EXPORT static void Flush();
128
129 public:
130
131   //! Destructor.
132   Standard_EXPORT virtual ~Draw_Window();
133
134   //! Get window position.
135   Standard_EXPORT void GetPosition (Standard_Integer& thePosX,
136                                     Standard_Integer& thePosY);
137
138   //! Set window position.
139   Standard_EXPORT void SetPosition (Standard_Integer theNewXpos,
140                                     Standard_Integer theNewYpos);
141
142   //! Return window height.
143   Standard_EXPORT Standard_Integer HeightWin() const;
144
145   //! Return window width.
146   Standard_EXPORT Standard_Integer WidthWin() const;
147
148   //! Set window dimensions.
149   Standard_EXPORT void SetDimension (Standard_Integer theNewDx,
150                                      Standard_Integer theNewDy);
151
152   //! Return window title.
153   Standard_EXPORT TCollection_AsciiString GetTitle() const;
154
155   //! Set window title.
156   Standard_EXPORT void SetTitle (const TCollection_AsciiString& theTitle);
157
158   //! Return true if window is displayed on the screen.
159   Standard_EXPORT bool IsMapped() const;
160
161   //! Display window on the screen.
162   Standard_EXPORT void DisplayWindow();
163
164   //! Hide window.
165   Standard_EXPORT void Hide();
166
167   //! Destroy window.
168   Standard_EXPORT void Destroy();
169
170   //! Clear window content.
171   Standard_EXPORT void Clear();
172
173   //! Returns Standard_True if off-screen image buffer is being used
174   Standard_Boolean GetUseBuffer() const { return myUseBuffer; }
175
176   // Turns on/off usage of off-screen image buffer (can be used for redrawing optimization)
177   Standard_EXPORT void SetUseBuffer (Standard_Boolean theToUse);
178
179   //! Set active color index for further paintings.
180   //! @sa DefineColor()
181   Standard_EXPORT void SetColor (Standard_Integer theColor);
182
183   //! Set active paint mode (3 for COPY; 6 for XOR).
184   Standard_EXPORT void SetMode  (Standard_Integer theMode);
185
186   //! Draw the string.
187   Standard_EXPORT void DrawString (Standard_Integer theX, Standard_Integer theY,
188                                    const char* theText);
189
190   //! Draw array of segments.
191   Standard_EXPORT void DrawSegments (const Draw_XSegment* theSegments,
192                                      Standard_Integer theNumberOfElements);
193
194   //! Redraw window content.
195   Standard_EXPORT void Redraw();
196
197   //! Save snapshot.
198   Standard_EXPORT Standard_Boolean Save (const char* theFileName) const;
199
200   //! Perform window exposing.
201   virtual void WExpose() = 0;
202
203   //! (Re)initializes off-screen image buffer according to current window size.
204   Standard_EXPORT void InitBuffer();
205
206 protected:
207
208   //! Main constructor.
209   //! @param theTitle  [in] window title
210   //! @param theXY     [in] top-left position
211   //! @param theSize   [in] window dimensions
212   //! @param theParent [in] optional native parent window
213   //! @param theWin    [in] optional native window
214   Standard_EXPORT Draw_Window (const char* theTitle,
215                                const NCollection_Vec2<int>& theXY,
216                                const NCollection_Vec2<int>& theSize,
217                                Aspect_Drawable theParent,
218                                Aspect_Drawable theWin);
219
220   //! Initialize the window.
221   Standard_EXPORT void init (const NCollection_Vec2<int>& theXY,
222                              const NCollection_Vec2<int>& theSize);
223
224 public:
225
226 #if defined(_WIN32)
227   Standard_Boolean IsEqualWindows (HANDLE theWindow) { return myWindow == theWindow; }
228
229   Standard_EXPORT static void SelectWait   (HANDLE& theWindow, int& theX, int& theY, int& theButton);
230   Standard_EXPORT static void SelectNoWait (HANDLE& theWindow, int& theX, int& theY, int& theButton);
231   // Procedure de fenetre
232   Standard_EXPORT static LRESULT APIENTRY DrawProc (HWND, UINT, WPARAM, LPARAM);
233   static HWND hWndClientMDI;
234 #elif defined(HAVE_XLIB)
235   Standard_Boolean IsEqualWindows (Window theWindow) { return myWindow  == theWindow; }
236
237   //! Event structure.
238   struct Draw_XEvent
239   {
240     Standard_Integer type;
241     Window window;
242     Standard_Integer button;
243     Standard_Integer x;
244     Standard_Integer y;
245   };
246
247   //! Retrieve event.
248   static void GetNextEvent (Draw_XEvent& theEvent);
249
250   void Wait (Standard_Boolean theToWait = Standard_True);
251 #elif defined(__APPLE__)
252   Standard_Boolean IsEqualWindows (const Standard_Integer& theWindowNumber);
253
254   static void GetNextEvent (Standard_Boolean  theWait,
255                             Standard_Integer& theWindowNumber,
256                             Standard_Integer& theX,
257                             Standard_Integer& theY,
258                             Standard_Integer& theButton);
259 #endif
260
261 private:
262
263 #if defined(_WIN32)
264   Standard_EXPORT static HWND createDrawWindow (HWND , int );
265   Standard_EXPORT HDC  getMemDC    (HDC theWinDC);
266   Standard_EXPORT void releaseMemDC(HDC theMemDC);
267 #elif defined(HAVE_XLIB)
268   Drawable GetDrawable() const { return myUseBuffer ? myImageBuffer : myWindow; }
269   struct Base_Window; // opaque structure with extra Xlib parameters
270 #endif
271
272 private:
273
274 #if defined(_WIN32)
275   HWND             myWindow;      //!< native window
276   HBITMAP          myMemHbm;
277   HBITMAP          myOldHbm;
278   Standard_Integer myCurrPen;
279   Standard_Integer myCurrMode;
280 #elif defined(HAVE_XLIB)
281   Window           myWindow;      //!< native window
282   Window           myMother;      //!< parent native window
283   Pixmap           myImageBuffer;
284   std::unique_ptr<Base_Window> myBase;
285 #elif defined(__APPLE__)
286   NSWindow*        myWindow;      //!< native window
287   Draw_CocoaView*  myView;
288   NSImage*         myImageBuffer;
289 #else
290   Aspect_Drawable  myWindow;
291 #endif
292   Standard_Integer myCurrentColor;
293   Standard_Boolean myUseBuffer;
294
295 };
296
297 #endif // Draw_Window_HeaderFile