be smart about skipping focusing a window from unmap events, watch the unmap_ignore

This commit is contained in:
Dana Jansens 2003-01-23 15:43:55 +00:00
parent 38396b8a8d
commit f4b87e04a2
2 changed files with 14 additions and 5 deletions

View file

@ -1248,7 +1248,7 @@ void Client::fullscreen(bool fs)
} }
bool Client::focus() const bool Client::focus()
{ {
// won't try focus if the client doesn't want it, or if the window isn't // won't try focus if the client doesn't want it, or if the window isn't
// visible on the screen // visible on the screen
@ -1257,12 +1257,21 @@ bool Client::focus() const
if (_focused) return true; if (_focused) return true;
// do a check to see if the window has already been unmapped or destroyed // do a check to see if the window has already been unmapped or destroyed
// do this intelligently while watching out for unmaps we've generated
// (ignore_unmaps > 0)
XEvent ev; XEvent ev;
if (XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &ev) || if (XCheckTypedWindowEvent(**otk::display, _window, DestroyNotify, &ev)) {
XCheckTypedWindowEvent(**otk::display, _window, DestroyNotify, &ev)) {
XPutBackEvent(**otk::display, &ev); XPutBackEvent(**otk::display, &ev);
return false; return false;
} }
while (XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &ev)) {
if (ignore_unmaps) {
--ignore_unmaps;
} else {
XPutBackEvent(**otk::display, &ev);
return false;
}
}
if (_can_focus) if (_can_focus)
XSetInputFocus(**otk::display, _window, XSetInputFocus(**otk::display, _window,
@ -1397,7 +1406,7 @@ void Client::unmapHandler(const XUnmapEvent &e)
{ {
if (ignore_unmaps) { if (ignore_unmaps) {
#ifdef DEBUG #ifdef DEBUG
printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event); // printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event);
#endif // DEBUG #endif // DEBUG
ignore_unmaps--; ignore_unmaps--;
return; return;

View file

@ -580,7 +580,7 @@ BB @param window The window id that the Client class should handle
void resize(Corner anchor, int w, int h); void resize(Corner anchor, int w, int h);
//! Attempt to focus the client window //! Attempt to focus the client window
bool focus() const; bool focus();
//! Remove focus from the client window //! Remove focus from the client window
void unfocus() const; void unfocus() const;