Browse Source

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).
Mitchell Stokes 9 years ago
parent
commit
94483df8c3

+ 55 - 14
panda/src/display/windowProperties.I

@@ -220,11 +220,10 @@ clear_title() {
 INLINE void WindowProperties::
 set_undecorated(bool undecorated) {
   if (undecorated) {
-    _flags |= F_undecorated;
+    set_window_mode(W_undecorated);
   } else {
-    _flags &= ~F_undecorated;
+    set_window_mode(W_regular);
   }
-  _specified |= S_undecorated;
 }
 
 /**
@@ -232,7 +231,7 @@ set_undecorated(bool undecorated) {
  */
 INLINE bool WindowProperties::
 get_undecorated() const {
-  return (_flags & F_undecorated) != 0;
+  return get_window_mode() == W_undecorated;
 }
 
 /**
@@ -240,7 +239,7 @@ get_undecorated() const {
  */
 INLINE bool WindowProperties::
 has_undecorated() const {
-  return ((_specified & S_undecorated) != 0);
+  return has_window_mode();
 }
 
 /**
@@ -248,8 +247,9 @@ has_undecorated() const {
  */
 INLINE void WindowProperties::
 clear_undecorated() {
-  _specified &= ~S_undecorated;
-  _flags &= ~F_undecorated;
+  if (get_undecorated()) {
+    clear_window_mode();
+  }
 }
 
 /**
@@ -297,11 +297,10 @@ clear_fixed_size() {
 INLINE void WindowProperties::
 set_fullscreen(bool fullscreen) {
   if (fullscreen) {
-    _flags |= F_fullscreen;
+    set_window_mode(W_fullscreen);
   } else {
-    _flags &= ~F_fullscreen;
+    set_window_mode(W_regular);
   }
-  _specified |= S_fullscreen;
 }
 
 /**
@@ -309,7 +308,7 @@ set_fullscreen(bool fullscreen) {
  */
 INLINE bool WindowProperties::
 get_fullscreen() const {
-  return (_flags & F_fullscreen) != 0;
+  return get_window_mode() == W_fullscreen;
 }
 
 /**
@@ -317,7 +316,7 @@ get_fullscreen() const {
  */
 INLINE bool WindowProperties::
 has_fullscreen() const {
-  return ((_specified & S_fullscreen) != 0);
+  return has_window_mode();
 }
 
 /**
@@ -325,8 +324,9 @@ has_fullscreen() const {
  */
 INLINE void WindowProperties::
 clear_fullscreen() {
-  _specified &= ~S_fullscreen;
-  _flags &= ~F_fullscreen;
+  if (get_fullscreen()) {
+    clear_window_mode();
+  }
 }
 
 /**
@@ -685,6 +685,47 @@ clear_mouse_mode() {
   _mouse_mode = M_absolute;
 }
 
+/**
+ * Specifies the mode in which the window is displayed.
+ *
+ * W_regular: a plain, decorated window
+ *
+ * W_fullscreen: fullscreen the application
+ *
+ * W_undecorated: a window with no decorations (e.g., titlebar, borders, etc.)
+ *
+ */
+INLINE void WindowProperties::
+set_window_mode(WindowMode mode) {
+  _window_mode=mode;
+  _specified |= S_window_mode;
+}
+
+/**
+ * See set_window_mode().
+ */
+INLINE WindowProperties::WindowMode WindowProperties::
+get_window_mode() const {
+ return _window_mode;
+}
+
+/**
+ *
+ */
+INLINE bool WindowProperties::
+has_window_mode() const {
+  return ((_specified & S_window_mode)!=0);
+}
+
+/**
+ * Removes the window_mode specification from the properties.
+ */
+INLINE void WindowProperties::
+clear_window_mode() {
+  _specified &= ~S_window_mode;
+  _window_mode = W_regular;
+}
+
 /**
  * Specifies the window that this window should be attached to.  If this is
  * NULL or unspecified, the window will be created as a toplevel window on the

+ 45 - 14
panda/src/display/windowProperties.cxx

@@ -39,6 +39,7 @@ operator = (const WindowProperties &copy) {
   _z_order = copy._z_order;
   _flags = copy._flags;
   _mouse_mode = copy._mouse_mode;
+  _window_mode = copy._window_mode;
   _parent_window = copy._parent_window;
 }
 
@@ -62,8 +63,6 @@ get_config_properties() {
     props.set_origin(win_origin[0], win_origin[1]);
   }
 
-  props.set_fullscreen(fullscreen);
-  props.set_undecorated(undecorated);
   props.set_fixed_size(win_fixed_size);
   props.set_cursor_hidden(cursor_hidden);
   if (!icon_filename.empty()) {
@@ -82,6 +81,7 @@ get_config_properties() {
     props.set_parent_window(NativeWindowHandle::make_subprocess(subprocess_window));
   }
   props.set_mouse_mode(M_absolute);
+  props.set_window_mode(W_regular);
 
   return props;
 }
@@ -153,6 +153,7 @@ operator == (const WindowProperties &other) const {
           _icon_filename == other._icon_filename &&
           _cursor_filename == other._cursor_filename &&
           _mouse_mode == other._mouse_mode &&
+          _window_mode == other._window_mode &&
           _parent_window == other._parent_window);
 }
 
@@ -171,6 +172,7 @@ clear() {
   _z_order = Z_normal;
   _flags = 0;
   _mouse_mode = M_absolute;
+  _window_mode = W_regular;
   _parent_window = NULL;
 }
 
@@ -213,15 +215,9 @@ add_properties(const WindowProperties &other) {
   if (other.has_title()) {
     set_title(other.get_title());
   }
-  if (other.has_undecorated()) {
-    set_undecorated(other.get_undecorated());
-  }
   if (other.has_fixed_size()) {
     set_fixed_size(other.get_fixed_size());
   }
-  if (other.has_fullscreen()) {
-    set_fullscreen(other.get_fullscreen());
-  }
   if (other.has_foreground()) {
     set_foreground(other.get_foreground());
   }
@@ -249,6 +245,9 @@ add_properties(const WindowProperties &other) {
   if (other.has_mouse_mode()) {
     set_mouse_mode(other.get_mouse_mode());
   }
+  if (other.has_window_mode()) {
+    set_window_mode(other.get_window_mode());
+  }
   if (other.has_parent_window()) {
     set_parent_window(other.get_parent_window());
   }
@@ -269,15 +268,9 @@ output(ostream &out) const {
   if (has_title()) {
     out << "title=\"" << get_title() << "\"" << " ";
   }
-  if (has_undecorated()) {
-    out << (get_undecorated() ? "undecorated " : "!undecorated ");
-  }
   if (has_fixed_size()) {
     out << (get_fixed_size() ? "fixed_size " : "!fixed_size ");
   }
-  if (has_fullscreen()) {
-    out << (get_fullscreen() ? "fullscreen " : "!fullscreen ");
-  }
   if (has_foreground()) {
     out << (get_foreground() ? "foreground " : "!foreground ");
   }
@@ -305,6 +298,9 @@ output(ostream &out) const {
   if (has_mouse_mode()) {
     out << get_mouse_mode() << " ";
   }
+  if (has_window_mode()) {
+    out << get_window_mode() << " ";
+  }
   if (has_parent_window()) {
     if (get_parent_window() == NULL) {
       out << "parent:none ";
@@ -387,3 +383,38 @@ operator >> (istream &in, WindowProperties::MouseMode &mode) {
 
   return in;
 }
+
+// WindowMode operators
+
+ostream &
+operator << (ostream &out, WindowProperties::WindowMode mode) {
+  switch (mode) {
+  case WindowProperties::W_regular:
+    return out << "regular";
+  case WindowProperties::W_fullscreen:
+    return out << "fullscreen";
+  case WindowProperties::W_undecorated:
+    return out << "undecorated";
+  }
+  return out << "**invalid WindowProperties::WindowMode(" << (int)mode << ")**";
+}
+
+istream &
+operator >> (istream &in, WindowProperties::WindowMode &mode) {
+  string word;
+  in >> word;
+
+  if (word == "regular") {
+    mode = WindowProperties::W_regular;
+  } else if (word == "fullscreen") {
+    mode = WindowProperties::W_fullscreen;
+  } else if (word == "undecorated") {
+    mode = WindowProperties::W_undecorated;
+  } else {
+    display_cat.warning()
+      << "Unknown window mode: " << word << "\n";
+    mode = WindowProperties::W_regular;
+  }
+
+  return in;
+}

+ 22 - 4
panda/src/display/windowProperties.h

@@ -40,6 +40,12 @@ PUBLISHED:
     M_confined,
   };
 
+  enum WindowMode {
+    W_regular,
+    W_fullscreen,
+    W_undecorated,
+  };
+
   WindowProperties();
   INLINE WindowProperties(const WindowProperties &copy);
   void operator = (const WindowProperties &copy);
@@ -85,6 +91,13 @@ PUBLISHED:
   MAKE_PROPERTY2(mouse_mode, has_mouse_mode, get_mouse_mode,
                              set_mouse_mode, clear_mouse_mode);
 
+  INLINE bool has_window_mode() const;
+  INLINE void set_window_mode(WindowMode mode);
+  INLINE WindowMode get_window_mode() const;
+  INLINE void clear_window_mode();
+  MAKE_PROPERTY2(window_mode, has_window_mode, get_window_mode,
+                             set_window_mode, clear_window_mode);
+
   INLINE void set_title(const string &title);
   INLINE const string &get_title() const;
   INLINE bool has_title() const;
@@ -183,8 +196,8 @@ private:
     S_origin               = 0x00001,
     S_size                 = 0x00002,
     S_title                = 0x00004,
-    S_undecorated          = 0x00008,
-    S_fullscreen           = 0x00010,
+    // UNUSED              = 0x00008,
+    // UNUSED              = 0x00010,
     S_foreground           = 0x00020,
     S_minimized            = 0x00040,
     S_open                 = 0x00080,
@@ -196,13 +209,12 @@ private:
     S_mouse_mode           = 0x02000,
     S_parent_window        = 0x04000,
     S_raw_mice             = 0x08000,
+    S_window_mode          = 0x10000,
   };
 
   // This bitmask represents the truefalse settings for various boolean flags
   // (assuming the corresponding S_* bit has been set, above).
   enum Flags {
-    F_undecorated    = S_undecorated,
-    F_fullscreen     = S_fullscreen,
     F_foreground     = S_foreground,
     F_minimized      = S_minimized,
     F_open           = S_open,
@@ -215,6 +227,7 @@ private:
   LPoint2i _origin;
   LVector2i _size;
   MouseMode _mouse_mode;
+  WindowMode _window_mode;
   string _title;
   Filename _cursor_filename;
   Filename _icon_filename;
@@ -235,6 +248,11 @@ operator << (ostream &out, WindowProperties::MouseMode mode);
 EXPCL_PANDA_DISPLAY istream &
 operator >> (istream &in, WindowProperties::MouseMode &mode);
 
+EXPCL_PANDA_DISPLAY ostream &
+operator << (ostream &out, WindowProperties::WindowMode mode);
+EXPCL_PANDA_DISPLAY istream &
+operator >> (istream &in, WindowProperties::WindowMode &mode);
+
 
 INLINE ostream &operator << (ostream &out, const WindowProperties &properties);