Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GHOST_Window.h « intern « ghost « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 52cb9cbf54bd7724847f0fd17ef6cfb42c38d5a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

/** \file ghost/intern/GHOST_Window.h
 *  \ingroup GHOST
 * Declaration of GHOST_Window class.
 */

#ifndef __GHOST_WINDOW_H__
#define __GHOST_WINDOW_H__

#include "GHOST_IWindow.h"

class STR_String;
class GHOST_Context;

/**
 * Platform independent implementation of GHOST_IWindow.
 * Dimensions are given in screen coordinates that are relative to the 
 * upper-left corner of the screen.
 * Implements part of the GHOST_IWindow interface and adds some methods to
 * be implemented by childs of this class.
 * \author	Maarten Gribnau
 * \date	May 7, 2001
 */
class GHOST_Window : public GHOST_IWindow
{
public:

	/**
	 * Constructor.
	 * Creates a new window and opens it.
	 * To check if the window was created properly, use the getValid() method.
	 * \param width				The width the window.
	 * \param heigh				The height the window.
	 * \param state				The state the window is initially opened with.
	 * \param type				The type of drawing context installed in this window.
	 * \param stereoVisual		Stereo visual for quad buffered stereo.
	 * \param exclusive			Use to show the window ontop and ignore others
	 *							(used fullscreen).
	 * \param numOfAASamples	Number of samples used for AA (zero if no AA)
	 */
	GHOST_Window(
	    GHOST_TUns32 width,
	    GHOST_TUns32 height,
	    GHOST_TWindowState state,
	    const bool wantStereoVisual = false,
	    const bool exclusive = false,
	    const GHOST_TUns16 wantNumOfAASamples = 0);

	/**
	 * \section Interface inherited from GHOST_IWindow left for derived class
	 * implementation.
	 * virtual	bool getValid() const = 0;
	 * virtual void setTitle(const STR_String& title) = 0;
	 * virtual void getTitle(STR_String& title) const = 0;
	 * virtual	void getWindowBounds(GHOST_Rect& bounds) const = 0;
	 * virtual	void getClientBounds(GHOST_Rect& bounds) const = 0;
	 * virtual	GHOST_TSuccess setClientWidth(GHOST_TUns32 width) = 0;
	 * virtual	GHOST_TSuccess setClientHeight(GHOST_TUns32 height) = 0;
	 * virtual	GHOST_TSuccess setClientSize(GHOST_TUns32 width, GHOST_TUns32 height) = 0;
	 * virtual	void screenToClient(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0;
	 * virtual	void clientToScreen(GHOST_TInt32 inX, GHOST_TInt32 inY, GHOST_TInt32& outX, GHOST_TInt32& outY) const = 0;
	 * virtual GHOST_TWindowState getState() const = 0;
	 * virtual GHOST_TSuccess setState(GHOST_TWindowState state) = 0;
	 * virtual GHOST_TSuccess setOrder(GHOST_TWindowOrder order) = 0;
	 * virtual GHOST_TSuccess swapBuffers() = 0;
	 * virtual GHOST_TSuccess setSwapInterval() = 0;
	 * virtual GHOST_TSuccess getSwapInterval(int& intervalOut) = 0;
	 * virtual GHOST_TSuccess activateDrawingContext() = 0;
	 * virtual GHOST_TSuccess invalidate() = 0;
	 */
	 
	/**
	 * Destructor.
	 * Closes the window and disposes resources allocated.
	 */
	virtual ~GHOST_Window();

	/**
	 * Returns indication as to whether the window is valid.
	 * \return The validity of the window.
	 */
	virtual bool getValid() const { 
		return m_context != 0;
	}

	/**
	 * Returns the associated OS object/handle
	 * \return The associated OS object/handle
	 */
	virtual void *getOSWindow() const;
	
	/**
	 * Returns the current cursor shape.
	 * \return	The current cursor shape.
	 */
	inline GHOST_TStandardCursor getCursorShape() const;

	/**
	 * Set the shape of the cursor.
	 * \param	cursorShape: The new cursor shape type id.
	 * \return	Indication of success.
	 */
	GHOST_TSuccess setCursorShape(GHOST_TStandardCursor cursorShape);

	/**
	 * Set the shape of the cursor to a custom cursor.
	 * \param	bitmap	The bitmap data for the cursor.
	 * \param	mask	The mask data for the cursor.
	 * \param	hotX	The X coordinate of the cursor hotspot.
	 * \param	hotY	The Y coordinate of the cursor hotspot.
	 * \return	Indication of success.
	 */
	GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 bitmap[16][2],
	                                    GHOST_TUns8 mask[16][2],
	                                    int hotX,
	                                    int hotY);

	GHOST_TSuccess setCustomCursorShape(GHOST_TUns8 *bitmap,
	                                    GHOST_TUns8 *mask,
	                                    int sizex, int sizey,
	                                    int hotX,  int hotY,
	                                    int fg_color, int bg_color);

	/**
	 * Returns the visibility state of the cursor.
	 * \return	The visibility state of the cursor.
	 */
	inline bool getCursorVisibility() const;
	inline GHOST_TGrabCursorMode getCursorGrabMode() const;
	inline bool getCursorGrabModeIsWarp() const;
	inline void getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
	inline void getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const;
	inline void setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y);

	/**
	 * Shows or hides the cursor.
	 * \param	visible The new visibility state of the cursor.
	 * \return	Indication of success.
	 */
	GHOST_TSuccess setCursorVisibility(bool visible);

	/**
	 * Sets the cursor grab.
	 * \param	mode The new grab state of the cursor.
	 * \return	Indication of success.
	 */
	GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds, GHOST_TInt32 mouse_ungrab_xy[2]);

	/**
	 * Gets the cursor grab region, if unset the window is used.
	 * reset when grab is disabled.
	 */
	GHOST_TSuccess getCursorGrabBounds(GHOST_Rect& bounds);

	/**
	 * Sets the progress bar value displayed in the window/application icon
	 * \param progress The progress % (0.0 to 1.0)
	 */
	virtual GHOST_TSuccess setProgressBar(float /*progress*/) {
		return GHOST_kFailure;
	}
	
	/**
	 * Hides the progress bar in the icon
	 */
	virtual GHOST_TSuccess endProgressBar() {
		return GHOST_kFailure;
	}
	
	/**
	 * Sets the swap interval for swapBuffers.
	 * \param interval The swap interval to use.
	 * \return A boolean success indicator.
	 */
	GHOST_TSuccess setSwapInterval(int interval);

	/**
	 * Gets the current swap interval for swapBuffers.
	 * \return An integer.
	 */
	GHOST_TSuccess getSwapInterval(int& intervalOut);

	/**
	 * Gets the current swap interval for swapBuffers.
	 * \return Number of AA Samples (0 if there is no multisample buffer)
	 */
	GHOST_TUns16 getNumOfAASamples();

	/**
	 * Tells if the ongoing drag'n'drop object can be accepted upon mouse drop
	 */
	void setAcceptDragOperation(bool canAccept);
	
	/**
	 * Returns acceptance of the dropped object
	 * Usually called by the "object dropped" event handling function
	 */
	bool canAcceptDragOperation() const;
	
	/**
	 * Sets the window "modified" status, indicating unsaved changes
	 * \param isUnsavedChanges Unsaved changes or not
	 * \return Indication of success.
	 */
	virtual GHOST_TSuccess setModifiedState(bool isUnsavedChanges);
	
	/**
	 * Gets the window "modified" status, indicating unsaved changes
	 * \return True if there are unsaved changes
	 */
	virtual bool getModifiedState();
	
	/**
	 * Returns the type of drawing context used in this window.
	 * \return The current type of drawing context.
	 */
	inline GHOST_TDrawingContextType getDrawingContextType();

	/**
	 * Tries to install a rendering context in this window.
	 * Child classes do not need to overload this method,
	 * They should overload newDrawingContext instead.
	 * \param type	The type of rendering context installed.
	 * \return Indication as to whether installation has succeeded.
	 */
	GHOST_TSuccess setDrawingContextType(GHOST_TDrawingContextType type);

	/**
	 * Swaps front and back buffers of a window.
	 * \return  A boolean success indicator.
	 */
	virtual GHOST_TSuccess swapBuffers();

	/**
	 * Activates the drawing context of this window.
	 * \return  A boolean success indicator.
	 */
	virtual GHOST_TSuccess activateDrawingContext();

	/**
	 * Updates the drawing context of this window. Needed
	 * whenever the window is changed.
	 * \return Indication of success.
	 */
	GHOST_TSuccess updateDrawingContext();

	/**
	 * Returns the window user data.
	 * \return The window user data.
	 */
	inline GHOST_TUserDataPtr getUserData() const
	{
		return m_userData;
	}
	
	/**
	 * Changes the window user data.
	 * \param userData: The window user data.
	 */
	void setUserData(const GHOST_TUserDataPtr userData)
	{
		m_userData = userData;
	}
	
	float getNativePixelSize(void)
	{
		if (m_nativePixelSize > 0.0f)
			return m_nativePixelSize;
		return 1.0f;
	}

#ifdef WITH_INPUT_IME
	virtual void beginIME(GHOST_TInt32 x,
	                      GHOST_TInt32 y,
	                      GHOST_TInt32 w,
	                      GHOST_TInt32 h,
	                      int completed)
	{
		/* do nothing temporarily if not in windows */
	}

	virtual void endIME()
	{
		/* do nothing temporarily if not in windows */
	}
#endif /* WITH_INPUT_IME */

protected:
	/**
	 * Tries to install a rendering context in this window.
	 * \param type	The type of rendering context installed.
	 * \return Indication as to whether installation has succeeded.
	 */
	virtual GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type) = 0;

	/**
	 * Sets the cursor visibility on the window using
	 * native window system calls.
	 */
	virtual GHOST_TSuccess setWindowCursorVisibility(bool visible) = 0;

	/**
	 * Sets the cursor grab on the window using
	 * native window system calls.
	 */
	virtual GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode /*mode*/) {
		return GHOST_kSuccess;
	}
	
	/**
	 * Sets the cursor shape on the window using
	 * native window system calls.
	 */
	virtual GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape) = 0;

	/**
	 * Sets the cursor shape on the window using
	 * native window system calls.
	 */
	virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 bitmap[16][2],
	                                                  GHOST_TUns8 mask[16][2],
	                                                  int hotX, int hotY) = 0;
	
	virtual GHOST_TSuccess setWindowCustomCursorShape(GHOST_TUns8 *bitmap, GHOST_TUns8 *mask, 
	                                                  int szx, int szy, int hotX, int hotY, int fg, int bg) = 0;

	GHOST_TSuccess releaseNativeHandles();

	/** The drawing context installed in this window. */
	GHOST_TDrawingContextType m_drawingContextType;
	
	/** The window user data */
	GHOST_TUserDataPtr m_userData;

	/** The current visibility of the cursor */
	bool m_cursorVisible;

	/** The current grabbed state of the cursor */
	GHOST_TGrabCursorMode m_cursorGrab;

	/** Initial grab location. */
	GHOST_TInt32 m_cursorGrabInitPos[2];

	/** Accumulated offset from m_cursorGrabInitPos. */
	GHOST_TInt32 m_cursorGrabAccumPos[2];

	/** Wrap the cursor within this region. */
	GHOST_Rect m_cursorGrabBounds;

	/** The current shape of the cursor */
	GHOST_TStandardCursor m_cursorShape;
    
	/** The presence of progress indicator with the application icon */
	bool m_progressBarVisible;
	
	/** The acceptance of the "drop candidate" of the current drag'n'drop operation */
	bool m_canAcceptDragOperation;
	
	/** Modified state : are there unsaved changes */
	bool m_isUnsavedChanges;
	
	/** Stores whether this is a full screen window. */
	bool m_fullScreen;

	/** Whether to attempt to initialize a context with a stereo framebuffer. */
	bool m_wantStereoVisual;

	/** Attempt to initialize a context with this many samples. */
	GHOST_TUns16 m_wantNumOfAASamples;

	/** Full-screen width */
	GHOST_TUns32 m_fullScreenWidth;
	/** Full-screen height */
	GHOST_TUns32 m_fullScreenHeight;
	
	/* OSX only, retina screens */
	float m_nativePixelSize;

private:
	GHOST_Context *m_context;
};


inline GHOST_TDrawingContextType GHOST_Window::getDrawingContextType()
{
	return m_drawingContextType;
}

inline bool GHOST_Window::getCursorVisibility() const
{
	return m_cursorVisible;
}

inline GHOST_TGrabCursorMode GHOST_Window::getCursorGrabMode() const
{
	return m_cursorGrab;
}

inline bool GHOST_Window::getCursorGrabModeIsWarp() const
{
	return (m_cursorGrab == GHOST_kGrabWrap) ||
	       (m_cursorGrab == GHOST_kGrabHide);
}

inline void GHOST_Window::getCursorGrabInitPos(GHOST_TInt32 &x, GHOST_TInt32 &y) const
{
	x = m_cursorGrabInitPos[0];
	y = m_cursorGrabInitPos[1];
}

inline void GHOST_Window::getCursorGrabAccum(GHOST_TInt32 &x, GHOST_TInt32 &y) const
{
	x = m_cursorGrabAccumPos[0];
	y = m_cursorGrabAccumPos[1];
}

inline void GHOST_Window::setCursorGrabAccum(GHOST_TInt32 x, GHOST_TInt32 y)
{
	m_cursorGrabAccumPos[0] = x;
	m_cursorGrabAccumPos[1] = y;
}

inline GHOST_TStandardCursor GHOST_Window::getCursorShape() const
{
	return m_cursorShape;
}

#endif // _GHOST_WINDOW_H