all repos — fluxbox @ d218f02f80395bdfa34fcac3b8147d0be5e6b420

custom fork of the fluxbox windowmanager

added new command: ToggleCmd, works like a macro but executes the commands one at the time. Thanks Mark Tiefenbruck
fluxgen fluxgen
commit

d218f02f80395bdfa34fcac3b8147d0be5e6b420

parent

928aa33dfe88df7c071109a9ad5adfa8bc972811

3 files changed, 77 insertions(+), 6 deletions(-)

jump to
M src/FbCommandFactory.ccsrc/FbCommandFactory.cc

@@ -136,6 +136,7 @@ "tab",

"taketoworkspace", "taketonextworkspace", "taketoprevworkspace", + "togglecmd", "toggledecor", "windowmenu", "workspace",

@@ -449,12 +450,52 @@ FbTk::MacroCommand* macro= new FbTk::MacroCommand();

while (true) { parse_pos+= err; - err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + parse_pos, - '{', '}', " \t\n", true); + err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + + parse_pos, + '{', '}', " \t\n", true); + if ( err > 0 ) { + std::string c, a; + std::string::size_type first_pos = + FbTk::StringUtil::removeFirstWhitespace(cmd); + std::string::size_type second_pos = + cmd.find_first_of(" \t", first_pos); + if (second_pos != std::string::npos) { + a= cmd.substr(second_pos); + FbTk::StringUtil::removeFirstWhitespace(a); + cmd.erase(second_pos); + } + c= FbTk::StringUtil::toLower(cmd); + + FbTk::Command* fbcmd= stringToCommand(c,a); + if (fbcmd) { + FbTk::RefCount<FbTk::Command> rfbcmd(fbcmd); + macro->add(rfbcmd); + } + } else + break; + } + + if ( macro->size() > 0 ) + return macro; + + delete macro; + } else if (command == "togglecmd") { + std::string cmd; + int err= 0; + int parse_pos= 0; + FbTk::ToggleCommand* macro= new FbTk::ToggleCommand(); + + while (true) { + parse_pos+= err; + err= FbTk::StringUtil::getStringBetween(cmd, arguments.c_str() + + parse_pos, + '{', '}', " \t\n", true); if ( err > 0 ) { std::string c, a; - std::string::size_type first_pos = FbTk::StringUtil::removeFirstWhitespace(cmd); - std::string::size_type second_pos= cmd.find_first_of(" \t", first_pos); + std::string::size_type first_pos = + FbTk::StringUtil::removeFirstWhitespace(cmd); + std::string::size_type second_pos= + cmd.find_first_of(" \t", first_pos); if (second_pos != std::string::npos) { a= cmd.substr(second_pos); FbTk::StringUtil::removeFirstWhitespace(a);

@@ -467,8 +508,7 @@ if (fbcmd) {

FbTk::RefCount<FbTk::Command> rfbcmd(fbcmd); macro->add(rfbcmd); } - } - else + } else break; }
M src/FbTk/MacroCommand.ccsrc/FbTk/MacroCommand.cc

@@ -38,6 +38,24 @@ for (size_t i=0; i < m_commandlist.size(); ++i)

m_commandlist[i]->execute(); } +ToggleCommand::ToggleCommand() { + m_state = 0; +} + +void ToggleCommand::add(RefCount<Command> &com) { + m_commandlist.push_back(com); +} + +size_t ToggleCommand::size() const { + return m_commandlist.size(); +} + +void ToggleCommand::execute() { + m_commandlist[m_state]->execute(); + if (++m_state >= m_commandlist.size()) + m_state = 0; +} + }; // end namespace FbTk
M src/FbTk/MacroCommand.hhsrc/FbTk/MacroCommand.hh

@@ -42,6 +42,19 @@ private:

std::vector<RefCount<Command> > m_commandlist; }; +/// executes one command at a time +class ToggleCommand:public Command { +public: + ToggleCommand(); + void add(RefCount<Command> &com); + size_t size() const; + virtual void execute(); + +private: + std::vector<RefCount<Command> > m_commandlist; + size_t m_state; +}; + } // end namespace FbTk #endif // FBTK_MACROCOMMAND_HH