From effce4ca9e9e0bdab2ed70ca1278cf9215df6f33 Mon Sep 17 00:00:00 2001 From: John Schember Date: Fri, 30 Aug 2024 08:37:29 -0400 Subject: [PATCH] Expand scanner search into proper classes with variable isolation. --- src/scanner.cpp | 25 ++++++++++++++----------- src/scannersearch.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/scannersearch.h | 26 +++++++++++++++++++------- src/xlibutil.cpp | 8 ++++++-- 4 files changed, 74 insertions(+), 24 deletions(-) diff --git a/src/scanner.cpp b/src/scanner.cpp index 9803bac..97c355a 100644 --- a/src/scanner.cpp +++ b/src/scanner.cpp @@ -44,7 +44,7 @@ void Scanner::enqueueSearch(const QRegularExpression &searchPattern, quint32 max if (maxTime == 0) maxTime = 1; - m_searchTitle.append(ScannerSearchTitle(searchPattern, config, maxTime * 1000, checkNormality)); + m_searchTitle.append(ScannerSearchTitle(searchPattern, config, maxTime, checkNormality)); m_timer.start(); } @@ -68,10 +68,10 @@ void Scanner::enqueueLaunch(const QString &launchCommand, const QStringList &arg } if (!searchPattern.pattern().isEmpty()) { - m_searchTitle.append(ScannerSearchTitle(searchPattern, config, maxTime * 1000, checkNormality)); + m_searchTitle.append(ScannerSearchTitle(searchPattern, config, maxTime, checkNormality)); } else { m_searchPid.append( - ScannerSearchPid(launchCommand, static_cast(pid), config, maxTime * 1000, checkNormality)); + ScannerSearchPid(launchCommand, static_cast(pid), config, maxTime, checkNormality)); } m_timer.start(); } @@ -86,13 +86,14 @@ void Scanner::checkPid() // Counting backwards because we can remove items from the list for (size_t i = m_searchPid.count(); i-- > 0;) { ScannerSearchPid &search = m_searchPid[i]; - windowid_t window = XLibUtil::pidToWid(search.checkNormality, search.pid); + + windowid_t window = XLibUtil::pidToWid(search.checkNormality(), search.pid()); if (window != 0) { - emit windowFound(window, search.config); + emit windowFound(window, search.config()); m_searchPid.remove(i); - } else if (search.etimer.hasExpired(search.timeout)) { + } else if (search.hasExpired()) { QMessageBox box; - box.setText(tr("Could not find a window for '%1'").arg(search.launchCommand)); + box.setText(tr("Could not find a window for '%1'").arg(search.launchCommand())); box.setWindowIcon(QPixmap(":/logo/kdocker.png")); box.setIcon(QMessageBox::Information); box.setStandardButtons(QMessageBox::Ok); @@ -108,14 +109,16 @@ void Scanner::checkTitle() // Counting backwards because we can remove items from the list for (size_t i = m_searchTitle.count(); i-- > 0;) { ScannerSearchTitle &search = m_searchTitle[i]; + const QRegularExpression searchPattern = search.searchPattern(); + windowid_t window = - XLibUtil::findWindow(search.checkNormality, search.searchPattern, m_manager->dockedWindows()); + XLibUtil::findWindow(search.checkNormality(), searchPattern, m_manager->dockedWindows()); if (window != 0) { - emit windowFound(window, search.config); + emit windowFound(window, search.config()); m_searchTitle.remove(i); - } else if (search.etimer.hasExpired(search.timeout)) { + } else if (search.hasExpired()) { QMessageBox box; - box.setText(tr("Could not find a window matching '%1'").arg(search.searchPattern.pattern())); + box.setText(tr("Could not find a window matching '%1'").arg(searchPattern.pattern())); box.setWindowIcon(QPixmap(":/logo/kdocker.png")); box.setIcon(QMessageBox::Information); box.setStandardButtons(QMessageBox::Ok); diff --git a/src/scannersearch.cpp b/src/scannersearch.cpp index 0243a86..183c52c 100644 --- a/src/scannersearch.cpp +++ b/src/scannersearch.cpp @@ -20,17 +20,48 @@ #include "scannersearch.h" ScannerSearch::ScannerSearch(const TrayItemOptions &config, uint64_t timeout, bool checkNormality) - : config(config), timeout(timeout), checkNormality(checkNormality) + : m_config(config), m_checkNormality(checkNormality) { - etimer.start(); + m_timeout = timeout * 1000; + m_etimer.start(); +} + +const TrayItemOptions &ScannerSearch::config() +{ + return m_config; +} + +bool ScannerSearch::checkNormality() +{ + return m_checkNormality; +} + +bool ScannerSearch::hasExpired() +{ + return m_etimer.hasExpired(m_timeout); } ScannerSearchPid::ScannerSearchPid(const QString &launchCommand, pid_t pid, const TrayItemOptions &config, uint64_t timeout, bool checkNormality) - : ScannerSearch(config, timeout, checkNormality), launchCommand(launchCommand), pid(pid) + : ScannerSearch(config, timeout, checkNormality), m_launchCommand(launchCommand), m_pid(pid) {} +const QString ScannerSearchPid::launchCommand() +{ + return m_launchCommand; +} + +pid_t ScannerSearchPid::pid() +{ + return m_pid; +} + ScannerSearchTitle::ScannerSearchTitle(const QRegularExpression &searchPattern, const TrayItemOptions &config, uint64_t timeout, bool checkNormality) - : ScannerSearch(config, timeout, checkNormality), searchPattern(searchPattern) + : ScannerSearch(config, timeout, checkNormality), m_searchPattern(searchPattern) {} + +const QRegularExpression &ScannerSearchTitle::searchPattern() +{ + return m_searchPattern; +} diff --git a/src/scannersearch.h b/src/scannersearch.h index 891ee2a..c2e2085 100644 --- a/src/scannersearch.h +++ b/src/scannersearch.h @@ -32,11 +32,16 @@ class ScannerSearch public: ScannerSearch(const TrayItemOptions &config, uint64_t timeout, bool checkNormality); - TrayItemOptions config; - bool checkNormality; + const TrayItemOptions &config(); + bool checkNormality(); + bool hasExpired(); - QElapsedTimer etimer; - uint64_t timeout; +private: + TrayItemOptions m_config; + bool m_checkNormality; + + QElapsedTimer m_etimer; + uint64_t m_timeout; }; class ScannerSearchPid : public ScannerSearch @@ -45,8 +50,12 @@ class ScannerSearchPid : public ScannerSearch ScannerSearchPid(const QString &launchCommand, pid_t pid, const TrayItemOptions &config, uint64_t timeout, bool checkNormality); - QString launchCommand; - pid_t pid; + const QString launchCommand(); + pid_t pid(); + +private: + QString m_launchCommand; + pid_t m_pid; }; class ScannerSearchTitle : public ScannerSearch @@ -55,7 +64,10 @@ class ScannerSearchTitle : public ScannerSearch ScannerSearchTitle(const QRegularExpression &searchPattern, const TrayItemOptions &config, uint64_t timeout, bool checkNormality); - QRegularExpression searchPattern; + const QRegularExpression &searchPattern(); + +private: + QRegularExpression m_searchPattern; }; #endif // _SCANNERSEARCH_H diff --git a/src/xlibutil.cpp b/src/xlibutil.cpp index 5a7f1df..6da6c10 100644 --- a/src/xlibutil.cpp +++ b/src/xlibutil.cpp @@ -232,6 +232,8 @@ windowid_t XLibUtil::pidToWid(bool checkNormality, pid_t epid) return pidToWidEx(getDisplay(), getDefaultRootWindow(), checkNormality, epid); } +#include +#include // Checks if window window has matching name static bool analyzeWindow(Display *display, windowid_t window, const QRegularExpression &ename) { @@ -249,10 +251,11 @@ static bool analyzeWindow(Display *display, windowid_t window, const QRegularExp // lets try the program name bool this_is_our_man = false; XClassHint ch; + memset(&ch, 0, sizeof(ch)); if (XGetClassHint(display, window, &ch)) { - if (QString(ch.res_name).contains(ename)) { + if (ch.res_name && QString(ch.res_name).contains(ename)) { this_is_our_man = true; - } else if (QString(ch.res_class).contains(ename)) { + } else if (ch.res_class && QString(ch.res_class).contains(ename)) { this_is_our_man = true; } else { // sheer desperation @@ -756,6 +759,7 @@ QPixmap XLibUtil::getWindowIcon(windowid_t window) QString XLibUtil::getAppName(windowid_t window) { XClassHint ch; + memset(&ch, 0, sizeof(ch)); QString name; if (XGetClassHint(getDisplay(), window, &ch)) {