summaryrefslogtreecommitdiff
path: root/src/helpers/MiscFunctions.cpp
diff options
context:
space:
mode:
authorJS Deck <jsdeckerido@gmail.com>2025-08-04 16:29:39 -0300
committerGitHub <noreply@github.com>2025-08-04 21:29:39 +0200
commit2be309de1df5e4262175fbcc58e6dd8de4e0e6d3 (patch)
tree866629ba5a4b9b45d8720383e4332726444f3566 /src/helpers/MiscFunctions.cpp
parent6491bb4fb7c7e86d9168a104d5b87ace4e1b978d (diff)
virtualkeyboard: Add options to skip releasing pressed keys on close and to skip sharing key states (#11214)
Diffstat (limited to 'src/helpers/MiscFunctions.cpp')
-rw-r--r--src/helpers/MiscFunctions.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index 90383ca5..721855fd 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -876,3 +876,55 @@ bool isNvidiaDriverVersionAtLeast(int threshold) {
return driverMajor >= threshold;
}
+
+std::expected<std::string, std::string> binaryNameForWlClient(wl_client* client) {
+ if (!client)
+ return std::unexpected("client unknown");
+
+ pid_t pid = 0;
+ wl_client_get_credentials(client, &pid, nullptr, nullptr);
+
+ return binaryNameForPid(pid);
+}
+
+std::expected<std::string, std::string> binaryNameForPid(pid_t pid) {
+ if (pid <= 0)
+ return std::unexpected("No pid for client");
+
+#if defined(KERN_PROC_PATHNAME)
+ int mib[] = {
+ CTL_KERN,
+#if defined(__NetBSD__)
+ KERN_PROC_ARGS,
+ pid,
+ KERN_PROC_PATHNAME,
+#else
+ KERN_PROC,
+ KERN_PROC_PATHNAME,
+ pid,
+#endif
+ };
+ u_int miblen = sizeof(mib) / sizeof(mib[0]);
+ char exe[PATH_MAX] = "/nonexistent";
+ size_t sz = sizeof(exe);
+ sysctl(mib, miblen, &exe, &sz, NULL, 0);
+ std::string path = exe;
+#else
+ std::string path = std::format("/proc/{}/exe", (uint64_t)pid);
+#endif
+ std::error_code ec;
+
+ std::string fullPath = std::filesystem::canonical(path, ec);
+
+ if (ec)
+ return std::unexpected("canonical failed");
+
+ return fullPath;
+}
+
+std::string deviceNameToInternalString(std::string in) {
+ std::ranges::replace(in, ' ', '-');
+ std::ranges::replace(in, '\n', '-');
+ std::ranges::transform(in, in.begin(), ::tolower);
+ return in;
+}