From 50a3e42a91061e5c6110b6a32bab083437734b4a Mon Sep 17 00:00:00 2001 From: Nova DasSarma Date: Sun, 14 Jun 2026 21:47:25 +0900 Subject: [PATCH 1/4] maintainers: add l1n Assisted-by: Claude Code (model: Claude Opus 4.8) --- maintainers/maintainer-list.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 3ad79be89fb8..b39dd1c53a54 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -15120,6 +15120,11 @@ githubId = 27364685; name = "Lorenzo Pasqui"; }; + l1n = { + github = "l1n"; + githubId = 1367322; + name = "Nova DasSarma"; + }; l1npengtul = { email = "l1npengtul@l1npengtul.lol"; github = "l1npengtul"; From bc95ebadc4853bb6fc8d853e4575e8e370f0100d Mon Sep 17 00:00:00 2001 From: Nova DasSarma Date: Sun, 14 Jun 2026 21:47:26 +0900 Subject: [PATCH 2/4] python3Packages.pyobjc-framework-CoreText: init at 11.1 CoreText is a dependency of pyobjc-framework-ApplicationServices. Assisted-by: Claude Code (model: Claude Opus 4.8) --- .../pyobjc-framework-CoreText/default.nix | 59 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 61 insertions(+) create mode 100644 pkgs/development/python-modules/pyobjc-framework-CoreText/default.nix diff --git a/pkgs/development/python-modules/pyobjc-framework-CoreText/default.nix b/pkgs/development/python-modules/pyobjc-framework-CoreText/default.nix new file mode 100644 index 000000000000..7a5fed7c016e --- /dev/null +++ b/pkgs/development/python-modules/pyobjc-framework-CoreText/default.nix @@ -0,0 +1,59 @@ +{ + buildPythonPackage, + setuptools, + darwin, + pyobjc-core, + pyobjc-framework-Cocoa, + pyobjc-framework-Quartz, + lib, +}: + +buildPythonPackage rec { + pname = "pyobjc-framework-CoreText"; + pyproject = true; + + inherit (pyobjc-core) version src; + + sourceRoot = "${src.name}/pyobjc-framework-CoreText"; + + build-system = [ setuptools ]; + + buildInputs = [ darwin.libffi ]; + + nativeBuildInputs = [ + darwin.DarwinTools # sw_vers + ]; + + # Same workaround as pyobjc-framework-Quartz; see + # https://github.com/ronaldoussoren/pyobjc/pull/641. + postPatch = '' + substituteInPlace pyobjc_setup.py \ + --replace-fail "-buildversion" "-buildVersion" \ + --replace-fail "-productversion" "-productVersion" \ + --replace-fail "/usr/bin/sw_vers" "sw_vers" \ + --replace-fail "/usr/bin/xcrun" "xcrun" + ''; + + dependencies = [ + pyobjc-core + pyobjc-framework-Cocoa + pyobjc-framework-Quartz + ]; + + env.NIX_CFLAGS_COMPILE = toString [ + "-I${darwin.libffi.dev}/include" + "-Wno-error=unused-command-line-argument" + ]; + + pythonImportsCheck = [ + "CoreText" + ]; + + meta = { + description = "PyObjC wrappers for the CoreText framework on macOS"; + homepage = "https://github.com/ronaldoussoren/pyobjc"; + license = lib.licenses.mit; + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ l1n ]; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index cb255c8fb62c..8fa5efad605b 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -14764,6 +14764,8 @@ self: super: with self; { callPackage ../development/python-modules/pyobjc-framework-CoreBluetooth { }; + pyobjc-framework-CoreText = callPackage ../development/python-modules/pyobjc-framework-CoreText { }; + pyobjc-framework-Quartz = callPackage ../development/python-modules/pyobjc-framework-Quartz { }; pyobjc-framework-Security = callPackage ../development/python-modules/pyobjc-framework-Security { }; From b61e422ffdeb06d21954a3338e6d342e33c64766 Mon Sep 17 00:00:00 2001 From: Nova DasSarma Date: Sun, 14 Jun 2026 21:47:26 +0900 Subject: [PATCH 3/4] python3Packages.pyobjc-framework-ApplicationServices: init at 11.1 Provides the HIServices module needed by pynput's darwin backend. Assisted-by: Claude Code (model: Claude Opus 4.8) --- .../default.nix | 62 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 4 ++ 2 files changed, 66 insertions(+) create mode 100644 pkgs/development/python-modules/pyobjc-framework-ApplicationServices/default.nix diff --git a/pkgs/development/python-modules/pyobjc-framework-ApplicationServices/default.nix b/pkgs/development/python-modules/pyobjc-framework-ApplicationServices/default.nix new file mode 100644 index 000000000000..c6df11fc9dc4 --- /dev/null +++ b/pkgs/development/python-modules/pyobjc-framework-ApplicationServices/default.nix @@ -0,0 +1,62 @@ +{ + buildPythonPackage, + setuptools, + darwin, + pyobjc-core, + pyobjc-framework-Cocoa, + pyobjc-framework-Quartz, + pyobjc-framework-CoreText, + lib, +}: + +buildPythonPackage rec { + pname = "pyobjc-framework-ApplicationServices"; + pyproject = true; + + inherit (pyobjc-core) version src; + + sourceRoot = "${src.name}/pyobjc-framework-ApplicationServices"; + + build-system = [ setuptools ]; + + buildInputs = [ darwin.libffi ]; + + nativeBuildInputs = [ + darwin.DarwinTools # sw_vers + ]; + + # Same workaround as pyobjc-framework-Quartz; see + # https://github.com/ronaldoussoren/pyobjc/pull/641. + postPatch = '' + substituteInPlace pyobjc_setup.py \ + --replace-fail "-buildversion" "-buildVersion" \ + --replace-fail "-productversion" "-productVersion" \ + --replace-fail "/usr/bin/sw_vers" "sw_vers" \ + --replace-fail "/usr/bin/xcrun" "xcrun" + ''; + + dependencies = [ + pyobjc-core + pyobjc-framework-Cocoa + pyobjc-framework-Quartz + pyobjc-framework-CoreText + ]; + + env.NIX_CFLAGS_COMPILE = toString [ + "-I${darwin.libffi.dev}/include" + "-Wno-error=unused-command-line-argument" + ]; + + pythonImportsCheck = [ + "ApplicationServices" + "HIServices" + ]; + + meta = { + description = "PyObjC wrappers for the ApplicationServices framework on macOS"; + homepage = "https://github.com/ronaldoussoren/pyobjc"; + license = lib.licenses.mit; + platforms = lib.platforms.darwin; + maintainers = with lib.maintainers; [ l1n ]; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 8fa5efad605b..1a9228eebdcd 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -14754,6 +14754,10 @@ self: super: with self; { pyobjc-core = callPackage ../development/python-modules/pyobjc-core { }; + pyobjc-framework-ApplicationServices = + callPackage ../development/python-modules/pyobjc-framework-ApplicationServices + { }; + pyobjc-framework-Cocoa = callPackage ../development/python-modules/pyobjc-framework-Cocoa { }; pyobjc-framework-CoreAudio = From 595103c57c4d13554ae0a60c3ec22021822dcaf2 Mon Sep 17 00:00:00 2001 From: Nova DasSarma Date: Sun, 14 Jun 2026 21:47:26 +0900 Subject: [PATCH 4/4] python3Packages.pynput: unbreak on darwin The macOS backend imports HIServices (ApplicationServices) and uses Quartz, but no pyobjc dependencies were added on darwin, so importing pynput failed at runtime - hence the broken flag. Add the two frameworks pynput's darwin backend needs and drop the broken marker. Tested on aarch64-darwin: `from pynput import keyboard` and `HIServices.AXIsProcessTrusted()` both succeed. Assisted-by: Claude Code (model: Claude Opus 4.8) --- pkgs/development/python-modules/pynput/default.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pkgs/development/python-modules/pynput/default.nix b/pkgs/development/python-modules/pynput/default.nix index 22671fe18f2e..d27999d63045 100644 --- a/pkgs/development/python-modules/pynput/default.nix +++ b/pkgs/development/python-modules/pynput/default.nix @@ -14,6 +14,8 @@ xlib, evdev, six, + pyobjc-framework-ApplicationServices, + pyobjc-framework-Quartz, # tests unittestCheckHook, @@ -52,6 +54,11 @@ buildPythonPackage rec { ++ lib.optionals stdenv.hostPlatform.isLinux [ evdev xlib + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + # the darwin backend imports HIServices (ApplicationServices) and Quartz + pyobjc-framework-ApplicationServices + pyobjc-framework-Quartz ]; doCheck = false; # requires running X server @@ -59,7 +66,6 @@ buildPythonPackage rec { nativeCheckInputs = [ unittestCheckHook ]; meta = { - broken = stdenv.hostPlatform.isDarwin; description = "Library to control and monitor input devices"; homepage = "https://github.com/moses-palmer/pynput"; license = lib.licenses.lgpl3;