X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fwindow.cc;h=1d5a219dfc92af1ec8201f28276e21a9a7bc40e8;hb=7d153b742bcdf4056ac5e70f8d039f13c12319b7;hp=ebe458d4f4a3db46799324cbd5e8913316b67cd8;hpb=0aae72418670c23f3fac604aca62cc8a461704f6;p=chaz%2Fopenbox diff --git a/util/epist/window.cc b/util/epist/window.cc index ebe458d4..1d5a219d 100644 --- a/util/epist/window.cc +++ b/util/epist/window.cc @@ -1,5 +1,5 @@ // -*- mode: C++; indent-tabs-mode: nil; -*- -// window.cc for Epistory - a key handler for NETWM/EWMH window managers. +// window.cc for Epistophy - a key handler for NETWM/EWMH window managers. // Copyright (c) 2002 - 2002 Ben Jansens // // Permission is hereby granted, free of charge, to any person obtaining a @@ -24,14 +24,126 @@ # include "../../config.h" #endif // HAVE_CONFIG_H +#include + +using std::cout; +using std::endl; +using std::hex; +using std::dec; + +#include "epist.hh" +#include "screen.hh" #include "window.hh" +#include "../../src/XAtom.hh" + +XWindow::XWindow(epist *epist, screen *screen, Window window) + : _epist(epist), _screen(screen), _xatom(epist->xatom()), _window(window) { + + _unmapped = false; + XSelectInput(_epist->getXDisplay(), _window, + PropertyChangeMask | StructureNotifyMask); + updateState(); + updateDesktop(); + updateTitle(); + updateClass(); -XWindow::XWindow(Window window) : _window(window) { + _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; + } +} + + +void XWindow::shade(const bool sh) const { + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_wm_state, + _window, (sh ? 1 : 0), XAtom::net_wm_state_shaded); +}