X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fwindow.cc;h=cbd60f3733831f34274c788dc0ce83a9c98e4f35;hb=843f9726ab6fd99fe3a2f285e6c85bd2880a275f;hp=a366fc49e4af3822e7e144f84f9c11d558d923e3;hpb=0a9130b6c76bafb553e954feafa197897e6ecbdd;p=chaz%2Fopenbox diff --git a/util/epist/window.cc b/util/epist/window.cc index a366fc49..cbd60f37 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,19 +24,38 @@ # include "../../config.h" #endif // HAVE_CONFIG_H -#include "window.hh" +#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) { -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 +81,105 @@ 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; + } +} + + +void XWindow::shade(const bool sh) const { + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_wm_state, + _window, (sh ? 1 : 0), + _xatom->getAtom(XAtom::net_wm_state_shaded)); +} + + +void XWindow::close() const { + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_close_window, + _window); +} + + +void XWindow::raise() const { + XRaiseWindow(_epist->getXDisplay(), _window); +} + + +void XWindow::lower() const { + XLowerWindow(_epist->getXDisplay(), _window); +} + + +void XWindow::iconify() const { + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::wm_change_state, + _window, IconicState); +} + + +void XWindow::focus() const { + // this will also unshade the window.. + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_active_window, + _window); +} + + +void XWindow::sendTo(unsigned int dest) const { + _xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_wm_desktop, + _window, dest); +}