Add support for dynamically splitting terminals. This requires us to set a very small initial size for the terminals otherwise the window grows in multiples of the screen width/height, which is less than helpful. also remove much initialisation code, now it isn't necessary

This commit is contained in:
Chris Jones 2007-07-29 03:06:52 +01:00
parent 97a11e2155
commit 78f030ca2a
1 changed files with 60 additions and 23 deletions

View File

@ -74,6 +74,7 @@ class TerminatorTerm:
self.clipboard = gtk.clipboard_get (gtk.gdk.SELECTION_CLIPBOARD) self.clipboard = gtk.clipboard_get (gtk.gdk.SELECTION_CLIPBOARD)
self._vte = vte.Terminal () self._vte = vte.Terminal ()
self._vte.set_size (5, 5)
self.reconfigure_vte () self.reconfigure_vte ()
self._vte.show () self._vte.show ()
@ -258,6 +259,17 @@ class TerminatorTerm:
item.connect ("toggled", lambda menu_item: self.do_scrollbar_toggle ()) item.connect ("toggled", lambda menu_item: self.do_scrollbar_toggle ())
menu.append (item) menu.append (item)
item = gtk.MenuItem ()
menu.append (item)
item = gtk.MenuItem ("Split _Horizontally")
item.connect ("activate", lambda menu_item: self.term.splithoriz (self))
menu.append (item)
item = gtk.MenuItem ("Split _Vertically")
item.connect ("activate", lambda menu_item: self.term.splitvert (self))
menu.append (item)
menu.show_all () menu.show_all ()
return menu return menu
@ -265,6 +277,7 @@ class TerminatorTerm:
return self._box return self._box
class Terminator: class Terminator:
def __init__ (self): def __init__ (self):
self.gconf_client = gconf.client_get_default () self.gconf_client = gconf.client_get_default ()
@ -275,6 +288,13 @@ class Terminator:
self.window.connect ("destroy", self.on_destroy_event) self.window.connect ("destroy", self.on_destroy_event)
self.window.maximize () self.window.maximize ()
# Start out with just one terminal
# FIXME: This should be really be decided from some kind of profile
term = (TerminatorTerm (self))
self.window.add (term.get_box ())
self.window.show_all ()
def on_delete_event (self, widget, event, data=None): def on_delete_event (self, widget, event, data=None):
dialog = gtk.Dialog ("Quit?", self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_QUIT, gtk.RESPONSE_ACCEPT)) dialog = gtk.Dialog ("Quit?", self.window, gtk.DIALOG_MODAL, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_QUIT, gtk.RESPONSE_ACCEPT))
label = gtk.Label("Do you really want to quit?") label = gtk.Label("Do you really want to quit?")
@ -290,30 +310,47 @@ class Terminator:
def on_destroy_event (self, widget, data=None): def on_destroy_event (self, widget, data=None):
gtk.main_quit () gtk.main_quit ()
def splithoriz (self, widget):
term2 = TerminatorTerm (self)
parent = widget.get_box ().get_parent()
pane = gtk.HPaned ()
if isinstance (parent, gtk.Window):
# We just have one term
termwidth = parent.allocation.width / 2
widget.get_box ().reparent (pane)
pane.pack1 (widget.get_box (), True, False)
pane.pack2 (term2.get_box (), True, False)
parent.add (pane)
pane.set_position (termwidth)
if isinstance (parent, gtk.Paned):
# We are inside a split term
cols = widget._vte.get_column_count ()
rows = widget._vte.get_row_count ()
widget._vte.set_size (cols / 2, rows)
term2._vte.set_size (cols / 2, rows)
if (widget.get_box () == parent.get_child1 ()):
widget.get_box ().reparent (pane)
parent.pack1 (pane, True, False)
else:
widget.get_box ().reparent (pane)
parent.pack2(pane, True, False)
pane.pack1 (widget.get_box (), True, False)
pane.pack2 (term2.get_box (), True, False)
parent.show_all ()
def splitvert (self, widget):
pass
if __name__ == '__main__': if __name__ == '__main__':
term = Terminator () term = Terminator ()
t1 = TerminatorTerm (term)
t2 = TerminatorTerm (term)
t3 = TerminatorTerm (term)
t4 = TerminatorTerm (term)
# FIXME: BUG: These panes allow resizing to 0 width, which confuses the hell out of vte
# FIXME: Resizing doesn't seem to trigger a proper SIGWNCH in the terminals
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 () gtk.main ()