From 5b5eb10c5985d21f5ae3a1d84ff3e3ecfce10ea5 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Sat, 30 Aug 2025 16:38:19 -0500 Subject: allow setting default application for generic categories of mime-types instead of the mimewiz like method --- archetypes/profiles/desktop/default.nix | 12 ++- home-manager/resources/xdg-mime/audio | 65 +++++++++++ home-manager/resources/xdg-mime/email | 6 ++ home-manager/resources/xdg-mime/image | 14 +++ home-manager/resources/xdg-mime/mpv | 120 --------------------- home-manager/resources/xdg-mime/nvim | 15 --- .../resources/xdg-mime/org.pwmt.zathura-pdf-mupdf | 4 - home-manager/resources/xdg-mime/pdf | 4 + home-manager/resources/xdg-mime/sxiv | 14 --- home-manager/resources/xdg-mime/text | 15 +++ home-manager/resources/xdg-mime/thunderbird | 3 - home-manager/resources/xdg-mime/video | 55 ++++++++++ home-manager/xdg-mime.nix | 37 +++++-- 13 files changed, 198 insertions(+), 166 deletions(-) create mode 100644 home-manager/resources/xdg-mime/audio create mode 100644 home-manager/resources/xdg-mime/email create mode 100644 home-manager/resources/xdg-mime/image delete mode 100644 home-manager/resources/xdg-mime/mpv delete mode 100644 home-manager/resources/xdg-mime/nvim delete mode 100644 home-manager/resources/xdg-mime/org.pwmt.zathura-pdf-mupdf create mode 100644 home-manager/resources/xdg-mime/pdf delete mode 100644 home-manager/resources/xdg-mime/sxiv create mode 100644 home-manager/resources/xdg-mime/text delete mode 100644 home-manager/resources/xdg-mime/thunderbird create mode 100644 home-manager/resources/xdg-mime/video diff --git a/archetypes/profiles/desktop/default.nix b/archetypes/profiles/desktop/default.nix index 499de17..00dea7e 100644 --- a/archetypes/profiles/desktop/default.nix +++ b/archetypes/profiles/desktop/default.nix @@ -72,7 +72,17 @@ desktop = mkDesktop true; }; - xdg.mimeApps._setDefaultApplications.enable = true; + xdg.mimeApps._defaultCategoryApplications = { + enable = true; + categoryApplications = { + audio = [ "mpv" ]; + email = [ "thunderbird" ]; + image = [ "sxiv" ]; + pdf = [ "org.pwmt.zathura-pdf-mupdf" ]; + text = [ "nvim" ]; + video = [ "mpv" ]; + }; + }; }; in { imports = [ (lib._mkProfileArchetype "desktop" nixosConfig homeConfig) ]; diff --git a/home-manager/resources/xdg-mime/audio b/home-manager/resources/xdg-mime/audio new file mode 100644 index 0000000..fd00b26 --- /dev/null +++ b/home-manager/resources/xdg-mime/audio @@ -0,0 +1,65 @@ +application/x-cue +application/x-extension-m4a +application/x-ogm-audio +application/x-shorten +audio/3gpp +audio/3gpp2 +audio/AMR +audio/aac +audio/ac3 +audio/aiff +audio/amr-wb +audio/dv +audio/eac3 +audio/flac +audio/m3u +audio/m4a +audio/mp1 +audio/mp2 +audio/mp3 +audio/mp4 +audio/mpeg +audio/mpeg2 +audio/mpeg3 +audio/mpegurl +audio/mpg +audio/musepack +audio/ogg +audio/opus +audio/rn-mpeg +audio/scpls +audio/vnd.dolby.heaac.1 +audio/vnd.dolby.heaac.2 +audio/vnd.dts +audio/vnd.dts.hd +audio/vnd.rn-realaudio +audio/vorbis +audio/wav +audio/webm +audio/x-aac +audio/x-adpcm +audio/x-aiff +audio/x-ape +audio/x-m4a +audio/x-matroska +audio/x-mp1 +audio/x-mp2 +audio/x-mp3 +audio/x-mpegurl +audio/x-mpg +audio/x-ms-asf +audio/x-ms-wma +audio/x-musepack +audio/x-pls +audio/x-pn-au +audio/x-pn-realaudio +audio/x-pn-wav +audio/x-pn-windows-pcm +audio/x-realaudio +audio/x-scpls +audio/x-shorten +audio/x-tta +audio/x-vorbis +audio/x-vorbis+ogg +audio/x-wav +audio/x-wavpack diff --git a/home-manager/resources/xdg-mime/email b/home-manager/resources/xdg-mime/email new file mode 100644 index 0000000..db65256 --- /dev/null +++ b/home-manager/resources/xdg-mime/email @@ -0,0 +1,6 @@ +application/mbox +application/vnd.ms-outlook +message/rfc822 +text/calendar +x-scheme-handler/mailto +x-scheme-handler/mid diff --git a/home-manager/resources/xdg-mime/image b/home-manager/resources/xdg-mime/image new file mode 100644 index 0000000..4401ebb --- /dev/null +++ b/home-manager/resources/xdg-mime/image @@ -0,0 +1,14 @@ +image/bmp +image/gif +image/jpeg +image/jpg +image/png +image/tiff +image/x-bmp +image/x-portable-anymap +image/x-portable-bitmap +image/x-portable-graymap +image/x-tga +image/x-xpixmap +image/svg+xml +image/svg+xml-compressed diff --git a/home-manager/resources/xdg-mime/mpv b/home-manager/resources/xdg-mime/mpv deleted file mode 100644 index 697e71b..0000000 --- a/home-manager/resources/xdg-mime/mpv +++ /dev/null @@ -1,120 +0,0 @@ -application/mxf -application/ogg -application/sdp -application/smil -application/streamingmedia -application/vnd.apple.mpegurl -application/vnd.ms-asf -application/vnd.rn-realmedia -application/vnd.rn-realmedia-vbr -application/x-cue -application/x-extension-m4a -application/x-extension-mp4 -application/x-matroska -application/x-mpegurl -application/x-ogg -application/x-ogm -application/x-ogm-audio -application/x-ogm-video -application/x-shorten -application/x-smil -application/x-streamingmedia -audio/3gpp -audio/3gpp2 -audio/AMR -audio/aac -audio/ac3 -audio/aiff -audio/amr-wb -audio/dv -audio/eac3 -audio/flac -audio/m3u -audio/m4a -audio/mp1 -audio/mp2 -audio/mp3 -audio/mp4 -audio/mpeg -audio/mpeg2 -audio/mpeg3 -audio/mpegurl -audio/mpg -audio/musepack -audio/ogg -audio/opus -audio/rn-mpeg -audio/scpls -audio/vnd.dolby.heaac.1 -audio/vnd.dolby.heaac.2 -audio/vnd.dts -audio/vnd.dts.hd -audio/vnd.rn-realaudio -audio/vorbis -audio/wav -audio/webm -audio/x-aac -audio/x-adpcm -audio/x-aiff -audio/x-ape -audio/x-m4a -audio/x-matroska -audio/x-mp1 -audio/x-mp2 -audio/x-mp3 -audio/x-mpegurl -audio/x-mpg -audio/x-ms-asf -audio/x-ms-wma -audio/x-musepack -audio/x-pls -audio/x-pn-au -audio/x-pn-realaudio -audio/x-pn-wav -audio/x-pn-windows-pcm -audio/x-realaudio -audio/x-scpls -audio/x-shorten -audio/x-tta -audio/x-vorbis -audio/x-vorbis+ogg -audio/x-wav -audio/x-wavpack -video/3gp -video/3gpp -video/3gpp2 -video/avi -video/divx -video/dv -video/fli -video/flv -video/mkv -video/mp2t -video/mp4 -video/mp4v-es -video/mpeg -video/msvideo -video/ogg -video/quicktime -video/vnd.divx -video/vnd.mpegurl -video/vnd.rn-realvideo -video/webm -video/x-avi -video/x-flc -video/x-flic -video/x-flv -video/x-m4v -video/x-matroska -video/x-mpeg2 -video/x-mpeg3 -video/x-ms-afs -video/x-ms-asf -video/x-ms-wmv -video/x-ms-wmx -video/x-ms-wvxvideo -video/x-msvideo -video/x-ogm -video/x-ogm+ogg -video/x-theora -video/x-theora+ogg diff --git a/home-manager/resources/xdg-mime/nvim b/home-manager/resources/xdg-mime/nvim deleted file mode 100644 index 709cb57..0000000 --- a/home-manager/resources/xdg-mime/nvim +++ /dev/null @@ -1,15 +0,0 @@ -application/x-shellscript -text/english -text/plain -text/x-c -text/x-c++ -text/x-c++hdr -text/x-c++src -text/x-chdr -text/x-csrc -text/x-java -text/x-makefile -text/x-moc -text/x-pascal -text/x-tcl -text/x-tex diff --git a/home-manager/resources/xdg-mime/org.pwmt.zathura-pdf-mupdf b/home-manager/resources/xdg-mime/org.pwmt.zathura-pdf-mupdf deleted file mode 100644 index 73bd5d0..0000000 --- a/home-manager/resources/xdg-mime/org.pwmt.zathura-pdf-mupdf +++ /dev/null @@ -1,4 +0,0 @@ -application/epub+zip -application/oxps -application/pdf -application/x-fictionbook diff --git a/home-manager/resources/xdg-mime/pdf b/home-manager/resources/xdg-mime/pdf new file mode 100644 index 0000000..73bd5d0 --- /dev/null +++ b/home-manager/resources/xdg-mime/pdf @@ -0,0 +1,4 @@ +application/epub+zip +application/oxps +application/pdf +application/x-fictionbook diff --git a/home-manager/resources/xdg-mime/sxiv b/home-manager/resources/xdg-mime/sxiv deleted file mode 100644 index 4401ebb..0000000 --- a/home-manager/resources/xdg-mime/sxiv +++ /dev/null @@ -1,14 +0,0 @@ -image/bmp -image/gif -image/jpeg -image/jpg -image/png -image/tiff -image/x-bmp -image/x-portable-anymap -image/x-portable-bitmap -image/x-portable-graymap -image/x-tga -image/x-xpixmap -image/svg+xml -image/svg+xml-compressed diff --git a/home-manager/resources/xdg-mime/text b/home-manager/resources/xdg-mime/text new file mode 100644 index 0000000..709cb57 --- /dev/null +++ b/home-manager/resources/xdg-mime/text @@ -0,0 +1,15 @@ +application/x-shellscript +text/english +text/plain +text/x-c +text/x-c++ +text/x-c++hdr +text/x-c++src +text/x-chdr +text/x-csrc +text/x-java +text/x-makefile +text/x-moc +text/x-pascal +text/x-tcl +text/x-tex diff --git a/home-manager/resources/xdg-mime/thunderbird b/home-manager/resources/xdg-mime/thunderbird deleted file mode 100644 index adbec40..0000000 --- a/home-manager/resources/xdg-mime/thunderbird +++ /dev/null @@ -1,3 +0,0 @@ -message/rfc822 -x-scheme-handler/mailto -x-scheme-handler/mid diff --git a/home-manager/resources/xdg-mime/video b/home-manager/resources/xdg-mime/video new file mode 100644 index 0000000..6a0839e --- /dev/null +++ b/home-manager/resources/xdg-mime/video @@ -0,0 +1,55 @@ +application/mxf +application/ogg +application/sdp +application/smil +application/streamingmedia +application/vnd.apple.mpegurl +application/vnd.ms-asf +application/vnd.rn-realmedia +application/vnd.rn-realmedia-vbr +application/x-extension-mp4 +application/x-matroska +application/x-mpegurl +application/x-ogg +application/x-ogm +application/x-ogm-video +application/x-smil +application/x-streamingmedia +video/3gp +video/3gpp +video/3gpp2 +video/avi +video/divx +video/dv +video/fli +video/flv +video/mkv +video/mp2t +video/mp4 +video/mp4v-es +video/mpeg +video/msvideo +video/ogg +video/quicktime +video/vnd.divx +video/vnd.mpegurl +video/vnd.rn-realvideo +video/webm +video/x-avi +video/x-flc +video/x-flic +video/x-flv +video/x-m4v +video/x-matroska +video/x-mpeg2 +video/x-mpeg3 +video/x-ms-afs +video/x-ms-asf +video/x-ms-wmv +video/x-ms-wmx +video/x-ms-wvxvideo +video/x-msvideo +video/x-ogm +video/x-ogm+ogg +video/x-theora +video/x-theora+ogg diff --git a/home-manager/xdg-mime.nix b/home-manager/xdg-mime.nix index 043b214..420510f 100644 --- a/home-manager/xdg-mime.nix +++ b/home-manager/xdg-mime.nix @@ -1,22 +1,41 @@ { config, lib, pkgs, ... }: let - cfg = config.xdg.mimeApps._setDefaultApplications; - mimeDir = ./resources/xdg-mime; + cfg = config.xdg.mimeApps._defaultCategoryApplications; - getApplicationMimeTypes = applicationName: lib.filter (s: s != "") (lib.splitString "\n" (builtins.readFile "${mimeDir}/${applicationName}")); + # Mime-type category files are stored here + mimeResources = ./resources/xdg-mime; - getMimeTypeApplicationList = applicationName: lib.mkMerge (lib.map (mimetype: - { "${mimetype}" = [ "${applicationName}.desktop" ]; } - ) (getApplicationMimeTypes applicationName)); + # Files present in mimeResources with newline separated mime-types + # Would be more fun to load these dynamically with builtins.readDir, but I will be disciplined + categories = [ "audio" "email" "image" "pdf" "text" "video" ]; - defaultApplications = lib.mkMerge (lib.mapAttrsToList (appPath: pathType: lib.mkIf (pathType == "regular") (getMimeTypeApplicationList appPath)) (builtins.readDir mimeDir)); + # Dynamically generate categories + categoryApplications = (lib.genAttrs categories (category: lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + description = "set the default application used for ${category} files. omit '.desktop'"; + })); + + # Create list of mime-types from the category file + getCategoryMimeTypes = category: lib.filter (s: s != "") (lib.splitString "\n" (builtins.readFile "${mimeResources}/${category}")); + + # Structure default applications for a specified category how home-manager expects + assignMimeTypes = applications: category: lib.map (mimetype: + { "${mimetype}" = lib.mkIf (applications != []) (lib.map (app: "${app}.desktop") applications); } + ) (getCategoryMimeTypes category); + + # Combine all category applications + defaultApplications = lib.mkMerge (lib.flatten ( + lib.map (category: assignMimeTypes cfg.categoryApplications.${category} category) categories + )); in { - options.xdg.mimeApps._setDefaultApplications = { + options.xdg.mimeApps._defaultCategoryApplications = { enable = lib.mkEnableOption "set default applications as defined in the resources dir"; + inherit categoryApplications; }; config = lib.mkIf cfg.enable { xdg.mimeApps = { - enable = true; + enable = lib.mkDefault true; inherit defaultApplications; }; }; -- cgit v1.2.3