X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fwindow.cc;h=691dccd8d85d7b21f76f1548674b7f98d73bbf6c;hb=24a1e215d1f8d2ff1674847278a15336d4b671b6;hp=ebe458d4f4a3db46799324cbd5e8913316b67cd8;hpb=0aae72418670c23f3fac604aca62cc8a461704f6;p=chaz%2Fopenbox diff --git a/util/epist/window.cc b/util/epist/window.cc index ebe458d4..691dccd8 100644 --- a/util/epist/window.cc +++ b/util/epist/window.cc @@ -24,14 +24,119 @@ # 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) { + _unmapped = false; -XWindow::XWindow(Window window) : _window(window) { + XSelectInput(_epist->getXDisplay(), _window, + PropertyChangeMask | StructureNotifyMask); + updateState(); + updateDesktop(); + updateTitle(); + updateClass(); + + _epist->addWindow(this); } XWindow::~XWindow() { + if (! _unmapped) + XSelectInput(_epist->getXDisplay(), _window, None); + _epist->removeWindow(this); +} + + +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; +} + + +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; + } +}