11#! /usr/bin/env bash
2- # nbrowser v0.7
2+ # nbrowser v0.8
33# Requires bash 4+
44# author : odnar-dev <https://github.com/odnar-dev>
55# source : https://github.com/MyOS-ArchLinux/nbrowser
66# license: GPLv3 <https://gnu.org/licenses/gpl-3.0.html>
77# shellcheck disable=SC2190,SC2086,SC1091
88
99NBROWSER_CONFIG_DIR=" ${XDG_CONFIG_HOME:- $HOME / .config} /nbrowser"
10+ NBROWSER_CACHE_DIR=" ${XDG_CACHE_HOME:- $HOME / .cache} /nbrowser"
1011NBROWSER_DEFAULT_SEARCH=${NBROWSER_DEFAULT_SEARCH:- duckduckgo}
1112COPY_TO_CLIPBOARD_OPTION=${COPY_TO_CLIPBOARD_OPTION:- true}
1213NBROWSER_SIMPLE_URL_HANDLER=${NBROWSER_SIMPLE_URL_HANDLER:- false}
@@ -32,6 +33,10 @@ ENGINES=(
3233 [" ytb" ]=" https://www.youtube.com/results?search_query="
3334)
3435
36+ FIREFOX_BASED_BROWSERS=(librewolf firefox floorp icecat palemoon firedragon)
37+ CHROMIUM_BASED_BROWSERS=(google-chrome-stable chromium brave vivaldi-stable opera)
38+ OTHER_BASED_BROWSERS=(badwolf qutebrowser ephemeral)
39+
3540has () {
3641 case " $( command -v " $1 " 2> /dev/null) " in
3742 alias* |" " ) return 1
@@ -48,7 +53,8 @@ _notify(){
4853}
4954
5055_choose (){
51- rofi -dmenu -i -p ' Select Item ' -theme-str ' window {width: 95%;}' -l 10 -no-click-to-exit -filter " ${@:- } "
56+ [ -z " ${2} " ] || local ROFI_ADD_ARGS=${2:- }
57+ rofi -dmenu -i -p ' Select Item ' -theme-str ' window {width: 95%;}' -l 10 -no-click-to-exit ${ROFI_ADD_ARGS:- } -filter " ${1:- } "
5258}
5359
5460_input (){
7379# # keep the first place to special action
7480browser_count=1
7581
82+ add_browser (){
83+ local browser_name=" ${1:? } "
84+ local browser_path=" ${2:? } "
85+ browser_count=$(( browser_count+ 1 ))
86+ installed_browsers[$browser_count ]=" ${browser_name:? } : ${browser_path:? } "
87+ }
88+
7689# # firefox based browser
77- for prog in librewolf firefox icecat palemoon ; do
90+ for prog in ${FIREFOX_BASED_BROWSERS[*]} ; do
7891 if has " $prog " ; then
79- browser_count=$(( browser_count+ 1 ))
80- installed_browsers[$browser_count ]=" $prog : $( command -v $prog ) "
81- # add private window
82- browser_count=$(( browser_count+ 1 ))
83- installed_browsers[$browser_count ]=" $prog [Private] : $( command -v $prog ) --private-window"
92+ add_browser " $prog " " $( command -v $prog ) "
93+ add_browser " $prog [Private]" " $( command -v $prog ) --private-window"
8494 fi
8595done
8696
8797# # chromium based browser
88- for prog in google-chrome-stable chromium brave vivaldi-stable opera ; do
98+ for prog in ${CHROMIUM_BASED_BROWSERS[*]} ; do
8999 if has " $prog " ; then
90- browser_count=$(( browser_count+ 1 ))
91- installed_browsers[$browser_count ]=" $prog : $( command -v $prog ) "
100+ add_browser " $prog " " $( command -v $prog ) "
92101 # add private window
93- browser_count=$(( browser_count+ 1 ))
94- installed_browsers[$browser_count ]=" $prog [Private] : $( command -v $prog ) --incognito"
102+ add_browser " $prog [Private]" " $( command -v $prog ) --incognito"
95103 fi
96104done
97105
98106# # other browsers
99- for prog in badwolf qutebrowser ephemeral ; do
107+ for prog in ${OTHER_BASED_BROWSERS[*]} ; do
100108 if has " $prog " ; then
101- browser_count=$(( browser_count+ 1 ))
102- installed_browsers[$browser_count ]=" $prog : $( command -v $prog ) "
109+ add_browser " $prog " " $( command -v $prog ) "
103110 fi
104111done
105112
@@ -142,7 +149,7 @@ if ! has _copy_to_clipboard ;then
142149fi
143150
144151open_a_browser (){
145- selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' nbrowser' -i -format " i s" -l " $(( browser_count- 1 )) " )
152+ selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' !a[$0]++ ' | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' nbrowser' -i -format " i s" -l " $(( browser_count- 1 )) " )
146153
147154 [ -z " ${selected_browser} " ] && exit 0
148155
@@ -217,14 +224,31 @@ open_picture_with(){
217224}
218225
219226open_in_browser (){
227+ case " $1 " in
228+ " -m" )
229+ local MULTI_URL=true; shift
230+ ;;
231+ esac
232+
233+ if [ " ${BROWSER_FG_FIRST} " = true ]; then
234+ if [ " ${XDG_SESSION_TYPE} " = " wayland" ]; then
235+ current_win_name=$( swaymsg -t get_tree | jq -r ' ..|try select(.focused == true)|.window_properties.instance' )
236+ else
237+ current_win_id=$( xdotool getactivewindow)
238+ current_win_pid=$( xdotool getwindowpid " $current_win_id " )
239+ current_win_name=$( ps -o comm= -p " $current_win_pid " || xdotool getwindowname " $current_win_id " )
240+ fi
241+ current_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk -v current_win_name=" ${current_win_name:- } " ' BEGIN { RS="\n"; FS=" : " } $1 ~ current_win_name {p=1; exit} END {if(p) print $1 "\t:\t" $2 }' )
242+ [ ! -z " ${current_browser} " ] && installed_browsers[0]=" ${current_browser:- } "
243+ fi
220244 # add clipboard
221245 if [ " ${COPY_TO_CLIPBOARD_OPTION} " = true ]; then
222246 browser_count=$(( browser_count+ 1 ))
223247 installed_browsers[$browser_count ]=" Copy to clipboard"
224248 COPY_TO_CLIPBOARD_OPTION=false
225249 fi
226250
227- selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' Open URL with' -mesg " ${@// &/ &} " -i -l " $(( browser_count- 1 )) " )
251+ selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' !a[$0]++ ' | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' Open URL with' -mesg " ${@// &/ &} " -i -l " $(( browser_count- 1 )) " )
228252
229253 [ -z " ${selected_browser} " ] && exit 0
230254
@@ -249,7 +273,11 @@ open_in_browser(){
249273 ;;
250274 * )
251275 selected_browser=$( printf ' %s' " ${selected_browser} " | awk ' {split($0,a,": "); print a[2]}' )
252- { setsid -f $( bash -c " exec ${selected_browser} \" $* \" " ) > /dev/null 2>&1 ; }
276+ if [ " ${MULTI_URL} " = true ]; then
277+ { setsid -f ${selected_browser} $* > /dev/null 2>&1 ; }
278+ else
279+ { setsid -f $( bash -c " exec ${selected_browser} \" $* \" " ) > /dev/null 2>&1 ; }
280+ fi
253281 ;;
254282 esac
255283}
@@ -266,7 +294,7 @@ url_handler(){
266294 open_in_browser " $cleanurl "
267295 else
268296 case " $cleanurl " in
269- ** ted.com/** |* youtube.com/watch* |* youtube.com/playlist* |* youtu.be* |* //www.twitch.tv/* |* //twitch.tv/* |* .mp4|* .mkv|* .webm|* .mp3|* .flac|* .opus|* mp3? source* |* gifv|* .m3u|* .m3u8)
297+ ** ted.com/** |* youtube.com/watch* |* youtube.com/playlist* |* youtu.be* |* //www.twitch.tv/* |* //twitch.tv/* |* .mp4|* .mkv|* .webm|* .mp3|* .flac|* .opus|* mp3? source* |* gifv|* .m3u|* .m3u8| * .mov )
270298 open_video_with " $cleanurl "
271299 ;;
272300 * png|* jpg|* jpe|* jpeg|* gif|* .jpg\? r=* )
@@ -315,6 +343,7 @@ main(){
315343 url_handler ${arg/ " $protocol ://" }
316344 ;;
317345 nbrowser)
346+ arg=$( echo " $* " | sed " s/%20/ /g" )
318347 nbrowser ${arg/ " $protocol ://" }
319348 ;;
320349 * )
0 commit comments