GNOME: Difference between revisions

From NixOS Wiki
imported>Vater
No edit summary
Klinger (talk | contribs)
(29 intermediate revisions by 13 users not shown)
Line 1: Line 1:
[https://gnome.org/ {{PAGENAME}}] ([[wikipedia:en:{{PAGENAME}}]]) is available as a [[module]] (and also especially as a module for <code>services.xserver.desktopManager</code>).
[[{{PAGENAME}}]] (/(ɡ)noʊm/) is a [[:Category:Desktop environment|desktop environment]] known for its focus on being simple, intuitive, and easy to use. It is made by The GNOME Project and is composed entirely of free and open-source software. Its Mutter compositor supports both [[Wayland]] and X server, and the GNOME Shell user interface is customizable by extensions.


[[{{PAGENAME}}]] (/(ɡ)noʊm/) is a [[desktop environment]] that aims to be simple and easy to use. It is designed by The GNOME Project and is composed entirely of free and open-source software. GNOME is a part of the GNU Project.
This article is an extension of the documentation in the [https://nixos.org/manual/nixos/stable/#chap-gnome NixOS manual].


== Installing GNOME ==
[https://gnome.org/ {{PAGENAME}}] is available as a [[module]] and can be enabled with <code>services.xserver.desktopManager</code>.


To use GNOME, add this to your configuration.nix:
== Installation ==


<syntaxHighlight lang=nix>
To use GNOME, add this to your <code>configuration.nix</code>:
services.xserver.enable = true;
 
services.xserver.displayManager.gdm.enable = true;
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
services.xserver.desktopManager.gnome.enable = true;
{
</syntaxHighlight>
  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
}
</nowiki>}}
 
=== Excluding GNOME Applications ===
 
To exclude certain applications that are installed by default with GNOME edit <code>configuration.nix</code> as follows:
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
  environment.gnome.excludePackages = (with pkgs; [
    # for packages that are pkgs.*
    gnome-tour
    gnome-connections
  ]) ++ (with pkgs.gnome; [
    # for packages that are pkgs.gnome.*
    epiphany # web browser
    geary # email reader
    evince # document viewer
  ]);
}
</nowiki>}}
 
== Configuration ==
 
=== Managing extensions ===
 
GNOME extensions are managed and configured by the program "Extensions" that comes with GNOME. Some of them can be installed with Nix, however they aren't enabled by default. To enable them the "Extensions" program can be used.
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
  environment.systemPackages = with pkgs.gnomeExtensions; [
    blur-my-shell
    pop-shell
    # ...
  ];
}
</nowiki>}}
 
Installed extensions can be enabled and configured in Extension app that comes preinstalled with GNOME. If you want to do that declaratively in your configuration, you can use [[Home Manager]] <code>dconf</code> module by adding following lines.
 
{{file|~/.config/home-manager/home.nix|nix|<nowiki>
{
  dconf = {
    enable = true;
    settings = {
      "org/gnome/shell" = {
        disable-user-extensions = false; # enables user extensions
        enabled-extensions = [
          # Put UUIDs of extensions that you want to enable here.
          # If the extension you want to enable is packaged in nixpkgs,
          # you can easily get its UUID by accessing its extensionUuid
          # field (look at the following example).
          pkgs.gnomeExtensions.gsconnect.extensionUuid
         
          # Alternatively, you can manually pass UUID as a string. 
          "blur-my-shell@aunetx"
          # ...
        ];
      };
 
      # Configure individual extensions
      "org/gnome/shell/extensions/blur-my-shell" = {
        brightness = 0.75;
        noise-amount = 0;
      };
    };
  };
}
</nowiki>}}
 
=== dconf settings ===
 
Most of the GNOME settings are stored in [https://en.wikipedia.org/wiki/Dconf dconf] database. Settings are stored as keys placed in folders.
 
To learn about settings that can be configured with dconf either look into <code>dconf-editor</code> program (provided by <code>gnome.dconf-editor</code> package) or type <code>dconf watch /</code> in the terminal and change settings from the GUI and see which options are responsible for that component/element.
 
These settings can be changed by NixOS via <code>programs.dconf</code> module or by [[Home Manager]] via <code>dconf</code> module. To so in Home Manager, you need to change <code>dconf.settings</code> attribute set. This attribute set contains absolute folder paths (without leading slash) as attributes' names which value is another attribute set with keys (settings).
 
For example, to change the value of <code>clock-show-weekday</code> key that is located in <code>/org/gnome/desktop/interface</code>, you need to the following:
 
{{file|~/.config/home-manager/home.nix|nix|<nowiki>
{
  dconf.settings = {
    enable = true;
 
    # You need quotes to escape '/'
    "org/gnome/desktop/interface" = {
      clock-show-weekday = true;
    };
  };
}
</nowiki>}}
 
Same can be achieved by using system configuration.
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
  programs.dconf = {
    enable = true;
    profiles.user.databases = [
      {
        lockAll = true; # prevents overriding
        settings = {
          "org/gnome/desktop/interface" = {
            clock-show-weekday = true;
          };
        };
      }
    ];
  };
}
</nowiki>}}
 
{{Note|Since dconf have more data types than Nix language (for example, tuples), in some cases you'll need to convert Nix value to a GVariant value. You can achieve that by using function defined in <code>lib.gvariant</code>, they're documented [https://nixos.org/manual/nixpkgs/stable/#sec-functions-library-gvariant here].}}
 
=== Dark mode ===


== Excluding some GNOME applications from the default install ==
Change default color theme for all GTK4 applications to dark using [[Home Manager]].


Not all applications that come pre-installed with the GNOME desktop environment are desirable for everyone to have on their machines. There's a way to edit {{inline Command|configuration.nix}} to exclude these kinds of packages, for example as follows:
{{file|~/.config/home-manager/home.nix|nix|<nowiki>
{
  dconf = {
    enable = true;
    settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
  };
}
</nowiki>}}


<syntaxHighlight lang=nix>
== Tips and tricks ==
environment.gnome.excludePackages = (with pkgs; [
  gnome-photos
  gnome-tour
]) ++ (with pkgs.gnome; [
  cheese # webcam tool
  gnome-music
  gnome-terminal
  gedit # text editor
  epiphany # web browser
  geary # email reader
  evince # document viewer
  gnome-characters
  totem # video player
  tali # poker game
  iagno # go game
  hitori # sudoku game
  atomix # puzzle game
]);
</syntaxHighlight>


== Running GNOME programs outside of GNOME ==
=== To run GNOME programs outside of GNOME ===


While we are packaging GNOME platform-based applications to be largely [https://nixos.org/nixpkgs/manual/#sec-language-gnome self-contained], they still depend, for one reason or another, on some global configuration. The {{ic|gnome.nix}} module sets all the necessary options for you but if you are running customized set-up, you might need to replicate that yourself.
GNOME platform-based applications are largely [https://nixos.org/nixpkgs/manual/#sec-language-gnome self-contained], but they still depend, for one reason or another, on some global configuration. The {{ic|gnome.nix}} module sets all the necessary options for you but if you are running customized set-up, you might need to replicate that yourself.


For instance, if you see the following error:
For instance, if you see the following error:


<syntaxHighlight>
<syntaxhighlight lang="text">
dconf-WARNING **: failed to commit changes to dconf: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files
dconf-WARNING **: failed to commit changes to dconf: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files
</syntaxHighlight>
</syntaxhighlight>


you should enable dconf module:
you should enable dconf module:


<syntaxHighlight lang=nix>
<syntaxHighlight lang="nix">
programs.dconf.enable = true;
{
  programs.dconf.enable = true;
}
</syntaxHighlight>
</syntaxHighlight>


Many applications rely heavily on having an icon theme available, GNOME’s Adwaita is a good choice but most recent icon themes should work as well.
Many applications rely heavily on having an icon theme available, GNOME’s Adwaita is a good choice but most recent icon themes should work as well.


<syntaxHighlight lang=nix>
<syntaxHighlight lang="nix">
environment.systemPackages = [ gnome.adwaita-icon-theme ];
{
  environment.systemPackages = with pkgs; [ gnome.adwaita-icon-theme ];
}
</syntaxHighlight>
</syntaxHighlight>


== Managing extensions ==
=== Systray Icons ===


GNOME extensions are managed and configured by the program "Extension" that comes with GNOME.
To get systray icons, install the related GNOME shell extension


Extensions to be installed system-wide by adding them to NixOS configuration in {{ic|environment.systemPackages}} or per-user, or from the GNOME extensions website using a Web browser extension.
<syntaxHighlight lang="nix">
{
  environment.systemPackages = [ pkgs.gnomeExtensions.appindicator ];
}
</syntaxHighlight>


== Systray Icons ==
And ensure gnome-settings-daemon udev rules are enabled:


To get systray icons, install the related gnome shell extension
<syntaxHighlight lang="nix">
{
  services.udev.packages = [ pkgs.gnome.gnome-settings-daemon ];
}
</syntaxHighlight>
 
=== To run old applications ===
 
Some old applications use GConf service to store configuration. This has been deprecated for many years but some applications were abandoned before they managed to upgrade to a newer dconf system. If you are running such application and getting an error like:


<syntaxHighlight lang=nix>
<syntaxHighlight lang="text">
environment.systemPackages = with pkgs; [ gnomeExtensions.appindicator ];
GLib.GException: Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information
</syntaxHighlight>
</syntaxHighlight>


And ensure gnome-settings-daemon udev rules are enabled :
you need to add {{ic|gnome2.GConf}} to the list of dbus packages in your {{ic|configuration.nix}}:


<syntaxHighlight lang=nix>
<syntaxHighlight lang="nix">
services.udev.packages = with pkgs; [ gnome.gnome-settings-daemon ];
{
  services.dbus.packages = with pkgs; [ gnome2.GConf ];
}
</syntaxHighlight>
</syntaxHighlight>


== Running ancient applications ==
After applying the update restart your desktop session to refresh the user-specific dbus session.


Long ago, in the GNOME 2 era, applications used GConf service to store configuration. This has been deprecated for many years but some applications were abandoned before they managed to upgrade to a newer dconf system. If you are running such application and getting an error like:
=== Dynamic triple buffering ===


<syntaxHighlight>
{{Warning|Dynamic triple buffering is a still developing feature that is not merged into GNOME's mutter. Some bugs and unexpected behavior can occur. Use at your own risk!}}
GLib.GException: Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information
 
Big [https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1441 merge request] against Mutter improves the performance of the window manager by a lot (and is already used by Ubuntu). Not merged into nixpkgs due to [https://github.com/NixOS/nixpkgs/issues/197181 philosophy of nixpkgs], but users are free to add this overlay to get it too.
 
If you wish to try this patch for yourself, add the following to your NixOS configuration:
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
  nixpkgs.overlays = [
    # GNOME 46: triple-buffering-v4-46
    (final: prev: {
      gnome = prev.gnome.overrideScope (gnomeFinal: gnomePrev: {
        mutter = gnomePrev.mutter.overrideAttrs (old: {
          src = pkgs.fetchFromGitLab  {
            domain = "gitlab.gnome.org";
            owner = "vanvugt";
            repo = "mutter";
            rev = "triple-buffering-v4-46";
            hash = "sha256-fkPjB/5DPBX06t7yj0Rb3UEuu5b9mu3aS+jhH18+lpI=";
          };
        });
      });
    })
  ];
}
</nowiki>}}
 
You might need to disable aliases to make it work:
 
<syntaxHighlight lang="nix">
  nixpkgs.config.allowAliases = false;
</syntaxHighlight>'''NOTE''' - the "allowAliases" set to false has been known to break stylix (if you use it).
 
=== Profiling (with sysprof) ===
 
Install {{ic|sysprof}} as a ''system'' package (it won't work properly if installed against users). Then enable the associated service with
 
<syntaxHighlight lang="nix">
  services.sysprof.enable = true;
</syntaxHighlight>
</syntaxHighlight>


you need to add {{ic|gnome2.GConf}} to the list of dbus packages in your {{ic|configuration.nix}}:
=== Automatic screen rotation ===


<syntaxHighlight lang=nix>
<syntaxHighlight lang="nix">
services.dbus.packages = with pkgs; [ gnome2.GConf ];
  hardware.sensor.iio.enable = true;
</syntaxHighlight>
</syntaxHighlight>
After applying the update one also has restart their desktop session to refresh the user-specific dbus session.


== Troubleshoots ==
== Troubleshoots ==


=== Change user's profile picture ===
=== Change user's profile picture ===
Currently there is no way to change the user's profile picture using Gnome Control Center [https://github.com/NixOS/nixpkgs/issues/10025 (see this issue)] and currently there is no plan to support it officially in NixOS.
Currently there is no way to change the user's profile picture using Gnome Control Center [https://github.com/NixOS/nixpkgs/issues/10025 (see this issue)] and currently there is no plan to support it officially in NixOS. However, you can modify it by copying the profile picture that you want to the path '''/home/$USER/.face''' as a workaround, i.e.
However, you can modify it by copying the profile picture that you want to the path '''/home/$USER/.face''' as a workaround, i.e.


<syntaxHighlight lang=sh>
<syntaxHighlight lang="console">
mv /path/to/image.jpg ~/.face
$ mv /path/to/image.jpg ~/.face
</syntaxHighlight>
</syntaxHighlight>


=== automatic login ===
==== Change Profile Photo for Login and Lockscreen - Declarative ====
This is admittedly a hack way of doing it, however does work.
 
Considerations:
 
* image must be a PNG
* permissions matter
* this is absolutely a workaround
* assumes you are already using a .face file
* you will need to update the paths and username as applicable to your system (CAPITALIZED in the code)
* you cannot change the photo using Gnome Control Center
 
 
You can place this in your configuration.nix:<syntaxhighlight lang="nix">
system.activationScripts.script.text = ''
    mkdir -p /var/lib/AccountsService/{icons,users}
    cp /home/YOUR-USER-NAME/PATH-TO/.face /var/lib/AccountsService/icons/YOUR-USER-NAME
    echo -e "[User]\nIcon=/var/lib/AccountsService/icons/YOUR-USER-NAME\n" > /var/lib/AccountsService/users/YOUR-USER-NAME
 
    chown root:root /var/lib/AccountsService/users/YOUR-USER-NAME
    chmod 0600 /var/lib/AccountsService/users/YOUR-USER-NAME
 
    chown root:root /var/lib/AccountsService/icons/YOUR-USER-NAME
    chmod 0444 /var/lib/AccountsService/icons/YOUR-USER-NAME
'';
</syntaxhighlight>
 
=== Automatic login ===


If you have enabled [https://help.gnome.org/admin/system-admin-guide/stable/login-automatic.html.en auto login] (with <!-- [[GDM]] -->[[{{PAGENAME}}]]) with something like
If you have enabled [https://help.gnome.org/admin/system-admin-guide/stable/login-automatic.html.en auto login] (with <!-- [[GDM]] -->[[{{PAGENAME}}]]) with something like
: <syntaxHighlight lang=bash>grep autoLogin /etc/nixos/configuration.nix</syntaxHighlight>
: <syntaxHighlight lang="console">
<syntaxHighlight lang=bash>
$ grep autoLogin /etc/nixos/configuration.nix
</syntaxHighlight>
<syntaxHighlight lang="nix">
services.xserver.displayManager.autoLogin.enable = true;
services.xserver.displayManager.autoLogin.enable = true;
services.xserver.displayManager.autoLogin.user = "account";
services.xserver.displayManager.autoLogin.user = "account";
</syntaxHighlight>
</syntaxHighlight>
than add the following (as a workaround for a current (2023)<ref>https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229</ref> problem)
than add the following (as a workaround for a current (2023)<ref>https://github.com/NixOS/nixpkgs/issues/103746#issuecomment-945091229</ref> problem)
: <syntaxHighlight lang=bash>nano /etc/nixos/configuration.nix</syntaxHighlight>
: <syntaxHighlight lang="console"># nano /etc/nixos/configuration.nix</syntaxHighlight>
<syntaxHighlight lang=nix>
<syntaxHighlight lang="nix">
systemd.services."getty@tty1".enable = false;
{
systemd.services."autovt@tty1".enable = false;
  systemd.services."getty@tty1".enable = false;
  systemd.services."autovt@tty1".enable = false;
}
</syntaxHighlight>
</syntaxHighlight>
.
== Also see ==


[[GNOME/Calendar]]
== See also ==
* [[GNOME/Calendar]]


[[Category:Desktop environments]]
[[Category:Desktop environment]]
[[Category:Applications]]
[[Category:Applications]]
[[Category:NixOS Manual]]
[[Category:GNOME]]

Revision as of 19:55, 13 September 2024

GNOME (/(ɡ)noʊm/) is a desktop environment known for its focus on being simple, intuitive, and easy to use. It is made by The GNOME Project and is composed entirely of free and open-source software. Its Mutter compositor supports both Wayland and X server, and the GNOME Shell user interface is customizable by extensions.

This article is an extension of the documentation in the NixOS manual.

GNOME is available as a module and can be enabled with services.xserver.desktopManager.

Installation

To use GNOME, add this to your configuration.nix:

/etc/nixos/configuration.nix
{
  services.xserver.enable = true;
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;
}

Excluding GNOME Applications

To exclude certain applications that are installed by default with GNOME edit configuration.nix as follows:

/etc/nixos/configuration.nix
{
  environment.gnome.excludePackages = (with pkgs; [
    # for packages that are pkgs.*
    gnome-tour
    gnome-connections
  ]) ++ (with pkgs.gnome; [
    # for packages that are pkgs.gnome.*
    epiphany # web browser
    geary # email reader
    evince # document viewer
  ]);
}

Configuration

Managing extensions

GNOME extensions are managed and configured by the program "Extensions" that comes with GNOME. Some of them can be installed with Nix, however they aren't enabled by default. To enable them the "Extensions" program can be used.

/etc/nixos/configuration.nix
{
  environment.systemPackages = with pkgs.gnomeExtensions; [
    blur-my-shell
    pop-shell
    # ...
  ];
}

Installed extensions can be enabled and configured in Extension app that comes preinstalled with GNOME. If you want to do that declaratively in your configuration, you can use Home Manager dconf module by adding following lines.

~/.config/home-manager/home.nix
{
  dconf = {
    enable = true;
    settings = {
      "org/gnome/shell" = {
        disable-user-extensions = false; # enables user extensions
        enabled-extensions = [
          # Put UUIDs of extensions that you want to enable here.
          # If the extension you want to enable is packaged in nixpkgs,
          # you can easily get its UUID by accessing its extensionUuid
          # field (look at the following example).
          pkgs.gnomeExtensions.gsconnect.extensionUuid
          
          # Alternatively, you can manually pass UUID as a string.  
          "blur-my-shell@aunetx"
          # ...
        ];
      };

      # Configure individual extensions
      "org/gnome/shell/extensions/blur-my-shell" = {
        brightness = 0.75;
        noise-amount = 0;
      };
    };
  };
}

dconf settings

Most of the GNOME settings are stored in dconf database. Settings are stored as keys placed in folders.

To learn about settings that can be configured with dconf either look into dconf-editor program (provided by gnome.dconf-editor package) or type dconf watch / in the terminal and change settings from the GUI and see which options are responsible for that component/element.

These settings can be changed by NixOS via programs.dconf module or by Home Manager via dconf module. To so in Home Manager, you need to change dconf.settings attribute set. This attribute set contains absolute folder paths (without leading slash) as attributes' names which value is another attribute set with keys (settings).

For example, to change the value of clock-show-weekday key that is located in /org/gnome/desktop/interface, you need to the following:

~/.config/home-manager/home.nix
{
  dconf.settings = {
    enable = true;

    # You need quotes to escape '/'
    "org/gnome/desktop/interface" = {
      clock-show-weekday = true;
    };
  };
}

Same can be achieved by using system configuration.

/etc/nixos/configuration.nix
{
  programs.dconf = {
    enable = true;
    profiles.user.databases = [
      {
        lockAll = true; # prevents overriding
        settings = {
          "org/gnome/desktop/interface" = {
            clock-show-weekday = true;
          };
        };
      }
    ];
  };
}
Note: Since dconf have more data types than Nix language (for example, tuples), in some cases you'll need to convert Nix value to a GVariant value. You can achieve that by using function defined in lib.gvariant, they're documented here.

Dark mode

Change default color theme for all GTK4 applications to dark using Home Manager.

~/.config/home-manager/home.nix
{
  dconf = {
    enable = true;
    settings."org/gnome/desktop/interface".color-scheme = "prefer-dark";
  };
}

Tips and tricks

To run GNOME programs outside of GNOME

GNOME platform-based applications are largely self-contained, but they still depend, for one reason or another, on some global configuration. The gnome.nix module sets all the necessary options for you but if you are running customized set-up, you might need to replicate that yourself.

For instance, if you see the following error:

dconf-WARNING **: failed to commit changes to dconf: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name ca.desrt.dconf was not provided by any .service files

you should enable dconf module:

{
  programs.dconf.enable = true;
}

Many applications rely heavily on having an icon theme available, GNOME’s Adwaita is a good choice but most recent icon themes should work as well.

{
  environment.systemPackages = with pkgs; [ gnome.adwaita-icon-theme ];
}

Systray Icons

To get systray icons, install the related GNOME shell extension

{
  environment.systemPackages = [ pkgs.gnomeExtensions.appindicator ];
}

And ensure gnome-settings-daemon udev rules are enabled:

{
  services.udev.packages = [ pkgs.gnome.gnome-settings-daemon ];
}

To run old applications

Some old applications use GConf service to store configuration. This has been deprecated for many years but some applications were abandoned before they managed to upgrade to a newer dconf system. If you are running such application and getting an error like:

GLib.GException: Failed to contact configuration server; the most common cause is a missing or misconfigured D-Bus session bus daemon. See http://projects.gnome.org/gconf/ for information

you need to add gnome2.GConf to the list of dbus packages in your configuration.nix:

{
  services.dbus.packages = with pkgs; [ gnome2.GConf ];
}

After applying the update restart your desktop session to refresh the user-specific dbus session.

Dynamic triple buffering

Warning: Dynamic triple buffering is a still developing feature that is not merged into GNOME's mutter. Some bugs and unexpected behavior can occur. Use at your own risk!

Big merge request against Mutter improves the performance of the window manager by a lot (and is already used by Ubuntu). Not merged into nixpkgs due to philosophy of nixpkgs, but users are free to add this overlay to get it too.

If you wish to try this patch for yourself, add the following to your NixOS configuration:

/etc/nixos/configuration.nix
{
  nixpkgs.overlays = [
    # GNOME 46: triple-buffering-v4-46
    (final: prev: {
      gnome = prev.gnome.overrideScope (gnomeFinal: gnomePrev: {
        mutter = gnomePrev.mutter.overrideAttrs (old: {
          src = pkgs.fetchFromGitLab  {
            domain = "gitlab.gnome.org";
            owner = "vanvugt";
            repo = "mutter";
            rev = "triple-buffering-v4-46";
            hash = "sha256-fkPjB/5DPBX06t7yj0Rb3UEuu5b9mu3aS+jhH18+lpI=";
          };
        });
      });
    })
  ];
}

You might need to disable aliases to make it work:

  nixpkgs.config.allowAliases = false;

NOTE - the "allowAliases" set to false has been known to break stylix (if you use it).

Profiling (with sysprof)

Install sysprof as a system package (it won't work properly if installed against users). Then enable the associated service with

  services.sysprof.enable = true;

Automatic screen rotation

  hardware.sensor.iio.enable = true;

Troubleshoots

Change user's profile picture

Currently there is no way to change the user's profile picture using Gnome Control Center (see this issue) and currently there is no plan to support it officially in NixOS. However, you can modify it by copying the profile picture that you want to the path /home/$USER/.face as a workaround, i.e.

$ mv /path/to/image.jpg ~/.face

Change Profile Photo for Login and Lockscreen - Declarative

This is admittedly a hack way of doing it, however does work.

Considerations:

  • image must be a PNG
  • permissions matter
  • this is absolutely a workaround
  • assumes you are already using a .face file
  • you will need to update the paths and username as applicable to your system (CAPITALIZED in the code)
  • you cannot change the photo using Gnome Control Center


You can place this in your configuration.nix:

system.activationScripts.script.text = ''
    mkdir -p /var/lib/AccountsService/{icons,users}
    cp /home/YOUR-USER-NAME/PATH-TO/.face /var/lib/AccountsService/icons/YOUR-USER-NAME
    echo -e "[User]\nIcon=/var/lib/AccountsService/icons/YOUR-USER-NAME\n" > /var/lib/AccountsService/users/YOUR-USER-NAME

    chown root:root /var/lib/AccountsService/users/YOUR-USER-NAME
    chmod 0600 /var/lib/AccountsService/users/YOUR-USER-NAME

    chown root:root /var/lib/AccountsService/icons/YOUR-USER-NAME
    chmod 0444 /var/lib/AccountsService/icons/YOUR-USER-NAME
'';

Automatic login

If you have enabled auto login (with GNOME) with something like

$ grep autoLogin /etc/nixos/configuration.nix
services.xserver.displayManager.autoLogin.enable = true;
services.xserver.displayManager.autoLogin.user = "account";

than add the following (as a workaround for a current (2023)[1] problem)

# nano /etc/nixos/configuration.nix
{
  systemd.services."getty@tty1".enable = false;
  systemd.services."autovt@tty1".enable = false;
}

See also