def __init__(self, window): gtk.HBox.__init__(self, False, 4) gconf_client.add_dir(self.GCONF_PROFILE_DIR, gconf.CLIENT_PRELOAD_RECURSIVE) self._window = window self._encoding = gedit.encoding_get_current() self._vte = vte.Terminal() self.reconfigure_vte() self._vte.set_size(self._vte.get_column_count(), 5) self._vte.show() self.pack_start(self._vte) self._scrollbar = gtk.VScrollbar(self._vte.get_adjustment()) self._scrollbar.show() self.pack_start(self._scrollbar, False, False, 0) gconf_client.notify_add(self.GCONF_PROFILE_DIR, self.on_gconf_notification) self._vte.connect("key-press-event", self.on_vte_key_press) self._vte.connect("button-press-event", self.on_vte_button_press) self._vte.connect("popup-menu", self.on_vte_popup_menu) self._vte.connect("child-exited", lambda term: term.fork_command()) self._vte.fork_command() self.file_lookup = FileLookup()
class GeditTerminal(gtk.HBox): """VTE terminal which follows gnome-terminal default profile options""" __gsignals__ = {"populate-popup": (gobject.SIGNAL_RUN_LAST, None, (gobject.TYPE_OBJECT,))} GCONF_PROFILE_DIR = "/apps/gnome-terminal/profiles/Default" defaults = { "allow_bold": True, "audible_bell": False, "background": None, "background_color": "#FFFFFF", "backspace_binding": "ascii-del", "cursor_blinks": False, "emulation": "xterm", "font_name": "Monospace 8", "foreground_color": "#000000", "scroll_on_keystroke": False, "scroll_on_output": False, "scrollback_lines": 100, "visible_bell": False, } def __init__(self, window): gtk.HBox.__init__(self, False, 4) gconf_client.add_dir(self.GCONF_PROFILE_DIR, gconf.CLIENT_PRELOAD_RECURSIVE) self._window = window self._encoding = gedit.encoding_get_current() self._vte = vte.Terminal() self.reconfigure_vte() self._vte.set_size(self._vte.get_column_count(), 5) self._vte.show() self.pack_start(self._vte) self._scrollbar = gtk.VScrollbar(self._vte.get_adjustment()) self._scrollbar.show() self.pack_start(self._scrollbar, False, False, 0) gconf_client.notify_add(self.GCONF_PROFILE_DIR, self.on_gconf_notification) self._vte.connect("key-press-event", self.on_vte_key_press) self._vte.connect("button-press-event", self.on_vte_button_press) self._vte.connect("popup-menu", self.on_vte_popup_menu) self._vte.connect("child-exited", lambda term: term.fork_command()) self._vte.fork_command() self.file_lookup = FileLookup() def reconfigure_vte(self): # Fonts if gconf_get_bool(self.GCONF_PROFILE_DIR + "/use_system_font"): font_name = gconf_get_str("/desktop/gnome/interface/monospace_font", self.defaults["font_name"]) else: font_name = gconf_get_str(self.GCONF_PROFILE_DIR + "/font", self.defaults["font_name"]) try: self._vte.set_font(pango.FontDescription(font_name)) except: pass # colors # ~ fg_color = gconf_get_str(self.GCONF_PROFILE_DIR + "/foreground_color", # ~ self.defaults['foreground_color']) # ~ bg_color = gconf_get_str(self.GCONF_PROFILE_DIR + "/background_color", # ~ self.defaults['background_color']) fg_color = self.defaults["foreground_color"] bg_color = self.defaults["background_color"] self._vte.set_colors(gtk.gdk.color_parse(fg_color), gtk.gdk.color_parse(bg_color), []) self._vte.set_cursor_blinks( gconf_get_bool(self.GCONF_PROFILE_DIR + "/cursor_blinks", self.defaults["cursor_blinks"]) ) self._vte.set_audible_bell( not gconf_get_bool(self.GCONF_PROFILE_DIR + "/silent_bell", not self.defaults["audible_bell"]) ) self._vte.set_scrollback_lines( gconf_get_int(self.GCONF_PROFILE_DIR + "/scrollback_lines", self.defaults["scrollback_lines"]) ) self._vte.set_allow_bold(gconf_get_bool(self.GCONF_PROFILE_DIR + "/allow_bold", self.defaults["allow_bold"])) self._vte.set_scroll_on_keystroke( gconf_get_bool(self.GCONF_PROFILE_DIR + "/scroll_on_keystroke", self.defaults["scroll_on_keystroke"]) ) self._vte.set_scroll_on_output( gconf_get_bool(self.GCONF_PROFILE_DIR + "/scroll_on_output", self.defaults["scroll_on_output"]) ) self._vte.set_emulation(self.defaults["emulation"]) self._vte.set_visible_bell(self.defaults["visible_bell"]) id = self._vte.match_add("[A-Za-z0-9\\./\\_\\-~]+:([0-9]+):") self._vte.match_set_cursor_type(id, gtk.gdk.HAND2) id = self._vte.match_add("File .+ line [0-9]+") self._vte.match_set_cursor_type(id, gtk.gdk.HAND2) def on_gconf_notification(self, client, cnxn_id, entry, what): self.reconfigure_vte() def on_vte_key_press(self, term, event): modifiers = event.state & gtk.accelerator_get_default_mod_mask() if event.keyval == gtk.keysyms.F6: if modifiers == gtk.gdk.SHIFT_MASK: self.get_toplevel().child_focus(gtk.DIR_TAB_BACKWARD) else: self.get_toplevel().child_focus(gtk.DIR_TAB_FORWARD) return True return False def on_vte_button_press(self, term, event): if event.button == 1: col, row = ( int(floor(event.x / self._vte.get_char_width())), int(floor(event.y / self._vte.get_char_height())), ) match = self._vte.match_check(col, row) if match: if match[1] == 0: uri, line = match[0].split(":")[0:2] else: details = match[0].split() print details uri, line = details[1].strip(",").strip('"'), details[3] os.chdir(self.current_directory()) gfile = self.file_lookup.lookup(uri) if gfile: gedit.commands.load_uri(self._window, gfile.get_uri(), None, int(line)) # uri = "file://" + os.path.join(self.current_directory(), uri) # #uri = "file://" + os.path.expanduser(os.path.abspath(uri)) # #uri = "file://" + self.get_document_path() # line = int(line) # tab = self._window.get_tab_from_uri(uri) # if tab == None: # tab = self._window.create_tab_from_uri( uri, self._encoding, line, False, False ) # else: # doc = tab.get_document() # doc.begin_user_action() # it = doc.get_iter_at_line_offset(line-1,0) # doc.place_cursor(it) # (start, end) = doc.get_bounds() # self._window.get_active_view().scroll_to_iter(end,0.0) # self._window.get_active_view().scroll_to_iter(it,0.0) # self._window.get_active_view().grab_focus() # doc.end_user_action() # self._window.set_active_tab( tab) elif event.button == 3: self.do_popup(event) return True def on_vte_popup_menu(self, term): self.do_popup() def create_popup_menu(self): menu = gtk.Menu() item = gtk.ImageMenuItem(gtk.STOCK_COPY) item.connect("activate", lambda menu_item: self._vte.copy_clipboard()) item.set_sensitive(self._vte.get_has_selection()) menu.append(item) item = gtk.ImageMenuItem(gtk.STOCK_PASTE) item.connect("activate", lambda menu_item: self._vte.paste_clipboard()) menu.append(item) self.emit("populate-popup", menu) menu.show_all() return menu def do_popup(self, event=None): menu = self.create_popup_menu() if event is not None: menu.popup(None, None, None, event.button, event.time) else: menu.popup( None, None, lambda m: gedit.utils.menu_position_under_widget(m, self), 0, gtk.get_current_event_time() ) menu.select_first(False) def current_directory(self): return os.path.expanduser(self._vte.get_window_title().split(":")[1].strip()) def get_document_path(self): doc = self._window.get_active_document() if doc is None: return None uri = doc.get_uri() if uri is not None and gedit.utils.uri_has_file_scheme(uri): return gnomevfs.get_local_path_from_uri(uri) return None def change_directory(self, path): path = path.replace("\\", "\\\\").replace('"', '\\"') self._vte.feed_child('\x15cd "%s"\n' % path) def reset(self): self._vte.feed_child("\x15reset\n") def run(self, command): # self._window.get_active_document().save(True) # self.change_directory(os.path.dirname(filename)) self._vte.feed_child("\x15" + command + "\n") def show(self): panel = self._window.get_bottom_panel() panel.show() panel.activate_item(self)