all repos — fluxbox @ 1b063dcea92e0a7ac5008518fc5c13f03c055f54

custom fork of the fluxbox windowmanager

Integration of new Layering code, plus updates to the layering code itself
 - new KeyActions: Raise/LowerLayer, AlwaysOnTop/Bottom, Top/BottomLayer
Added a "Quit" KeyAction
rathnor rathnor
commit

1b063dcea92e0a7ac5008518fc5c13f03c055f54

parent

5244fc32447d2649a52a06dc84d96da94e9fd715

M ChangeLogChangeLog

@@ -1,5 +1,13 @@

(Format: Year/Month/Day) Changes for 0.1.15: +*03/02/03: + * Integration of new Layering code, plus updates to the code (Simon) + - new KeyActions: Raise/LowerLayer, AlwaysOnTop/Bottom, Top/BottomLayer + AtomHandler.hh Ewmh.hh/cc FbWindow.hh/cc Menu.hh MultLayers.hh/cc + XLayer.hh/cc XLayerItem.hh/cc Gnome.hh/cc Keys.hh/cc Screen.hh/cc Tab.cc + Window.hh/cc Workspace.hh/cc fluxbox.hh/cc fluxbox.1.in + * Added a "Quit" KeyAction (Simon) + Keys.hh/cc, fluxbox.cc fluxbox.1.in *03/01/23: * Added polish locales to fluxbox-generate_menu (thanks Adam Byrtek) *03/01/16:
M doc/fluxbox.1.indoc/fluxbox.1.in

@@ -751,7 +751,14 @@ .EX

Minimize Raise Lower +RaiseLayer +LowerLayer +TopLayer +BottomLayer +AlwaysOnTop (this is an alias for TopLayer) +AlwaysOnBottom (similarly) Close +Quit RootMenu Workspace N (where N is positive integer) Workspace1
M src/AtomHandler.hhsrc/AtomHandler.hh

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: AtomHandler.hh,v 1.5 2002/12/01 13:41:54 rathnor Exp $ +// $Id: AtomHandler.hh,v 1.6 2003/02/02 16:32:37 rathnor Exp $ #ifndef ATOMHANDLER_HH #define ATOMHANDLER_HH

@@ -44,7 +44,8 @@

virtual void updateWorkspace(FluxboxWindow &win) = 0; virtual void updateState(FluxboxWindow &win) = 0; virtual void updateHints(FluxboxWindow &win) = 0; - + virtual void updateLayer(FluxboxWindow &win) = 0; + virtual bool checkClientMessage(const XClientMessageEvent &ce, BScreen * const screen, FluxboxWindow * const win) = 0;
M src/Ewmh.ccsrc/Ewmh.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Ewmh.cc,v 1.9 2003/01/05 23:04:46 fluxgen Exp $ +// $Id: Ewmh.cc,v 1.10 2003/02/02 16:32:37 rathnor Exp $ #include "Ewmh.hh"

@@ -204,6 +204,10 @@ }

void Ewmh::updateState(FluxboxWindow &win) { +} + +void Ewmh::updateLayer(FluxboxWindow &win) { + //TODO _NET_WM_WINDOW_TYPE } void Ewmh::updateHints(FluxboxWindow &win) {
M src/Ewmh.hhsrc/Ewmh.hh

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Ewmh.hh,v 1.4 2002/12/01 13:41:56 rathnor Exp $ +// $Id: Ewmh.hh,v 1.5 2003/02/02 16:32:37 rathnor Exp $ #include "AtomHandler.hh"

@@ -40,6 +40,7 @@ void updateCurrentWorkspace(const BScreen &screen);

void updateWorkspaceCount(const BScreen &screen); void updateState(FluxboxWindow &win); + void updateLayer(FluxboxWindow &win); void updateHints(FluxboxWindow &win); void updateWorkspace(FluxboxWindow &win);
M src/FbTk/FbWindow.ccsrc/FbTk/FbWindow.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: FbWindow.cc,v 1.4 2003/01/05 22:58:11 fluxgen Exp $ +// $Id: FbWindow.cc,v 1.5 2003/02/02 16:32:40 rathnor Exp $ #include "FbWindow.hh"

@@ -33,7 +33,7 @@

Display *FbWindow::s_display = 0; FbWindow::FbWindow():m_parent(0), m_screen_num(0), m_window(0), m_x(0), m_y(0), - m_width(0), m_height(0), m_border_width(0) { + m_width(0), m_height(0), m_border_width(0), m_layeritem(0) { if (s_display == 0) s_display = App::instance()->display();
M src/FbTk/FbWindow.hhsrc/FbTk/FbWindow.hh

@@ -19,10 +19,12 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: FbWindow.hh,v 1.6 2003/01/05 22:55:14 fluxgen Exp $ +// $Id: FbWindow.hh,v 1.7 2003/02/02 16:32:40 rathnor Exp $ #ifndef FBTK_FBWINDOW_HH #define FBTK_FBWINDOW_HH + +#include "XLayerItem.hh" #include <X11/Xlib.h>

@@ -70,6 +72,10 @@ virtual void moveResize(int x, int y, size_t width, size_t height);

void lower(); void raise(); + XLayerItem *getLayerItem() const { return m_layeritem; } + void setLayerItem(XLayerItem *item) { m_layeritem = item; } + + const FbWindow *parent() const { return m_parent; } Window window() const { return m_window; } int x() const { return m_x; }

@@ -98,6 +104,8 @@ Window m_window; ///< the X window

int m_x, m_y; ///< position of window size_t m_width, m_height; ///< size of window size_t m_border_width; // border size + + XLayerItem *m_layeritem; }; bool operator == (Window win, const FbWindow &fbwin);
M src/FbTk/Menu.hhsrc/FbTk/Menu.hh

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Menu.hh,v 1.5 2003/01/12 17:02:33 fluxgen Exp $ +// $Id: Menu.hh,v 1.6 2003/02/02 16:32:41 rathnor Exp $ #ifndef FBTK_MENU_HH #define FBTK_MENU_HH

@@ -35,6 +35,7 @@ #include "FbWindow.hh"

#include "EventHandler.hh" #include "RefCount.hh" #include "Command.hh" +#include "XLayerItem.hh" namespace FbTk {

@@ -80,6 +81,11 @@ /// raise this window

void raise(); /// lower this window void lower(); + + XLayerItem *getLayerItem() const { return menu.window.getLayerItem(); } + void setLayerItem(XLayerItem *item) { menu.window.setLayerItem(item); } + + void disableTitle(); void enableTitle(); /**
M src/FbTk/MultLayers.ccsrc/FbTk/MultLayers.cc

@@ -20,11 +20,12 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: MultLayers.cc,v 1.2 2003/01/29 21:42:52 rathnor Exp $ +// $Id: MultLayers.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $ #include "MultLayers.hh" #include "XLayer.hh" #include "XLayerItem.hh" +#include "App.hh" using namespace FbTk;

@@ -51,10 +52,44 @@ return item;

} +XLayerItem *MultLayers::getItemBelow(XLayerItem &item) { + XLayer *curr_layer = item.getLayer(); + cerr<<"getItemBelow xlayer = "<<hex<<curr_layer<<endl; + // assume that the LayerItem does exist in a layer. + XLayerItem *ret = curr_layer->getItemBelow(item); + + if (!ret) { + int num = curr_layer->getLayerNum()-1; + while (num >= 0 && !ret) { + ret = m_layers[num]->getItemBelow(item); + num--; + } + } + + return ret; +} + +XLayerItem *MultLayers::getItemAbove(XLayerItem &item) { + XLayer *curr_layer = item.getLayer(); + + // assume that the LayerItem does exist in a layer. + XLayerItem *ret = curr_layer->getItemAbove(item); + + if (!ret) { + ret = getLowestItemAboveLayer(curr_layer->getLayerNum()); + } + + return ret; +} void MultLayers::addToTop(XLayerItem &item, int layernum) { - if (layernum < 0 || layernum >= m_numlayers) return; + if (layernum < 0) + layernum = 0; + else if (layernum >= m_numlayers) + layernum = m_numlayers-1; + m_layers[layernum]->insert(item); + restack(); } void MultLayers::remove(XLayerItem &item) {

@@ -70,24 +105,64 @@ /* raise the item one level */

void MultLayers::raise(XLayerItem &item) { // get the layer it is in XLayer *curr_layer = item.getLayer(); - if (!curr_layer || curr_layer->getLayerNum() == 0 || m_numlayers == 1) { - // do nothing - return; - } - - curr_layer->remove(item); - m_layers[curr_layer->getLayerNum()-1]->insert(item); + 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(); - if (!curr_layer || curr_layer->getLayerNum() >= (m_numlayers-1) || m_numlayers == 1) { + 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 return; - } + + if (layernum < 0) + layernum = 0; + else if (layernum >= m_numlayers) + layernum = m_numlayers-1; curr_layer->remove(item); - m_layers[curr_layer->getLayerNum()+1]->insert(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(); + } + + Window *winlist = new Window[size]; + for (i=0; i < m_numlayers; i++) { + + 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); + } + } + } + + XRestackWindows(FbTk::App::instance()->display(), winlist, size); +} + +int MultLayers::size() { + int i = 0, num = 0; + for (; i < m_numlayers; i++) { + num += m_layers[i]->countWindows(); + } + return num; }
M src/FbTk/MultLayers.hhsrc/FbTk/MultLayers.hh

@@ -20,7 +20,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: MultLayers.hh,v 1.2 2003/01/29 21:42:53 rathnor Exp $ +// $Id: MultLayers.hh,v 1.3 2003/02/02 16:32:41 rathnor Exp $ #ifndef FBTK_MULTLAYERS_HH #define FBTK_MULTLAYERS_HH

@@ -37,17 +37,20 @@ public:

MultLayers(int numlayers); ~MultLayers(); XLayerItem *getLowestItemAboveLayer(int layernum); + + // if there are none below, it will return null + XLayerItem *getItemBelow(XLayerItem &item); + XLayerItem *getItemAbove(XLayerItem &item); void addToTop(XLayerItem &item, int layernum); void remove(XLayerItem &item); - - //void move(XLayerItem &item, int layernum); // raise/lower the item a whole layer, not just to top of current layer void raise(XLayerItem &item); void lower(XLayerItem &item); - //void moveToTop(XLayerItem &item); - //void moveToBottom(XLayerItem &item); + void moveToLayer(XLayerItem &item, int layernum); + int size(); + void restack(); private: int m_numlayers;
M src/FbTk/XLayer.ccsrc/FbTk/XLayer.cc

@@ -20,7 +20,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: XLayer.cc,v 1.2 2003/01/29 21:42:53 rathnor Exp $ +// $Id: XLayer.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $ #include "XLayer.hh" #include "XLayerItem.hh"

@@ -38,14 +38,11 @@ XLayer::~XLayer() {

} void XLayer::restack() { - int numWindows = 0; + int numWindows = countWindows(); + + // each LayerItem can contain several windows iterator it = itemList().begin(); iterator it_end = itemList().end(); - for (size_t i=0; it != it_end; ++it, i++) { - numWindows += (*it)->numWindows(); - } - - // each LayerItem can contain several windows it = itemList().begin(); it_end = itemList().end(); Window *winlist = new Window[numWindows];

@@ -63,6 +60,17 @@

delete [] winlist; } +int XLayer::countWindows() { + int numWindows = 0; + iterator it = itemList().begin(); + iterator it_end = itemList().end(); + for (size_t i=0; it != it_end; ++it, i++) { + numWindows += (*it)->numWindows(); + } + return numWindows; +} + + void XLayer::stackBelowItem(XLayerItem *item, XLayerItem *above) { // little optimisation Window *winlist;

@@ -79,6 +87,7 @@ } else {

return; } } else { + i=1; // stack relative to one above

@@ -87,13 +96,12 @@ winlist = new Window[size];

winlist[0] = above->getWindows().front(); } - XLayerItem::Windows::iterator it = item->getWindows().begin(); XLayerItem::Windows::iterator it_end = item->getWindows().end(); for (; it != it_end; ++it, i++) { winlist[i] = (*it); } - + XRestackWindows(FbTk::App::instance()->display(), winlist, size); delete [] winlist;

@@ -106,7 +114,7 @@ cerr<<__FILE__<<"("<<__LINE__<<"): Insert using non-zero position not valid in XLayer"<<endl;

#endif // DEBUG itemList().push_front(&item); - item.setLayer(*this); + item.setLayer(this); // restack below next window up item.setLayerIterator(itemList().begin()); stackBelowItem(&item, m_manager.getLowestItemAboveLayer(m_layernum));

@@ -115,6 +123,7 @@ }

void XLayer::remove(XLayerItem &item) { itemList().erase(item.getLayerIterator()); + item.setLayer(0); } void XLayer::cycleUp() {

@@ -187,8 +196,9 @@

void XLayer::raise(XLayerItem &item) { // assume it is already in this layer - if (&item == itemList().front()) + if (&item == itemList().front()) { return; // nothing to do + } itemList().erase(item.getLayerIterator()); itemList().push_front(&item);

@@ -215,3 +225,22 @@ XLayerItem *XLayer::getLowestItem() {

if (itemList().empty()) return 0; else return itemList().back(); } + +XLayerItem *XLayer::getItemBelow(XLayerItem &item) { + iterator it = item.getLayerIterator(); + if (it == itemList().begin()) { + return 0; + } else { + return *(--it); + } +} + +XLayerItem *XLayer::getItemAbove(XLayerItem &item) { + iterator it = item.getLayerIterator(); + it++; + if (it == itemList().end()) { + return 0; + } else { + return *it; + } +}
M src/FbTk/XLayer.hhsrc/FbTk/XLayer.hh

@@ -20,7 +20,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: XLayer.hh,v 1.1 2003/01/16 12:41:27 rathnor Exp $ +// $Id: XLayer.hh,v 1.2 2003/02/02 16:32:41 rathnor Exp $ #ifndef FBTK_XLAYER_HH

@@ -36,18 +36,27 @@ class XLayerItem;

class XLayer : public FbTk::Layer<XLayerItem, std::list<XLayerItem *> > { public: + XLayer(MultLayers &manager, int layernum); ~XLayer(); - //typedef std::list<XLayerItem *>::iterator iterator; + typedef std::list<XLayerItem *> ItemList; + typedef std::list<XLayerItem *>::iterator iterator; + //typedef std::list<XLayerItem *>::reverse_iterator reverse_iterator; void setLayerNum(int layernum) { m_layernum = layernum; }; int getLayerNum() { return m_layernum; }; void restack(); + int countWindows(); void stackBelowItem(XLayerItem *item, XLayerItem *above); XLayerItem *getLowestItem(); - + XLayerItem *getItemBelow(XLayerItem &item); + XLayerItem *getItemAbove(XLayerItem &item); + + const ItemList &getItemList() const { return itemList(); } + ItemList &getItemList() { return itemList(); } + // we redefine these as XLayer has special optimisations, and X restacking needs iterator insert(XLayerItem &item, unsigned int pos=0); void remove(XLayerItem &item);
M src/FbTk/XLayerItem.ccsrc/FbTk/XLayerItem.cc

@@ -20,7 +20,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: XLayerItem.cc,v 1.2 2003/01/29 21:42:53 rathnor Exp $ +// $Id: XLayerItem.cc,v 1.3 2003/02/02 16:32:41 rathnor Exp $ #include "XLayerItem.hh" #include "XLayer.hh"

@@ -39,12 +39,13 @@ m_layeriterator = layer.insert(*this);

}*/ XLayerItem::~XLayerItem() { - m_layer->remove(*this); + if (m_layer) + m_layer->remove(*this); } -void XLayerItem::setLayer(XLayer &layer) { +void XLayerItem::setLayer(XLayer *layer) { // make sure we don't try to set the same layer - m_layer = &layer; + m_layer = layer; } void XLayerItem::raise() {
M src/FbTk/XLayerItem.hhsrc/FbTk/XLayerItem.hh

@@ -20,7 +20,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: XLayerItem.hh,v 1.2 2003/01/29 21:42:53 rathnor Exp $ +// $Id: XLayerItem.hh,v 1.3 2003/02/02 16:32:41 rathnor Exp $ #ifndef FBTK_XLAYERITEM_HH #define FBTK_XLAYERITEM_HH

@@ -38,7 +38,7 @@ typedef std::list<Window> Windows;

XLayerItem(Window win); ~XLayerItem(); - void setLayer(XLayer &layer); + void setLayer(XLayer *layer); XLayer *getLayer() const { return m_layer; } void raise(); void lower();

@@ -46,7 +46,8 @@ void stepUp();

void stepDown(); XLayer::iterator getLayerIterator() const { return m_layeriterator; }; void setLayerIterator(XLayer::iterator it) { m_layeriterator = it; }; - + bool isEmpty() const { return m_windows.empty(); } + // not currently implemented bool visible() { return true; }
M src/Gnome.ccsrc/Gnome.cc

@@ -19,10 +19,11 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Gnome.cc,v 1.6 2002/12/01 13:41:57 rathnor Exp $ +// $Id: Gnome.cc,v 1.7 2003/02/02 16:32:37 rathnor Exp $ #include "Gnome.hh" +#include "fluxbox.hh" #include "Window.hh" #include "Screen.hh"

@@ -61,8 +62,8 @@ m_gnome_wm_supporting_wm_check,

m_gnome_wm_win_workspace_names, m_gnome_wm_win_client_list, m_gnome_wm_win_state, - m_gnome_wm_win_hints -// m_gnome_wm_win_layer not supported yet + m_gnome_wm_win_hints, + m_gnome_wm_win_layer }; //list atoms that we support

@@ -96,8 +97,25 @@ setState(&win, flags);

XFree (data); } - // make sure we get right workspace - updateWorkspace(win); + // load gnome layer atom + if (XGetWindowProperty(disp, win.getClientWindow(), + m_gnome_wm_win_layer, 0, 1, False, XA_CARDINAL, + &ret_type, &fmt, &nitems, &bytes_after, + (unsigned char **) &data) == Success && data) { + flags = *data; + setLayer(&win, flags); + XFree (data); + } + + // load gnome layer atom + if (XGetWindowProperty(disp, win.getClientWindow(), + m_gnome_wm_win_workspace, 0, 1, False, XA_CARDINAL, + &ret_type, &fmt, &nitems, &bytes_after, + (unsigned char **) &data) == Success && data) { + flags = *data; + win.getScreen()->reassociateWindow(&win, flags ,false); + XFree (data); + } }

@@ -209,6 +227,15 @@ m_gnome_wm_win_state,

XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&state, 1); } +void Gnome::updateLayer(FluxboxWindow &win) { + //TODO - map from flux layers to gnome ones + int layernum = win.getLayerNum(); + XChangeProperty(BaseDisplay::getXDisplay(), win.getClientWindow(), + m_gnome_wm_win_layer, + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&layernum, 1); + +} + void Gnome::updateHints(FluxboxWindow &win) { //TODO

@@ -258,7 +285,13 @@ #ifdef DEBUG

cerr<<__FILE__<<"("<<__LINE__<<"): _WIN_HINTS"<<endl; #endif // DEBUG - } else + } else if (ce.message_type == m_gnome_wm_win_layer) { +#ifdef DEBUG + cerr<<__FILE__<<"("<<__LINE__<<"): _WIN_LAYER"<<endl; +#endif // DEBUG + + setLayer(win, ce.data.l[0]); + } else return false; //the gnome atom wasn't found or not supported return true; // we handled the atom

@@ -314,29 +347,37 @@ cerr<<"Arrange Ignore"<<endl;

*/ } -void Gnome::setLayer(GnomeLayer layer) { - FluxboxWindow::WinLayer winlayer; - +void Gnome::setLayer(FluxboxWindow *win, int layer) { + if (!win) return; + + switch (layer) { case WIN_LAYER_DESKTOP: - winlayer = FluxboxWindow::LAYER_BOTTOM; + layer = Fluxbox::instance()->getDesktopLayer(); break; case WIN_LAYER_BELOW: - winlayer = FluxboxWindow::LAYER_BELOW; + layer = Fluxbox::instance()->getBottomLayer(); break; case WIN_LAYER_NORMAL: - winlayer = FluxboxWindow::LAYER_NORMAL; + layer = Fluxbox::instance()->getNormalLayer(); break; case WIN_LAYER_ONTOP: + layer = Fluxbox::instance()->getTopLayer(); + break; case WIN_LAYER_DOCK: - case WIN_LAYER_ABOVE_DOCK: + layer = Fluxbox::instance()->getSlitLayer(); + break; + //case WIN_LAYER_ABOVE_DOCK: case WIN_LAYER_MENU: - winlayer = FluxboxWindow::LAYER_TOP; + layer = Fluxbox::instance()->getMenuLayer(); break; default: - winlayer = FluxboxWindow::LAYER_NORMAL; + // our windows are in the opposite direction to gnome + layer = Fluxbox::instance()->getDesktopLayer() - layer; break; } + win->getScreen()->setLayer(*win->getLayerItem(),layer); + } void Gnome::createAtoms() {
M src/Gnome.hhsrc/Gnome.hh

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Gnome.hh,v 1.4 2002/12/01 13:41:57 rathnor Exp $ +// $Id: Gnome.hh,v 1.5 2003/02/02 16:32:37 rathnor Exp $ #ifndef GNOME_HH #define GNOME_HH

@@ -73,6 +73,7 @@ void updateCurrentWorkspace(const BScreen &screen);

void updateWorkspaceCount(const BScreen &screen); void updateState(FluxboxWindow &win); + void updateLayer(FluxboxWindow &win); void updateHints(FluxboxWindow &win); void updateWorkspace(FluxboxWindow &win);

@@ -80,7 +81,7 @@

bool checkClientMessage(const XClientMessageEvent &ce, BScreen * const screen, FluxboxWindow * const win); private: - void setLayer(GnomeLayer layer); + void setLayer(FluxboxWindow *win, int layer); void setState(FluxboxWindow *win, int state); void setLayer(int layer); void createAtoms();
M src/Keys.ccsrc/Keys.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -//$Id: Keys.cc,v 1.21 2002/12/01 13:41:57 rathnor Exp $ +//$Id: Keys.cc,v 1.22 2003/02/02 16:32:37 rathnor Exp $ #include "Keys.hh"

@@ -72,6 +72,12 @@ Keys::t_actionstr Keys::m_actionlist[] = {

{"Minimize", ICONIFY}, {"Raise", RAISE}, {"Lower", LOWER}, + {"RaiseLayer", RAISELAYER}, + {"LowerLayer", LOWERLAYER}, + {"TopLayer", TOPLAYER}, + {"BottomLayer", BOTTOMLAYER}, + {"AlwaysOnTop", TOPLAYER}, + {"AlwaysOnBottom", BOTTOMLAYER}, {"Close", CLOSE}, {"AbortKeychain", ABORTKEYCHAIN}, {"Workspace", WORKSPACE},

@@ -122,6 +128,7 @@ {"VerticalDecrement", VERTDEC},

{"ToggleDecor", TOGGLEDECOR}, {"ToggleTab", TOGGLETAB}, {"RootMenu", ROOTMENU}, + {"Quit", QUIT}, {0, LASTKEYGRAB} };

@@ -249,8 +256,9 @@ unsigned int i=0;

for (i=0; i< LASTKEYGRAB; i++) { // +1 on the val[argc] because we dont want to compare the ':' - if (strcasecmp(m_actionlist[i].string, val[argc].c_str()+1) == 0) + if (strcasecmp(m_actionlist[i].string, val[argc].c_str()+1) == 0) { break; + } } if (i < LASTKEYGRAB ) {
M src/Keys.hhsrc/Keys.hh

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Keys.hh,v 1.18 2002/12/01 13:41:57 rathnor Exp $ +// $Id: Keys.hh,v 1.19 2003/02/02 16:32:38 rathnor Exp $ #ifndef KEYS_HH #define KEYS_HH

@@ -36,7 +36,9 @@ Key actions

*/ enum KeyAction{ ICONIFY=0, - RAISE, LOWER, + RAISE, LOWER, + RAISELAYER, LOWERLAYER, TOPLAYER, BOTTOMLAYER, + ALWAYSONTOP, ALWAYSONBOTTOM, // aliases for TOPLAYER, etc CLOSE, ABORTKEYCHAIN, WORKSPACE,

@@ -59,6 +61,7 @@ HORIZINC, VERTINC, HORIZDEC, VERTDEC,

TOGGLEDECOR,// toggle visibility of decor (title, frame, handles) TOGGLETAB, // toggle visibilty of tab ROOTMENU, // pop up rootmenu + QUIT, // Die, quit, logout, shutdown LASTKEYGRAB //mark end of keygrabbs }; /**
M src/Screen.ccsrc/Screen.cc

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Screen.cc,v 1.100 2003/01/12 23:56:49 fluxgen Exp $ +// $Id: Screen.cc,v 1.101 2003/02/02 16:32:38 rathnor Exp $ #include "Screen.hh"

@@ -43,6 +43,8 @@ #include "FbCommands.hh"

#include "BoolMenuItem.hh" //#include "IntResMenuItem.hh" #include "MacroCommand.hh" +#include "XLayerItem.hh" +#include "MultLayers.hh" //use GNU extensions #ifndef _GNU_SOURCE

@@ -132,7 +134,11 @@ return (strcmp((*(char **) one), (*(char **) two)));

} FbTk::Menu *createMenuFromScreen(BScreen &screen) { - return new FbTk::Menu(*screen.menuTheme(), screen.getScreenNumber(), *screen.getImageControl()); + FbTk::Menu *menu = new FbTk::Menu(*screen.menuTheme(), screen.getScreenNumber(), *screen.getImageControl()); + menu->setLayerItem(new FbTk::XLayerItem(menu->windowID())); + + screen.setLayer(*menu->getLayerItem(), Fluxbox::instance()->getMenuLayer()); + return menu; } };

@@ -340,7 +346,8 @@ m_clientlist_sig(*this), // client signal

m_workspacecount_sig(*this), // workspace count signal m_workspacenames_sig(*this), // workspace names signal m_currentworkspace_sig(*this), // current workspace signal - theme(0), m_windowtheme(scrn), + m_layermanager(0), + theme(0), m_windowtheme(scrn), m_menutheme(new FbTk::MenuTheme(scrn)), resource(rm, screenname, altscreenname), m_root_theme(new RootTheme(*this))

@@ -392,6 +399,7 @@ root_colormap_installed = true;

fluxbox->load_rc(this); + m_layermanager = new FbTk::MultLayers(fluxbox->getNumberOfLayers()); image_control->setDither(*resource.image_dither); theme = new Theme(disp, getRootWindow(), colormap(), getScreenNumber(), fluxbox->getStyleFilename(), getRootCommand().c_str());

@@ -461,12 +469,12 @@

Workspace *wkspc = (Workspace *) 0; if (*resource.workspaces != 0) { for (int i = 0; i < *resource.workspaces; ++i) { - wkspc = new Workspace(this, workspacesList.size()); + wkspc = new Workspace(this, *m_layermanager, workspacesList.size()); workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu()); } } else { - wkspc = new Workspace(this, workspacesList.size()); + wkspc = new Workspace(this, *m_layermanager, workspacesList.size()); workspacesList.push_back(wkspc); workspacemenu->insert(wkspc->name().c_str(), &wkspc->menu()); }

@@ -547,7 +555,6 @@

if (win) { XMapRequestEvent mre; mre.window = children[i]; - win->restoreAttributes(); win->mapRequestEvent(mre); } }

@@ -809,7 +816,7 @@ reconfigure();

} int BScreen::addWorkspace() { - Workspace *wkspc = new Workspace(this, workspacesList.size()); + Workspace *wkspc = new Workspace(this, *m_layermanager, workspacesList.size()); workspacesList.push_back(wkspc); addWorkspaceName(wkspc->name().c_str()); // update names //add workspace to workspacemenu

@@ -902,7 +909,7 @@ if (*resource.focus_last && current_workspace->getLastFocusedWindow() &&

!(focused && focused->isMoving())) { current_workspace->getLastFocusedWindow()->setInputFocus(); - } else if (focused && focused->isStuck()) { + } else if (focused && (focused->isStuck() || focused->isMoving())) { focused->setInputFocus(); }

@@ -1184,6 +1191,13 @@

} void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) { + // TODO: I don't think we need this... +#ifdef DEBUG + cerr<<"BScreen::raiseWindows() called"<<endl; +#endif //DEBUG + + /* + Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)]; int i = 0;

@@ -1217,7 +1231,7 @@ session_stack[i++] = (*it);

} XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i); - + */ } void BScreen::saveStrftimeFormat(const char *format) {

@@ -1311,7 +1325,7 @@ break;

} while (*it != focused); if (*it != focused && it != wins.end()) - wksp->raiseWindow(*it); + raiseWindow(*it); }

@@ -1354,7 +1368,7 @@ break;

} while (*it != focused); if (*it != focused && it != wins.end()) - wksp->raiseWindow(*it); + raiseWindow(*it); } }

@@ -1375,8 +1389,7 @@ focused_window_number = fb->getFocusedWindow()->getWindowNumber();

} if ((getCurrentWorkspace()->getCount() > 1) && have_focused) - getWorkspace(fb->getFocusedWindow()->getWorkspaceNumber())-> - raiseWindow(fb->getFocusedWindow()); + raiseWindow(fb->getFocusedWindow()); } void BScreen::initMenu() {

@@ -1923,6 +1936,151 @@ XUnmapWindow(getBaseDisplay()->getXDisplay(), geom_window);

geom_visible = false; } } + +void BScreen::raise(FbTk::XLayerItem &item) { + item.raise(); +} + +void BScreen::lower(FbTk::XLayerItem &item) { + item.lower(); +} + +void BScreen::setLayer(FbTk::XLayerItem &item, int layernum) { + m_layermanager->moveToLayer(item, layernum); +} + +void BScreen::removeLayerItem(FbTk::XLayerItem *item) { + m_layermanager->remove(*item); + delete item; +} + +void BScreen::raiseWindow(FluxboxWindow *w) { + FluxboxWindow *win = w; + + while (win->getTransientFor()) { + win = win->getTransientFor(); + assert(win != win->getTransientFor()); + } + + if (!win->isIconic()) { + updateNetizenWindowRaise(win->getClientWindow()); + win->getLayerItem()->raise(); + } + std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin(); + std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end(); + for (; it != it_end; ++it) { + if (!(*it)->isIconic()) { + updateNetizenWindowRaise((*it)->getClientWindow()); + (*it)->getLayerItem()->raise(); + } + } +} + +void BScreen::lowerWindow(FluxboxWindow *w) { + FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w; + + while (bottom->getTransientFor()) { + bottom = bottom->getTransientFor(); + assert(bottom != bottom->getTransientFor()); + } + + win = bottom; + + if (!win->isIconic()) { + updateNetizenWindowLower(win->getClientWindow()); + win->getLayerItem()->lower(); + } + std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin(); + std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end(); + for (; it != it_end; ++it) { + if (!(*it)->isIconic()) { + updateNetizenWindowLower((*it)->getClientWindow()); + (*it)->getLayerItem()->lower(); + } + } + +} + +void BScreen::raiseWindowLayer(FluxboxWindow *w) { + FluxboxWindow *win = w; + + while (win->getTransientFor()) { + win = win->getTransientFor(); + assert(win != win->getTransientFor()); + } + + if (!win->isIconic()) { + updateNetizenWindowRaise(win->getClientWindow()); + m_layermanager->raise(*win->getLayerItem()); + win->setLayerNum(win->getLayerNum()-1); + } + std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin(); + std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end(); + for (; it != it_end; ++it) { + if (!(*it)->isIconic()) { + updateNetizenWindowRaise((*it)->getClientWindow()); + m_layermanager->raise(*(*it)->getLayerItem()); + (*it)->setLayerNum((*it)->getLayerNum()-1); + } + } +} + +void BScreen::lowerWindowLayer(FluxboxWindow *w) { + FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w; + + while (bottom->getTransientFor()) { + bottom = bottom->getTransientFor(); + assert(bottom != bottom->getTransientFor()); + } + + win = bottom; + + if (!win->isIconic()) { + updateNetizenWindowLower(win->getClientWindow()); + m_layermanager->lower(*win->getLayerItem()); + win->setLayerNum(win->getLayerNum()+1); + } + std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin(); + std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end(); + for (; it != it_end; ++it) { + if (!(*it)->isIconic()) { + updateNetizenWindowLower((*it)->getClientWindow()); + m_layermanager->lower(*(*it)->getLayerItem()); + (*it)->setLayerNum((*it)->getLayerNum()+1); + } + } + +} + +void BScreen::moveWindowToLayer(FluxboxWindow *win, int layernum) { + Fluxbox * fluxbox = Fluxbox::instance(); + + // don't let it set its layer into menu area + if (layernum <= fluxbox->getMenuLayer()) { + layernum = fluxbox->getMenuLayer() + 1; + } + + while (win->getTransientFor()) { + win = win->getTransientFor(); + assert(win != win->getTransientFor()); + } + + if (!win->isIconic()) { + updateNetizenWindowRaise(win->getClientWindow()); + m_layermanager->moveToLayer(*win->getLayerItem(),layernum); + win->setLayerNum(layernum); + } + std::list<FluxboxWindow *>::const_iterator it = win->getTransients().begin(); + std::list<FluxboxWindow *>::const_iterator it_end = win->getTransients().end(); + for (; it != it_end; ++it) { + if (!(*it)->isIconic()) { + updateNetizenWindowRaise((*it)->getClientWindow()); + m_layermanager->moveToLayer(*(*it)->getLayerItem(), layernum); + (*it)->setLayerNum(layernum); + } + } +} + /** Goes to the workspace "right" of the current
M src/Screen.hhsrc/Screen.hh

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Screen.hh,v 1.63 2003/01/12 23:54:10 fluxgen Exp $ +// $Id: Screen.hh,v 1.64 2003/02/02 16:32:38 rathnor Exp $ #ifndef SCREEN_HH #define SCREEN_HH

@@ -34,6 +34,8 @@ #include "Tab.hh"

#include "Resource.hh" #include "Subject.hh" #include "FbWinFrameTheme.hh" +#include "MultLayers.hh" +#include "XLayerItem.hh" #include <X11/Xlib.h> #include <X11/Xresource.h>

@@ -273,6 +275,16 @@ void showPosition(int x, int y);

void showGeometry(unsigned int, unsigned int); void hideGeometry(); + void raise(FbTk::XLayerItem &item); + void lower(FbTk::XLayerItem &item); + void setLayer(FbTk::XLayerItem &item, int layernum); + void removeLayerItem(FbTk::XLayerItem *item); + void raiseWindow(FluxboxWindow *win); + void lowerWindow(FluxboxWindow *win); + void raiseWindowLayer(FluxboxWindow *win); + void lowerWindowLayer(FluxboxWindow *win); + void moveWindowToLayer(FluxboxWindow *win, int layernum); + FluxboxWindow* useAutoGroupWindow(); void updateNetizenCurrentWorkspace();

@@ -323,6 +335,7 @@ m_workspacecount_sig, ///< workspace count signal

m_workspacenames_sig, ///< workspace names signal m_currentworkspace_sig; ///< current workspace signal + FbTk::MultLayers *m_layermanager; Theme *theme;

@@ -398,4 +411,4 @@ std::auto_ptr<RootTheme> m_root_theme;

}; -#endif // SCREEN_HH +#endif // SCREEN_
M src/Tab.ccsrc/Tab.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Tab.cc,v 1.52 2003/01/12 18:31:33 fluxgen Exp $ +// $Id: Tab.cc,v 1.53 2003/02/02 16:32:38 rathnor Exp $ #include "Tab.hh"

@@ -173,7 +173,7 @@ //being ontop in the group

do { XLowerWindow(m_display, current->m_tabwin); //lower tabwin and tabs window win = current->getWindow(); - win->getScreen()->getWorkspace(win->getWorkspaceNumber())->lowerWindow(win); + win->getScreen()->lowerWindow(win); current = current->next(); //get next if (current == 0)
M src/Window.ccsrc/Window.cc

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.cc,v 1.112 2003/01/10 20:20:37 fluxgen Exp $ +// $Id: Window.cc,v 1.113 2003/02/02 16:32:39 rathnor Exp $ #include "Window.hh"

@@ -99,6 +99,7 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num, FbTk::ImageControl &imgctrl, FbWinFrameTheme &tm,

FbTk::MenuTheme &menutheme): m_hintsig(*this), m_statesig(*this), + m_layersig(*this), m_workspacesig(*this), m_diesig(*this), moving(false), resizing(false), shaded(false), maximized(false),

@@ -109,7 +110,9 @@ timer(this),

display(0), lastButtonPressTime(0), m_windowmenu(menutheme, screen_num, imgctrl), - m_layer(LAYER_NORMAL), old_decoration(DECOR_NORMAL), + m_layeritem(0), + m_layernum(4), + old_decoration(DECOR_NORMAL), tab(0), m_frame(tm, imgctrl, screen_num, 0, 0, 100, 100) {

@@ -150,13 +153,18 @@ client.transient_for = 0;

client.mwm_hint = 0; client.blackbox_hint = 0; Fluxbox *fluxbox = Fluxbox::instance(); + + // default to normal layer + m_layernum = fluxbox->getNormalLayer(); getBlackboxHints(); - if (! client.blackbox_hint) + if (! client.blackbox_hint) { getMWMHints(); + } // get size, aspect, minimum/maximum size and other hints set // by the client + getWMProtocols(); getWMHints(); getWMNormalHints();

@@ -206,7 +214,7 @@ decorations.tab = false; //no tab for this window

} upsize(); - + bool place_window = true; if (fluxbox->isStartup() || transient || client.normal_hint_flags & (PPosition|USPosition)) {

@@ -241,13 +249,18 @@

associateClientWindow(); grabButtons(); - + positionWindows(); + m_layeritem = new FbTk::XLayerItem(getFrameWindow()); + if (workspace_number < 0 || workspace_number >= screen->getCount()) - screen->getCurrentWorkspace()->addWindow(this, place_window); - else - screen->getWorkspace(workspace_number)->addWindow(this, place_window); + workspace_number = screen->getCurrentWorkspaceID(); + + restoreAttributes(place_window); + + screen->moveWindowToLayer(this, m_layernum); + screen->getWorkspace(workspace_number)->addWindow(this, place_window); moveResize(m_frame.x(), m_frame.y(), m_frame.width(), m_frame.height());

@@ -267,10 +280,13 @@ stick();

deiconify(); //we're omnipresent and visible } + setState(current_state); + // no focus default setFocusFlag(false); // finaly show the frame and the client window + m_frame.show(); XSync(display, False); }

@@ -341,6 +357,15 @@ }

if (client.window) fluxbox->removeWindowSearch(client.window); + + if (m_layeritem) { + m_layeritem->removeWindow(getFrameWindow()); + //if (hasTab()) + // m_layeritem->removeWindow(get tab window) + if (m_layeritem->isEmpty()) { + screen->removeLayerItem(m_layeritem); + } + } #ifdef DEBUG cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow("<<this<<")"<<endl;

@@ -732,6 +757,8 @@

if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_WORKSPACE) workspace_number = client.blackbox_hint->workspace; + if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_STACK) + workspace_number = client.blackbox_hint->stack; if (client.blackbox_hint->flags & BaseDisplay::ATTRIB_DECORATION) { old_decoration = static_cast<Decoration>(client.blackbox_hint->decoration);

@@ -1093,6 +1120,19 @@ #endif // DEBUG

m_workspacesig.notify(); } +void FluxboxWindow::setLayerNum(int layernum) { + m_layernum = layernum; + + blackbox_attrib.flags |= BaseDisplay::ATTRIB_STACK; + blackbox_attrib.stack = layernum; + saveBlackboxHints(); + +#ifdef DEBUG + cerr<<this<<" notify layer signal"<<endl; +#endif // DEBUG + + m_layersig.notify(); +} void FluxboxWindow::shade() { if (decorations.titlebar) {

@@ -1147,18 +1187,13 @@ void FluxboxWindow::lower() {

if (isIconic()) deiconify(); - screen->getWorkspace(workspace_number)->lowerWindow(this); - if (hasTab()) - getTab()->lower(); //lower the tab AND it's windows + screen->lowerWindow(this); } void FluxboxWindow::raise() { if (isIconic()) deiconify(); - screen->getWorkspace(workspace_number)->raiseWindow(this); - //raise tab first if there is any - if (hasTab()) - tab->raise(); + screen->raiseWindow(this); } void FluxboxWindow::setFocusFlag(bool focus) {

@@ -1214,6 +1249,13 @@

fluxbox->ungrab(); } +void FluxboxWindow::saveBlackboxHints() { + Fluxbox *fluxbox = Fluxbox::instance(); + XChangeProperty(display, client.window, fluxbox->getFluxboxAttributesAtom(), + fluxbox->getFluxboxAttributesAtom(), 32, PropModeReplace, + (unsigned char *) &blackbox_attrib, PropBlackboxAttributesElements); +} + void FluxboxWindow::setState(unsigned long new_state) { current_state = new_state;

@@ -1225,10 +1267,7 @@ XChangeProperty(display, client.window, fluxbox->getWMStateAtom(),

fluxbox->getWMStateAtom(), 32, PropModeReplace, (unsigned char *) state, 2); - XChangeProperty(display, client.window, fluxbox->getFluxboxAttributesAtom(), - fluxbox->getFluxboxAttributesAtom(), 32, PropModeReplace, - (unsigned char *) &blackbox_attrib, PropBlackboxAttributesElements); - + saveBlackboxHints(); //notify state changed m_statesig.notify(); }

@@ -1328,8 +1367,12 @@ if (m_frame.x() != newx || m_frame.y() != newy)

m_frame.move(newx, newy); } - -void FluxboxWindow::restoreAttributes() { +/* + * restoreAttributes sets the attributes to what they should be + * but doesn't change the actual state + * (so the caller can set defaults etc as well) + */ +void FluxboxWindow::restoreAttributes(bool place_window) { if (!getState()) current_state = NormalState;

@@ -1363,15 +1406,14 @@ blackbox_attrib.attrib & BaseDisplay::ATTRIB_SHADED) {

int save_state = ((current_state == IconicState) ? NormalState : current_state); - shaded = false; - shade(); + shaded = true; current_state = save_state; } if (( blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) && ( blackbox_attrib.workspace < screen->getCount())) { - screen->reassociateWindow(this, blackbox_attrib.workspace, true); + workspace_number = blackbox_attrib.workspace; if (current_state == NormalState) current_state = WithdrawnState; } else if (current_state == WithdrawnState)

@@ -1379,12 +1421,16 @@ current_state = NormalState;

if (blackbox_attrib.flags & BaseDisplay::ATTRIB_OMNIPRESENT && blackbox_attrib.attrib & BaseDisplay::ATTRIB_OMNIPRESENT) { - stuck = false; - stick(); + stuck = true; current_state = NormalState; } + if (blackbox_attrib.flags & BaseDisplay::ATTRIB_STACK) { + //TODO check value? + m_layernum = blackbox_attrib.stack; + } + if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) || (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)) { int x = blackbox_attrib.premax_x, y = blackbox_attrib.premax_y;

@@ -1392,7 +1438,7 @@ unsigned int w = blackbox_attrib.premax_w, h = blackbox_attrib.premax_h;

maximized = false; if ((blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ) && (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT)) - maximize(); + maximized = true; else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXVERT) maximizeVertical(); else if (blackbox_attrib.flags & BaseDisplay::ATTRIB_MAXHORIZ)

@@ -2221,7 +2267,7 @@ XEvent dummy;

if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify, &dummy)) { #ifdef DEBUG - cerr<<"FluxboxWindow::restore: reparent 0x"<<hex<<client.window<<dec<<"to root"<<endl; + cerr<<"FluxboxWindow::restore: reparent 0x"<<hex<<client.window<<dec<<" to root"<<endl; #endif // DEBUG // reparent to screen window

@@ -2280,6 +2326,12 @@ if (screen->getCurrentWorkspaceID() != net.workspace)

withdraw(); else deiconify(); + } + + if (net.flags & BaseDisplay::ATTRIB_STACK) { + if ((unsigned int) m_layernum != net.stack) { + screen->moveWindowToLayer(this, net.stack); + } } if (net.flags & BaseDisplay::ATTRIB_DECORATION) {
M src/Window.hhsrc/Window.hh

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.hh,v 1.42 2003/01/09 22:16:40 fluxgen Exp $ +// $Id: Window.hh,v 1.43 2003/02/02 16:32:40 rathnor Exp $ #ifndef WINDOW_HH #define WINDOW_HH

@@ -33,6 +33,7 @@ #include "Menu.hh"

#include "Subject.hh" #include "FbWinFrame.hh" #include "EventHandler.hh" +#include "XLayerItem.hh" #include <X11/Xlib.h> #include <X11/Xutil.h>

@@ -59,14 +60,6 @@

/// Creates the window frame and handles any window event for it class FluxboxWindow : public FbTk::TimeoutHandler, public FbTk::EventHandler { public: - /// layer bits - enum WinLayer { - LAYER_BOTTOM = 0x01, ///< bottom layer - LAYER_BELOW = 0x02, ///< below normal layer but above bottom - LAYER_NORMAL = 0x04, ///< normal layer - LAYER_TOP = 0x08 ///< top layer - }; - /// decoration bit enum Decoration { DECOR_NONE=0, ///< no decor at all

@@ -145,7 +138,7 @@ void moveResize(int x, int y, unsigned int width, unsigned int height);

void setWorkspace(int n); void changeBlackboxHints(const BaseDisplay::BlackboxHints &bh); - void restoreAttributes(); + void restoreAttributes(bool place_window); void showMenu(int mx, int my); // popup menu on last button press position void popupMenu();

@@ -204,6 +197,9 @@

const BScreen *getScreen() const { return screen; } BScreen *getScreen() { return screen; } + const FbTk::XLayerItem *getLayerItem() const { return m_layeritem; } + FbTk::XLayerItem *getLayerItem() { return m_layeritem; } + const Tab *getTab() const { return tab; } Tab *getTab() { return tab; }

@@ -227,7 +223,8 @@ int getXClient() const { return client.x; }

int getYClient() const { return client.y; } unsigned int getWorkspaceNumber() const { return workspace_number; } int getWindowNumber() const { return window_number; } - WinLayer getLayer() const { return m_layer; } + int getLayerNum() const { return m_layernum; } + void setLayerNum(int layernum); unsigned int getWidth() const { return m_frame.width(); } unsigned int getHeight() const { return m_frame.height(); } unsigned int getClientHeight() const { return client.height; }

@@ -247,6 +244,8 @@ @{

*/ FbTk::Subject &stateSig() { return m_statesig; } const FbTk::Subject &stateSig() const { return m_statesig; } + FbTk::Subject &layerSig() { return m_layersig; } + const FbTk::Subject &layerSig() const { return m_layersig; } FbTk::Subject &hintSig() { return m_hintsig; } const FbTk::Subject &hintSig() const { return m_hintsig; } FbTk::Subject &workspaceSig() { return m_workspacesig; }

@@ -297,6 +296,7 @@ void getWMProtocols();

void getWMHints(); void getMWMHints(); void getBlackboxHints(); + void saveBlackboxHints(); void setNetWMAttributes(); void associateClientWindow(); void createWinButtons();

@@ -312,7 +312,7 @@ void right_fixsize(int *x = 0, int *y = 0);

void left_fixsize(int *x = 0, int *y = 0); // state and hint signals - WinSubject m_hintsig, m_statesig, m_workspacesig, m_diesig; + WinSubject m_hintsig, m_statesig, m_layersig, m_workspacesig, m_diesig; std::string m_instance_name; /// instance name from WM_CLASS std::string m_class_name; /// class name from WM_CLASS

@@ -328,6 +328,8 @@ BaseDisplay::BlackboxAttributes blackbox_attrib;

Time lastButtonPressTime; FbTk::Menu m_windowmenu; + FbTk::XLayerItem *m_layeritem; + int m_layernum; timeval lastFocusTime;

@@ -338,7 +340,7 @@

int focus_mode, window_number; unsigned int workspace_number; unsigned long current_state; - WinLayer m_layer; + Decoration old_decoration; struct _client {
M src/Workspace.ccsrc/Workspace.cc

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Workspace.cc,v 1.43 2003/01/13 12:59:26 fluxgen Exp $ +// $Id: Workspace.cc,v 1.44 2003/02/02 16:32:40 rathnor Exp $ #include "Workspace.hh"

@@ -72,10 +72,11 @@ };

Workspace::GroupList Workspace::m_groups; -Workspace::Workspace(BScreen *scrn, unsigned int i): +Workspace::Workspace(BScreen *scrn, FbTk::MultLayers &layermanager, unsigned int i): screen(scrn), lastfocus(0), m_clientmenu(*scrn->menuTheme(), scrn->getScreenNumber(), *scrn->getImageControl()), + m_layermanager(layermanager), m_name(""), m_id(i), cascade_x(32), cascade_y(32) {

@@ -107,8 +108,6 @@

w->setWorkspace(m_id); w->setWindowNumber(m_windowlist.size()); - stackingList.push_front(w); - //insert window after the currently focused window //FluxboxWindow *focused = Fluxbox::instance()->getFocusedWindow();

@@ -139,13 +138,13 @@ //add to list

m_clientmenu.insert(w->getTitle().c_str()); m_windowlist.push_back(w); + w->raise(); + //update menugraphics m_clientmenu.update(); if (!w->isStuck()) screen->updateNetizenWindowAdd(w->getClientWindow(), m_id); - - raiseWindow(w); return w->getWindowNumber(); }

@@ -159,8 +158,6 @@ if (lastfocus == w) {

lastfocus = 0; } - stackingList.remove(w); - if (w->isFocused()) { if (screen->isSloppyFocus()) { Fluxbox::instance()->setFocusedWindow(0); // set focused window to none

@@ -174,8 +171,43 @@ }*/

w->getTransientFor()->setInputFocus(); } else { FluxboxWindow *top = 0; - if (stackingList.size() != 0) - top = stackingList.front(); + + // this bit is pretty dodgy at present + // it gets the next item down, then scans through our windowlist to see if it is + // in this workspace. If not, goes down more + FbTk::XLayerItem *item = 0, *lastitem = w->getLayerItem(); + do { + item = m_layermanager.getItemBelow(*lastitem); + Windows::iterator it = m_windowlist.begin(); + Windows::iterator it_end = m_windowlist.end(); + for (; it != it_end; ++it) { + if ((*it)->getLayerItem() == item) { + // found one! + top = *it; + } + } + + lastitem = item; + + } while (item && !top); + + if (!top) { + // look upwards + lastitem = w->getLayerItem(); + do { + item = m_layermanager.getItemAbove(*lastitem); + Windows::iterator it = m_windowlist.begin(); + Windows::iterator it_end = m_windowlist.end(); + for (; it != it_end; ++it) { + if ((*it)->getLayerItem() == item) { + // found one! + top = *it; + } + } + lastitem = item; + } while (item && !top); + + } if (top == 0|| !top->setInputFocus()) { Fluxbox::instance()->setFocusedWindow(0); // set focused window to none

@@ -183,7 +215,7 @@ }

} } - + // we don't remove it from the layermanager, as it may be being moved Windows::iterator it = m_windowlist.begin(); Windows::iterator it_end = m_windowlist.end();

@@ -216,8 +248,8 @@ }

void Workspace::showAll() { - WindowStack::iterator it = stackingList.begin(); - WindowStack::iterator it_end = stackingList.end(); + Windows::iterator it = m_windowlist.begin(); + Windows::iterator it_end = m_windowlist.end(); for (; it != it_end; ++it) { (*it)->deiconify(false, false); }

@@ -225,8 +257,8 @@ }

void Workspace::hideAll() { - WindowStack::reverse_iterator it = stackingList.rbegin(); - WindowStack::reverse_iterator it_end = stackingList.rend(); + Windows::reverse_iterator it = m_windowlist.rbegin(); + Windows::reverse_iterator it_end = m_windowlist.rend(); for (; it != it_end; ++it) { if (! (*it)->isStuck()) (*it)->withdraw();

@@ -243,63 +275,6 @@ }

} -void Workspace::raiseWindow(FluxboxWindow *w) { - FluxboxWindow *win = w; - - while (win->getTransientFor()) { - win = win->getTransientFor(); - assert(win != win->getTransientFor()); - } - - int i = 1 + countTransients(*win); - - Stack nstack(i); - Stack::iterator stackit = nstack.begin(); - - *(stackit++) = win->getFrameWindow(); - screen->updateNetizenWindowRaise(win->getClientWindow()); - if (! win->isIconic()) { - Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); - wkspc->stackingList.remove(win); - wkspc->stackingList.push_front(win); - } - - raiseAndFillStack(stackit, *win); - - screen->raiseWindows(nstack); - -} - -void Workspace::lowerWindow(FluxboxWindow *w) { - FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w; - - while (bottom->getTransientFor()) { - bottom = bottom->getTransientFor(); - assert(bottom != bottom->getTransientFor()); - } - - win = bottom; - int i = 1 + countTransients(*win); - - - Stack st(i); - Stack::iterator stackit = st.begin(); - lowerAndFillStack(stackit, *win); - (*stackit) = win->getFrameWindow(); - - screen->updateNetizenWindowLower(win->getClientWindow()); - if (! win->isIconic()) { - Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); - wkspc->stackingList.remove(win); - wkspc->stackingList.push_back(win); - } - - XLowerWindow(BaseDisplay::getXDisplay(), st.front()); - XRestackWindows(BaseDisplay::getXDisplay(), &st[0], st.size()); - -} - - void Workspace::reconfigure() { m_clientmenu.reconfigure();

@@ -460,6 +435,7 @@ */

void Workspace::shutdown() { // note: when the window dies it'll remove it self from the list while (!m_windowlist.empty()) { + cerr<<m_windowlist.size()<<endl; m_windowlist.back()->restore(true); // restore with remap delete m_windowlist.back(); //delete window (the window removes it self from m_windowlist) }

@@ -800,55 +776,3 @@ }

win->moveResize(place_x, place_y, win->getWidth(), win->getHeight()); } - - -void Workspace::raiseAndFillStack(Stack::iterator &stackit, const FluxboxWindow &w) { - if (w.getTransients().empty()) - return; - - std::list<FluxboxWindow *>::const_iterator it = w.getTransients().begin(); - std::list<FluxboxWindow *>::const_iterator it_end = w.getTransients().end(); - for (; it != it_end; ++it) { - *stackit++ = (*it)->getFrameWindow(); - - screen->updateNetizenWindowRaise((*it)->getClientWindow()); - - if (! (*it)->isIconic()) { - Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber()); - wkspc->stackingList.remove((*it)); - wkspc->stackingList.push_front((*it)); - } - - - } - - it = w.getTransients().begin(); - for (; it != it_end; ++it) - raiseAndFillStack(stackit, *(*it)); - - -} - -void Workspace::lowerAndFillStack(Stack::iterator &stackit, const FluxboxWindow &win) { - if (win.getTransients().empty()) // nothing to lower and stack - return; - - std::list<FluxboxWindow *>::const_reverse_iterator it = win.getTransients().rbegin(); - std::list<FluxboxWindow *>::const_reverse_iterator it_end = win.getTransients().rend(); - for (; it != it_end; ++it) - lowerAndFillStack(stackit, *(*it)); - - it = win.getTransients().rbegin(); - - for (; it != it_end; ++it) { - (*stackit) = (*it)->getFrameWindow(); - ++stackit; - screen->updateNetizenWindowLower((*it)->getClientWindow()); - if (! (*it)->isIconic()) { - Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber()); - wkspc->stackingList.remove((*it)); - wkspc->stackingList.push_back((*it)); - } - } - -}
M src/Workspace.hhsrc/Workspace.hh

@@ -28,6 +28,7 @@

#include "NotCopyable.hh" #include "Menu.hh" +#include "MultLayers.hh" #include <X11/Xlib.h>

@@ -46,7 +47,7 @@ public:

typedef std::vector<FluxboxWindow *> Windows; typedef std::vector<Window> Stack; - explicit Workspace(BScreen *screen, unsigned int workspaceid = 0); + explicit Workspace(BScreen *screen, FbTk::MultLayers &layermanager, unsigned int workspaceid = 0); ~Workspace(); void setLastFocusedWindow(FluxboxWindow *w);

@@ -57,8 +58,6 @@ void setName(const std::string &name);

void showAll(); void hideAll(); void removeAll(); - void raiseWindow(FluxboxWindow *win); - void lowerWindow(FluxboxWindow *win); void reconfigure(); void update(); void setCurrent();

@@ -97,9 +96,6 @@ void placeWindow(FluxboxWindow *win);

private: - void raiseAndFillStack(Stack::iterator &it, const FluxboxWindow &win); - void lowerAndFillStack(Stack::iterator &it, const FluxboxWindow &win); - BScreen *screen; FluxboxWindow *lastfocus; FbTk::Menu m_clientmenu;

@@ -110,7 +106,7 @@ typedef std::vector<Group> GroupList;

static GroupList m_groups; ///< handle auto groupings - WindowStack stackingList; + FbTk::MultLayers &m_layermanager; Windows m_windowlist; std::string m_name; ///< name of this workspace
M src/fluxbox.ccsrc/fluxbox.cc

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: fluxbox.cc,v 1.92 2003/01/12 18:50:27 fluxgen Exp $ +// $Id: fluxbox.cc,v 1.93 2003/02/02 16:32:40 rathnor Exp $ #include "fluxbox.hh"

@@ -296,6 +296,7 @@ m_resourcemanager(), m_screen_rm(),

m_rc_tabs(m_resourcemanager, true, "session.tabs", "Session.Tabs"), m_rc_iconbar(m_resourcemanager, true, "session.iconbar", "Session.Iconbar"), m_rc_colors_per_channel(m_resourcemanager, 4, "session.colorsPerChannel", "Session.ColorsPerChannel"), + m_rc_numlayers(m_resourcemanager, 13, "session.numLayers", "Session.NumLayers"), m_rc_stylefile(m_resourcemanager, "", "session.styleFile", "Session.StyleFile"), m_rc_menufile(m_resourcemanager, DEFAULTMENU, "session.menuFile", "Session.MenuFile"), m_rc_keyfile(m_resourcemanager, DEFAULTKEYSFILE, "session.keyFile", "Session.KeyFile"),

@@ -701,7 +702,7 @@ } else if ((tab = searchTab(e->xcrossing.window))) {

win = tab->getWindow(); if (win->getScreen()->isSloppyFocus() && (! win->isFocused()) && (! no_focus)) { - win->getScreen()->getWorkspace(win->getWorkspaceNumber())->raiseWindow(win); + win->getScreen()->raiseWindow(win); grab();

@@ -1112,24 +1113,18 @@ }

break; case Keys::NEXTWINDOW: //activate next window screen->nextFocus(key->getParam()); - if (focused_window && focused_window->getTab()) - focused_window->getTab()->raise(); break; case Keys::PREVWINDOW: //activate prev window screen->prevFocus(key->getParam()); - if (focused_window && focused_window->getTab()) - focused_window->getTab()->raise(); break; case Keys::NEXTTAB: if (focused_window && focused_window->getTab()) { Tab *tab = focused_window->getTab(); if (tab->next()) { - screen->getCurrentWorkspace()->raiseWindow( - tab->next()->getWindow()); + screen->raiseWindow(tab->next()->getWindow()); tab->next()->getWindow()->setInputFocus(); } else { - screen->getCurrentWorkspace()->raiseWindow( - tab->first()->getWindow()); + screen->raiseWindow(tab->first()->getWindow()); tab->first()->getWindow()->setInputFocus(); } }

@@ -1138,12 +1133,10 @@ case Keys::PREVTAB:

if (focused_window && focused_window->getTab()) { Tab *tab = focused_window->getTab(); if (tab->prev()) { - screen->getCurrentWorkspace()->raiseWindow( - tab->prev()->getWindow()); + screen->raiseWindow(tab->prev()->getWindow()); tab->prev()->getWindow()->setInputFocus(); } else { - screen->getCurrentWorkspace()->raiseWindow( - tab->last()->getWindow()); + screen->raiseWindow(tab->last()->getWindow()); tab->last()->getWindow()->setInputFocus(); } }

@@ -1151,16 +1144,14 @@ break;

case Keys::FIRSTTAB: if (focused_window && focused_window->getTab()) { Tab *tab = focused_window->getTab(); - screen->getCurrentWorkspace()->raiseWindow( - tab->first()->getWindow()); + screen->raiseWindow(tab->first()->getWindow()); tab->first()->getWindow()->setInputFocus(); } break; case Keys::LASTTAB: if (focused_window && focused_window->getTab()) { Tab *tab = focused_window->getTab(); - screen->getCurrentWorkspace()->raiseWindow( - tab->last()->getWindow()); + screen->raiseWindow(tab->last()->getWindow()); tab->last()->getWindow()->setInputFocus(); } break;

@@ -1180,6 +1171,11 @@ cerr<<"TODO"<<endl;

} break; + case Keys::QUIT: + { + shutdown(); + } + break; case Keys::ROOTMENU: //show root menu { ScreenList::iterator it = screenList.begin();

@@ -1247,15 +1243,22 @@ case Keys::ICONIFY:

focused_window->iconify(); break; case Keys::RAISE: - if (focused_window->hasTab()) - focused_window->getTab()->raise(); //raise the tabs if we have any - focused_window->getScreen()->getWorkspace(focused_window->getWorkspaceNumber())->raiseWindow(focused_window); + focused_window->raise(); break; case Keys::LOWER: - focused_window->getScreen()->getWorkspace(focused_window->getWorkspaceNumber())->lowerWindow(focused_window); - if (focused_window->hasTab()) - focused_window->getTab()->lower(); //lower the tabs AND it's windows - + focused_window->lower(); + break; + case Keys::RAISELAYER: + focused_window->getScreen()->raiseWindowLayer(focused_window); + break; + case Keys::LOWERLAYER: + focused_window->getScreen()->lowerWindowLayer(focused_window); + break; + case Keys::TOPLAYER: + focused_window->getScreen()->moveWindowToLayer(focused_window,getBottomLayer()); + break; + case Keys::BOTTOMLAYER: + focused_window->getScreen()->moveWindowToLayer(focused_window,getTopLayer()); break; case Keys::CLOSE: focused_window->close();

@@ -1459,6 +1462,14 @@ for (size_t i=0; i<m_atomhandler.size(); ++i) {

if (m_atomhandler[i]->update()) m_atomhandler[i]->updateState(win); } + } else if ((&(win.layerSig())) == changedsub) { // layer signal +#ifdef DEBUG + cerr<<__FILE__<<"("<<__LINE__<<") WINDOW layer signal from "<<&win<<endl; +#endif // DEBUG + for (size_t i=0; i<m_atomhandler.size(); ++i) { + if (m_atomhandler[i]->update()) + m_atomhandler[i]->updateLayer(win); + } } else if ((&(win.workspaceSig())) == changedsub) { // workspace signal #ifdef DEBUG cerr<<__FILE__<<"("<<__LINE__<<") WINDOW workspace signal from "<<&win<<endl;

@@ -1516,6 +1527,7 @@ void Fluxbox::attachSignals(FluxboxWindow &win) {

win.hintSig().attach(this); win.stateSig().attach(this); win.workspaceSig().attach(this); + win.layerSig().attach(this); for (size_t i=0; i<m_atomhandler.size(); ++i) { m_atomhandler[i]->setupWindow(win); }
M src/fluxbox.hhsrc/fluxbox.hh

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: fluxbox.hh,v 1.39 2003/01/12 18:49:36 fluxgen Exp $ +// $Id: fluxbox.hh,v 1.40 2003/02/02 16:32:40 rathnor Exp $ #ifndef FLUXBOX_HH #define FLUXBOX_HH

@@ -111,6 +111,16 @@

inline const char *getMenuFilename() const { return m_rc_menufile->c_str(); } inline const std::string &getSlitlistFilename() const { return *m_rc_slitlistfile; } inline int colorsPerChannel() const { return *m_rc_colors_per_channel; } + inline int getNumberOfLayers() const { return *m_rc_numlayers; } + + // TODO there probably should be configurable + inline int getDesktopLayer() const { return 12; } + inline int getBottomLayer() const { return 10; } + inline int getNormalLayer() const { return 8; } + inline int getTopLayer() const { return 2; } + inline int getSlitLayer() const { return 4; } + inline int getMenuLayer() const { return 0; } + inline const timeval &getAutoRaiseDelay() const { return resource.auto_raise_delay; }

@@ -201,7 +211,7 @@ ResourceManager m_resourcemanager, m_screen_rm;

//--- Resources Resource<bool> m_rc_tabs, m_rc_iconbar; - Resource<int> m_rc_colors_per_channel; + Resource<int> m_rc_colors_per_channel, m_rc_numlayers; Resource<std::string> m_rc_stylefile, m_rc_menufile, m_rc_keyfile, m_rc_slitlistfile, m_rc_groupfile;