# vim: ts=2
{
config,
pkgs,
lib,
user_js,
video_pause,
...
}: let
bookmarks = [
{
name = "Feed - Piped";
url = "https://piped.video/feed";
}
{
name = "DeepL Translate";
url = "https://www.deepl.com/translator#en/de/test";
}
{
name = "HM Options";
url = "https://mipmip.github.io/home-manager-option-search/";
}
];
firefoxBookmarksFile = bookmarks: let
indent = level:
lib.concatStringsSep "" (map (lib.const " ") (lib.range 1 level));
bookmarkToHTML = indentLevel: bookmark: ''
${indent indentLevel}
${lib.escapeXML bookmark.name}'';
directoryToHTML = indentLevel: directory: ''
${indent indentLevel}${
if directory.toolbar
then ''Bookmarks Toolbar''
else "${lib.escapeXML directory.name}"
}
${indent indentLevel}
${allItemsToHTML (indentLevel + 1) directory.bookmarks}
${indent indentLevel}
'';
itemToHTMLOrRecurse = indentLevel: item:
if item ? "url"
then bookmarkToHTML indentLevel item
else directoryToHTML indentLevel item;
allItemsToHTML = indentLevel: bookmarks:
lib.concatStringsSep "\n"
(map (itemToHTMLOrRecurse indentLevel) bookmarks);
bookmarkEntries = allItemsToHTML 1 bookmarks;
in
pkgs.writeText "firefox-bookmarks.html" ''
Bookmarks
Bookmarks Menu
Bookmarks Toolbar
${bookmarkEntries}
'';
userChrome = builtins.readFile ./chrome/userChrome.css;
user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./settings/override.js);
user_js_nix = pkgs.runCommand "user.js" {} ''
mkdir $out;
cat "${user_js}/user.js" > $out/user.js;
cat "${user_js_override}" >> $out/user.js;
cat << EOF >> $out/user.js;
// My bookmarks
user_pref("browser.bookmarks.file", "${toString (firefoxBookmarksFile bookmarks)}");
user_pref("browser.places.importBookmarksHTML", true);
// Allow my custom css
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
// might improve performance TODO
user_pref("gfx.webrender.all", true);
// disable updates (pretty pointless with nix)
user_pref("extensions.update.autoUpdateDefault", false);
user_pref("extensions.update.enabled", false);
user_pref("app.update.channel", "default");
user_pref("browser.ctrlTab.recentlyUsedOrder", false);
user_pref("browser.download.useDownloadDir", true);
user_pref("browser.download.dir", "${config.home.homeDirectory}/media/downloads");
user_pref("browser.download.folderList", 2); # TODO
user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true);
user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true);
user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true);
// TODO what does this do?
user_pref("browser.search.widget.inNavBar", true);
user_pref("browser.shell.checkDefaultBrowser", false);
user_pref("browser.tabs.loadInBackground", true);
user_pref("browser.urlbar.placeholderName", "Brave");
// Set the tabs and bookmarks
user_pref("browser.tabs.inTitlebar", 1);
user_pref("browser.toolbars.bookmarks.visibility", "always");
// Theme
user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
// highlight all entries when searching
user_pref("findbar.highlightAll", true);
// TODO
//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true);
//user_pref("extensions.webcompat.enable_shims", true);
//user_pref("extensions.webcompat.perform_injections", true);
//user_pref("extensions.webcompat.perform_ua_overrides", true);
// onlykey / copied from a yubikey config
//user_pref("security.webauth.u2f", true);
//user_pref("security.webauth.webauthn", true);
//user_pref("security.webauth.webauthn_enable_softtoken", true);
//user_pref("security.webauth.webauthn_enable_usbtoken", true);
EOF
'';
extensions = builtins.map buildFirefoxXpiAddon (
lib.attrValues (
lib.importJSON ./settings/extensions.json
)
);
# source: https://gitlab.com/rycee/nur-expressions/-/blob/master/pkgs/firefox-addons/default.nix
buildFirefoxXpiAddon = {
pname,
version,
addonId,
url,
sha256,
#meta,
...
}:
pkgs.stdenv.mkDerivation {
name = "${pname}-${version}";
#inherit meta;
src = builtins.fetchurl {inherit url sha256;};
preferLocalBuild = true;
allowSubstitutes = true;
buildCommand = ''
dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
mkdir -p "$dst"
install -v -m644 "$src" "$dst/${addonId}.xpi"
'';
};
settings = {};
video-pauser = pkgs.runCommand "video_pause_native_messaging" {} ''
install -d $out/share/
cat << EOF > $out/share/video_pauser.json
{
"name": "video_pauser",
"description": "Pause your Videos with a single key stroke!",
"path": "${video_pause}/bin/video_pause",
"type": "stdio",
"allowed_extensions": ["video-pauser@addons.vhack.eu"]
}
EOF
nativeMessagingPaths=(
/lib/mozilla/native-messaging-hosts
/etc/opt/chrome/native-messaging-hosts
/etc/chromium/native-messaging-hosts
/etc/vivaldi/native-messaging-hosts
/lib/librewolf/native-messaging-hosts
)
for manifestDir in "''${nativeMessagingPaths[@]}"; do
install -d $out$manifestDir
ln -s $out/share/video_pauser.json $out$manifestDir/
done
'';
in {
home.sessionVariables = {
# improve touch input & make scrolling smother
MOZ_USE_XINPUT2 = "1";
# improve wayland support
MOZ_ENABLE_WAYLAND = 1;
};
xdg.mimeApps = {
enable = true;
defaultApplications = {
"text/html" = ["firefox.desktop"];
"x-scheme-handler/http" = ["firefox.desktop"];
"x-scheme-handler/https" = ["firefox.desktop"];
"x-scheme-handler/about" = ["firefox.desktop"];
"x-scheme-handler/unknown" = ["firefox.desktop"];
};
};
programs.firefox = {
enable = true;
package = pkgs.firefox-wayland.override {
extraNativeMessagingHosts = [video-pauser];
};
profiles."default" = {
inherit extensions;
isDefault = true;
id = 0;
name = "default";
inherit userChrome;
search = {
default = "Brave Search";
force = true;
engines = {
"Brave Search" = {
urls = [{template = "https://search.brave.com/search?q={searchTerms}";}];
iconUpdateURL = "https://raw.githubusercontent.com/brave/brave-core/master/components/brave_welcome_ui/components/images/lion_logo.svg";
updateInterval = 24; # every day
definedAliases = ["@bs"];
};
# NIX
"Nix Packages" = {
urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}];
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = ["@np"];
};
"Nix Options" = {
urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}];
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = ["@no"];
};
"NixOS Wiki" = {
urls = [{template = "https://nixos.wiki/index.php?search={searchTerms}";}];
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = ["@nw"];
};
"Arch Wiki" = {
urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}];
iconUpdateURL = "https://upload.wikimedia.org/wikipedia/commons/a/a5/Archlinux-icon-crystal-64.svg";
updateInterval = 24;
definedAliases = ["@aw"];
};
# RUST
"Rust std" = {
urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}];
iconUpdateURL = "https://rustacean.net/assets/rustacean-orig-noshadow.svg";
updateInterval = 24;
definedAliases = ["@rs"];
};
"Google Scholar" = {
urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}];
iconUpdateURL = "https://scholar.google.com/favicon.ico";
updateInterval = 24;
definedAliases = ["@gs"];
};
"Wikipedia" = {
urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}];
iconUpdateURL = "https://upload.wikimedia.org/wikipedia/en/8/80/Wikipedia-logo-v2.svg";
updateInterval = 24;
definedAliases = ["@wp"];
};
"Wikipedia (en)".metaData.hidden = true;
"DuckDuckGo".metaData.hidden = true;
"Bing".metaData.hidden = true;
"Google".metaData.hidden = true;
"Amazon.de".metaData.hidden = true;
};
};
bookmarks = [];
inherit settings;
extraConfig = builtins.readFile "${user_js_nix}/user.js";
};
};
}