Allow plugins to override the open/copy menu items in the terminal context menu. Also set these values for all of the default plugins. When copying a URL, run it through the URL preparer - this means wusers will get the resulting URI on their clipboard, rather than the original text sometimes and the URI some other times, depending on the type of URI
This commit is contained in:
parent
8c0f30fd80
commit
cd5c4c1056
|
@ -1,5 +1,9 @@
|
||||||
terminator 0.97:
|
terminator 0.97:
|
||||||
* Allow font dimming in inactive terminals
|
* Allow font dimming in inactive terminals
|
||||||
|
* Allow URL handler plugins to override label text for URL context
|
||||||
|
menus
|
||||||
|
* When copying a URL, run it through the URL handler first so the
|
||||||
|
resulting URL is copied, rather than the original text
|
||||||
|
|
||||||
terminator 0.96:
|
terminator 0.96:
|
||||||
* Unity support for opening new windows (Lucian Adrian Grijincu)
|
* Unity support for opening new windows (Lucian Adrian Grijincu)
|
||||||
|
|
|
@ -155,6 +155,8 @@ class URLHandler(Plugin):
|
||||||
capabilities = ['url_handler']
|
capabilities = ['url_handler']
|
||||||
handler_name = None
|
handler_name = None
|
||||||
match = None
|
match = None
|
||||||
|
nameopen = None
|
||||||
|
namecopy = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Class initialiser"""
|
"""Class initialiser"""
|
||||||
|
|
|
@ -14,6 +14,8 @@ class LaunchpadBugURLHandler(plugin.URLHandler):
|
||||||
capabilities = ['url_handler']
|
capabilities = ['url_handler']
|
||||||
handler_name = 'launchpad_bug'
|
handler_name = 'launchpad_bug'
|
||||||
match = '\\b(lp|LP):?\s?#?[0-9]+(,\s*#?[0-9]+)*\\b'
|
match = '\\b(lp|LP):?\s?#?[0-9]+(,\s*#?[0-9]+)*\\b'
|
||||||
|
nameopen = "Open Launchpad bug"
|
||||||
|
namecopy = "Copy bug URL"
|
||||||
|
|
||||||
def callback(self, url):
|
def callback(self, url):
|
||||||
"""Look for the number in the supplied string and return it as a URL"""
|
"""Look for the number in the supplied string and return it as a URL"""
|
||||||
|
@ -26,6 +28,8 @@ class LaunchpadCodeURLHandler(plugin.URLHandler):
|
||||||
branch entry then it should be transformed into a code.launchpad.net URL"""
|
branch entry then it should be transformed into a code.launchpad.net URL"""
|
||||||
capabilities = ['url_handler']
|
capabilities = ['url_handler']
|
||||||
handler_name = 'launchpad_code'
|
handler_name = 'launchpad_code'
|
||||||
|
nameopen = "Open Launchpad branch"
|
||||||
|
namecopy = "Copy branch URL"
|
||||||
lpfilters = {}
|
lpfilters = {}
|
||||||
lpfilters['project'] = '[a-z0-9]{1}[a-z0-9\.\-\+]+'
|
lpfilters['project'] = '[a-z0-9]{1}[a-z0-9\.\-\+]+'
|
||||||
lpfilters['group'] = '~%s' % lpfilters['project']
|
lpfilters['group'] = '~%s' % lpfilters['project']
|
||||||
|
@ -45,6 +49,8 @@ class APTURLHandler(plugin.URLHandler):
|
||||||
it appropriately"""
|
it appropriately"""
|
||||||
capabilities = ['url_handler']
|
capabilities = ['url_handler']
|
||||||
handler_name = 'apturl'
|
handler_name = 'apturl'
|
||||||
|
nameopen = "Open software manager"
|
||||||
|
namecopy = "Copy package URI"
|
||||||
match = '\\bapt:.*\\b'
|
match = '\\bapt:.*\\b'
|
||||||
|
|
||||||
def callback(self, url):
|
def callback(self, url):
|
||||||
|
|
|
@ -284,14 +284,14 @@ class Terminal(gtk.VBox):
|
||||||
name = urlplugin.handler_name
|
name = urlplugin.handler_name
|
||||||
match = urlplugin.match
|
match = urlplugin.match
|
||||||
if name in self.matches:
|
if name in self.matches:
|
||||||
dbg('Terminal::update_matches: refusing to add \
|
dbg('refusing to add duplicate match %s' % name)
|
||||||
duplicate match %s' % name)
|
|
||||||
continue
|
continue
|
||||||
self.matches[name] = self.vte.match_add(match)
|
self.matches[name] = self.vte.match_add(match)
|
||||||
dbg('Terminal::update_matches: added plugin URL handler \
|
dbg('added plugin URL handler for %s (%s) as %d' %
|
||||||
for %s (%s)' % (name, urlplugin.__class__.__name__))
|
(name, urlplugin.__class__.__name__,
|
||||||
|
self.matches[name]))
|
||||||
except Exception, ex:
|
except Exception, ex:
|
||||||
err('Terminal::update_url_matches: %s' % ex)
|
err('Exception occurred adding plugin URL match: %s' % ex)
|
||||||
|
|
||||||
def match_add(self, name, match):
|
def match_add(self, name, match):
|
||||||
"""Register a URL match"""
|
"""Register a URL match"""
|
||||||
|
@ -1293,7 +1293,7 @@ for %s (%s)' % (name, urlplugin.__class__.__name__))
|
||||||
url = newurl
|
url = newurl
|
||||||
break
|
break
|
||||||
except Exception, ex:
|
except Exception, ex:
|
||||||
err('Terminal::prepare_url: %s' % ex)
|
err('Exception occurred preparing URL: %s' % ex)
|
||||||
|
|
||||||
return(url)
|
return(url)
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ from version import APP_NAME
|
||||||
from translation import _
|
from translation import _
|
||||||
from encoding import TerminatorEncoding
|
from encoding import TerminatorEncoding
|
||||||
from terminator import Terminator
|
from terminator import Terminator
|
||||||
from util import err
|
from util import err, dbg
|
||||||
from config import Config
|
from config import Config
|
||||||
from prefseditor import PrefsEditor
|
from prefseditor import PrefsEditor
|
||||||
import plugin
|
import plugin
|
||||||
|
@ -47,14 +47,41 @@ class TerminalPopupMenu(object):
|
||||||
button = 3
|
button = 3
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
|
dbg("URL matches id: %d" % url[1])
|
||||||
|
if not url[1] in terminal.matches.values():
|
||||||
|
err("Unknown URL match id: %d" % url[1])
|
||||||
|
dbg("Available matches: %s" % terminal.matches)
|
||||||
|
|
||||||
|
nameopen = None
|
||||||
|
namecopy = None
|
||||||
if url[1] == terminal.matches['email']:
|
if url[1] == terminal.matches['email']:
|
||||||
nameopen = _('_Send email to...')
|
nameopen = _('_Send email to...')
|
||||||
namecopy = _('_Copy email address')
|
namecopy = _('_Copy email address')
|
||||||
elif url[1] == terminal.matches['voip']:
|
elif url[1] == terminal.matches['voip']:
|
||||||
nameopen = _('Ca_ll VoIP address')
|
nameopen = _('Ca_ll VoIP address')
|
||||||
namecopy = _('_Copy VoIP address')
|
namecopy = _('_Copy VoIP address')
|
||||||
else:
|
elif url[1] in terminal.matches.values():
|
||||||
|
# This is a plugin match
|
||||||
|
for pluginname in terminal.matches:
|
||||||
|
if terminal.matches[pluginname] == url[1]:
|
||||||
|
break
|
||||||
|
|
||||||
|
dbg("Found match ID (%d) in terminal.matches plugin %s" %
|
||||||
|
(url[1], pluginname))
|
||||||
|
registry = plugin.PluginRegistry()
|
||||||
|
registry.load_plugins()
|
||||||
|
plugins = registry.get_plugins_by_capability('url_handler')
|
||||||
|
for urlplugin in plugins:
|
||||||
|
if urlplugin.handler_name == pluginname:
|
||||||
|
dbg("Identified matching plugin: %s" %
|
||||||
|
urlplugin.handler_name)
|
||||||
|
nameopen = _(urlplugin.nameopen)
|
||||||
|
namecopy = _(urlplugin.namecopy)
|
||||||
|
break
|
||||||
|
|
||||||
|
if not nameopen:
|
||||||
nameopen = _('_Open link')
|
nameopen = _('_Open link')
|
||||||
|
if not namecopy:
|
||||||
namecopy = _('_Copy address')
|
namecopy = _('_Copy address')
|
||||||
|
|
||||||
icon = gtk.image_new_from_stock(gtk.STOCK_JUMP_TO,
|
icon = gtk.image_new_from_stock(gtk.STOCK_JUMP_TO,
|
||||||
|
@ -66,7 +93,7 @@ class TerminalPopupMenu(object):
|
||||||
|
|
||||||
item = gtk.MenuItem(namecopy)
|
item = gtk.MenuItem(namecopy)
|
||||||
item.connect('activate',
|
item.connect('activate',
|
||||||
lambda x: terminal.clipboard.set_text(url[0]))
|
lambda x: terminal.clipboard.set_text(terminal.prepare_url(url)))
|
||||||
menu.append(item)
|
menu.append(item)
|
||||||
|
|
||||||
menu.append(gtk.MenuItem())
|
menu.append(gtk.MenuItem())
|
||||||
|
|
Loading…
Reference in New Issue