From 76d490dcbb6156d44fce9986e9c557cb67f36e69 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Mon, 3 Feb 2003 13:46:13 +0000 Subject: needs cleaning --- src/FbTk/MultLayers.cc | 131 ++++++++++++++++++++++++------------------------- 1 file changed, 64 insertions(+), 67 deletions(-) diff --git a/src/FbTk/MultLayers.cc b/src/FbTk/MultLayers.cc index 7f8f584..b552b5c 100644 --- a/src/FbTk/MultLayers.cc +++ b/src/FbTk/MultLayers.cc @@ -20,46 +20,51 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: MultLayers.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $ +// $Id: MultLayers.cc,v 1.4 2003/02/03 13:46:13 fluxgen Exp $ #include "MultLayers.hh" #include "XLayer.hh" #include "XLayerItem.hh" #include "App.hh" +#include +using namespace std; + using namespace FbTk; -MultLayers::MultLayers(int numlayers) : - m_numlayers(numlayers), m_layers(numlayers) { - for (int i=0; i < numlayers; i++) { - m_layers[i] = new XLayer(*this, i); - } +MultLayers::MultLayers(int numlayers) { + for (int i=0; i < numlayers; ++i) + m_layers.push_back(new XLayer(*this, i)); } MultLayers::~MultLayers() { - // TODO delete all the layers + while (!m_layers.empty()) { + delete m_layers.back(); + m_layers.pop_back(); + } } XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) { - if (layernum >= (m_numlayers) || layernum <= 0) + if (layernum >= m_layers.size() || layernum <= 0) return 0; layernum--; // next one up XLayerItem *item = 0; - while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0) layernum--; + while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0) + layernum--; return item; } XLayerItem *MultLayers::getItemBelow(XLayerItem &item) { - XLayer *curr_layer = item.getLayer(); - cerr<<"getItemBelow xlayer = "<getItemBelow(item); + XLayerItem *ret = curr_layer.getItemBelow(item); - if (!ret) { - int num = curr_layer->getLayerNum()-1; + if (ret == 0) { + int num = curr_layer.getLayerNum()-1; while (num >= 0 && !ret) { ret = m_layers[num]->getItemBelow(item); num--; @@ -70,14 +75,14 @@ XLayerItem *MultLayers::getItemBelow(XLayerItem &item) { } XLayerItem *MultLayers::getItemAbove(XLayerItem &item) { - XLayer *curr_layer = item.getLayer(); + XLayer &curr_layer = item.getLayer(); // assume that the LayerItem does exist in a layer. - XLayerItem *ret = curr_layer->getItemAbove(item); + XLayerItem *ret = curr_layer.getItemAbove(item); if (!ret) { - ret = getLowestItemAboveLayer(curr_layer->getLayerNum()); - } + ret = getLowestItemAboveLayer(curr_layer.getLayerNum()); + } return ret; } @@ -85,84 +90,76 @@ XLayerItem *MultLayers::getItemAbove(XLayerItem &item) { void MultLayers::addToTop(XLayerItem &item, int layernum) { if (layernum < 0) layernum = 0; - else if (layernum >= m_numlayers) - layernum = m_numlayers-1; + else if (layernum >= m_layers.size()) + layernum = m_layers.size()-1; m_layers[layernum]->insert(item); restack(); } -void MultLayers::remove(XLayerItem &item) { - XLayer *curr_layer = item.getLayer(); - if (!curr_layer || curr_layer->getLayerNum() < 0 || curr_layer->getLayerNum() >= m_numlayers) { - // do nothing - return; - } - curr_layer->remove(item); -} - /* raise the item one level */ void MultLayers::raise(XLayerItem &item) { // get the layer it is in - XLayer *curr_layer = item.getLayer(); - moveToLayer(item, curr_layer->getLayerNum()-1); -} - -/* lower the item one level */ -void MultLayers::lower(XLayerItem &item) { - // get the layer it is in - XLayer *curr_layer = item.getLayer(); - moveToLayer(item, curr_layer->getLayerNum()+1); + XLayer &curr_layer = item.getLayer(); + moveToLayer(item, curr_layer.getLayerNum()-1); } void MultLayers::moveToLayer(XLayerItem &item, int layernum) { // get the layer it is in - XLayer *curr_layer = item.getLayer(); - if (!curr_layer) { - addToTop(item, layernum); - return; - } - if (curr_layer->getLayerNum() == layernum ) - // do nothing + XLayer &curr_layer = item.getLayer(); + + // do nothing if the item already is in the requested layer + if (curr_layer.getLayerNum() == layernum) return; - + + // clamp layer number if (layernum < 0) layernum = 0; - else if (layernum >= m_numlayers) - layernum = m_numlayers-1; - - curr_layer->remove(item); + else if (layernum >= m_layers.size()) + layernum = m_layers.size()-1; + // remove item from old layer and insert it into the + item.setLayer(*m_layers[layernum]); + curr_layer.remove(item); m_layers[layernum]->insert(item); } void MultLayers::restack() { - int i=0, j=0, size=0; - for (; i < m_numlayers; i++) { - size += m_layers[i]->countWindows(); + size_t winlist_size=0; + for (size_t layer=0; layer < m_layers.size(); layer++) { + winlist_size += m_layers[layer]->countWindows(); } - Window *winlist = new Window[size]; - for (i=0; i < m_numlayers; i++) { + Window *winlist = new Window[winlist_size]; + for (size_t layer=0, window=0; layer < m_layers.size(); layer++) { - XLayer::ItemList::iterator it = m_layers[i]->getItemList().begin(); - XLayer::ItemList::iterator it_end = m_layers[i]->getItemList().end(); - - for (; it != it_end; ++it) { - 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); - } - } + XLayer::ItemList::iterator item_it = m_layers[layer]->getItemList().begin(); + XLayer::ItemList::iterator item_it_end = m_layers[layer]->getItemList().end(); + for (; item_it != item_it_end; ++item_it, window++) + winlist[window] = (*item_it)->window(); } - XRestackWindows(FbTk::App::instance()->display(), winlist, size); + XRestackWindows(FbTk::App::instance()->display(), winlist, winlist_size); + + delete[] winlist; } int MultLayers::size() { int i = 0, num = 0; - for (; i < m_numlayers; i++) { + for (; i < m_layers.size(); i++) { num += m_layers[i]->countWindows(); } return num; } + +XLayer *MultLayers::getLayer(size_t num) { + if (num >= m_layers.size()) + return 0; + return m_layers[num]; +} + +const XLayer *MultLayers::getLayer(size_t num) const { + if (num >= m_layers.size()) + return 0; + return m_layers[num]; +} + -- cgit v0.11.2