This commit is contained in:
fluxgen 2003-02-03 13:45:23 +00:00
parent 4870c5f091
commit 7e2187d8c5

View file

@ -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.3 2003/02/02 16:32:41 rathnor Exp $
// $Id: XLayer.cc,v 1.4 2003/02/03 13:45:23 fluxgen Exp $
#include "XLayer.hh"
#include "XLayerItem.hh"
@ -35,45 +35,42 @@ XLayer::XLayer(MultLayers &manager, int layernum):
}
XLayer::~XLayer() {
}
void XLayer::restack() {
int numWindows = countWindows();
int num_windows = countWindows();
// each LayerItem can contain several windows
iterator it = itemList().begin();
iterator it_end = itemList().end();
it = itemList().begin();
it_end = itemList().end();
Window *winlist = new Window[numWindows];
Window *winlist = new Window[num_windows];
size_t j=0;
for (size_t i=0; it != it_end; ++it, i++) {
XLayerItem::Windows::const_iterator wit = (*it)->getWindows().begin();
XLayerItem::Windows::const_iterator wit_end = (*it)->getWindows().end();
for (; wit != wit_end; ++wit, j++) {
winlist[j] = (*wit);
}
for (size_t window=0; it != it_end; ++it, window++) {
winlist[window] = (*it)->window();
}
XRestackWindows(FbTk::App::instance()->display(), winlist, numWindows);
XRestackWindows(FbTk::App::instance()->display(), winlist, num_windows);
delete [] winlist;
}
int XLayer::countWindows() {
int numWindows = 0;
int num_windows = 0;
iterator it = itemList().begin();
iterator it_end = itemList().end();
for (size_t i=0; it != it_end; ++it, i++) {
numWindows += (*it)->numWindows();
num_windows ++; // one window per item
}
return numWindows;
return num_windows;
}
void XLayer::stackBelowItem(XLayerItem *item, XLayerItem *above) {
//!! What????
// little optimisation
Window *winlist;
/* Window *winlist;
size_t i, size, num = item->numWindows();
if (!above) { // must need to go right to top
@ -105,61 +102,70 @@ void XLayer::stackBelowItem(XLayerItem *item, XLayerItem *above) {
XRestackWindows(FbTk::App::instance()->display(), winlist, size);
delete [] winlist;
*/
}
XLayer::iterator XLayer::insert(XLayerItem &item, unsigned int pos) {
#ifdef DEBUG
if (pos != 0)
if (pos != 0)//!! Why????
cerr<<__FILE__<<"("<<__LINE__<<"): Insert using non-zero position not valid in XLayer"<<endl;
#endif // DEBUG
itemList().push_front(&item);
item.setLayer(this);
// restack below next window up
item.setLayerIterator(itemList().begin());
// item.setLayerIterator(itemList().begin());
stackBelowItem(&item, m_manager.getLowestItemAboveLayer(m_layernum));
return itemList().begin();
}
void XLayer::remove(XLayerItem &item) {
itemList().erase(item.getLayerIterator());
item.setLayer(0);
iterator it = itemList().begin();
iterator it_end = itemList().end();
for (; it != it_end; ++it) {
if (*it == &item)
itemList().erase(it);
}
}
void XLayer::cycleUp() {
// need to find highest visible window, and move it to bottom
iterator it = itemList().begin();
iterator it_end = itemList().end();
while (it != it_end && !(*it)->visible()) ++it;
while (it != it_end && !(*it)->visible())
++it;
// if there is something to do
if (it != it_end) {
if (it != it_end)
lower(**it);
}
}
void XLayer::cycleDown() {
// need to find highest visible window, and move it to bottom
reverse_iterator it = itemList().rbegin();
reverse_iterator it_end = itemList().rend();
while (it != it_end && !(*it)->visible()) ++it;
while (it != it_end && !(*it)->visible())
++it;
// if there is something to do
if (it != it_end) {
if (it != it_end)
raise(**it);
}
}
void XLayer::stepUp(XLayerItem &item) {
// need to find next visible window upwards, and put it above that
if (&item == itemList().front()) return; // nothing to do
if (&item == itemList().front())
return; // nothing to do
//!! better stable and slow than buggy!
/*
// TODO: is there a better way of doing this?
iterator it = item.getLayerIterator();
it--;
while ((*it) != itemList().front() && !(*it)->visible()) --it;
while ((*it) != itemList().front() && !(*it)->visible())
--it;
if (*it == itemList().front() && !(*it)->visible()) {
// reached front item, but it wasn't visible, therefore it was already raised
@ -176,33 +182,36 @@ void XLayer::stepUp(XLayerItem &item) {
stackBelowItem(&item, *it);
}
}
*/
}
void XLayer::stepDown(XLayerItem &item) {
// need to find next visible window down, and put it below that
if (&item == itemList().back()) return; // nothing to do
if (&item == itemList().back())
return; // nothing to do
iterator it = item.getLayerIterator();
//!! better stable and slow than buggy!
/* iterator it = item.getLayerIterator();
it++;
iterator it_end = itemList().end();
while (it != it_end && !(*it)->visible()) ++it;
while (it != it_end && !(*it)->visible())
++it;
if (it != it_end) {
if (it != it_end)
stackBelowItem(&item, *it);
}
*/
}
//!!
void XLayer::raise(XLayerItem &item) {
// assume it is already in this layer
if (&item == itemList().front()) {
if (&item == itemList().front())
return; // nothing to do
}
itemList().erase(item.getLayerIterator());
// itemList().erase(item.getLayerIterator());
itemList().push_front(&item);
item.setLayerIterator(itemList().begin());
// item.setLayerIterator(itemList().begin());
stackBelowItem(&item, m_manager.getLowestItemAboveLayer(m_layernum));
}
@ -212,6 +221,8 @@ void XLayer::lower(XLayerItem &item) {
if (&item == itemList().back())
return; // nothing to do
//!! better stable and slow than buggy!
/*
itemList().erase(item.getLayerIterator());
itemList().push_back(&item);
iterator it = itemList().end();
@ -219,28 +230,33 @@ void XLayer::lower(XLayerItem &item) {
item.setLayerIterator(it);
it--;
stackBelowItem(&item, *it); // must exist, otherwise item must == itemList().back()
*/
}
XLayerItem *XLayer::getLowestItem() {
if (itemList().empty()) return 0;
else return itemList().back();
if (itemList().empty())
return 0;
else
return itemList().back();
}
XLayerItem *XLayer::getItemBelow(XLayerItem &item) {
iterator it = item.getLayerIterator();
if (it == itemList().begin()) {
//!! better stable and slow than buggy!
/* iterator it = item.getLayerIterator();
if (it == itemList().begin())
return 0;
} else {
else
return *(--it);
}
*/
}
XLayerItem *XLayer::getItemAbove(XLayerItem &item) {
iterator it = item.getLayerIterator();
//!! better stable and slow than buggy!
/* iterator it = item.getLayerIterator();
it++;
if (it == itemList().end()) {
if (it == itemList().end())
return 0;
} else {
else
return *it;
}
*/
}