remap option to restore and fixed abit in unmapNotifyEvent
fluxgen fluxgen
1 files changed,
39 insertions(+),
58 deletions(-)
jump to
M
src/Window.cc
→
src/Window.cc
@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.cc,v 1.69 2002/08/14 22:52:06 fluxgen Exp $ +// $Id: Window.cc,v 1.70 2002/08/16 10:50:20 fluxgen Exp $ #include "Window.hh"@@ -2800,9 +2800,10 @@ }
void FluxboxWindow::mapNotifyEvent(XMapEvent *ne) { - #ifdef GNOME +#ifdef GNOME loadGnomeAtoms(); - #endif +#endif // GNOME + if ((ne->window == client.window) && (! ne->override_redirect) && (visible)) { Fluxbox *fluxbox = Fluxbox::instance(); BaseDisplay::GrabGuard gg(*fluxbox);@@ -2826,7 +2827,7 @@
visible = true; iconic = false; - // Auto-group? + // Auto-group from tab? if (!transient) { // Grab and clear the auto-group window FluxboxWindow* autoGroupWindow = screen->useAutoGroupWindow();@@ -2848,53 +2849,21 @@ // Returns true if *this should die
// else false //------------------------------------------------- bool FluxboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { - if (ue->window == client.window) { - #ifdef DEBUG - fprintf(stderr, - I18n::instance()->getMessage( - FBNLS::WindowSet, FBNLS::WindowUnmapNotify, - "FluxboxWindow::unmapNotifyEvent() for 0x%lx\n"), - client.window); - #endif // DEBUG + if (ue->window != client.window) + return false; + +#ifdef DEBUG + fprintf(stderr, + I18n::instance()->getMessage( + FBNLS::WindowSet, FBNLS::WindowUnmapNotify, + "FluxboxWindow::unmapNotifyEvent() for 0x%lx\n"), + client.window); +#endif // DEBUG - Fluxbox *fluxbox = Fluxbox::instance(); - BaseDisplay::GrabGuard gg(*fluxbox); - fluxbox->grab(); - if (! validateClient()) - return false; + restore(false); - XChangeSaveSet(display, client.window, SetModeDelete); - XSelectInput(display, client.window, NoEventMask); + return true; // make sure this one deletes - XDeleteProperty(display, client.window, fluxbox->getWMStateAtom()); - XDeleteProperty(display, client.window, fluxbox->getFluxboxAttributesAtom()); - - XUnmapWindow(display, frame.window); - XUnmapWindow(display, client.window); - - XEvent dummy; - if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify, - &dummy)) { - #ifdef DEBUG - fprintf(stderr, - I18n::instance()->getMessage( - FBNLS::WindowSet, FBNLS::WindowUnmapNotifyReparent, - "FluxboxWindow::unmapNotifyEvent(): reparent 0x%lx to " - "root.\n"), client.window); - #endif // DEBUG - restoreGravity(); - XReparentWindow(display, client.window, screen->getRootWindow(), - client.x, client.y); - } - - XFlush(display); - - fluxbox->ungrab(); - - return true; - } - - return false; } //----------- destroyNotifyEvent -------------@@ -2904,9 +2873,9 @@ // of this FluxboxWindow else returns false.
//-------------------------------------------- bool FluxboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) { if (de->window == client.window) { - #ifdef DEBUG +#ifdef DEBUG cerr<<__FILE__<<"("<<__LINE__<<"): DestroyNotifyEvent this="<<this<<endl; - #endif +#endif // DEBUG XUnmapWindow(display, frame.window); return true; }@@ -3746,7 +3715,7 @@ if ((tr = fluxbox->searchWindow(win))) {
while (tr->client.transient) { tr = tr->client.transient; - if (tr == tr->client.transient) { //ops! something is wrong with transient + if (tr && tr == tr->client.transient) { //ops! something is wrong with transient tr->client.transient = 0; } }@@ -3761,7 +3730,7 @@ if ((tr = fluxbox->searchGroup(win, this))) {
while (tr->client.transient) { tr = tr->client.transient; - if (tr == tr->client.transient) { //ops! somehtin is wrong with transient + if (tr && tr == tr->client.transient) { //ops! somehtin is wrong with transient tr->client.transient = 0; } }@@ -3779,7 +3748,7 @@ modal = true;
} -void FluxboxWindow::restore() { +void FluxboxWindow::restore(bool remap) { XChangeSaveSet(display, client.window, SetModeDelete); XSelectInput(display, client.window, NoEventMask);@@ -3789,11 +3758,23 @@ XUnmapWindow(display, frame.window);
XUnmapWindow(display, client.window); XSetWindowBorderWidth(display, client.window, client.old_bw); - XReparentWindow(display, client.window, screen->getRootWindow(), - client.x, client.y); - XMapWindow(display, client.window); - - XFlush(display); + XEvent dummy; + if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify, + &dummy)) { +#ifdef DEBUG + fprintf(stderr, + I18n::instance()->getMessage( + FBNLS::WindowSet, FBNLS::WindowUnmapNotifyReparent, + "FluxboxWindow::restore: reparent 0x%lx to " + "root.\n"), client.window); +#endif // DEBUG + XReparentWindow(display, client.window, screen->getRootWindow(), + client.x, client.y); + } + + if (remap) + XMapWindow(display, client.window); + }