all repos — fluxbox @ c69e7c4988b3c373110f2d6d2757a1e6b6b7836e

custom fork of the fluxbox windowmanager

improved menu loading speed and added menu icon
fluxgen fluxgen
commit

c69e7c4988b3c373110f2d6d2757a1e6b6b7836e

parent

d2e0aea0ae29289b44a82e66c44a9545a71b0d67

1 files changed, 53 insertions(+), 42 deletions(-)

jump to
M src/MenuCreator.ccsrc/MenuCreator.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: MenuCreator.cc,v 1.8 2004/06/08 13:15:30 rathnor Exp $ +// $Id: MenuCreator.cc,v 1.9 2004/06/10 11:43:24 fluxgen Exp $ #include "MenuCreator.hh"

@@ -92,37 +92,49 @@ Fluxbox::instance()->saveMenuFilename(stylesdir.c_str());

} -static void translateMenuItem(Parser &parse, - const std::string &str_key, - const std::string &str_label, - const std::string &str_cmd, - FbTk::Menu &menu); +class ParseItem { +public: + explicit ParseItem(FbTk::Menu *menu):m_menu(menu) {} + + inline void load(Parser &p) { + p>>m_key>>m_label>>m_cmd>>m_icon; + } + inline const std::string &icon() const { return m_icon.second; } + inline const std::string &command() const { return m_cmd.second; } + inline const std::string &label() const { return m_label.second; } + inline const std::string &key() const { return m_key.second; } + inline FbTk::Menu *menu() { return m_menu; } +private: + Parser::Item m_key, m_label, m_cmd, m_icon; + FbTk::Menu *m_menu; +}; + + +static void translateMenuItem(Parser &parse, ParseItem &item); static void parseMenu(Parser &pars, FbTk::Menu &menu) { - Parser::Item item, item2, item3; + ParseItem pitem(&menu); while (!pars.eof()) { - pars>>item>>item2>>item3; - if (item.second == "end") + pitem.load(pars); + if (pitem.key() == "end") return; - translateMenuItem(pars, - item.second, - item2.second, - item3.second, - menu); - + translateMenuItem(pars, pitem); } } -static void translateMenuItem(Parser &parse, - const std::string &str_key, - const std::string &str_label, - const std::string &str_cmd, - FbTk::Menu &menu) { - +static void translateMenuItem(Parser &parse, ParseItem &pitem) { + if (pitem.menu() == 0) + throw string("translateMenuItem: We must have a menu in ParseItem!"); + + FbTk::Menu &menu = *pitem.menu(); + const std::string &str_key = pitem.key(); + const std::string &str_cmd = pitem.command(); + const std::string &str_label = pitem.label(); + const int screen_number = menu.screenNumber(); _FB_USES_NLS; - + if (str_key == "end") { return; } else if (str_key == "nop") {

@@ -215,13 +227,7 @@ menu.insert(str_label.c_str(), &screen->getWorkspacemenu());

} } else if (str_key == "separator") { menu.insert(new FbTk::MenuSeparator()); - }/* else if (str_key == "icon") { - FbTk::RefCount<FbTk::Command> cmd(CommandParser::instance().parseLine(str_cmd)); - FbTk::MenuItem *item = new FbTk::MenuIcon(str_label, str_cmd, screen_number); - item->setCommand(cmd); - menu.insert(item); - - }*/ + } else { // ok, if we didn't find any special menu item we try with command parser // we need to attach command with arguments so command parser can parse it string line = str_key + " " + str_cmd;

@@ -229,28 +235,32 @@ FbTk::RefCount<FbTk::Command> command(CommandParser::instance().parseLine(line));

if (*command != 0) menu.insert(str_label.c_str(), command); } - + if (menu.numberOfItems() != 0) { + FbTk::MenuItem *item = menu.find(menu.numberOfItems() - 1); + if (item != 0 && !pitem.icon().empty()) + item->setIcon(pitem.icon().c_str(), menu.screenNumber()); + } } static void parseWindowMenu(Parser &parse, FbTk::Menu &menu, FluxboxWindow &win) { - Parser::Item item, item2, item3; + ParseItem pitem(&menu); while (!parse.eof()) { - parse>>item>>item2>>item3; - if (MenuCreator::createWindowMenuItem(item.second, item2.second, menu, win)) + pitem.load(parse); + if (MenuCreator::createWindowMenuItem(pitem.key(), pitem.label(), menu, win)) continue; - if (item.second == "end") { + if (pitem.key() == "end") { return; - } else if (item.second == "submenu") { - FbTk::Menu *submenu = MenuCreator::createMenu(item2.second, menu.screenNumber()); + } else if (pitem.key() == "submenu") { + FbTk::Menu *submenu = MenuCreator::createMenu(pitem.label(), menu.screenNumber()); parseWindowMenu(parse, *submenu, win); submenu->update(); - menu.insert(item2.second.c_str(), submenu); + menu.insert(pitem.label().c_str(), submenu); } else { // try non window menu specific stuff - translateMenuItem(parse, item.second, item2.second, item3.second, menu); + translateMenuItem(parse, pitem); } } }

@@ -271,17 +281,18 @@ return menu;

} bool getStart(FbMenuParser &parser, std::string &label) { - Parser::Item item, item2, item3; + ParseItem pitem(0); while (!parser.eof()) { // get first begin line - parser>>item>>item2>>item3; - if (item.second == "begin") { + pitem.load(parser); + if (pitem.key() == "begin") { break; } } if (parser.eof()) return false; - label = item2.second; + + label = pitem.label(); return true; }