#!/usr/bin/env bash # Adapted from https://github.com/basecamp/omarchy/tree/master?tab=readme-ov-file usage() { cat < [ARGS...] OPTIONS: -f | --focus: If a window exists matching the url's domain, focus it instead of launching new window. -s | --special : Launch in the special workspace name, or toggle the special workspace. -h | --help: Show this help page. NOTES: Any extra arguments after the url get passed directly to the browser invocation. Using the '--special' flag is useful for apps that you want to have a "summoning" like behavior. Upon first launch the application will be opened and the special workspace will be shown. Calling it again will keep the application open in the special workspace but hide the workspace. Further calls will not open another instance of the application, but will toggle the visiblity of the special workspace. EOF } browser="chromium.desktop" special="" special_flag="0" focus_flag="0" help_flag="0" url="" args=() SCRIPTS="${SCRIPTS}" if [[ -z $SCRIPTS ]]; then echo "scripts directory not set" echo "using ~/.local/scripts" SCRIPTS=~/.local/scripts fi while [[ $# -gt 0 ]]; do if [[ $1 =~ ^--special ]] || [[ $1 =~ ^-s ]]; then shift special_flag="1" special=$1 elif [[ $1 =~ ^--focus ]] || [[ $1 =~ ^-f ]]; then focus_flag="1" elif [[ $1 =~ ^--help ]] || [[ $1 =~ ^-h ]]; then help_flag="1" elif [[ -z $url ]]; then url=$1 else args+=($1) fi shift done # Early out if help flag was supplied. if [[ $help_flag == "1" ]]; then usage && exit 0 fi launch() { exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "$2" } # Strips url down to just the domain, so that we can match window classes. pattern() { pattern=${url/#https:\/\//} pattern=${pattern/#http:\/\//} pattern=${pattern%%/*} echo $pattern } getWindowProp() { echo $(hyprctl clients -j | jq -r ".[] | select((.class | contains(\"$(pattern)\"))) | .$1" | head -n 1) } log() { echo "[$($SCRIPTS/isosec)] - $1" >>/tmp/launch-webapp.log } fail() { echo -e "\n\e[31m[Error]: $1\e[0m" log "[Error]: $1" } handleSpecial() { local window_addr=$(getWindowProp address) local window_workspace=$(getWindowProp workspace.id) local active_workspace=$(hyprctl activeworkspace -j | jq -r ".id") local special_workspace_id=$(hyprctl workspaces -j | jq -r ".[] | select(.name | contains(\"$special\")) | .id") log "Window: address: $window_addr workspace: $window_workspace" log "Special workspace: $special id: $special_workspace_id" log "Active workspace: $active_workspace" # Check if we don't have a window address, or if the window is not on the expected special workspace. if [[ -z $window_addr ]] || ([[ -n $window_workspace ]] && [[ $window_workspace != $special_workspace_id ]]); then log "No window, launching..." hyprctl dispatch togglespecialworkspace $special launch $url $args else log "We have a window, toggling special workspace" hyprctl dispatch togglespecialworkspace $special fi } ################################################## # MAIN ################################################## if [[ -z $url ]]; then fail "Must supply a url." && usage && exit 1 fi if [[ $special_flag == "1" ]]; then log "Handling special workspace..." if [[ -z $special ]]; then fail "Must supply special workspace name." && exit 1 fi handleSpecial && exit 0 fi window_addr="" if [[ $focus_flag == "1" ]]; then log "Received focus flag, checking for window address." window_addr=$(getWindowProp address) log "Window address: $window_addr" fi if [[ -n $window_addr ]]; then log "No window address launching..." hyprctl dispatch focuswindow "address:$window_addr" exit 0 fi launch $url $args