From 1f86bfd151e442b5af4de15868c3cbe324580d99 Mon Sep 17 00:00:00 2001 From: SirBlobby Date: Thu, 24 Sep 2026 12:49:45 -0400 Subject: [PATCH] Add image viewer, video player and PDF viewer defaults to the menu --- bin/blob-default-image-viewer | 31 +++++++++++++++++++++++++++++ bin/blob-default-mime | 23 ++++++++++++++++++++++ bin/blob-default-pdf-viewer | 35 +++++++++++++++++++++++++++++++++ bin/blob-default-video-player | 31 +++++++++++++++++++++++++++++ default/blob/blob-menu.jsonc | 17 ++++++++++++++++ default/mime/archive.types | 9 +++++++++ default/mime/document.types | 4 ++++ default/mime/image.types | 9 +++++++++ default/mime/pdf.types | 6 ++++++ default/mime/presentation.types | 3 +++ default/mime/spreadsheet.types | 4 ++++ default/mime/text.types | 2 ++ default/mime/video.types | 12 +++++++++++ docs/commands.md | 4 ++++ docs/install.md | 7 +++++-- docs/packages.md | 16 ++++++++++++++- install/steps/apps.sh | 28 +++++++++++++++----------- 17 files changed, 226 insertions(+), 15 deletions(-) create mode 100755 bin/blob-default-image-viewer create mode 100755 bin/blob-default-mime create mode 100755 bin/blob-default-pdf-viewer create mode 100755 bin/blob-default-video-player create mode 100644 default/mime/archive.types create mode 100644 default/mime/document.types create mode 100644 default/mime/image.types create mode 100644 default/mime/pdf.types create mode 100644 default/mime/presentation.types create mode 100644 default/mime/spreadsheet.types create mode 100644 default/mime/text.types create mode 100644 default/mime/video.types diff --git a/bin/blob-default-image-viewer b/bin/blob-default-image-viewer new file mode 100755 index 0000000..a8b2d17 --- /dev/null +++ b/bin/blob-default-image-viewer @@ -0,0 +1,31 @@ +#!/bin/bash + +# blob:summary=Set the default image viewer +# blob:args=[loupe|imv|eog|gwenview] +# blob:examples=blob default image-viewer loupe | blob default image-viewer imv + +if (($# == 0)); then + case "$(blob-default-mime image)" in + org.gnome.Loupe.desktop) echo "loupe" ;; + imv.desktop) echo "imv" ;; + org.gnome.eog.desktop) echo "eog" ;; + org.kde.gwenview.desktop) echo "gwenview" ;; + *) blob-default-mime image ;; + esac + exit 0 +fi + +case "$1" in +loupe) desktop_id="org.gnome.Loupe.desktop"; name="Loupe" ;; +imv) desktop_id="imv.desktop"; name="imv" ;; +eog) desktop_id="org.gnome.eog.desktop"; name="Eye of GNOME" ;; +gwenview) desktop_id="org.kde.gwenview.desktop"; name="Gwenview" ;; +*) + echo "Usage: blob-default-image-viewer " + exit 1 + ;; +esac + +blob-default-mime image "$desktop_id" || exit 1 + +blob-notify-send -g 󰋩 "$name is now the default image viewer" diff --git a/bin/blob-default-mime b/bin/blob-default-mime new file mode 100755 index 0000000..72d3d0b --- /dev/null +++ b/bin/blob-default-mime @@ -0,0 +1,23 @@ +#!/bin/bash + +# blob:summary=Get or set the application that opens one group of file types +# blob:args= [desktop-id] +# blob:examples=blob default mime image | blob default mime video vlc.desktop +# blob:hidden=true + +kind="${1:-}" +desktop_id="${2:-}" +types_file="$BLOB_PATH/default/mime/$kind.types" + +if [[ -z $kind || ! -f $types_file ]]; then + echo "Usage: blob-default-mime [desktop-id]" >&2 + exit 1 +fi + +if [[ -z $desktop_id ]]; then + xdg-mime query default "$(head -1 "$types_file")" + exit 0 +fi + +mapfile -t mime_types < <(grep -v '^[[:space:]]*$' "$types_file") +xdg-mime default "$desktop_id" "${mime_types[@]}" diff --git a/bin/blob-default-pdf-viewer b/bin/blob-default-pdf-viewer new file mode 100755 index 0000000..7012acf --- /dev/null +++ b/bin/blob-default-pdf-viewer @@ -0,0 +1,35 @@ +#!/bin/bash + +# blob:summary=Set the default PDF and document viewer +# blob:args=[evince|papers|okular|zathura|firefox|chromium] +# blob:examples=blob default pdf-viewer evince | blob default pdf-viewer zathura + +if (($# == 0)); then + case "$(blob-default-mime pdf)" in + org.gnome.Evince.desktop) echo "evince" ;; + org.gnome.Papers.desktop) echo "papers" ;; + org.kde.okular.desktop) echo "okular" ;; + org.pwmt.zathura.desktop) echo "zathura" ;; + firefox.desktop) echo "firefox" ;; + chromium.desktop) echo "chromium" ;; + *) blob-default-mime pdf ;; + esac + exit 0 +fi + +case "$1" in +evince) desktop_id="org.gnome.Evince.desktop"; name="Evince" ;; +papers) desktop_id="org.gnome.Papers.desktop"; name="Papers" ;; +okular) desktop_id="org.kde.okular.desktop"; name="Okular" ;; +zathura) desktop_id="org.pwmt.zathura.desktop"; name="Zathura" ;; +firefox) desktop_id="firefox.desktop"; name="Firefox" ;; +chromium) desktop_id="chromium.desktop"; name="Chromium" ;; +*) + echo "Usage: blob-default-pdf-viewer " + exit 1 + ;; +esac + +blob-default-mime pdf "$desktop_id" || exit 1 + +blob-notify-send -g 󰈦 "$name is now the default PDF viewer" diff --git a/bin/blob-default-video-player b/bin/blob-default-video-player new file mode 100755 index 0000000..22d5144 --- /dev/null +++ b/bin/blob-default-video-player @@ -0,0 +1,31 @@ +#!/bin/bash + +# blob:summary=Set the default video and audio player +# blob:args=[mpv|vlc|celluloid|totem] +# blob:examples=blob default video-player mpv | blob default video-player vlc + +if (($# == 0)); then + case "$(blob-default-mime video)" in + mpv.desktop) echo "mpv" ;; + vlc.desktop) echo "vlc" ;; + io.github.celluloid_player.Celluloid.desktop) echo "celluloid" ;; + org.gnome.Totem.desktop) echo "totem" ;; + *) blob-default-mime video ;; + esac + exit 0 +fi + +case "$1" in +mpv) desktop_id="mpv.desktop"; name="mpv" ;; +vlc) desktop_id="vlc.desktop"; name="VLC" ;; +celluloid) desktop_id="io.github.celluloid_player.Celluloid.desktop"; name="Celluloid" ;; +totem) desktop_id="org.gnome.Totem.desktop"; name="GNOME Videos" ;; +*) + echo "Usage: blob-default-video-player " + exit 1 + ;; +esac + +blob-default-mime video "$desktop_id" || exit 1 + +blob-notify-send -g 󰕧 "$name is now the default video player" diff --git a/default/blob/blob-menu.jsonc b/default/blob/blob-menu.jsonc index 2f4376b..77619b8 100644 --- a/default/blob/blob-menu.jsonc +++ b/default/blob/blob-menu.jsonc @@ -232,6 +232,23 @@ "setup.default.editor.helix": {"icon":"","label":"Helix","when":"blob-cmd-present helix","checked":"[[ \"$(blob-default-editor)\" == \"helix\" ]]","action":"blob-default-editor helix"}, "setup.default.editor.vim": {"icon":"","label":"Vim","when":"blob-cmd-present vim","checked":"[[ \"$(blob-default-editor)\" == \"vim\" ]]","action":"blob-default-editor vim"}, "setup.default.editor.emacs": {"icon":"","label":"Emacs","when":"blob-cmd-present emacs","checked":"[[ \"$(blob-default-editor)\" == \"emacs\" ]]","action":"blob-default-editor emacs"}, + "setup.default.image": {"icon":"󰋩","label":"Image Viewer","title":"Default Image Viewer"}, + "setup.default.image.loupe": {"icon":"󰋩","label":"Loupe","when":"blob-cmd-present loupe","checked":"[[ \"$(blob-default-image-viewer)\" == \"loupe\" ]]","action":"blob-default-image-viewer loupe"}, + "setup.default.image.imv": {"icon":"󰋩","label":"imv","when":"blob-cmd-present imv","checked":"[[ \"$(blob-default-image-viewer)\" == \"imv\" ]]","action":"blob-default-image-viewer imv"}, + "setup.default.image.eog": {"icon":"󰋩","label":"Eye of GNOME","when":"blob-cmd-present eog","checked":"[[ \"$(blob-default-image-viewer)\" == \"eog\" ]]","action":"blob-default-image-viewer eog"}, + "setup.default.image.gwenview": {"icon":"󰋩","label":"Gwenview","when":"blob-cmd-present gwenview","checked":"[[ \"$(blob-default-image-viewer)\" == \"gwenview\" ]]","action":"blob-default-image-viewer gwenview"}, + "setup.default.video": {"icon":"󰕧","label":"Video Player","title":"Default Video Player"}, + "setup.default.video.mpv": {"icon":"󰕧","label":"mpv","when":"blob-cmd-present mpv","checked":"[[ \"$(blob-default-video-player)\" == \"mpv\" ]]","action":"blob-default-video-player mpv"}, + "setup.default.video.vlc": {"icon":"󰕼","label":"VLC","when":"blob-cmd-present vlc","checked":"[[ \"$(blob-default-video-player)\" == \"vlc\" ]]","action":"blob-default-video-player vlc"}, + "setup.default.video.celluloid": {"icon":"󰕧","label":"Celluloid","when":"blob-cmd-present celluloid","checked":"[[ \"$(blob-default-video-player)\" == \"celluloid\" ]]","action":"blob-default-video-player celluloid"}, + "setup.default.video.totem": {"icon":"󰕧","label":"GNOME Videos","when":"blob-cmd-present totem","checked":"[[ \"$(blob-default-video-player)\" == \"totem\" ]]","action":"blob-default-video-player totem"}, + "setup.default.pdf": {"icon":"󰈦","label":"PDF Viewer","title":"Default PDF Viewer"}, + "setup.default.pdf.evince": {"icon":"󰈦","label":"Evince","when":"blob-cmd-present evince","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"evince\" ]]","action":"blob-default-pdf-viewer evince"}, + "setup.default.pdf.papers": {"icon":"󰈦","label":"Papers","when":"blob-cmd-present papers","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"papers\" ]]","action":"blob-default-pdf-viewer papers"}, + "setup.default.pdf.okular": {"icon":"󰈦","label":"Okular","when":"blob-cmd-present okular","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"okular\" ]]","action":"blob-default-pdf-viewer okular"}, + "setup.default.pdf.zathura": {"icon":"󰈦","label":"Zathura","when":"blob-cmd-present zathura","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"zathura\" ]]","action":"blob-default-pdf-viewer zathura"}, + "setup.default.pdf.firefox": {"icon":"","label":"Firefox","when":"blob-cmd-present firefox","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"firefox\" ]]","action":"blob-default-pdf-viewer firefox"}, + "setup.default.pdf.chromium": {"icon":"","label":"Chromium","when":"blob-cmd-present chromium","checked":"[[ \"$(blob-default-pdf-viewer)\" == \"chromium\" ]]","action":"blob-default-pdf-viewer chromium"}, "setup.plugin": {"icon":"󰐱","label":"Plugins","aliases":["plugin","plugins"]}, "setup.plugin.enable": {"icon":"󰄬","label":"Enable Plugin","action":"blob-menu-plugin enable"}, "setup.plugin.disable": {"icon":"󰅖","label":"Disable Plugin","action":"blob-menu-plugin disable"}, diff --git a/default/mime/archive.types b/default/mime/archive.types new file mode 100644 index 0000000..659b020 --- /dev/null +++ b/default/mime/archive.types @@ -0,0 +1,9 @@ +application/zip +application/x-7z-compressed +application/vnd.rar +application/x-tar +application/x-compressed-tar +application/gzip +application/x-xz +application/x-bzip2 +application/zstd diff --git a/default/mime/document.types b/default/mime/document.types new file mode 100644 index 0000000..f014075 --- /dev/null +++ b/default/mime/document.types @@ -0,0 +1,4 @@ +application/vnd.oasis.opendocument.text +application/msword +application/vnd.openxmlformats-officedocument.wordprocessingml.document +application/rtf diff --git a/default/mime/image.types b/default/mime/image.types new file mode 100644 index 0000000..58c92ea --- /dev/null +++ b/default/mime/image.types @@ -0,0 +1,9 @@ +image/png +image/jpeg +image/gif +image/webp +image/bmp +image/tiff +image/avif +image/heif +image/svg+xml diff --git a/default/mime/pdf.types b/default/mime/pdf.types new file mode 100644 index 0000000..22d2b93 --- /dev/null +++ b/default/mime/pdf.types @@ -0,0 +1,6 @@ +application/pdf +application/postscript +image/vnd.djvu +application/oxps +application/vnd.comicbook+zip +application/x-cbz diff --git a/default/mime/presentation.types b/default/mime/presentation.types new file mode 100644 index 0000000..a0ce3e8 --- /dev/null +++ b/default/mime/presentation.types @@ -0,0 +1,3 @@ +application/vnd.oasis.opendocument.presentation +application/vnd.ms-powerpoint +application/vnd.openxmlformats-officedocument.presentationml.presentation diff --git a/default/mime/spreadsheet.types b/default/mime/spreadsheet.types new file mode 100644 index 0000000..1420e31 --- /dev/null +++ b/default/mime/spreadsheet.types @@ -0,0 +1,4 @@ +application/vnd.oasis.opendocument.spreadsheet +application/vnd.ms-excel +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet +text/csv diff --git a/default/mime/text.types b/default/mime/text.types new file mode 100644 index 0000000..30e5352 --- /dev/null +++ b/default/mime/text.types @@ -0,0 +1,2 @@ +text/plain +text/markdown diff --git a/default/mime/video.types b/default/mime/video.types new file mode 100644 index 0000000..b9eef81 --- /dev/null +++ b/default/mime/video.types @@ -0,0 +1,12 @@ +video/mp4 +video/x-matroska +video/webm +video/quicktime +video/x-msvideo +video/mpeg +video/ogg +audio/mpeg +audio/flac +audio/ogg +audio/x-wav +audio/mp4 diff --git a/docs/commands.md b/docs/commands.md index cfada73..873fd22 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -128,7 +128,11 @@ of the `blob` listing. | --- | --- | --- | | `blob-default-browser` | Set the default browser for Blob and XDG handlers | [chromium\|chrome\|brave\|brave-origin\|edge\|firefox\|zen] | | `blob-default-editor` | Set the default editor used by blob-launch-editor | [code\|cursor\|zed\|sublime_text\|helix\|vim\|emacs\|nvim] | +| `blob-default-image-viewer` | Set the default image viewer | [loupe\|imv\|eog\|gwenview] | +| `blob-default-mime` | Get or set the application that opens one group of file types (hidden) | [desktop-id] | +| `blob-default-pdf-viewer` | Set the default PDF and document viewer | [evince\|papers\|okular\|zathura\|firefox\|chromium] | | `blob-default-terminal` | Set the default terminal used by xdg-terminal-exec | [alacritty\|foot\|ghostty\|kitty] | +| `blob-default-video-player` | Set the default video and audio player | [mpv\|vlc\|celluloid\|totem] | ## disk diff --git a/docs/install.md b/docs/install.md index a5dca99..b3ea61b 100644 --- a/docs/install.md +++ b/docs/install.md @@ -19,7 +19,7 @@ with `--check`. | `install/steps/services.sh` | system services, systemd drop-ins, user units | | `install/steps/boot.sh` | the Plymouth boot splash, GRUB, and other-OS detection | | `install/steps/theme.sh` | the wallpaper link, the first theme, the first background | -| `install/steps/apps.sh` | default applications for images, video, PDFs and office files | +| `install/steps/apps.sh` | default applications for images, video, PDFs, office files, text and archives, with the file types read from `default/mime/` | | `install/steps/login.sh` | SDDM, the session entry, and the first launch | | `install/steps/reload.sh` | reloading systemd, the user services, and a running session | @@ -66,7 +66,10 @@ with `--check`. images, `mpv` for video and audio, `evince` for PDFs and other documents, LibreOffice for documents, spreadsheets and presentations, GNOME Text Editor for text, and File Roller for archives. A file type that already has a - default there is left alone. See [packages.md](packages.md#desktop-applications). + default there is left alone. The file types for each group are listed in + `default/mime/.types`, and Setup > Defaults in the Blob menu changes + the image viewer, video player and PDF viewer later. See + [packages.md](packages.md#desktop-applications). `~/.bashrc` gets one line sourcing `session/bashrc`. The line is added once, a `.bak` is kept, and a `~/.bashrc` that already has it is left alone. `session/profile.sh` also goes to `/etc/profile.d/blob.sh`, which sources diff --git a/docs/packages.md b/docs/packages.md index 793be9e..28ede2b 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -180,7 +180,21 @@ the next boot, or now with `sudo systemctl start netbird@main`. `install.sh` makes them the default for their file types through `xdg-mime`, which writes `~/.config/mimeapps.list`. A type that already has a default in that file is left alone, so a choice you made yourself always wins, and an app -that is not installed is skipped. +that is not installed is skipped. The file types for each group are listed once, in +`default/mime/.types`, and read by both the installer and +`blob-default-mime`. + +To change them later, use Setup > Defaults in the Blob menu, which has Image +Viewer, Video Player and PDF Viewer next to Browser, Terminal and Editor, or: + +``` +blob default image-viewer imv +blob default video-player vlc +blob default pdf-viewer zathura +``` + +Each lists only the apps it knows, shows only the installed ones in the menu, +and sets the whole group of file types at once. ## The boot splash diff --git a/install/steps/apps.sh b/install/steps/apps.sh index 14c6de6..f15b389 100644 --- a/install/steps/apps.sh +++ b/install/steps/apps.sh @@ -1,14 +1,16 @@ mimeapps_file="$config_dir/mimeapps.list" +mime_types_dir="$repo_dir/default/mime" + default_app_associations=( - "org.gnome.Loupe.desktop:image/png image/jpeg image/gif image/webp image/bmp image/tiff image/avif image/heif image/svg+xml" - "mpv.desktop:video/mp4 video/x-matroska video/webm video/quicktime video/x-msvideo video/mpeg video/ogg audio/mpeg audio/flac audio/ogg audio/x-wav audio/mp4" - "org.gnome.Evince.desktop:application/pdf application/postscript image/vnd.djvu application/oxps application/vnd.comicbook+zip application/x-cbz" - "libreoffice-writer.desktop:application/vnd.oasis.opendocument.text application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document application/rtf" - "libreoffice-calc.desktop:application/vnd.oasis.opendocument.spreadsheet application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet text/csv" - "libreoffice-impress.desktop:application/vnd.oasis.opendocument.presentation application/vnd.ms-powerpoint application/vnd.openxmlformats-officedocument.presentationml.presentation" - "org.gnome.TextEditor.desktop:text/plain text/markdown" - "org.gnome.FileRoller.desktop:application/zip application/x-7z-compressed application/vnd.rar application/x-tar application/x-compressed-tar application/gzip application/x-xz application/x-bzip2 application/zstd" + "org.gnome.Loupe.desktop:image" + "mpv.desktop:video" + "org.gnome.Evince.desktop:pdf" + "libreoffice-writer.desktop:document" + "libreoffice-calc.desktop:spreadsheet" + "libreoffice-impress.desktop:presentation" + "org.gnome.TextEditor.desktop:text" + "org.gnome.FileRoller.desktop:archive" ) mime_default_chosen() { @@ -26,15 +28,17 @@ install_default_apps() { return 0 fi - local pending=() entry desktop_file mime_types mime_type + local pending=() entry desktop_file kind mime_type for entry in "${default_app_associations[@]}"; do desktop_file="${entry%%:*}" - mime_types="${entry#*:}" + kind="${entry#*:}" [[ -f /usr/share/applications/$desktop_file ]] || continue - for mime_type in $mime_types; do + [[ -f $mime_types_dir/$kind.types ]] || continue + while IFS= read -r mime_type; do + [[ -n $mime_type ]] || continue mime_default_chosen "$mime_type" && continue pending+=("$desktop_file:$mime_type") - done + done <"$mime_types_dir/$kind.types" done if (( ${#pending[@]} == 0 )); then