about summary refs log tree commit diff
path: root/Functions/MIME/pick-web-browser
blob: 665b0db54b898c9c22291d212995f16af08fef15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Function to find a web browser to run on a URL or file.
# Can also be run as a script.  It is suitable for use as
# a suffix alias:
#   alias -s html=pick-web-browser
#
# The single argument is the URL or file name which may be of any type.
# The only processing which occurs is that if the argument is a file,
# it is converted into a URL.  As the function takes account of
# any necessary conversions to the file name (for example, if it
# contains spaces), it is generally preferable to pass in raw file
# names rather than convert them to URLs elsewhere.
#
# The function takes account of the fact that many X Windows browsers
# which are already running on the current display can take a command
# to pass the URL to that process for handling.  A typical sign
# that this has happened is that apparently nothing happens --- you
# need to check the browser window.
#
# If no $DISPLAY is set, the function tries to start a terminal-based
# browser instead.

emulate -L zsh
setopt extendedglob cbases nonomatch

local -a xbrowsers ttybrowsers

# X Windows browsers which might be running and can accept
# a remote URL.  You can change the order of preference.
# If none is already running, starts the first in the array.
zstyle -a :mime: x-browsers xbrowsers ||
  xbrowsers=(firefox mozilla netscape opera konqueror)
# Preferred command line browser.  Used if there is on $DISPLAY set.
zstyle -a :mime: tty-browsers ttybrowsers ||
  ttybrowsers=(links lynx)
# Characters in addition to alphanumerics which can appear literally
# in a URL.  `-' should be the first if it appears, so append others
# to the end.
litc="-_./"

local -a windows remoteargs match mbegin mend
local url browser

url=$1
if [[ -f $url ]]; then
  if [[ $url = *[^-_[:alnum:]]* ]]; then
    # Convert special characters into hex escapes.
    local sofar
    while [[ $url = (#b)([${litc}[:alnum:]]#)([^${litc}[:alnum:]])(*) ]]
      do
      sofar+="$match[1]%${$(( [#16] ##$match[2] ))##0x}"
      url=$match[3]
    done
    url="$sofar$url"
  fi

  # Turn this into a local URL
  if [[ $url = /* ]]; then
      url=file://$url
  else
      url=file://$PWD/$url
  fi
fi


if [[ -n $DISPLAY ]]; then
  # X Windows running

  # Get the name of all windows running; use the internal name, not
  # the friendly name, which is less useful.
  #
  # The nasty but portable version.
  # The nice but non-portable version uses Perl, even though perl
  # is more portable.
#    windows=(${(f)"$(xwininfo -root -all | 
#	sed -ne 's/.*".*": ("\(.*\)" ".*").*/\1/p' |sort | uniq)"})

  windows=(${(f)"$(xwininfo -root -all | 
         perl -ne '/.*"(.*)": \("(.*)" "(.*)"\).*/ and $w{$2} = 1;
                   END { print join("\n", keys %w), "\n" }')"})

  # Is any browser we've heard of running?
  for browser in $xbrowsers; do
    if [[ $windows[(I)(#i)$browser] -ne 0 ]]; then
      if [[ $browser = konqueror ]]; then
	# kfmclient is less hairy and better supported than direct
	# use of dcop.  Run kfmclient --commands
	# for more information.  Note that as konqueror is a fully
	# featured file manager, this will actually do complete
	# MIME handling, not just web pages.
	kfmclient openURL $url ||
	  dcop $(dcop|grep konqueror) default openBrowserWindow $url
      elif [[ $browser = firefox ]]; then
	  # open in new tab: should make this customizable
	  $browser -new-tab $url
      else
	# Mozilla bells and whistles are described at:
	# http://www.mozilla.org/unix/remote.html
	$browser -remote "openURL($url)"
      fi
      return
    fi
  done

  # Start our preferred X Windows browser in the background.
  for browser in $xbrowsers; do
      if eval "[[ =$browser != \\=$browser ]]"; then
	# The following is to make the job text more readable.
	eval ${(q)browser} ${(q)url} "&"
	break
      fi
  done
else
  # Start up dumb terminal browser.
  for browser in $ttybrowsers; do
    if eval "[[ =$browser != \\=$browser ]]"; then
      $browser $url
      break
    fi
  done
fi