Firefox, remote commands and Xfce
I replaced the default browser in Xfce (Settings → Preferred
Applications) with a custom Python script to do some additional URL
handling. To open a link in Firefox you just have to run
firefox -remote OpenURL(<url>)
and you can even use it with multiple
instances (add -P <profile>
).
Using the script from Terminal worked perfectly fine, but as soon as
Xfce handled the click on a link Firefox would say "Firefox is already
running, but is not responding." After trying around for a while I ended
up diff'ing the environments. Trying to add some of the missing keys to
the launcher's env didn't help either. What finally made it work was
removing the DESKTOP_STARTUP_ID
key from the environment.
(Mozilla Bug #478951)
Here's my custom launcher:
#!/usr/bin/env python3
import sys, os
from subprocess import call
env=dict(os.environ)
try:
dsi = env['DESKTOP_STARTUP_ID']
del env['DESKTOP_STARTUP_ID']
from gi.repository import Gdk
# get rid of the waiting cursor, requires python3 gobject
Gdk.notify_startup_complete_with_id(dsi)
except KeyError:
pass
except ImportError:
pass
def exec_new(args):
if os.fork() == 0:
os.setsid()
os.execvpe(args[0], args, env)
def openurl(url, instance="default"):
if call(['firefox', '-P', instance, '-remote', 'OpenURL({})'.format(url)], env=env) != 0:
# no instance running, start new
exec_new(['firefox', '-P', instance, '-new-instance', url])
for url in sys.argv[1:]:
if "youtube.com" in url or "youtu.be" in url:
exec_new(["/bin/sh", "-c", "mplayer -fs $(youtube-dl -g '{}')".format(url)])
else:
openurl(url)
forking & execing in exec_new
is for long-running processes so we're
not stuck with a loading cursor forever.It's showing a loading
cursor anyway for a while, gotta figure that out.
Gdk.notify_startup_complete()
fixed that.