Пример #1
0
    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()
Пример #2
0
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)