]> Dogcows Code - chaz/openbox/blobdiff - util/epist/window.cc
make epist not build with the rest of the source tree
[chaz/openbox] / util / epist / window.cc
index a366fc49e4af3822e7e144f84f9c11d558d923e3..691dccd8d85d7b21f76f1548674b7f98d73bbf6c 100644 (file)
 #  include "../../config.h"
 #endif // HAVE_CONFIG_H
 
+#include <iostream>
+
+using std::cout;
+using std::endl;
+using std::hex;
+using std::dec;
+
 #include "window.hh"
 #include "epist.hh"
 #include "../../src/XAtom.hh"
 
+XWindow::XWindow(epist *epist, Window window)
+  : _epist(epist), _xatom(epist->xatom()), _window(window) {
 
-XWindow::XWindow(Window window) : _window(window) {
-  XSelectInput(_display, _window, PropertyChangeMask);
+  _unmapped = false;
+
+  XSelectInput(_epist->getXDisplay(), _window,
+               PropertyChangeMask | StructureNotifyMask);
   updateState();
+  updateDesktop();
+  updateTitle();
+  updateClass();
+
+  _epist->addWindow(this);
 }
 
 
 XWindow::~XWindow() {
-  XSelectInput(_display, _window, None);
+  if (! _unmapped)
+    XSelectInput(_epist->getXDisplay(), _window, None);
+  _epist->removeWindow(this);
 }
 
 
@@ -62,3 +80,63 @@ void XWindow::updateState() {
 
   delete [] state;
 }
+
+
+void XWindow::updateDesktop() {
+  if (! _xatom->getValue(_window, XAtom::net_wm_desktop, XAtom::cardinal,
+                         static_cast<unsigned long>(_desktop)))
+    _desktop = 0;
+}
+
+
+void XWindow::updateTitle() {
+  _title = "";
+  
+  // try netwm
+  if (! _xatom->getValue(_window, XAtom::net_wm_name, XAtom::utf8, _title)) {
+    // try old x stuff
+    _xatom->getValue(_window, XAtom::wm_name, XAtom::ansi, _title);
+  }
+
+  if (_title.empty())
+    _title = "Unnamed";
+}
+
+
+void XWindow::updateClass() {
+  // set the defaults
+  _app_name = _app_class = "";
+
+  XAtom::StringVect v;
+  unsigned long num = 2;
+
+  if (! _xatom->getValue(_window, XAtom::wm_class, XAtom::ansi, num, v))
+    return;
+
+  if (num > 0) _app_name = v[0];
+  if (num > 1) _app_class = v[1];
+}
+
+
+void XWindow::processEvent(const XEvent &e) {
+  assert(e.xany.window == _window);
+
+  switch (e.type) {
+  case PropertyNotify:
+    // a client window
+    if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_state))
+      updateState();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_desktop))
+      updateDesktop();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_name) ||
+             e.xproperty.atom == _xatom->getAtom(XAtom::wm_name))
+      updateTitle();
+    else if (e.xproperty.atom == _xatom->getAtom(XAtom::wm_class))
+      updateClass();
+    break;
+  case DestroyNotify:
+  case UnmapNotify:
+    _unmapped = true;
+    break;
+  }
+}
This page took 0.021435 seconds and 4 git commands to generate.