aboutsummaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/packages/admin.scm26
-rw-r--r--gnu/packages/audio.scm2
-rw-r--r--gnu/packages/bootloaders.scm9
-rw-r--r--gnu/packages/compression.scm28
-rw-r--r--gnu/packages/django.scm116
-rw-r--r--gnu/packages/emacs.scm4
-rw-r--r--gnu/packages/firmware.scm17
-rw-r--r--gnu/packages/fonts.scm11
-rw-r--r--gnu/packages/gnupg.scm30
-rw-r--r--gnu/packages/java.scm3
-rw-r--r--gnu/packages/lisp.scm8
-rw-r--r--gnu/packages/patches/pinentry-efl.patch798
-rw-r--r--gnu/packages/python-web.scm44
-rw-r--r--gnu/packages/python.scm22
-rw-r--r--gnu/services/games.scm3
16 files changed, 1073 insertions, 49 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 4b194d7b13..e56f8a28dc 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1048,6 +1048,7 @@ dist_patch_DATA = \
%D%/packages/patches/pinball-missing-separators.patch \
%D%/packages/patches/pinball-src-deps.patch \
%D%/packages/patches/pinball-system-ltdl.patch \
+ %D%/packages/patches/pinentry-efl.patch \
%D%/packages/patches/pingus-sdl-libs-config.patch \
%D%/packages/patches/pius.patch \
%D%/packages/patches/pixman-CVE-2016-5296.patch \
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index cd18aaa06f..d30c13d845 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -9,7 +9,7 @@
;;; Copyright © 2016, 2017 Leo Famulari <leo@famulari.name>
;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016, 2017 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2018 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016 Peter Feigl <peter.feigl@nexoid.at>
;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
;;; Copyright © 2016, 2017 Nils Gillmann <ng0@n0.is>
@@ -2455,26 +2455,20 @@ make it a perfect utility on modern distros.")
(version "1.7.2")
(source
(origin
- (method url-fetch)
- (uri (string-append "https://github.com/01org/thermal_daemon/archive/v"
- version ".tar.gz"))
- (file-name (string-append name "-" version ".tar.gz"))
- (sha256 (base32
- "15a6vb67y5wsmf0irrq7sxam18yqpz64130k83ryf24mp40h661b"))))
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/01org/thermal_daemon")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1cs2pq8xvfnsvrhg2bxawk4kn3z1qmfrnpnhs178pvfbglzh15hc"))))
(build-system gnu-build-system)
(arguments
- `(#:phases
- (modify-phases %standard-phases
- (add-after 'unpack 'bootstrap
- (lambda _
- (invoke "sh" "autogen.sh")
- #t)))
- #:configure-flags
+ `(#:configure-flags
(let ((out (assoc-ref %outputs "out")))
(list (string-append "--sysconfdir="
out "/etc")
- (string-append "--with-udev-dir="
- out "/lib/udev")
(string-append "--with-dbus-sys-dir="
out "/etc/dbus-1/system.d")
"--localstatedir=/var"))))
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 7883834d18..e3938494ba 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -466,7 +466,7 @@ controls are allowable notes, strength of correction, LFO for vibrato and
formant warp.")
;; All code except the FFT routine is licensed under GPLv2+.
;; The FFT routine is under BSD-3.
- (license (list license:gpl2+))))
+ (license license:gpl2+)))
(define-public azr3
(package
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index d6e38bb0b8..da2e82c33d 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -555,8 +555,8 @@ board-independent tools.")))
(define-public u-boot-beagle-bone-black
(make-u-boot-package "am335x_boneblack" "arm-linux-gnueabihf"))
-(define-public u-boot-pine64-plus
- (let ((base (make-u-boot-package "pine64_plus" "aarch64-linux-gnu")))
+(define-public (make-u-boot-sunxi64-package board triplet)
+ (let ((base (make-u-boot-package board triplet)))
(package
(inherit base)
(arguments
@@ -574,9 +574,12 @@ board-independent tools.")))
)
#t))))))
(native-inputs
- `(("firmware" ,arm-trusted-firmware-pine64-plus)
+ `(("firmware" ,arm-trusted-firmware-sun50i-a64)
,@(package-native-inputs base))))))
+(define-public u-boot-pine64-plus
+ (make-u-boot-sunxi64-package "pine64_plus" "aarch64-linux-gnu"))
+
(define-public u-boot-bananapi-m2-ultra
(make-u-boot-package "Bananapi_M2_Ultra" "arm-linux-gnueabihf"))
diff --git a/gnu/packages/compression.scm b/gnu/packages/compression.scm
index fb07867c6d..32b92a976c 100644
--- a/gnu/packages/compression.scm
+++ b/gnu/packages/compression.scm
@@ -696,13 +696,13 @@ sfArk file format to the uncompressed sf2 format.")
(package
(name "libmspack")
(home-page "https://cabextract.org.uk/libmspack/")
- (version "0.8")
+ (version "0.9.1")
(source
(origin
(method url-fetch)
(uri (string-append home-page name "-" version "alpha.tar.gz"))
(sha256
- (base32 "1byx98jajv927f0a7np0hvs8lxzccny6pj8vrrgmldv1jlp7jcq5"))))
+ (base32 "0h1f5w8rjnq7dcqpqm1mpx5m8q80691kid6f7npqlqwqqzckd8v2"))))
(build-system gnu-build-system)
(arguments
`(#:configure-flags '("--disable-static")))
@@ -1085,13 +1085,13 @@ smaller than those produced by @code{Xdelta}.")
(package
(name "cabextract")
(home-page "https://cabextract.org.uk/")
- (version "1.7")
+ (version "1.9")
(source (origin
(method url-fetch)
(uri (string-append home-page name "-" version ".tar.gz"))
(sha256
(base32
- "1g86wmb8lkjiv2jarfz979ngbgg7d3si8x5il4g801604v406wi9"))
+ "1hf4zhjxfdgq9x172r5zfdnafma9q0zf7372syn8hcn7hcypkg0v"))
(modules '((guix build utils)))
(snippet
'(begin
@@ -1099,11 +1099,27 @@ smaller than those produced by @code{Xdelta}.")
(delete-file-recursively "mspack")
#t))))
(build-system gnu-build-system)
- (arguments '(#:configure-flags '("--with-external-libmspack")))
+ (arguments
+ '(#:configure-flags '("--with-external-libmspack")
+ #:phases
+ (modify-phases %standard-phases
+ ;; cabextract needs some of libmspack's header files.
+ ;; These are located in the "mspack" directory of libmspack.
+ (add-before 'build 'unpack-libmspack
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((dir-name "libmspack-src"))
+ (mkdir dir-name)
+ (invoke "tar" "-xvf" (assoc-ref inputs "libmspack-source")
+ "-C" dir-name "--strip-components" "1")
+ (rename-file (string-append dir-name "/mspack")
+ "mspack")
+ (delete-file-recursively dir-name)
+ #t))))))
(native-inputs
`(("pkg-config" ,pkg-config)))
(inputs
- `(("libmspack" ,libmspack)))
+ `(("libmspack" ,libmspack)
+ ("libmspack-source" ,(package-source libmspack))))
(synopsis "Tool to unpack Cabinet archives")
(description "Extracts files out of Microsoft Cabinet (.cab) archives")
;; Some source files specify gpl2+, lgpl2+, however COPYING is gpl3.
diff --git a/gnu/packages/django.scm b/gnu/packages/django.scm
index dea925e568..59bef9a8d1 100644
--- a/gnu/packages/django.scm
+++ b/gnu/packages/django.scm
@@ -265,6 +265,41 @@ account authentication.")
(define-public python2-django-allauth
(package-with-python2 python-django-allauth))
+(define-public python-django-debug-toolbar
+ (package
+ (name "python-django-debug-toolbar")
+ (version "1.10.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://github.com/jazzband/django-debug-toolbar/archive/"
+ version ".tar.gz"))
+ (file-name (string-append name "-" version ".tar.gz"))
+ (sha256
+ (base32
+ "1rww056hyzks8spbgf4h7kf6ybxlc5p08a2b6gn1nqrrzs4yx9sy"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-sqlparse" ,python-sqlparse)
+ ("python-django" ,python-django)))
+ (native-inputs
+ `(("python-django-jinja" ,python-django-jinja)
+ ("python-html5lib" ,python-html5lib)))
+ (arguments
+ '(#:phases
+ (modify-phases %standard-phases
+ (replace 'check
+ (lambda _
+ (invoke "make" "test"))))))
+ (home-page
+ "https://github.com/jazzband/django-debug-toolbar")
+ (synopsis "Toolbar to help with developing Django applications")
+ (description
+ "A configurable set of panels that display information about the current
+request and response as a toolbar on the rendered page.")
+ (license license:bsd-3)))
+
(define-public python-django-gravatar2
(package
(name "python-django-gravatar2")
@@ -338,6 +373,47 @@ merging, minifying and compiling CSS and Javascript files.")
(define-public python2-django-assets
(package-with-python2 python-django-assets))
+(define-public python-django-jinja
+ (package
+ (name "python-django-jinja")
+ (version "2.4.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://github.com/niwinz/django-jinja/archive/"
+ version ".tar.gz"))
+ (file-name (string-append name "-" version ".tar.gz"))
+ (sha256
+ (base32
+ "0bzrb4m6wx9ph5cpvz7wpvg5k6ksvj0dnxlg0nhhqskhvp46brs1"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-django" ,python-django)
+ ("python-jinja2" ,python-jinja2)
+ ("python-pytz" ,python-pytz)
+ ("python-django-pipeline" ,python-django-pipeline)))
+ (arguments
+ '(;; TODO Tests currently fail due to issues with the configuration for
+ ;; django-pipeline
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ (or
+ (not tests?)
+ (with-directory-excursion "testing"
+ (invoke "python" "runtests.py"))))))))
+ (home-page
+ "https://niwinz.github.io/django-jinja/latest/")
+ (synopsis "Simple jinja2 templating backend for Django")
+ (description
+ "This package provides a templating backend for Django, using Jinja2. It
+provides certain advantages over the builtin Jinja2 backend in Django, for
+example, explicit calls to callables from templates and better performance.")
+ (license license:bsd-3)))
+
(define-public python-django-jsonfield
(package
(name "python-django-jsonfield")
@@ -518,6 +594,46 @@ project.")
(define-public python2-django-overextends
(package-with-python2 python-django-overextends))
+(define-public python-django-pipeline
+ (package
+ (name "python-django-pipeline")
+ (version "1.6.14")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "django-pipeline" version))
+ (sha256
+ (base32
+ "1a207y71r7za033ira0qmh2yrgp5rq0l04gw2fg9b8jri7sslrzg"))))
+ (build-system python-build-system)
+ (arguments
+ '(#:phases
+ (modify-phases %standard-phases
+ (add-after 'unpack 'patch-source
+ (lambda _
+ (substitute* "tests/tests/test_compiler.py"
+ (("\\/usr\\/bin\\/env")
+ (which "env")))))
+ (replace 'check
+ (lambda*(#:key tests? #:allow-other-keys)
+ (or
+ (not tests?)
+ (begin
+ (setenv "DJANGO_SETTINGS_MODULE" "tests.settings")
+ (invoke "django-admin" "test" "tests"))))))))
+ (propagated-inputs
+ `(("python-django" ,python-django)
+ ("python-slimit" ,python-slimit)
+ ("python-jsmin" ,python-jsmin)))
+ (home-page
+ "https://github.com/jazzband/django-pipeline")
+ (synopsis "Asset packaging library for Django")
+ (description
+ "Pipeline is an asset packaging library for Django, providing both CSS
+and JavaScript concatenation and compression, built-in JavaScript template
+support, and optional data-URI image and font embedding.")
+ (license license:expat)))
+
(define-public python-django-redis
(package
(name "python-django-redis")
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index dfcee56afe..67667eeee5 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -4698,7 +4698,7 @@ indentation (space indentation only).
(define-public emacs-elpy
(package
(name "emacs-elpy")
- (version "1.24.0")
+ (version "1.26.0")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -4707,7 +4707,7 @@ indentation (space indentation only).
(file-name (string-append name "-" version "-checkout"))
(sha256
(base32
- "0rsg8a9nwqfkv0xcs11jzfp10ij7jm0v2ikx19zv2v7awqy0q5wf"))))
+ "0wynzp5xmrgiggmam82n6lfaiqmfl4n3ccpsgnh86r6pbsmssxjk"))))
(build-system emacs-build-system)
(arguments
`(#:include (cons* "^elpy/[^/]+\\.py$" "^snippets\\/" %default-include)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 0b5a82e9e5..c396cd644f 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -446,25 +446,26 @@ such as:
(license (list license:bsd-3
license:bsd-2)))) ; libfdt
-(define-public arm-trusted-firmware-pine64-plus
- (let ((base (make-arm-trusted-firmware "sun50iw1p1"))
- ;; Vendor's arm trusted firmware branch hasn't been upstreamed yet.
- (commit "ae78724247a01560164d607ed66db111c74d8df0")
+(define-public arm-trusted-firmware-sun50i-a64
+ (let ((base (make-arm-trusted-firmware "sun50i_a64"))
+ ;; Use unreleased version which enables additional features needed for
+ ;; LCD support
+ (commit "cabe0a31801e99e7abb84d2114ded6bb56f3c71e")
(revision "1"))
(package
(inherit base)
- (name "arm-trusted-firmware-pine64-plus")
- (version (string-append "1.2-" revision "." (string-take commit 7)))
+ (name "arm-trusted-firmware-sun50i-a64")
+ (version (git-version "2.0" revision commit))
(source
(origin
(method git-fetch)
(uri (git-reference
- (url "https://github.com/apritzel/arm-trusted-firmware.git")
+ (url "https://github.com/ARM-software/arm-trusted-firmware.git")
(commit commit)))
(file-name (git-file-name name version))
(sha256
(base32
- "0r4xnlq7v9khjfcg6gqp7nmrmnw4z1r8bipwdr07png1dcbb8214")))))))
+ "0srw2zj3vn5d2fwzjpwa5h70d5bwvb79jnpdvmd395npv0gxshdz")))))))
(define-public arm-trusted-firmware-puma-rk3399
(let ((base (make-arm-trusted-firmware "rk3399"))
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 1195695d7a..f9f8428202 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -99,13 +99,14 @@ in print. With attention to detail for high resolution rendering.")
(name "font-ubuntu")
(version "0.83")
(source (origin
- (method url-fetch)
- (uri (string-append
- "http://font.ubuntu.com/download/ubuntu-font-family-"
- version ".zip"))
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://salsa.debian.org/fonts-team/fonts-ubuntu")
+ (commit (string-append "upstream/" version))))
+ (file-name (git-file-name name version))
(sha256
(base32
- "0hjvq2x758dx0sfwqhzflns0ns035qm7h6ygskbx1svzg517sva5"))))
+ "1d2xrjpxy70f3nsgqiggwv6pj06qglf5vj2847pqx60w3ygi903g"))))
(build-system font-build-system)
(home-page "http://font.ubuntu.com/")
(synopsis "The Ubuntu Font Family")
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index cec013074f..53fdc8200c 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -40,6 +40,8 @@
#:use-module (gnu packages curl)
#:use-module (gnu packages crypto)
#:use-module (gnu packages emacs)
+ #:use-module (gnu packages enlightenment)
+ #:use-module (gnu packages gettext)
#:use-module (gnu packages guile)
#:use-module (gnu packages openldap)
#:use-module (gnu packages perl)
@@ -836,6 +838,34 @@ software.")))
"Pinentry provides a console and a Qt GUI that allows users to enter a
passphrase when @code{gpg} is run and needs it.")))
+(define-public pinentry-efl
+ (package
+ (inherit pinentry-tty)
+ (name "pinentry-efl")
+ (source
+ (origin
+ (inherit (package-source pinentry-tty))
+ (patches (search-patches "pinentry-efl.patch"))))
+ (arguments
+ '(#:configure-flags '("--enable-pinentry-efl")
+ #:phases
+ (modify-phases %standard-phases
+ (replace 'bootstrap
+ (lambda _
+ (invoke "sh" "autogen.sh"))))))
+ (native-inputs
+ `(("autoconf" ,autoconf)
+ ("automake" ,automake)
+ ("gettext" ,gettext-minimal)
+ ,@(package-native-inputs pinentry-tty)))
+ (inputs
+ `(("efl" ,efl)
+ ,@(package-inputs pinentry-tty)))
+ (description
+ "Pinentry provides a console and a graphical interface for the
+@dfn{Enlightenment Foundation Libraries} (EFL) that allows users to enter a
+passphrase when @code{gpg} is run and needs it.")))
+
(define-public pinentry
(package (inherit pinentry-gtk2)
(name "pinentry")))
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 97d36c72d3..9af22146ed 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -9388,7 +9388,8 @@ that is part of the SWT Tools project.")
,(match (%current-system)
((or "i686-linux" "armhf-linux")
"linux32")
- ((or "x86_64-linux" "aarch64-linux")
+ ((or "x86_64-linux" "aarch64-linux"
+ "mips64el-linux")
"linux64")))))
(install-file "src/main/native-package/src/libjansi.so" dir))
#t))
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 6849cdd2bf..d401e5c456 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -533,12 +533,8 @@ statistical profiler, a code coverage tool, and many other extensions.")
(install-file kernel libdir)
(install-file heap libdir)
- (let ((dirs '("lib" "library" "examples" "tools" "objc-bridge"
- ,(match (%current-system)
- ("x86_64-linux"
- "x86-headers64")
- ("i686-linux"
- "x86-headers")))))
+ (let ((dirs '("lib" "library" "examples" "contrib"
+ "tools" "objc-bridge")))
(for-each copy-recursively
dirs
(map (cut string-append libdir <>) dirs)))
diff --git a/gnu/packages/patches/pinentry-efl.patch b/gnu/packages/patches/pinentry-efl.patch
new file mode 100644
index 0000000000..5ba79e28df
--- /dev/null
+++ b/gnu/packages/patches/pinentry-efl.patch
@@ -0,0 +1,798 @@
+https://git.gnupg.org/cgi-bin/gitweb.cgi?p=pinentry.git;a=commit;h=948105b7a34ec9a9e5479d376b7c86bafee50a01
+This patch can be removed with the next release of pinentry.
+
+From 948105b7a34ec9a9e5479d376b7c86bafee50a01 Mon Sep 17 00:00:00 2001
+From: "William L. Thomson Jr" <wlt@o-sinc.com>
+Date: Tue, 29 May 2018 22:50:47 +0100
+Subject: [PATCH] efl: Add an EFL-based pinentry.
+
+* NEWS: Update.
+* Makefile.am: Add new efl subdirectory.
+* configure.ac: Add --enable-pinentry-efl option.
+* efl/Makefile.am: New file.
+* efl/pinentry-efl.c: New file.
+
+Signed-off-by: Damien Goutte-Gattat <dgouttegattat@incenp.org>
+---
+ Makefile.am | 8 +-
+ configure.ac | 44 +++-
+ efl/Makefile.am | 38 ++++
+ efl/pinentry-efl.c | 623 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 716 insertions(+), 2 deletions(-)
+ create mode 100644 efl/Makefile.am
+ create mode 100644 efl/pinentry-efl.c
+
+diff --git a/Makefile.am b/Makefile.am
+index 8c8b8e5..b8fd0e1 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -82,10 +82,16 @@ else
+ pinentry_fltk =
+ endif
+
++if BUILD_PINENTRY_EFL
++pinentry_efl = efl
++else
++pinentry_efl =
++endif
++
+ SUBDIRS = m4 secmem pinentry ${pinentry_curses} ${pinentry_tty} \
+ ${pinentry_emacs} ${pinentry_gtk_2} ${pinentry_gnome_3} \
+ ${pinentry_qt} ${pinentry_tqt} ${pinentry_w32} \
+- ${pinentry_fltk} doc
++ ${pinentry_fltk} ${pinentry_efl} doc
+
+
+ install-exec-local:
+diff --git a/configure.ac b/configure.ac
+index ff6c2e0..e305e44 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -419,6 +419,42 @@ fi
+
+
+ dnl
++dnl Check for EFL pinentry programs.
++dnl
++AC_ARG_ENABLE(pinentry-efl,
++ AC_HELP_STRING([--enable-pinentry-efl], [build EFL pinentry]),
++ pinentry_efl=$enableval, pinentry_efl=maybe)
++
++dnl check for pkg-config
++if test "$pinentry_efl" != "no"; then
++ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
++ if test x"${PKG_CONFIG}" = xno ; then
++ pinentry_efl=no
++ fi
++fi
++
++if test "$pinentry_efl" != "no"; then
++ AC_MSG_CHECKING([for efl])
++ "${PKG_CONFIG}" --exists 'elementary >= 1.18'
++ if test $? -ne 0 ; then
++ AC_MSG_RESULT([no])
++ AC_MSG_WARN([efl >= 1.18 is required for efl pinentry])
++ pinentry_efl=no
++ else
++ AC_MSG_RESULT([yes])
++ EFL_CFLAGS=`"${PKG_CONFIG}" --cflags ecore-x elementary`
++ EFL_LIBS=`"${PKG_CONFIG}" --libs ecore-x elementary`
++ AC_SUBST(EFL_CFLAGS)
++ AC_SUBST(EFL_LIBS)
++ if test "$pinentry_efl" != "no"
++ then
++ pinentry_efl=yes
++ fi
++ fi
++fi
++AM_CONDITIONAL(BUILD_PINENTRY_EFL, test "$pinentry_efl" = "yes")
++
++dnl
+ dnl Check for GTK+-2 / GNOME3 pinentry programs.
+ dnl
+ AC_ARG_ENABLE(pinentry-gtk2,
+@@ -645,7 +681,11 @@ else
+ if test "$pinentry_tqt" = "yes"; then
+ PINENTRY_DEFAULT=pinentry-tqt
+ else
+- AC_MSG_ERROR([[No pinentry enabled.]])
++ if test "$pinentry_efl" = "yes"; then
++ PINENTRY_DEFAULT=pinentry-efl
++ else
++ AC_MSG_ERROR([[No pinentry enabled.]])
++ fi
+ fi
+ fi
+ fi
+@@ -721,6 +761,7 @@ secmem/Makefile
+ pinentry/Makefile
+ curses/Makefile
+ tty/Makefile
++efl/Makefile
+ emacs/Makefile
+ gtk+-2/Makefile
+ gnome3/Makefile
+@@ -744,6 +785,7 @@ AC_MSG_NOTICE([
+ Curses Pinentry ..: $pinentry_curses
+ TTY Pinentry .....: $pinentry_tty
+ Emacs Pinentry ...: $pinentry_emacs
++ EFL Pinentry .....: $pinentry_efl
+ GTK+-2 Pinentry ..: $pinentry_gtk_2
+ GNOME 3 Pinentry .: $pinentry_gnome_3
+ Qt Pinentry ......: $pinentry_qt $pinentry_qt_lib_version
+diff --git a/efl/Makefile.am b/efl/Makefile.am
+new file mode 100644
+index 0000000..b986a04
+--- /dev/null
++++ b/efl/Makefile.am
+@@ -0,0 +1,38 @@
++# Makefile.am - PIN entry EFL frontend.
++# Copyright (C) 2017 Obsidian-Studios, Inc.
++# Author William L. Thomson Jr. <wlt@o-sinc.com>
++#
++# This file is part of PINENTRY.
++#
++# PINENTRY is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# PINENTRY is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
++
++## Process this file with automake to produce Makefile.in
++
++bin_PROGRAMS = pinentry-efl
++
++if FALLBACK_CURSES
++ncurses_include = $(NCURSES_INCLUDE)
++libcurses = ../pinentry/libpinentry-curses.a $(LIBCURSES) $(LIBICONV)
++else
++ncurses_include =
++libcurses =
++endif
++
++AM_CPPFLAGS = $(COMMON_CFLAGS) $(EFL_CFLAGS) $(ncurses_include) \
++ -I$(top_srcdir)/secmem -I$(top_srcdir)/pinentry
++LDADD = ../pinentry/libpinentry.a ../secmem/libsecmem.a \
++ $(COMMON_LIBS) $(LIBCAP) $(EFL_LIBS) $(libcurses)
++
++pinentry_efl_SOURCES = pinentry-efl.c
+diff --git a/efl/pinentry-efl.c b/efl/pinentry-efl.c
+new file mode 100644
+index 0000000..ca99693
+--- /dev/null
++++ b/efl/pinentry-efl.c
+@@ -0,0 +1,623 @@
++/* pinentry-efl.c
++ Copyright (C) 2017 Obsidian-Studios, Inc.
++ Author William L. Thomson Jr. <wlt@o-sinc.com>
++
++ Based on pinentry-gtk2.c
++ Copyright (C) 1999 Robert Bihlmeyer <robbe@orcus.priv.at>
++ Copyright (C) 2001, 2002, 2007, 2015 g10 Code GmbH
++ Copyright (C) 2004 by Albrecht Dreß <albrecht.dress@arcor.de>
++
++ pinentry-efl is a pinentry application for the EFL widget set.
++ It tries to follow the Gnome Human Interface Guide as close as
++ possible.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++#include <Elementary.h>
++#include <Ecore_X.h>
++#include <gpg-error.h>
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wstrict-prototypes"
++#endif
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
++#pragma GCC diagnostic pop
++#endif
++
++#ifdef HAVE_GETOPT_H
++#include <getopt.h>
++#else
++#include "getopt.h"
++#endif /* HAVE_GETOPT_H */
++
++#include "pinentry.h"
++
++#ifdef FALLBACK_CURSES
++#include "pinentry-curses.h"
++#endif
++
++#define PGMNAME "pinentry-efl"
++
++#ifndef VERSION
++#define VERSION
++#endif
++
++#define ENTRY_HIDE "Hide entry"
++#define ENTRY_SHOW "Show entry"
++
++typedef enum { CONFIRM_CANCEL, CONFIRM_OK, CONFIRM_NOTOK } confirm_value_t;
++
++static const int WIDTH = 480;
++static const int BUTTON_HEIGHT = 27;
++static const int BUTTON_WIDTH = 70;
++static const int BUTTON_ICON_SIZE = 13;
++static const int PADDING = 5;
++
++static Eina_Bool got_input;
++static Ecore_Timer *timer;
++static Evas_Object *check_label;
++static Evas_Object *error_label;
++static Evas_Object *entry;
++static Evas_Object *repeat_entry;
++static Evas_Object *qualitybar;
++static Evas_Object *win;
++static char **pargv;
++static int grab_failed;
++static int passphrase_ok;
++static int confirm_mode;
++static int pargc;
++static confirm_value_t confirm_value;
++static pinentry_t pinentry;
++
++pinentry_cmd_handler_t pinentry_cmd_handler;
++
++static void
++quit (void)
++{
++ evas_object_del(win);
++ elm_exit();
++ ecore_main_loop_quit ();
++}
++
++static void
++delete_event (void *data EINA_UNUSED,
++ Evas_Object *obj EINA_UNUSED,
++ void *event EINA_UNUSED)
++{
++ pinentry->close_button = 1;
++ quit ();
++}
++
++static void
++changed_text_handler (void *data EINA_UNUSED,
++ Evas_Object *obj,
++ void *event EINA_UNUSED)
++{
++ const char *s;
++ int length;
++ int percent;
++
++ got_input = EINA_TRUE;
++
++ if (pinentry->repeat_passphrase && repeat_entry)
++ {
++ elm_object_text_set (repeat_entry, "");
++ elm_object_text_set (error_label, "");
++ }
++
++ if (!qualitybar || !pinentry->quality_bar)
++ return;
++
++ s = elm_object_text_get (obj);
++ if (!s)
++ s = "";
++ length = strlen (s);
++ percent = length? pinentry_inq_quality (pinentry, s, length) : 0;
++ evas_object_color_set(qualitybar,
++ 255 - ( 2.55 * percent ),
++ 2.55 * percent, 0, 255);
++ elm_progressbar_value_set (qualitybar, (double) percent / 100.0);
++}
++
++static void
++on_check (void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED)
++{
++ if(elm_check_state_get(obj))
++ {
++ elm_entry_password_set(entry, EINA_FALSE);
++ elm_object_text_set(check_label,ENTRY_HIDE);
++ }
++ else
++ {
++ elm_entry_password_set(entry, EINA_TRUE);
++ elm_object_text_set(check_label,ENTRY_SHOW);
++ }
++ evas_object_size_hint_min_set(check_label,
++ ELM_SCALE_SIZE(BUTTON_WIDTH),
++ ELM_SCALE_SIZE(BUTTON_HEIGHT));
++ evas_object_size_hint_align_set(check_label, 0, 1);
++}
++
++static void
++on_click (void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
++{
++ if (confirm_mode)
++ {
++ confirm_value = (confirm_value_t) data;
++ quit ();
++ return;
++ }
++
++ if (data)
++ {
++ const char *s;
++ const char *s2;
++
++ s = elm_entry_entry_get (entry);
++ if (!s)
++ s = "";
++
++ if (pinentry->repeat_passphrase && repeat_entry)
++ {
++ s2 = elm_entry_entry_get (repeat_entry);
++ if (!s2)
++ s2 = "";
++ if (strcmp (s, s2))
++ {
++ elm_object_text_set(error_label,
++ pinentry->repeat_error_string?
++ pinentry->repeat_error_string:
++ "not correctly repeated");
++ elm_object_focus_set(entry,EINA_TRUE);
++ return;
++ }
++ pinentry->repeat_okay = 1;
++ }
++
++ passphrase_ok = 1;
++ pinentry_setbufferlen (pinentry, strlen (s) + 1);
++ if (pinentry->pin)
++ strncpy (pinentry->pin, s, strlen(s) + 1);
++ }
++ quit ();
++}
++
++static void
++enter_callback (void *data, Evas_Object * obj, void *event_info EINA_UNUSED)
++{
++ if (data)
++ elm_object_focus_set (data, 1);
++ else
++ on_click ((void *) CONFIRM_OK, obj, NULL);
++}
++
++static Eina_Bool
++timeout_cb (const void * data)
++{
++ pinentry_t pe = (pinentry_t)data;
++ if (!got_input)
++ {
++ ecore_main_loop_quit();
++ if (pe)
++ pe->specific_err = gpg_error (GPG_ERR_TIMEOUT);
++ }
++
++ timer = NULL;
++ return ECORE_CALLBACK_DONE;
++}
++
++static void
++create_window (void)
++{
++ char *txt;
++ Evas_Object *icon;
++ Evas_Object *obj;
++ Evas_Object *table;
++ int btn_txt_len = 0;
++ int row = 0;
++ int ok_len = 0;
++
++ win = elm_win_util_dialog_add(NULL,"pinentry","enter pin");
++ elm_win_autodel_set(win, EINA_TRUE);
++ elm_win_center(win,EINA_TRUE,EINA_TRUE);
++ evas_object_smart_callback_add(win, "delete,request", delete_event, NULL);
++
++ table = elm_table_add(win);
++ elm_table_padding_set(table,ELM_SCALE_SIZE(PADDING),0);
++ evas_object_size_hint_padding_set (table,
++ ELM_SCALE_SIZE(PADDING),
++ ELM_SCALE_SIZE(PADDING),
++ ELM_SCALE_SIZE(PADDING),
++ ELM_SCALE_SIZE(PADDING));
++ evas_object_show(table);
++
++ if (pinentry->title)
++ {
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype,
++ pinentry->title);
++ elm_win_title_set ( win, txt );
++ free (txt);
++ }
++
++ /* Description Label */
++ if (pinentry->description)
++ {
++ char* aligned;
++ int len;
++
++ obj = elm_label_add(table);
++ elm_label_line_wrap_set (obj, ELM_WRAP_WORD);
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->description);
++ len = strlen(txt)+20; // 20 chars for align tag
++ aligned = calloc(len+1,sizeof(char));
++ if(aligned)
++ {
++ snprintf(aligned,len, "<align=left>%s</align>",txt);
++ elm_object_text_set(obj,aligned);
++ free (aligned);
++ } else
++ elm_object_text_set(obj,txt);
++ free (txt);
++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0);
++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0);
++ elm_table_pack(table, obj, 1, row, 5, 1);
++ evas_object_show(obj);
++ row++;
++ }
++ if (!confirm_mode && (pinentry->error || pinentry->repeat_passphrase))
++ {
++ /* Error Label */
++ if (pinentry->error)
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->error);
++ else
++ txt = "";
++ obj = elm_label_add(table);
++ evas_object_color_set(obj, 255, 0, 0, 255);
++ elm_object_text_set(obj,txt);
++ elm_object_style_set(obj,"slide_bounce");
++ elm_label_slide_duration_set(obj, 10);
++ elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_ALWAYS);
++ elm_label_slide_go(obj);
++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, 0);
++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0);
++ elm_table_pack(table, obj, 1, row, 5, 1);
++ evas_object_show(obj);
++ if (pinentry->error)
++ free (txt);
++ row++;
++ }
++
++ qualitybar = NULL;
++
++ if (!confirm_mode)
++ {
++
++ if (pinentry->prompt)
++ {
++ /* Entry/Prompt Label */
++ obj = elm_label_add(table);
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->prompt);
++ elm_object_text_set(obj,txt);
++ free (txt);
++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND);
++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL);
++ elm_table_pack(table, obj, 1, row, 1, 1);
++ evas_object_show(obj);
++ }
++
++ entry = elm_entry_add(table);
++ elm_entry_scrollable_set(entry, EINA_TRUE);
++ elm_scroller_policy_set(entry,
++ ELM_SCROLLER_POLICY_OFF,
++ ELM_SCROLLER_POLICY_OFF);
++ elm_entry_password_set(entry, EINA_TRUE);
++ elm_entry_single_line_set(entry, EINA_TRUE);
++ evas_object_size_hint_weight_set(entry, 0, 0);
++ evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0);
++ elm_table_pack(table, entry, 2, row, 4, 1);
++ evas_object_smart_callback_add(entry,
++ "changed",
++ changed_text_handler,
++ NULL);
++ evas_object_show(entry);
++ row++;
++
++ /* Check box */
++ obj = elm_check_add(table);
++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL);
++ elm_table_pack(table, obj, 1, row, 1, 1);
++ evas_object_smart_callback_add(obj, "changed", on_check, NULL);
++ evas_object_show(obj);
++
++ /* Check Label */
++ check_label = elm_label_add(table);
++ on_check((void *)NULL, obj, (void *)NULL);
++ elm_table_pack(table, check_label, 2, row, 4, 1);
++ evas_object_show(check_label);
++ row++;
++
++ if (pinentry->quality_bar)
++ {
++ /* Quality Bar Label */
++ obj = elm_label_add(table);
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype,
++ pinentry->quality_bar);
++ elm_object_text_set(obj,txt);
++ free (txt);
++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND);
++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL);
++ elm_table_pack(table, obj, 1, row, 1, 1);
++ evas_object_show(obj);
++
++ qualitybar = elm_progressbar_add(table);
++ evas_object_color_set(qualitybar, 255, 0, 0, 255);
++ evas_object_show(qualitybar);
++ if (pinentry->quality_bar_tt)
++ elm_object_tooltip_text_set (qualitybar,
++ pinentry->quality_bar_tt);
++ evas_object_size_hint_weight_set(qualitybar, EVAS_HINT_EXPAND, 0);
++ evas_object_size_hint_align_set(qualitybar, EVAS_HINT_FILL, 0);
++ elm_table_pack(table, qualitybar, 2, row, 4, 1);
++ row++;
++ }
++
++ if (pinentry->repeat_passphrase)
++ {
++ /* Repeat Label */
++ obj = elm_label_add(table);
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype,
++ pinentry->repeat_passphrase);
++ elm_object_text_set(obj,txt);
++ free (txt);
++ evas_object_size_hint_weight_set(obj, 0, EVAS_HINT_EXPAND);
++ evas_object_size_hint_align_set(obj, 1, EVAS_HINT_FILL);
++ elm_table_pack(table, obj, 1, row, 1, 1);
++ evas_object_show(obj);
++
++ repeat_entry = elm_entry_add(table);
++ elm_entry_scrollable_set(repeat_entry, EINA_TRUE);
++ elm_scroller_policy_set(repeat_entry,
++ ELM_SCROLLER_POLICY_OFF,
++ ELM_SCROLLER_POLICY_OFF);
++ elm_entry_password_set(repeat_entry, EINA_TRUE);
++ elm_entry_single_line_set(repeat_entry, EINA_TRUE);
++ evas_object_size_hint_weight_set(repeat_entry, 0, 0);
++ evas_object_size_hint_align_set(repeat_entry, EVAS_HINT_FILL, 0);
++ elm_table_pack(table, repeat_entry, 2, row, 4, 1);
++ evas_object_smart_callback_add (repeat_entry, "activated",
++ enter_callback, NULL);
++ evas_object_show(repeat_entry);
++ evas_object_smart_callback_add (entry,
++ "activated",
++ enter_callback,
++ repeat_entry);
++ evas_object_smart_callback_add(repeat_entry,
++ "activated",
++ on_click,
++ (void *) CONFIRM_OK);
++ row++;
++ }
++ else
++ evas_object_smart_callback_add(entry,
++ "activated",
++ on_click,
++ (void *) CONFIRM_OK);
++ }
++
++ /* Cancel Button */
++ if (!pinentry->one_button)
++ {
++ obj = elm_button_add(table);
++ icon = elm_icon_add (table);
++ evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
++ if (elm_icon_standard_set (icon, "dialog-cancel") ||
++ elm_icon_standard_set (icon, "window-close"))
++ {
++ evas_object_size_hint_min_set(icon,
++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE),
++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE));
++ elm_object_part_content_set(obj, "icon", icon);
++ evas_object_show (icon);
++ }
++ else
++ evas_object_del(icon);
++ if (pinentry->cancel || pinentry->default_cancel)
++ {
++ if(pinentry->cancel)
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->cancel);
++ else
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype,
++ pinentry->default_cancel);
++ if(txt[0]=='_')
++ elm_object_text_set(obj,txt+1);
++ else
++ elm_object_text_set(obj,txt);
++ btn_txt_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5));
++ free (txt);
++ }
++ else
++ elm_object_text_set(obj, "Cancel"); //STOCK_CANCEL
++ evas_object_size_hint_align_set(obj, 0, 0);
++ if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH))
++ evas_object_size_hint_min_set(obj,
++ btn_txt_len,
++ ELM_SCALE_SIZE(BUTTON_HEIGHT));
++ else
++ evas_object_size_hint_min_set(obj,
++ ELM_SCALE_SIZE(BUTTON_WIDTH),
++ ELM_SCALE_SIZE(BUTTON_HEIGHT));
++ elm_table_pack(table, obj, 4, row, 1, 1);
++ evas_object_smart_callback_add(obj,
++ "clicked",
++ on_click,
++ (void *) CONFIRM_CANCEL);
++ evas_object_show(obj);
++ }
++
++ /* OK Button */
++ obj = elm_button_add(table);
++ icon = elm_icon_add (table);
++ evas_object_size_hint_aspect_set (icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
++ if (elm_icon_standard_set (icon, "dialog-ok") ||
++ elm_icon_standard_set (icon, "list-add"))
++ {
++ evas_object_size_hint_min_set(icon,
++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE),
++ ELM_SCALE_SIZE(BUTTON_ICON_SIZE));
++ elm_object_part_content_set(obj, "icon", icon);
++ evas_object_show (icon);
++ }
++ else
++ evas_object_del(icon);
++ if (pinentry->ok || pinentry->default_ok)
++ {
++ if(pinentry->ok)
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->ok);
++ else
++ txt = pinentry_utf8_to_local (pinentry->lc_ctype, pinentry->default_ok);
++ if(txt[0]=='_')
++ elm_object_text_set(obj,txt+1);
++ else
++ elm_object_text_set(obj,txt);
++ ok_len = ELM_SCALE_SIZE(strlen(txt) * (PADDING * 1.5));
++ if(ok_len>btn_txt_len)
++ btn_txt_len = ok_len;
++ free (txt);
++ }
++ else
++ elm_object_text_set(obj,"OK"); //STOCK_OK
++ evas_object_size_hint_align_set(obj, 0, 0);
++ if(btn_txt_len>ELM_SCALE_SIZE(BUTTON_WIDTH))
++ evas_object_size_hint_min_set(obj,
++ btn_txt_len,
++ ELM_SCALE_SIZE(BUTTON_HEIGHT));
++ else
++ evas_object_size_hint_min_set(obj,
++ ELM_SCALE_SIZE(BUTTON_WIDTH),
++ ELM_SCALE_SIZE(BUTTON_HEIGHT));
++ elm_table_pack(table, obj, 5, row, 1, 1);
++ evas_object_smart_callback_add(obj, "clicked", on_click, (void *) CONFIRM_OK);
++ evas_object_show(obj);
++
++ /* Key/Lock Icon */
++ obj = elm_icon_add (win);
++ evas_object_size_hint_aspect_set (obj, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
++ if (elm_icon_standard_set (obj, "dialog-password"))
++ {
++ double ic_size = WIDTH/5;
++ if(row==0)
++ ic_size = ic_size/3.5;
++ else if(row<4)
++ ic_size = ic_size - ic_size/row;
++ evas_object_size_hint_min_set(obj,
++ ELM_SCALE_SIZE(ic_size),
++ ELM_SCALE_SIZE(ic_size));
++ evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
++ evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5);
++ elm_table_pack(table, obj, 0, 0, 1, row? row:1);
++ evas_object_show (obj);
++ }
++ else
++ evas_object_del(obj);
++
++ /* Box for padding */
++ obj = elm_box_add (win);
++ elm_box_pack_end (obj, table);
++ evas_object_show (obj);
++
++ elm_win_resize_object_add(win,obj);
++ evas_object_show(win);
++
++ if(entry)
++ elm_object_focus_set (entry, EINA_TRUE);
++
++ if (pinentry->timeout > 0)
++ timer = ecore_timer_add (pinentry->timeout,
++ (Ecore_Task_Cb)timeout_cb,
++ pinentry);
++}
++
++static int
++efl_cmd_handler (pinentry_t pe)
++{
++ int want_pass = !!pe->pin;
++
++ got_input = EINA_FALSE;
++ pinentry = pe;
++ confirm_value = CONFIRM_CANCEL;
++ passphrase_ok = 0;
++ confirm_mode = want_pass ? 0 : 1;
++ /* init ecore-x explicitly using DISPLAY since this can launch
++ * from console
++ */
++ if (pe->display)
++ ecore_x_init (pe->display);
++ elm_init (pargc, pargv);
++ create_window ();
++ ecore_main_loop_begin ();
++
++ if (timer)
++ {
++ ecore_timer_del (timer);
++ timer = NULL;
++ }
++
++ if (confirm_value == CONFIRM_CANCEL || grab_failed)
++ pe->canceled = 1;
++
++ pinentry = NULL;
++ if (want_pass)
++ {
++ if (passphrase_ok && pe->pin)
++ return strlen (pe->pin);
++ else
++ return -1;
++ }
++ else
++ return (confirm_value == CONFIRM_OK) ? 1 : 0;
++}
++
++int
++main (int argc, char *argv[])
++{
++ pinentry_init (PGMNAME);
++
++#ifdef FALLBACK_CURSES
++ if (pinentry_have_display (argc, argv))
++ {
++#endif
++
++ pinentry_cmd_handler = efl_cmd_handler;
++ pargc = argc;
++ pargv = argv;
++
++#ifdef FALLBACK_CURSES
++ }
++ else
++ {
++ pinentry_cmd_handler = curses_cmd_handler;
++ }
++#endif
++
++ pinentry_parse_opts (argc, argv);
++ if (pinentry_loop ())
++ return 1;
++
++ return 0;
++}
+--
+2.8.0.rc3
+
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index e158df2000..03db842531 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -1983,6 +1983,31 @@ transfers.")
`(("python2-futures" ,python2-futures)
,@(package-native-inputs base))))))
+(define-public python-slimit
+ (package
+ (name "python-slimit")
+ (version "0.8.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "slimit" version ".zip"))
+ (sha256
+ (base32
+ "02vj2x728rs1127q2nc27frrqra4fczivnb7gch6n5lzi7pxqczl"))))
+ (build-system python-build-system)
+ (native-inputs
+ `(("unzip" ,unzip)))
+ (propagated-inputs
+ `(("python-ply" ,python-ply)))
+ (home-page "https://slimit.readthedocs.io/")
+ (synopsis "JavaScript minifier, parser and lexer written in Python")
+ (description
+ "SlimIt is a JavaScript minifier written in Python. It compiles
+JavaScript into more compact code so that it downloads and runs faster.
+SlimIt also provides a library that includes a JavaScript parser, lexer,
+pretty printer and a tree visitor.")
+ (license license:expat)))
+
(define-public python-flask-restful
(package
(name "python-flask-restful")
@@ -2168,6 +2193,25 @@ It comes with safe defaults and easily configurable options.")
(define-public python2-flask-htmlmin
(package-with-python2 python-flask-htmlmin))
+(define-public python-jsmin
+ (package
+ (name "python-jsmin")
+ (version "2.2.2")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "jsmin" version))
+ (sha256
+ (base32
+ "0fsmqbjvpxvff0984x7c0y8xmf49ax9mncz48b9xjx8wrnr9kpxn"))))
+ (build-system python-build-system)
+ (home-page "https://github.com/tikitu/jsmin/")
+ (synopsis "Python JavaScript minifier")
+ (description
+ "@code{jsmin} is a JavaScript minifier, usable from both Python code and
+on the command line.")
+ (license license:expat)))
+
(define-public python-flask-login
(package
(name "python-flask-login")
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 07ab0e5293..52c130e1f3 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -14667,3 +14667,25 @@ on regular expressions.")
"This module implements the PRECIS Framework as described in RFC 8264,
RFC 8265 and RFC 8266.")
(license license:expat)))
+
+(define-public python-wikidata
+ (package
+ (name "python-wikidata")
+ (version "0.6.1")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "Wikidata" version))
+ (sha256
+ (base32
+ "08nlnydddfp1jj0cdmshvld1irzngbp3dij928wqsg9ziklm6mw9"))))
+ (build-system python-build-system)
+ (propagated-inputs
+ `(("python-babel" ,python-babel)))
+ (home-page "https://github.com/dahlia/wikidata")
+ (synopsis "Wikidata client library")
+ (description
+ "This package provides a Python interface to
+@url{https://www.wikidata.org/, Wikidata}.")
+ (properties '((upstream-name . "Wikidata")))
+ (license license:gpl3+)))
diff --git a/gnu/services/games.scm b/gnu/services/games.scm
index b9d78e078d..b743f6a4b6 100644
--- a/gnu/services/games.scm
+++ b/gnu/services/games.scm
@@ -65,7 +65,8 @@
(modules '((gnu build shepherd)))
(start #~(make-forkexec-constructor/container
(list #$(file-append package "/bin/wesnothd")
- "-p" #$(number->string port))))
+ "-p" #$(number->string port))
+ #:user "wesnothd" #:group "wesnothd"))
(stop #~(make-kill-destructor)))))))
(define wesnothd-service-type