Skip to content

Commit

Permalink
gnome-shell: add module
Browse files Browse the repository at this point in the history
  • Loading branch information
tadfisher authored and rycee committed May 6, 2024
1 parent 2b87a11 commit 6ebe7be
Show file tree
Hide file tree
Showing 6 changed files with 224 additions and 0 deletions.
12 changes: 12 additions & 0 deletions modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1595,6 +1595,18 @@ in {
when idle or active. See https://github.com/hyprwm/hypridle for more.
'';
}

{
time = "2024-05-06T07:36:13+00:00";
condition = hostPlatform.isLinux;
message = ''
A new module is available: 'programs.gnome-shell'.
GNOME Shell is the graphical shell of the GNOME desktop environment.
It provides basic functions like launching applications and switching
between windows, and is also a widget engine.
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ let
./programs/git-credential-oauth.nix
./programs/git.nix
./programs/gitui.nix
./programs/gnome-shell.nix
./programs/gnome-terminal.nix
./programs/go.nix
./programs/gpg.nix
Expand Down
115 changes: 115 additions & 0 deletions modules/programs/gnome-shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
{ config, lib, pkgs, ... }:

with lib;
let
cfg = config.programs.gnome-shell;

extensionOpts = { config, ... }: {
options = {
id = mkOption {
type = types.str;
example = "[email protected]";
description = ''
ID of the GNOME Shell extension. If not provided, it
will be obtained from `package.extensionUuid`.
'';
};

package = mkOption {
type = types.package;
example = "pkgs.gnome.gnome-shell-extensions";
description = ''
Package providing a GNOME Shell extension in
`$out/share/gnome-shell/extensions/''${id}`.
'';
};
};

config = mkIf (hasAttr "extensionUuid" config.package) {
id = mkDefault config.package.extensionUuid;
};
};

themeOpts = {
options = {
name = mkOption {
type = types.str;
example = "Plata-Noir";
description = ''
Name of the GNOME Shell theme.
'';
};

package = mkOption {
type = types.nullOr types.package;
default = null;
example = literalExpression "pkgs.plata-theme";
description = ''
Package providing a GNOME Shell theme in
`$out/share/themes/''${name}/gnome-shell`.
'';
};
};
};

in {
meta.maintainers = [ maintainers.terlar ];

options.programs.gnome-shell = {
enable = mkEnableOption "GNOME Shell customization";

extensions = mkOption {
type = types.listOf (types.submodule extensionOpts);
default = [ ];
example = literalExpression ''
[
{ package = pkgs.gnomeExtensions.dash-to-panel; }
{
id = "[email protected]";
package = pkgs.gnome.gnome-shell-extensions;
}
]
'';
description = ''
List of GNOME Shell extensions.
'';
};

theme = mkOption {
type = types.nullOr (types.submodule themeOpts);
default = null;
example = literalExpression ''
{
name = "Plata-Noir";
package = pkgs.plata-theme;
}
'';
description = ''
Theme to use for GNOME Shell.
'';
};
};

config = mkIf cfg.enable (mkMerge [
(mkIf (cfg.extensions != [ ]) {
dconf.settings."org/gnome/shell" = {
disable-user-extensions = false;
enabled-extensions = catAttrs "id" cfg.extensions;
};

home.packages = catAttrs "package" cfg.extensions;
})

(mkIf (cfg.theme != null) {
dconf.settings."org/gnome/shell/extensions/user-theme".name =
cfg.theme.name;

programs.gnome-shell.extensions = [{
id = "[email protected]";
package = pkgs.gnome.gnome-shell-extensions;
}];

home.packages = [ cfg.theme.package ];
})
]);
}
1 change: 1 addition & 0 deletions tests/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ in import nmtSrc {
./modules/programs/freetube
./modules/programs/fuzzel
./modules/programs/getmail
./modules/programs/gnome-shell
./modules/programs/gnome-terminal
./modules/programs/hexchat
./modules/programs/i3blocks
Expand Down
1 change: 1 addition & 0 deletions tests/modules/programs/gnome-shell/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ gnome-shell = ./gnome-shell.nix; }
94 changes: 94 additions & 0 deletions tests/modules/programs/gnome-shell/gnome-shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
{ config, lib, pkgs, ... }:

with lib;

let
dummy-gnome-shell-extensions = pkgs.runCommand "dummy-package" { } ''
mkdir -p $out/share/gnome-shell/extensions/dummy-package
touch $out/share/gnome-shell/extensions/dummy-package/test
'';

test-extension = pkgs.runCommand "test-extension" { } ''
mkdir -p $out/share/gnome-shell/extensions/test-extension
touch $out/share/gnome-shell/extensions/test-extension/test
'';

test-extension-uuid = pkgs.runCommand "test-extension-uuid" {
passthru.extensionUuid = "test-extension-uuid";
} ''
mkdir -p $out/share/gnome-shell/extensions/test-extension-uuid
touch $out/share/gnome-shell/extensions/test-extension-uuid/test
'';

test-theme = pkgs.runCommand "test-theme" { } ''
mkdir -p $out/share/themes/Test/gnome-shell
touch $out/share/themes/Test/gnome-shell/test
'';

expectedEnabledExtensions = [
"[email protected]"
"test-extension"
"test-extension-uuid"
];

actualEnabledExtensions = catAttrs "value"
config.dconf.settings."org/gnome/shell".enabled-extensions.value;

in {
nixpkgs.overlays = [
(self: super: {
gnome = super.gnome.overrideScope (gself: gsuper: {
gnome-shell-extensions = dummy-gnome-shell-extensions;
});
})
];

programs.gnome-shell.enable = true;

programs.gnome-shell.extensions = [
{
id = "test-extension";
package = test-extension;
}
{ package = test-extension-uuid; }
];

programs.gnome-shell.theme = {
name = "Test";
package = test-theme;
};

assertions = [
{
assertion =
config.dconf.settings."org/gnome/shell".disable-user-extensions
== false;
message = "Expected disable-user-extensions to be false.";
}
{
assertion =
all (e: elem e actualEnabledExtensions) expectedEnabledExtensions;
message = ''
Expected enabled-extensions to contain all of:
${toString expectedEnabledExtensions}
But it was:
${toString actualEnabledExtensions}
'';
}
{
assertion =
config.dconf.settings."org/gnome/shell/extensions/user-theme".name
== "Test";
message = "Expected extensions/user-theme/name to be 'Test'.";
}
];

test.stubs.dconf = { };

nmt.script = ''
assertFileExists home-path/share/gnome-shell/extensions/dummy-package/test
assertFileExists home-path/share/gnome-shell/extensions/test-extension/test
assertFileExists home-path/share/gnome-shell/extensions/test-extension-uuid/test
assertFileExists home-path/share/themes/Test/gnome-shell/test
'';
}

0 comments on commit 6ebe7be

Please sign in to comment.