X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fwindow.cc;h=691dccd8d85d7b21f76f1548674b7f98d73bbf6c;hb=a79513f3d2a34f5a81753b74392fc9f4a0cd3ee4;hp=a366fc49e4af3822e7e144f84f9c11d558d923e3;hpb=0a9130b6c76bafb553e954feafa197897e6ecbdd;p=chaz%2Fopenbox diff --git a/util/epist/window.cc b/util/epist/window.cc index a366fc49..691dccd8 100644 --- a/util/epist/window.cc +++ b/util/epist/window.cc @@ -24,19 +24,37 @@ # include "../../config.h" #endif // HAVE_CONFIG_H +#include + +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(_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; + } +}