summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorEfraim Flashner <efraim@flashner.co.il>2018-11-21 19:41:43 +0200
committerEfraim Flashner <efraim@flashner.co.il>2018-11-21 19:41:43 +0200
commit9cf4ff199cd6114dacd199dcf62976978ef3dd5b (patch)
tree4ad2aeb5ac4cf9c6d9a2e04a446c8ddbca09c0e0 /gnu
parentbf6859e45ad33aa631fc231b23df2d56aff97360 (diff)
parenta2aa746cfe38076b87d9cde2252904c0bddd9f9e (diff)
downloadguix-9cf4ff199cd6114dacd199dcf62976978ef3dd5b.tar.gz
Merge remote-tracking branch 'origin/master' into core-updates
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