feat: Updates launch-webapp script, reformats keybinds, and removes uneeded scripts now that launch-webapp is more robust.

This commit is contained in:
2025-10-01 12:03:13 -04:00
parent 026a998fc4
commit ede7e4288b
6 changed files with 112 additions and 133 deletions

View File

@@ -24,6 +24,7 @@ quit-after-last-window-closed-delay = 5m
# macos-icon = custom-style # macos-icon = custom-style
keybind = ctrl+shift+t=toggle_quick_terminal keybind = ctrl+shift+t=toggle_quick_terminal
keybind = ctrl+l=clear_screen
# Splits # Splits
keybind = super+j=goto_split:down keybind = super+j=goto_split:down

View File

@@ -9,39 +9,39 @@ $HYPER = ALT SHIFT SUPER CTRL
# See https://wiki.hyprland.org/Configuring/Keywords/ # See https://wiki.hyprland.org/Configuring/Keywords/
$terminal = ghostty $terminal = uwsm app -- ghostty
$browser = zen-browser $browser = uwsm app -- zen-browser
$fileManager = $terminal -e yazi $fileManager = $terminal -e yazi
$fileBrowser = nautilus $fileBrowser = uwsm app -- nautilus
$menu = walker $menu = uwsm app -- walker
$scripts = ~/.local/scripts $scripts = ~/.local/scripts
$pwa = $scripts/launch-webapp $pwa = $scripts/launch-webapp
$launchOrFocusWebapp = $scripts/launch-or-focus-webapp
$tmuxSessionator = $scripts/tmux-sessionator $tmuxSessionator = $scripts/tmux-sessionator
$clipboardHistory = $terminal --class=com.ghostty.float -e $scripts/uninstall-desktop-app $clipboardHistory = $terminal --class=com.ghostty.clipse -e clipse
$uninstallDesktop = $terminal --class=com.ghostty.float -e $scripts/uninstall-desktop-app $uninstallDesktop = $terminal --class=com.ghostty.float -e $scripts/uninstall-desktop-app
$housecallPro = $pwa "https://pro.housecallpro.com/app/calendar_new" $housecallPro = https://pro.housecallpro.com/app/calendar_new
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
###################################################### #######################################################################################
# Apps / hyprland controls # Apps / hyprland controls
# #
# These should in general use the $mainMod prefix # These should in general use the $mainMod prefix
###################################################### #######################################################################################
# MOD # KEY # DESC # Action # # MOD # KEY # DESC # Action #
###################################################### #######################################################################################
bindd = $mainMod, Space, Application launcher, exec, $menu bindd = $mainMod, Space, Application launcher, exec, $menu
bindd = $mainMod, Return, New terminal, exec, $terminal bindd = $mainMod, Return, New terminal, exec, $terminal
bindd = $mainMod SHIFT, Return, New floating terminal, exec, $terminal --class=com.ghostty.float bindd = $mainMod SHIFT, Return, New floating terminal, exec, $terminal --class=com.ghostty.float
bindd = $mainMod, A, Chat-gpt [a]i, exec, $pwa "https://chatgpt.com" --class com.chromium.chatgpt bindd = $mainMod, A, Chat-gpt [a]i - launch / focus, exec, $pwa --focus "https://chatgpt.com"
bindd = $mainMod, A, Chat-gpt [a]i - new window, exec, $pwa "https://chatgpt.com"
bindd = $mainMod, B, New [b]rowser, exec, $browser bindd = $mainMod, B, New [b]rowser, exec, $browser
bindd = $mainMod SHIFT, B, New private [b]rowser, exec, $browser --private-window bindd = $mainMod SHIFT, B, New private [b]rowser, exec, $browser --private-window
bindd = $mainMod, C, [C]onfig folder in tmux session, exec, $terminal -e $tmuxSessionator ~/.config bindd = $mainMod, C, [C]onfig folder in tmux session, exec, $terminal -e $tmuxSessionator ~/.config
bindd = $mainMod, D, [D]ispatch app, exec, $housecallPro bindd = $mainMod, D, [D]ispatch app - special workspace, exec, $pwa --special dispatch $housecallPro
bindd = $mainMod SHIFT, D, Show [d]esktop / hide all windows, exec, $scripts/toggle-desktop bindd = $mainMod SHIFT, D, [D]ispatch app - new window, exec, $pwa $housecallPro
bindd = $mainMod, E, [E]mail - personal, exec, $pwa "https://mail.proton.me" bindd = $mainMod, E, [E]mail - personal, exec, $pwa --focus "https://mail.proton.me"
bindd = $mainMod SHIFT, E, [E]mail - work, exec, uwsm app -- thunderbird bindd = $mainMod SHIFT, E, [E]mail - work, exec, uwsm app -- thunderbird
bindd = $mainMod, F, [F]ile manager - terminal, exec, $fileManager bindd = $mainMod, F, [F]ile manager - terminal, exec, $fileManager
bindd = $mainMod SHIFT, F, [F]ile manager - application, exec, $fileBrowser bindd = $mainMod SHIFT, F, [F]ile manager - application, exec, $fileBrowser
@@ -52,11 +52,11 @@ bindd = $mainMod, J, Focus window - down, movefocus, d # move window
bindd = $mainMod, K, Focus window - up, movefocus, u # move window focus using vim keys bindd = $mainMod, K, Focus window - up, movefocus, u # move window focus using vim keys
bindd = $mainMod, L, Focus window - right, movefocus, r # move window focus using vim keys bindd = $mainMod, L, Focus window - right, movefocus, r # move window focus using vim keys
bindd = $mainMod SHIFT, L, Workspace - forward, workspace, +1 bindd = $mainMod SHIFT, L, Workspace - forward, workspace, +1
bindd = $mainMod, M, [M]usic - apple, exec, $pwa "https://music.apple.com" bindd = $mainMod, M, [M]usic - apple, exec, $pwa --focus "https://music.apple.com"
bindd = $mainMod SHIFT, M, [M]enu bar - toggle visible, exec, ~/.local/scripts/toggle-waybar bindd = $mainMod SHIFT, M, [M]enu bar - toggle visible, exec, $scripts/toggle-waybar
bindd = $mainMod, P, [P]assword manager, exec, ~/.local/scripts/proton-pass-manager bindd = $mainMod, P, [P]assword manager, exec, $pwa --special pass "https://pass.proton.me"
bindd = $mainMod SHIFT, P, Toggle [p]seudo window mode, pseudo, # dwindle bindd = $mainMod SHIFT, P, Toggle [p]seudo window mode, pseudo, # dwindle
bindd = $mainMod SHIFT, R, [R]estart menu bar, exec, ~/.local/scripts/waybar-restart bindd = $mainMod SHIFT, R, [R]estart menu bar, exec, $scripts/waybar-restart
bindd = $mainMod, S, Toggle [s]pecial workspace, togglespecialworkspace, magic # use $windowMod S to send window to the special workspace bindd = $mainMod, S, Toggle [s]pecial workspace, togglespecialworkspace, magic # use $windowMod S to send window to the special workspace
bindd = $mainMod, Y, [Y]ouTube, exec, $pwa "https://youtube.com" bindd = $mainMod, Y, [Y]ouTube, exec, $pwa "https://youtube.com"
bindd = $mainMod, U, [U]nifi, exec, $pwa "https://unifi.ui.com" bindd = $mainMod, U, [U]nifi, exec, $pwa "https://unifi.ui.com"

View File

@@ -13,10 +13,6 @@ windowrule = size 800 600, tag:floating-window
# Force windows to be a floating window # Force windows to be a floating window
windowrule = tag +floating-window, class:^(blueberry.py|org.gnome.Nautilus|com.ghostty.float)$ windowrule = tag +floating-window, class:^(blueberry.py|org.gnome.Nautilus|com.ghostty.float)$
# windowrule = float, class:.*pass.proton.me.*
# windowrule = center, class:.*pass.proton.me.*
# windowrule = size 1200 800, class:.*pass.proton.me.*
#
# Force to stay focused when visible. # Force to stay focused when visible.
windowrule = stayfocused, class:(blueberry.py) windowrule = stayfocused, class:(blueberry.py)
windowrule = stayfocused, class:Pinentry.gtk windowrule = stayfocused, class:Pinentry.gtk
@@ -40,3 +36,4 @@ windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned
workspace = special:hidden, invisible workspace = special:hidden, invisible
workspace = special:pass, class:.*pass.proton.me.* workspace = special:pass, class:.*pass.proton.me.*
workspace = special:dispatch, class:.*pro.housecallpro.com.*

View File

@@ -1,34 +0,0 @@
#!/usr/bin/env bash
# Launch a web app or focus if it's already open.
if [[ $# == 0 ]]; then
echo "Usage: launch-or-focus-webapp <url>"
exit 1
fi
SCRIPTS="${SCRIPTS}"
if [[ -z $SCRIPTS ]]; then
echo "scripts directory not set"
echo "using ~/.local/scripts"
SCRIPTS=~/.local/scripts
fi
url=$1
# parse domain pattern from the url
pattern=${url#https:\/\/} # removing leading 'https://'
pattern=${pattern#http:\/\/} # removing leading 'http://'
pattern=${pattern%%/*} # removing everything after '/' that's left (which should leave us with the domain)
window=$(hyprctl clients -j | jq -r ".[] | select((.class | contains(\"$pattern\"))) | .address")
echo "Pattern: \"$pattern\""
echo "Window: \"$window\""
if [[ -n $window ]]; then
hyprctl dispatch focuswindow "address:$window"
else
eval exec "$SCRIPTS/launch-webapp $url"
fi

View File

@@ -1,17 +1,42 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Adapted from https://github.com/basecamp/omarchy/tree/master?tab=readme-ov-file # Adapted from https://github.com/basecamp/omarchy/tree/master?tab=readme-ov-file
#
# Launch a web application, can handle "singleton" applications in special usage() {
# workspaces using the '--special <name>' option, focus an existing window cat <<EOF
# matching the url using '--focus' option, or always launch a new instance
# if only the url is passed in. Launches a url as a web application.
#
USAGE:
$ launch-webapp [OPTIONS] <url> [ARGS...]
OPTIONS:
-f | --focus: If a window exists matching the url's domain, focus it
instead of launching new window.
-s | --special <name>: 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" browser="chromium.desktop"
special="" special=""
special_flag="0" special_flag="0"
focus_flag="0" focus_flag="0"
help_flag="0"
url="" url=""
args=() args=()
SCRIPTS="${SCRIPTS}" SCRIPTS="${SCRIPTS}"
@@ -29,6 +54,8 @@ while [[ $# -gt 0 ]]; do
special=$1 special=$1
elif [[ $1 =~ ^--focus ]] || [[ $1 =~ ^-f ]]; then elif [[ $1 =~ ^--focus ]] || [[ $1 =~ ^-f ]]; then
focus_flag="1" focus_flag="1"
elif [[ $1 =~ ^--help ]] || [[ $1 =~ ^-h ]]; then
help_flag="1"
elif [[ -z $url ]]; then elif [[ -z $url ]]; then
url=$1 url=$1
else else
@@ -37,65 +64,83 @@ while [[ $# -gt 0 ]]; do
shift shift
done done
# Early out if help flag was supplied.
if [[ $help_flag == "1" ]]; then
usage && exit 0
fi
launch() { 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" 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() {
pattern=${url/#https:\/\//} pattern=${url/#https:\/\//}
pattern=${pattern/#http:\/\//} pattern=${pattern/#http:\/\//}
pattern=${pattern%/*} pattern=${pattern%%/*}
echo $pattern echo $pattern
} }
getWindowProp() { getWindowProp() {
echo $(hyprctl clients -j | jq -r ".[] | select((.class | contains(\"$(pattern)\"))) | .$1") 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() { handleSpecial() {
local window_addr=$(getWindowProp address) local window_addr=$(getWindowProp address)
local window_workspace=$(getWindowProp workspace.id) 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") local special_workspace_id=$(hyprctl workspaces -j | jq -r ".[] | select(.name | contains(\"$special\")) | .id")
echo "Window: address: $window_addr workspace: $window_workspace" log "Window: address: $window_addr workspace: $window_workspace"
echo "Special workspace: $special_workspace_id" 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. # 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 if [[ -z $window_addr ]] || ([[ -n $window_workspace ]] && [[ $window_workspace != $special_workspace_id ]]); then
echo "No window, launching..." log "No window, launching..."
hyprctl dispatch togglespecialworkspace $special hyprctl dispatch togglespecialworkspace $special
launch $url $args launch $url $args
else else
echo "We have a window, toggling special workspace" log "We have a window, toggling special workspace"
hyprctl dispatch togglespecialworkspace pass hyprctl dispatch togglespecialworkspace $special
fi fi
} }
##################################################
# MAIN
##################################################
if [[ -z $url ]]; then if [[ -z $url ]]; then
# TODO: Usage message. fail "Must supply a url." && usage && exit 1
echo "Must supply a url."
exit 1
fi fi
if [[ $special_flag == "1" ]]; then if [[ $special_flag == "1" ]]; then
echo "Handling special workspace..." log "Handling special workspace..."
if [[ -z $special ]]; then if [[ -z $special ]]; then
echo "Must supply special workspace name." fail "Must supply special workspace name." && exit 1
exit 1
fi fi
handleSpecial handleSpecial && exit 0
exit 0
fi fi
window_addr="" window_addr=""
if [[ $focus_flag == "1" ]]; then if [[ $focus_flag == "1" ]]; then
echo "Received focus flag, checking for window address." log "Received focus flag, checking for window address."
window_addr=$(getWindowProp address) window_addr=$(getWindowProp address)
echo "addr: $window_addr" log "Window address: $window_addr"
fi fi
if [[ -n $window_addr ]]; then if [[ -n $window_addr ]]; then
log "No window address launching..."
hyprctl dispatch focuswindow "address:$window_addr" hyprctl dispatch focuswindow "address:$window_addr"
exit 0 exit 0
fi fi

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env bash
# Manages the proton pass web application. If the app is not open then
# it will launch the app (which has a workspace rule that put's it into a
# special workspace). If the app is open then it will toggle the special
# workspace. This allows the application to not close and be able to hide
# and show it quickly using the same keybind that would launch it.
SCRIPTS="${SCRIPTS}"
if [[ -z $SCRIPTS ]]; then
echo "scripts directory not set"
echo "using ~/.local/scripts"
SCRIPTS=~/.local/scripts
fi
pattern="pass.proton.me"
url="https://$pattern"
# Get the window address if it exists.
window_addr=$(hyprctl clients -j | jq -r ".[] | select((.class | contains(\"$pattern\"))) | .address")
if [[ -z $window_addr ]]; then
echo "No window, launching..."
hyprctl dispatch togglespecialworkspace pass
eval exec $SCRIPTS/launch-webapp $url
else
echo "We have a window, toggling special workspace"
hyprctl dispatch togglespecialworkspace pass
fi