Subject: [PATCH 2/2] gnu: Add sc-controller.

From: [email-masked]
Date: Sun, 9 Oct 2022 18:24:32 -0400

From: Morgan Smith <[email-masked]>

* gnu/packages/games.scm (sc-controller): New variable.
---
 gnu/packages/games.scm | 117 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 246472c699..809fbc9ef7 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -74,6 +74,7 @@
 ;;; Copyright © 2022 Gabriel Arazas <[email-masked]>
 ;;; Copyright © 2022 Maxim Cournoyer <[email-masked]>
 ;;; Copyright © 2022 Hendursaga <[email-masked]>
+;;; Copyright © 2022 Morgan Smith <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -100,6 +101,7 @@ (define-module (gnu packages games)
   #:use-module (guix svn-download)
   #:use-module (guix gexp)
   #:use-module (gnu packages)
+  #:use-module (gnu packages acl)
   #:use-module (gnu packages adns)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autotools)
@@ -162,6 +164,7 @@ (define-module (gnu packages games)
   #:use-module (gnu packages libedit)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages libunwind)
+  #:use-module (gnu packages libusb)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages llvm)
   #:use-module (gnu packages lua)
@@ -185,6 +188,7 @@ (define-module (gnu packages games)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages qt)
@@ -11160,6 +11164,119 @@ (define-public freerct
 and unsafe rides.  Which path will you take?")
     (license license:gpl2)))
 
+(define-public sc-controller
+  (package
+    (name "sc-controller")
+    (version "0.4.8.9")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/Ryochan7/sc-controller")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1410yj6947yq43wwrj3cwllalalggzmd74sad70jd1niwj85yvna"))))
+    (build-system python-build-system)
+    (arguments
+     (list #:phases #~(modify-phases %standard-phases
+                        (delete 'sanity-check) ;; XXX: no clue how python works
+                        (add-after 'unpack 'remove-bundled-libraries
+                          (lambda _
+                            (with-directory-excursion "scc/lib"
+                              (for-each delete-file
+                                        '("enum.py" "jsonencoder.py"
+                                          "libusb1.py" "usb1.py")))
+                            ;; libusb1 fixes
+                            (substitute* '("scc/uinput.py"
+                                           "scc/drivers/usb.py"
+                                           "scc/drivers/steamdeck.py"
+                                           "scc/drivers/sc_by_cable.py")
+                              (("scc\\.lib\\.libusb1")
+                               "libusb1")
+                              (("scc\\.lib\\.usb1")
+                               "usb1")
+                              (("from scc\\.lib import usb1")
+                               "import usb1"))
+                            ;; enum fixes
+                            (substitute* "scc/cemuhook_server.py"
+                              (("scc\\.lib\\.enum")
+                               "enum"))
+                            ;; simplejson fixes
+                            (substitute* "scc/profile.py"
+                              (("from scc\\.lib\\.jsonencoder")
+                               "from simplejson"))))
+                        (add-after 'unpack 'fix-paths
+                          (lambda _
+                            (substitute* "scc/lib/xwrappers.py"
+                              (("libXfixes.so")
+                               (string-append (assoc-ref %build-inputs
+                                                         "libxfixes")
+                                              "/lib/libXfixes.so"))
+                              (("libXext.so")
+                               (string-append (assoc-ref %build-inputs
+                                                         "libxext")
+                                              "/lib/libXext.so")))
+                            (substitute* "scc/lib/eudevmonitor.py"
+                              (("libudev.so")
+                               (string-append (assoc-ref %build-inputs "eudev")
+                                              "/lib/libudev.so")))
+                            (substitute* "scc/uinput.py"
+                              (("/usr/include")
+                               (string-append (assoc-ref %build-inputs
+                                               "linux-libre-headers")
+                                              "/include")))
+                            (substitute* '("scc/gui/app.py"
+                                           "scc/osd/inputdisplay.py"
+                                           "scc/paths.py")
+                              (("/usr/share/scc")
+                               (string-append #$output "/share/scc")))))
+                        (add-after 'wrap 'gi-wrap
+                          (lambda _
+                            (for-each (lambda (prog)
+                                        (wrap-program (string-append #$output
+                                                                     "/bin/"
+                                                                     prog)
+                                                      `("GI_TYPELIB_PATH" =
+                                                        (,(getenv
+                                                           "GI_TYPELIB_PATH")))))
+                                      '("sc-controller" "scc"
+                                        "scc-daemon"
+                                        "scc-osd-dialog"
+                                        "scc-osd-keyboard"
+                                        "scc-osd-launcher"
+                                        "scc-osd-menu"
+                                        "scc-osd-message"
+                                        "scc-osd-radial-menu"
+                                        "scc-osd-show-bindings")))))))
+    (inputs (list bash-minimal
+                  gtk+
+                  gtk-layer-shell
+                  eudev
+                  libxext
+                  libxfixes
+                  linux-libre-headers
+                  python-pycairo
+                  python-evdev
+                  python-libusb1
+                  python-pylibacl
+                  python-pygobject
+                  python-simplejson
+                  python-vdf
+                  zlib))
+    (home-page "https://github.com/Ryochan7/sc-controller")
+    (synopsis "Driver and configuration tool for game controllers")
+    (description
+     "Driver and configuration tool for game controllers such as
+the Steam Controller, Steam Deck, and Dual Shock 4.  Install the included udev
+rules to solve permissions issues.")
+    (license (list
+              ;; lib/enum.py, lib/usb1.py, and lib/libusb1.py are deleted but
+              ;; do have other licenses.
+              license:cc0 ; images/*, default_profiles/*, profile_examples/*, default_menus/*
+              license:zlib ; scripts/gamecontrollerdb.txt
+              license:gpl2)))) ; everything else
+
 (define-public steam-devices-udev-rules
   ;; Last release from 2019-04-10
   (let ((commit "d87ef558408c5e7a1a793d738db4c9dc2cb5f8fa")
-- 
2.37.3