From 9beb28a22e73659d0f10f746e729c63d9b264a7d Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Fri, 17 Apr 2020 20:12:57 +0200 Subject: [PATCH] terminal: Add compat detection for Vte regexp feature Older Vte versions only offer the old implementation. fixes #10 --- terminatorlib/terminal.py | 58 +++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/terminatorlib/terminal.py b/terminatorlib/terminal.py index eab7fa9a..e2953ace 100644 --- a/terminatorlib/terminal.py +++ b/terminatorlib/terminal.py @@ -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+ @@ -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)