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