all repos — fluxbox @ 93b0c5322a7482d83e38657b36e9814f8415e47b

custom fork of the fluxbox windowmanager

refactor menu reloading, added FbTk::AutoReloadHelper
Mark Tiefenbruck mark@fluxbox.org
commit

93b0c5322a7482d83e38657b36e9814f8415e47b

parent

72a45fae3c39323206e7d19913bb3ab17a691691

M src/FbCommands.ccsrc/FbCommands.cc

@@ -73,11 +73,11 @@ namespace {

void showMenu(const BScreen &screen, FbTk::Menu &menu) { - // special case for root menu - if (&menu == &screen.rootMenu()) { - Fluxbox* fb = Fluxbox::instance(); - if(fb->menuTimestampsChanged()) - fb->rereadMenu(); + // check if menu has changed + if (typeid(menu) == typeid(FbMenu)) { + FbMenu *fbmenu = static_cast<FbMenu *>(&menu); + if (fbmenu->reloadHelper()) + fbmenu->reloadHelper()->checkReload(); } Window root_ret; // not used
M src/FbMenu.hhsrc/FbMenu.hh

@@ -22,8 +22,11 @@

#ifndef FBMENU_HH #define FBMENU_HH +#include <memory> + #include "FbTk/Menu.hh" #include "FbTk/XLayerItem.hh" +#include "FbTk/AutoReloadHelper.hh" class FluxboxWindow;

@@ -44,11 +47,15 @@ void buttonPressEvent(XButtonEvent &be);

void buttonReleaseEvent(XButtonEvent &be); void keyPressEvent(XKeyEvent &ke); + void setReloadHelper(FbTk::AutoReloadHelper *helper) { m_reloader.reset(helper); } + FbTk::AutoReloadHelper *reloadHelper() { return m_reloader.get(); } + static void setWindow(FluxboxWindow *win) { s_window = win; } static FluxboxWindow *window() { return s_window; } private: FbTk::XLayerItem m_layeritem; + std::auto_ptr<FbTk::AutoReloadHelper> m_reloader; static FluxboxWindow *s_window; };
A src/FbTk/AutoReloadHelper.cc

@@ -0,0 +1,66 @@

+// AutoReloadHelper.cc +// Copyright (c) 2008 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. + +#include "AutoReloadHelper.hh" + +#include "FileUtil.hh" +#include "StringUtil.hh" + +namespace FbTk { + +void AutoReloadHelper::checkReload() { + if (!m_reload_cmd.get()) + return; + TimestampMap::const_iterator it = m_timestamps.begin(); + TimestampMap::const_iterator it_end = m_timestamps.end(); + for (; it != it_end; ++it) { + if (FileUtil::getLastStatusChangeTimestamp(it->first.c_str()) != + it->second) { + reload(); + return; + } + } +} + +void AutoReloadHelper::setMainFile(std::string file) { + file = StringUtil::expandFilename(file); + if (file == m_main_file) + return; + m_main_file = file; + reload(); +} + +void AutoReloadHelper::addFile(std::string file) { + if (file.empty()) + return; + file = StringUtil::expandFilename(file); + m_timestamps[file] = FileUtil::getLastStatusChangeTimestamp(file.c_str()); +} + +void AutoReloadHelper::reload() { + if (!m_reload_cmd.get()) + return; + m_timestamps.clear(); + addFile(m_main_file); + m_reload_cmd->execute(); +} + +} // end namespace FbTk
A src/FbTk/AutoReloadHelper.hh

@@ -0,0 +1,54 @@

+// AutoReloadHelper.hh +// Copyright (c) 2008 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// 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. + +#ifndef AUTORELOADHELPER_HH +#define AUTORELOADHELPER_HH + +#include <map> +#include <string> +#include <sys/types.h> + +#include "Command.hh" +#include "RefCount.hh" + +namespace FbTk { + +class AutoReloadHelper { +public: + + void setMainFile(std::string filename); + void addFile(std::string filename); + void setReloadCmd(RefCount<Command<void> > cmd) { m_reload_cmd = cmd; } + + void checkReload(); + void reload(); + +private: + RefCount<Command<void> > m_reload_cmd; + std::string m_main_file; + + typedef std::map<std::string, time_t> TimestampMap; + TimestampMap m_timestamps; +}; + +} // end namespace FbTk + +#endif // AUTORELOADHELPER_HH
M src/FbTk/Makefile.amsrc/FbTk/Makefile.am

@@ -45,6 +45,7 @@ StringUtil.hh StringUtil.cc Parser.hh Parser.cc \

RegExp.hh RegExp.cc \ FbString.hh FbString.cc \ Subject.hh Subject.cc Observer.hh Observer.cc SimpleObserver.hh \ + AutoReloadHelper.hh AutoReloadHelper.cc \ Transparent.hh Transparent.cc \ FbPixmap.hh FbPixmap.cc \ FbDrawable.hh FbDrawable.cc \
M src/MenuCreator.ccsrc/MenuCreator.cc

@@ -59,6 +59,7 @@ using std::string;

using std::vector; using std::list; using std::less; +using FbTk::AutoReloadHelper; list<string> MenuCreator::encoding_stack; list<size_t> MenuCreator::stacksize_stack;

@@ -68,12 +69,15 @@

namespace { void createStyleMenu(FbTk::Menu &parent, const string &label, - const string &directory) { + AutoReloadHelper *reloader, const string &directory) { // perform shell style ~ home directory expansion string stylesdir(FbTk::StringUtil::expandFilename(directory)); if (!FbTk::FileUtil::isDirectory(stylesdir.c_str())) return; + + if (reloader) + reloader->addFile(stylesdir); FbTk::Directory dir(stylesdir.c_str());

@@ -99,17 +103,20 @@ parent.insert(new StyleMenuItem(filelist[file_index], style));

} // update menu graphics parent.updateMenu(); - Fluxbox::instance()->saveMenuFilename(stylesdir.c_str()); } void createRootCmdMenu(FbTk::Menu &parent, const string &label, - const string &directory, const string &cmd) { + const string &directory, AutoReloadHelper *reloader, + const string &cmd) { // perform shell style ~ home directory expansion string rootcmddir(FbTk::StringUtil::expandFilename(directory)); if (!FbTk::FileUtil::isDirectory(rootcmddir.c_str())) return; + + if (reloader) + reloader->addFile(rootcmddir); FbTk::Directory dir(rootcmddir.c_str());

@@ -134,7 +141,6 @@ parent.insert(new RootCmdMenuItem(filelist[file_index], rootcmd, cmd));

} // update menu graphics parent.updateMenu(); - Fluxbox::instance()->saveMenuFilename(rootcmddir.c_str()); }

@@ -172,20 +178,26 @@ }

}; -void translateMenuItem(FbTk::Parser &parse, ParseItem &item, FbTk::StringConvertor &labelconvertor); +void translateMenuItem(FbTk::Parser &parse, ParseItem &item, + FbTk::StringConvertor &labelconvertor, + AutoReloadHelper *reloader); -void parseMenu(FbTk::Parser &pars, FbTk::Menu &menu, FbTk::StringConvertor &label_convertor) { +void parseMenu(FbTk::Parser &pars, FbTk::Menu &menu, + FbTk::StringConvertor &label_convertor, + AutoReloadHelper *reloader) { ParseItem pitem(&menu); while (!pars.eof()) { pitem.load(pars, label_convertor); if (pitem.key() == "end") return; - translateMenuItem(pars, pitem, label_convertor); + translateMenuItem(pars, pitem, label_convertor, reloader); } } -void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, FbTk::StringConvertor &labelconvertor) { +void translateMenuItem(FbTk::Parser &parse, ParseItem &pitem, + FbTk::StringConvertor &labelconvertor, + AutoReloadHelper *reloader) { if (pitem.menu() == 0) throw string("translateMenuItem: We must have a menu in ParseItem!");

@@ -255,13 +267,13 @@

if (FbTk::FileUtil::isRegularFile(thisfile.c_str()) && (filelist[file_index][0] != '.') && (thisfile[thisfile.length() - 1] != '~')) { - MenuCreator::createFromFile(thisfile, menu, false); + MenuCreator::createFromFile(thisfile, menu, reloader, false); } } } else { // inject this file into the current menu - MenuCreator::createFromFile(newfile, menu, false); + MenuCreator::createFromFile(newfile, menu, reloader, false); } safe_counter--;

@@ -278,22 +290,22 @@ submenu->setLabel(str_cmd);

else submenu->setLabel(str_label); - parseMenu(parse, *submenu, labelconvertor); + parseMenu(parse, *submenu, labelconvertor, reloader); submenu->updateMenu(); menu.insert(str_label, submenu); } // end of submenu else if (str_key == "stylesdir" || str_key == "stylesmenu") { - createStyleMenu(menu, str_label, + createStyleMenu(menu, str_label, reloader, str_key == "stylesmenu" ? str_cmd : str_label); } // end of stylesdir else if (str_key == "themesdir" || str_key == "themesmenu") { - createStyleMenu(menu, str_label, + createStyleMenu(menu, str_label, reloader, str_key == "themesmenu" ? str_cmd : str_label); } // end of themesdir else if (str_key == "wallpapers" || str_key == "wallpapermenu" || str_key == "rootcommands") { - createRootCmdMenu(menu, str_label, str_label, + createRootCmdMenu(menu, str_label, str_label, reloader, str_cmd == "" ? realProgramName("fbsetbg") : str_cmd); } // end of wallpapers else if (str_key == "workspaces") {

@@ -335,7 +347,9 @@ }

} -void parseWindowMenu(FbTk::Parser &parse, FbTk::Menu &menu, FbTk::StringConvertor &labelconvertor) { +void parseWindowMenu(FbTk::Parser &parse, FbTk::Menu &menu, + FbTk::StringConvertor &labelconvertor, + AutoReloadHelper *reloader) { ParseItem pitem(&menu); while (!parse.eof()) {

@@ -343,16 +357,16 @@ pitem.load(parse, labelconvertor);

if (MenuCreator::createWindowMenuItem(pitem.key(), pitem.label(), menu)) continue; - if (pitem.key() == "end") { + if (pitem.key() == "end") return; - } else if (pitem.key() == "submenu") { + if (pitem.key() == "submenu") { FbTk::Menu *submenu = MenuCreator::createMenu(pitem.label(), menu.screenNumber()); - parseWindowMenu(parse, *submenu, labelconvertor); + parseWindowMenu(parse, *submenu, labelconvertor, reloader); submenu->updateMenu(); menu.insert(pitem.label(), submenu); } else { // try non window menu specific stuff - translateMenuItem(parse, pitem, labelconvertor); + translateMenuItem(parse, pitem, labelconvertor, reloader); } } }

@@ -376,12 +390,12 @@ }

}; // end of anonymous namespace -FbTk::Menu *MenuCreator::createMenu(const string &label, int screen_number) { +FbMenu *MenuCreator::createMenu(const string &label, int screen_number) { BScreen *screen = Fluxbox::instance()->findScreen(screen_number); if (screen == 0) return 0; - FbTk::Menu *menu = new FbMenu(screen->menuTheme(), + FbMenu *menu = new FbMenu(screen->menuTheme(), screen->imageControl(), *screen->layerManager().getLayer(Layer::MENU)); if (!label.empty())

@@ -391,7 +405,8 @@ return menu;

} bool MenuCreator::createFromFile(const string &filename, - FbTk::Menu &inject_into, bool begin) { + FbTk::Menu &inject_into, + AutoReloadHelper *reloader, bool begin) { string real_filename = FbTk::StringUtil::expandFilename(filename); FbMenuParser parser(real_filename);

@@ -409,73 +424,49 @@ inject_into.setLabel(label);

} // save menu filename, so we can check if it changes - Fluxbox::instance()->saveMenuFilename(real_filename.c_str()); + if (reloader) + reloader->addFile(real_filename); - parseMenu(parser, inject_into, m_stringconvertor); + parseMenu(parser, inject_into, m_stringconvertor, reloader); endFile(); return true; } -bool MenuCreator::createWindowMenuFromFile(const string &filename, - FbTk::Menu &inject_into) { +void MenuCreator::createWindowMenuFromFile(const string &filename, + FbTk::Menu &inject_into, + AutoReloadHelper *reloader) { string real_filename = FbTk::StringUtil::expandFilename(filename); FbMenuParser parser(real_filename); if (!parser.isLoaded()) - return false; + return; string label; startFile(); if (!getStart(parser, label, m_stringconvertor)) { endFile(); - return false; + return; } - parseWindowMenu(parser, inject_into, m_stringconvertor); - endFile(); + if (reloader) + reloader->addFile(real_filename); - return true; + parseWindowMenu(parser, inject_into, m_stringconvertor, reloader); + endFile(); } -FbTk::Menu *MenuCreator::createMenuType(const string &type, int screen_num) { +FbMenu *MenuCreator::createMenuType(const string &type, int screen_num) { BScreen *screen = Fluxbox::instance()->findScreen(screen_num); if (screen == 0) return 0; - if (type == "iconmenu") { + if (type == "iconmenu") return new ClientMenu(*screen, screen->iconList(), &screen->iconListSig()); - } else if (type == "workspacemenu") { + else if (type == "workspacemenu") return new WorkspaceMenu(*screen); - } else if (type == "windowmenu") { - FbTk::Menu *menu = createMenu("", screen_num); - - menu->disableTitle(); // not titlebar - if (screen->windowMenuFilename().empty() || - ! createWindowMenuFromFile(screen->windowMenuFilename(), *menu)) { - const char *default_menu[] = { - "shade", - "stick", - "maximize", - "iconify", - "raise", - "lower", - "sendto", - "layer", - "alpha", - "extramenus", - "separator", - "close", - 0 - }; - for (unsigned int i=0; default_menu[i]; ++i) - createWindowMenuItem(default_menu[i], "", *menu); - } - menu->reconfigure(); // update graphics - return menu; - } return 0; }
M src/MenuCreator.hhsrc/MenuCreator.hh

@@ -28,18 +28,24 @@

#include <list> namespace FbTk { +class AutoReloadHelper; class Menu; } +class FbMenu; class FluxboxWindow; class MenuCreator { public: - static FbTk::Menu *createMenu(const std::string &label, int screen_num); - static FbTk::Menu *createMenuType(const std::string &label, int screen_num); + static FbMenu *createMenu(const std::string &label, int screen_num); + static FbMenu *createMenuType(const std::string &label, int screen_num); static bool createFromFile(const std::string &filename, - FbTk::Menu &inject_into, bool begin = true); - static bool createWindowMenuFromFile(const std::string &filename, FbTk::Menu &inject_into); + FbTk::Menu &inject_into, + FbTk::AutoReloadHelper *reloader = NULL, + bool begin = true); + static void createWindowMenuFromFile(const std::string &filename, + FbTk::Menu &inject_into, + FbTk::AutoReloadHelper *reloader); static bool createWindowMenuItem(const std::string &type, const std::string &label, FbTk::Menu &inject_into);
M src/Screen.ccsrc/Screen.cc

@@ -502,6 +502,15 @@ //!! TODO: we shouldn't do this more than once, but since slit handles their

// own resources we must do this. fluxbox->load_rc(*this); + m_windowmenu.reset(createMenu("")); + m_windowmenu->setInternalMenu(); + m_windowmenu->setReloadHelper(new FbTk::AutoReloadHelper()); + m_windowmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadWindowMenu))); + + m_rootmenu.reset(createMenu("")); + m_rootmenu->setReloadHelper(new FbTk::AutoReloadHelper()); + m_rootmenu->reloadHelper()->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<BScreen>(*this, &BScreen::rereadMenu))); + m_configmenu.reset(createMenu(_FB_XTEXT(Menu, Configuration, "Configuration", "Title of configuration menu"))); setupConfigmenu(*m_configmenu.get());

@@ -889,8 +898,8 @@ focusControl().cycleFocus(*win_list, pat, reverse);

} -FbTk::Menu *BScreen::createMenu(const string &label) { - FbTk::Menu *menu = new FbMenu(menuTheme(), +FbMenu *BScreen::createMenu(const string &label) { + FbMenu *menu = new FbMenu(menuTheme(), imageControl(), *layerManager().getLayer(Layer::MENU)); if (!label.empty())

@@ -898,8 +907,9 @@ menu->setLabel(label);

return menu; } -FbTk::Menu *BScreen::createToggleMenu(const string &label) { - FbTk::Menu *menu = new ToggleMenu(menuTheme(), + +FbMenu *BScreen::createToggleMenu(const string &label) { + FbMenu *menu = new ToggleMenu(menuTheme(), imageControl(), *layerManager().getLayer(Layer::MENU)); if (!label.empty())

@@ -912,9 +922,7 @@ void BScreen::addExtraWindowMenu(const FbTk::FbString &label, FbTk::Menu *menu) {

menu->setInternalMenu(); menu->disableTitle(); m_extramenus.push_back(make_pair(label, menu)); - // recreate window menu - m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); - m_windowmenu->setInternalMenu(); + rereadWindowMenu(); } void BScreen::reconfigure() {

@@ -956,10 +964,9 @@ removeLastWorkspace();

} } - //reconfigure menus - // recreate window menu - m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); - m_windowmenu->setInternalMenu(); + // update menu filenames + m_rootmenu->reloadHelper()->setMainFile(fluxbox->getMenuFilename()); + m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); // reconfigure workspaces for_each(m_workspaces_list.begin(),

@@ -990,12 +997,6 @@ std::list<Focusable *>::const_iterator it = winlist.begin(),

it_end = winlist.end(); for (; it != it_end; ++it) (*it)->fbwindow()->applyDecorations(); -} - - -void BScreen::rereadMenu() { - initMenu(); - m_rootmenu->reconfigure(); } void BScreen::updateWorkspaceName(unsigned int w) {

@@ -1489,23 +1490,20 @@ }

void BScreen::initMenus() { m_workspacemenu.reset(MenuCreator::createMenuType("workspacemenu", screenNumber())); - m_windowmenu.reset(MenuCreator::createMenuType("windowmenu", screenNumber())); - m_windowmenu->setInternalMenu(); - initMenu(); + m_rootmenu->reloadHelper()->setMainFile(Fluxbox::instance()->getMenuFilename()); + m_windowmenu->reloadHelper()->setMainFile(windowMenuFilename()); } -void BScreen::initMenu() { +void BScreen::rereadMenu() { - if (m_rootmenu.get()) { - m_rootmenu->removeAll(); - m_rootmenu->setLabel(""); - } else - m_rootmenu.reset(createMenu("")); + m_rootmenu->removeAll(); + m_rootmenu->setLabel(""); Fluxbox * const fb = Fluxbox::instance(); if (!fb->getMenuFilename().empty()) - MenuCreator::createFromFile(fb->getMenuFilename(), *m_rootmenu); + MenuCreator::createFromFile(fb->getMenuFilename(), *m_rootmenu, + m_rootmenu->reloadHelper()); if (m_rootmenu->numberOfItems() == 0) { _FB_USES_NLS;

@@ -1521,14 +1519,39 @@ m_rootmenu->insert(_FB_XTEXT(Menu, Restart, "Restart", "Restart command"),

restart_fb); m_rootmenu->insert(_FB_XTEXT(Menu, Exit, "Exit", "Exit command"), exit_fb); - // still save the menu filename, in case it becomes valid later - if (!fb->getMenuFilename().empty()) - fb->saveMenuFilename(fb->getMenuFilename().c_str()); } - m_rootmenu->updateMenu(); } +void BScreen::rereadWindowMenu() { + + m_windowmenu->removeAll(); + if (!windowMenuFilename().empty()) + MenuCreator::createWindowMenuFromFile(windowMenuFilename(), + *m_windowmenu, + m_windowmenu->reloadHelper()); + + if (m_windowmenu->numberOfItems() == 0) { + const char *defaults[] = { + "shade", + "stick", + "maximize", + "iconify", + "raise", + "lower", + "sendto", + "layer", + "alpha", + "extramenus", + "separator", + "close", + 0 + }; + for (unsigned int i=0; defaults[i]; ++i) + MenuCreator::createWindowMenuItem(defaults[i], "", *m_windowmenu); + } + +} void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { m_configmenu_list.push_back(make_pair(label, &menu));
M src/Screen.hhsrc/Screen.hh

@@ -54,6 +54,7 @@ #include <memory>

#include <map> class ClientPattern; +class FbMenu; class Focusable; class FluxboxWindow; class WinClient;

@@ -122,12 +123,12 @@ const std::string &defaultDeco() const { return *resource.default_deco; }

const std::string &windowMenuFilename() const { return *resource.windowmenufile; } FbTk::ImageControl &imageControl() { return *m_image_control.get(); } // menus - const FbTk::Menu &rootMenu() const { return *m_rootmenu.get(); } - FbTk::Menu &rootMenu() { return *m_rootmenu.get(); } - const FbTk::Menu &configMenu() const { return *m_configmenu.get(); } - FbTk::Menu &configMenu() { return *m_configmenu.get(); } - const FbTk::Menu &windowMenu() const { return *m_windowmenu.get(); } - FbTk::Menu &windowMenu() { return *m_windowmenu.get(); } + const FbMenu &rootMenu() const { return *m_rootmenu.get(); } + FbMenu &rootMenu() { return *m_rootmenu.get(); } + const FbMenu &configMenu() const { return *m_configmenu.get(); } + FbMenu &configMenu() { return *m_configmenu.get(); } + const FbMenu &windowMenu() const { return *m_windowmenu.get(); } + FbMenu &windowMenu() { return *m_windowmenu.get(); } ExtraMenus &extraWindowMenus() { return m_extramenus; } const ExtraMenus &extraWindowMenus() const { return m_extramenus; }

@@ -166,9 +167,9 @@ /// @return the current workspace

Workspace *currentWorkspace() { return m_current_workspace; } const Workspace *currentWorkspace() const { return m_current_workspace; } /// @return the workspace menu - const FbTk::Menu &workspaceMenu() const { return *m_workspacemenu.get(); } + const FbMenu &workspaceMenu() const { return *m_workspacemenu.get(); } /// @return the workspace menu - FbTk::Menu &workspaceMenu() { return *m_workspacemenu.get(); } + FbMenu &workspaceMenu() { return *m_workspacemenu.get(); } /// @return focus control handler const FocusControl &focusControl() const { return *m_focus_control; } /// @return focus control handler

@@ -251,15 +252,15 @@

/** * Creates an empty menu with specified label * @param label for the menu - * @return create menu + * @return created menu */ - FbTk::Menu *createMenu(const std::string &label); + FbMenu *createMenu(const std::string &label); /** * Creates an empty toggle menu with a specific label * @param label * @return created menu */ - FbTk::Menu *createToggleMenu(const std::string &label); + FbMenu *createToggleMenu(const std::string &label); /** * For extras to add menus.

@@ -383,6 +384,7 @@

void reconfigure(); void reconfigureTabs(); void rereadMenu(); + void rereadWindowMenu(); void shutdown(); /// show position window centered on the screen with "X x Y" text void showPosition(int x, int y);

@@ -489,7 +491,6 @@ };

private: void setupConfigmenu(FbTk::Menu &menu); - void initMenu(); void renderGeomWindow(); void renderPosWindow();

@@ -515,7 +516,7 @@ GC opGC;

std::auto_ptr<FbTk::ImageControl> m_image_control; - std::auto_ptr<FbTk::Menu> m_configmenu, m_rootmenu, m_workspacemenu, m_windowmenu; + std::auto_ptr<FbMenu> m_configmenu, m_rootmenu, m_workspacemenu, m_windowmenu; ExtraMenus m_extramenus;
M src/fluxbox.ccsrc/fluxbox.cc

@@ -437,8 +437,6 @@ it++) {

delete (*it).first; } m_atomhandler.clear(); - - clearMenuFilenames(); }

@@ -1467,63 +1465,6 @@ if (it == m_screen_list.end())

return 0; return *it; -} - -bool Fluxbox::menuTimestampsChanged() const { - list<MenuTimestamp *>::const_iterator it = m_menu_timestamps.begin(); - list<MenuTimestamp *>::const_iterator it_end = m_menu_timestamps.end(); - for (; it != it_end; ++it) { - - time_t timestamp = FbTk::FileUtil::getLastStatusChangeTimestamp((*it)->filename.c_str()); - - if (timestamp != (*it)->timestamp) - return true; - } - - // no timestamp changed - return false; -} - -void Fluxbox::rereadMenu() { - clearMenuFilenames(); - - for_each(m_screen_list.begin(), - m_screen_list.end(), - mem_fun(&BScreen::rereadMenu)); -} - -void Fluxbox::saveMenuFilename(const char *filename) { - if (filename == 0) - return; - - bool found = false; - - list<MenuTimestamp *>::iterator it = m_menu_timestamps.begin(); - list<MenuTimestamp *>::iterator it_end = m_menu_timestamps.end(); - for (; it != it_end; ++it) { - if ((*it)->filename == filename) { - found = true; - break; - } - } - - if (! found) { - time_t timestamp = FbTk::FileUtil::getLastStatusChangeTimestamp(filename); - - MenuTimestamp *ts = new MenuTimestamp; - - ts->filename = filename; - ts->timestamp = timestamp; - - m_menu_timestamps.push_back(ts); - } -} - -void Fluxbox::clearMenuFilenames() { - while(!m_menu_timestamps.empty()) { - delete m_menu_timestamps.back(); - m_menu_timestamps.pop_back(); - } } void Fluxbox::timed_reconfigure() {
M src/fluxbox.hhsrc/fluxbox.hh

@@ -136,8 +136,6 @@

void shutdown(); void load_rc(BScreen &scr); void saveStyleFilename(const char *val) { m_rc_stylefile = (val == 0 ? "" : val); } - void saveMenuFilename(const char *); - void clearMenuFilenames(); void saveWindowSearch(Window win, WinClient *winclient); // some windows relate to the group, not the client, so we record separately // searchWindow on these windows will give the active client in the group

@@ -149,8 +147,6 @@ void removeWindowSearchGroup(Window win);

void removeGroupSearch(Window win); void restart(const char *command = 0); void reconfigure(); - void rereadMenu(); - /// reloads the menus if the timestamps changed /// handle any system signal sent to the application void handleSignal(int signum);

@@ -176,8 +172,6 @@

typedef std::list<BScreen *> ScreenList; const ScreenList screenList() const { return m_screen_list; } - /// @return whether the timestamps on the menu changed - bool menuTimestampsChanged() const; bool haveShape() const { return m_have_shape; } int shapeEventbase() const { return m_shape_eventbase; } void getDefaultDataFilename(const char *name, std::string &) const;

@@ -190,14 +184,6 @@

AttentionNoticeHandler &attentionHandler() { return m_attention_handler; } private: - - typedef struct MenuTimestamp { - std::string filename; - time_t timestamp; - } MenuTimestamp; - - - std::string getRcFilename(); void load_rc();

@@ -241,7 +227,6 @@ // The group leader (which may not be mapped, so may not have a WinClient)

// will have it's window being the group index std::multimap<Window, WinClient *> m_group_search; - std::list<MenuTimestamp *> m_menu_timestamps; ScreenList m_screen_list; FluxboxWindow *m_masked_window;