diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2015-08-13 10:53:19 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2015-08-13 10:53:19 +0200 |
commit | 9a0cb353b8a19b186fe3c9138e058779cd53bd33 (patch) | |
tree | e8ac0cc42d63045277d5d2bd7af45c5112ec2338 | |
parent | 96841349464fa38e6d0d5f79d66d4012b6ab315c (diff) |
initial broken multi-platform process lister
-rwxr-xr-x[-rw-r--r--] | facetracknoir/process_detector.cpp | 34 | ||||
-rwxr-xr-x[-rw-r--r--] | facetracknoir/process_detector.h | 17 | ||||
-rwxr-xr-x | opentrack-compat/process-list.hpp | 105 |
3 files changed, 106 insertions, 50 deletions
diff --git a/facetracknoir/process_detector.cpp b/facetracknoir/process_detector.cpp index df38eb29..19611241 100644..100755 --- a/facetracknoir/process_detector.cpp +++ b/facetracknoir/process_detector.cpp @@ -8,6 +8,7 @@ #include "process_detector.h" #include "facetracknoir/ui.h" +#include "opentrack-compat/process-list.hpp" #include <QList> #include <QFileDialog> #include <QComboBox> @@ -153,36 +154,6 @@ void process_detector::remove() ui.tableWidget->removeRow(r); } -#ifdef _WIN32 - -#include <windows.h> -#include <TlHelp32.h> - -static QStringList get_all_executable_names() -{ - QStringList ret; - HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (h == INVALID_HANDLE_VALUE) - return ret; - - PROCESSENTRY32 e; - e.dwSize = sizeof(e); - - if (Process32First(h, &e) != TRUE) - { - CloseHandle(h); - return ret; - } - - do { - ret.append(e.szExeFile); - } while (Process32Next(h, &e) == TRUE); - - CloseHandle(h); - - return ret; -} - bool process_detector_worker::should_stop() { if (last_exe_name == "") @@ -237,6 +208,3 @@ bool process_detector_worker::config_to_start(QString& str) return false; } - - -#endif diff --git a/facetracknoir/process_detector.h b/facetracknoir/process_detector.h index 792a941f..f6497c90 100644..100755 --- a/facetracknoir/process_detector.h +++ b/facetracknoir/process_detector.h @@ -74,8 +74,6 @@ public slots: void browse(); }; -#ifdef _WIN32 - class process_detector_worker : QObject { Q_OBJECT @@ -86,18 +84,3 @@ public: bool should_stop(); }; -#else - -class process_detector_worker : QObject -{ - Q_OBJECT -public: - bool config_to_start(QString&) - { - return false; - } - bool should_stop() { return false; } - -}; - -#endif diff --git a/opentrack-compat/process-list.hpp b/opentrack-compat/process-list.hpp new file mode 100755 index 00000000..a00cbb17 --- /dev/null +++ b/opentrack-compat/process-list.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include <QDebug> +#include <QStringList> + +#if defined _WIN32 + +#include <windows.h> +#include <TlHelp32.h> + +template<typename = void> +static QStringList get_all_executable_names() +{ + QStringList ret; + HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (h == INVALID_HANDLE_VALUE) + return ret; + + PROCESSENTRY32 e; + e.dwSize = sizeof(e); + + if (Process32First(h, &e) != TRUE) + { + CloseHandle(h); + return ret; + } + + do { + ret.append(e.szExeFile); + } while (Process32Next(h, &e) == TRUE); + + CloseHandle(h); + + return ret; +} +#elif defined __APPLE__ +#include <libproc.h> +#include <sys/param.h> +#include <cerrno> +#include <vector> + +// link to libproc +template<typename = void> +static QStringList get_all_executable_names() +{ + QStringList ret; + std::vector<int> vec; + + while (true) + { + int numproc = proc_listpids(PROC_ALL_PIDS, 0, nullptr, 0); + if (numproc == -1) + { + qDebug() << "numproc failed" << errno; + break; + } + vec.resize(numproc); + int cnt = proc_listpids(PROC_ALL_PIDS, 0, &vec[0], sizeof(int) * numproc); + if (cnt <= numproc) + { + char name[2 * 2 * MAXCOMLEN + 1]; + for (int i = 0; i < cnt; i++) + { + int ret = proc_name(vec[i], name, sizeof(name)-1); + if (ret <= 0) + continue; + name[ret] = '\0'; + ret.append(name); + } + return ret; + } + } +} + +#elif defined __linux + +// link to procps +#include <proc/readproc.h> +#include <cerrno> +template<typename = void> +static QStringList get_all_executable_names() +{ + QStringList ret; + proc_t** procs = readproctab(PROC_FILLCOM); + if (procs == nullptr) + { + qDebug() << "readproctab" << errno; + return ret; + } + for (int i = 0; procs[i]; i++) + { + auto& proc = *procs[i]; + ret.append(proc.cmd); + } + freeproctab(procs); + return ret; +} + +#else +template<typename = void> +static QStringList get_all_executable_names() +{ + return QStringList(); +} +#endif |