be smart about skipping focusing a window from unmap events, watch the unmap_ignore
This commit is contained in:
parent
38396b8a8d
commit
f4b87e04a2
2 changed files with 14 additions and 5 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue