diff options
-rw-r--r-- | src/FbCommandFactory.cc | 52 | ||||
-rw-r--r-- | src/FbTk/MacroCommand.cc | 18 | ||||
-rw-r--r-- | src/FbTk/MacroCommand.hh | 13 |
3 files changed, 77 insertions, 6 deletions
diff --git a/src/FbCommandFactory.cc b/src/FbCommandFactory.cc index 50f0fef..4e129af 100644 --- a/src/FbCommandFactory.cc +++ b/src/FbCommandFactory.cc | |||
@@ -136,6 +136,7 @@ FbCommandFactory::FbCommandFactory() { | |||
136 | "taketoworkspace", | 136 | "taketoworkspace", |
137 | "taketonextworkspace", | 137 | "taketonextworkspace", |
138 | "taketoprevworkspace", | 138 | "taketoprevworkspace", |
139 | "togglecmd", | ||
139 | "toggledecor", | 140 | "toggledecor", |
140 | "windowmenu", | 141 | "windowmenu", |
141 | "workspace", | 142 | "workspace", |
@@ -449,12 +450,15 @@ FbTk::Command *FbCommandFactory::stringToCommand(const std::string &command, | |||
449 | 450 | ||
450 | while (true) { | 451 | while (true) { |
451 | parse_pos+= err; | 452 | parse_pos+= err; |
452 | err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + parse_pos, | 453 | err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + |
453 | '{', '}', " \t\n", true); | 454 | parse_pos, |
455 | '{', '}', " \t\n", true); | ||
454 | if ( err > 0 ) { | 456 | if ( err > 0 ) { |
455 | std::string c, a; | 457 | std::string c, a; |
456 | std::string::size_type first_pos = FbTk::StringUtil::removeFirstWhitespace(cmd); | 458 | std::string::size_type first_pos = |
457 | std::string::size_type second_pos= cmd.find_first_of(" \t", first_pos); | 459 | FbTk::StringUtil::removeFirstWhitespace(cmd); |
460 | std::string::size_type second_pos = | ||
461 | cmd.find_first_of(" \t", first_pos); | ||
458 | if (second_pos != std::string::npos) { | 462 | if (second_pos != std::string::npos) { |
459 | a= cmd.substr(second_pos); | 463 | a= cmd.substr(second_pos); |
460 | FbTk::StringUtil::removeFirstWhitespace(a); | 464 | FbTk::StringUtil::removeFirstWhitespace(a); |
@@ -467,8 +471,44 @@ FbTk::Command *FbCommandFactory::stringToCommand(const std::string &command, | |||
467 | FbTk::RefCount<FbTk::Command> rfbcmd(fbcmd); | 471 | FbTk::RefCount<FbTk::Command> rfbcmd(fbcmd); |
468 | macro->add(rfbcmd); | 472 | macro->add(rfbcmd); |
469 | } | 473 | } |
470 | } | 474 | } else |
471 | else | 475 | break; |
476 | } | ||
477 | |||
478 | if ( macro->size() > 0 ) | ||
479 | return macro; | ||
480 | |||
481 | delete macro; | ||
482 | } else if (command == "togglecmd") { | ||
483 | std::string cmd; | ||
484 | int err= 0; | ||
485 | int parse_pos= 0; | ||
486 | FbTk::ToggleCommand* macro= new FbTk::ToggleCommand(); | ||
487 | |||
488 | while (true) { | ||
489 | parse_pos+= err; | ||
490 | err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + | ||
491 | parse_pos, | ||
492 | '{', '}', " \t\n", true); | ||
493 | if ( err > 0 ) { | ||
494 | std::string c, a; | ||
495 | std::string::size_type first_pos = | ||
496 | FbTk::StringUtil::removeFirstWhitespace(cmd); | ||
497 | std::string::size_type second_pos= | ||
498 | cmd.find_first_of(" \t", first_pos); | ||
499 | if (second_pos != std::string::npos) { | ||
500 | a= cmd.substr(second_pos); | ||
501 | FbTk::StringUtil::removeFirstWhitespace(a); | ||
502 | cmd.erase(second_pos); | ||
503 | } | ||
504 | c= FbTk::StringUtil::toLower(cmd); | ||
505 | |||
506 | FbTk::Command* fbcmd= stringToCommand(c,a); | ||
507 | if (fbcmd) { | ||
508 | FbTk::RefCount<FbTk::Command> rfbcmd(fbcmd); | ||
509 | macro->add(rfbcmd); | ||
510 | } | ||
511 | } else | ||
472 | break; | 512 | break; |
473 | } | 513 | } |
474 | 514 | ||
diff --git a/src/FbTk/MacroCommand.cc b/src/FbTk/MacroCommand.cc index adee9cb..491b01e 100644 --- a/src/FbTk/MacroCommand.cc +++ b/src/FbTk/MacroCommand.cc | |||
@@ -38,6 +38,24 @@ void MacroCommand::execute() { | |||
38 | m_commandlist[i]->execute(); | 38 | m_commandlist[i]->execute(); |
39 | } | 39 | } |
40 | 40 | ||
41 | ToggleCommand::ToggleCommand() { | ||
42 | m_state = 0; | ||
43 | } | ||
44 | |||
45 | void ToggleCommand::add(RefCount<Command> &com) { | ||
46 | m_commandlist.push_back(com); | ||
47 | } | ||
48 | |||
49 | size_t ToggleCommand::size() const { | ||
50 | return m_commandlist.size(); | ||
51 | } | ||
52 | |||
53 | void ToggleCommand::execute() { | ||
54 | m_commandlist[m_state]->execute(); | ||
55 | if (++m_state >= m_commandlist.size()) | ||
56 | m_state = 0; | ||
57 | } | ||
58 | |||
41 | }; // end namespace FbTk | 59 | }; // end namespace FbTk |
42 | 60 | ||
43 | 61 | ||
diff --git a/src/FbTk/MacroCommand.hh b/src/FbTk/MacroCommand.hh index f29e05c..7aa9d66 100644 --- a/src/FbTk/MacroCommand.hh +++ b/src/FbTk/MacroCommand.hh | |||
@@ -42,6 +42,19 @@ private: | |||
42 | std::vector<RefCount<Command> > m_commandlist; | 42 | std::vector<RefCount<Command> > m_commandlist; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | /// executes one command at a time | ||
46 | class ToggleCommand:public Command { | ||
47 | public: | ||
48 | ToggleCommand(); | ||
49 | void add(RefCount<Command> &com); | ||
50 | size_t size() const; | ||
51 | virtual void execute(); | ||
52 | |||
53 | private: | ||
54 | std::vector<RefCount<Command> > m_commandlist; | ||
55 | size_t m_state; | ||
56 | }; | ||
57 | |||
45 | } // end namespace FbTk | 58 | } // end namespace FbTk |
46 | 59 | ||
47 | #endif // FBTK_MACROCOMMAND_HH | 60 | #endif // FBTK_MACROCOMMAND_HH |