]> Dogcows Code - chaz/openbox/commitdiff
now we know the state of windows
authorDana Jansens <danakj@orodu.net>
Fri, 12 Jul 2002 00:40:05 +0000 (00:40 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 12 Jul 2002 00:40:05 +0000 (00:40 +0000)
util/epist/process.cc
util/epist/window.cc
util/epist/window.hh

index dab1f16d2eb7fb104dc8008d457fbde3f0390474..955889634d516c168c7ac87112de24a52e6a7fd7 100644 (file)
@@ -41,10 +41,22 @@ WindowList::iterator _active = _clients.end();
 void processEvent(const XEvent &e) {
   switch (e.type) {
   case PropertyNotify:
-    if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
-      updateActiveWindow();
-    if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list))
-      updateClientList();
+    if (e.xany.window == _root) {
+      // root window
+      if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
+        updateActiveWindow();
+      if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list))
+        updateClientList();
+    } else {
+      // a client window
+      WindowList::iterator it, end = _clients.end();
+      for (it = _clients.begin(); it != end; ++it)
+        if (*it == e.xproperty.window)
+          break;
+      assert(it != end);  // this means a client somehow got removed from the
+                          // list!
+      it->updateState();
+    }
     break;
   }
 }
index ebe458d4f4a3db46799324cbd5e8913316b67cd8..a366fc49e4af3822e7e144f84f9c11d558d923e3 100644 (file)
 #endif // HAVE_CONFIG_H
 
 #include "window.hh"
+#include "epist.hh"
+#include "../../src/XAtom.hh"
 
 
 XWindow::XWindow(Window window) : _window(window) {
+  XSelectInput(_display, _window, PropertyChangeMask);
+  updateState();
 }
 
 
 XWindow::~XWindow() {
+  XSelectInput(_display, _window, None);
 }
 
 
+void XWindow::updateState() {
+  // set the defaults
+  _shaded = _iconic = _max_vert = _max_horz = false;
+  
+  unsigned long num = (unsigned) -1;
+  Atom *state;
+  if (! _xatom->getValue(_window, XAtom::net_wm_state, XAtom::atom,
+                         num, &state))
+    return;
+  for (unsigned long i = 0; i < num; ++i) {
+    if (state[i] == _xatom->getAtom(XAtom::net_wm_state_maximized_vert))
+      _max_vert = true;
+    if (state[i] == _xatom->getAtom(XAtom::net_wm_state_maximized_horz))
+      _max_horz = true;
+    if (state[i] == _xatom->getAtom(XAtom::net_wm_state_shaded))
+      _shaded = true;
+    if (state[i] == _xatom->getAtom(XAtom::net_wm_state_hidden))
+      _iconic = true;
+  }
+
+  delete [] state;
+}
index 01cb2a8046985942524c497d77946a27f00f3cea..140d63bc174c008b1883f2703364f62e658a38d4 100644 (file)
@@ -53,6 +53,8 @@ public:
   inline bool maxVert() const { return _max_vert; }
   inline bool maxHorz() const { return _max_horz; }
 
+  void updateState();
+
   bool operator == (const XWindow &w) const { return w._window == _window; }
   bool operator == (const Window &w) const { return w == _window; }
 };
This page took 0.028954 seconds and 4 git commands to generate.