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::
 INLINE void WindowProperties::
 set_undecorated(bool undecorated) {
 set_undecorated(bool undecorated) {
   if (undecorated) {
   if (undecorated) {
-    _flags |= F_undecorated;
+    set_window_mode(W_undecorated);
   } else {
   } else {
-    _flags &= ~F_undecorated;
+    set_window_mode(W_regular);
   }
   }
-  _specified |= S_undecorated;
 }
 }
 
 
 /**
 /**
@@ -232,7 +231,7 @@ set_undecorated(bool undecorated) {
  */
  */
 INLINE bool WindowProperties::
 INLINE bool WindowProperties::
 get_undecorated() const {
 get_undecorated() const {
-  return (_flags & F_undecorated) != 0;
+  return get_window_mode() == W_undecorated;
 }
 }
 
 
 /**
 /**
@@ -240,7 +239,7 @@ get_undecorated() const {
  */
  */
 INLINE bool WindowProperties::
 INLINE bool WindowProperties::
 has_undecorated() const {
 has_undecorated() const {
-  return ((_specified & S_undecorated) != 0);
+  return has_window_mode();
 }
 }
 
 
 /**
 /**
@@ -248,8 +247,9 @@ has_undecorated() const {
  */
  */
 INLINE void WindowProperties::
 INLINE void WindowProperties::
 clear_undecorated() {
 clear_undecorated() {
-  _specified &= ~S_undecorated;
-  _flags &= ~F_undecorated;
+  if (get_undecorated()) {
+    clear_window_mode();
+  }
 }
 }
 
 
 /**
 /**
@@ -297,11 +297,10 @@ clear_fixed_size() {
 INLINE void WindowProperties::
 INLINE void WindowProperties::
 set_fullscreen(bool fullscreen) {
 set_fullscreen(bool fullscreen) {
   if (fullscreen) {
   if (fullscreen) {
-    _flags |= F_fullscreen;
+    set_window_mode(W_fullscreen);
   } else {
   } else {
-    _flags &= ~F_fullscreen;
+    set_window_mode(W_regular);
   }
   }
-  _specified |= S_fullscreen;
 }
 }
 
 
 /**
 /**
@@ -309,7 +308,7 @@ set_fullscreen(bool fullscreen) {
  */
  */
 INLINE bool WindowProperties::
 INLINE bool WindowProperties::
 get_fullscreen() const {
 get_fullscreen() const {
-  return (_flags & F_fullscreen) != 0;
+  return get_window_mode() == W_fullscreen;
 }
 }
 
 
 /**
 /**
@@ -317,7 +316,7 @@ get_fullscreen() const {
  */
  */
 INLINE bool WindowProperties::
 INLINE bool WindowProperties::
 has_fullscreen() const {
 has_fullscreen() const {
-  return ((_specified & S_fullscreen) != 0);
+  return has_window_mode();
 }
 }
 
 
 /**
 /**
@@ -325,8 +324,9 @@ has_fullscreen() const {
  */
  */
 INLINE void WindowProperties::
 INLINE void WindowProperties::
 clear_fullscreen() {
 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;
   _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
  * 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
  * 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;
   _z_order = copy._z_order;
   _flags = copy._flags;
   _flags = copy._flags;
   _mouse_mode = copy._mouse_mode;
   _mouse_mode = copy._mouse_mode;
+  _window_mode = copy._window_mode;
   _parent_window = copy._parent_window;
   _parent_window = copy._parent_window;
 }
 }
 
 
@@ -62,8 +63,6 @@ get_config_properties() {
     props.set_origin(win_origin[0], win_origin[1]);
     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_fixed_size(win_fixed_size);
   props.set_cursor_hidden(cursor_hidden);
   props.set_cursor_hidden(cursor_hidden);
   if (!icon_filename.empty()) {
   if (!icon_filename.empty()) {
@@ -82,6 +81,7 @@ get_config_properties() {
     props.set_parent_window(NativeWindowHandle::make_subprocess(subprocess_window));
     props.set_parent_window(NativeWindowHandle::make_subprocess(subprocess_window));
   }
   }
   props.set_mouse_mode(M_absolute);
   props.set_mouse_mode(M_absolute);
+  props.set_window_mode(W_regular);
 
 
   return props;
   return props;
 }
 }
@@ -153,6 +153,7 @@ operator == (const WindowProperties &other) const {
           _icon_filename == other._icon_filename &&
           _icon_filename == other._icon_filename &&
           _cursor_filename == other._cursor_filename &&
           _cursor_filename == other._cursor_filename &&
           _mouse_mode == other._mouse_mode &&
           _mouse_mode == other._mouse_mode &&
+          _window_mode == other._window_mode &&
           _parent_window == other._parent_window);
           _parent_window == other._parent_window);
 }
 }
 
 
@@ -171,6 +172,7 @@ clear() {
   _z_order = Z_normal;
   _z_order = Z_normal;
   _flags = 0;
   _flags = 0;
   _mouse_mode = M_absolute;
   _mouse_mode = M_absolute;
+  _window_mode = W_regular;
   _parent_window = NULL;
   _parent_window = NULL;
 }
 }
 
 
@@ -213,15 +215,9 @@ add_properties(const WindowProperties &other) {
   if (other.has_title()) {
   if (other.has_title()) {
     set_title(other.get_title());
     set_title(other.get_title());
   }
   }
-  if (other.has_undecorated()) {
-    set_undecorated(other.get_undecorated());
-  }
   if (other.has_fixed_size()) {
   if (other.has_fixed_size()) {
     set_fixed_size(other.get_fixed_size());
     set_fixed_size(other.get_fixed_size());
   }
   }
-  if (other.has_fullscreen()) {
-    set_fullscreen(other.get_fullscreen());
-  }
   if (other.has_foreground()) {
   if (other.has_foreground()) {
     set_foreground(other.get_foreground());
     set_foreground(other.get_foreground());
   }
   }
@@ -249,6 +245,9 @@ add_properties(const WindowProperties &other) {
   if (other.has_mouse_mode()) {
   if (other.has_mouse_mode()) {
     set_mouse_mode(other.get_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()) {
   if (other.has_parent_window()) {
     set_parent_window(other.get_parent_window());
     set_parent_window(other.get_parent_window());
   }
   }
@@ -269,15 +268,9 @@ output(ostream &out) const {
   if (has_title()) {
   if (has_title()) {
     out << "title=\"" << get_title() << "\"" << " ";
     out << "title=\"" << get_title() << "\"" << " ";
   }
   }
-  if (has_undecorated()) {
-    out << (get_undecorated() ? "undecorated " : "!undecorated ");
-  }
   if (has_fixed_size()) {
   if (has_fixed_size()) {
     out << (get_fixed_size() ? "fixed_size " : "!fixed_size ");
     out << (get_fixed_size() ? "fixed_size " : "!fixed_size ");
   }
   }
-  if (has_fullscreen()) {
-    out << (get_fullscreen() ? "fullscreen " : "!fullscreen ");
-  }
   if (has_foreground()) {
   if (has_foreground()) {
     out << (get_foreground() ? "foreground " : "!foreground ");
     out << (get_foreground() ? "foreground " : "!foreground ");
   }
   }
@@ -305,6 +298,9 @@ output(ostream &out) const {
   if (has_mouse_mode()) {
   if (has_mouse_mode()) {
     out << get_mouse_mode() << " ";
     out << get_mouse_mode() << " ";
   }
   }
+  if (has_window_mode()) {
+    out << get_window_mode() << " ";
+  }
   if (has_parent_window()) {
   if (has_parent_window()) {
     if (get_parent_window() == NULL) {
     if (get_parent_window() == NULL) {
       out << "parent:none ";
       out << "parent:none ";
@@ -387,3 +383,38 @@ operator >> (istream &in, WindowProperties::MouseMode &mode) {
 
 
   return in;
   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,
     M_confined,
   };
   };
 
 
+  enum WindowMode {
+    W_regular,
+    W_fullscreen,
+    W_undecorated,
+  };
+
   WindowProperties();
   WindowProperties();
   INLINE WindowProperties(const WindowProperties &copy);
   INLINE WindowProperties(const WindowProperties &copy);
   void operator = (const WindowProperties &copy);
   void operator = (const WindowProperties &copy);
@@ -85,6 +91,13 @@ PUBLISHED:
   MAKE_PROPERTY2(mouse_mode, has_mouse_mode, get_mouse_mode,
   MAKE_PROPERTY2(mouse_mode, has_mouse_mode, get_mouse_mode,
                              set_mouse_mode, clear_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 void set_title(const string &title);
   INLINE const string &get_title() const;
   INLINE const string &get_title() const;
   INLINE bool has_title() const;
   INLINE bool has_title() const;
@@ -183,8 +196,8 @@ private:
     S_origin               = 0x00001,
     S_origin               = 0x00001,
     S_size                 = 0x00002,
     S_size                 = 0x00002,
     S_title                = 0x00004,
     S_title                = 0x00004,
-    S_undecorated          = 0x00008,
-    S_fullscreen           = 0x00010,
+    // UNUSED              = 0x00008,
+    // UNUSED              = 0x00010,
     S_foreground           = 0x00020,
     S_foreground           = 0x00020,
     S_minimized            = 0x00040,
     S_minimized            = 0x00040,
     S_open                 = 0x00080,
     S_open                 = 0x00080,
@@ -196,13 +209,12 @@ private:
     S_mouse_mode           = 0x02000,
     S_mouse_mode           = 0x02000,
     S_parent_window        = 0x04000,
     S_parent_window        = 0x04000,
     S_raw_mice             = 0x08000,
     S_raw_mice             = 0x08000,
+    S_window_mode          = 0x10000,
   };
   };
 
 
   // This bitmask represents the truefalse settings for various boolean flags
   // This bitmask represents the truefalse settings for various boolean flags
   // (assuming the corresponding S_* bit has been set, above).
   // (assuming the corresponding S_* bit has been set, above).
   enum Flags {
   enum Flags {
-    F_undecorated    = S_undecorated,
-    F_fullscreen     = S_fullscreen,
     F_foreground     = S_foreground,
     F_foreground     = S_foreground,
     F_minimized      = S_minimized,
     F_minimized      = S_minimized,
     F_open           = S_open,
     F_open           = S_open,
@@ -215,6 +227,7 @@ private:
   LPoint2i _origin;
   LPoint2i _origin;
   LVector2i _size;
   LVector2i _size;
   MouseMode _mouse_mode;
   MouseMode _mouse_mode;
+  WindowMode _window_mode;
   string _title;
   string _title;
   Filename _cursor_filename;
   Filename _cursor_filename;
   Filename _icon_filename;
   Filename _icon_filename;
@@ -235,6 +248,11 @@ operator << (ostream &out, WindowProperties::MouseMode mode);
 EXPCL_PANDA_DISPLAY istream &
 EXPCL_PANDA_DISPLAY istream &
 operator >> (istream &in, WindowProperties::MouseMode &mode);
 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);
 INLINE ostream &operator << (ostream &out, const WindowProperties &properties);