diff options
Diffstat (limited to 'src/Remember.cc')
-rw-r--r-- | src/Remember.cc | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/src/Remember.cc b/src/Remember.cc index 31b416a..2de6d86 100644 --- a/src/Remember.cc +++ b/src/Remember.cc | |||
@@ -76,6 +76,18 @@ using std::dec; | |||
76 | 76 | ||
77 | namespace { | 77 | namespace { |
78 | 78 | ||
79 | // replace special chars like ( ) and [ ] with \( \) and \[ \] | ||
80 | static string escapeRememberChars(string str) { | ||
81 | if (str.empty()) | ||
82 | return str; | ||
83 | |||
84 | str = FbTk::StringUtil::replaceString(str, "(", "\\("); | ||
85 | str = FbTk::StringUtil::replaceString(str, ")", "\\)"); | ||
86 | str = FbTk::StringUtil::replaceString(str, "[", "\\["); | ||
87 | str = FbTk::StringUtil::replaceString(str, "]", "\\]"); | ||
88 | return str; | ||
89 | } | ||
90 | |||
79 | bool getuint(const char *val, unsigned int &ret) { | 91 | bool getuint(const char *val, unsigned int &ret) { |
80 | return (sscanf(val, "%u", &ret) == 1); | 92 | return (sscanf(val, "%u", &ret) == 1); |
81 | } | 93 | } |
@@ -319,22 +331,14 @@ Application * Remember::add(WinClient &winclient) { | |||
319 | Application *app = new Application(0); | 331 | Application *app = new Application(0); |
320 | 332 | ||
321 | // by default, we match against the WMClass of a window (instance and class strings) | 333 | // by default, we match against the WMClass of a window (instance and class strings) |
322 | string win_name = p->getProperty(ClientPattern::NAME, winclient); | 334 | string win_name = ::escapeRememberChars(p->getProperty(ClientPattern::NAME, winclient)); |
323 | string win_class = p->getProperty(ClientPattern::CLASS, winclient); | 335 | string win_class = ::escapeRememberChars(p->getProperty(ClientPattern::CLASS, winclient)); |
324 | 336 | string win_role = ::escapeRememberChars(p->getProperty(ClientPattern::ROLE, winclient)); | |
325 | // replace special chars like ( ) and [ ] with \( \) and \[ \] | ||
326 | win_name = FbTk::StringUtil::replaceString(win_name, "(", "\\("); | ||
327 | win_name = FbTk::StringUtil::replaceString(win_name, ")", "\\)"); | ||
328 | win_name = FbTk::StringUtil::replaceString(win_name, "[", "\\["); | ||
329 | win_name = FbTk::StringUtil::replaceString(win_name, "]", "\\]"); | ||
330 | |||
331 | win_class = FbTk::StringUtil::replaceString(win_class, "(", "\\("); | ||
332 | win_class = FbTk::StringUtil::replaceString(win_class, ")", "\\)"); | ||
333 | win_class = FbTk::StringUtil::replaceString(win_class, "[", "\\["); | ||
334 | win_class = FbTk::StringUtil::replaceString(win_class, "]", "\\]"); | ||
335 | 337 | ||
336 | p->addTerm(win_name, ClientPattern::NAME); | 338 | p->addTerm(win_name, ClientPattern::NAME); |
337 | p->addTerm(win_class, ClientPattern::CLASS); | 339 | p->addTerm(win_class, ClientPattern::CLASS); |
340 | if (!win_role.empty()) | ||
341 | p->addTerm(win_role, ClientPattern::ROLE); | ||
338 | m_clients[&winclient] = app; | 342 | m_clients[&winclient] = app; |
339 | p->addMatch(); | 343 | p->addMatch(); |
340 | m_pats->push_back(make_pair(p, app)); | 344 | m_pats->push_back(make_pair(p, app)); |