Skip to content

Commit 94483df

Browse files
committed
WindowModes: Add a window_mode property to WindowProperties
Currently the following are defined in a WindowMode enum: * M_regular * M_fullscreen * M_undecorated This replaces using fullscreen an undecorated. At the moment this just combines flags and simplifies the API, but in the future this can be expanded to more easily introduce more modes (for example, hidden window, and borderless fullscreen).
1 parent 3e6dc3b commit 94483df

File tree

3 files changed

+122
-32
lines changed

3 files changed

+122
-32
lines changed

panda/src/display/windowProperties.I

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -220,36 +220,36 @@ clear_title() {
220220
INLINE void WindowProperties::
221221
set_undecorated(bool undecorated) {
222222
if (undecorated) {
223-
_flags |= F_undecorated;
223+
set_window_mode(W_undecorated);
224224
} else {
225-
_flags &= ~F_undecorated;
225+
set_window_mode(W_regular);
226226
}
227-
_specified |= S_undecorated;
228227
}
229228

230229
/**
231230
* Returns true if the window has no border.
232231
*/
233232
INLINE bool WindowProperties::
234233
get_undecorated() const {
235-
return (_flags & F_undecorated) != 0;
234+
return get_window_mode() == W_undecorated;
236235
}
237236

238237
/**
239238
* Returns true if set_undecorated() has been specified.
240239
*/
241240
INLINE bool WindowProperties::
242241
has_undecorated() const {
243-
return ((_specified & S_undecorated) != 0);
242+
return has_window_mode();
244243
}
245244

246245
/**
247246
* Removes the undecorated specification from the properties.
248247
*/
249248
INLINE void WindowProperties::
250249
clear_undecorated() {
251-
_specified &= ~S_undecorated;
252-
_flags &= ~F_undecorated;
250+
if (get_undecorated()) {
251+
clear_window_mode();
252+
}
253253
}
254254

255255
/**
@@ -297,36 +297,36 @@ clear_fixed_size() {
297297
INLINE void WindowProperties::
298298
set_fullscreen(bool fullscreen) {
299299
if (fullscreen) {
300-
_flags |= F_fullscreen;
300+
set_window_mode(W_fullscreen);
301301
} else {
302-
_flags &= ~F_fullscreen;
302+
set_window_mode(W_regular);
303303
}
304-
_specified |= S_fullscreen;
305304
}
306305

307306
/**
308307
* Returns true if the window is in fullscreen mode.
309308
*/
310309
INLINE bool WindowProperties::
311310
get_fullscreen() const {
312-
return (_flags & F_fullscreen) != 0;
311+
return get_window_mode() == W_fullscreen;
313312
}
314313

315314
/**
316315
* Returns true if set_fullscreen() has been specified.
317316
*/
318317
INLINE bool WindowProperties::
319318
has_fullscreen() const {
320-
return ((_specified & S_fullscreen) != 0);
319+
return has_window_mode();
321320
}
322321

323322
/**
324323
* Removes the fullscreen specification from the properties.
325324
*/
326325
INLINE void WindowProperties::
327326
clear_fullscreen() {
328-
_specified &= ~S_fullscreen;
329-
_flags &= ~F_fullscreen;
327+
if (get_fullscreen()) {
328+
clear_window_mode();
329+
}
330330
}
331331

332332
/**
@@ -685,6 +685,47 @@ clear_mouse_mode() {
685685
_mouse_mode = M_absolute;
686686
}
687687

688+
/**
689+
* Specifies the mode in which the window is displayed.
690+
*
691+
* W_regular: a plain, decorated window
692+
*
693+
* W_fullscreen: fullscreen the application
694+
*
695+
* W_undecorated: a window with no decorations (e.g., titlebar, borders, etc.)
696+
*
697+
*/
698+
INLINE void WindowProperties::
699+
set_window_mode(WindowMode mode) {
700+
_window_mode=mode;
701+
_specified |= S_window_mode;
702+
}
703+
704+
/**
705+
* See set_window_mode().
706+
*/
707+
INLINE WindowProperties::WindowMode WindowProperties::
708+
get_window_mode() const {
709+
return _window_mode;
710+
}
711+
712+
/**
713+
*
714+
*/
715+
INLINE bool WindowProperties::
716+
has_window_mode() const {
717+
return ((_specified & S_window_mode)!=0);
718+
}
719+
720+
/**
721+
* Removes the window_mode specification from the properties.
722+
*/
723+
INLINE void WindowProperties::
724+
clear_window_mode() {
725+
_specified &= ~S_window_mode;
726+
_window_mode = W_regular;
727+
}
728+
688729
/**
689730
* Specifies the window that this window should be attached to. If this is
690731
* NULL or unspecified, the window will be created as a toplevel window on the

panda/src/display/windowProperties.cxx

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ operator = (const WindowProperties &copy) {
3939
_z_order = copy._z_order;
4040
_flags = copy._flags;
4141
_mouse_mode = copy._mouse_mode;
42+
_window_mode = copy._window_mode;
4243
_parent_window = copy._parent_window;
4344
}
4445

@@ -62,8 +63,6 @@ get_config_properties() {
6263
props.set_origin(win_origin[0], win_origin[1]);
6364
}
6465

65-
props.set_fullscreen(fullscreen);
66-
props.set_undecorated(undecorated);
6766
props.set_fixed_size(win_fixed_size);
6867
props.set_cursor_hidden(cursor_hidden);
6968
if (!icon_filename.empty()) {
@@ -82,6 +81,7 @@ get_config_properties() {
8281
props.set_parent_window(NativeWindowHandle::make_subprocess(subprocess_window));
8382
}
8483
props.set_mouse_mode(M_absolute);
84+
props.set_window_mode(W_regular);
8585

8686
return props;
8787
}
@@ -153,6 +153,7 @@ operator == (const WindowProperties &other) const {
153153
_icon_filename == other._icon_filename &&
154154
_cursor_filename == other._cursor_filename &&
155155
_mouse_mode == other._mouse_mode &&
156+
_window_mode == other._window_mode &&
156157
_parent_window == other._parent_window);
157158
}
158159

@@ -171,6 +172,7 @@ clear() {
171172
_z_order = Z_normal;
172173
_flags = 0;
173174
_mouse_mode = M_absolute;
175+
_window_mode = W_regular;
174176
_parent_window = NULL;
175177
}
176178

@@ -213,15 +215,9 @@ add_properties(const WindowProperties &other) {
213215
if (other.has_title()) {
214216
set_title(other.get_title());
215217
}
216-
if (other.has_undecorated()) {
217-
set_undecorated(other.get_undecorated());
218-
}
219218
if (other.has_fixed_size()) {
220219
set_fixed_size(other.get_fixed_size());
221220
}
222-
if (other.has_fullscreen()) {
223-
set_fullscreen(other.get_fullscreen());
224-
}
225221
if (other.has_foreground()) {
226222
set_foreground(other.get_foreground());
227223
}
@@ -249,6 +245,9 @@ add_properties(const WindowProperties &other) {
249245
if (other.has_mouse_mode()) {
250246
set_mouse_mode(other.get_mouse_mode());
251247
}
248+
if (other.has_window_mode()) {
249+
set_window_mode(other.get_window_mode());
250+
}
252251
if (other.has_parent_window()) {
253252
set_parent_window(other.get_parent_window());
254253
}
@@ -269,15 +268,9 @@ output(ostream &out) const {
269268
if (has_title()) {
270269
out << "title=\"" << get_title() << "\"" << " ";
271270
}
272-
if (has_undecorated()) {
273-
out << (get_undecorated() ? "undecorated " : "!undecorated ");
274-
}
275271
if (has_fixed_size()) {
276272
out << (get_fixed_size() ? "fixed_size " : "!fixed_size ");
277273
}
278-
if (has_fullscreen()) {
279-
out << (get_fullscreen() ? "fullscreen " : "!fullscreen ");
280-
}
281274
if (has_foreground()) {
282275
out << (get_foreground() ? "foreground " : "!foreground ");
283276
}
@@ -305,6 +298,9 @@ output(ostream &out) const {
305298
if (has_mouse_mode()) {
306299
out << get_mouse_mode() << " ";
307300
}
301+
if (has_window_mode()) {
302+
out << get_window_mode() << " ";
303+
}
308304
if (has_parent_window()) {
309305
if (get_parent_window() == NULL) {
310306
out << "parent:none ";
@@ -387,3 +383,38 @@ operator >> (istream &in, WindowProperties::MouseMode &mode) {
387383

388384
return in;
389385
}
386+
387+
// WindowMode operators
388+
389+
ostream &
390+
operator << (ostream &out, WindowProperties::WindowMode mode) {
391+
switch (mode) {
392+
case WindowProperties::W_regular:
393+
return out << "regular";
394+
case WindowProperties::W_fullscreen:
395+
return out << "fullscreen";
396+
case WindowProperties::W_undecorated:
397+
return out << "undecorated";
398+
}
399+
return out << "**invalid WindowProperties::WindowMode(" << (int)mode << ")**";
400+
}
401+
402+
istream &
403+
operator >> (istream &in, WindowProperties::WindowMode &mode) {
404+
string word;
405+
in >> word;
406+
407+
if (word == "regular") {
408+
mode = WindowProperties::W_regular;
409+
} else if (word == "fullscreen") {
410+
mode = WindowProperties::W_fullscreen;
411+
} else if (word == "undecorated") {
412+
mode = WindowProperties::W_undecorated;
413+
} else {
414+
display_cat.warning()
415+
<< "Unknown window mode: " << word << "\n";
416+
mode = WindowProperties::W_regular;
417+
}
418+
419+
return in;
420+
}

panda/src/display/windowProperties.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ class EXPCL_PANDA_DISPLAY WindowProperties {
4040
M_confined,
4141
};
4242

43+
enum WindowMode {
44+
W_regular,
45+
W_fullscreen,
46+
W_undecorated,
47+
};
48+
4349
WindowProperties();
4450
INLINE WindowProperties(const WindowProperties &copy);
4551
void operator = (const WindowProperties &copy);
@@ -85,6 +91,13 @@ class EXPCL_PANDA_DISPLAY WindowProperties {
8591
MAKE_PROPERTY2(mouse_mode, has_mouse_mode, get_mouse_mode,
8692
set_mouse_mode, clear_mouse_mode);
8793

94+
INLINE bool has_window_mode() const;
95+
INLINE void set_window_mode(WindowMode mode);
96+
INLINE WindowMode get_window_mode() const;
97+
INLINE void clear_window_mode();
98+
MAKE_PROPERTY2(window_mode, has_window_mode, get_window_mode,
99+
set_window_mode, clear_window_mode);
100+
88101
INLINE void set_title(const string &title);
89102
INLINE const string &get_title() const;
90103
INLINE bool has_title() const;
@@ -183,8 +196,8 @@ class EXPCL_PANDA_DISPLAY WindowProperties {
183196
S_origin = 0x00001,
184197
S_size = 0x00002,
185198
S_title = 0x00004,
186-
S_undecorated = 0x00008,
187-
S_fullscreen = 0x00010,
199+
// UNUSED = 0x00008,
200+
// UNUSED = 0x00010,
188201
S_foreground = 0x00020,
189202
S_minimized = 0x00040,
190203
S_open = 0x00080,
@@ -196,13 +209,12 @@ class EXPCL_PANDA_DISPLAY WindowProperties {
196209
S_mouse_mode = 0x02000,
197210
S_parent_window = 0x04000,
198211
S_raw_mice = 0x08000,
212+
S_window_mode = 0x10000,
199213
};
200214

201215
// This bitmask represents the truefalse settings for various boolean flags
202216
// (assuming the corresponding S_* bit has been set, above).
203217
enum Flags {
204-
F_undecorated = S_undecorated,
205-
F_fullscreen = S_fullscreen,
206218
F_foreground = S_foreground,
207219
F_minimized = S_minimized,
208220
F_open = S_open,
@@ -215,6 +227,7 @@ class EXPCL_PANDA_DISPLAY WindowProperties {
215227
LPoint2i _origin;
216228
LVector2i _size;
217229
MouseMode _mouse_mode;
230+
WindowMode _window_mode;
218231
string _title;
219232
Filename _cursor_filename;
220233
Filename _icon_filename;
@@ -235,6 +248,11 @@ operator << (ostream &out, WindowProperties::MouseMode mode);
235248
EXPCL_PANDA_DISPLAY istream &
236249
operator >> (istream &in, WindowProperties::MouseMode &mode);
237250

251+
EXPCL_PANDA_DISPLAY ostream &
252+
operator << (ostream &out, WindowProperties::WindowMode mode);
253+
EXPCL_PANDA_DISPLAY istream &
254+
operator >> (istream &in, WindowProperties::WindowMode &mode);
255+
238256

239257
INLINE ostream &operator << (ostream &out, const WindowProperties &properties);
240258

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy