From 55d64eb5980502a71266e4574ad901a58cea9ae9 Mon Sep 17 00:00:00 2001 From: Colin Date: Sat, 15 Jul 2023 08:44:18 +0000 Subject: [PATCH] programs: factor out a `sane.programs..mime` schema --- hosts/common/home/mime.nix | 44 ++++----------------------- hosts/common/programs/aerc.nix | 5 ++- hosts/common/programs/default.nix | 2 ++ hosts/common/programs/evince.nix | 4 +++ hosts/common/programs/gthumb.nix | 8 ++++- hosts/common/programs/obsidian.nix | 4 +++ hosts/common/programs/vlc.nix | 8 +++++ hosts/common/programs/web-browser.nix | 10 ++++++ modules/programs.nix | 13 ++++++++ 9 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 hosts/common/programs/evince.nix create mode 100644 hosts/common/programs/obsidian.nix diff --git a/hosts/common/home/mime.nix b/hosts/common/home/mime.nix index 760466d5..63650aac 100644 --- a/hosts/common/home/mime.nix +++ b/hosts/common/home/mime.nix @@ -1,46 +1,14 @@ -{ config, ...}: +{ config, lib, ...}: -let - # TODO: should move all of this into `sane.programs` to not ship broken associations - www = config.sane.programs.web-browser.config.browser.desktop; - pdf = "org.gnome.Evince.desktop"; - md = "obsidian.desktop"; - thumb = "org.gnome.gThumb.desktop"; - video = "vlc.desktop"; - # audio = "mpv.desktop"; - audio = "vlc.desktop"; - email = "aerc.desktop"; -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 = { - # AUDIO - "audio/flac" = audio; - "audio/mpeg" = audio; - "audio/x-vorbis+ogg" = audio; - # IMAGES - "image/heif" = thumb; # apple codec - "image/png" = thumb; - "image/jpeg" = thumb; - # VIDEO - "video/mp4" = video; - "video/quicktime" = video; - "video/webm" = video; - "video/x-matroska" = video; - # HTML - "text/html" = www; - "x-scheme-handler/http" = www; - "x-scheme-handler/https" = www; - "x-scheme-handler/about" = www; - "x-scheme-handler/unknown" = www; - # RICH-TEXT DOCUMENTS - "application/pdf" = pdf; - "text/markdown" = md; - "x-scheme-handler/mailto" = email; - }; + xdg.mime.defaultApplications = lib.mkMerge ( + builtins.map + (p: lib.mkIf p.enabled p.mime) + (builtins.attrValues config.sane.programs) + ); } diff --git a/hosts/common/programs/aerc.nix b/hosts/common/programs/aerc.nix index 8847c48f..64ce5117 100644 --- a/hosts/common/programs/aerc.nix +++ b/hosts/common/programs/aerc.nix @@ -2,5 +2,8 @@ { ... }: { - sane.programs.aerc.secrets.".config/aerc/accounts.conf" = ../../../secrets/common/aerc_accounts.conf.bin; + sane.programs.aerc = { + secrets.".config/aerc/accounts.conf" = ../../../secrets/common/aerc_accounts.conf.bin; + mime."x-scheme-handler/mailto" = "aerc.desktop"; + }; } diff --git a/hosts/common/programs/default.nix b/hosts/common/programs/default.nix index 06a2516a..acdb13e7 100644 --- a/hosts/common/programs/default.nix +++ b/hosts/common/programs/default.nix @@ -6,6 +6,7 @@ ./assorted.nix ./cozy.nix ./epiphany.nix + ./evince.nix ./fontconfig.nix ./git.nix ./gnome-feeds.nix @@ -25,6 +26,7 @@ ./neovim.nix ./newsflash.nix ./nix-index.nix + ./obsidian.nix ./offlineimap.nix ./ripgrep.nix ./sfeed.nix diff --git a/hosts/common/programs/evince.nix b/hosts/common/programs/evince.nix new file mode 100644 index 00000000..9866b807 --- /dev/null +++ b/hosts/common/programs/evince.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + sane.programs.evince.mime."application/pdf" = "org.gnome.Evince.desktop"; +} diff --git a/hosts/common/programs/gthumb.nix b/hosts/common/programs/gthumb.nix index 769451d3..59524ae6 100644 --- a/hosts/common/programs/gthumb.nix +++ b/hosts/common/programs/gthumb.nix @@ -1,4 +1,10 @@ { pkgs, ... }: { - sane.programs.gthumb.package = pkgs.gthumb.override { withWebservices = false; }; + 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"; + }; } diff --git a/hosts/common/programs/obsidian.nix b/hosts/common/programs/obsidian.nix new file mode 100644 index 00000000..152ebae5 --- /dev/null +++ b/hosts/common/programs/obsidian.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + sane.programs.obsidian.mime."text/markdown" = "obsidian.desktop"; +} diff --git a/hosts/common/programs/vlc.nix b/hosts/common/programs/vlc.nix index ff265472..45db412d 100644 --- a/hosts/common/programs/vlc.nix +++ b/hosts/common/programs/vlc.nix @@ -25,5 +25,13 @@ in [qt] 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"; }; } diff --git a/hosts/common/programs/web-browser.nix b/hosts/common/programs/web-browser.nix index 9a1e61d7..755b3ce9 100644 --- a/hosts/common/programs/web-browser.nix +++ b/hosts/common/programs/web-browser.nix @@ -193,6 +193,16 @@ in sane.programs.web-browser = { inherit package; + mime = let + inherit (cfg.browser) 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; + }; + # env.BROWSER = "${package}/bin/${cfg.browser.libName}"; env.BROWSER = cfg.browser.libName; # used by misc tools like xdg-email, as fallback diff --git a/modules/programs.nix b/modules/programs.nix index efd624a5..b6f2f119 100644 --- a/modules/programs.nix +++ b/modules/programs.nix @@ -79,6 +79,19 @@ let type = types.bool; default = true; }; + mime = mkOption { + type = types.attrsOf types.str; + default = {}; + description = '' + mime associations. each entry takes the form of: + "" = ".desktop" + e.g. + { + "audio/flac" = "vlc.desktop"; + "application/pdf" = "org.gnome.Evince.desktop"; + } + ''; + }; persist = mkOption { type = options.sane.persist.sys.type; default = {};