all repos — fluxbox @ f947c73420b3a3b59c38e714b703f05b4954e980

custom fork of the fluxbox windowmanager

testing menu theme and parser
fluxgen fluxgen
commit

f947c73420b3a3b59c38e714b703f05b4954e980

parent

65df13004a3d46dcf5fc020e2ebeef861b40e952

1 files changed, 155 insertions(+), 0 deletions(-)

jump to
A src/tests/menutest.cc

@@ -0,0 +1,155 @@

+// menutest.cc a test app for Menus +// Copyright (c) 2005 Henrik Kinnunen (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. + +// $Id: menutest.cc 3700 2004-11-19 11:37:27Z mathias $ + +#include "App.hh" +#include "FbWindow.hh" +#include "Font.hh" +#include "EventHandler.hh" +#include "EventManager.hh" +#include "GContext.hh" +#include "Color.hh" +#include "Menu.hh" +#include "MenuItem.hh" +#include "MenuSeparator.hh" +#include "StringUtil.hh" +#include "ImageControl.hh" + +#include "../FbMenuParser.hh" + +#include <X11/Xutil.h> +#include <X11/keysym.h> + +#include <string> +#include <iostream> +using namespace std; + +void doSubmenu(Parser &parser, FbTk::Menu &menu, + FbTk::MenuTheme &theme, + FbTk::ImageControl &image_ctrl, + const std::string labelstr) { + + Parser::Item key, label, cmd, icon; + + FbTk::Menu *submenu = new FbTk::Menu(theme, image_ctrl); + submenu->setLabel(labelstr.c_str()); + menu.insert(labelstr.c_str(), submenu); + // skip submenu items + if (key.second == "begin") { + while (key.second != "end") { + parser>>key>>label>>cmd>>icon; + if (key.second == "begin") + doSubmenu(parser, *submenu, + theme, image_ctrl, + label.second); + } + } +} + +class App:public FbTk::App, public FbTk::EventHandler { +public: + App(const char *displayname, const std::string &stylefile, const std::string &menufile): + FbTk::App(displayname), + m_image_ctrl(DefaultScreen(display())), + m_menu_theme(DefaultScreen(display())), + m_menu(m_menu_theme, m_image_ctrl) { + + m_menu_theme.frameFont().setAntialias(true); + m_menu_theme.titleFont().setAntialias(true); + + cerr<<"Loading menu: "<<menufile<<endl; + FbMenuParser parser(menufile); + if (parser.isLoaded()) { + // get start of file + Parser::Item key, label, cmd, icon; + while (!parser.eof()) { + // get first begin line + parser>>key>>label>>cmd>>icon; + if (key.second == "begin") + break; + + } + + m_menu.setLabel(label.second.c_str()); + + while (!parser.eof()) { + parser>>key>>label>>cmd>>icon; + if (key.second == "end") + break; + + string iconfile = icon.second; + if (key.second == "separator") + m_menu.insert(new FbTk::MenuSeparator()); + else if (key.second == "begin") { // new submenu + doSubmenu(parser, m_menu, + m_menu_theme, + m_image_ctrl, + label.second); + } else if (key.second != "styles" && + key.second != "stylesdir") + m_menu.insert(label.second.c_str()); + + + // set icon on items + if (!iconfile.empty()) { + FbTk::MenuItem *item = m_menu.find(m_menu.numberOfItems() - 1); + item->setIcon(iconfile, m_menu.screenNumber()); + } + } + + } + + cerr<<"Loading style: "<<stylefile<<endl; + FbTk::ThemeManager::instance().load(stylefile); + + m_menu.show(); + + } + + ~App() { + } + + +private: + FbTk::ImageControl m_image_ctrl; + FbTk::MenuTheme m_menu_theme; + FbTk::Menu m_menu; +}; + +int main(int argc, char **argv) { + string displayname(""); + string stylefile, menufile="~/.fluxbox/menu"; + for (int a=1; a<argc; ++a) { + if (strcmp("-display", argv[a]) == 0 && a + 1 < argc) { + displayname = argv[++a]; + } else if (strcmp("-style", argv[a]) == 0 && a + 1 < argc) { + stylefile = argv[++a]; + } else if (strcmp("-menu", argv[a]) == 0 && a + 1 < argc) { + menufile = argv[++a]; + } + } + menufile = FbTk::StringUtil::expandFilename(menufile); + App app(displayname.c_str(), stylefile, menufile); + + app.eventLoop(); + +}