From f4b87e04a2a1d285f7b6f93b3db08f040ba5c32c Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 23 Jan 2003 15:43:55 +0000 Subject: [PATCH] be smart about skipping focusing a window from unmap events, watch the unmap_ignore --- src/client.cc | 17 +++++++++++++---- src/client.hh | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/client.cc b/src/client.cc index 94813a2e..91d61f4b 100644 --- a/src/client.cc +++ b/src/client.cc @@ -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 // visible on the screen @@ -1257,12 +1257,21 @@ bool Client::focus() const if (_focused) return true; // 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; - if (XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &ev) || - XCheckTypedWindowEvent(**otk::display, _window, DestroyNotify, &ev)) { + if (XCheckTypedWindowEvent(**otk::display, _window, DestroyNotify, &ev)) { XPutBackEvent(**otk::display, &ev); return false; } + while (XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &ev)) { + if (ignore_unmaps) { + --ignore_unmaps; + } else { + XPutBackEvent(**otk::display, &ev); + return false; + } + } if (_can_focus) XSetInputFocus(**otk::display, _window, @@ -1397,7 +1406,7 @@ void Client::unmapHandler(const XUnmapEvent &e) { if (ignore_unmaps) { #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 ignore_unmaps--; return; diff --git a/src/client.hh b/src/client.hh index 8f04dc64..420a8c4a 100644 --- a/src/client.hh +++ b/src/client.hh @@ -580,7 +580,7 @@ BB @param window The window id that the Client class should handle void resize(Corner anchor, int w, int h); //! Attempt to focus the client window - bool focus() const; + bool focus(); //! Remove focus from the client window void unfocus() const; -- 2.45.2