X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fwindow.cc;h=1d5a219dfc92af1ec8201f28276e21a9a7bc40e8;hb=7d153b742bcdf4056ac5e70f8d039f13c12319b7;hp=15f8b11c54eac41b71e3a7006679b4125f152f74;hpb=5fed16de70c0fbe40c9e62667f80f612d027c717;p=chaz%2Fopenbox diff --git a/util/epist/window.cc b/util/epist/window.cc index 15f8b11c..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,10 +24,6 @@ # include "../../config.h" #endif // HAVE_CONFIG_H -#include "window.hh" -#include "epist.hh" -#include "../../src/XAtom.hh" - #include using std::cout; @@ -35,19 +31,31 @@ 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) { -XWindow::XWindow(Window window) : _window(window) { _unmapped = false; - XSelectInput(_display, _window, PropertyChangeMask | StructureNotifyMask); + XSelectInput(_epist->getXDisplay(), _window, + PropertyChangeMask | StructureNotifyMask); updateState(); updateDesktop(); + updateTitle(); + updateClass(); + + _epist->addWindow(this); } XWindow::~XWindow() { if (! _unmapped) - XSelectInput(_display, _window, None); + XSelectInput(_epist->getXDisplay(), _window, None); + _epist->removeWindow(this); } @@ -80,3 +88,62 @@ void XWindow::updateDesktop() { 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); +}