raise on focus [at end of cycle], also a temporary raise while cycling

(Simon)
This commit is contained in:
rathnor 2003-04-15 23:09:26 +00:00
parent 4ca88642fa
commit 909b3c5665
7 changed files with 87 additions and 9 deletions

View file

@ -20,7 +20,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 "XLayer.hh"
#include "XLayerItem.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) { void XLayer::lower(XLayerItem &item) {
// assume already in this layer // assume already in this layer

View file

@ -20,7 +20,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 #ifndef FBTK_XLAYER_HH
@ -72,6 +72,9 @@ public:
void raise(XLayerItem &item); void raise(XLayerItem &item);
void lower(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 // send to next layer up
void raiseLayer(XLayerItem &item); void raiseLayer(XLayerItem &item);
void lowerLayer(XLayerItem &item); void lowerLayer(XLayerItem &item);

View file

@ -20,7 +20,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 "XLayerItem.hh"
#include "XLayer.hh" #include "XLayer.hh"
@ -56,6 +56,10 @@ void XLayerItem::lower() {
m_layer->lower(*this); m_layer->lower(*this);
} }
void XLayerItem::tempRaise() {
m_layer->tempRaise(*this);
}
void XLayerItem::stepUp() { void XLayerItem::stepUp() {
m_layer->stepUp(*this); m_layer->stepUp(*this);
} }

View file

@ -20,7 +20,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 #ifndef FBTK_XLAYERITEM_HH
#define FBTK_XLAYERITEM_HH #define FBTK_XLAYERITEM_HH
@ -46,6 +46,8 @@ public:
void raise(); void raise();
void lower(); void lower();
void tempRaise(); // this raise gets reverted by a restack()
// go above the next item visible in this layer // go above the next item visible in this layer
void stepUp(); void stepUp();
void stepDown(); void stepDown();

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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" #include "Screen.hh"
@ -1371,6 +1371,9 @@ void BScreen::nextFocus(int opts) {
if (!cycling_focus) { if (!cycling_focus) {
cycling_focus = True; cycling_focus = True;
cycling_window = focused_list.begin(); 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 // if it is stacked, we want the highest window in the focused list
// that is on the same workspace // that is on the same workspace
@ -1392,8 +1395,10 @@ void BScreen::nextFocus(int opts) {
(fbwin->isStuck() (fbwin->isStuck()
|| fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) { || fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) {
// either on this workspace, or stuck // either on this workspace, or stuck
if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) {
fbwin->tempRaise();
break; break;
}
} }
} }
cycling_window = it; cycling_window = it;
@ -1444,6 +1449,9 @@ void BScreen::prevFocus(int opts) {
if (!cycling_focus) { if (!cycling_focus) {
cycling_focus = True; cycling_focus = True;
cycling_window = focused_list.end(); 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 // if it is stacked, we want the highest window in the focused list
// that is on the same workspace // that is on the same workspace
@ -1466,8 +1474,10 @@ void BScreen::prevFocus(int opts) {
(fbwin->isStuck() (fbwin->isStuck()
|| fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) { || fbwin->getWorkspaceNumber() == getCurrentWorkspaceID())) {
// either on this workspace, or stuck // either on this workspace, or stuck
if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) if (! (doSkipWindow(fbwin, opts) || !fbwin->setInputFocus()) ) {
fbwin->tempRaise();
break; break;
}
} }
} }
cycling_window = it; cycling_window = it;
@ -2167,6 +2177,7 @@ void BScreen::notifyReleasedKeys(XKeyEvent &ke) {
WinClient *client = *cycling_window; WinClient *client = *cycling_window;
focused_list.erase(cycling_window); focused_list.erase(cycling_window);
focused_list.push_front(client); focused_list.push_front(client);
client->fbwindow()->raise();
} }
} }

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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" #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 { class SetClientCmd:public FbTk::Command {
public: public:
explicit SetClientCmd(WinClient &client):m_client(client) { explicit SetClientCmd(WinClient &client):m_client(client) {
@ -1410,6 +1427,25 @@ void FluxboxWindow::lower() {
lowerFluxboxWindow(*bottom); 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() { void FluxboxWindow::raiseLayer() {
// don't let it up to menu layer // don't let it up to menu layer
if (getLayerNum() == (Fluxbox::instance()->getMenuLayer()+1)) if (getLayerNum() == (Fluxbox::instance()->getMenuLayer()+1))

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // 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 #ifndef WINDOW_HH
#define WINDOW_HH #define WINDOW_HH
@ -155,6 +155,7 @@ public:
void stick(); void stick();
void raise(); void raise();
void lower(); void lower();
void tempRaise();
void raiseLayer(); void raiseLayer();
void lowerLayer(); void lowerLayer();
void moveToLayer(int layernum); void moveToLayer(int layernum);