mirror of
https://github.com/m-housh/dotfiles.git
synced 2026-02-14 06:12:34 +00:00
feat: Updates launch-webapp script, reformats keybinds, and removes uneeded scripts now that launch-webapp is more robust.
This commit is contained in:
1
env/.config/ghostty/config
vendored
1
env/.config/ghostty/config
vendored
@@ -24,6 +24,7 @@ quit-after-last-window-closed-delay = 5m
|
||||
# macos-icon = custom-style
|
||||
|
||||
keybind = ctrl+shift+t=toggle_quick_terminal
|
||||
keybind = ctrl+l=clear_screen
|
||||
|
||||
# Splits
|
||||
keybind = super+j=goto_split:down
|
||||
|
||||
84
env/.config/hypr/keybinds.conf
vendored
84
env/.config/hypr/keybinds.conf
vendored
@@ -9,60 +9,60 @@ $HYPER = ALT SHIFT SUPER CTRL
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/
|
||||
|
||||
$terminal = ghostty
|
||||
$browser = zen-browser
|
||||
$terminal = uwsm app -- ghostty
|
||||
$browser = uwsm app -- zen-browser
|
||||
$fileManager = $terminal -e yazi
|
||||
$fileBrowser = nautilus
|
||||
$menu = walker
|
||||
$fileBrowser = uwsm app -- nautilus
|
||||
$menu = uwsm app -- walker
|
||||
$scripts = ~/.local/scripts
|
||||
$pwa = $scripts/launch-webapp
|
||||
$launchOrFocusWebapp = $scripts/launch-or-focus-webapp
|
||||
$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
|
||||
$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
|
||||
|
||||
######################################################
|
||||
#######################################################################################
|
||||
# Apps / hyprland controls
|
||||
#
|
||||
# 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, Return, New terminal, exec, $terminal
|
||||
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, B, New [b]rowser, exec, $browser
|
||||
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, D, [D]ispatch app, exec, $housecallPro
|
||||
bindd = $mainMod SHIFT, D, Show [d]esktop / hide all windows, exec, $scripts/toggle-desktop
|
||||
bindd = $mainMod, E, [E]mail - personal, exec, $pwa "https://mail.proton.me"
|
||||
bindd = $mainMod SHIFT, E, [E]mail - work, exec, uwsm app -- thunderbird
|
||||
bindd = $mainMod, F, [F]ile manager - terminal, exec, $fileManager
|
||||
bindd = $mainMod SHIFT, F, [F]ile manager - application, exec, $fileBrowser
|
||||
bindd = $mainMod, G, [G]itea, exec, $pwa "https://git.housh.dev"
|
||||
bindd = $mainMod, H, Focus window - left, movefocus, l # move window focus using vim keys
|
||||
bindd = $mainMod SHIFT, H, Workspace - back, workspace, -1
|
||||
bindd = $mainMod, J, Focus window - down, movefocus, d # 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 SHIFT, L, Workspace - forward, workspace, +1
|
||||
bindd = $mainMod, M, [M]usic - apple, exec, $pwa "https://music.apple.com"
|
||||
bindd = $mainMod SHIFT, M, [M]enu bar - toggle visible, exec, ~/.local/scripts/toggle-waybar
|
||||
bindd = $mainMod, P, [P]assword manager, exec, ~/.local/scripts/proton-pass-manager
|
||||
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, 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, U, [U]nifi, exec, $pwa "https://unifi.ui.com"
|
||||
bindd = $mainMod SHIFT, U, [U]ninstall desktop app, exec, $uninstallDesktop
|
||||
bindd = $mainMod, V, Clipboard history, exec, $clipboardHistory
|
||||
bindd = $mainMod, W, Close current window, killactive,
|
||||
bindd = $mainMod, Space, Application launcher, exec, $menu
|
||||
bindd = $mainMod, Return, New terminal, exec, $terminal
|
||||
bindd = $mainMod SHIFT, Return, New floating terminal, exec, $terminal --class=com.ghostty.float
|
||||
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 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, D, [D]ispatch app - special workspace, exec, $pwa --special dispatch $housecallPro
|
||||
bindd = $mainMod SHIFT, D, [D]ispatch app - new window, exec, $pwa $housecallPro
|
||||
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, F, [F]ile manager - terminal, exec, $fileManager
|
||||
bindd = $mainMod SHIFT, F, [F]ile manager - application, exec, $fileBrowser
|
||||
bindd = $mainMod, G, [G]itea, exec, $pwa "https://git.housh.dev"
|
||||
bindd = $mainMod, H, Focus window - left, movefocus, l # move window focus using vim keys
|
||||
bindd = $mainMod SHIFT, H, Workspace - back, workspace, -1
|
||||
bindd = $mainMod, J, Focus window - down, movefocus, d # 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 SHIFT, L, Workspace - forward, workspace, +1
|
||||
bindd = $mainMod, M, [M]usic - apple, exec, $pwa --focus "https://music.apple.com"
|
||||
bindd = $mainMod SHIFT, M, [M]enu bar - toggle visible, exec, $scripts/toggle-waybar
|
||||
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, 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, Y, [Y]ouTube, exec, $pwa "https://youtube.com"
|
||||
bindd = $mainMod, U, [U]nifi, exec, $pwa "https://unifi.ui.com"
|
||||
bindd = $mainMod SHIFT, U, [U]ninstall desktop app, exec, $uninstallDesktop
|
||||
bindd = $mainMod, V, Clipboard history, exec, $clipboardHistory
|
||||
bindd = $mainMod, W, Close current window, killactive,
|
||||
|
||||
# Switch to workspaces with mainMod + [0-9]
|
||||
bindd = $mainMod, 1, Switch to workspace [1], workspace, 1
|
||||
|
||||
5
env/.config/hypr/windows.conf
vendored
5
env/.config/hypr/windows.conf
vendored
@@ -13,10 +13,6 @@ windowrule = size 800 600, tag:floating-window
|
||||
# Force windows to be a floating window
|
||||
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.
|
||||
windowrule = stayfocused, class:(blueberry.py)
|
||||
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:pass, class:.*pass.proton.me.*
|
||||
workspace = special:dispatch, class:.*pro.housecallpro.com.*
|
||||
|
||||
34
env/.local/scripts/launch-or-focus-webapp
vendored
34
env/.local/scripts/launch-or-focus-webapp
vendored
@@ -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
|
||||
91
env/.local/scripts/launch-webapp
vendored
91
env/.local/scripts/launch-webapp
vendored
@@ -1,17 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Adapted from https://github.com/basecamp/omarchy/tree/master?tab=readme-ov-file
|
||||
#
|
||||
# Launch a web application, can handle "singleton" applications in special
|
||||
# workspaces using the '--special <name>' option, focus an existing window
|
||||
# matching the url using '--focus' option, or always launch a new instance
|
||||
# if only the url is passed in.
|
||||
#
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
|
||||
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"
|
||||
special=""
|
||||
special_flag="0"
|
||||
focus_flag="0"
|
||||
help_flag="0"
|
||||
url=""
|
||||
args=()
|
||||
SCRIPTS="${SCRIPTS}"
|
||||
@@ -29,6 +54,8 @@ while [[ $# -gt 0 ]]; do
|
||||
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
|
||||
@@ -37,65 +64,83 @@ while [[ $# -gt 0 ]]; do
|
||||
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%/*}
|
||||
pattern=${pattern%%/*}
|
||||
echo $pattern
|
||||
}
|
||||
|
||||
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() {
|
||||
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")
|
||||
|
||||
echo "Window: address: $window_addr workspace: $window_workspace"
|
||||
echo "Special workspace: $special_workspace_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
|
||||
echo "No window, launching..."
|
||||
log "No window, launching..."
|
||||
hyprctl dispatch togglespecialworkspace $special
|
||||
launch $url $args
|
||||
else
|
||||
echo "We have a window, toggling special workspace"
|
||||
hyprctl dispatch togglespecialworkspace pass
|
||||
log "We have a window, toggling special workspace"
|
||||
hyprctl dispatch togglespecialworkspace $special
|
||||
fi
|
||||
}
|
||||
|
||||
##################################################
|
||||
# MAIN
|
||||
##################################################
|
||||
|
||||
if [[ -z $url ]]; then
|
||||
# TODO: Usage message.
|
||||
echo "Must supply a url."
|
||||
exit 1
|
||||
fail "Must supply a url." && usage && exit 1
|
||||
fi
|
||||
|
||||
if [[ $special_flag == "1" ]]; then
|
||||
echo "Handling special workspace..."
|
||||
log "Handling special workspace..."
|
||||
if [[ -z $special ]]; then
|
||||
echo "Must supply special workspace name."
|
||||
exit 1
|
||||
fail "Must supply special workspace name." && exit 1
|
||||
fi
|
||||
handleSpecial
|
||||
exit 0
|
||||
handleSpecial && exit 0
|
||||
fi
|
||||
|
||||
window_addr=""
|
||||
|
||||
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)
|
||||
echo "addr: $window_addr"
|
||||
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
|
||||
|
||||
30
env/.local/scripts/proton-pass-manager
vendored
30
env/.local/scripts/proton-pass-manager
vendored
@@ -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
|
||||
Reference in New Issue
Block a user