Skip to content

Commit

Permalink
Expand scanner search into proper classes with variable isolation.
Browse files Browse the repository at this point in the history
  • Loading branch information
user-none committed Aug 30, 2024
1 parent 376921c commit effce4c
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 24 deletions.
25 changes: 14 additions & 11 deletions src/scanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand All @@ -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_t>(pid), config, maxTime * 1000, checkNormality));
ScannerSearchPid(launchCommand, static_cast<pid_t>(pid), config, maxTime, checkNormality));
}
m_timer.start();
}
Expand All @@ -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);
Expand All @@ -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);
Expand Down
39 changes: 35 additions & 4 deletions src/scannersearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
26 changes: 19 additions & 7 deletions src/scannersearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
8 changes: 6 additions & 2 deletions src/xlibutil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,8 @@ windowid_t XLibUtil::pidToWid(bool checkNormality, pid_t epid)
return pidToWidEx(getDisplay(), getDefaultRootWindow(), checkNormality, epid);
}

#include <stdio.h>
#include <strings.h>
// Checks if window window has matching name
static bool analyzeWindow(Display *display, windowid_t window, const QRegularExpression &ename)
{
Expand All @@ -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
Expand Down Expand Up @@ -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)) {
Expand Down

0 comments on commit effce4c

Please sign in to comment.