From a6ed9498cc0e31b0134ecd47de7d5383a062e535 Mon Sep 17 00:00:00 2001 From: Mathias Gumz <akira at fluxbox dot org> Date: Fri, 10 Sep 2010 16:35:49 +0200 Subject: code cleanup * moved code from public API to internals * avoid code duplication ( while(!m_terms.empty()) ...) * cosmetic '(*it)->' vs 'term.' --- src/ClientPattern.cc | 82 ++++++++++++++++++++++++++++++---------------------- src/ClientPattern.hh | 30 ++++++------------- 2 files changed, 57 insertions(+), 55 deletions(-) diff --git a/src/ClientPattern.cc b/src/ClientPattern.cc index 3305d97..7e7e715 100644 --- a/src/ClientPattern.cc +++ b/src/ClientPattern.cc @@ -32,6 +32,7 @@ #include "FbTk/StringUtil.hh" #include "FbTk/App.hh" #include "FbTk/stringstream.hh" +#include "FbTk/STLUtil.hh" // use GNU extensions #ifndef _GNU_SOURCE @@ -120,6 +121,28 @@ Prop2String property_2_strings[] = { // sorted by 'prop' } // end of anonymous namespace +/** + * This is the type of the actual pattern we want to match against + * We have a "term" in the whole expression which is the full pattern + * we also need to keep track of the uncompiled regular expression + * for final output + */ +struct ClientPattern::Term { + + Term(const FbTk::FbString& _regstr, WinProperty _prop, bool _negate) : + orig(_regstr), + regexp(_regstr, true), + prop(_prop), + negate(_negate) { + + } + + FbTk::FbString orig; + FbTk::RegExp regexp; + WinProperty prop; + bool negate; +}; + ClientPattern::ClientPattern(): m_matchlimit(0), m_nummatches(0) {} @@ -202,8 +225,7 @@ ClientPattern::ClientPattern(const char *str): str+pos, '{', '}'); if (err > 0) { - FbTk_istringstream iss(number.c_str()); - iss >> m_matchlimit; + FbTk::StringUtil::extractNumber(number, m_matchlimit); pos+=err; } // we don't care if there isn't one @@ -219,21 +241,12 @@ ClientPattern::ClientPattern(const char *str): } if (had_error) { - // delete all the terms - while (!m_terms.empty()) { - Term * term = m_terms.back(); - delete term; - m_terms.pop_back(); - } + FbTk::STLUtil::destroyAndClear(m_terms); } } ClientPattern::~ClientPattern() { - // delete all the terms - while (!m_terms.empty()) { - delete m_terms.back(); - m_terms.pop_back(); - } + FbTk::STLUtil::destroyAndClear(m_terms); } // return a string representation of this pattern @@ -268,25 +281,23 @@ bool ClientPattern::match(const Focusable &win) const { Terms::const_iterator it = m_terms.begin(); Terms::const_iterator it_end = m_terms.end(); for (; it != it_end; ++it) { - if ((*it)->orig == "[current]") { + const Term& term = *(*it); + if (term.orig == "[current]") { WinClient *focused = FocusControl::focusedWindow(); - if ((*it)->prop == WORKSPACE) { - if (!(*it)->negate ^ (getProperty((*it)->prop, win) == FbTk::StringUtil::number2String(win.screen().currentWorkspaceID()))) + if (term.prop == WORKSPACE) { + if (!term.negate ^ (getProperty(term.prop, win) == FbTk::StringUtil::number2String(win.screen().currentWorkspaceID()))) return false; - } else if ((*it)->prop == WORKSPACENAME) { + } else if (term.prop == WORKSPACENAME) { const Workspace *w = win.screen().currentWorkspace(); - if (!w || (!(*it)->negate ^ - (getProperty((*it)->prop, win) == w->name()))) + if (!w || (!term.negate ^ (getProperty(term.prop, win) == w->name()))) return false; - } else if (!focused || (!(*it)->negate ^ - (getProperty((*it)->prop, win) == - getProperty((*it)->prop, *focused)))) + } else if (!focused || (!term.negate ^ (getProperty(term.prop, win) == getProperty(term.prop, *focused)))) return false; - } else if ((*it)->prop == HEAD && (*it)->orig == "[mouse]") { - if (!(*it)->negate ^ (getProperty((*it)->prop, win) == FbTk::StringUtil::number2String(win.screen().getCurrHead()))) + } else if (term.prop == HEAD && term.orig == "[mouse]") { + if (!term.negate ^ (getProperty(term.prop, win) == FbTk::StringUtil::number2String(win.screen().getCurrHead()))) return false; - } else if (!(*it)->negate ^ (*it)->regexp.match(getProperty((*it)->prop, win))) + } else if (!term.negate ^ term.regexp.match(getProperty(term.prop, win))) return false; } return true; @@ -315,19 +326,22 @@ bool ClientPattern::dependsOnCurrentWorkspace() const { // add an expression to match against // The first argument is a regular expression, the second is the member // function that we wish to match against. -bool ClientPattern::addTerm(const string &str, WinProperty prop, bool negate) { +bool ClientPattern::addTerm(const FbTk::FbString &str, WinProperty prop, bool negate) { + + bool rc = false; + Term* term = new Term(str, prop, negate); - Term *term = new Term(str, true); - term->orig = str; - term->prop = prop; - term->negate = negate; + if (!term) + return rc; - if (term->regexp.error()) { + if (!term->regexp.error()) { + m_terms.push_back(term); + rc = true; + } else { delete term; - return false; } - m_terms.push_back(term); - return true; + + return rc; } FbTk::FbString ClientPattern::getProperty(WinProperty prop, const Focusable &client) { diff --git a/src/ClientPattern.hh b/src/ClientPattern.hh index 9eb7653..6aa2e11 100644 --- a/src/ClientPattern.hh +++ b/src/ClientPattern.hh @@ -26,6 +26,7 @@ #include "FbTk/RegExp.hh" #include "FbTk/NotCopyable.hh" +#include "FbTk/FbString.hh" #include <list> @@ -48,7 +49,7 @@ public: ~ClientPattern(); /// @return a string representation of this pattern - std::string toString() const; + FbTk::FbString toString() const; enum WinProperty { TITLE = 0, CLASS, NAME, ROLE, TRANSIENT, @@ -71,7 +72,7 @@ public: * @param prop is the member function that we wish to match against * @return false if the regexp wasn't valid */ - bool addTerm(const std::string &str, WinProperty prop, bool negate = false); + bool addTerm(const FbTk::FbString &str, WinProperty prop, bool negate = false); void addMatch() { ++m_nummatches; } void removeMatch() { --m_nummatches; } @@ -86,29 +87,16 @@ public: */ int error() const { return m_terms.empty() ? 1 : 0; } - static std::string getProperty(WinProperty prop, const Focusable &client); + static FbTk::FbString getProperty(WinProperty prop, const Focusable &client); private: - /** - * This is the type of the actual pattern we want to match against - * We have a "term" in the whole expression which is the full pattern - * we also need to keep track of the uncompiled regular expression - * for final output - */ - struct Term { - Term(const std::string ®str, bool full_match) :regexp(regstr, full_match){}; - std::string orig; - FbTk::RegExp regexp; - WinProperty prop; - bool negate; - }; - - + struct Term; + friend struct Term; typedef std::list<Term *> Terms; - Terms m_terms; ///< our pattern is made up of a sequence of terms currently we "and" them all - - int m_matchlimit, m_nummatches; + Terms m_terms; ///< our pattern is made up of a sequence of terms, currently we "and" them all + int m_matchlimit; + int m_nummatches; }; #endif // CLIENTPATTERN_HH -- cgit v0.11.2