From 5242a0f3cb3dad67c2b0e7389f1b60ea0156658c Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Thu, 9 Nov 2006 21:18:31 -0800 Subject: [PATCH] Rewrite based on the very informative, if somewhat pointless gedit terminal plugin. Lots of functionality split out into classes, with a hacky __main__ to bung four terminals into gtk panes. --- termiator.py | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++ vte-demo.py | 114 ------------------------------------------------ 2 files changed, 119 insertions(+), 114 deletions(-) create mode 100755 termiator.py delete mode 100755 vte-demo.py diff --git a/termiator.py b/termiator.py new file mode 100755 index 00000000..7f1bdaa6 --- /dev/null +++ b/termiator.py @@ -0,0 +1,119 @@ +#!/usr/bin/python +import sys +import string +import getopt +import gtk +import vte +import gconf +import pango + +class TerminatorTerm: + # FIXME: How do we get a list of profile keys to be dynamic about this? + GCONF_PROFILE_DIR = "/apps/gnome-terminal/profiles/Default" + + defaults = { + 'allow_bold' : True, + 'audible_bell' : False, + 'background' : None, + 'background_color' : '#000000', + 'backspace_binding' : 'ascii-del', + 'cursor_blinks' : False, + 'emulation' : 'xterm', + 'font_name' : 'Serif 10', + 'foreground_color' : '#AAAAAA', + 'scroll_on_keystroke' : False, + 'scroll_on_output' : False, + 'scrollback_lines' : 100, + 'visible_bell' : False + } + + def __init__ (self): + self.gconf_client = gconf.client_get_default () + self.gconf_client.add_dir (self.GCONF_PROFILE_DIR, gconf.CLIENT_PRELOAD_RECURSIVE) + + self._vte = vte.Terminal () + self.reconfigure_vte () + self._vte.show() + + self._box = gtk.HBox () + self._scrollbar = gtk.VScrollbar (self._vte.get_adjustment ()) + self._scrollbar.show () + + self._box.pack_start (self._vte) + self._box.pack_start (self._scrollbar, False) + + self.gconf_client.notify_add (self.GCONF_PROFILE_DIR, self.on_gconf_notification) + + 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 () + + def reconfigure_vte (self): + self._vte.set_emulation (self.defaults['emulation']) + + if self.gconf_client.get_bool (self.GCONF_PROFILE_DIR + "/use_system_font"): + font_name = (self.gconf_client.get_string ("/desktop/gnome/interface/monospace_font_name") or self.defaults['font_name']) + else: + font_name = (self.gconf_client.get_string (self.GCONF_PROFILE_DIR + "/font") or self.defaults['font_name']) + + try: + self._vte.set_font (pango.FontDescription (font_name)) + except: + pass + + # FIXME: Pull in the colors, cursor, bell, scrollback, bold, scroll, etc settings + + def on_gconf_notification (self, client, cnxn_id, entry, what): + self.reconfigure_vte () + + def on_vte_button_press (self, term, event): + if event.button == 1: + print "Left mouse button" + self._vte.grab_focus () + return True + if event.button == 3: + return True + + def get_box (self): + return self._box + +class Terminator: + def __init__ (self): + self.window = gtk.Window () + self.window.connect ("delete_event", self.on_delete_event) + self.window.connect ("destroy", self.on_destroy_event) + + def on_delete_event (self, widget, event, data=None): + # FIXME: return True if we want to keep the window open (ie a "Do you want to quit" requester) + return False + + def on_destroy_event (self, widget, data=None): + gtk.main_quit () + +if __name__ == '__main__': + term = Terminator () + + t1 = TerminatorTerm () + t2 = TerminatorTerm () + t3 = TerminatorTerm () + t4 = TerminatorTerm () + + pane1 = gtk.HPaned () + pane1.add1 (t1.get_box ()) + pane1.add2 (t2.get_box ()) + + pane2 = gtk.HPaned () + pane2.add1 (t3.get_box ()) + pane2.add2 (t4.get_box ()) + + vpane = gtk.VPaned () + vpane.add1 (pane1) + vpane.add2 (pane2) + + term.window.add (vpane) + term.window.show_all () + + gtk.main () + diff --git a/vte-demo.py b/vte-demo.py deleted file mode 100755 index 84fbd31c..00000000 --- a/vte-demo.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/python -import sys -import string -import getopt -import gtk -import vte - -def selected_cb(terminal, column, row, cb_data): - if (row == 15): - if (column < 40): - return 1 - return 0 - -def restore_cb(terminal): - (text, attrs) = terminal.get_text(selected_cb, 1) - print "A portion of the text at restore-time is:" - print text - -def child_exited_cb(terminal): - gtk.main_quit() - -def maketerm(): - terminal = vte.Terminal() - if (background): - terminal.set_background_image(background) - if (transparent): - terminal.set_background_transparent(gtk.TRUE) - terminal.set_cursor_blinks(blink) - terminal.set_emulation(emulation) - terminal.set_font_from_string(font) - terminal.set_scrollback_lines(scrollback) - terminal.set_audible_bell(audible) - terminal.set_visible_bell(visible) - terminal.connect("child-exited", child_exited_cb) - terminal.connect("restore-window", restore_cb) - if (command): - # Start up the specified command. - child_pid = terminal.fork_command(command) - else: - # Start up the default command, the user's shell. - child_pid = terminal.fork_command() - terminal.show() - return (terminal) - -if __name__ == '__main__': - child_pid = -1; - # Defaults. - audible = 0 - background = None - blink = 0 - command = None - emulation = "xterm" - font = "mono 9" - scrollback = 100 - transparent = 0 - visible = 0 - # Let the user override them. - (shorts, longs) = getopt.getopt(sys.argv[1:], "B:Tabc:f:n:t:v", ["background", "transparent", "audible", "blink", "command=", "font=", "scrollback=", "terminal=", "visible"]) - for argpair in (shorts + longs): - if ((argpair[0] == '-B') or (argpair[0] == '--background')): - print "Setting background image to `" + argpair[1] + "'." - background = argpair[1] - if ((argpair[0] == '-T') or (argpair[0] == '--transparent')): - print "Setting transparency." - transparent = not transparent - if ((argpair[0] == '-a') or (argpair[0] == '--audible')): - print "Setting audible bell." - audible = not audible - if ((argpair[0] == '-b') or (argpair[0] == '--blink')): - print "Setting blinking cursor." - blink = not blink - if ((argpair[0] == '-c') or (argpair[0] == '--command')): - print "Running command `" + argpair[1] + "'." - command = argpair[1] - if ((argpair[0] == '-f') or (argpair[0] == '--font')): - print "Setting font to `" + argpair[1] + "'." - font = argpair[1] - if ((argpair[0] == '-n') or (argpair[0] == '--scrollback')): - scrollback = string.atoi(argpair[1]) - if (scrollback == 0): - scrollback = 100 - else: - print "Setting scrollback size to `" + str(scrollback) + "'." - if ((argpair[0] == '-t') or (argpair[0] == '--terminal')): - print "Setting terminal type to `" + argpair[1] + "'." - emulation = argpair[1] - if ((argpair[0] == '-v') or (argpair[0] == '--visible')): - print "Setting visible bell." - visible = not visible - window = gtk.Window() - terminal = maketerm() - terminal2 = maketerm() - - scrollbar = gtk.VScrollbar() - scrollbar.set_adjustment(terminal.get_adjustment()) - - scrollbar2 = gtk.VScrollbar() - scrollbar2.set_adjustment(terminal.get_adjustment()) - - box = gtk.HBox() - box.pack_start(terminal) - box.pack_start(scrollbar, False) - - box2 = gtk.HBox() - box2.pack_start(terminal2) - box2.pack_start(scrollbar2, False) - - pane = gtk.HPaned() - pane.add1(box) - pane.add2(box2) - - window.add(pane) - window.show_all() - gtk.main()