1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "Prerequisites/BsPrerequisitesUtil.h"
6#include "Math/BsVector2I.h"
7#include <X11/X.h>
8#include <X11/Xutil.h>
9
10namespace bs
11{
12 /** @addtogroup Internal-Utility
13 * @{
14 */
15
16 /** @addtogroup Platform-Utility-Internal
17 * @{
18 */
19
20 /** Descriptor used for creating a platform specific native window. */
21 struct WINDOW_DESC
22 {
23 INT32 x, y;
24 UINT32 width, height;
25 UINT32 screen;
26 String title;
27 bool showDecorations;
28 bool allowResize;
29 bool modal;
30 bool showOnTaskBar;
31 bool hidden;
32 ::Window parent;
33 ::Window external;
34 XVisualInfo visualInfo;
35 SPtr<PixelData> background;
36 };
37
38 /**
39 * Represents a X11 window. Note that all accesses (including creation and destruction) to objects of this class must
40 * be locked by the main X11 lock accessible through LinuxPlatform.
41 */
42 class BS_UTILITY_EXPORT LinuxWindow
43 {
44 public:
45 LinuxWindow(const WINDOW_DESC& desc);
46 ~LinuxWindow();
47
48 /** Returns position of the left-most border of the window, relative to the screen. */
49 INT32 getLeft() const;
50
51 /** Returns position of the top-most border of the window, relative to the screen. */
52 INT32 getTop() const;
53
54 /** Returns width of the window in pixels. */
55 UINT32 getWidth() const;
56
57 /** Returns height of the window in pixels. */
58 UINT32 getHeight() const;
59
60 /** Hides the window. */
61 void hide();
62
63 /** Shows (unhides) the window. */
64 void show();
65
66 /** Minimizes the window. */
67 void minimize();
68
69 /** Maximizes the window over the entire current screen. */
70 void maximize();
71
72 /** Restores the window to original position and size if it is minimized or maximized. */
73 void restore();
74
75 /** Change the size of the window. */
76 void resize(UINT32 width, UINT32 height);
77
78 /** Reposition the window. */
79 void move(INT32 left, INT32 top);
80
81 /** Sets the icon to display for the window. */
82 void setIcon(const PixelData& icon);
83
84 /** Converts screen position into window local position. */
85 Vector2I screenToWindowPos(const Vector2I& screenPos) const;
86
87 /** Converts window local position to screen position. */
88 Vector2I windowToScreenPos(const Vector2I& windowPos) const;
89
90 /**
91 * @name Internal
92 * @{
93 */
94
95 /**
96 * Destroys the window, cleaning up any resources and removing it from the display. No further methods should be
97 * called on this object after it has been destroyed.
98 */
99 void _destroy();
100
101 /**
102 * Sets a portion of the window in which the user can click and drag in order to move the window. This is needed
103 * when window has no title bar, yet you still want to allow the user to drag it by clicking on some specific area
104 * (e.g. a title bar you manually render).
105 *
106 * @param[in] rects Areas of the window (relative to the window origin in top-left corner) in which the drag
107 * operation in allowed.
108 */
109 void _setDragZones(const Vector<Rect2I>& rects);
110
111 /**
112 * Notifies the window that user has started dragging the window using a custom drag zone. Provided parameter is the
113 * event that started the drag.
114 */
115 void _dragStart(const XButtonEvent& event);
116
117 /** Notifies the window the user has stopped the window drag operation. */
118 void _dragEnd();
119
120 /** Returns the internal X11 window handle. */
121 ::Window _getXWindow() const;
122
123 /** Toggles between fullscreen and windowed mode. */
124 void _setFullscreen(bool fullscreen);
125
126 /** Attaches non-specific user data that can later be retrieved through _getUserData(). */
127 void _setUserData(void* data);
128
129 /** Returns user data attached to the object when _setUserData was called. */
130 void* _getUserData() const;
131
132 /** @} */
133
134 private:
135 /** Checks if the window is currently maximized. */
136 bool isMaximized() const;
137
138 /** Checks if the window is currently minimized (iconified). */
139 bool isMinimized();
140
141 /**
142 * Maximizes a window if @p enable is true. If false restores the window to size/position before maximization
143 * occurred.
144 */
145 void maximize(bool enable);
146
147 /**
148 * Minimizes a window if @p enable is true. If false restores the window to size/position before minimization
149 * occurred.
150 */
151 void minimize(bool enable);
152
153 /** Shows or hides the window icon from the taskbar. */
154 void showOnTaskbar(bool enable);
155
156 /**
157 * Shows or hides window decorations. Decorations include window title bar, border and similar. Essentially anything
158 * not part of the main rendering area.
159 */
160 void setShowDecorations(bool show);
161
162 /**
163 * Switches the window between modal and normal mode. Modal window prevents input to their parent window until
164 * it is dismissed.
165 */
166 void setIsModal(bool modal);
167
168 struct Pimpl;
169 Pimpl* m;
170 };
171
172 /** @} */
173 /** @} */
174}
175