From 909b3c5665213ef2a05ef26e33506d02829bdd93 Mon Sep 17 00:00:00 2001
From: rathnor <rathnor>
Date: Tue, 15 Apr 2003 23:09:26 +0000
Subject: raise on focus [at end of cycle], also a temporary raise while
 cycling (Simon)

---
 src/FbTk/XLayer.cc     | 23 ++++++++++++++++++++++-
 src/FbTk/XLayer.hh     |  5 ++++-
 src/FbTk/XLayerItem.cc |  6 +++++-
 src/FbTk/XLayerItem.hh |  4 +++-
 src/Screen.cc          | 17 ++++++++++++++---
 src/Window.cc          | 38 +++++++++++++++++++++++++++++++++++++-
 src/Window.hh          |  3 ++-
 7 files changed, 87 insertions(+), 9 deletions(-)

diff --git a/src/FbTk/XLayer.cc b/src/FbTk/XLayer.cc
index 43bd76c..ad1e49d 100644
--- a/src/FbTk/XLayer.cc
+++ b/src/FbTk/XLayer.cc
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: XLayer.cc,v 1.6 2003/02/18 15:08:12 rathnor Exp $
+// $Id: XLayer.cc,v 1.7 2003/04/15 23:09:24 rathnor Exp $
 
 #include "XLayer.hh"
 #include "XLayerItem.hh"
@@ -264,6 +264,27 @@ void XLayer::raise(XLayerItem &item) {
     
 }
 
+void XLayer::tempRaise(XLayerItem &item) {
+    // assume it is already in this layer
+
+    if (&item == itemList().front())
+        return; // nothing to do
+
+    iterator it = std::find(itemList().begin(), itemList().end(), &item);
+    if (it != itemList().end())
+        // don't remove it
+#ifdef DEBUG
+    else {
+        cerr<<__FILE__<<"("<<__LINE__<<"): WARNING: raise on item not in layer["<<m_layernum<<"]"<<endl;
+        return;
+    }
+#endif // DEBUG
+
+    // don't add it back to the top
+    stackBelowItem(&item, m_manager.getLowestItemAboveLayer(m_layernum));
+    
+}
+
 void XLayer::lower(XLayerItem &item) {
     // assume already in this layer
 
diff --git a/src/FbTk/XLayer.hh b/src/FbTk/XLayer.hh
index 88ba4ef..82bee5e 100644
--- a/src/FbTk/XLayer.hh
+++ b/src/FbTk/XLayer.hh
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: XLayer.hh,v 1.3 2003/02/09 14:11:14 rathnor Exp $
+// $Id: XLayer.hh,v 1.4 2003/04/15 23:09:25 rathnor Exp $
 
 
 #ifndef FBTK_XLAYER_HH
@@ -72,6 +72,9 @@ public:
     void raise(XLayerItem &item);
     void lower(XLayerItem &item);
 
+    // raise it, but don't make it permanent (i.e. restack will revert)
+    void tempRaise(XLayerItem &item);
+
     // send to next layer up
     void raiseLayer(XLayerItem &item);
     void lowerLayer(XLayerItem &item);
diff --git a/src/FbTk/XLayerItem.cc b/src/FbTk/XLayerItem.cc
index 3a3f444..fdc7fb6 100644
--- a/src/FbTk/XLayerItem.cc
+++ b/src/FbTk/XLayerItem.cc
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: XLayerItem.cc,v 1.6 2003/02/18 15:08:12 rathnor Exp $
+// $Id: XLayerItem.cc,v 1.7 2003/04/15 23:09:25 rathnor Exp $
 
 #include "XLayerItem.hh"
 #include "XLayer.hh"
@@ -56,6 +56,10 @@ void XLayerItem::lower() {
     m_layer->lower(*this);
 }
 
+void XLayerItem::tempRaise() {
+    m_layer->tempRaise(*this); 
+}
+
 void XLayerItem::stepUp() {
     m_layer->stepUp(*this);
 }
diff --git a/src/FbTk/XLayerItem.hh b/src/FbTk/XLayerItem.hh
index 1998382..bf53aa6 100644
--- a/src/FbTk/XLayerItem.hh
+++ b/src/FbTk/XLayerItem.hh
@@ -20,7 +20,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: XLayerItem.hh,v 1.6 2003/02/18 15:08:12 rathnor Exp $
+// $Id: XLayerItem.hh,v 1.7 2003/04/15 23:09:26 rathnor Exp $
 
 #ifndef FBTK_XLAYERITEM_HH
 #define FBTK_XLAYERITEM_HH
@@ -46,6 +46,8 @@ public:
 
     void raise();
     void lower();
+    void tempRaise(); // this raise gets reverted by a restack()
+
     // go above the next item visible in this layer
     void stepUp();
     void stepDown();
diff --git a/src/Screen.cc b/src/Screen.cc
index 887e8fc..bac97e9 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Screen.cc,v 1.122 2003/04/15 14:42:03 fluxgen Exp $
+// $Id: Screen.cc,v 1.123 2003/04/15 23:09:12 rathnor Exp $
 
 
 #include "Screen.hh"
@@ -1371,6 +1371,9 @@ void BScreen::nextFocus(int opts) {
             if (!cycling_focus) {
                 cycling_focus = True;
                 cycling_window = focused_list.begin();
+            } else {
+                // already cycling, so restack to put windows back in their proper order
+                m_layermanager.restack();
             }
             // if it is stacked, we want the highest window in the focused list
             // that is on the same workspace
@@ -1392,8 +1395,10 @@ void BScreen::nextFocus(int opts) {
                     (fbwin->isStuck() 
                      || fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) {
                     // either on this workspace, or stuck
-                    if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) )
+                    if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) {
+                        fbwin->tempRaise();
                         break;
+                    }
                 }
             }
             cycling_window = it;
@@ -1444,6 +1449,9 @@ void BScreen::prevFocus(int opts) {
             if (!cycling_focus) {
                 cycling_focus = True;
                 cycling_window = focused_list.end();
+            } else {
+                // already cycling, so restack to put windows back in their proper order
+                m_layermanager.restack();
             }
             // if it is stacked, we want the highest window in the focused list
             // that is on the same workspace
@@ -1466,8 +1474,10 @@ void BScreen::prevFocus(int opts) {
                     (fbwin->isStuck() 
                      || fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) {
                     // either on this workspace, or stuck
-                    if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) )
+                    if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) {
+                        fbwin->tempRaise();
                         break;
+                    }
                 }
             }
             cycling_window = it;
@@ -2167,6 +2177,7 @@ void BScreen::notifyReleasedKeys(XKeyEvent &ke) {
         WinClient *client = *cycling_window;
         focused_list.erase(cycling_window);
         focused_list.push_front(client);
+        client->fbwindow()->raise();
     }
 }
 
diff --git a/src/Window.cc b/src/Window.cc
index 69877e2..35f5be9 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Window.cc,v 1.137 2003/04/15 21:38:23 fluxgen Exp $
+// $Id: Window.cc,v 1.138 2003/04/15 23:09:13 rathnor Exp $
 
 #include "Window.hh"
 
@@ -153,6 +153,23 @@ void lowerFluxboxWindow(FluxboxWindow &win) {
     }
 }
 
+/// raise window and do the same for each transient it holds
+void tempRaiseFluxboxWindow(FluxboxWindow &win) {
+
+    if (!win.isIconic()) {
+        // don't update netizen, as it is only temporary
+        win.getLayerItem().tempRaise();
+    }
+
+    // for each transient do raise
+    std::list<FluxboxWindow *>::const_iterator it = win.getTransients().begin();
+    std::list<FluxboxWindow *>::const_iterator it_end = win.getTransients().end();
+    for (; it != it_end; ++it) {
+        if (!(*it)->isIconic())
+            tempRaiseFluxboxWindow(*(*it));
+    }
+}
+
 class SetClientCmd:public FbTk::Command {
 public:
     explicit SetClientCmd(WinClient &client):m_client(client) {
@@ -1410,6 +1427,25 @@ void FluxboxWindow::lower() {
     lowerFluxboxWindow(*bottom);
 }
 
+void FluxboxWindow::tempRaise() {
+    if (isIconic())
+        deiconify();
+
+    // get root window
+    FluxboxWindow *win = this;
+    while (win->getTransientFor()) {
+        win = win->getTransientFor();
+        assert(win != win->getTransientFor());
+    }
+    // if we don't have any root window use this as root
+    if (win == 0) 
+        win = this;
+
+    // raise this window and every transient in it
+    tempRaiseFluxboxWindow(*win);
+}
+
+
 void FluxboxWindow::raiseLayer() {
     // don't let it up to menu layer
     if (getLayerNum() == (Fluxbox::instance()->getMenuLayer()+1))
diff --git a/src/Window.hh b/src/Window.hh
index 6245b0a..a626b28 100644
--- a/src/Window.hh
+++ b/src/Window.hh
@@ -22,7 +22,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Window.hh,v 1.56 2003/04/15 18:56:42 fluxgen Exp $
+// $Id: Window.hh,v 1.57 2003/04/15 23:09:15 rathnor Exp $
 
 #ifndef	 WINDOW_HH
 #define	 WINDOW_HH
@@ -155,6 +155,7 @@ public:
     void stick(); 
     void raise();
     void lower();
+    void tempRaise();
     void raiseLayer();
     void lowerLayer();
     void moveToLayer(int layernum);
-- 
cgit v0.11.2