now we know the state of windows
This commit is contained in:
parent
cf3d512a99
commit
0a9130b6c7
3 changed files with 45 additions and 4 deletions
|
@ -41,10 +41,22 @@ WindowList::iterator _active = _clients.end();
|
||||||
void processEvent(const XEvent &e) {
|
void processEvent(const XEvent &e) {
|
||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case PropertyNotify:
|
case PropertyNotify:
|
||||||
if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
|
if (e.xany.window == _root) {
|
||||||
updateActiveWindow();
|
// root window
|
||||||
if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list))
|
if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
|
||||||
updateClientList();
|
updateActiveWindow();
|
||||||
|
if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list))
|
||||||
|
updateClientList();
|
||||||
|
} else {
|
||||||
|
// a client window
|
||||||
|
WindowList::iterator it, end = _clients.end();
|
||||||
|
for (it = _clients.begin(); it != end; ++it)
|
||||||
|
if (*it == e.xproperty.window)
|
||||||
|
break;
|
||||||
|
assert(it != end); // this means a client somehow got removed from the
|
||||||
|
// list!
|
||||||
|
it->updateState();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,13 +25,40 @@
|
||||||
#endif // HAVE_CONFIG_H
|
#endif // HAVE_CONFIG_H
|
||||||
|
|
||||||
#include "window.hh"
|
#include "window.hh"
|
||||||
|
#include "epist.hh"
|
||||||
|
#include "../../src/XAtom.hh"
|
||||||
|
|
||||||
|
|
||||||
XWindow::XWindow(Window window) : _window(window) {
|
XWindow::XWindow(Window window) : _window(window) {
|
||||||
|
XSelectInput(_display, _window, PropertyChangeMask);
|
||||||
|
updateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
XWindow::~XWindow() {
|
XWindow::~XWindow() {
|
||||||
|
XSelectInput(_display, _window, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -53,6 +53,8 @@ public:
|
||||||
inline bool maxVert() const { return _max_vert; }
|
inline bool maxVert() const { return _max_vert; }
|
||||||
inline bool maxHorz() const { return _max_horz; }
|
inline bool maxHorz() const { return _max_horz; }
|
||||||
|
|
||||||
|
void updateState();
|
||||||
|
|
||||||
bool operator == (const XWindow &w) const { return w._window == _window; }
|
bool operator == (const XWindow &w) const { return w._window == _window; }
|
||||||
bool operator == (const Window &w) const { return w == _window; }
|
bool operator == (const Window &w) const { return w == _window; }
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue