diff options
author | Alyssa Ross <hi@alyssa.is> | 2024-03-01 11:40:12 +0100 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2024-03-01 11:40:12 +0100 |
commit | bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86 (patch) | |
tree | 8eb035cbab19794f6415cc460fac7226f7a58afc /nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch | |
parent | 66f707d69f1e423db5a35c2fe43b32781125a9af (diff) | |
parent | 09c1497ce5d4ed4a0edfdd44450d3048074cb300 (diff) | |
download | nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar.gz nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar.bz2 nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar.lz nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar.xz nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.tar.zst nixlib-bf6d657e5dbcb5e39fda280ef7e86b2a7794ca86.zip |
Merge branch 'nixos-unstable-small' of https://github.com/NixOS/nixpkgs
Diffstat (limited to 'nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch')
-rw-r--r-- | nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch b/nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch new file mode 100644 index 000000000000..896c5dcff20b --- /dev/null +++ b/nixpkgs/pkgs/kde/plasma/kwin/0001-NixOS-Unwrap-executable-name-for-.desktop-search.patch @@ -0,0 +1,114 @@ +From 29ec6fada935ef966e5859082435ed57daa9522d Mon Sep 17 00:00:00 2001 +From: Samuel Dionne-Riel <samuel@dionne-riel.com> +Date: Tue, 16 Mar 2021 15:03:59 -0400 +Subject: [PATCH] [NixOS] Unwrap executable name for .desktop search + +Why is this necessary even though -a "$0" is used in the wrapper? +Because it's completely bypassing argv0! This looks at the executable +file in-use according to the kernel! + +Wrappers cannot affect the `/proc/.../exe` symlink! + +Co-authored-by: Yaroslav Bolyukin <iam@lach.pw> +--- + src/nixos_utils.h | 41 +++++++++++++++++++++++++++++++++++++++++ + src/service_utils.h | 4 +++- + src/waylandwindow.cpp | 5 ++++- + 3 files changed, 48 insertions(+), 2 deletions(-) + create mode 100644 src/nixos_utils.h + +diff --git a/src/nixos_utils.h b/src/nixos_utils.h +new file mode 100644 +index 0000000..726065d +--- /dev/null ++++ b/src/nixos_utils.h +@@ -0,0 +1,41 @@ ++#ifndef NIXOS_UTILS_H ++#define NIXOS_UTILS_H ++ ++// kwin ++// #include <kwinglobals.h> ++ ++namespace KWin ++{ ++ ++static QString unwrapExecutablePath(const QString &in_executablePath) ++{ ++ // NixOS fixes many packaging issues through "wrapper" scripts that manipulates the environment or does ++ // miscellaneous trickeries and mischievous things to make the programs work. ++ // In turn, programs often employs different mischievous schemes and trickeries to do *other things. ++ // It often happens that they conflict. ++ // Here, `kwin` tries to detect the .desktop file for a given process. ++ // `kwin` followed the process `/proc/.../exe` up to the actual binary running. ++ // It normally would be fine, e.g. /usr/bin/foobar is what's in the desktop file. ++ // But it's not the truth here! It's extremely likely the resolved path is /nix/store/.../bin/.foobar-wrapped ++ // rather than what the desktop file points to, something like /nix/store/.../bin/foobar !! ++ // Since the wrappers for Nixpkgs *always* prepend a dot and append -wrapped, we assume here that we can keep ++ // `/^(.*)\/\.([^/]*)-wrapped/` until the (equivalent) regex does not match. ++ // This should canonicalize the wrapper name to the expected name to look for in the desktop file. ++ ++ // Use a copy of the const string ++ QString executablePath(in_executablePath); ++ ++ // While the parts needed are present, "unwrap" one layer of wrapper names. ++ while (executablePath.endsWith("-wrapped") && executablePath[executablePath.lastIndexOf("/")+1] == QChar('.')) { ++ // Approximately equivalent to s/-wrapped$// ++ executablePath.remove(executablePath.length() - 8, 8); ++ // Approximately equivalent to s;/\.;/; ++ executablePath.remove(executablePath.lastIndexOf("/")+1, 1); ++ } ++ ++ return executablePath; ++} ++ ++}// namespace ++ ++#endif // NIXOS_UTILS_H +diff --git a/src/utils/serviceutils.h b/src/utils/serviceutils.h +index 8a70c1f..475b15d 100644 +--- a/src/utils/serviceutils.h ++++ b/src/utils/serviceutils.h +@@ -19,6 +19,7 @@ + #include <QLoggingCategory> + //KF + #include <KApplicationTrader> ++#include "nixos_utils.h" + + namespace KWin + { +@@ -26,8 +27,9 @@ namespace KWin + const static QString s_waylandInterfaceName = QStringLiteral("X-KDE-Wayland-Interfaces"); + const static QString s_dbusRestrictedInterfaceName = QStringLiteral("X-KDE-DBUS-Restricted-Interfaces"); + +-static QStringList fetchProcessServiceField(const QString &executablePath, const QString &fieldName) ++static QStringList fetchProcessServiceField(const QString &in_executablePath, const QString &fieldName) + { ++ const QString executablePath = unwrapExecutablePath(in_executablePath); + // needed to be able to use the logging category in a header static function + static QLoggingCategory KWIN_UTILS ("KWIN_UTILS", QtWarningMsg); + const auto servicesFound = KApplicationTrader::query([&executablePath] (const KService::Ptr &service) { +diff --git a/src/waylandwindow.cpp b/src/waylandwindow.cpp +index fd2c0c1..ae8cf96 100644 +--- a/src/waylandwindow.cpp ++++ b/src/waylandwindow.cpp +@@ -10,6 +10,7 @@ + #include "screens.h" + #include "wayland_server.h" + #include "workspace.h" ++#include "nixos_utils.h" + + #include <KWaylandServer/display.h> + #include <KWaylandServer/clientbuffer.h> +@@ -173,7 +174,9 @@ void WaylandWindow::updateIcon() + + void WaylandWindow::updateResourceName() + { +- const QFileInfo fileInfo(surface()->client()->executablePath()); ++ const QString in_path = surface()->client()->executablePath(); ++ const QString path = unwrapExecutablePath(in_path); ++ const QFileInfo fileInfo(path); + if (fileInfo.exists()) { + const QByteArray executableFileName = fileInfo.fileName().toUtf8(); + setResourceClass(executableFileName, executableFileName); +-- +2.32.0 |