terminal: Add compat detection for Vte regexp feature

Older Vte versions only offer the old implementation.

fixes #10
This commit is contained in:
Markus Frosch 2020-04-17 20:12:57 +02:00
parent 715c4a667b
commit 9beb28a22e
1 changed files with 34 additions and 24 deletions

View File

@ -33,6 +33,12 @@ from terminatorlib.layoutlauncher import LayoutLauncher
# TODO: Please replace with a proper reference to VTE, I found none!
PCRE2_MULTILINE = 0x00000400
if hasattr(Vte, 'REGEX_FLAGS_DEFAULT'):
REGEX_FLAGS = (Vte.REGEX_FLAGS_DEFAULT | PCRE2_MULTILINE)
REGEX_MODERN = True
else:
REGEX_FLAGS = (GLib.RegexCompileFlags.OPTIMIZE | GLib.RegexCompileFlags.MULTILINE)
REGEX_MODERN = False
# pylint: disable-msg=R0904
class Terminal(Gtk.VBox):
@ -70,7 +76,7 @@ class Terminal(Gtk.VBox):
(GObject.TYPE_INT,)),
'group-all': (GObject.SignalFlags.RUN_LAST, None, ()),
'group-all-toggle': (GObject.SignalFlags.RUN_LAST, None, ()),
'move-tab': (GObject.SignalFlags.RUN_LAST, None,
'move-tab': (GObject.SignalFlags.RUN_LAST, None,
(GObject.TYPE_STRING,)),
}
@ -79,7 +85,7 @@ class Terminal(Gtk.VBox):
MOUSEBUTTON_LEFT = 1
MOUSEBUTTON_MIDDLE = 2
MOUSEBUTTON_RIGHT = 3
MOUSEBUTTON_RIGHT = 3
terminator = None
vte = None
@ -150,7 +156,7 @@ class Terminal(Gtk.VBox):
self.vte.show()
self.default_encoding = self.vte.get_encoding()
self.regex_flags = (Vte.REGEX_FLAGS_DEFAULT | PCRE2_MULTILINE)
self.regex_flags = REGEX_FLAGS
self.update_url_matches()
self.terminalbox = self.create_terminalbox()
@ -262,8 +268,12 @@ class Terminal(Gtk.VBox):
return(terminalbox)
def _add_regex(self, name, re):
reg = Vte.Regex.new_for_match(re, len(re), self.regex_flags)
self.matches[name] = self.vte.match_add_regex(reg, 0)
if REGEX_MODERN:
reg = Vte.Regex.new_for_match(re, len(re), self.regex_flags)
self.matches[name] = self.vte.match_add_regex(reg, 0)
else:
reg = GLib.Regex.new(re, self.regex_flags, 0)
self.matches[name] = self.vte.match_add_gregex(reg, 0)
self.vte.match_set_cursor_name(self.matches[name], 'pointer')
def update_url_matches(self):
@ -280,7 +290,7 @@ class Terminal(Gtk.VBox):
rboundry = "\\b"
re = (lboundry + schemes +
"//(" + user + "@)?[" + hostchars +".]+(:[0-9]+)?(" +
"//(" + user + "@)?[" + hostchars +".]+(:[0-9]+)?(" +
urlpath + ")?" + rboundry + "/?")
self._add_regex('full_uri', re)
@ -361,8 +371,8 @@ class Terminal(Gtk.VBox):
self.cnxids.new(self.vte, 'popup-menu', self.popup_menu)
srcvtetargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE)]
dsttargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE),
('text/x-moz-url', 0, self.TARGET_TYPE_MOZ),
dsttargets = [("vte", Gtk.TargetFlags.SAME_APP, self.TARGET_TYPE_VTE),
('text/x-moz-url', 0, self.TARGET_TYPE_MOZ),
('_NETSCAPE_URL', 0, 0)]
'''
The following should work, but on my system it corrupts the returned
@ -391,7 +401,7 @@ class Terminal(Gtk.VBox):
dbg('Finalised drag targets: %s' % dsttargets)
for (widget, mask) in [
(self.vte, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.BUTTON3_MASK),
(self.vte, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.BUTTON3_MASK),
(self.titlebar, Gdk.ModifierType.BUTTON1_MASK)]:
widget.drag_source_set(mask, srcvtetargets, Gdk.DragAction.MOVE)
@ -408,7 +418,7 @@ class Terminal(Gtk.VBox):
self.cnxids.new(self.vte, 'drag-data-received',
self.on_drag_data_received, self)
self.cnxids.new(self.vte, 'selection-changed',
self.cnxids.new(self.vte, 'selection-changed',
lambda widget: self.maybe_copy_clipboard())
if self.composite_support:
@ -505,7 +515,7 @@ class Terminal(Gtk.VBox):
groupitems = []
cnxs = []
for key, value in list({_('Broadcast _all'):'all',
for key, value in list({_('Broadcast _all'):'all',
_('Broadcast _group'):'group',
_('Broadcast _off'):'off'}.items()):
item = Gtk.RadioMenuItem.new_with_mnemonic(groupitems, key)
@ -621,7 +631,7 @@ class Terminal(Gtk.VBox):
if self.config['exit_action'] == 'restart':
self.cnxids.new(self.vte, 'child-exited', self.spawn_child, True)
elif self.config['exit_action'] in ('close', 'left'):
self.cnxids.new(self.vte, 'child-exited',
self.cnxids.new(self.vte, 'child-exited',
lambda x, y: self.emit('close-term'))
if self.custom_encoding != True:
@ -737,7 +747,7 @@ class Terminal(Gtk.VBox):
setattr(newcolor, "red", y / 255.0)
setattr(newcolor, "green", y / 255.0)
setattr(newcolor, "blue", y / 255.0)
self.palette_active.append(newcolor)
self.palette_active.append(newcolor)
self.palette_inactive = []
for color in self.palette_active:
newcolor = Gdk.RGBA()
@ -809,7 +819,7 @@ class Terminal(Gtk.VBox):
def set_cursor_color(self):
"""Set the cursor color appropriately"""
if self.config['cursor_color_fg']:
self.vte.set_color_cursor(None)
self.vte.set_color_cursor(None)
else:
cursor_color = Gdk.RGBA()
cursor_color.parse(self.config['cursor_color'])
@ -880,7 +890,7 @@ class Terminal(Gtk.VBox):
if mapping == "hide_window":
return(False)
if mapping and mapping not in ['close_window',
if mapping and mapping not in ['close_window',
'full_screen']:
dbg('Terminal::on_keypress: lookup found: %r' % mapping)
# handle the case where user has re-bound copy to ctrl+<key>
@ -961,7 +971,7 @@ class Terminal(Gtk.VBox):
return(True)
return(False)
def on_mousewheel(self, widget, event):
"""Handler for modifier + mouse wheel scroll events"""
SMOOTH_SCROLL_UP = event.direction == Gdk.ScrollDirection.SMOOTH and event.delta_y <= 0.
@ -1022,7 +1032,7 @@ class Terminal(Gtk.VBox):
"""Handle the start of a drag event"""
Gtk.drag_set_icon_pixbuf(drag_context, util.widget_pixbuf(self, 512), 0, 0)
def on_drag_data_get(self, _widget, _drag_context, selection_data, info,
def on_drag_data_get(self, _widget, _drag_context, selection_data, info,
_time, data):
"""I have no idea what this does, drag and drop is a mystery. sorry."""
selection_data.set(Gdk.atom_intern('vte', False), info,
@ -1036,7 +1046,7 @@ class Terminal(Gtk.VBox):
# copy text from another widget
return
srcwidget = Gtk.drag_get_source_widget(drag_context)
if(isinstance(srcwidget, Gtk.EventBox) and
if(isinstance(srcwidget, Gtk.EventBox) and
srcwidget == self.titlebar) or widget == srcwidget:
# on self
return
@ -1067,7 +1077,7 @@ class Terminal(Gtk.VBox):
elif pos == "left":
coord = (topleft, topmiddle, bottommiddle, bottomleft)
elif pos == "bottom":
coord = (bottomleft, bottomright, middleright , middleleft)
coord = (bottomleft, bottomright, middleright , middleleft)
#here, we define some widget internal values
widget._draw_data = { 'color': color, 'coord' : coord }
@ -1130,11 +1140,11 @@ class Terminal(Gtk.VBox):
for term in self.terminator.get_target_terms(self):
term.feed(txt)
return
widgetsrc = data.terminator.terminals[int(selection_data.get_data())]
srcvte = Gtk.drag_get_source_widget(drag_context)
#check if computation requireds
if (isinstance(srcvte, Gtk.EventBox) and
if (isinstance(srcvte, Gtk.EventBox) and
srcvte == self.titlebar) or srcvte == widget:
return
@ -1864,7 +1874,7 @@ class Terminal(Gtk.VBox):
def key_insert_number(self):
self.emit('enumerate', False)
def key_insert_padded(self):
self.emit('enumerate', True)
@ -1877,13 +1887,13 @@ class Terminal(Gtk.VBox):
dialog.set_default_response(Gtk.ResponseType.ACCEPT)
dialog.set_resizable(False)
dialog.set_border_width(8)
label = Gtk.Label(label=_('Enter a new title for the Terminator window...'))
name = Gtk.Entry()
name.set_activates_default(True)
if window.title.text != self.vte.get_window_title():
name.set_text(self.get_toplevel().title.text)
dialog.vbox.pack_start(label, False, False, 6)
dialog.vbox.pack_start(name, False, False, 6)