all repos — fluxbox @ 1741ac072dd6516b4dcfdf6dbe9099a335c7bc7d

custom fork of the fluxbox windowmanager

fix menus for "extra" things, like remember, so that they will be
added back if the menu is rebuilt.
rathnor rathnor
commit

1741ac072dd6516b4dcfdf6dbe9099a335c7bc7d

parent

ace3e2e6293fa0ae5a2b9d971f24fa45b317ba2e

M BUGSBUGS

@@ -2,9 +2,6 @@ Known bugs and missing features that will be fixed in future version:

BUGS: - * Remember menu sometimes isn't present in window menu. Probably need - to add a signal for menu reconfigures (Screen::setupWindowActions) - * Window handle is invisible sometimes. * KDE support needs attention (e.g. klipper).

@@ -75,6 +72,10 @@ * MenuAlpha (at least) isn't 'per-screen' - takes the value of the

highest numbered screen. => Fixed, moved alpha setting into MenuTheme rather than static value + * Remember menu sometimes isn't present in window menu. Probably need + to add a signal for menu reconfigures (Screen::setupWindowActions) + => Fixed, added "ExtraMenus" for windows that get added whenever it + is rebuilt. ------------------------------ Core dumps and notes
M ChangeLogChangeLog

@@ -1,6 +1,9 @@

(Format: Year/Month/Day) Changes for 0.9.5: *03/07/20: + * Fix disappearing Remember menu, plus titles of sub-window menus + -> can now use addExtraMenus for windows in extensions (Simon) + Menu.hh/cc Window.hh/cc Screen.hh/cc Remember.cc * Fix crash with toolbarmode = OFF, and put toolbar menu back into screen's configure menu (Simon) Screen.hh/cc ToolbarHandler.cc
M src/FbTk/Menu.ccsrc/FbTk/Menu.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: Menu.cc,v 1.29 2003/07/19 03:59:56 rathnor Exp $ +// $Id: Menu.cc,v 1.30 2003/07/20 08:12:36 rathnor Exp $ //use GNU extensions #ifndef _GNU_SOURCE

@@ -557,6 +557,8 @@ }

void Menu::show() { + if (m_need_update) + update(); menu.window.showSubwindows(); menu.window.show(); //!! TODO, this should probably be done explicit if one don't want to raise
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.19 2003/07/19 03:59:56 rathnor Exp $ +// $Id: Menu.hh,v 1.20 2003/07/20 08:12:36 rathnor Exp $ #ifndef FBTK_MENU_HH #define FBTK_MENU_HH

@@ -77,7 +77,7 @@ /// remove an item

int remove(unsigned int item); /// remove all items void removeAll(); - inline void setInternalMenu() { internal_menu = true; } + inline void setInternalMenu(bool val = true) { internal_menu = val; } inline void setAlignment(Alignment a) { m_alignment = a; } inline void setTorn() { torn = true; } inline void removeParent() { if (internal_menu) m_parent = 0; }

@@ -160,7 +160,7 @@ //@}

protected: - inline void setTitleVisibility(bool b) { title_vis = b; } + inline void setTitleVisibility(bool b) { title_vis = b; m_need_update = true; } inline void setMovable(bool b) { movable = b; } inline void setHideTree(bool h) { hide_tree = h; }
M src/Remember.ccsrc/Remember.cc

@@ -21,7 +21,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: Remember.cc,v 1.27 2003/07/10 13:23:09 rathnor Exp $ +// $Id: Remember.cc,v 1.28 2003/07/20 08:12:36 rathnor Exp $ #include "Remember.hh" #include "ClientPattern.hh"

@@ -93,7 +93,7 @@ FluxboxWindow &m_win;

Remember::Attribute m_attrib; }; -FbTk::Menu *createRememberMenu(Remember &remember, FluxboxWindow &win) { +FbTk::Menu *createRememberMenu(Remember &remember, FluxboxWindow &win, bool enabled) { // each fluxboxwindow has its own windowmenu // so we also create a remember menu just for it... BScreen &screen = win.screen();

@@ -101,7 +101,16 @@ FbTk::Menu *menu = new FbMenu(*screen.menuTheme(),

screen.screenNumber(), screen.imageControl(), *screen.layerManager().getLayer(Fluxbox::instance()->getMenuLayer())); - menu->disableTitle(); + + // if enabled, then we want this to be a unavailable menu + if (!enabled) { + FbTk::MenuItem *item = new FbTk::MenuItem("unavailable"); + item->setEnabled(false); + menu->insert(item); + menu->update(); + return menu; + } + // TODO: nls menu->insert(new RememberMenuItem("Workspace", remember, win, Remember::REM_WORKSPACE));

@@ -676,28 +685,13 @@ WinClient &winclient = win.winClient();

// we don't touch the window if it is a transient // of something else - int menupos = win.menu().numberOfItems()-2; - if (menupos < -1) - menupos = -1; - if (winclient.transientFor()) { - // still put something in the menu so people don't get confused - // so, we add a disabled item... - // TODO: nls - FbTk::MenuItem *item = new FbTk::MenuItem("Remember..."); - item->setEnabled(false); - win.menu().insert(item, menupos); - win.menu().update(); - return; - } - - // add the menu, this -2 is somewhat dodgy... :-/ // All windows get the remember menu. // TODO: nls - win.menu().insert("Remember...", - createRememberMenu(*this, win), - menupos); - win.menu().reconfigure(); + win.addExtraMenu("Remember...", createRememberMenu(*this, win, (winclient.transientFor() == 0))); + + if (winclient.transientFor()) + return; Application *app = find(winclient); if (app == 0)
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.205 2003/07/20 02:45:57 rathnor Exp $ +// $Id: Screen.cc,v 1.206 2003/07/20 08:12:36 rathnor Exp $ #include "Screen.hh"

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

#include "StringUtil.hh" #include "Netizen.hh" #include "Directory.hh" -#include "WinButton.hh" #include "SimpleCommand.hh" #include "FbWinFrameTheme.hh" #include "MenuTheme.hh"

@@ -1069,7 +1068,6 @@ else

focused_list.push_back(&win->winClient()); if (new_win) { - setupWindowActions(*win); Fluxbox::instance()->attachSignals(*win); }

@@ -1107,134 +1105,12 @@ // don't add to focused_list, as it should already be in there (since the

// WinClient already exists). Fluxbox::instance()->saveWindowSearch(client.window(), win); - setupWindowActions(*win); Fluxbox::instance()->attachSignals(*win); // winclient actions should have been setup when the WinClient was created if (win->workspaceNumber() == currentWorkspaceID() || win->isStuck()) { win->show(); } return win; -} - -void BScreen::setupWindowActions(FluxboxWindow &win) { - - FbWinFrame &frame = win.frame(); - - - typedef FbTk::RefCount<FbTk::Command> CommandRef; - - using namespace FbTk; - typedef RefCount<Command> CommandRef; - typedef SimpleCommand<FluxboxWindow> WindowCmd; - - CommandRef iconify_cmd(new WindowCmd(win, &FluxboxWindow::iconify)); - CommandRef maximize_cmd(new WindowCmd(win, &FluxboxWindow::maximize)); - CommandRef maximize_vert_cmd(new WindowCmd(win, &FluxboxWindow::maximizeVertical)); - CommandRef maximize_horiz_cmd(new WindowCmd(win, &FluxboxWindow::maximizeHorizontal)); - CommandRef close_cmd(new WindowCmd(win, &FluxboxWindow::close)); - CommandRef shade_cmd(new WindowCmd(win, &FluxboxWindow::shade)); - CommandRef raise_cmd(new WindowCmd(win, &FluxboxWindow::raise)); - CommandRef lower_cmd(new WindowCmd(win, &FluxboxWindow::lower)); - CommandRef raise_and_focus_cmd(new WindowCmd(win, &FluxboxWindow::raiseAndFocus)); - CommandRef stick_cmd(new WindowCmd(win, &FluxboxWindow::stick)); - CommandRef show_menu_cmd(new WindowCmd(win, &FluxboxWindow::popupMenu)); - - // clear old buttons from frame - frame.removeAllButtons(); - //!! TODO: fix this ugly hack - // get titlebar configuration - const vector<Fluxbox::Titlebar> *dir = &Fluxbox::instance()->getTitlebarLeft(); - for (char c=0; c<2; c++) { - for (size_t i=0; i< dir->size(); ++i) { - //create new buttons - FbTk::Button *newbutton = 0; - if (win.isIconifiable() && (*dir)[i] == Fluxbox::MINIMIZE) { - newbutton = new WinButton(win, *m_winbutton_theme.get(), - WinButton::MINIMIZE, - frame.titlebar(), - 0, 0, 10, 10); - newbutton->setOnClick(iconify_cmd); - - } else if (win.isMaximizable() && (*dir)[i] == Fluxbox::MAXIMIZE) { - newbutton = new WinButton(win, *m_winbutton_theme.get(), - WinButton::MAXIMIZE, - frame.titlebar(), - 0, 0, 10, 10); - - newbutton->setOnClick(maximize_cmd, 1); - newbutton->setOnClick(maximize_horiz_cmd, 3); - newbutton->setOnClick(maximize_vert_cmd, 2); - - } else if (win.isClosable() && (*dir)[i] == Fluxbox::CLOSE) { - newbutton = new WinButton(win, *m_winbutton_theme.get(), - WinButton::CLOSE, - frame.titlebar(), - 0, 0, 10, 10); - - newbutton->setOnClick(close_cmd); -#ifdef DEBUG - cerr<<__FILE__<<": Creating close button"<<endl; -#endif // DEBUG - } else if ((*dir)[i] == Fluxbox::STICK) { - WinButton *winbtn = new WinButton(win, *m_winbutton_theme.get(), - WinButton::STICK, - frame.titlebar(), - 0, 0, 10, 10); - win.stateSig().attach(winbtn); - winbtn->setOnClick(stick_cmd); - newbutton = winbtn; - } else if ((*dir)[i] == Fluxbox::SHADE) { - WinButton *winbtn = new WinButton(win, *m_winbutton_theme.get(), - WinButton::SHADE, - frame.titlebar(), - 0, 0, 10, 10); - winbtn->setOnClick(shade_cmd); - } - - if (newbutton != 0) { - newbutton->show(); - if (c == 0) - frame.addLeftButton(newbutton); - else - frame.addRightButton(newbutton); - } - } //end for i - dir = &Fluxbox::instance()->getTitlebarRight(); - } // end for c - - frame.reconfigure(); - - // setup titlebar - frame.setOnClickTitlebar(raise_and_focus_cmd, 1, false, true); // on press with button 1 - frame.setOnClickTitlebar(shade_cmd, 1, true); // doubleclick with button 1 - frame.setOnClickTitlebar(show_menu_cmd, 3); // on release with button 3 - frame.setOnClickTitlebar(lower_cmd, 2); // on release with button 2 - frame.setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); - // setup menu - FbTk::Menu &menu = win.menu(); - menu.removeAll(); // clear old items - menu.disableTitle(); // not titlebar - - // set new menu items - menu.insert("Shade", shade_cmd); - menu.insert("Stick", stick_cmd); - menu.insert("Maximize", maximize_cmd); - menu.insert("Maximize Vertical", maximize_vert_cmd); - menu.insert("Maximize Horizontal", maximize_horiz_cmd); - menu.insert("Iconify", iconify_cmd); - menu.insert("Raise", raise_cmd); - menu.insert("Lower", lower_cmd); - menu.insert("Layer...", &win.layermenu()); - CommandRef next_client_cmd(new WindowCmd(win, &FluxboxWindow::nextClient)); - CommandRef prev_client_cmd(new WindowCmd(win, &FluxboxWindow::prevClient)); - menu.insert("Next Client", next_client_cmd); - menu.insert("Prev Client", prev_client_cmd); - - menu.insert("ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ"); - menu.insert("Close", close_cmd); - - menu.reconfigure(); // update graphics - } Strut *BScreen::requestStrut(int left, int right, int top, int bottom) {
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.115 2003/07/20 02:45:57 rathnor Exp $ +// $Id: Screen.hh,v 1.116 2003/07/20 08:12:36 rathnor Exp $ #ifndef SCREEN_HH #define SCREEN_HH

@@ -193,6 +193,9 @@ inline const FbWinFrameTheme &winFrameTheme() const { return *m_windowtheme.get(); }

inline MenuTheme *menuTheme() { return m_menutheme.get(); } inline const MenuTheme *menuTheme() const { return m_menutheme.get(); } inline const RootTheme &rootTheme() const { return *m_root_theme.get(); } + inline WinButtonTheme &winButtonTheme() { return *m_winbutton_theme.get(); } + inline const WinButtonTheme &winButtonTheme() const { return *m_winbutton_theme.get(); } + FbRootWindow &rootWindow() { return m_root_window; } const FbRootWindow &rootWindow() const { return m_root_window; }

@@ -311,8 +314,8 @@ /// updates max avaible area for the workspace

void updateAvailableWorkspaceArea(); // for extras to add menus. These menus must be marked - // internal for their safety, and the extension must - // delete and remove the menu itself + // internal for their safety, and __the extension__ must + // delete and remove the menu itself (opposite to Window) void addConfigMenu(const char *label, FbTk::Menu &menu); void removeConfigMenu(FbTk::Menu &menu);
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.205 2003/07/19 11:55:49 rathnor Exp $ +// $Id: Window.cc,v 1.206 2003/07/20 08:12:36 rathnor Exp $ #include "Window.hh"

@@ -41,6 +41,8 @@ #include "RootTheme.hh"

#include "Workspace.hh" #include "LayerMenu.hh" #include "FbWinFrame.hh" +#include "WinButton.hh" +#include "WinButtonTheme.hh" #ifdef HAVE_CONFIG_H #include "config.h"

@@ -234,12 +236,6 @@ maximized(MAX_NONE),

m_screen(scr), m_timer(this), display(0), - m_layermenu(new LayerMenu<FluxboxWindow>(*scr.menuTheme(), - scr.screenNumber(), - scr.imageControl(), - *scr.layerManager().getLayer(Fluxbox::instance()->getMenuLayer()), - this, - false)), m_windowmenu(*scr.menuTheme(), scr.screenNumber(), scr.imageControl()), m_old_decoration(DECOR_NORMAL), m_client(&client),

@@ -295,6 +291,18 @@ detachClient(*m_clientlist.back());

} } + // deal with extra menus + ExtraMenus::iterator mit = m_extramenus.begin(); + ExtraMenus::iterator mit_end = m_extramenus.end(); + for (; mit != mit_end; ++mit) { + // we set them to NOT internal so that they will be deleted when the + // menu is cleaned up. We can't delete them here because they are + // still in the menu + // (They need to be internal for most of the time so that if we + // rebuild the menu, then they won't be removed. + mit->second->setInternalMenu(false); + } + #ifdef DEBUG cerr<<__FILE__<<"("<<__LINE__<<"): ~FluxboxWindow("<<this<<")"<<endl; #endif // DEBUG

@@ -302,10 +310,6 @@ }

void FluxboxWindow::init() { - // so parent menu don't kill us - m_layermenu->setInternalMenu(); - m_layermenu->disableTitle(); - m_attaching_tab = 0; assert(m_client);

@@ -518,7 +522,17 @@ deiconify(); //we're omnipresent and visible

} setState(m_current_state); - frame().reconfigure(); + + addExtraMenu("Layer...", + new LayerMenu<FluxboxWindow>(*screen().menuTheme(), + screen().screenNumber(), + screen().imageControl(), + *screen().layerManager().getLayer(Fluxbox::instance()->getMenuLayer()), + this, + false)); + // the layermenu will get deleted as an extra menu + // don't call setupWindow here as the addExtraMenu call should + sendConfigureNotify(); // no focus default setFocusFlag(false);

@@ -2169,7 +2183,7 @@ if (atom == FbAtoms::instance()->getWMProtocolsAtom()) {

getWMProtocols(); //!!TODO check this area // reset window actions - screen().setupWindowActions(*this); + setupWindow(); } break;

@@ -3304,3 +3318,154 @@ screen().updateNetizenConfigNotify(event);

} // end for } +void FluxboxWindow::addExtraMenu(const char *label, FbTk::Menu *menu) { + menu->setInternalMenu(); + menu->disableTitle(); + m_extramenus.push_back(std::make_pair(label, menu)); + + setupWindow(); +} + +void FluxboxWindow::removeExtraMenu(FbTk::Menu *menu) { + ExtraMenus::iterator it = m_extramenus.begin(); + ExtraMenus::iterator it_end = m_extramenus.end(); + for (; it != it_end; ++it) { + if (it->second == menu) { + m_extramenus.erase(it); + break; + } + } + setupWindow(); +} + + +void FluxboxWindow::setupWindow() { + // sets up our window + // we allow both to be done at once to share the commands + + FbWinFrame &frame = *m_frame.get(); + WinButtonTheme &winbutton_theme = screen().winButtonTheme(); + + typedef FbTk::RefCount<FbTk::Command> CommandRef; + + using namespace FbTk; + typedef RefCount<Command> CommandRef; + typedef SimpleCommand<FluxboxWindow> WindowCmd; + + CommandRef iconify_cmd(new WindowCmd(*this, &FluxboxWindow::iconify)); + CommandRef maximize_cmd(new WindowCmd(*this, &FluxboxWindow::maximize)); + CommandRef maximize_vert_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeVertical)); + CommandRef maximize_horiz_cmd(new WindowCmd(*this, &FluxboxWindow::maximizeHorizontal)); + CommandRef close_cmd(new WindowCmd(*this, &FluxboxWindow::close)); + CommandRef shade_cmd(new WindowCmd(*this, &FluxboxWindow::shade)); + CommandRef raise_cmd(new WindowCmd(*this, &FluxboxWindow::raise)); + CommandRef lower_cmd(new WindowCmd(*this, &FluxboxWindow::lower)); + CommandRef raise_and_focus_cmd(new WindowCmd(*this, &FluxboxWindow::raiseAndFocus)); + CommandRef stick_cmd(new WindowCmd(*this, &FluxboxWindow::stick)); + CommandRef show_menu_cmd(new WindowCmd(*this, &FluxboxWindow::popupMenu)); + + // clear old buttons from frame + frame.removeAllButtons(); + //!! TODO: fix this ugly hack + // get titlebar configuration + const vector<Fluxbox::Titlebar> *dir = &Fluxbox::instance()->getTitlebarLeft(); + for (char c=0; c<2; c++) { + for (size_t i=0; i< dir->size(); ++i) { + //create new buttons + FbTk::Button *newbutton = 0; + if (isIconifiable() && (*dir)[i] == Fluxbox::MINIMIZE) { + newbutton = new WinButton(*this, winbutton_theme, + WinButton::MINIMIZE, + frame.titlebar(), + 0, 0, 10, 10); + newbutton->setOnClick(iconify_cmd); + + } else if (isMaximizable() && (*dir)[i] == Fluxbox::MAXIMIZE) { + newbutton = new WinButton(*this, winbutton_theme, + WinButton::MAXIMIZE, + frame.titlebar(), + 0, 0, 10, 10); + + newbutton->setOnClick(maximize_cmd, 1); + newbutton->setOnClick(maximize_horiz_cmd, 3); + newbutton->setOnClick(maximize_vert_cmd, 2); + + } else if (isClosable() && (*dir)[i] == Fluxbox::CLOSE) { + newbutton = new WinButton(*this, winbutton_theme, + WinButton::CLOSE, + frame.titlebar(), + 0, 0, 10, 10); + + newbutton->setOnClick(close_cmd); +#ifdef DEBUG + cerr<<__FILE__<<": Creating close button"<<endl; +#endif // DEBUG + } else if ((*dir)[i] == Fluxbox::STICK) { + WinButton *winbtn = new WinButton(*this, winbutton_theme, + WinButton::STICK, + frame.titlebar(), + 0, 0, 10, 10); + stateSig().attach(winbtn); + winbtn->setOnClick(stick_cmd); + newbutton = winbtn; + } else if ((*dir)[i] == Fluxbox::SHADE) { + WinButton *winbtn = new WinButton(*this, winbutton_theme, + WinButton::SHADE, + frame.titlebar(), + 0, 0, 10, 10); + winbtn->setOnClick(shade_cmd); + } + + if (newbutton != 0) { + newbutton->show(); + if (c == 0) + frame.addLeftButton(newbutton); + else + frame.addRightButton(newbutton); + } + } //end for i + dir = &Fluxbox::instance()->getTitlebarRight(); + } // end for c + + frame.reconfigure(); + + // setup titlebar + frame.setOnClickTitlebar(raise_and_focus_cmd, 1, false, true); // on press with button 1 + frame.setOnClickTitlebar(shade_cmd, 1, true); // doubleclick with button 1 + frame.setOnClickTitlebar(show_menu_cmd, 3); // on release with button 3 + frame.setOnClickTitlebar(lower_cmd, 2); // on release with button 2 + frame.setDoubleClickTime(Fluxbox::instance()->getDoubleClickInterval()); + + // end setup frame + + // setup menu + FbTk::Menu &menu = m_windowmenu; + menu.removeAll(); // clear old items + menu.disableTitle(); // not titlebar + + // set new menu items + menu.insert("Shade", shade_cmd); + menu.insert("Stick", stick_cmd); + menu.insert("Maximize", maximize_cmd); + menu.insert("Maximize Vertical", maximize_vert_cmd); + menu.insert("Maximize Horizontal", maximize_horiz_cmd); + menu.insert("Iconify", iconify_cmd); + menu.insert("Raise", raise_cmd); + menu.insert("Lower", lower_cmd); + CommandRef next_client_cmd(new WindowCmd(*this, &FluxboxWindow::nextClient)); + CommandRef prev_client_cmd(new WindowCmd(*this, &FluxboxWindow::prevClient)); + menu.insert("Next Client", next_client_cmd); + menu.insert("Prev Client", prev_client_cmd); + + ExtraMenus::iterator it = m_extramenus.begin(); + ExtraMenus::iterator it_end = m_extramenus.end(); + for (; it != it_end; ++it) { + it->second->disableTitle(); // be sure there is no title + menu.insert(it->first, it->second); + } + + menu.insert("ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ"); + menu.insert("Close", close_cmd); + + menu.reconfigure(); // update graphics +}
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.84 2003/07/17 17:56:28 rathnor Exp $ +// $Id: Window.hh,v 1.85 2003/07/20 08:12:36 rathnor Exp $ #ifndef WINDOW_HH #define WINDOW_HH

@@ -198,6 +198,8 @@ void lowerLayer();

void moveToLayer(int layernum); void reconfigure(); + void setupWindow(); + void installColormap(bool); void restore(WinClient *client, bool remap); void restore(bool remap);

@@ -288,8 +290,17 @@

FbTk::Menu &menu() { return m_windowmenu; } const FbTk::Menu &menu() const { return m_windowmenu; } - FbTk::Menu &layermenu() { return *m_layermenu.get(); } - const FbTk::Menu &layermenu() const { return *m_layermenu.get(); } + // this should perhaps be a refcount?? + typedef std::list<std::pair<const char *, FbTk::Menu *> > ExtraMenus; + + // for extras to add menus. + // These menus will be marked internal, + // and deleted when the window dies (as opposed to Screen + void addExtraMenu(const char *label, FbTk::Menu *menu); + void removeExtraMenu(FbTk::Menu *menu); + + ExtraMenus &extraMenus() { return m_extramenus; } + const ExtraMenus &extraMenus() const { return m_extramenus; } const FbTk::FbWindow &parent() const { return m_parent; } FbTk::FbWindow &parent() { return m_parent; }

@@ -403,9 +414,7 @@ FbTk::Timer m_timer;

Display *display; /// display connection BlackboxAttributes m_blackbox_attrib; - std::auto_ptr<FbTk::Menu> m_layermenu; FbTk::Menu m_windowmenu; - timeval m_last_focus_time;

@@ -451,6 +460,7 @@ int m_layernum;

FbTk::FbWindow &m_parent; ///< window on which we draw move/resize rectangle (the "root window") + ExtraMenus m_extramenus; };