classname = (*_active)->appClass();
WindowList::const_iterator target = _active,
- first = _active,
begin = _clients.begin(),
end = _clients.end();
- do {
+ while (1) {
if (forward) {
if (target == end) {
target = begin;
}
// must be no window to focus
- if (target == first)
+ if (target == _active)
return;
- } while ((*target)->iconic() ||
- (! allscreens && (*target)->getScreen() != this) ||
- (! alldesktops &&
- (*target)->desktop() != _active_desktop &&
- (*target)->desktop() != 0xffffffff) ||
- (sameclass && ! classname.empty() &&
- (*target)->appClass() != classname));
-
- if (target != _clients.end())
- (*target)->focus();
+
+ // determine if this window is invalid for cycling to
+ const XWindow *t = *target;
+ if (t->iconic()) continue;
+ if (! allscreens && t->getScreen() != this) continue;
+ if (! alldesktops && ! (t->desktop() == _active_desktop ||
+ t->desktop() == 0xffffffff)) continue;
+ if (sameclass && ! classname.empty() &&
+ t->appClass() != classname) continue;
+ if (! t->canFocus()) continue;
+
+ // found a good window!
+ t->focus();
+ }
}
XSelectInput(_epist->getXDisplay(), _window,
PropertyChangeMask | StructureNotifyMask);
- updateHints();
+ updateNormalHints();
+ updateWMHints();
updateDimentions();
updateState();
updateDesktop();
}
-void XWindow::updateHints() {
+void XWindow::updateNormalHints() {
XSizeHints size;
long ret;
}
+void XWindow::updateWMHints() {
+ XWMHints *hints;
+
+ if ((hints = XGetWMHints(_epist->getXDisplay(), _window)) != NULL) {
+ _can_focus = hints->input;
+ XFree(hints);
+ } else {
+ // assume a window takes input if it doesnt specify
+ _can_focus = True;
+ }
+}
+
+
void XWindow::updateState() {
// set the defaults
_shaded = _iconic = _max_vert = _max_horz = false;
break;
case PropertyNotify:
if (e.xproperty.atom == XA_WM_NORMAL_HINTS)
- updateHints();
+ updateNormalHints();
+ if (e.xproperty.atom == XA_WM_HINTS)
+ updateWMHints();
else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_state))
updateState();
else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_wm_desktop))
void XWindow::focus() const {
+ cout << "Focusing window: 0x" << hex << _window << dec << endl;
// this will cause the window to be uniconified also
_xatom->sendClientMessage(_screen->rootWindow(), XAtom::net_active_window,
_window);
int _inc_x, _inc_y; // resize increments
int _base_x, _base_y; // base size
int _gravity;
+ bool _can_focus;
// states
bool _shaded;
bool _unmapped;
void updateDimentions();
- void updateHints();
+ void updateNormalHints();
+ void updateWMHints();
void updateState();
void updateDesktop();
void updateTitle();
inline const std::string &title() const { return _title; }
inline const std::string &appName() const { return _app_name; }
inline const std::string &appClass() const { return _app_class; }
+ inline bool canFocus() const { return _can_focus; }
inline bool shaded() const { return _shaded; }
inline bool iconic() const { return _iconic; }