aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk/MultLayers.cc
diff options
context:
space:
mode:
authorrathnor <rathnor>2003-02-02 16:32:41 (GMT)
committerrathnor <rathnor>2003-02-02 16:32:41 (GMT)
commit1b063dcea92e0a7ac5008518fc5c13f03c055f54 (patch)
tree29d5b622c0870f06a94086ed463ab90e23bc673e /src/FbTk/MultLayers.cc
parent5244fc32447d2649a52a06dc84d96da94e9fd715 (diff)
downloadfluxbox_pavel-1b063dcea92e0a7ac5008518fc5c13f03c055f54.zip
fluxbox_pavel-1b063dcea92e0a7ac5008518fc5c13f03c055f54.tar.bz2
Integration of new Layering code, plus updates to the layering code itself
- new KeyActions: Raise/LowerLayer, AlwaysOnTop/Bottom, Top/BottomLayer Added a "Quit" KeyAction
Diffstat (limited to 'src/FbTk/MultLayers.cc')
-rw-r--r--src/FbTk/MultLayers.cc99
1 files changed, 87 insertions, 12 deletions
diff --git a/src/FbTk/MultLayers.cc b/src/FbTk/MultLayers.cc
index fbe8bfe..7f8f584 100644
--- a/src/FbTk/MultLayers.cc
+++ b/src/FbTk/MultLayers.cc
@@ -20,11 +20,12 @@
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.2 2003/01/29 21:42:52 rathnor Exp $ 23// $Id: MultLayers.cc,v 1.3 2003/02/02 16:32:41 rathnor 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 29
29using namespace FbTk; 30using namespace FbTk;
30 31
@@ -51,10 +52,44 @@ XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) {
51 52
52} 53}
53 54
55XLayerItem *MultLayers::getItemBelow(XLayerItem &item) {
56 XLayer *curr_layer = item.getLayer();
57 cerr<<"getItemBelow xlayer = "<<hex<<curr_layer<<endl;
58 // assume that the LayerItem does exist in a layer.
59 XLayerItem *ret = curr_layer->getItemBelow(item);
60
61 if (!ret) {
62 int num = curr_layer->getLayerNum()-1;
63 while (num >= 0 && !ret) {
64 ret = m_layers[num]->getItemBelow(item);
65 num--;
66 }
67 }
68
69 return ret;
70}
71
72XLayerItem *MultLayers::getItemAbove(XLayerItem &item) {
73 XLayer *curr_layer = item.getLayer();
74
75 // assume that the LayerItem does exist in a layer.
76 XLayerItem *ret = curr_layer->getItemAbove(item);
77
78 if (!ret) {
79 ret = getLowestItemAboveLayer(curr_layer->getLayerNum());
80 }
81
82 return ret;
83}
54 84
55void MultLayers::addToTop(XLayerItem &item, int layernum) { 85void MultLayers::addToTop(XLayerItem &item, int layernum) {
56 if (layernum < 0 || layernum >= m_numlayers) return; 86 if (layernum < 0)
87 layernum = 0;
88 else if (layernum >= m_numlayers)
89 layernum = m_numlayers-1;
90
57 m_layers[layernum]->insert(item); 91 m_layers[layernum]->insert(item);
92 restack();
58} 93}
59 94
60void MultLayers::remove(XLayerItem &item) { 95void MultLayers::remove(XLayerItem &item) {
@@ -70,24 +105,64 @@ void MultLayers::remove(XLayerItem &item) {
70void MultLayers::raise(XLayerItem &item) { 105void MultLayers::raise(XLayerItem &item) {
71 // get the layer it is in 106 // get the layer it is in
72 XLayer *curr_layer = item.getLayer(); 107 XLayer *curr_layer = item.getLayer();
73 if (!curr_layer || curr_layer->getLayerNum() == 0 || m_numlayers == 1) { 108 moveToLayer(item, curr_layer->getLayerNum()-1);
74 // do nothing
75 return;
76 }
77
78 curr_layer->remove(item);
79 m_layers[curr_layer->getLayerNum()-1]->insert(item);
80} 109}
81 110
82/* lower the item one level */ 111/* lower the item one level */
83void MultLayers::lower(XLayerItem &item) { 112void MultLayers::lower(XLayerItem &item) {
84 // get the layer it is in 113 // get the layer it is in
85 XLayer *curr_layer = item.getLayer(); 114 XLayer *curr_layer = item.getLayer();
86 if (!curr_layer || curr_layer->getLayerNum() >= (m_numlayers-1) || m_numlayers == 1) { 115 moveToLayer(item, curr_layer->getLayerNum()+1);
87 // do nothing 116}
117
118void MultLayers::moveToLayer(XLayerItem &item, int layernum) {
119 // get the layer it is in
120 XLayer *curr_layer = item.getLayer();
121 if (!curr_layer) {
122 addToTop(item, layernum);
88 return; 123 return;
89 } 124 }
125 if (curr_layer->getLayerNum() == layernum )
126 // do nothing
127 return;
128
129 if (layernum < 0)
130 layernum = 0;
131 else if (layernum >= m_numlayers)
132 layernum = m_numlayers-1;
90 133
91 curr_layer->remove(item); 134 curr_layer->remove(item);
92 m_layers[curr_layer->getLayerNum()+1]->insert(item); 135 m_layers[layernum]->insert(item);
136}
137
138void MultLayers::restack() {
139 int i=0, j=0, size=0;
140 for (; i < m_numlayers; i++) {
141 size += m_layers[i]->countWindows();
142 }
143
144 Window *winlist = new Window[size];
145 for (i=0; i < m_numlayers; i++) {
146
147 XLayer::ItemList::iterator it = m_layers[i]->getItemList().begin();
148 XLayer::ItemList::iterator it_end = m_layers[i]->getItemList().end();
149
150 for (; it != it_end; ++it) {
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 }
158
159 XRestackWindows(FbTk::App::instance()->display(), winlist, size);
160}
161
162int MultLayers::size() {
163 int i = 0, num = 0;
164 for (; i < m_numlayers; i++) {
165 num += m_layers[i]->countWindows();
166 }
167 return num;
93} 168}