diff --git a/bin/omarchy b/bin/omarchy index ad743ce7..29b7cfb4 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -69,6 +69,7 @@ GROUP_DESCRIPTIONS[tz]="Timezone selection" GROUP_DESCRIPTIONS[update]="Omarchy and system updates" GROUP_DESCRIPTIONS[version]="Version and channel information" GROUP_DESCRIPTIONS[voxtype]="Voxtype dictation" +GROUP_DESCRIPTIONS[weather]="Weather status" GROUP_DESCRIPTIONS[webapp]="Web app launchers" GROUP_DESCRIPTIONS[wifi]="Wi-Fi helpers" GROUP_DESCRIPTIONS[windows]="Windows VM management" diff --git a/bin/omarchy-first-run b/bin/omarchy-first-run index 8fde0534..6ad54141 100755 --- a/bin/omarchy-first-run +++ b/bin/omarchy-first-run @@ -18,6 +18,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh" + omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook" sudo rm -f /etc/sudoers.d/first-run bash "$OMARCHY_PATH/install/first-run/welcome.sh" diff --git a/bin/omarchy-hook b/bin/omarchy-hook index 85b5a180..8c2a59d9 100755 --- a/bin/omarchy-hook +++ b/bin/omarchy-hook @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update). +# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/ and ~/.config/omarchy/hooks/.d/. # omarchy:args=[name] [args...] set -e @@ -12,8 +12,17 @@ fi HOOK=$1 HOOK_PATH="$HOME/.config/omarchy/hooks/$1" +HOOK_DIR="$HOOK_PATH.d" shift if [[ -f $HOOK_PATH ]]; then - bash "$HOOK_PATH" "$@" + bash "$HOOK_PATH" "$@" || echo "Hook failed: $HOOK_PATH" +fi + +if [[ -d $HOOK_DIR ]]; then + for hook in "$HOOK_DIR"/*; do + [[ -f $hook ]] || continue + [[ $hook == *.sample ]] && continue + bash "$hook" "$@" || echo "Hook failed: $hook" + done fi diff --git a/bin/omarchy-hook-install b/bin/omarchy-hook-install new file mode 100755 index 00000000..7c536482 --- /dev/null +++ b/bin/omarchy-hook-install @@ -0,0 +1,31 @@ +#!/bin/bash + +# omarchy:summary=Install a hook into ~/.config/omarchy/hooks/.d/ +# omarchy:group=hook +# omarchy:name=install +# omarchy:args= +# omarchy:examples=omarchy hook install post-update ~/my-hook + +set -e + +if (( $# != 2 )); then + echo "Usage: omarchy-hook-install " + exit 1 +fi + +HOOK_TYPE=$1 +HOOK_FILE=$2 +HOOK_DIR="$HOME/.config/omarchy/hooks/$HOOK_TYPE.d" +HOOK_NAME=$(basename "$HOOK_FILE") +HOOK_PATH="$HOOK_DIR/$HOOK_NAME" + +if [[ ! -f $HOOK_FILE ]]; then + echo "Hook file not found: $HOOK_FILE" + exit 1 +fi + +mkdir -p "$HOOK_DIR" +cp "$HOOK_FILE" "$HOOK_PATH" +chmod 755 "$HOOK_PATH" + +echo "Installed $HOOK_TYPE hook: $HOOK_PATH" diff --git a/bin/omarchy-plymouth-set b/bin/omarchy-plymouth-set index ff9ca27d..c92ca53c 100755 --- a/bin/omarchy-plymouth-set +++ b/bin/omarchy-plymouth-set @@ -68,10 +68,16 @@ sddm_dir="/usr/share/sddm/themes/omarchy" sddm_template="$HOME/.local/share/omarchy/default/sddm/omarchy/Main.qml" sed \ - -e "s/#000000/#$bg_hex/g" \ + -e "s/#1a1b26/#$bg_hex/g" \ -e "s/#ffffff/#$text_hex/g" \ - -e 's|source: "logo.svg"|source: "logo.png"|' \ "$sddm_template" | sudo tee "$sddm_dir/Main.qml" >/dev/null sudo cp "$logo_path" "$sddm_dir/logo.png" +for asset in bullet.png entry.png lock.png; do + sudo cp "$staging_dir/$asset" "$sddm_dir/$asset" +done +for asset in entry lock; do + magick "$staging_dir/$asset.png" -channel RGB +level-colors "#f7768e","#f7768e" "$staging_dir/$asset-failed.png" + sudo cp "$staging_dir/$asset-failed.png" "$sddm_dir/$asset-failed.png" +done sudo rm -f "$sddm_dir/logo.svg" diff --git a/bin/omarchy-voxtype-install b/bin/omarchy-voxtype-install index e2ab8a53..32a1153e 100755 --- a/bin/omarchy-voxtype-install +++ b/bin/omarchy-voxtype-install @@ -21,5 +21,5 @@ if gum confirm "Install Voxtype + AI model (~150MB) to enable dictation?"; then voxtype setup systemd omarchy-restart-waybar - notify-send " Voxtype Dictation Ready" "Hold F9 (or toggle Super + Ctrl + X) to dictate.\nEdit ~/.config/voxtype/config.toml for options." -t 10000 + notify-send " Voxtype Dictation Ready" "Hold F9 to dictate (or toggle with Super + Ctrl + X)." -t 10000 fi diff --git a/bin/omarchy-weather-icon b/bin/omarchy-weather-icon new file mode 100755 index 00000000..072af706 --- /dev/null +++ b/bin/omarchy-weather-icon @@ -0,0 +1,36 @@ +#!/bin/bash + +# omarchy:summary=Returns a weather condition icon, adjusted for live sunrise and sunset. + +weather_data=$(curl -fsS --max-time 3 "https://wttr.in?format=j1" 2>/dev/null | jq -er '[.current_condition[0].weatherCode, .weather[0].astronomy[0].sunrise, .weather[0].astronomy[0].sunset] | select(all(. != null and . != "")) | @tsv' 2>/dev/null) || exit 1 + +IFS=$'\t' read -r weather_code sunrise sunset <<< "$weather_data" +if [[ ! $weather_code =~ ^[0-9]+$ || ! $sunrise =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ || ! $sunset =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ ]]; then + exit 1 +fi + +now_epoch=$(date +%s) +sunrise_epoch=$(date -d "today $sunrise" +%s 2>/dev/null || echo 0) +sunset_epoch=$(date -d "today $sunset" +%s 2>/dev/null || echo 0) + +if (( sunrise_epoch > 0 && sunset_epoch > 0 && (now_epoch < sunrise_epoch || now_epoch >= sunset_epoch) )); then + night=true +else + night=false +fi + +case $weather_code in + 113) [[ $night == "true" ]] && icon="" || icon="" ;; + 116) [[ $night == "true" ]] && icon="" || icon="" ;; + 119|122) icon="" ;; + 143|248|260) icon="" ;; + 176|263|266|293|296|353) [[ $night == "true" ]] && icon="" || icon="" ;; + 179|227|230|323|326|368) [[ $night == "true" ]] && icon="" || icon="" ;; + 182|185|281|284|311|314|317|320|350|362|365|374|377) icon="" ;; + 200|386|389|392|395) icon="" ;; + 299|302|305|308|356|359) icon="" ;; + 329|332|335|338|371) icon="" ;; + *) icon="" ;; +esac + +printf '%s\n' "$icon" diff --git a/bin/omarchy-weather-status b/bin/omarchy-weather-status new file mode 100755 index 00000000..126d6582 --- /dev/null +++ b/bin/omarchy-weather-status @@ -0,0 +1,26 @@ +#!/bin/bash + +# omarchy:summary=Returns a formatted weather status string with temperature and wind speed. + +weather=$(curl -fsS --max-time 4 "https://wttr.in?format=%l|%t|%w" 2>/dev/null | tr -d '\n') + +if [[ -z $weather ]]; then + echo "Weather unavailable" + exit 1 +fi + +IFS='|' read -r place temperature wind <<< "$weather" +place=${place%%,*} +place=${place^} +format_temperature() { + local celsius=${1#+} + celsius=${celsius//°/} + celsius=${celsius%C} + + echo "${celsius}°c / $((celsius * 9 / 5 + 32))°f" +} + +temperature=$(format_temperature "$temperature") +wind=${wind//km\// km/} + +echo "$(omarchy-weather-icon) $place · Temperature $temperature · Wind $wind" diff --git a/config/omarchy/hooks/battery-low.sample b/config/omarchy/hooks/battery-low.d/play-warning-sound.sample similarity index 95% rename from config/omarchy/hooks/battery-low.sample rename to config/omarchy/hooks/battery-low.d/play-warning-sound.sample index dc3726a9..61da3320 100644 --- a/config/omarchy/hooks/battery-low.sample +++ b/config/omarchy/hooks/battery-low.d/play-warning-sound.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the current battery percentage when the low battery -# notification is sent. To put it into use, remove .sample from the name. +# notification is sent. To put it into use, remove .sample from this file name. SOUND_FILE="/usr/share/sounds/freedesktop/stereo/dialog-warning.oga" diff --git a/config/omarchy/hooks/font-set.sample b/config/omarchy/hooks/font-set.d/show-font-notification.sample similarity index 57% rename from config/omarchy/hooks/font-set.sample rename to config/omarchy/hooks/font-set.d/show-font-notification.sample index 3f0109a9..a75f2fa8 100644 --- a/config/omarchy/hooks/font-set.sample +++ b/config/omarchy/hooks/font-set.d/show-font-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the snake-cased name of the font that has just been set. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. -# Example: Show the name of the theme that was just set. +# Example: Show the name of the font that was just set. # notify-send -u low "New font" "Your new font is $1" diff --git a/config/omarchy/hooks/post-update.sample b/config/omarchy/hooks/post-update.d/show-update-notification.sample similarity index 79% rename from config/omarchy/hooks/post-update.sample rename to config/omarchy/hooks/post-update.d/show-update-notification.sample index f740d5bb..f6ba07b0 100644 --- a/config/omarchy/hooks/post-update.sample +++ b/config/omarchy/hooks/post-update.d/show-update-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called after an Omarchy system update has been performed. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. # Example: Show notification after the system has been updated. # notify-send -u low "Update Performed" "Your system is now up to date" diff --git a/config/omarchy/hooks/theme-set.sample b/config/omarchy/hooks/theme-set.d/show-theme-notification.sample similarity index 78% rename from config/omarchy/hooks/theme-set.sample rename to config/omarchy/hooks/theme-set.d/show-theme-notification.sample index 2d13287f..db19b298 100644 --- a/config/omarchy/hooks/theme-set.sample +++ b/config/omarchy/hooks/theme-set.d/show-theme-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the snake-cased name of the theme that has just been set. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. # Example: Show the name of the theme that was just set. # notify-send -u low "New theme" "Your new theme is $1" diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index cbf211c3..61a11eca 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -5,7 +5,7 @@ "spacing": 0, "height": 26, "modules-left": ["custom/omarchy", "hyprland/workspaces"], - "modules-center": ["clock", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"], + "modules-center": ["clock", "custom/weather", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"], "modules-right": [ "group/tray-expander", "bluetooth", @@ -66,6 +66,13 @@ "tooltip": false, "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select" }, + "custom/weather": { + "exec": "$OMARCHY_PATH/default/waybar/weather.sh", + "return-type": "json", + "interval": 600, + "tooltip": false, + "on-click": "notify-send -u low \"$(omarchy-weather-status)\"" + }, "network": { "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], "format": "{icon}", diff --git a/config/waybar/style.css b/config/waybar/style.css index 4bbf0ddb..63302efa 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -67,6 +67,17 @@ tooltip { margin-left: 8.75px; } +#custom-weather { + margin-left: 7.5px; + margin-right: 7.5px; +} + +#custom-weather.unavailable { + min-width: 0; + margin: 0; + padding: 0; +} + .hidden { opacity: 0; } diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index 083a4c91..c152f884 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -49,6 +49,7 @@ bindd = SUPER CTRL, R, Transcode, exec, omarchy-menu transcode # Waybar-less information bindd = SUPER CTRL ALT, T, Show time, exec, notify-send -u low " $(date +"%A %H:%M · %d %B %Y · Week %V")" bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send -u low "$(omarchy-battery-status)" +bindd = SUPER CTRL ALT, W, Show weather, exec, notify-send -u low "$(omarchy-weather-status)" # Control panels bindd = SUPER CTRL, A, Audio controls, exec, omarchy-launch-audio diff --git a/default/mako/core.ini b/default/mako/core.ini index 203d4e8c..78c24452 100644 --- a/default/mako/core.ini +++ b/default/mako/core.ini @@ -29,6 +29,9 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy [summary~="Learn Keybindings"] on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings' +[summary~="Install Dictation with Voxtype"] +on-button-left=exec sh -c 'omarchy-notification-dismiss "Install Dictation with Voxtype"; omarchy-launch-floating-terminal-with-presentation omarchy-voxtype-install' + [summary~="Screenshot copied & saved"] max-icon-size=80 format=%s\n%b diff --git a/default/nautilus-python/extensions/transcode.py b/default/nautilus-python/extensions/transcode.py new file mode 100644 index 00000000..be1dfe4b --- /dev/null +++ b/default/nautilus-python/extensions/transcode.py @@ -0,0 +1,94 @@ +import shlex +import shutil + +from gi import require_version + +require_version("Nautilus", "4.1") + +from gi.repository import GObject, Gio, Nautilus + + +SUPPORTED_MIME_PREFIXES = ("image/", "video/") +SUPPORTED_EXTENSIONS = { + ".jpg", ".jpeg", ".png", ".webp", ".gif", ".heic", ".avif", + ".mp4", ".mov", ".m4v", ".mkv", ".webm", ".avi", +} + + +class TranscodeAction(GObject.GObject, Nautilus.MenuProvider): + def _launch_transcode(self, paths): + wrapper = shutil.which("omarchy-launch-floating-terminal-with-presentation") + binary = shutil.which("omarchy-transcode") + if not wrapper or not binary: + return + + if len(paths) == 1: + cmd = shlex.join([binary, paths[0]]) + else: + cmd = "; ".join( + f"echo {shlex.quote(f'Transcoding {path}')} && " + f"{shlex.join([binary, path])} || true" + for path in paths + ) + + Gio.Subprocess.new([wrapper, cmd], Gio.SubprocessFlags.NONE) + + def _is_supported(self, file): + mime = file.get_mime_type() or "" + if mime.startswith(SUPPORTED_MIME_PREFIXES): + return True + + location = file.get_location() + if not location: + return False + path = location.get_path() or "" + lower = path.lower() + return any(lower.endswith(ext) for ext in SUPPORTED_EXTENSIONS) + + def _selected_paths(self, files): + paths = [] + seen = set() + + for file in files: + if file.is_directory(): + continue + if not self._is_supported(file): + continue + location = file.get_location() + if not location: + continue + path = location.get_path() + if path and path not in seen: + seen.add(path) + paths.append(path) + return paths + + def _make_item(self, paths): + label = "Transcode" if len(paths) == 1 else f"Transcode {len(paths)} items" + item = Nautilus.MenuItem( + name="OmarchyTranscodeNautilus::transcode", + label=label, + icon="media-playback-start", + ) + item.connect("activate", self._on_activate, paths) + return item + + def _on_activate(self, _menu, paths): + self._launch_transcode(paths) + + def _tools_available(self): + return bool( + shutil.which("omarchy-launch-floating-terminal-with-presentation") + and shutil.which("omarchy-transcode") + ) + + def get_file_items(self, *args): + files = args[0] if len(args) == 1 else args[1] + if not self._tools_available(): + return [] + + paths = self._selected_paths(files) + if not paths: + return [] + + return [self._make_item(paths)] diff --git a/default/sddm/omarchy/Main.qml b/default/sddm/omarchy/Main.qml index d074913e..a65411e2 100644 --- a/default/sddm/omarchy/Main.qml +++ b/default/sddm/omarchy/Main.qml @@ -2,98 +2,115 @@ import QtQuick 2.0 import SddmComponents 2.0 Rectangle { - id: root - width: 640 - height: 480 - color: "#000000" + id: root + width: 640 + height: 480 + color: "#1a1b26" - property string currentUser: userModel.lastUser - property int sessionIndex: { - for (var i = 0; i < sessionModel.rowCount(); i++) { - var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() - if (name.indexOf("uwsm") !== -1) - return i - } - return sessionModel.lastIndex + property string currentUser: userModel.lastUser + property bool loginFailed: false + property int sessionIndex: { + for (var i = 0; i < sessionModel.rowCount(); i++) { + var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() + if (name.indexOf("uwsm") !== -1) + return i + } + return sessionModel.lastIndex + } + + Connections { + target: sddm + function onLoginFailed() { + root.loginFailed = true + password.text = "" + password.focus = true + } + function onLoginSucceeded() { + root.loginFailed = false + } + } + + Column { + anchors.centerIn: parent + spacing: 40 + + Image { + id: logo + source: "logo.png" + width: Math.min(sourceSize.width, root.width * 0.8) + height: sourceSize.width > 0 ? Math.round(width * sourceSize.height / sourceSize.width) : 0 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter: parent.horizontalCenter } - Connections { - target: sddm - function onLoginFailed() { - errorMessage.text = "Login failed" - password.text = "" - password.focus = true - } - function onLoginSucceeded() { - errorMessage.text = "" - } - } + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 15 - Column { - anchors.centerIn: parent - spacing: root.height * 0.04 - width: parent.width + Image { + source: root.loginFailed ? "lock-failed.png" : "lock.png" + width: 34 + height: 38 + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + } + + Item { + width: entry.width + height: entry.height Image { - source: "logo.svg" - width: root.width * 0.35 - height: Math.round(width * sourceSize.height / sourceSize.width) - fillMode: Image.PreserveAspectFit - anchors.horizontalCenter: parent.horizontalCenter + id: entry + source: root.loginFailed ? "entry-failed.png" : "entry.png" + anchors.centerIn: parent } Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: root.width * 0.007 + anchors.left: parent.left + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + spacing: 5 - Text { - text: "\uf023" - color: "#ffffff" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.025 - anchors.verticalCenter: parent.verticalCenter - } + Repeater { + model: Math.min(password.text.length, 21) - Rectangle { - width: root.width * 0.17 - height: root.height * 0.04 - color: "#000000" - border.color: "#ffffff" - border.width: 1 - clip: true - - TextInput { - id: password - anchors.fill: parent - anchors.margins: root.height * 0.008 - verticalAlignment: TextInput.AlignVCenter - echoMode: TextInput.Password - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.02 - font.letterSpacing: root.height * 0.004 - passwordCharacter: "\u2022" - color: "#ffffff" - focus: true - - Keys.onPressed: { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - sddm.login(root.currentUser, password.text, root.sessionIndex) - event.accepted = true - } - } - } + Image { + source: "bullet.png" + width: 7 + height: 7 } + } } - Text { - id: errorMessage - text: "" - color: "#f7768e" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.018 - anchors.horizontalCenter: parent.horizontalCenter + TextInput { + id: password + anchors.fill: parent + anchors.leftMargin: 20 + anchors.rightMargin: 20 + verticalAlignment: TextInput.AlignVCenter + echoMode: TextInput.Password + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: 24 + font.letterSpacing: 5 + passwordCharacter: "\u2022" + color: "transparent" + selectionColor: "transparent" + selectedTextColor: "transparent" + focus: true + + onTextChanged: root.loginFailed = false + + Keys.onPressed: { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(root.currentUser, password.text, root.sessionIndex) + event.accepted = true + } + } } + } } - Component.onCompleted: password.forceActiveFocus() + } + + Component.onCompleted: password.forceActiveFocus() } diff --git a/default/sddm/omarchy/bullet.png b/default/sddm/omarchy/bullet.png new file mode 100644 index 00000000..62249b3b Binary files /dev/null and b/default/sddm/omarchy/bullet.png differ diff --git a/default/sddm/omarchy/entry-failed.png b/default/sddm/omarchy/entry-failed.png new file mode 100644 index 00000000..a42f9188 Binary files /dev/null and b/default/sddm/omarchy/entry-failed.png differ diff --git a/default/sddm/omarchy/entry.png b/default/sddm/omarchy/entry.png new file mode 100644 index 00000000..5c789179 Binary files /dev/null and b/default/sddm/omarchy/entry.png differ diff --git a/default/sddm/omarchy/lock-failed.png b/default/sddm/omarchy/lock-failed.png new file mode 100644 index 00000000..a88afece Binary files /dev/null and b/default/sddm/omarchy/lock-failed.png differ diff --git a/default/sddm/omarchy/lock.png b/default/sddm/omarchy/lock.png new file mode 100644 index 00000000..3046de1b Binary files /dev/null and b/default/sddm/omarchy/lock.png differ diff --git a/default/sddm/omarchy/logo.png b/default/sddm/omarchy/logo.png new file mode 100644 index 00000000..f185b266 Binary files /dev/null and b/default/sddm/omarchy/logo.png differ diff --git a/default/sddm/omarchy/logo.svg b/default/sddm/omarchy/logo.svg deleted file mode 100644 index 0853b047..00000000 --- a/default/sddm/omarchy/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/default/waybar/weather.sh b/default/waybar/weather.sh new file mode 100755 index 00000000..02e7bc2b --- /dev/null +++ b/default/waybar/weather.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +icon=$(omarchy-weather-icon 2>/dev/null) + +if [[ -n $icon ]]; then + icon=$(printf '%s' "$icon" | sed 's/["\\]/\\&/g') + printf '{"text":"%s"}\n' "$icon" +else + printf '{"text":"","class":"unavailable"}\n' +fi diff --git a/install/config/nautilus-python.sh b/install/config/nautilus-python.sh index fd2ef0f7..76266353 100644 --- a/install/config/nautilus-python.sh +++ b/install/config/nautilus-python.sh @@ -2,3 +2,4 @@ EXTENSIONS_DIR="$HOME/.local/share/nautilus-python/extensions" mkdir -p "$EXTENSIONS_DIR" cp "$OMARCHY_PATH/default/nautilus-python/extensions/localsend.py" "$EXTENSIONS_DIR/" +cp "$OMARCHY_PATH/default/nautilus-python/extensions/transcode.py" "$EXTENSIONS_DIR/" diff --git a/install/first-run/install-voxtype.hook b/install/first-run/install-voxtype.hook new file mode 100644 index 00000000..5513c4e6 --- /dev/null +++ b/install/first-run/install-voxtype.hook @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +# Remove this hook after use +rm -f "$0" + +notify-send " Install Dictation with Voxtype" "Click to install voice dictation for Omarchy." -u critical diff --git a/migrations/1772990935.sh b/migrations/1772990935.sh index 2f3526c2..2b58912d 100644 --- a/migrations/1772990935.sh +++ b/migrations/1772990935.sh @@ -1,7 +1,7 @@ echo "Add sample low battery notification hook" -mkdir -p ~/.config/omarchy/hooks +mkdir -p ~/.config/omarchy/hooks/battery-low.d -if [[ ! -f ~/.config/omarchy/hooks/battery-low.sample ]]; then - cp "$OMARCHY_PATH/config/omarchy/hooks/battery-low.sample" ~/.config/omarchy/hooks/battery-low.sample +if [[ ! -f ~/.config/omarchy/hooks/battery-low.d/play-warning-sound.sample ]]; then + cp "$OMARCHY_PATH/config/omarchy/hooks/battery-low.d/play-warning-sound.sample" ~/.config/omarchy/hooks/battery-low.d/play-warning-sound.sample fi diff --git a/migrations/1778099894.sh b/migrations/1778099894.sh new file mode 100644 index 00000000..bf83d6d1 --- /dev/null +++ b/migrations/1778099894.sh @@ -0,0 +1,3 @@ +echo "Add Transcode entry to Nautilus context menu" + +source $OMARCHY_PATH/install/config/nautilus-python.sh diff --git a/migrations/1778139028.sh b/migrations/1778139028.sh new file mode 100644 index 00000000..e5728ced --- /dev/null +++ b/migrations/1778139028.sh @@ -0,0 +1,29 @@ +echo "Add weather widget to Waybar" + +WAYBAR_CONFIG="$HOME/.config/waybar/config.jsonc" +WAYBAR_STYLE="$HOME/.config/waybar/style.css" + +if [[ -f $WAYBAR_CONFIG ]]; then + if ! grep -q '"custom/weather"' "$WAYBAR_CONFIG"; then + sed -i 's/"modules-center": \["clock",/"modules-center": ["clock", "custom\/weather",/' "$WAYBAR_CONFIG" + sed -i '/"network": {/i\ "custom/weather": {\n "exec": "$OMARCHY_PATH/default/waybar/weather.sh",\n "return-type": "json",\n "interval": 600,\n "tooltip": false,\n "on-click": "notify-send -u low \\"$(omarchy-weather-status)\\""\n },' "$WAYBAR_CONFIG" + fi +fi + +if [[ -f $WAYBAR_STYLE ]] && ! grep -q '#custom-weather' "$WAYBAR_STYLE"; then + cat >>"$WAYBAR_STYLE" <<'EOF' + +#custom-weather { + margin-left: 7.5px; + margin-right: 7.5px; +} + +#custom-weather.unavailable { + min-width: 0; + margin: 0; + padding: 0; +} +EOF +fi + +omarchy-restart-waybar