all repos — fluxbox @ b8987fc6238a747285b3aeac6f3b206a74e0d36a

custom fork of the fluxbox windowmanager

code simplification / deduplication

* parse the string only once for a bunch of chars to check instead of
  starting over again and again from the beginning, created a helper
  function to do this (FbTk::StringUtil::findCharFromAlphabetAfterTrigger)

* put same code into a function (setClockModeLabel())

* use much simpler code to switch between 12h and 24h mode and replace
  the fmt-switches
Mathias Gumz akira at fluxbox dot org
commit

b8987fc6238a747285b3aeac6f3b206a74e0d36a

parent

874eb67297cd63999730d1e779ff00581dcbb89d

4 files changed, 67 insertions(+), 54 deletions(-)

jump to
M ChangeLogChangeLog

@@ -1,6 +1,9 @@

(Format: Year/Month/Day) Changes for 1.1.2 +*10/08/24: + * Code deduplication and simplification (Mathias) + Clocktool.cc FbTk/StringUtil.hh *10/08/20: * Added new action 'ActivateTab' (Mathias) Window.{cc,hh} Keys.cc fluxbox.cc CurrentWindowCmd.cc
M src/ClockTool.ccsrc/ClockTool.cc

@@ -50,6 +50,11 @@

namespace { +static const char SWITCHES_SECONDS[] = "crsSTX+"; +static const char SWITCHES_12_24H[] = "lIrkHT"; +static const char SWITCHES_24_12H[] = "kHTlIr"; +static const char SWITCH_AM_PM[] = "pP"; + /** * return true if clock shows seconds. If clock doesn't show seconds then * there is no need to wake up every second to redraw the clock.

@@ -57,14 +62,10 @@ */

int showSeconds(const std::string& fmt_string) { - return fmt_string.find("%c") != std::string::npos - || fmt_string.find("%r") != std::string::npos - || fmt_string.find("%s") != std::string::npos - || fmt_string.find("%S") != std::string::npos - || fmt_string.find("%T") != std::string::npos - || fmt_string.find("%X") != std::string::npos - || fmt_string.find("%+") != std::string::npos; + return FbTk::StringUtil::findCharFromAlphabetAfterTrigger( + fmt_string, '%', SWITCHES_SECONDS, sizeof(SWITCHES_SECONDS), 0) != std::string::npos; } + timeval calcNextTimeout(const std::string& fmt_string) { timeval now;

@@ -93,69 +94,48 @@ class ClockMenuItem: public FbTk::MenuItem {

public: explicit ClockMenuItem(ClockTool &tool): FbTk::MenuItem(""), m_tool(tool) { - // determine 12/24 hour format - _FB_USES_NLS; - if (m_tool.timeFormat().find("%k") != std::string::npos || - m_tool.timeFormat().find("%H") != std::string::npos || - m_tool.timeFormat().find("%T") != std::string::npos) - setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); - else - setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); + + setClockModeLabel(); setCloseOnClick(false); } void click(int button, int time, unsigned int mods) { - std::string newformat = m_tool.timeFormat(); - size_t pos = newformat.find("%k"); - std::string newstr; - bool clock24hour = true; - _FB_USES_NLS; - - if (pos != std::string::npos) - newstr = "%l"; - else if ((pos = newformat.find("%H")) != std::string::npos) - newstr = "%I"; - else if ((pos = newformat.find("%T")) != std::string::npos) - newstr = "%r"; - - // 12 hour - if (newstr.empty()) { - clock24hour = false; - if ((pos = newformat.find("%l")) != std::string::npos) - newstr = "%k"; - else if ((pos = newformat.find("%I")) != std::string::npos) - newstr = "%H"; - else if ((pos = newformat.find("%r")) != std::string::npos) - newstr = "%T"; + // does the current format string contain something with 24/12h? + size_t found; + size_t pos = FbTk::StringUtil::findCharFromAlphabetAfterTrigger( + m_tool.timeFormat(), '%', SWITCHES_24_12H, sizeof(SWITCHES_24_12H), &found); - } - - if (!newstr.empty()) { + if (pos != std::string::npos) { // if so, exchange it with 12/24h + std::string newformat = m_tool.timeFormat(); + newformat[pos+1] = SWITCHES_12_24H[found]; - newformat.replace(pos, 2, newstr); - if (!clock24hour) { // erase %P/%p (AM|PM / am|pm) - pos = newformat.find("%p"); - if (pos != std::string::npos) - newformat.erase(pos, 2); - else if ((pos = newformat.find("%P")) != std::string::npos) + if (found < 3) { // 24h? erase %P/%p (AM|PM / am|pm) + pos = FbTk::StringUtil::findCharFromAlphabetAfterTrigger( + newformat, '%', SWITCH_AM_PM, sizeof(SWITCH_AM_PM), 0); + if (pos != std::string::npos) { newformat.erase(pos, 2); + } } - m_tool.setTimeFormat(newformat); - - if (m_tool.timeFormat().find("%k") != std::string::npos || - m_tool.timeFormat().find("%H") != std::string::npos || - m_tool.timeFormat().find("%T") != std::string::npos) - setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); - else - setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); + setClockModeLabel(); } // else some other strange format...so we don't do anything FbTk::MenuItem::click(button, time, mods); } private: + + void setClockModeLabel() { + _FB_USES_NLS; + if (FbTk::StringUtil::findCharFromAlphabetAfterTrigger( + m_tool.timeFormat(), '%', SWITCHES_24_12H, 3, 0) != std::string::npos) { + setLabel( _FB_XTEXT(Toolbar, Clock24, "Clock: 24h", "set Clockmode to 24h") ); + } else { + setLabel( _FB_XTEXT(Toolbar, Clock12, "Clock: 12h", "set Clockmode to 12h") ); + } + } + ClockTool &m_tool; };
M src/FbTk/StringUtil.ccsrc/FbTk/StringUtil.cc

@@ -164,6 +164,24 @@ // return from last . to end of string

return filename.substr(start_pos + 1); } +string::size_type findCharFromAlphabetAfterTrigger(const std::string& in, char trigger, const char alphabet[], size_t len_alphabet, size_t* found) { + for (const char* s = in.c_str(); *s != '\0'; ) { + if (*s++ == trigger && *s != '\0') { + for (const char* a = alphabet; (a - alphabet) < len_alphabet; ++a) { + if (*s == *a) { + if (found) { + *found = a - alphabet; + } + return s - in.c_str() - 1; + } + } + s++; + } + } + return string::npos; +} + + string replaceString(const string &original, const char *findthis, const char *replace) {
M src/FbTk/StringUtil.hhsrc/FbTk/StringUtil.hh

@@ -50,6 +50,18 @@

/// @return extension of filename (ex: filename.txt will return txt) std::string findExtension(const std::string &filename); +/// is the char after a 'trigger' part of an alphabet? +/// @param in - string to analyze +/// @param trigger - check for char after trigger +/// @param alphabet - contains chars to search for +/// @param len_alphabet - length of alphabet +/// @param found - position of found char in alphabet (optional) +/// @return position of trigger if found +/// @return std::string::npos if nothing found +std::string::size_type findCharFromAlphabetAfterTrigger(const std::string& in, + char trigger, + const char alphabet[], size_t len_alphabet, size_t* found); + /// @return copy of original with find_string replaced with "replace" std::string replaceString(const std::string &original, const char *find_string,