summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--src/FocusControl.cc3
-rw-r--r--src/Window.cc53
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 @@
1 (Format: Year/Month/Day) 1 (Format: Year/Month/Day)
2Changes for 1.0rc3: 2Changes for 1.0rc3:
3*07/01/04: 3*07/01/04:
4 * ICCCM compliance updates -- see Section 4.1.4 (Mark)
5 - Set IconicState on all unmapped clients
6 - Unmap all clients when set to IconicState
7 Window.cc
4 * Move minimized windows to the back of the focused list (Mark) 8 * Move minimized windows to the back of the focused list (Mark)
5 Window.cc FocusControl.cc/hh 9 Window.cc FocusControl.cc/hh
6*07/01/03: 10*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) {
154// move all clients in given window to back of focused list 154// move all clients in given window to back of focused list
155void FocusControl::setFocusBack(FluxboxWindow *fbwin) { 155void FocusControl::setFocusBack(FluxboxWindow *fbwin) {
156 // do nothing if there are no windows open 156 // do nothing if there are no windows open
157 if (m_focused_list.empty()) 157 // don't change focus order while cycling
158 if (m_focused_list.empty() || isCycling())
158 return; 159 return;
159 160
160 FocusedWindows::iterator it = m_focused_list.begin(); 161 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) {
1536 1536
1537 menu().hide(); 1537 menu().hide();
1538 frame().hide(); 1538 frame().hide();
1539 setState(IconicState,false);
1539} 1540}
1540 1541
1541void FluxboxWindow::show() { 1542void FluxboxWindow::show() {
@@ -1554,8 +1555,6 @@ void FluxboxWindow::iconify() {
1554 1555
1555 iconic = true; 1556 iconic = true;
1556 1557
1557 setState(IconicState, false);
1558
1559 hide(true); 1558 hide(true);
1560 1559
1561 screen().focusControl().setFocusBack(this); 1560 screen().focusControl().setFocusBack(this);
@@ -1897,16 +1896,10 @@ void FluxboxWindow::shade() {
1897 shaded = false; 1896 shaded = false;
1898 m_blackbox_attrib.flags ^= ATTRIB_SHADED; 1897 m_blackbox_attrib.flags ^= ATTRIB_SHADED;
1899 m_blackbox_attrib.attrib ^= ATTRIB_SHADED; 1898 m_blackbox_attrib.attrib ^= ATTRIB_SHADED;
1900
1901 if (m_initialized)
1902 setState(NormalState, false);
1903 } else { 1899 } else {
1904 shaded = true; 1900 shaded = true;
1905 m_blackbox_attrib.flags |= ATTRIB_SHADED; 1901 m_blackbox_attrib.flags |= ATTRIB_SHADED;
1906 m_blackbox_attrib.attrib |= ATTRIB_SHADED; 1902 m_blackbox_attrib.attrib |= ATTRIB_SHADED;
1907 // shading is the same as iconic
1908 if (m_initialized)
1909 setState(IconicState, false);
1910 } 1903 }
1911 1904
1912} 1905}
@@ -2248,10 +2241,29 @@ void FluxboxWindow::setState(unsigned long new_state, bool setting_up) {
2248 state[0] = (unsigned long) m_current_state; 2241 state[0] = (unsigned long) m_current_state;
2249 state[1] = (unsigned long) None; 2242 state[1] = (unsigned long) None;
2250 2243
2251 for_each(m_clientlist.begin(), m_clientlist.end(), 2244 FbTk::ChangeProperty chg(display, FbAtoms::instance()->getWMStateAtom(),
2252 FbTk::ChangeProperty(display, FbAtoms::instance()->getWMStateAtom(), 2245 PropModeReplace, (unsigned char *)state, 2);
2253 PropModeReplace, 2246
2254 (unsigned char *)state, 2)); 2247 ClientList::iterator it = m_clientlist.begin();
2248 ClientList::iterator it_end = m_clientlist.end();
2249 for (; it != it_end; ++it) {
2250 chg(*it);
2251
2252 // ICCCM Section 4.1.4:
2253 // Once a client's window has left the Withdrawn state, the
2254 // window will be mapped if it is in the Normal state and the
2255 // window will be unmapped if it is in the Iconic state.
2256 // Reparenting window managers must unmap the client's window when
2257 // it is in the Iconic state, even if an ancestor window being
2258 // unmapped renders the client's window unviewable. Conversely, if a
2259 // reparenting window manager renders the client's window unviewable
2260 // by unmapping an ancestor, the client's window is by definition in
2261 // the Iconic state and must also be unmapped.
2262 if (new_state == IconicState)
2263 (*it)->hide();
2264 else if (new_state == NormalState)
2265 (*it)->show();
2266 }
2255 2267
2256 saveBlackboxAttribs(); 2268 saveBlackboxAttribs();
2257 //notify state changed 2269 //notify state changed
@@ -2566,6 +2578,23 @@ void FluxboxWindow::unmapNotifyEvent(XUnmapEvent &ue) {
2566 if (client == 0) 2578 if (client == 0)
2567 return; 2579 return;
2568 2580
2581 Atom atom_return;
2582 bool ret = false;
2583 int foo;
2584 unsigned long *state, ulfoo, nitems;
2585 if (client->property(FbAtoms::instance()->getWMStateAtom(),
2586 0l, 2l, false, FbAtoms::instance()->getWMStateAtom(),
2587 &atom_return, &foo, &nitems, &ulfoo,
2588 (unsigned char **) &state) && state) {
2589
2590 if (nitems >= 1 && static_cast<unsigned long>(state[0]) != WithdrawnState);
2591 ret = true;
2592
2593 XFree(static_cast<void *>(state));
2594 if (ret)
2595 return;
2596 }
2597
2569#ifdef DEBUG 2598#ifdef DEBUG
2570 cerr<<__FILE__<<"("<<__FUNCTION__<<"): 0x"<<hex<<client->window()<<dec<<endl; 2599 cerr<<__FILE__<<"("<<__FUNCTION__<<"): 0x"<<hex<<client->window()<<dec<<endl;
2571 cerr<<__FILE__<<"("<<__FUNCTION__<<"): title="<<client->title()<<endl; 2600 cerr<<__FILE__<<"("<<__FUNCTION__<<"): title="<<client->title()<<endl;