# 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"; }; }; }