]> Dogcows Code - chaz/openbox/commitdiff
allow for the client to be validated.
authorDana Jansens <danakj@orodu.net>
Wed, 29 Jan 2003 08:58:28 +0000 (08:58 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 29 Jan 2003 08:58:28 +0000 (08:58 +0000)
don't manage override_redirect windows.
don't manage windows for whome get attributes fails.
validate the client before managing it.
validate the client in functions that query stuff off it: propertyHandler and clientMessageHandler

src/client.cc
src/client.hh

index 77906e801a90bdb9b39cb9e44014b914330c0d8c..3939b0c61ada1b63278e7d0691ccf392da3cf722 100644 (file)
@@ -49,6 +49,8 @@ Client::Client(int screen, Window window)
   _layer = Layer_Normal;
   // default to not urgent
   _urgent = false;
+  // not positioned unless specified
+  _positioned = false;
   
   getArea();
   getDesktop();
@@ -115,6 +117,21 @@ Client::~Client()
 }
 
 
+bool Client::validate() const
+{
+  XSync(**otk::display, false); // get all events on the server
+
+  XEvent e;
+  if (XCheckTypedWindowEvent(**otk::display, _window, DestroyNotify, &e) ||
+      XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &e)) {
+    XPutBackEvent(**otk::display, &e);
+    return false;
+  }
+
+  return true;
+}
+
+
 void Client::getGravity()
 {
   XWindowAttributes wattrib;
@@ -636,6 +653,9 @@ void Client::updateTransientFor()
 void Client::propertyHandler(const XPropertyEvent &e)
 {
   otk::EventHandler::propertyHandler(e);
+
+  // validate cuz we query stuff off the client here
+  if (!validate()) return;
   
   // compress changes to a single property into a single change
   XEvent ce;
@@ -910,6 +930,9 @@ void Client::clientMessageHandler(const XClientMessageEvent &e)
 {
   otk::EventHandler::clientMessageHandler(e);
   
+  // validate cuz we query stuff off the client here
+  if (!validate()) return;
+  
   if (e.format != 32) return;
 
   if (e.message_type == otk::Property::atoms.wm_change_state) {
index 0d8465482313398ebb91b38c68ff3a0f6b6d64f3..4bc7a517140df0ac4efb9af4be88e68d491310bf 100644 (file)
@@ -602,6 +602,14 @@ BB    @param window The window id that the Client class should handle
   //! Remove focus from the client window
   void unfocus() const;
 
+  //! Validate client, by making sure no Destroy or Unmap events exist in
+  //! the event queue for the window.
+  /*!
+    @return true if the client is valid; false if the client has already
+            been unmapped/destroyed, and so is invalid.
+  */
+  bool validate() const;
+  
   virtual void focusHandler(const XFocusChangeEvent &e);
   virtual void unfocusHandler(const XFocusChangeEvent &e);
   virtual void propertyHandler(const XPropertyEvent &e);
This page took 0.02576 seconds and 4 git commands to generate.