{ config, pkgs, lib, ... }:

{
  # Example: https://github.com/nix-community/home-manager/issues/284#issuecomment-1321199263
  # https://the-empire.systems/nixos-gnome-settings-and-keyboard-shortcuts
  # https://hoverbear.org/blog/declarative-gnome-configuration-in-nixos/
  #
  # Search for packaged extensions: https://search.nixos.org/packages?channel=23.05&from=0&size=50&sort=relevance&type=packages&query=gnomeExtensions
  # Add non-packaged extension: https://github.com/nix-community/home-manager/issues/284#issuecomment-531384656
  #
  # One has to re-login after changes: https://github.com/nix-community/home-manager/issues/284#issuecomment-1328269433

  programs.dconf.enable = true;

  users.users.yoda = {
    packages = with pkgs.gnomeExtensions; [
      caffeine
      openweather
    ] ++ (
      if (! config.services.xserver.displayManager.gdm.wayland)
      # If on X11.
      then [ x11-gestures ]
      else []
    );
  };

  # If on X11.
  services.touchegg.enable = lib.mkIf (! config.services.xserver.displayManager.gdm.wayland) true; # Dependency of x11-gestures.

  home-manager.users.yoda = { osConfig, config, pkgs, ... }: {
# TODO: Alternative
#    home.packages = with pkgs.gnomeExtensions; [
#      caffeine
#      openweather
#    ];

    dconf.settings = {
      # Enable GNOME extensions.
      "org/gnome/shell" = {
        disable-user-extensions = false;
        enabled-extensions = [
          pkgs.gnomeExtensions.caffeine.extensionUuid
          pkgs.gnomeExtensions.openweather.extensionUuid
          pkgs.gnomeExtensions.x11-gestures.extensionUuid
        ];
        # TODO: Alternative to the above
        # enabled-extensions = map (extension: extension.extensionUuid) home.packages;
      };

      # Configure openweather extension.
      "org/gnome/shell/extensions/openweather" = {
        city = "49.60113,10.98816>Erlangen>0";
      };
    };
  };
}
