From e71346bd50f28be68ea8ca51f55dab2af23409fa Mon Sep 17 00:00:00 2001 From: markt Date: Thu, 4 Jan 2007 02:15:29 +0000 Subject: set IconicState on all unmapped clients, and unmap all clients when set to IconicState also, a little bug fix for previous commit --- ChangeLog | 4 ++++ src/FocusControl.cc | 3 ++- src/Window.cc | 53 +++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index ae88888..4ac4991 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,10 @@ (Format: Year/Month/Day) Changes for 1.0rc3: *07/01/04: + * ICCCM compliance updates -- see Section 4.1.4 (Mark) + - Set IconicState on all unmapped clients + - Unmap all clients when set to IconicState + Window.cc * Move minimized windows to the back of the focused list (Mark) Window.cc FocusControl.cc/hh *07/01/03: diff --git a/src/FocusControl.cc b/src/FocusControl.cc index d09738d..f363f30 100644 --- a/src/FocusControl.cc +++ b/src/FocusControl.cc @@ -154,7 +154,8 @@ void FocusControl::addFocusBack(WinClient &client) { // move all clients in given window to back of focused list void FocusControl::setFocusBack(FluxboxWindow *fbwin) { // do nothing if there are no windows open - if (m_focused_list.empty()) + // don't change focus order while cycling + if (m_focused_list.empty() || isCycling()) return; FocusedWindows::iterator it = m_focused_list.begin(); diff --git a/src/Window.cc b/src/Window.cc index 53ec88d..9d79deb 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -1536,6 +1536,7 @@ void FluxboxWindow::hide(bool interrupt_moving) { menu().hide(); frame().hide(); + setState(IconicState,false); } void FluxboxWindow::show() { @@ -1554,8 +1555,6 @@ void FluxboxWindow::iconify() { iconic = true; - setState(IconicState, false); - hide(true); screen().focusControl().setFocusBack(this); @@ -1897,16 +1896,10 @@ void FluxboxWindow::shade() { shaded = false; m_blackbox_attrib.flags ^= ATTRIB_SHADED; m_blackbox_attrib.attrib ^= ATTRIB_SHADED; - - if (m_initialized) - setState(NormalState, false); } else { shaded = true; m_blackbox_attrib.flags |= ATTRIB_SHADED; m_blackbox_attrib.attrib |= ATTRIB_SHADED; - // shading is the same as iconic - if (m_initialized) - setState(IconicState, false); } } @@ -2248,10 +2241,29 @@ void FluxboxWindow::setState(unsigned long new_state, bool setting_up) { state[0] = (unsigned long) m_current_state; state[1] = (unsigned long) None; - for_each(m_clientlist.begin(), m_clientlist.end(), - FbTk::ChangeProperty(display, FbAtoms::instance()->getWMStateAtom(), - PropModeReplace, - (unsigned char *)state, 2)); + FbTk::ChangeProperty chg(display, FbAtoms::instance()->getWMStateAtom(), + PropModeReplace, (unsigned char *)state, 2); + + ClientList::iterator it = m_clientlist.begin(); + ClientList::iterator it_end = m_clientlist.end(); + for (; it != it_end; ++it) { + chg(*it); + + // ICCCM Section 4.1.4: + // Once a client's window has left the Withdrawn state, the + // window will be mapped if it is in the Normal state and the + // window will be unmapped if it is in the Iconic state. + // Reparenting window managers must unmap the client's window when + // it is in the Iconic state, even if an ancestor window being + // unmapped renders the client's window unviewable. Conversely, if a + // reparenting window manager renders the client's window unviewable + // by unmapping an ancestor, the client's window is by definition in + // the Iconic state and must also be unmapped. + if (new_state == IconicState) + (*it)->hide(); + else if (new_state == NormalState) + (*it)->show(); + } saveBlackboxAttribs(); //notify state changed @@ -2566,6 +2578,23 @@ void FluxboxWindow::unmapNotifyEvent(XUnmapEvent &ue) { if (client == 0) return; + Atom atom_return; + bool ret = false; + int foo; + unsigned long *state, ulfoo, nitems; + if (client->property(FbAtoms::instance()->getWMStateAtom(), + 0l, 2l, false, FbAtoms::instance()->getWMStateAtom(), + &atom_return, &foo, &nitems, &ulfoo, + (unsigned char **) &state) && state) { + + if (nitems >= 1 && static_cast(state[0]) != WithdrawnState); + ret = true; + + XFree(static_cast(state)); + if (ret) + return; + } + #ifdef DEBUG cerr<<__FILE__<<"("<<__FUNCTION__<<"): 0x"<window()<