diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 274aef0a..9486a3d1 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -322,7 +322,8 @@ show_screensaver_menu() { } show_theme_menu() { - omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400 + theme=$(omarchy-theme-switcher) + [[ -n $theme ]] && omarchy-theme-set "$theme" } show_background_menu() { diff --git a/bin/omarchy-menu-images b/bin/omarchy-menu-images index c4787f45..11d08667 100755 --- a/bin/omarchy-menu-images +++ b/bin/omarchy-menu-images @@ -1,14 +1,11 @@ #!/bin/bash # omarchy:summary=Open a generic image selector menu -# omarchy:group=menu -# omarchy:name=images -# omarchy:args=[--selected ] [--namespace ] [--colors-file ] ... +# omarchy:args=[--selected ] [--colors-file ] ... OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy} selected_image="" -namespace="omarchy-image-selector" colors_file="" image_dirs=() @@ -18,16 +15,12 @@ while [[ $# -gt 0 ]]; do selected_image="$2" shift 2 ;; - --namespace) - namespace="$2" - shift 2 - ;; --colors-file) colors_file="$2" shift 2 ;; --help|-h) - echo "Usage: omarchy-menu-images [--selected ] [--namespace ] [--colors-file ] ..." + echo "Usage: omarchy-menu-images [--selected ] [--colors-file ] ..." exit 0 ;; *) @@ -38,7 +31,7 @@ while [[ $# -gt 0 ]]; do done if (( ${#image_dirs[@]} == 0 )); then - echo "Usage: omarchy-menu-images [--selected ] [--namespace ] [--colors-file ] ..." >&2 + echo "Usage: omarchy-menu-images [--selected ] [--colors-file ] ..." >&2 exit 1 fi @@ -85,7 +78,6 @@ done OMARCHY_IMAGE_SELECTOR_SELECTION_FILE=$selection_file \ OMARCHY_IMAGE_SELECTOR_DIRS="$image_dirs_env" \ OMARCHY_IMAGE_SELECTOR_SELECTED="$selected_list_image" \ - OMARCHY_IMAGE_SELECTOR_NAMESPACE="$namespace" \ OMARCHY_IMAGE_SELECTOR_COLORS_FILE="$colors_file" \ quickshell -p "$OMARCHY_PATH/default/quickshell/wallpaper-switcher.qml" >/dev/null diff --git a/bin/omarchy-theme-bg-switcher b/bin/omarchy-theme-bg-switcher index 06037639..16b9e2bb 100755 --- a/bin/omarchy-theme-bg-switcher +++ b/bin/omarchy-theme-bg-switcher @@ -11,6 +11,5 @@ current_background=$(readlink -f "$HOME/.config/omarchy/current/background" 2>/d omarchy-menu-images \ --selected "$current_background" \ - --namespace "omarchy-wallpaper-switcher" \ "$HOME/.config/omarchy/current/theme/backgrounds" \ "$HOME/.config/omarchy/backgrounds/$theme_name" diff --git a/bin/omarchy-theme-switcher b/bin/omarchy-theme-switcher new file mode 100755 index 00000000..3b498394 --- /dev/null +++ b/bin/omarchy-theme-switcher @@ -0,0 +1,62 @@ +#!/bin/bash + +# omarchy:summary=Open the Omarchy theme switcher + +OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy} +USER_THEMES_PATH="$HOME/.config/omarchy/themes" +OMARCHY_THEMES_PATH="$OMARCHY_PATH/themes" + +preview_dir=$(mktemp -d) +trap 'rm -rf "$preview_dir"' EXIT + +find_preview() { + local theme_path="$1" + + if [[ -f $theme_path/preview.png ]]; then + printf '%s\n' "$theme_path/preview.png" + elif [[ -f $theme_path/preview.jpg ]]; then + printf '%s\n' "$theme_path/preview.jpg" + elif [[ -d $theme_path/backgrounds ]]; then + find -L "$theme_path/backgrounds" -maxdepth 1 -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' \) -print -quit 2>/dev/null + fi +} + +add_theme_preview() { + local theme_name="$1" + local preview="$2" + local extension="${preview##*.}" + + [[ -n $preview ]] || return + [[ -e $preview_dir/$theme_name.$extension ]] && return + + ln -s "$preview" "$preview_dir/$theme_name.$extension" +} + +while IFS= read -r theme_path; do + theme_name=${theme_path##*/} + preview=$(find_preview "$theme_path") + + if [[ -z $preview ]]; then + preview=$(find_preview "$OMARCHY_THEMES_PATH/$theme_name") + fi + + add_theme_preview "$theme_name" "$preview" +done < <(find -L "$USER_THEMES_PATH" -mindepth 1 -maxdepth 1 \( -type d -o -type l \) -print 2>/dev/null | sort) + +while IFS= read -r theme_path; do + theme_name=${theme_path##*/} + preview=$(find_preview "$theme_path") + add_theme_preview "$theme_name" "$preview" +done < <(find -L "$OMARCHY_THEMES_PATH" -mindepth 1 -maxdepth 1 -type d -print 2>/dev/null | sort) + +current_theme=$(cat "$HOME/.config/omarchy/current/theme.name" 2>/dev/null) +selected_preview=$(find -L "$preview_dir" -maxdepth 1 -type f -name "$current_theme.*" -print -quit 2>/dev/null) +selected_preview=$(omarchy-menu-images \ + --selected "$selected_preview" \ + "$preview_dir") + +if [[ -n $selected_preview ]]; then + selected_theme=${selected_preview##*/} + selected_theme=${selected_theme%.*} + printf '%s\n' "$selected_theme" +fi diff --git a/default/quickshell/wallpaper-switcher.qml b/default/quickshell/wallpaper-switcher.qml index f54a4d4e..e686fbe9 100644 --- a/default/quickshell/wallpaper-switcher.qml +++ b/default/quickshell/wallpaper-switcher.qml @@ -12,7 +12,6 @@ ShellRoot { property string selectionFile: Quickshell.env("OMARCHY_IMAGE_SELECTOR_SELECTION_FILE") || Quickshell.env("OMARCHY_WALLPAPER_SELECTION_FILE") property string selectedImage: Quickshell.env("OMARCHY_IMAGE_SELECTOR_SELECTED") property string colorsFile: Quickshell.env("OMARCHY_IMAGE_SELECTOR_COLORS_FILE") || (Quickshell.env("HOME") + "/.config/omarchy/current/theme/wallpaper-switcher-colors.json") - property string layerNamespace: Quickshell.env("OMARCHY_IMAGE_SELECTOR_NAMESPACE") || "omarchy-image-selector" property int selectedIndex: 0 property bool imagesLoaded: false property color accent: "#798186" @@ -134,7 +133,7 @@ ShellRoot { visible: root.imagesLoaded anchors { top: true; bottom: true; left: true; right: true } color: "transparent" - WlrLayershell.namespace: root.layerNamespace + WlrLayershell.namespace: "omarchy-image-selector" WlrLayershell.layer: WlrLayer.Overlay WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive exclusionMode: ExclusionMode.Ignore