{ lib
, stdenv
, fetchurl
, fetchpatch
, autoreconfHook
, pkg-config
, gtk2
, libX11
, libXext
, libXi
, libXtst
, texinfo
, xorgproto
}:

stdenv.mkDerivation (finalAttrs: {
  version = "3.19";
  pname = "xnee";

  src = fetchurl {
    url = "mirror://gnu/xnee/xnee-${finalAttrs.version}.tar.gz";
    hash = "sha256-UqQeXPYvgbej5bWBJOs1ZeHhICir2mP1R/u+DZiiwhI=";
  };

  patches = [
    # Pull fix pending upstream inclusion for -fno-common
    # toolchain support: https://savannah.gnu.org/bugs/?58810
    (fetchpatch {
      name = "fno-common.patch";
      url = "https://savannah.gnu.org/bugs/download.php?file_id=49534";
      hash = "sha256-Ar5SyVIEp8/knDHm+4f0KWAH+A5gGhXGezEqL7xkQhI=";
    })
  ];

  postPatch = ''
    for i in `find cnee/test -name \*.sh`; do
      sed -i "$i" -e's|/bin/bash|${stdenv.shell}|g ; s|/usr/bin/env bash|${stdenv.shell}|g'
    done
  ''
  # Fix for glibc-2.34. For some reason, `LIBSEMA="CCC"` is added
  # if `sem_init` is part of libc which causes errors like
  # `gcc: error: CCC: No such file or directory` during the build.
  + ''
    substituteInPlace configure* \
      --replace 'LIBSEMA="CCC"' 'LIBSEMA=""'
  '';

  strictDeps = true;

  nativeBuildInputs = [
    autoreconfHook
    pkg-config
  ];

  buildInputs = [
    gtk2
    libX11
    libXext
    libXi
    libXtst
    texinfo
    xorgproto
  ];

  configureFlags = [
    "--disable-gnome-applet"
    # Do a static build because `libxnee' doesn't get installed anyway.
    "--enable-static"
  ];

  makeFlags = [
    # `cnee' is linked without `-lXi' and as a consequence has a RUNPATH that
    # lacks libXi.
    "LDFLAGS=-lXi"
  ];

  # error: call to undeclared function 'xnee_check_key';
  # ISO C99 and later do not support implicit function declarations
  env = lib.optionalAttrs stdenv.cc.isClang {
    NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration";
  };

  # XXX: Actually tests require an X server.
  doCheck = true;

  meta = {
    description = "X11 event recording and replay tool";
    longDescription = ''
      Xnee is a suite of programs that can record, replay and distribute
      user actions under the X11 environment.  Think of it as a robot that
      can imitate the job you just did.  Xnee can be used to automate
      tests, demonstrate programs, distribute actions, record & replay
      "macros", retype a file.
    '';
    homepage = "https://www.gnu.org/software/xnee/";
    license = lib.licenses.gpl3Plus;
    maintainers = with lib.maintainers; [ wegank ];
    platforms = lib.platforms.unix;
  };
})
