summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbTk/MultLayers.cc131
1 files 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 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: MultLayers.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $ 23// $Id: MultLayers.cc,v 1.4 2003/02/03 13:46:13 fluxgen Exp $
24 24
25#include "MultLayers.hh" 25#include "MultLayers.hh"
26#include "XLayer.hh" 26#include "XLayer.hh"
27#include "XLayerItem.hh" 27#include "XLayerItem.hh"
28#include "App.hh" 28#include "App.hh"
29 29
30#include <iostream>
31using namespace std;
32
30using namespace FbTk; 33using namespace FbTk;
31 34
32MultLayers::MultLayers(int numlayers) : 35MultLayers::MultLayers(int numlayers) {
33 m_numlayers(numlayers), m_layers(numlayers) { 36 for (int i=0; i < numlayers; ++i)
34 for (int i=0; i < numlayers; i++) { 37 m_layers.push_back(new XLayer(*this, i));
35 m_layers[i] = new XLayer(*this, i);
36 }
37} 38}
38 39
39MultLayers::~MultLayers() { 40MultLayers::~MultLayers() {
40 // TODO delete all the layers 41 while (!m_layers.empty()) {
42 delete m_layers.back();
43 m_layers.pop_back();
44 }
41} 45}
42 46
43 47
44XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) { 48XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) {
45 if (layernum >= (m_numlayers) || layernum <= 0) 49 if (layernum >= m_layers.size() || layernum <= 0)
46 return 0; 50 return 0;
47 51
48 layernum--; // next one up 52 layernum--; // next one up
49 XLayerItem *item = 0; 53 XLayerItem *item = 0;
50 while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0) layernum--; 54 while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0)
55 layernum--;
51 return item; 56 return item;
52 57
53} 58}
54 59
55XLayerItem *MultLayers::getItemBelow(XLayerItem &item) { 60XLayerItem *MultLayers::getItemBelow(XLayerItem &item) {
56 XLayer *curr_layer = item.getLayer(); 61 XLayer &curr_layer = item.getLayer();
57 cerr<<"getItemBelow xlayer = "<<hex<<curr_layer<<endl; 62
58 // assume that the LayerItem does exist in a layer. 63 // assume that the LayerItem does exist in a layer.
59 XLayerItem *ret = curr_layer->getItemBelow(item); 64 XLayerItem *ret = curr_layer.getItemBelow(item);
60 65
61 if (!ret) { 66 if (ret == 0) {
62 int num = curr_layer->getLayerNum()-1; 67 int num = curr_layer.getLayerNum()-1;
63 while (num >= 0 && !ret) { 68 while (num >= 0 && !ret) {
64 ret = m_layers[num]->getItemBelow(item); 69 ret = m_layers[num]->getItemBelow(item);
65 num--; 70 num--;
@@ -70,14 +75,14 @@ XLayerItem *MultLayers::getItemBelow(XLayerItem &item) {
70} 75}
71 76
72XLayerItem *MultLayers::getItemAbove(XLayerItem &item) { 77XLayerItem *MultLayers::getItemAbove(XLayerItem &item) {
73 XLayer *curr_layer = item.getLayer(); 78 XLayer &curr_layer = item.getLayer();
74 79
75 // assume that the LayerItem does exist in a layer. 80 // assume that the LayerItem does exist in a layer.
76 XLayerItem *ret = curr_layer->getItemAbove(item); 81 XLayerItem *ret = curr_layer.getItemAbove(item);
77 82
78 if (!ret) { 83 if (!ret) {
79 ret = getLowestItemAboveLayer(curr_layer->getLayerNum()); 84 ret = getLowestItemAboveLayer(curr_layer.getLayerNum());
80 } 85 }
81 86
82 return ret; 87 return ret;
83} 88}
@@ -85,84 +90,76 @@ XLayerItem *MultLayers::getItemAbove(XLayerItem &item) {
85void MultLayers::addToTop(XLayerItem &item, int layernum) { 90void MultLayers::addToTop(XLayerItem &item, int layernum) {
86 if (layernum < 0) 91 if (layernum < 0)
87 layernum = 0; 92 layernum = 0;
88 else if (layernum >= m_numlayers) 93 else if (layernum >= m_layers.size())
89 layernum = m_numlayers-1; 94 layernum = m_layers.size()-1;
90 95
91 m_layers[layernum]->insert(item); 96 m_layers[layernum]->insert(item);
92 restack(); 97 restack();
93} 98}
94 99
95void MultLayers::remove(XLayerItem &item) {
96 XLayer *curr_layer = item.getLayer();
97 if (!curr_layer || curr_layer->getLayerNum() < 0 || curr_layer->getLayerNum() >= m_numlayers) {
98 // do nothing
99 return;
100 }
101 curr_layer->remove(item);
102}
103
104/* raise the item one level */ 100/* raise the item one level */
105void MultLayers::raise(XLayerItem &item) { 101void MultLayers::raise(XLayerItem &item) {
106 // get the layer it is in 102 // get the layer it is in
107 XLayer *curr_layer = item.getLayer(); 103 XLayer &curr_layer = item.getLayer();
108 moveToLayer(item, curr_layer->getLayerNum()-1); 104 moveToLayer(item, curr_layer.getLayerNum()-1);
109}
110
111/* lower the item one level */
112void MultLayers::lower(XLayerItem &item) {
113 // get the layer it is in
114 XLayer *curr_layer = item.getLayer();
115 moveToLayer(item, curr_layer->getLayerNum()+1);
116} 105}
117 106
118void MultLayers::moveToLayer(XLayerItem &item, int layernum) { 107void MultLayers::moveToLayer(XLayerItem &item, int layernum) {
119 // get the layer it is in 108 // get the layer it is in
120 XLayer *curr_layer = item.getLayer(); 109 XLayer &curr_layer = item.getLayer();
121 if (!curr_layer) { 110
122 addToTop(item, layernum); 111 // do nothing if the item already is in the requested layer
123 return; 112 if (curr_layer.getLayerNum() == layernum)
124 }
125 if (curr_layer->getLayerNum() == layernum )
126 // do nothing
127 return; 113 return;
128 114
115 // clamp layer number
129 if (layernum < 0) 116 if (layernum < 0)
130 layernum = 0; 117 layernum = 0;
131 else if (layernum >= m_numlayers) 118 else if (layernum >= m_layers.size())
132 layernum = m_numlayers-1; 119 layernum = m_layers.size()-1;
133 120 // remove item from old layer and insert it into the
134 curr_layer->remove(item); 121 item.setLayer(*m_layers[layernum]);
122 curr_layer.remove(item);
135 m_layers[layernum]->insert(item); 123 m_layers[layernum]->insert(item);
136} 124}
137 125
138void MultLayers::restack() { 126void MultLayers::restack() {
139 int i=0, j=0, size=0; 127 size_t winlist_size=0;
140 for (; i < m_numlayers; i++) { 128 for (size_t layer=0; layer < m_layers.size(); layer++) {
141 size += m_layers[i]->countWindows(); 129 winlist_size += m_layers[layer]->countWindows();
142 } 130 }
143 131
144 Window *winlist = new Window[size]; 132 Window *winlist = new Window[winlist_size];
145 for (i=0; i < m_numlayers; i++) { 133 for (size_t layer=0, window=0; layer < m_layers.size(); layer++) {
146 134
147 XLayer::ItemList::iterator it = m_layers[i]->getItemList().begin(); 135 XLayer::ItemList::iterator item_it = m_layers[layer]->getItemList().begin();
148 XLayer::ItemList::iterator it_end = m_layers[i]->getItemList().end(); 136 XLayer::ItemList::iterator item_it_end = m_layers[layer]->getItemList().end();
149 137 for (; item_it != item_it_end; ++item_it, window++)
150 for (; it != it_end; ++it) { 138 winlist[window] = (*item_it)->window();
151 XLayerItem::Windows::const_iterator wit = (*it)->getWindows().begin();
152 XLayerItem::Windows::const_iterator wit_end = (*it)->getWindows().end();
153 for (; wit != wit_end; ++wit, j++) {
154 winlist[j] = (*wit);
155 }
156 }
157 } 139 }
158 140
159 XRestackWindows(FbTk::App::instance()->display(), winlist, size); 141 XRestackWindows(FbTk::App::instance()->display(), winlist, winlist_size);
142
143 delete[] winlist;
160} 144}
161 145
162int MultLayers::size() { 146int MultLayers::size() {
163 int i = 0, num = 0; 147 int i = 0, num = 0;
164 for (; i < m_numlayers; i++) { 148 for (; i < m_layers.size(); i++) {
165 num += m_layers[i]->countWindows(); 149 num += m_layers[i]->countWindows();
166 } 150 }
167 return num; 151 return num;
168} 152}
153
154XLayer *MultLayers::getLayer(size_t num) {
155 if (num >= m_layers.size())
156 return 0;
157 return m_layers[num];
158}
159
160const XLayer *MultLayers::getLayer(size_t num) const {
161 if (num >= m_layers.size())
162 return 0;
163 return m_layers[num];
164}
165