diff --git a/hosts/common/home/mime.nix b/hosts/common/home/mime.nix index 63650aac..49f94bd1 100644 --- a/hosts/common/home/mime.nix +++ b/hosts/common/home/mime.nix @@ -1,14 +1,25 @@ { config, lib, ...}: +let + # ProgramConfig -> { "" = { priority, desktop }; } + weightedMimes = prog: builtins.mapAttrs (_key: desktop: { priority = prog.mime.priority; desktop = desktop; }) prog.mime.associations; + # [ { "" = { priority, desktop } ]; } ] -> { "" = [ { priority, desktop } ... ]; } + mergeMimes = mimes: lib.foldAttrs (item: acc: [item] ++ acc) [] mimes; + # [ { priority, desktop } ... ] -> Self + sortOneMimeType = associations: builtins.sort (l: r: assert l.priority != r.priority; l.priority < r.priority) associations; + sortMimes = mimes: builtins.mapAttrs (_k: sortOneMimeType) mimes; + removePriorities = mimes: builtins.mapAttrs (_k: associations: builtins.map (a: a.desktop) associations) mimes; + + # [ ProgramConfig ] + enabledPrograms = builtins.filter (p: p.enabled) (builtins.attrValues config.sane.programs); + # [ { "" = { prority, desktop } ] + enabledWeightedMimes = builtins.map weightedMimes enabledPrograms; +in { # the xdg mime type for a file can be found with: # - `xdg-mime query filetype path/to/thing.ext` # we can have single associations or a list of associations. # there's also options to *remove* [non-default] associations from specific apps xdg.mime.enable = true; - xdg.mime.defaultApplications = lib.mkMerge ( - builtins.map - (p: lib.mkIf p.enabled p.mime) - (builtins.attrValues config.sane.programs) - ); + xdg.mime.defaultApplications = removePriorities (sortMimes (mergeMimes enabledWeightedMimes)); } diff --git a/hosts/common/programs/aerc.nix b/hosts/common/programs/aerc.nix index 64ce5117..42b9c8c4 100644 --- a/hosts/common/programs/aerc.nix +++ b/hosts/common/programs/aerc.nix @@ -4,6 +4,6 @@ { sane.programs.aerc = { secrets.".config/aerc/accounts.conf" = ../../../secrets/common/aerc_accounts.conf.bin; - mime."x-scheme-handler/mailto" = "aerc.desktop"; + mime.associations."x-scheme-handler/mailto" = "aerc.desktop"; }; } diff --git a/hosts/common/programs/epiphany.nix b/hosts/common/programs/epiphany.nix index 4e834936..a37c65b4 100644 --- a/hosts/common/programs/epiphany.nix +++ b/hosts/common/programs/epiphany.nix @@ -31,5 +31,15 @@ ".local/share/epiphany" # also .config/epiphany, but appears empty ]; + mime.priority = 200; # default priority is 100: install epiphany only as a fallback + mime.associations = let + desktop = "org.gnome.Epiphany.desktop"; + in { + "text/html" = desktop; + "x-scheme-handler/http" = desktop; + "x-scheme-handler/https" = desktop; + "x-scheme-handler/about" = desktop; + "x-scheme-handler/unknown" = desktop; + }; }; } diff --git a/hosts/common/programs/evince.nix b/hosts/common/programs/evince.nix index 9866b807..22017149 100644 --- a/hosts/common/programs/evince.nix +++ b/hosts/common/programs/evince.nix @@ -1,4 +1,4 @@ { ... }: { - sane.programs.evince.mime."application/pdf" = "org.gnome.Evince.desktop"; + sane.programs.evince.mime.associations."application/pdf" = "org.gnome.Evince.desktop"; } diff --git a/hosts/common/programs/firefox.nix b/hosts/common/programs/firefox.nix index b8727c78..e9c14884 100644 --- a/hosts/common/programs/firefox.nix +++ b/hosts/common/programs/firefox.nix @@ -193,7 +193,7 @@ in sane.programs.firefox = { inherit package; - mime = let + mime.associations = let inherit (cfg.browser) desktop; in { "text/html" = desktop; diff --git a/hosts/common/programs/gthumb.nix b/hosts/common/programs/gthumb.nix index 59524ae6..01084602 100644 --- a/hosts/common/programs/gthumb.nix +++ b/hosts/common/programs/gthumb.nix @@ -3,8 +3,8 @@ sane.programs.gthumb = { # compile without webservices to avoid the expensive webkitgtk dependency package = pkgs.gthumb.override { withWebservices = false; }; - mime."image/heif" = "org.gnome.gThumb.desktop"; # apple codec - mime."image/png" = "org.gnome.gThumb.desktop"; - mime."image/jpeg" = "org.gnome.gThumb.desktop"; + mime.associations."image/heif" = "org.gnome.gThumb.desktop"; # apple codec + mime.associations."image/png" = "org.gnome.gThumb.desktop"; + mime.associations."image/jpeg" = "org.gnome.gThumb.desktop"; }; } diff --git a/hosts/common/programs/obsidian.nix b/hosts/common/programs/obsidian.nix index 152ebae5..d33d0ab3 100644 --- a/hosts/common/programs/obsidian.nix +++ b/hosts/common/programs/obsidian.nix @@ -1,4 +1,4 @@ { ... }: { - sane.programs.obsidian.mime."text/markdown" = "obsidian.desktop"; + sane.programs.obsidian.mime.associations."text/markdown" = "obsidian.desktop"; } diff --git a/hosts/common/programs/vlc.nix b/hosts/common/programs/vlc.nix index 45db412d..c8d36c40 100644 --- a/hosts/common/programs/vlc.nix +++ b/hosts/common/programs/vlc.nix @@ -26,12 +26,12 @@ in qt-privacy-ask=0 ''; - mime."audio/flac" = "vlc.desktop"; - mime."audio/mpeg" = "vlc.desktop"; - mime."audio/x-vorbis+ogg" = "vlc.desktop"; - mime."video/mp4" = "vlc.desktop"; - mime."video/quicktime" = "vlc.desktop"; - mime."video/webm" = "vlc.desktop"; - mime."video/x-matroska" = "vlc.desktop"; + mime.associations."audio/flac" = "vlc.desktop"; + mime.associations."audio/mpeg" = "vlc.desktop"; + mime.associations."audio/x-vorbis+ogg" = "vlc.desktop"; + mime.associations."video/mp4" = "vlc.desktop"; + mime.associations."video/quicktime" = "vlc.desktop"; + mime.associations."video/webm" = "vlc.desktop"; + mime.associations."video/x-matroska" = "vlc.desktop"; }; } diff --git a/modules/programs.nix b/modules/programs.nix index b6f2f119..1d8adc52 100644 --- a/modules/programs.nix +++ b/modules/programs.nix @@ -79,7 +79,14 @@ let type = types.bool; default = true; }; - mime = mkOption { + mime.priority = mkOption { + type = types.int; + default = 100; + description = '' + program with the numerically lower priority takes precedence whenever two mime associations overlap. + ''; + }; + mime.associations = mkOption { type = types.attrsOf types.str; default = {}; description = ''