{
  lib,
  stdenv,
  fetchFromGitHub,
  meson,
  ninja,
  scdoc,
  pkg-config,
  wrapGAppsHook3,
  gtk3,
  pam,
  gtk-session-lock,
  runCommand,
}:

stdenv.mkDerivation (finalAttrs: {
  pname = "gtklock";
  # Must run nixpkgs-review between version changes
  version = "4.0.0";

  src = fetchFromGitHub {
    owner = "jovanlanik";
    repo = "gtklock";
    rev = "v${finalAttrs.version}";
    hash = "sha256-e/JRJtQAyIvQhL5hSbY7I/f12Z9g2N0MAHQvX+aXz8Q=";
  };

  nativeBuildInputs = [
    meson
    ninja
    scdoc
    pkg-config
    wrapGAppsHook3
  ];

  buildInputs = [
    gtk3
    pam
    gtk-session-lock
  ];

  strictDeps = true;

  passthru.testModule =
    module:
    runCommand "${module.name}-test.sh" { } ''
      MODULE_PATH=$(find ${module}/lib/gtklock -maxdepth 1 -name '*.so')
      echo -e "[main]\nmodules=''${MODULE_PATH}" >./config.ini
      ${finalAttrs.finalPackage}/bin/gtklock --config ./config.ini >./log 2>&1 || true
      if grep incompatible ./log; then
        echo "${module.name} is incompatible with current ${finalAttrs.finalPackage.name}!"
        exit 1
      else
        echo "Successfully tested ${module.name} against ${finalAttrs.finalPackage.name}."
      fi
      touch $out
    '';

  meta = {
    description = "GTK-based lockscreen for Wayland";
    longDescription = ''
      Important note: for gtklock to work you need to set "security.pam.services.gtklock = {};" manually.
      Otherwise you'll lock youself out of desktop and unable to authenticate.
    ''; # Following  nixpkgs/pkgs/applications/window-managers/sway/lock.nix
    homepage = "https://github.com/jovanlanik/gtklock";
    license = lib.licenses.gpl3Only;
    maintainers = with lib.maintainers; [
      dit7ya
      aleksana
    ];
    platforms = lib.platforms.linux;
    mainProgram = "gtklock";
  };
})