aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Gumz <akira at fluxbox dot org>2011-02-23 21:49:27 (GMT)
committerMathias Gumz <akira at fluxbox dot org>2011-02-23 21:49:27 (GMT)
commit9616a676d869b8f67742da99d55e9327ea867166 (patch)
tree32d8daf4d851b4038e7098f88570891c0727bd7b
parent813e6c4402b7d13a9e7b1ce3e391bc4c8d894ea3 (diff)
downloadfluxbox_pavel-9616a676d869b8f67742da99d55e9327ea867166.zip
fluxbox_pavel-9616a676d869b8f67742da99d55e9327ea867166.tar.bz2
renamed FbTk::XLayer to FbTk::Layer and FbTk::XLayerItem to FbTk::LayerItem
-rw-r--r--src/AlphaMenu.cc2
-rw-r--r--src/AlphaMenu.hh2
-rw-r--r--src/Ewmh.cc8
-rw-r--r--src/FbMenu.cc2
-rw-r--r--src/FbMenu.hh6
-rw-r--r--src/FbTk/Layer.cc (renamed from src/FbTk/XLayer.cc)62
-rw-r--r--src/FbTk/Layer.hh116
-rw-r--r--src/FbTk/LayerItem.cc (renamed from src/FbTk/XLayerItem.cc)32
-rw-r--r--src/FbTk/LayerItem.hh62
-rw-r--r--src/FbTk/Makefile.am4
-rw-r--r--src/FbTk/MultLayers.cc34
-rw-r--r--src/FbTk/MultLayers.hh30
-rw-r--r--src/FbTk/XLayer.hh85
-rw-r--r--src/FbTk/XLayerItem.hh79
-rw-r--r--src/FbWinFrame.hh10
-rw-r--r--src/LayerMenu.cc2
-rw-r--r--src/LayerMenu.hh2
-rw-r--r--src/Screen.cc4
-rw-r--r--src/Screen.hh4
-rw-r--r--src/Slit.cc6
-rw-r--r--src/Slit.hh6
-rw-r--r--src/ToggleMenu.hh2
-rw-r--r--src/Toolbar.cc2
-rw-r--r--src/Toolbar.hh10
-rw-r--r--src/Window.hh8
-rw-r--r--src/Xinerama.hh4
-rw-r--r--src/fluxbox.cc2
-rw-r--r--src/tests/testLayers.cc22
28 files changed, 229 insertions, 379 deletions
diff --git a/src/AlphaMenu.cc b/src/AlphaMenu.cc
index f15c9d1..219d6ea 100644
--- a/src/AlphaMenu.cc
+++ b/src/AlphaMenu.cc
@@ -33,7 +33,7 @@
33#include "Window.hh" 33#include "Window.hh"
34 34
35AlphaMenu::AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 35AlphaMenu::AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
36 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): 36 FbTk::ImageControl &imgctrl, FbTk::Layer &layer):
37 ToggleMenu(tm, imgctrl, layer) 37 ToggleMenu(tm, imgctrl, layer)
38{ 38{
39 39
diff --git a/src/AlphaMenu.hh b/src/AlphaMenu.hh
index 27f26dd..0da21de 100644
--- a/src/AlphaMenu.hh
+++ b/src/AlphaMenu.hh
@@ -35,7 +35,7 @@ namespace FbTk {
35class AlphaMenu : public ToggleMenu { 35class AlphaMenu : public ToggleMenu {
36public: 36public:
37 AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 37 AlphaMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
38 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer); 38 FbTk::ImageControl &imgctrl, FbTk::Layer &layer);
39 39
40 // we override these to update the menu when the active window changes 40 // we override these to update the menu when the active window changes
41 void move(int x, int y); 41 void move(int x, int y);
diff --git a/src/Ewmh.cc b/src/Ewmh.cc
index 77581b8..241fd0a 100644
--- a/src/Ewmh.cc
+++ b/src/Ewmh.cc
@@ -34,8 +34,8 @@
34#include "FbTk/App.hh" 34#include "FbTk/App.hh"
35#include "FbTk/FbWindow.hh" 35#include "FbTk/FbWindow.hh"
36#include "FbTk/I18n.hh" 36#include "FbTk/I18n.hh"
37#include "FbTk/XLayerItem.hh" 37#include "FbTk/LayerItem.hh"
38#include "FbTk/XLayer.hh" 38#include "FbTk/Layer.hh"
39#include "FbTk/FbPixmap.hh" 39#include "FbTk/FbPixmap.hh"
40 40
41#include <X11/Xproto.h> 41#include <X11/Xproto.h>
@@ -1205,8 +1205,8 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce,
1205 above_win == winclient) // this would be very wrong :) 1205 above_win == winclient) // this would be very wrong :)
1206 return true; 1206 return true;
1207 1207
1208 FbTk::XLayerItem &below_item = winclient->fbwindow()->layerItem(); 1208 FbTk::LayerItem &below_item = winclient->fbwindow()->layerItem();
1209 FbTk::XLayerItem &above_item = above_win->fbwindow()->layerItem(); 1209 FbTk::LayerItem &above_item = above_win->fbwindow()->layerItem();
1210 1210
1211 // this might break the transient_for layering 1211 // this might break the transient_for layering
1212 1212
diff --git a/src/FbMenu.cc b/src/FbMenu.cc
index 5bc3622..dffd07c 100644
--- a/src/FbMenu.cc
+++ b/src/FbMenu.cc
@@ -29,7 +29,7 @@
29FluxboxWindow *FbMenu::s_window = 0; 29FluxboxWindow *FbMenu::s_window = 0;
30 30
31FbMenu::FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 31FbMenu::FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
32 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): 32 FbTk::ImageControl &imgctrl, FbTk::Layer &layer):
33 FbTk::Menu(tm, imgctrl), 33 FbTk::Menu(tm, imgctrl),
34 m_layeritem(fbwindow(), layer) { 34 m_layeritem(fbwindow(), layer) {
35 35
diff --git a/src/FbMenu.hh b/src/FbMenu.hh
index 2e709fd..23c2ad5 100644
--- a/src/FbMenu.hh
+++ b/src/FbMenu.hh
@@ -25,7 +25,7 @@
25#include <memory> 25#include <memory>
26 26
27#include "FbTk/Menu.hh" 27#include "FbTk/Menu.hh"
28#include "FbTk/XLayerItem.hh" 28#include "FbTk/LayerItem.hh"
29#include "FbTk/AutoReloadHelper.hh" 29#include "FbTk/AutoReloadHelper.hh"
30 30
31class FluxboxWindow; 31class FluxboxWindow;
@@ -38,7 +38,7 @@ class MenuTheme;
38class FbMenu:public FbTk::Menu { 38class FbMenu:public FbTk::Menu {
39public: 39public:
40 FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, FbTk::ImageControl &imgctrl, 40 FbMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, FbTk::ImageControl &imgctrl,
41 FbTk::XLayer &layer); 41 FbTk::Layer &layer);
42 virtual ~FbMenu() { } 42 virtual ~FbMenu() { }
43 void raise() { m_layeritem.raise(); } 43 void raise() { m_layeritem.raise(); }
44 void lower() { m_layeritem.lower(); } 44 void lower() { m_layeritem.lower(); }
@@ -53,7 +53,7 @@ public:
53 static FluxboxWindow *window() { return s_window; } 53 static FluxboxWindow *window() { return s_window; }
54 54
55private: 55private:
56 FbTk::XLayerItem m_layeritem; 56 FbTk::LayerItem m_layeritem;
57 std::auto_ptr<FbTk::AutoReloadHelper> m_reloader; 57 std::auto_ptr<FbTk::AutoReloadHelper> m_reloader;
58 static FluxboxWindow *s_window; 58 static FluxboxWindow *s_window;
59}; 59};
diff --git a/src/FbTk/XLayer.cc b/src/FbTk/Layer.cc
index f20f8ff..d3c6615 100644
--- a/src/FbTk/XLayer.cc
+++ b/src/FbTk/Layer.cc
@@ -1,4 +1,4 @@
1// XLayer.cc for FbTk - fluxbox toolkit 1// Layer.cc for FbTk - fluxbox toolkit
2// Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org) 2// Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net) 3// and Simon Bowden (rathnor at users.sourceforge.net)
4// 4//
@@ -20,8 +20,8 @@
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#include "XLayer.hh" 23#include "Layer.hh"
24#include "XLayerItem.hh" 24#include "LayerItem.hh"
25#include "App.hh" 25#include "App.hh"
26#include "FbWindow.hh" 26#include "FbWindow.hh"
27#include "MultLayers.hh" 27#include "MultLayers.hh"
@@ -39,18 +39,18 @@ using std::endl;
39 39
40namespace { 40namespace {
41 41
42int sum_windows(int nr, XLayerItem* item) { 42int sum_windows(int nr, LayerItem* item) {
43 return nr + item->numWindows(); 43 return nr + item->numWindows();
44} 44}
45 45
46int count_windows(const FbTk::XLayer::ItemList& items) { 46int count_windows(const FbTk::Layer::ItemList& items) {
47 return std::accumulate(items.begin(), items.end(), 0, sum_windows); 47 return std::accumulate(items.begin(), items.end(), 0, sum_windows);
48} 48}
49 49
50 50
51void extract_windows_to_stack(const XLayerItem::Windows& windows, std::vector<Window>& stack) { 51void extract_windows_to_stack(const LayerItem::Windows& windows, std::vector<Window>& stack) {
52 XLayerItem::Windows::const_iterator i = windows.begin(); 52 LayerItem::Windows::const_iterator i = windows.begin();
53 XLayerItem::Windows::const_iterator end = windows.end(); 53 LayerItem::Windows::const_iterator end = windows.end();
54 for (; i != end; ++i) { 54 for (; i != end; ++i) {
55 Window w = (*i)->window(); 55 Window w = (*i)->window();
56 if (w) 56 if (w)
@@ -58,14 +58,14 @@ void extract_windows_to_stack(const XLayerItem::Windows& windows, std::vector<Wi
58 } 58 }
59} 59}
60 60
61void extract_windows_to_stack(const FbTk::XLayer::ItemList& items, XLayerItem* temp_raised, std::vector<Window>& stack) { 61void extract_windows_to_stack(const FbTk::Layer::ItemList& items, LayerItem* temp_raised, std::vector<Window>& stack) {
62 62
63 if (temp_raised) { // add windows that go on top 63 if (temp_raised) { // add windows that go on top
64 extract_windows_to_stack(temp_raised->getWindows(), stack); 64 extract_windows_to_stack(temp_raised->getWindows(), stack);
65 } 65 }
66 66
67 FbTk::XLayer::ItemList::const_iterator it = items.begin(); 67 FbTk::Layer::ItemList::const_iterator it = items.begin();
68 FbTk::XLayer::ItemList::const_iterator it_end = items.end(); 68 FbTk::Layer::ItemList::const_iterator it_end = items.end();
69 for (; it != it_end; ++it) { // add all the windows from each other item 69 for (; it != it_end; ++it) { // add all the windows from each other item
70 if (*it == temp_raised) { 70 if (*it == temp_raised) {
71 continue; 71 continue;
@@ -74,7 +74,7 @@ void extract_windows_to_stack(const FbTk::XLayer::ItemList& items, XLayerItem* t
74 } 74 }
75} 75}
76 76
77void restack(const FbTk::XLayer::ItemList& items, XLayerItem* temp_raised) { 77void restack(const FbTk::Layer::ItemList& items, LayerItem* temp_raised) {
78 78
79 std::vector<Window> stack; 79 std::vector<Window> stack;
80 extract_windows_to_stack(items, temp_raised, stack); 80 extract_windows_to_stack(items, temp_raised, stack);
@@ -86,10 +86,10 @@ void restack(const FbTk::XLayer::ItemList& items, XLayerItem* temp_raised) {
86} // end of anonymous namespace 86} // end of anonymous namespace
87 87
88 88
89void XLayer::restack(const std::vector<XLayer*>& layers) { 89void Layer::restack(const std::vector<Layer*>& layers) {
90 90
91 std::vector<Window> stack; 91 std::vector<Window> stack;
92 std::vector<XLayer*>::const_iterator l; 92 std::vector<Layer*>::const_iterator l;
93 for (l = layers.begin(); l != layers.end(); ++l) { 93 for (l = layers.begin(); l != layers.end(); ++l) {
94 extract_windows_to_stack((*l)->itemList(), 0, stack); 94 extract_windows_to_stack((*l)->itemList(), 0, stack);
95 } 95 }
@@ -98,32 +98,32 @@ void XLayer::restack(const std::vector<XLayer*>& layers) {
98 XRestackWindows(FbTk::App::instance()->display(), &stack[0], stack.size()); 98 XRestackWindows(FbTk::App::instance()->display(), &stack[0], stack.size());
99} 99}
100 100
101XLayer::XLayer(MultLayers &manager, int layernum): 101Layer::Layer(MultLayers &manager, int layernum):
102 m_manager(manager), m_layernum(layernum), m_needs_restack(false) { 102 m_manager(manager), m_layernum(layernum), m_needs_restack(false) {
103} 103}
104 104
105XLayer::~XLayer() { 105Layer::~Layer() {
106 106
107} 107}
108 108
109void XLayer::restack() { 109void Layer::restack() {
110 if (m_manager.isUpdatable()) { 110 if (m_manager.isUpdatable()) {
111 ::restack(itemList(), 0); 111 ::restack(itemList(), 0);
112 m_needs_restack = false; 112 m_needs_restack = false;
113 } 113 }
114} 114}
115 115
116void XLayer::restackAndTempRaise(XLayerItem &item) { 116void Layer::restackAndTempRaise(LayerItem &item) {
117 ::restack(itemList(), &item); 117 ::restack(itemList(), &item);
118} 118}
119 119
120int XLayer::countWindows() { 120int Layer::countWindows() {
121 return ::count_windows(itemList()); 121 return ::count_windows(itemList());
122} 122}
123 123
124 124
125// Stack all windows associated with 'item' below the 'above' item 125// Stack all windows associated with 'item' below the 'above' item
126void XLayer::stackBelowItem(XLayerItem &item, XLayerItem *above) { 126void Layer::stackBelowItem(LayerItem &item, LayerItem *above) {
127 if (!m_manager.isUpdatable()) 127 if (!m_manager.isUpdatable())
128 return; 128 return;
129 129
@@ -151,7 +151,7 @@ void XLayer::stackBelowItem(XLayerItem &item, XLayerItem *above) {
151 151
152// We can't just use Restack here, because it won't do anything if they're 152// We can't just use Restack here, because it won't do anything if they're
153// already in the same relative order excluding other windows 153// already in the same relative order excluding other windows
154void XLayer::alignItem(XLayerItem &item) { 154void Layer::alignItem(LayerItem &item) {
155 if (itemList().front() == &item) { 155 if (itemList().front() == &item) {
156 stackBelowItem(item, m_manager.getLowestItemAboveLayer(m_layernum)); 156 stackBelowItem(item, m_manager.getLowestItemAboveLayer(m_layernum));
157 return; 157 return;
@@ -178,11 +178,11 @@ void XLayer::alignItem(XLayerItem &item) {
178 178
179} 179}
180 180
181XLayer::iterator XLayer::insert(XLayerItem &item, unsigned int pos) { 181Layer::iterator Layer::insert(LayerItem &item, unsigned int pos) {
182#ifdef DEBUG 182#ifdef DEBUG
183 // at this point we don't support insertions into a layer other than at the top 183 // at this point we don't support insertions into a layer other than at the top
184 if (pos != 0) 184 if (pos != 0)
185 cerr<<__FILE__<<"("<<__LINE__<<"): Insert using non-zero position not valid in XLayer"<<endl; 185 cerr<<__FILE__<<"("<<__LINE__<<"): Insert using non-zero position not valid in Layer"<<endl;
186#endif // DEBUG 186#endif // DEBUG
187 187
188 itemList().push_front(&item); 188 itemList().push_front(&item);
@@ -191,7 +191,7 @@ XLayer::iterator XLayer::insert(XLayerItem &item, unsigned int pos) {
191 return itemList().begin(); 191 return itemList().begin();
192} 192}
193 193
194void XLayer::remove(XLayerItem &item) { 194void Layer::remove(LayerItem &item) {
195 iterator it = itemList().begin(); 195 iterator it = itemList().begin();
196 iterator it_end = itemList().end(); 196 iterator it_end = itemList().end();
197 for (; it != it_end; ++it) { 197 for (; it != it_end; ++it) {
@@ -202,7 +202,7 @@ void XLayer::remove(XLayerItem &item) {
202 } 202 }
203} 203}
204 204
205void XLayer::raise(XLayerItem &item) { 205void Layer::raise(LayerItem &item) {
206 // assume it is already in this layer 206 // assume it is already in this layer
207 207
208 if (&item == itemList().front()) { 208 if (&item == itemList().front()) {
@@ -227,7 +227,7 @@ void XLayer::raise(XLayerItem &item) {
227 227
228} 228}
229 229
230void XLayer::tempRaise(XLayerItem &item) { 230void Layer::tempRaise(LayerItem &item) {
231 // assume it is already in this layer 231 // assume it is already in this layer
232 232
233 if (!m_needs_restack && &item == itemList().front()) 233 if (!m_needs_restack && &item == itemList().front())
@@ -249,7 +249,7 @@ void XLayer::tempRaise(XLayerItem &item) {
249 m_needs_restack = true; 249 m_needs_restack = true;
250} 250}
251 251
252void XLayer::lower(XLayerItem &item) { 252void Layer::lower(LayerItem &item) {
253 // assume already in this layer 253 // assume already in this layer
254 254
255 // is it already the lowest? 255 // is it already the lowest?
@@ -288,20 +288,20 @@ void XLayer::lower(XLayerItem &item) {
288 stackBelowItem(item, *it); 288 stackBelowItem(item, *it);
289} 289}
290 290
291void XLayer::raiseLayer(XLayerItem &item) { 291void Layer::raiseLayer(LayerItem &item) {
292 m_manager.raiseLayer(item); 292 m_manager.raiseLayer(item);
293} 293}
294 294
295void XLayer::lowerLayer(XLayerItem &item) { 295void Layer::lowerLayer(LayerItem &item) {
296 m_manager.lowerLayer(item); 296 m_manager.lowerLayer(item);
297} 297}
298 298
299void XLayer::moveToLayer(XLayerItem &item, int layernum) { 299void Layer::moveToLayer(LayerItem &item, int layernum) {
300 m_manager.moveToLayer(item, layernum); 300 m_manager.moveToLayer(item, layernum);
301} 301}
302 302
303 303
304XLayerItem *XLayer::getLowestItem() { 304LayerItem *Layer::getLowestItem() {
305 if (itemList().empty()) 305 if (itemList().empty())
306 return 0; 306 return 0;
307 else 307 else
diff --git a/src/FbTk/Layer.hh b/src/FbTk/Layer.hh
index 5836c9c..6f8f184 100644
--- a/src/FbTk/Layer.hh
+++ b/src/FbTk/Layer.hh
@@ -1,7 +1,7 @@
1// Layer.hh for FbTk - fluxbox toolkit 1// Layer.hh for FbTk - fluxbox toolkit
2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org) 2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net) 3// and Simon Bowden (rathnor at users.sourceforge.net)
4// 4//
5// Permission is hereby granted, free of charge, to any person obtaining a 5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"), 6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation 7// to deal in the Software without restriction, including without limitation
@@ -20,92 +20,66 @@
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#ifndef FBTK_LAYERTEMPLATE_HH 23#ifndef FBTK_XLAYER_HH
24#define FBTK_LAYERTEMPLATE_HH 24#define FBTK_XLAYER_HH
25 25
26#include <vector> 26#include <vector>
27#include <algorithm> 27#include <list>
28 28
29namespace FbTk { 29namespace FbTk {
30 30
31template <typename ItemType, typename Container = std::vector<ItemType *> > 31class MultLayers;
32class LayerBase { 32class LayerItem;
33public:
34 typedef Container ListType;
35 typedef typename Container::iterator iterator;
36 typedef typename Container::reverse_iterator reverse_iterator;
37 virtual ~LayerBase() { }
38 /// insert in top by default
39 virtual iterator insert(ItemType &item, unsigned int pos=0);
40 /// remove item from list
41 virtual void remove(ItemType &item);
42 /// move item to top
43 virtual void raise(ItemType &item);
44 /// move item to bottom
45 virtual void lower(ItemType &item);
46 /// @return number of elements in layer
47 size_t size() const { return m_list.size(); }
48 /// @return layer list
49 const ListType &itemList() const { return m_list; }
50 /// @return layer list
51 ListType &itemList() { return m_list; }
52protected:
53 virtual void restack();
54private:
55 ListType m_list;
56};
57 33
58template <typename ItemType, typename Container> 34class Layer {
59typename Container::iterator LayerBase<ItemType, Container>::insert(ItemType &item, unsigned int position) { 35public:
60 // make sure we don't alreay have it in the list
61 if (std::find(itemList().begin(), itemList().end(), &item) != itemList().end())
62 return m_list.end();
63 36
64 if (position > size()) 37 Layer(MultLayers &manager, int layernum);
65 position = size(); 38 ~Layer();
66 39
67 iterator it = m_list.begin(); 40 typedef std::list<LayerItem *> ItemList;
41 typedef std::list<LayerItem *>::iterator iterator;
68 42
69 for (unsigned int i=0; i<position; ++it, ++i) 43 //typedef std::list<LayerItem *>::reverse_iterator reverse_iterator;
70 continue;
71 44
72 m_list.insert(it, &item); 45 void setLayerNum(int layernum) { m_layernum = layernum; };
73 restack(); 46 int getLayerNum() { return m_layernum; };
74 return it++; 47 // Put all items on the same layer (called when layer item added to)
75} 48 void alignItem(LayerItem &item);
49 int countWindows();
50 void stackBelowItem(LayerItem &item, LayerItem *above);
51 LayerItem *getLowestItem();
52 const ItemList &itemList() const { return m_items; }
53 ItemList &itemList() { return m_items; }
76 54
55 // we redefine these as Layer has special optimisations, and X restacking needs
56 iterator insert(LayerItem &item, unsigned int pos=0);
57 void remove(LayerItem &item);
77 58
78template <typename ItemType, typename Container> 59 // bring to top of layer
79void LayerBase<ItemType, Container>::remove(ItemType &item) { 60 void raise(LayerItem &item);
80 iterator it = std::find(itemList().begin(), itemList().end(), &item); 61 void lower(LayerItem &item);
81 if (it != itemList().end())
82 m_list.erase(it);
83}
84 62
85template <typename ItemType, typename Container> 63 // raise it, but don't make it permanent (i.e. restack will revert)
86void LayerBase<ItemType, Container>::raise(ItemType &item) { 64 void tempRaise(LayerItem &item);
87 if (&item == itemList().front()) // already at the bottom
88 return;
89 remove(item);
90 insert(item, 0);
91 restack();
92}
93 65
94template <typename ItemType, typename Container> 66 // send to next layer up
95void LayerBase<ItemType, Container>::lower(ItemType &item) { 67 void raiseLayer(LayerItem &item);
96 if (&item == itemList().back()) // already at the bottom 68 void lowerLayer(LayerItem &item);
97 return; 69 void moveToLayer(LayerItem &item, int layernum);
98 remove(item);
99 insert(item, size());
100 restack();
101}
102 70
103template <typename ItemType, typename Container> 71 static void restack(const std::vector<Layer*>& layers);
104void LayerBase<ItemType, Container>::restack() {
105}
106 72
73private:
74 void restack();
75 void restackAndTempRaise(LayerItem &item);
107 76
108} // end namespace FbTk 77 MultLayers &m_manager;
78 int m_layernum;
79 bool m_needs_restack;
80 ItemList m_items;
81};
109 82
83} // namespace FbTk
110 84
111#endif // FBTK_LAYERTEMPLATE_HH 85#endif // FBTK_XLAYER_HH
diff --git a/src/FbTk/XLayerItem.cc b/src/FbTk/LayerItem.cc
index 7f6f594..02be4f0 100644
--- a/src/FbTk/XLayerItem.cc
+++ b/src/FbTk/LayerItem.cc
@@ -1,4 +1,4 @@
1// XLayerItem.cc for FbTk - fluxbox toolkit 1// LayerItem.cc for FbTk - fluxbox toolkit
2// Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org) 2// Copyright (c) 2003 - 2006 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net) 3// and Simon Bowden (rathnor at users.sourceforge.net)
4// 4//
@@ -20,25 +20,25 @@
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#include "XLayerItem.hh" 23#include "LayerItem.hh"
24#include "XLayer.hh" 24#include "Layer.hh"
25 25
26#include <algorithm> 26#include <algorithm>
27 27
28using namespace FbTk; 28using namespace FbTk;
29 29
30XLayerItem::XLayerItem(FbWindow &win, XLayer &layer) : 30LayerItem::LayerItem(FbWindow &win, Layer &layer) :
31 m_layer(&layer) { 31 m_layer(&layer) {
32 m_windows.push_back(&win); 32 m_windows.push_back(&win);
33 m_layer->insert(*this); 33 m_layer->insert(*this);
34} 34}
35 35
36 36
37XLayerItem::~XLayerItem() { 37LayerItem::~LayerItem() {
38 m_layer->remove(*this); 38 m_layer->remove(*this);
39} 39}
40 40
41void XLayerItem::setLayer(XLayer &layer) { 41void LayerItem::setLayer(Layer &layer) {
42 // make sure we don't try to set the same layer 42 // make sure we don't try to set the same layer
43 if (m_layer == &layer) 43 if (m_layer == &layer)
44 return; 44 return;
@@ -48,47 +48,47 @@ void XLayerItem::setLayer(XLayer &layer) {
48 m_layer->insert(*this); 48 m_layer->insert(*this);
49} 49}
50 50
51void XLayerItem::raise() { 51void LayerItem::raise() {
52 m_layer->raise(*this); 52 m_layer->raise(*this);
53} 53}
54 54
55void XLayerItem::lower() { 55void LayerItem::lower() {
56 m_layer->lower(*this); 56 m_layer->lower(*this);
57} 57}
58 58
59void XLayerItem::tempRaise() { 59void LayerItem::tempRaise() {
60 m_layer->tempRaise(*this); 60 m_layer->tempRaise(*this);
61} 61}
62 62
63void XLayerItem::raiseLayer() { 63void LayerItem::raiseLayer() {
64 m_layer->raiseLayer(*this); 64 m_layer->raiseLayer(*this);
65} 65}
66 66
67void XLayerItem::lowerLayer() { 67void LayerItem::lowerLayer() {
68 m_layer->lowerLayer(*this); 68 m_layer->lowerLayer(*this);
69} 69}
70 70
71void XLayerItem::moveToLayer(int layernum) { 71void LayerItem::moveToLayer(int layernum) {
72 m_layer->moveToLayer(*this, layernum); 72 m_layer->moveToLayer(*this, layernum);
73} 73}
74 74
75void XLayerItem::addWindow(FbWindow &win) { 75void LayerItem::addWindow(FbWindow &win) {
76 // I'd like to think we can trust ourselves that it won't be added twice... 76 // I'd like to think we can trust ourselves that it won't be added twice...
77 // Otherwise we're always scanning through the list. 77 // Otherwise we're always scanning through the list.
78 m_windows.push_back(&win); 78 m_windows.push_back(&win);
79 m_layer->alignItem(*this); 79 m_layer->alignItem(*this);
80} 80}
81 81
82void XLayerItem::removeWindow(FbWindow &win) { 82void LayerItem::removeWindow(FbWindow &win) {
83 // I'd like to think we can trust ourselves that it won't be added twice... 83 // I'd like to think we can trust ourselves that it won't be added twice...
84 // Otherwise we're always scanning through the list. 84 // Otherwise we're always scanning through the list.
85 85
86 XLayerItem::Windows::iterator it = std::find(m_windows.begin(), m_windows.end(), &win); 86 LayerItem::Windows::iterator it = std::find(m_windows.begin(), m_windows.end(), &win);
87 if (it != m_windows.end()) 87 if (it != m_windows.end())
88 m_windows.erase(it); 88 m_windows.erase(it);
89} 89}
90 90
91void XLayerItem::bringToTop(FbWindow &win) { 91void LayerItem::bringToTop(FbWindow &win) {
92 removeWindow(win); 92 removeWindow(win);
93 addWindow(win); 93 addWindow(win);
94} 94}
diff --git a/src/FbTk/LayerItem.hh b/src/FbTk/LayerItem.hh
index 945bb9a..5d1035e 100644
--- a/src/FbTk/LayerItem.hh
+++ b/src/FbTk/LayerItem.hh
@@ -1,7 +1,7 @@
1// LayerItem.hh for fluxbox 1// LayerItem.hh for FbTk - fluxbox toolkit
2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org) 2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net) 3// and Simon Bowden (rathnor at users.sourceforge.net)
4// 4//
5// Permission is hereby granted, free of charge, to any person obtaining a 5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"), 6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation 7// to deal in the Software without restriction, including without limitation
@@ -20,20 +20,60 @@
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#ifndef FBTK_LAYERITEM_HH 23#ifndef FBTK_XLAYERITEM_HH
24#define FBTK_LAYERITEM_HH 24#define FBTK_XLAYERITEM_HH
25
26#include "Layer.hh"
27#include "NotCopyable.hh"
28#include <vector>
25 29
26namespace FbTk { 30namespace FbTk {
27 31
28/// pure interface class, an item in layer 32class FbWindow;
29class LayerItem { 33
34class LayerItem : private NotCopyable {
30public: 35public:
31 virtual ~LayerItem() { } 36 typedef std::vector<FbWindow *> Windows;
37
38 LayerItem(FbWindow &win, Layer &layer);
39 ~LayerItem();
40
41 void setLayer(Layer &layer);
42
43 void raise();
44 void lower();
45 void tempRaise(); // this raise gets reverted by a restack()
46
47 // send to next layer up
48 void raiseLayer();
49 void lowerLayer();
50 void moveToLayer(int layernum);
51
52 // this is needed for step and cycle functions
53 // (you need to know the next one visible, otherwise nothing may appear to happen)
54 // not yet implemented
55 bool visible() const { return true; }
56
57 const Layer &getLayer() const { return *m_layer; }
58 Layer &getLayer() { return *m_layer; }
59 int getLayerNum() { return m_layer->getLayerNum(); }
60
61 // an LayerItem holds several windows that are equivalent in a layer
62 // (i.e. if one is raised, then they should all be).
63 void addWindow(FbWindow &win);
64 void removeWindow(FbWindow &win);
65
66 // using this you can bring one window to the top of this item (equivalent to add then remove)
67 void bringToTop(FbWindow &win);
68
69 Windows &getWindows() { return m_windows; }
70 size_t numWindows() const { return m_windows.size(); }
32 71
33 virtual void raise() = 0; 72private:
34 virtual void lower() = 0; 73 Layer *m_layer;
74 Windows m_windows;
35}; 75};
36 76
37} // end namespace FbTk 77}
38 78
39#endif // FBTK_LAYERITEM_HH 79#endif // FBTK_XLAYERITEM_HH
diff --git a/src/FbTk/Makefile.am b/src/FbTk/Makefile.am
index 45a24b3..8619cc1 100644
--- a/src/FbTk/Makefile.am
+++ b/src/FbTk/Makefile.am
@@ -40,8 +40,8 @@ libFbTk_a_SOURCES = App.hh App.cc Color.cc Color.hh Command.hh \
40 Button.hh Button.cc \ 40 Button.hh Button.cc \
41 TextButton.hh TextButton.cc \ 41 TextButton.hh TextButton.cc \
42 Container.hh Container.cc \ 42 Container.hh Container.cc \
43 Layer.hh LayerItem.hh MultLayers.cc MultLayers.hh \ 43 MultLayers.cc MultLayers.hh \
44 XLayer.cc XLayer.hh XLayerItem.cc XLayerItem.hh \ 44 Layer.cc Layer.hh LayerItem.cc LayerItem.hh \
45 Resource.hh Resource.cc \ 45 Resource.hh Resource.cc \
46 StringUtil.hh StringUtil.cc Parser.hh Parser.cc \ 46 StringUtil.hh StringUtil.cc Parser.hh Parser.cc \
47 RegExp.hh RegExp.cc \ 47 RegExp.hh RegExp.cc \
diff --git a/src/FbTk/MultLayers.cc b/src/FbTk/MultLayers.cc
index 0f0748f..2027286 100644
--- a/src/FbTk/MultLayers.cc
+++ b/src/FbTk/MultLayers.cc
@@ -21,8 +21,8 @@
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23#include "MultLayers.hh" 23#include "MultLayers.hh"
24#include "XLayer.hh" 24#include "Layer.hh"
25#include "XLayerItem.hh" 25#include "LayerItem.hh"
26#include "App.hh" 26#include "App.hh"
27#include "FbWindow.hh" 27#include "FbWindow.hh"
28 28
@@ -34,7 +34,7 @@ MultLayers::MultLayers(int numlayers) :
34 m_lock(0) 34 m_lock(0)
35{ 35{
36 for (int i=0; i < numlayers; ++i) 36 for (int i=0; i < numlayers; ++i)
37 m_layers.push_back(new XLayer(*this, i)); 37 m_layers.push_back(new Layer(*this, i));
38} 38}
39 39
40MultLayers::~MultLayers() { 40MultLayers::~MultLayers() {
@@ -45,19 +45,19 @@ MultLayers::~MultLayers() {
45} 45}
46 46
47 47
48XLayerItem *MultLayers::getLowestItemAboveLayer(int layernum) { 48LayerItem *MultLayers::getLowestItemAboveLayer(int layernum) {
49 if (layernum >= static_cast<signed>(m_layers.size()) || layernum <= 0) 49 if (layernum >= static_cast<signed>(m_layers.size()) || layernum <= 0)
50 return 0; 50 return 0;
51 51
52 layernum--; // next one up 52 layernum--; // next one up
53 XLayerItem *item = 0; 53 LayerItem *item = 0;
54 while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0) 54 while (layernum >= 0 && (item = m_layers[layernum]->getLowestItem()) == 0)
55 layernum--; 55 layernum--;
56 return item; 56 return item;
57 57
58} 58}
59 59
60void MultLayers::addToTop(XLayerItem &item, int layernum) { 60void MultLayers::addToTop(LayerItem &item, int layernum) {
61 layernum = FbTk::Util::clamp(layernum, 0, static_cast<signed>(m_layers.size()) - 1); 61 layernum = FbTk::Util::clamp(layernum, 0, static_cast<signed>(m_layers.size()) - 1);
62 m_layers[layernum]->insert(item); 62 m_layers[layernum]->insert(item);
63 restack(); 63 restack();
@@ -65,7 +65,7 @@ void MultLayers::addToTop(XLayerItem &item, int layernum) {
65 65
66 66
67// raise the whole layer 67// raise the whole layer
68void MultLayers::raise(XLayer &layer) { 68void MultLayers::raise(Layer &layer) {
69 int layernum = layer.getLayerNum(); 69 int layernum = layer.getLayerNum();
70 if (layernum >= static_cast<signed>(m_layers.size() - 1)) 70 if (layernum >= static_cast<signed>(m_layers.size() - 1))
71 // already on top 71 // already on top
@@ -75,7 +75,7 @@ void MultLayers::raise(XLayer &layer) {
75} 75}
76 76
77// lower the whole layer 77// lower the whole layer
78void MultLayers::lower(XLayer &layer) { 78void MultLayers::lower(Layer &layer) {
79 int layernum = layer.getLayerNum(); 79 int layernum = layer.getLayerNum();
80 if (layernum == 0) 80 if (layernum == 0)
81 // already on bottom 81 // already on bottom
@@ -85,22 +85,22 @@ void MultLayers::lower(XLayer &layer) {
85} 85}
86 86
87/* raise the item one level */ 87/* raise the item one level */
88void MultLayers::raiseLayer(XLayerItem &item) { 88void MultLayers::raiseLayer(LayerItem &item) {
89 // get the layer it is in 89 // get the layer it is in
90 XLayer &curr_layer = item.getLayer(); 90 Layer &curr_layer = item.getLayer();
91 moveToLayer(item, curr_layer.getLayerNum()-1); 91 moveToLayer(item, curr_layer.getLayerNum()-1);
92} 92}
93 93
94/* raise the item one level */ 94/* raise the item one level */
95void MultLayers::lowerLayer(XLayerItem &item) { 95void MultLayers::lowerLayer(LayerItem &item) {
96 // get the layer it is in 96 // get the layer it is in
97 XLayer &curr_layer = item.getLayer(); 97 Layer &curr_layer = item.getLayer();
98 moveToLayer(item, curr_layer.getLayerNum()+1); 98 moveToLayer(item, curr_layer.getLayerNum()+1);
99} 99}
100 100
101void MultLayers::moveToLayer(XLayerItem &item, int layernum) { 101void MultLayers::moveToLayer(LayerItem &item, int layernum) {
102 // get the layer it is in 102 // get the layer it is in
103 XLayer &curr_layer = item.getLayer(); 103 Layer &curr_layer = item.getLayer();
104 104
105 // do nothing if the item already is in the requested layer 105 // do nothing if the item already is in the requested layer
106 if (curr_layer.getLayerNum() == layernum) 106 if (curr_layer.getLayerNum() == layernum)
@@ -114,7 +114,7 @@ void MultLayers::restack() {
114 if (!isUpdatable()) 114 if (!isUpdatable())
115 return; 115 return;
116 116
117 XLayer::restack(m_layers); 117 Layer::restack(m_layers);
118} 118}
119 119
120int MultLayers::size() { 120int MultLayers::size() {
@@ -125,13 +125,13 @@ int MultLayers::size() {
125 return num; 125 return num;
126} 126}
127 127
128XLayer *MultLayers::getLayer(size_t num) { 128Layer *MultLayers::getLayer(size_t num) {
129 if (num >= m_layers.size()) 129 if (num >= m_layers.size())
130 return 0; 130 return 0;
131 return m_layers[num]; 131 return m_layers[num];
132} 132}
133 133
134const XLayer *MultLayers::getLayer(size_t num) const { 134const Layer *MultLayers::getLayer(size_t num) const {
135 if (num >= m_layers.size()) 135 if (num >= m_layers.size())
136 return 0; 136 return 0;
137 return m_layers[num]; 137 return m_layers[num];
diff --git a/src/FbTk/MultLayers.hh b/src/FbTk/MultLayers.hh
index 735ff6a..62c006f 100644
--- a/src/FbTk/MultLayers.hh
+++ b/src/FbTk/MultLayers.hh
@@ -27,34 +27,34 @@
27 27
28namespace FbTk { 28namespace FbTk {
29 29
30class XLayerItem; 30class LayerItem;
31class XLayer; 31class Layer;
32 32
33class MultLayers { 33class MultLayers {
34public: 34public:
35 explicit MultLayers(int numlayers); 35 explicit MultLayers(int numlayers);
36 ~MultLayers(); 36 ~MultLayers();
37 XLayerItem *getLowestItemAboveLayer(int layernum); 37 LayerItem *getLowestItemAboveLayer(int layernum);
38 38
39 /// if there are none below, it will return null 39 /// if there are none below, it will return null
40 XLayerItem *getItemBelow(XLayerItem &item); 40 LayerItem *getItemBelow(LayerItem &item);
41 XLayerItem *getItemAbove(XLayerItem &item); 41 LayerItem *getItemAbove(LayerItem &item);
42 void addToTop(XLayerItem &item, int layernum); 42 void addToTop(LayerItem &item, int layernum);
43 void remove(XLayerItem &item); 43 void remove(LayerItem &item);
44 44
45 // raise/lower the whole layer 45 // raise/lower the whole layer
46 void raise(XLayer &layer); 46 void raise(Layer &layer);
47 void lower(XLayer &layer); 47 void lower(Layer &layer);
48 48
49 // raise/lower the item a whole layer, not just to top of current layer 49 // raise/lower the item a whole layer, not just to top of current layer
50 void raiseLayer(XLayerItem &item); 50 void raiseLayer(LayerItem &item);
51 void lowerLayer(XLayerItem &item); 51 void lowerLayer(LayerItem &item);
52 52
53 void moveToLayer(XLayerItem &item, int layernum); 53 void moveToLayer(LayerItem &item, int layernum);
54 int size(); 54 int size();
55 55
56 XLayer *getLayer(size_t num); 56 Layer *getLayer(size_t num);
57 const XLayer *getLayer(size_t num) const; 57 const Layer *getLayer(size_t num) const;
58 58
59 bool isUpdatable() const { return m_lock == 0; } 59 bool isUpdatable() const { return m_lock == 0; }
60 void lock() { ++m_lock; } 60 void lock() { ++m_lock; }
@@ -63,7 +63,7 @@ public:
63private: 63private:
64 void restack(); 64 void restack();
65 65
66 std::vector<XLayer *> m_layers; 66 std::vector<Layer *> m_layers;
67 int m_lock; 67 int m_lock;
68}; 68};
69 69
diff --git a/src/FbTk/XLayer.hh b/src/FbTk/XLayer.hh
deleted file mode 100644
index 6255950..0000000
--- a/src/FbTk/XLayer.hh
+++ /dev/null
@@ -1,85 +0,0 @@
1// XLayer.hh for FbTk - fluxbox toolkit
2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net)
4//
5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in
13// all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
22
23#ifndef FBTK_XLAYER_HH
24#define FBTK_XLAYER_HH
25
26#include <vector>
27#include <list>
28
29namespace FbTk {
30
31class MultLayers;
32class XLayerItem;
33
34class XLayer {
35public:
36
37 XLayer(MultLayers &manager, int layernum);
38 ~XLayer();
39
40 typedef std::list<XLayerItem *> ItemList;
41 typedef std::list<XLayerItem *>::iterator iterator;
42
43 //typedef std::list<XLayerItem *>::reverse_iterator reverse_iterator;
44
45 void setLayerNum(int layernum) { m_layernum = layernum; };
46 int getLayerNum() { return m_layernum; };
47 // Put all items on the same layer (called when layer item added to)
48 void alignItem(XLayerItem &item);
49 int countWindows();
50 void stackBelowItem(XLayerItem &item, XLayerItem *above);
51 XLayerItem *getLowestItem();
52 const ItemList &itemList() const { return m_items; }
53 ItemList &itemList() { return m_items; }
54
55 // we redefine these as XLayer has special optimisations, and X restacking needs
56 iterator insert(XLayerItem &item, unsigned int pos=0);
57 void remove(XLayerItem &item);
58
59 // bring to top of layer
60 void raise(XLayerItem &item);
61 void lower(XLayerItem &item);
62
63 // raise it, but don't make it permanent (i.e. restack will revert)
64 void tempRaise(XLayerItem &item);
65
66 // send to next layer up
67 void raiseLayer(XLayerItem &item);
68 void lowerLayer(XLayerItem &item);
69 void moveToLayer(XLayerItem &item, int layernum);
70
71 static void restack(const std::vector<XLayer*>& layers);
72
73private:
74 void restack();
75 void restackAndTempRaise(XLayerItem &item);
76
77 MultLayers &m_manager;
78 int m_layernum;
79 bool m_needs_restack;
80 ItemList m_items;
81};
82
83} // namespace FbTk
84
85#endif // FBTK_XLAYER_HH
diff --git a/src/FbTk/XLayerItem.hh b/src/FbTk/XLayerItem.hh
deleted file mode 100644
index 67da511..0000000
--- a/src/FbTk/XLayerItem.hh
+++ /dev/null
@@ -1,79 +0,0 @@
1// XLayerItem.hh for FbTk - fluxbox toolkit
2// Copyright (c) 2003 Henrik Kinnunen (fluxgen at fluxbox dot org)
3// and Simon Bowden (rathnor at users.sourceforge.net)
4//
5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in
13// all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
22
23#ifndef FBTK_XLAYERITEM_HH
24#define FBTK_XLAYERITEM_HH
25
26#include "XLayer.hh"
27#include "NotCopyable.hh"
28#include <vector>
29
30namespace FbTk {
31
32class FbWindow;
33
34class XLayerItem : private NotCopyable {
35public:
36 typedef std::vector<FbWindow *> Windows;
37
38 XLayerItem(FbWindow &win, XLayer &layer);
39 ~XLayerItem();
40
41 void setLayer(XLayer &layer);
42
43 void raise();
44 void lower();
45 void tempRaise(); // this raise gets reverted by a restack()
46
47 // send to next layer up
48 void raiseLayer();
49 void lowerLayer();
50 void moveToLayer(int layernum);
51
52 // this is needed for step and cycle functions
53 // (you need to know the next one visible, otherwise nothing may appear to happen)
54 // not yet implemented
55 bool visible() const { return true; }
56
57 const XLayer &getLayer() const { return *m_layer; }
58 XLayer &getLayer() { return *m_layer; }
59 int getLayerNum() { return m_layer->getLayerNum(); }
60
61 // an XLayerItem holds several windows that are equivalent in a layer
62 // (i.e. if one is raised, then they should all be).
63 void addWindow(FbWindow &win);
64 void removeWindow(FbWindow &win);
65
66 // using this you can bring one window to the top of this item (equivalent to add then remove)
67 void bringToTop(FbWindow &win);
68
69 Windows &getWindows() { return m_windows; }
70 size_t numWindows() const { return m_windows.size(); }
71
72private:
73 XLayer *m_layer;
74 Windows m_windows;
75};
76
77}
78
79#endif // FBTK_XLAYERITEM_HH
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh
index 162bf3d..68da564 100644
--- a/src/FbWinFrame.hh
+++ b/src/FbWinFrame.hh
@@ -27,7 +27,7 @@
27#include "FbTk/RefCount.hh" 27#include "FbTk/RefCount.hh"
28#include "FbTk/Subject.hh" 28#include "FbTk/Subject.hh"
29#include "FbTk/Color.hh" 29#include "FbTk/Color.hh"
30#include "FbTk/XLayerItem.hh" 30#include "FbTk/LayerItem.hh"
31#include "FbTk/TextButton.hh" 31#include "FbTk/TextButton.hh"
32#include "FbTk/DefaultValue.hh" 32#include "FbTk/DefaultValue.hh"
33#include "FbTk/Container.hh" 33#include "FbTk/Container.hh"
@@ -50,7 +50,7 @@ namespace FbTk {
50class ImageControl; 50class ImageControl;
51template <class T> class Command; 51template <class T> class Command;
52class Texture; 52class Texture;
53class XLayer; 53class Layer;
54} 54}
55 55
56/// holds a window frame with a client window 56/// holds a window frame with a client window
@@ -231,8 +231,8 @@ public:
231 unsigned int buttonHeight() const; 231 unsigned int buttonHeight() const;
232 bool externalTabMode() const { return m_tabmode == EXTERNAL && m_use_tabs; } 232 bool externalTabMode() const { return m_tabmode == EXTERNAL && m_use_tabs; }
233 233
234 const FbTk::XLayerItem &layerItem() const { return m_layeritem; } 234 const FbTk::LayerItem &layerItem() const { return m_layeritem; }
235 FbTk::XLayerItem &layerItem() { return m_layeritem; } 235 FbTk::LayerItem &layerItem() { return m_layeritem; }
236 236
237 const FbTk::Subject &frameExtentSig() const { return m_frame_extent_sig; } 237 const FbTk::Subject &frameExtentSig() const { return m_frame_extent_sig; }
238 FbTk::Subject &frameExtentSig() { return m_frame_extent_sig; } 238 FbTk::Subject &frameExtentSig() { return m_frame_extent_sig; }
@@ -310,7 +310,7 @@ private:
310 //@{ 310 //@{
311 FbTk::FbWindow m_window; ///< base window that holds each decorations (ie titlebar, handles) 311 FbTk::FbWindow m_window; ///< base window that holds each decorations (ie titlebar, handles)
312 // want this deleted before the windows in it 312 // want this deleted before the windows in it
313 FbTk::XLayerItem m_layeritem; 313 FbTk::LayerItem m_layeritem;
314 314
315 FbTk::FbWindow m_titlebar; ///< titlebar window 315 FbTk::FbWindow m_titlebar; ///< titlebar window
316 FbTk::Container m_tab_container; ///< Holds tabs 316 FbTk::Container m_tab_container; ///< Holds tabs
diff --git a/src/LayerMenu.cc b/src/LayerMenu.cc
index f1d9dd9..0638366 100644
--- a/src/LayerMenu.cc
+++ b/src/LayerMenu.cc
@@ -30,7 +30,7 @@
30 30
31LayerMenu::LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 31LayerMenu::LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
32 FbTk::ImageControl &imgctrl, 32 FbTk::ImageControl &imgctrl,
33 FbTk::XLayer &layer, LayerObject *object, bool save_rc): 33 FbTk::Layer &layer, LayerObject *object, bool save_rc):
34 ToggleMenu(tm, imgctrl, layer) { 34 ToggleMenu(tm, imgctrl, layer) {
35 _FB_USES_NLS; 35 _FB_USES_NLS;
36 36
diff --git a/src/LayerMenu.hh b/src/LayerMenu.hh
index 40e934c..ffb6c3f 100644
--- a/src/LayerMenu.hh
+++ b/src/LayerMenu.hh
@@ -64,7 +64,7 @@ class LayerMenu : public ToggleMenu {
64public: 64public:
65 LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 65 LayerMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
66 FbTk::ImageControl &imgctrl, 66 FbTk::ImageControl &imgctrl,
67 FbTk::XLayer &layer, LayerObject *item, bool save_rc); 67 FbTk::Layer &layer, LayerObject *item, bool save_rc);
68 void show(); 68 void show();
69}; 69};
70 70
diff --git a/src/Screen.cc b/src/Screen.cc
index 1f53edc..e13c2c6 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -62,7 +62,7 @@
62#include "FbTk/FbWindow.hh" 62#include "FbTk/FbWindow.hh"
63#include "FbTk/SimpleCommand.hh" 63#include "FbTk/SimpleCommand.hh"
64#include "FbTk/MultLayers.hh" 64#include "FbTk/MultLayers.hh"
65#include "FbTk/XLayerItem.hh" 65#include "FbTk/LayerItem.hh"
66#include "FbTk/MacroCommand.hh" 66#include "FbTk/MacroCommand.hh"
67#include "FbTk/StringUtil.hh" 67#include "FbTk/StringUtil.hh"
68#include "FbTk/ImageControl.hh" 68#include "FbTk/ImageControl.hh"
@@ -1794,7 +1794,7 @@ void BScreen::hideGeometry() {
1794 m_geom_window->hide(); 1794 m_geom_window->hide();
1795} 1795}
1796 1796
1797void BScreen::setLayer(FbTk::XLayerItem &item, int layernum) { 1797void BScreen::setLayer(FbTk::LayerItem &item, int layernum) {
1798 m_layermanager.moveToLayer(item, layernum); 1798 m_layermanager.moveToLayer(item, layernum);
1799} 1799}
1800 1800
diff --git a/src/Screen.hh b/src/Screen.hh
index b3e80be..1a4ba9f 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -72,7 +72,7 @@ class OSDWindow;
72namespace FbTk { 72namespace FbTk {
73class Menu; 73class Menu;
74class ImageControl; 74class ImageControl;
75class XLayerItem; 75class LayerItem;
76class FbWindow; 76class FbWindow;
77class Subject; 77class Subject;
78} 78}
@@ -386,7 +386,7 @@ public:
386 386
387 TooltipWindow& tooltipWindow() { return *m_tooltip_window; } 387 TooltipWindow& tooltipWindow() { return *m_tooltip_window; }
388 388
389 void setLayer(FbTk::XLayerItem &item, int layernum); 389 void setLayer(FbTk::LayerItem &item, int layernum);
390 // remove? no, items are never removed from their layer until they die 390 // remove? no, items are never removed from their layer until they die
391 391
392 /// updates root window size and resizes/reconfigures screen clients 392 /// updates root window size and resizes/reconfigures screen clients
diff --git a/src/Slit.cc b/src/Slit.cc
index bdd1a28..aa62997 100644
--- a/src/Slit.cc
+++ b/src/Slit.cc
@@ -46,7 +46,7 @@
46#include "FbCommands.hh" 46#include "FbCommands.hh"
47#include "Layer.hh" 47#include "Layer.hh"
48#include "LayerMenu.hh" 48#include "LayerMenu.hh"
49#include "FbTk/XLayer.hh" 49#include "FbTk/Layer.hh"
50#include "RootTheme.hh" 50#include "RootTheme.hh"
51#include "FbMenu.hh" 51#include "FbMenu.hh"
52 52
@@ -218,7 +218,7 @@ private:
218unsigned int Slit::s_eventmask = SubstructureRedirectMask | ButtonPressMask | 218unsigned int Slit::s_eventmask = SubstructureRedirectMask | ButtonPressMask |
219 EnterWindowMask | LeaveWindowMask | ExposureMask; 219 EnterWindowMask | LeaveWindowMask | ExposureMask;
220 220
221Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename) 221Slit::Slit(BScreen &scr, FbTk::Layer &layer, const char *filename)
222 : m_hidden(false), m_visible(false), 222 : m_hidden(false), m_visible(false),
223 m_screen(scr), 223 m_screen(scr),
224 m_clientlist_menu(scr.menuTheme(), 224 m_clientlist_menu(scr.menuTheme(),
@@ -292,7 +292,7 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
292 frame.window.setAlpha(*m_rc_alpha); 292 frame.window.setAlpha(*m_rc_alpha);
293 } 293 }
294 294
295 m_layeritem.reset(new FbTk::XLayerItem(frame.window, layer)); 295 m_layeritem.reset(new FbTk::LayerItem(frame.window, layer));
296 296
297 m_layermenu.reset(new LayerMenu(scr.menuTheme(), 297 m_layermenu.reset(new LayerMenu(scr.menuTheme(),
298 scr.imageControl(), 298 scr.imageControl(),
diff --git a/src/Slit.hh b/src/Slit.hh
index 5514b42..fea43ea 100644
--- a/src/Slit.hh
+++ b/src/Slit.hh
@@ -37,7 +37,7 @@
37#include "FbTk/FbWindow.hh" 37#include "FbTk/FbWindow.hh"
38#include "FbTk/Timer.hh" 38#include "FbTk/Timer.hh"
39#include "FbTk/Resource.hh" 39#include "FbTk/Resource.hh"
40#include "FbTk/XLayerItem.hh" 40#include "FbTk/LayerItem.hh"
41#include "FbTk/Signal.hh" 41#include "FbTk/Signal.hh"
42 42
43#include <X11/Xutil.h> 43#include <X11/Xutil.h>
@@ -69,7 +69,7 @@ public:
69 RIGHTBOTTOM, RIGHTCENTER, RIGHTTOP 69 RIGHTBOTTOM, RIGHTCENTER, RIGHTTOP
70 }; 70 };
71 71
72 Slit(BScreen &screen, FbTk::XLayer &layer, const char *filename = 0); 72 Slit(BScreen &screen, FbTk::Layer &layer, const char *filename = 0);
73 virtual ~Slit(); 73 virtual ~Slit();
74 74
75 void show() { frame.window.show(); m_visible = true; } 75 void show() { frame.window.show(); m_visible = true; }
@@ -178,7 +178,7 @@ private:
178 // for KDE 178 // for KDE
179 Atom m_kwm1_dockwindow, m_kwm2_dockwindow; 179 Atom m_kwm1_dockwindow, m_kwm2_dockwindow;
180 180
181 std::auto_ptr<FbTk::XLayerItem> m_layeritem; 181 std::auto_ptr<FbTk::LayerItem> m_layeritem;
182 std::auto_ptr<SlitTheme> m_slit_theme; 182 std::auto_ptr<SlitTheme> m_slit_theme;
183 static unsigned int s_eventmask; 183 static unsigned int s_eventmask;
184 Strut *m_strut; 184 Strut *m_strut;
diff --git a/src/ToggleMenu.hh b/src/ToggleMenu.hh
index e7c0ad0..9f6f00b 100644
--- a/src/ToggleMenu.hh
+++ b/src/ToggleMenu.hh
@@ -31,7 +31,7 @@
31class ToggleMenu: public FbMenu { 31class ToggleMenu: public FbMenu {
32public: 32public:
33 ToggleMenu(class FbTk::ThemeProxy<FbTk::MenuTheme> &tm, 33 ToggleMenu(class FbTk::ThemeProxy<FbTk::MenuTheme> &tm,
34 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer): 34 FbTk::ImageControl &imgctrl, FbTk::Layer &layer):
35 FbMenu(tm, imgctrl, layer) { } 35 FbMenu(tm, imgctrl, layer) { }
36 36
37 virtual ~ToggleMenu() {} 37 virtual ~ToggleMenu() {}
diff --git a/src/Toolbar.cc b/src/Toolbar.cc
index 26722f7..896268f 100644
--- a/src/Toolbar.cc
+++ b/src/Toolbar.cc
@@ -181,7 +181,7 @@ Toolbar::Frame::~Frame() {
181 evm.remove(window); 181 evm.remove(window);
182} 182}
183 183
184Toolbar::Toolbar(BScreen &scrn, FbTk::XLayer &layer, size_t width): 184Toolbar::Toolbar(BScreen &scrn, FbTk::Layer &layer, size_t width):
185 m_hidden(false), 185 m_hidden(false),
186 frame(*this, scrn.screenNumber()), 186 frame(*this, scrn.screenNumber()),
187 m_window_pm(0), 187 m_window_pm(0),
diff --git a/src/Toolbar.hh b/src/Toolbar.hh
index ed77335..1f41ed5 100644
--- a/src/Toolbar.hh
+++ b/src/Toolbar.hh
@@ -37,8 +37,8 @@
37 37
38#include "FbTk/Timer.hh" 38#include "FbTk/Timer.hh"
39#include "FbTk/Resource.hh" 39#include "FbTk/Resource.hh"
40#include "FbTk/XLayer.hh" 40#include "FbTk/Layer.hh"
41#include "FbTk/XLayerItem.hh" 41#include "FbTk/LayerItem.hh"
42#include "FbTk/EventHandler.hh" 42#include "FbTk/EventHandler.hh"
43#include "FbTk/FbWindow.hh" 43#include "FbTk/FbWindow.hh"
44#include "FbTk/Signal.hh" 44#include "FbTk/Signal.hh"
@@ -74,7 +74,7 @@ public:
74 }; 74 };
75 75
76 /// Create a toolbar on the screen with specific width 76 /// Create a toolbar on the screen with specific width
77 Toolbar(BScreen &screen, FbTk::XLayer &layer, size_t width = 200); 77 Toolbar(BScreen &screen, FbTk::Layer &layer, size_t width = 200);
78 78
79 virtual ~Toolbar(); 79 virtual ~Toolbar();
80 80
@@ -102,7 +102,7 @@ public:
102 void reconfigure(); 102 void reconfigure();
103 void setPlacement(Placement where); 103 void setPlacement(Placement where);
104 104
105 int layerNumber() const { return const_cast<FbTk::XLayerItem &>(m_layeritem).getLayerNum(); } 105 int layerNumber() const { return const_cast<FbTk::LayerItem &>(m_layeritem).getLayerNum(); }
106 106
107 const FbTk::Menu &menu() const { return m_toolbarmenu; } 107 const FbTk::Menu &menu() const { return m_toolbarmenu; }
108 FbTk::Menu &menu() { return m_toolbarmenu; } 108 FbTk::Menu &menu() { return m_toolbarmenu; }
@@ -164,7 +164,7 @@ private:
164 164
165 FbTk::Timer m_hide_timer; ///< timer to for auto hide toolbar 165 FbTk::Timer m_hide_timer; ///< timer to for auto hide toolbar
166 166
167 FbTk::XLayerItem m_layeritem; ///< layer item, must be declared before layermenu 167 FbTk::LayerItem m_layeritem; ///< layer item, must be declared before layermenu
168 LayerMenu m_layermenu; 168 LayerMenu m_layermenu;
169 FbMenu m_placementmenu, m_toolbarmenu; 169 FbMenu m_placementmenu, m_toolbarmenu;
170#ifdef XINERAMA 170#ifdef XINERAMA
diff --git a/src/Window.hh b/src/Window.hh
index fee2807..9c2037a 100644
--- a/src/Window.hh
+++ b/src/Window.hh
@@ -30,7 +30,7 @@
30#include "FbTk/Subject.hh" 30#include "FbTk/Subject.hh"
31#include "FbTk/Observer.hh" 31#include "FbTk/Observer.hh"
32#include "FbTk/EventHandler.hh" 32#include "FbTk/EventHandler.hh"
33#include "FbTk/XLayerItem.hh" 33#include "FbTk/LayerItem.hh"
34#include "FbTk/Signal.hh" 34#include "FbTk/Signal.hh"
35 35
36#include "FbWinFrame.hh" 36#include "FbWinFrame.hh"
@@ -55,7 +55,7 @@ namespace FbTk {
55class TextButton; 55class TextButton;
56class MenuTheme; 56class MenuTheme;
57class ImageControl; 57class ImageControl;
58class XLayer; 58class Layer;
59} 59}
60 60
61/// Creates the window frame and handles any window event for it 61/// Creates the window frame and handles any window event for it
@@ -403,8 +403,8 @@ public:
403 403
404 bool isTyping() const; 404 bool isTyping() const;
405 405
406 const FbTk::XLayerItem &layerItem() const { return m_frame.layerItem(); } 406 const FbTk::LayerItem &layerItem() const { return m_frame.layerItem(); }
407 FbTk::XLayerItem &layerItem() { return m_frame.layerItem(); } 407 FbTk::LayerItem &layerItem() { return m_frame.layerItem(); }
408 408
409 Window clientWindow() const; 409 Window clientWindow() const;
410 410
diff --git a/src/Xinerama.hh b/src/Xinerama.hh
index 9d7941b..b0ff70e 100644
--- a/src/Xinerama.hh
+++ b/src/Xinerama.hh
@@ -63,7 +63,7 @@ template <typename ItemType>
63class XineramaHeadMenu : public ToggleMenu { 63class XineramaHeadMenu : public ToggleMenu {
64public: 64public:
65 XineramaHeadMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen, 65 XineramaHeadMenu(FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen,
66 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, 66 FbTk::ImageControl &imgctrl, FbTk::Layer &layer,
67 ItemType &item, const FbTk::FbString & title = ""); 67 ItemType &item, const FbTk::FbString & title = "");
68 void reloadHeads(); 68 void reloadHeads();
69 69
@@ -76,7 +76,7 @@ private:
76template <typename ItemType> 76template <typename ItemType>
77XineramaHeadMenu<ItemType>::XineramaHeadMenu( 77XineramaHeadMenu<ItemType>::XineramaHeadMenu(
78 FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen, 78 FbTk::ThemeProxy<FbTk::MenuTheme> &tm, BScreen &screen,
79 FbTk::ImageControl &imgctrl, FbTk::XLayer &layer, ItemType &item, 79 FbTk::ImageControl &imgctrl, FbTk::Layer &layer, ItemType &item,
80 const FbTk::FbString & title): 80 const FbTk::FbString & title):
81 ToggleMenu(tm, imgctrl, layer), 81 ToggleMenu(tm, imgctrl, layer),
82 m_object(item), m_screen(screen) 82 m_object(item), m_screen(screen)
diff --git a/src/fluxbox.cc b/src/fluxbox.cc
index 4513c47..ee0abae 100644
--- a/src/fluxbox.cc
+++ b/src/fluxbox.cc
@@ -465,7 +465,7 @@ Fluxbox::Fluxbox(int argc, char **argv,
465Fluxbox::~Fluxbox() { 465Fluxbox::~Fluxbox() {
466 466
467 // this needs to be destroyed before screens; otherwise, menus stored in 467 // this needs to be destroyed before screens; otherwise, menus stored in
468 // key commands cause a segfault when the XLayerItem is destroyed 468 // key commands cause a segfault when the LayerItem is destroyed
469 m_key.reset(0); 469 m_key.reset(0);
470 470
471 leaveAll(); // leave all connections 471 leaveAll(); // leave all connections
diff --git a/src/tests/testLayers.cc b/src/tests/testLayers.cc
index 23d2f67..181e138 100644
--- a/src/tests/testLayers.cc
+++ b/src/tests/testLayers.cc
@@ -7,8 +7,8 @@
7#include "Color.hh" 7#include "Color.hh"
8#include "EventManager.hh" 8#include "EventManager.hh"
9#include <iostream> 9#include <iostream>
10#include "XLayer.hh" 10#include "Layer.hh"
11#include "XLayerItem.hh" 11#include "LayerItem.hh"
12#include "MultLayers.hh" 12#include "MultLayers.hh"
13 13
14using namespace FbTk; 14using namespace FbTk;
@@ -87,26 +87,26 @@ int main() {
87 Display *disp = app.display(); 87 Display *disp = app.display();
88 XEvent event; 88 XEvent event;
89 MultLayers *ml = new MultLayers(3); 89 MultLayers *ml = new MultLayers(3);
90 XLayerItem *item_red = new XLayerItem(win_red.window()); 90 LayerItem *item_red = new XLayerItem(win_red.window());
91 item_red->addWindow(win_redB.window()); 91 item_red->addWindow(win_redB.window());
92 XLayerItem *item_green = new XLayerItem(win_green.window()); 92 LayerItem *item_green = new LayerItem(win_green.window());
93 XLayerItem *item_blue = new XLayerItem(win_blue.window()); 93 LayerItem *item_blue = new LayerItem(win_blue.window());
94 94
95 ml->addToTop(*item_blue, 0); 95 ml->addToTop(*item_blue, 0);
96 ml->addToTop(*item_green, 0); 96 ml->addToTop(*item_green, 0);
97 ml->addToTop(*item_red, 0); 97 ml->addToTop(*item_red, 0);
98 98
99 XLayerItem *item_red2 = new XLayerItem(win_red2.window()); 99 LayerItem *item_red2 = new LayerItem(win_red2.window());
100 XLayerItem *item_green2 = new XLayerItem(win_green2.window()); 100 LayerItem *item_green2 = new LayerItem(win_green2.window());
101 XLayerItem *item_blue2 = new XLayerItem(win_blue2.window()); 101 LayerItem *item_blue2 = new LayerItem(win_blue2.window());
102 102
103 ml->addToTop(*item_blue2, 1); 103 ml->addToTop(*item_blue2, 1);
104 ml->addToTop(*item_green2, 1); 104 ml->addToTop(*item_green2, 1);
105 ml->addToTop(*item_red2, 1); 105 ml->addToTop(*item_red2, 1);
106 106
107 XLayerItem *item_red3 = new XLayerItem(win_red3.window()); 107 LayerItem *item_red3 = new LayerItem(win_red3.window());
108 XLayerItem *item_green3 = new XLayerItem(win_green3.window()); 108 LayerItem *item_green3 = new LayerItem(win_green3.window());
109 XLayerItem *item_blue3 = new XLayerItem(win_blue3.window()); 109 LayerItem *item_blue3 = new LayerItem(win_blue3.window());
110 110
111 ml->addToTop(*item_blue3, 2); 111 ml->addToTop(*item_blue3, 2);
112 ml->addToTop(*item_green3, 2); 112 ml->addToTop(*item_green3, 2);