testing menu theme and parser
This commit is contained in:
parent
65df13004a
commit
f947c73420
1 changed files with 155 additions and 0 deletions
155
src/tests/menutest.cc
Normal file
155
src/tests/menutest.cc
Normal file
|
@ -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();
|
||||
|
||||
}
|
Loading…
Reference in a new issue