don't try pass focus off to windows that dont take it

This commit is contained in:
Dana Jansens 2002-07-24 17:49:57 +00:00
parent 49c04eaf57
commit fa34ea5250
3 changed files with 40 additions and 17 deletions

View file

@ -489,11 +489,10 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
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;
@ -509,18 +508,22 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
}
// 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();
}
}

View file

@ -44,7 +44,8 @@ XWindow::XWindow(epist *epist, screen *screen, Window window)
XSelectInput(_epist->getXDisplay(), _window,
PropertyChangeMask | StructureNotifyMask);
updateHints();
updateNormalHints();
updateWMHints();
updateDimentions();
updateState();
updateDesktop();
@ -77,7 +78,7 @@ void XWindow::updateDimentions() {
}
void XWindow::updateHints() {
void XWindow::updateNormalHints() {
XSizeHints size;
long ret;
@ -101,6 +102,19 @@ void XWindow::updateHints() {
}
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;
@ -170,7 +184,9 @@ void XWindow::processEvent(const XEvent &e) {
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))
@ -219,6 +235,7 @@ void XWindow::iconify() const {
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);

View file

@ -60,6 +60,7 @@ private:
int _inc_x, _inc_y; // resize increments
int _base_x, _base_y; // base size
int _gravity;
bool _can_focus;
// states
bool _shaded;
@ -70,7 +71,8 @@ private:
bool _unmapped;
void updateDimentions();
void updateHints();
void updateNormalHints();
void updateWMHints();
void updateState();
void updateDesktop();
void updateTitle();
@ -87,6 +89,7 @@ public:
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; }