aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Labath <pavelo@centrum.sk>2011-07-02 08:19:48 (GMT)
committerPavel Labath <pavelo@centrum.sk>2011-11-01 09:57:20 (GMT)
commitadf9f90af810c827fa4c849235515898733da8b6 (patch)
tree9249a2bbc26b5c9b07b78a2da53cfff81eda7904
parentd5bef134ea20a2670d383492977b4d152e24464a (diff)
downloadfluxbox_pavel-adf9f90af810c827fa4c849235515898733da8b6.zip
fluxbox_pavel-adf9f90af810c827fa4c849235515898733da8b6.tar.bz2
CustomMenu command now shows lua menus
-rw-r--r--src/FbCommands.cc16
-rw-r--r--src/MenuCreator.cc43
-rw-r--r--src/MenuCreator.hh8
-rw-r--r--src/Screen.cc4
4 files changed, 33 insertions, 38 deletions
diff --git a/src/FbCommands.cc b/src/FbCommands.cc
index 63aa79d..e91484c 100644
--- a/src/FbCommands.cc
+++ b/src/FbCommands.cc
@@ -30,6 +30,7 @@
30#include "Keys.hh" 30#include "Keys.hh"
31#include "MenuCreator.hh" 31#include "MenuCreator.hh"
32 32
33#include "FbTk/I18n.hh"
33#include "FbTk/Theme.hh" 34#include "FbTk/Theme.hh"
34#include "FbTk/Menu.hh" 35#include "FbTk/Menu.hh"
35#include "FbTk/CommandParser.hh" 36#include "FbTk/CommandParser.hh"
@@ -338,9 +339,20 @@ void ShowCustomMenuCmd::execute() {
338} 339}
339 340
340void ShowCustomMenuCmd::reload() { 341void ShowCustomMenuCmd::reload() {
342 _FB_USES_NLS;
343
341 m_menu->removeAll(); 344 m_menu->removeAll();
342 m_menu->setLabel(FbTk::BiDiString("")); 345 try {
343 MenuCreator::createFromFile(custom_menu_file, *m_menu.get(), m_menu->reloadHelper()); 346 MenuCreator::createFromFile(custom_menu_file, *m_menu, m_menu->reloadHelper());
347 }
348 catch(std::runtime_error &e) {
349 fprintf(stderr, _FB_CONSOLETEXT(FbCommands, CantLoadMenu,
350 "Failed to load menu file '%s': %s",
351 "Error message when loading of custom menu fails. "
352 "One %s for filename, one for exception text.").c_str(),
353 custom_menu_file.c_str(), e.what());
354 fputs("\n", stderr);
355 }
344} 356}
345 357
346REGISTER_COMMAND(rootmenu, FbCommands::ShowRootMenuCmd, void); 358REGISTER_COMMAND(rootmenu, FbCommands::ShowRootMenuCmd, void);
diff --git a/src/MenuCreator.cc b/src/MenuCreator.cc
index 14035c0..b357dce 100644
--- a/src/MenuCreator.cc
+++ b/src/MenuCreator.cc
@@ -302,11 +302,11 @@ string getField(lua::state &l, int pos, const char *field, FbTk::StringConvertor
302} 302}
303 303
304void 304void
305createMenu_(FbMenu &inject_into, lua::state &l, int screen_number, FbTk::StringConvertor &conv, 305createMenu_(FbTk::Menu &inject_into, lua::state &l, FbTk::StringConvertor &conv,
306 FbTk::AutoReloadHelper *reloader); 306 FbTk::AutoReloadHelper *reloader);
307 307
308void 308void
309insertMenuItem(lua::state &l, FbMenu &menu, FbTk::StringConvertor &parent_conv, 309insertMenuItem(lua::state &l, FbTk::Menu &menu, FbTk::StringConvertor &parent_conv,
310 FbTk::AutoReloadHelper *reloader) { 310 FbTk::AutoReloadHelper *reloader) {
311 lua::stack_sentry s(l, -1); 311 lua::stack_sentry s(l, -1);
312 l.checkstack(1); 312 l.checkstack(1);
@@ -357,7 +357,7 @@ insertMenuItem(lua::state &l, FbMenu &menu, FbTk::StringConvertor &parent_conv,
357 } else if(str_key == "menu") { 357 } else if(str_key == "menu") {
358 std::auto_ptr<FbMenu> t(MenuCreator::createMenu("", screen_number)); 358 std::auto_ptr<FbMenu> t(MenuCreator::createMenu("", screen_number));
359 l.pushvalue(-1); 359 l.pushvalue(-1);
360 createMenu_(*t, l, screen_number, *conv, reloader); 360 createMenu_(*t, l, *conv, reloader);
361 menu.insert(str_label, t.release()); 361 menu.insert(str_label, t.release());
362 } else { 362 } else {
363 // items that have a parameter 363 // items that have a parameter
@@ -397,7 +397,7 @@ insertMenuItem(lua::state &l, FbMenu &menu, FbTk::StringConvertor &parent_conv,
397} 397}
398 398
399void 399void
400createMenu_(FbMenu &inject_into, lua::state &l, int screen_number, FbTk::StringConvertor &conv, 400createMenu_(FbTk::Menu &inject_into, lua::state &l, FbTk::StringConvertor &conv,
401 FbTk::AutoReloadHelper *reloader) { 401 FbTk::AutoReloadHelper *reloader) {
402 402
403 lua::stack_sentry s(l, -1); 403 lua::stack_sentry s(l, -1);
@@ -420,7 +420,7 @@ createMenu_(FbMenu &inject_into, lua::state &l, int screen_number, FbTk::StringC
420} // end of anonymous namespace 420} // end of anonymous namespace
421 421
422void 422void
423MenuCreator::createMenu(FbMenu &inject_into, lua::state &l, int screen_number, FbTk::AutoReloadHelper *reloader) { 423MenuCreator::createMenu(FbTk::Menu &inject_into, lua::state &l, FbTk::AutoReloadHelper *reloader) {
424 lua::stack_sentry s(l, -1); 424 lua::stack_sentry s(l, -1);
425 425
426 if(l.type(-1) != lua::TTABLE) { 426 if(l.type(-1) != lua::TTABLE) {
@@ -436,7 +436,7 @@ MenuCreator::createMenu(FbMenu &inject_into, lua::state &l, int screen_number, F
436 if(!enc.empty()) 436 if(!enc.empty())
437 conv->setSource(enc); 437 conv->setSource(enc);
438 438
439 createMenu_(inject_into, l, screen_number, *conv, reloader); 439 createMenu_(inject_into, l, *conv, reloader);
440} 440}
441 441
442 442
@@ -454,33 +454,18 @@ FbMenu *MenuCreator::createMenu(const string &label, int screen_number) {
454 return menu; 454 return menu;
455} 455}
456 456
457bool MenuCreator::createFromFile(const string &filename, 457void MenuCreator::createFromFile(const string &filename,
458 FbTk::Menu &inject_into, 458 FbTk::Menu &inject_into,
459 AutoReloadHelper *reloader, bool begin) { 459 AutoReloadHelper *reloader) {
460 string real_filename = FbTk::StringUtil::expandFilename(filename); 460 string real_filename = FbTk::StringUtil::expandFilename(filename);
461 461
462 FbMenuParser parser(real_filename); 462 lua::state &l = Fluxbox::instance()->lua();
463 if (!parser.isLoaded()) 463 l.checkstack(1);
464 return false; 464 lua::stack_sentry s(l);
465
466 startFile();
467 if (begin) {
468 string label;
469 if (!getStart(parser, label, s_stringconvertor)) {
470 endFile();
471 return false;
472 }
473 inject_into.setLabel(label);
474 }
475
476 // save menu filename, so we can check if it changes
477 if (reloader)
478 reloader->addFile(real_filename);
479
480 parseMenu(parser, inject_into, s_stringconvertor, reloader);
481 endFile();
482 465
483 return true; 466 l.loadfile(real_filename.c_str());
467 l.call(0, 1);
468 createMenu(inject_into, l, reloader);
484} 469}
485 470
486FbMenu *MenuCreator::createMenuType(const string &type, int screen_num) { 471FbMenu *MenuCreator::createMenuType(const string &type, int screen_num) {
diff --git a/src/MenuCreator.hh b/src/MenuCreator.hh
index 0d13529..60f931d 100644
--- a/src/MenuCreator.hh
+++ b/src/MenuCreator.hh
@@ -42,14 +42,12 @@ class FluxboxWindow;
42 42
43namespace MenuCreator { 43namespace MenuCreator {
44 void 44 void
45 createMenu(FbMenu &inject_into, lua::state &l, int screen_number, 45 createMenu(FbTk::Menu &inject_into, lua::state &l, FbTk::AutoReloadHelper *reloader = NULL);
46 FbTk::AutoReloadHelper *reloader = NULL);
47 FbMenu *createMenu(const std::string &label, int screen_num); 46 FbMenu *createMenu(const std::string &label, int screen_num);
48 FbMenu *createMenuType(const std::string &label, int screen_num); 47 FbMenu *createMenuType(const std::string &label, int screen_num);
49 bool createFromFile(const std::string &filename, 48 void createFromFile(const std::string &filename,
50 FbTk::Menu &inject_into, 49 FbTk::Menu &inject_into,
51 FbTk::AutoReloadHelper *reloader = NULL, 50 FbTk::AutoReloadHelper *reloader = NULL);
52 bool begin = true);
53 bool createWindowMenuItem(const std::string &type, const std::string &label, 51 bool createWindowMenuItem(const std::string &type, const std::string &label,
54 FbTk::Menu &inject_into); 52 FbTk::Menu &inject_into);
55} 53}
diff --git a/src/Screen.cc b/src/Screen.cc
index b953c92..2f83047 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -1402,7 +1402,7 @@ void BScreen::rereadMenu() {
1402 m_rootmenu->removeAll(); 1402 m_rootmenu->removeAll();
1403 l.loadfile(FbTk::StringUtil::expandFilename(fb->getMenuFilename()).c_str()); 1403 l.loadfile(FbTk::StringUtil::expandFilename(fb->getMenuFilename()).c_str());
1404 l.call(0, 1); 1404 l.call(0, 1);
1405 MenuCreator::createMenu(*m_rootmenu, l, screenNumber(), m_rootmenu->reloadHelper()); 1405 MenuCreator::createMenu(*m_rootmenu, l, m_rootmenu->reloadHelper());
1406 1406
1407 if (m_rootmenu->numberOfItems() == 0) { 1407 if (m_rootmenu->numberOfItems() == 0) {
1408 _FB_USES_NLS; 1408 _FB_USES_NLS;
@@ -1438,7 +1438,7 @@ void BScreen::rereadWindowMenu() {
1438 m_windowmenu->removeAll(); 1438 m_windowmenu->removeAll();
1439 l.loadfile(FbTk::StringUtil::expandFilename(windowMenuFilename()).c_str()); 1439 l.loadfile(FbTk::StringUtil::expandFilename(windowMenuFilename()).c_str());
1440 l.call(0, 1); 1440 l.call(0, 1);
1441 MenuCreator::createMenu(*m_windowmenu, l, screenNumber(), m_windowmenu->reloadHelper()); 1441 MenuCreator::createMenu(*m_windowmenu, l, m_windowmenu->reloadHelper());
1442} 1442}
1443 1443
1444void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) { 1444void BScreen::addConfigMenu(const FbTk::FbString &label, FbTk::Menu &menu) {