mime: support multiple implementors of the same association, with different priorities
This commit is contained in:
parent
29b53d934f
commit
088286d8f7
|
@ -1,14 +1,25 @@
|
||||||
{ config, lib, ...}:
|
{ config, lib, ...}:
|
||||||
|
|
||||||
|
let
|
||||||
|
# ProgramConfig -> { "<mime-type>" = { priority, desktop }; }
|
||||||
|
weightedMimes = prog: builtins.mapAttrs (_key: desktop: { priority = prog.mime.priority; desktop = desktop; }) prog.mime.associations;
|
||||||
|
# [ { "<mime-type>" = { priority, desktop } ]; } ] -> { "<mime-type>" = [ { 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);
|
||||||
|
# [ { "<mime-type>" = { prority, desktop } ]
|
||||||
|
enabledWeightedMimes = builtins.map weightedMimes enabledPrograms;
|
||||||
|
in
|
||||||
{
|
{
|
||||||
# the xdg mime type for a file can be found with:
|
# the xdg mime type for a file can be found with:
|
||||||
# - `xdg-mime query filetype path/to/thing.ext`
|
# - `xdg-mime query filetype path/to/thing.ext`
|
||||||
# we can have single associations or a list of associations.
|
# we can have single associations or a list of associations.
|
||||||
# there's also options to *remove* [non-default] associations from specific apps
|
# there's also options to *remove* [non-default] associations from specific apps
|
||||||
xdg.mime.enable = true;
|
xdg.mime.enable = true;
|
||||||
xdg.mime.defaultApplications = lib.mkMerge (
|
xdg.mime.defaultApplications = removePriorities (sortMimes (mergeMimes enabledWeightedMimes));
|
||||||
builtins.map
|
|
||||||
(p: lib.mkIf p.enabled p.mime)
|
|
||||||
(builtins.attrValues config.sane.programs)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
{
|
{
|
||||||
sane.programs.aerc = {
|
sane.programs.aerc = {
|
||||||
secrets.".config/aerc/accounts.conf" = ../../../secrets/common/aerc_accounts.conf.bin;
|
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";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,5 +31,15 @@
|
||||||
".local/share/epiphany"
|
".local/share/epiphany"
|
||||||
# also .config/epiphany, but appears empty
|
# 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;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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";
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ in
|
||||||
sane.programs.firefox = {
|
sane.programs.firefox = {
|
||||||
inherit package;
|
inherit package;
|
||||||
|
|
||||||
mime = let
|
mime.associations = let
|
||||||
inherit (cfg.browser) desktop;
|
inherit (cfg.browser) desktop;
|
||||||
in {
|
in {
|
||||||
"text/html" = desktop;
|
"text/html" = desktop;
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
sane.programs.gthumb = {
|
sane.programs.gthumb = {
|
||||||
# compile without webservices to avoid the expensive webkitgtk dependency
|
# compile without webservices to avoid the expensive webkitgtk dependency
|
||||||
package = pkgs.gthumb.override { withWebservices = false; };
|
package = pkgs.gthumb.override { withWebservices = false; };
|
||||||
mime."image/heif" = "org.gnome.gThumb.desktop"; # apple codec
|
mime.associations."image/heif" = "org.gnome.gThumb.desktop"; # apple codec
|
||||||
mime."image/png" = "org.gnome.gThumb.desktop";
|
mime.associations."image/png" = "org.gnome.gThumb.desktop";
|
||||||
mime."image/jpeg" = "org.gnome.gThumb.desktop";
|
mime.associations."image/jpeg" = "org.gnome.gThumb.desktop";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{ ... }:
|
{ ... }:
|
||||||
{
|
{
|
||||||
sane.programs.obsidian.mime."text/markdown" = "obsidian.desktop";
|
sane.programs.obsidian.mime.associations."text/markdown" = "obsidian.desktop";
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,12 @@ in
|
||||||
qt-privacy-ask=0
|
qt-privacy-ask=0
|
||||||
'';
|
'';
|
||||||
|
|
||||||
mime."audio/flac" = "vlc.desktop";
|
mime.associations."audio/flac" = "vlc.desktop";
|
||||||
mime."audio/mpeg" = "vlc.desktop";
|
mime.associations."audio/mpeg" = "vlc.desktop";
|
||||||
mime."audio/x-vorbis+ogg" = "vlc.desktop";
|
mime.associations."audio/x-vorbis+ogg" = "vlc.desktop";
|
||||||
mime."video/mp4" = "vlc.desktop";
|
mime.associations."video/mp4" = "vlc.desktop";
|
||||||
mime."video/quicktime" = "vlc.desktop";
|
mime.associations."video/quicktime" = "vlc.desktop";
|
||||||
mime."video/webm" = "vlc.desktop";
|
mime.associations."video/webm" = "vlc.desktop";
|
||||||
mime."video/x-matroska" = "vlc.desktop";
|
mime.associations."video/x-matroska" = "vlc.desktop";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,14 @@ let
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = true;
|
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;
|
type = types.attrsOf types.str;
|
||||||
default = {};
|
default = {};
|
||||||
description = ''
|
description = ''
|
||||||
|
|
Loading…
Reference in New Issue
Block a user