From e43ba3d0f05bbe5a974664b02607e158934e566a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 30 Jan 2025 22:48:46 +0000 Subject: [PATCH 01/10] WIP: home: xdg: add 'mime-apps' --- modules/home/xdg/default.nix | 8 +- modules/home/xdg/mime-apps.nix | 186 +++++++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 modules/home/xdg/mime-apps.nix diff --git a/modules/home/xdg/default.nix b/modules/home/xdg/default.nix index 803167f..f72d36f 100644 --- a/modules/home/xdg/default.nix +++ b/modules/home/xdg/default.nix @@ -3,6 +3,10 @@ let cfg = config.my.home.xdg; in { + imports = [ + ./mime-apps.nix + ]; + options.my.home.xdg = with lib; { enable = my.mkDisableOption "XDG configuration"; }; @@ -11,10 +15,6 @@ in enable = true; # File types mime.enable = true; - # File associations - mimeApps = { - enable = true; - }; # User directories userDirs = { enable = true; diff --git a/modules/home/xdg/mime-apps.nix b/modules/home/xdg/mime-apps.nix new file mode 100644 index 0000000..42b90e4 --- /dev/null +++ b/modules/home/xdg/mime-apps.nix @@ -0,0 +1,186 @@ +{ config, lib, ... }: +let + cfg = config.my.home.xdg.mime-apps; + app = cfg.applications; + + mkMimeAppOption = kind: lib.mkOption { + description = "Application to associate as ${kind}"; + default = null; + type = with lib.types; nullOr str; + }; +in +{ + options.my.home.xdg.mime-apps = with lib; { + enable = my.mkDisableOption "XDG MIME Applications configuration"; + + applications = lib.mapAttrsRecursive (_: mkMimeAppOption) { + archive = "archive manager"; + browser = "internet browser"; + calendar = "calendar"; + editor = "text editor"; + fileManager = "file manager"; + mail = "mail client"; + media = { + audio = "audio player"; + document = { + comic = "comic book reader"; + ebook = "ebook reader"; + pdf = "PDF reader"; + }; + image = { + bitmap = "bitmap image viewer"; + vector = "vector image viewer"; + editor = "image editor"; + }; + video = "video player"; + }; + office = { + database = "database management program"; + formula = "formula editor"; + graphics = "graphics editor"; + presentation = "presentation editor"; + spreadsheet = "spreadsheet editor"; + text = "word processor"; + }; + terminal = "terminal"; + torrent = "bittorrent client"; + }; + }; + + config = lib.mkIf cfg.enable { + xdg = { + mimeApps = { + enable = true; + defaultApplications = lib.filterAttrs (_: apps: apps != null) { + "application/epub+zip" = app.media.document.ebook; + "application/gzip" = app.archive; + "application/json" = app.editor; + "application/ld+json" = app.editor; + "application/mxf " = app.media.video; + "application/ogg" = app.media.audio; + "application/pdf" = app.media.document.pdf; + "application/rss+xml" = app.editor; + "application/smil+xml " = app.media.video; + "application/vnd.amazon.ebook" = app.media.document.ebook; + "application/vnd.apple.mpegurl " = app.media.video; + "application/vnd.comicbook+zip" = app.media.document.comic; + "application/vnd.comicbook-rar" = app.media.document.comic; + "application/vnd.mozilla.xul+xml" = app.browser; + "application/vnd.ms-excel" = app.office.spreadsheet; + "application/vnd.ms-powerpoint" = app.office.presentation; + "application/vnd.ms-word" = app.office.text; + "application/vnd.oasis.opendocument.database" = app.office.database; + "application/vnd.oasis.opendocument.formula" = app.office.formula; + "application/vnd.oasis.opendocument.graphics" = app.office.graphics; + "application/vnd.oasis.opendocument.graphics-template" = app.office.graphics; + "application/vnd.oasis.opendocument.presentation" = app.office.presentation; + "application/vnd.oasis.opendocument.presentation-template" = app.office.presentation; + "application/vnd.oasis.opendocument.spreadsheet" = app.office.spreadsheet; + "application/vnd.oasis.opendocument.spreadsheet-template" = app.office.spreadsheet; + "application/vnd.oasis.opendocument.text" = app.office.text; + "application/vnd.oasis.opendocument.text-master" = app.office.text; + "application/vnd.oasis.opendocument.text-template" = app.office.text; + "application/vnd.oasis.opendocument.text-web" = app.office.text; + "application/vnd.openxmlformats-officedocument.presentationml.presentation" = app.office.presentation; + "application/vnd.openxmlformats-officedocument.presentationml.template" = app.office.presentation; + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" = app.office.spreadsheet; + "application/vnd.openxmlformats-officedocument.spreadsheetml.template" = app.office.spreadsheet; + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" = app.office.text; + "application/vnd.openxmlformats-officedocument.wordprocessingml.template" = app.office.text; + "application/vnd.rar" = app.archive; + "application/vnd.stardivision.calc" = app.office.spreadsheet; + "application/vnd.stardivision.draw" = app.office.graphics; + "application/vnd.stardivision.impress" = app.office.presentation; + "application/vnd.stardivision.math" = app.office.formula; + "application/vnd.stardivision.writer" = app.office.text; + "application/vnd.sun.xml.base" = app.office.database; + "application/vnd.sun.xml.calc" = app.office.spreadsheet; + "application/vnd.sun.xml.calc.template" = app.office.spreadsheet; + "application/vnd.sun.xml.draw" = app.office.graphics; + "application/vnd.sun.xml.draw.template" = app.office.graphics; + "application/vnd.sun.xml.impress" = app.office.presentation; + "application/vnd.sun.xml.impress.template" = app.office.presentation; + "application/vnd.sun.xml.math" = app.office.formula; + "application/vnd.sun.xml.writer" = app.office.text; + "application/vnd.sun.xml.writer.global" = app.office.text; + "application/vnd.sun.xml.writer.template" = app.office.text; + "application/vnd.wordperfect" = app.office.text; + "application/x-7z-compressed" = app.archive; + "application/x-arj" = app.archive; + "application/x-bittorrent" = app.torrent; + "application/x-bzip" = app.archive; + "application/x-bzip-compressed-tar" = app.archive; + "application/x-bzip2" = app.archive; + "application/x-cb7" = app.media.document.comic; + "application/x-cbr" = app.media.document.comic; + "application/x-cbt" = app.media.document.comic; + "application/x-cbz" = app.media.document.comic; + "application/x-compress" = app.archive; + "application/x-compressed-tar" = app.archive; + "application/x-csh" = app.editor; + "application/x-cue" = app.media.audio; + "application/x-directory" = app.fileManager; + "application/x-extension-htm" = app.browser; + "application/x-extension-html" = app.browser; + "application/x-extension-ics" = app.calendar; + "application/x-extension-m4a" = app.media.audio; + "application/x-extension-mp4" = app.media.video; + "application/x-extension-shtml" = app.browser; + "application/x-extension-xht" = app.browser; + "application/x-extension-xhtml" = app.browser; + "application/x-fictionbook" = app.media.document.ebook; + "application/x-fictionbook+xml" = app.media.document.ebook; + "application/x-flac" = app.media.audio; + "application/x-gzip" = app.archive; + "application/x-lha" = app.archive; + "application/x-lhz" = app.archive; + "application/x-lzop" = app.archive; + "application/x-matroska" = app.media.video; + "application/x-netshow-channel" = app.media.video; + "application/x-quicktime-media-link" = app.media.video; + "application/x-quicktimeplayer" = app.media.video; + "application/x-rar" = app.archive; + "application/x-sh" = app.editor; + "application/x-shellscript" = app.editor; + "application/x-shorten " = app.media.audio; + "application/x-smil" = app.media.video; + "application/x-tar" = app.archive; + "application/x-tarz" = app.archive; + "application/x-wine-extension-ini" = app.editor; + "application/x-zip-compressed" = app.archive; + "application/x-zoo" = app.archive; + "application/xhtml+xml" = app.browser; + "application/xml" = app.editor; + "application/zip" = app.archive; + "audio/*" = app.media.video; + "image/*" = app.media.image.bitmap; + "image/svg+xml" = app.media.image.vector; + "image/x-compressed-xcf" = app.media.image.editor; + "image/x-fits" = app.media.image.editor; + "image/x-psd" = app.media.image.editor; + "image/x-xcf" = app.media.image.editor; + "inode/directory" = app.fileManager; + "message/rfc822" = app.mail; + "text/*" = app.editor; + "text/calendar" = app.calendar; + "text/html" = app.browser; + "text/plain" = app.editor; + "video/*" = app.media.video; + "x-scheme-handler/about" = app.browser; + "x-scheme-handler/chrome" = app.browser; + "x-scheme-handler/file" = app.fileManager; + "x-scheme-handler/ftp" = app.browser; + "x-scheme-handler/http" = app.browser; + "x-scheme-handler/https" = app.browser; + "x-scheme-handler/mailto" = app.mail; + "x-scheme-handler/mid" = app.mail; + "x-scheme-handler/terminal" = app.terminal; + "x-scheme-handler/unknown" = app.browser; + "x-scheme-handler/webcal" = app.calendar; + "x-scheme-handler/webcals" = app.calendar; + "x-www-browser" = app.browser; + }; + }; + }; + }; +} From b9a197228b00c4a8edfe32e46f7a00ab63eae4c1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 02/10] home: feh: add MIME association --- modules/home/feh/default.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/home/feh/default.nix b/modules/home/feh/default.nix index 3a952a2..d8c0b36 100644 --- a/modules/home/feh/default.nix +++ b/modules/home/feh/default.nix @@ -10,4 +10,11 @@ in config.programs.feh = lib.mkIf cfg.enable { enable = true; }; + + config.my.home.xdg.mime-apps = lib.mkIf cfg.enable { + applications.media.image = { + bitmap = "feh.desktop"; + vector = "feh.desktop"; + }; + }; } From eb5ceeae93b776186c90335c78486275219110cd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 03/10] home: firefox: add MIME associations --- modules/home/firefox/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/firefox/default.nix b/modules/home/firefox/default.nix index 6346dc9..fe5c6b8 100644 --- a/modules/home/firefox/default.nix +++ b/modules/home/firefox/default.nix @@ -79,4 +79,8 @@ in }; }; }; + + config.my.home.xdg.mime-apps = lib.mkIf cfg.enable { + applications.browser = "firefox.desktop"; + }; } From ee42c4d2f37e7341a27d819344b04d9fc701bad4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 04/10] home: himalaya: add MIME associations --- modules/home/mail/himalaya/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/mail/himalaya/default.nix b/modules/home/mail/himalaya/default.nix index 849a415..b645660 100644 --- a/modules/home/mail/himalaya/default.nix +++ b/modules/home/mail/himalaya/default.nix @@ -20,4 +20,8 @@ in ''; }; }; + + config.my.home.xdg.mime-apps = lib.mkIf cfg.enable { + applications.editor = "himalaya.desktop"; + }; } From 523ab4baab2ad432c61fa2a6e22e11a8c0935a9f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 05/10] home: mpv: add MIME associations --- modules/home/mpv/default.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/home/mpv/default.nix b/modules/home/mpv/default.nix index 8af394c..f40bf41 100644 --- a/modules/home/mpv/default.nix +++ b/modules/home/mpv/default.nix @@ -17,5 +17,12 @@ in pkgs.mpvScripts.uosc # Nicer UI ]; }; + + my.home.xdg.mime-apps = { + applications.media = { + audio = "mpv.desktop"; + video = "mpv.desktop"; + }; + }; }; } From dac4c7b7166324145bbcf60ac29a09d938b4d2a3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 06/10] home: nvim: add MIME associations --- modules/home/vim/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/vim/default.nix b/modules/home/vim/default.nix index 930a853..834dd8d 100644 --- a/modules/home/vim/default.nix +++ b/modules/home/vim/default.nix @@ -104,4 +104,8 @@ in }; config.xdg.configFile = lib.mkIf cfg.enable configFiles; + + config.my.home.xdg.mime-apps = lib.mkIf cfg.enable { + applications.editor = "nvim.desktop"; + }; } From ace16d4840129ed11084b9fcfa0bb55648cdb05f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 07/10] home: zathura: add MIME associations --- modules/home/zathura/default.nix | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/home/zathura/default.nix b/modules/home/zathura/default.nix index 6162542..cd3c3c4 100644 --- a/modules/home/zathura/default.nix +++ b/modules/home/zathura/default.nix @@ -17,4 +17,12 @@ in "statusbar-home-tilde" = true; }; }; + + config.my.home.xdg.mime-apps = lib.mkIf cfg.enable { + applications.media.document = { + comic = "org.pwmt.zathura.desktop"; + ebook = "org.pwmt.zathura.desktop"; + pdf = "org.pwmt.zathura.desktop"; + }; + }; } From 7a749dcce10291021dd04c4113f044f2686fc34a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 08/10] home: terminal: alacritty: add MIME associations --- modules/home/terminal/alacritty/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/terminal/alacritty/default.nix b/modules/home/terminal/alacritty/default.nix index daf3e80..87f489b 100644 --- a/modules/home/terminal/alacritty/default.nix +++ b/modules/home/terminal/alacritty/default.nix @@ -48,5 +48,9 @@ in }; }; }; + + my.home.xdg.mime-apps = { + applications.terminal = "Alacritty.desktop"; + }; }; } From 6d5a6fe2509460741a41a83caeb0b020ecb00cfe Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 31 Jan 2025 11:43:21 +0000 Subject: [PATCH 09/10] home: terminal: termite: add MIME associations --- modules/home/terminal/termite/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/home/terminal/termite/default.nix b/modules/home/terminal/termite/default.nix index e8f67a7..5e7517d 100644 --- a/modules/home/terminal/termite/default.nix +++ b/modules/home/terminal/termite/default.nix @@ -49,5 +49,9 @@ in color15 = ${whiteBold} ''; }; + + my.home.xdg.mime-apps = { + applications.terminal = "termite.desktop"; + }; }; } From b2f0e158966d61b623b9708e2840df512047dfb1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 30 Jan 2025 22:50:00 +0000 Subject: [PATCH 10/10] REMOVE THIS ONE --- modules/home/xdg/mime-apps.nix | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/modules/home/xdg/mime-apps.nix b/modules/home/xdg/mime-apps.nix index 42b90e4..f704183 100644 --- a/modules/home/xdg/mime-apps.nix +++ b/modules/home/xdg/mime-apps.nix @@ -179,6 +179,99 @@ in "x-scheme-handler/webcal" = app.calendar; "x-scheme-handler/webcals" = app.calendar; "x-www-browser" = app.browser; + + # FIXME: relevant? https://bbs.archlinux.org/viewtopic.php?id=243125 + + # FIXME: shouldn't be necessary then + # "audio/AMR" = app.media.audio; + # "audio/aac" = app.media.audio; + # "audio/ac3" = app.media.audio; + # "audio/flac" = app.media.audio; + # "audio/mp2" = app.media.audio; + # "audio/mp4" = app.media.audio; + # "audio/mpeg" = app.media.audio; + # "audio/ogg" = app.media.audio; + # "audio/vnd.dts" = app.media.audio; + # "audio/vnd.dts.hd" = app.media.audio; + # "audio/vnd.rn-realaudio" = app.media.audio; + # "audio/webm" = app.media.audio; + # "audio/x-adpcm" = app.media.audio; + # "audio/x-aiff" = app.media.audio; + # "audio/x-ape" = app.media.audio; + # "audio/x-matroska" = app.media.audio; + # "audio/x-mpegurl" = app.media.audio; + # "audio/x-ms-asx" = app.media.audio; + # "audio/x-ms-wma" = app.media.audio; + # "audio/x-musepack" = app.media.audio; + # "audio/x-scpls" = app.media.audio; + # "audio/x-tta" = app.media.audio; + # "audio/x-vorbis+ogg" = app.media.audio; + # "audio/x-wav" = app.media.audio; + # "audio/x-wavpack" = app.media.audio; + # "image/bmp" = app.media.image.bitmap; + # "image/gif" = app.media.image.bitmap; + # "image/heif" = app.media.image.bitmap; + # "image/jpeg" = app.media.image.bitmap; + # "image/jpg" = app.media.image.bitmap; + # "image/pjpeg" = app.media.image.bitmap; + # "image/png" = app.media.image.bitmap; + # "image/tiff" = app.media.image.bitmap; + # "image/vnd.zbrush.pcx" = app.media.image.bitmap; + # "image/webp" = app.media.image.bitmap; + # "image/x-icb" = app.media.image.bitmap; + # "image/x-ico" = app.media.image.bitmap; + # "image/x-pcx" = app.media.image.bitmap; + # "image/x-portable-anymap" = app.media.image.bitmap; + # "image/x-portable-bitmap" = app.media.image.bitmap; + # "image/x-portable-graymap" = app.media.image.bitmap; + # "image/x-portable-pixmap" = app.media.image.bitmap; + # "image/x-tga" = app.media.image.bitmap; + # "image/x-xbitmap" = app.media.image.bitmap; + # "image/x-xpixmap" = app.media.image.bitmap; + # "image/x-xwindowdump" = app.media.image.bitmap; + # "text/tcl" = app.editor; + # "text/x-c++hdr" = app.editor; + # "text/x-c++src" = app.editor; + # "text/x-chdr" = app.editor; + # "text/x-csrc" = app.editor; + # "text/x-java" = app.editor; + # "text/x-makefile" = app.editor; + # "text/x-moc" = app.editor; + # "text/x-pascal" = app.editor; + # "text/x-tex" = app.editor; + # "video/3gpp" = app.media.video; + # "video/3gpp2" = app.media.video; + # "video/dv" = app.media.video; + # "video/mp2t" = app.media.video; + # "video/mp4" = app.media.video; + # "video/mpeg" = app.media.video; + # "video/ogg" = app.media.video; + # "video/quicktime" = app.media.video; + # "video/vnd.mpegurl" = app.media.video; + # "video/vnd.rn-realvideo" = app.media.video; + # "video/webm" = app.media.video; + # "video/x-flic" = app.media.video; + # "video/x-flv" = app.media.video; + # "video/x-matroska" = app.media.video; + # "video/x-ms-wmv" = app.media.video; + # "video/x-msvideo" = app.media.video; + # "video/x-ogm+ogg" = app.media.video; + # "video/x-theora+ogg" = app.media.video; + + # FIXME: kind of weird formats, not quite adapted to attribute name + # "application/eps" = app.media.document.pdf + # "application/oxps" = app.media.document.pdf + # "application/postscript" = app.media.document.pdf + # "application/x-eps" = app.media.document.pdf + # "image/eps" = app.media.document.pdf + # "image/vnd.djvu" = app.media.document.pdf + # "image/vnd.djvu+multipage" = app.media.document.pdf + # "image/x-eps" = app.media.document.pdf + + # FIXME: additionally interesting, but not necessary + # "x-scheme-handler/discord" = [ "discord.desktop" ]; + # "x-scheme-handler/msteams" = [ "teams.desktop" ]; + # "x-scheme-handler/slack" = [ "slack.desktop" ]; }; }; };