fix up zoom signal, add an unzoom signal. generally make zooming work

This commit is contained in:
Chris Jones 2009-11-14 18:55:51 +00:00
parent 6f93a51b5f
commit 4ee756b5ec
1 changed files with 74 additions and 20 deletions

View File

@ -47,9 +47,9 @@ class Terminal(gtk.VBox):
'tab-new': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'tab-new': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'tab-top-new': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'tab-top-new': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'focus-in': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'focus-in': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'zoom': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, 'zoom': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
(gobject.TYPE_BOOL,)),
'maximise': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'maximise': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'unzoom': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'resize-term': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, 'resize-term': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
(gobject.TYPE_STRING,)), (gobject.TYPE_STRING,)),
'navigate': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, 'navigate': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
@ -77,7 +77,8 @@ class Terminal(gtk.VBox):
composite_support = None composite_support = None
cnxid = None confcnxid = None
zoomcnxid = None
def __init__(self): def __init__(self):
"""Class initialiser""" """Class initialiser"""
@ -259,7 +260,7 @@ class Terminal(gtk.VBox):
self.vte.connect('enter_notify_event', self.vte.connect('enter_notify_event',
self.on_vte_notify_enter) self.on_vte_notify_enter)
self.cnxid = self.vte.connect_after('realize', self.reconfigure) self.confcnxid = self.vte.connect_after('realize', self.reconfigure)
def create_popup_group_menu(self, widget, event = None): def create_popup_group_menu(self, widget, event = None):
"""Pop up a menu for the group widget""" """Pop up a menu for the group widget"""
@ -429,9 +430,9 @@ class Terminal(gtk.VBox):
def reconfigure(self, widget=None): def reconfigure(self, widget=None):
"""Reconfigure our settings""" """Reconfigure our settings"""
dbg('Terminal::reconfigure') dbg('Terminal::reconfigure')
if self.cnxid: if self.confcnxid:
self.vte.disconnect(self.cnxid) self.vte.disconnect(self.confcnxid)
self.cnxid = None self.confcnxid = None
# FIXME: actually reconfigure our settings # FIXME: actually reconfigure our settings
pass pass
@ -716,31 +717,78 @@ class Terminal(gtk.VBox):
"""Show the titlebar""" """Show the titlebar"""
self.titlebar.show() self.titlebar.show()
def get_zoom_data(self):
"""Return a dict of information for Window"""
data = {}
data['old_font'] = self.vte.get_font()
data['old_char_height'] = self.vte.get_char_height()
data['old_char_width'] = self.vte.get_char_width()
data['old_allocation'] = self.vte.get_allocation()
data['old_padding'] = self.vte.get_padding()
data['old_columns'] = self.vte.get_column_count()
data['old_rows'] = self.vte.get_row_count()
data['old_parent'] = self.get_parent()
return(data)
def zoom_scale(self, widget, allocation, old_data):
"""Scale our font correctly based on how big we are not vs before"""
self.disconnect(self.zoomcnxid)
self.zoomcnxid = None
new_columns = self.vte.get_column_count()
new_rows = self.vte.get_row_count()
new_font = self.vte.get_font()
new_allocation = self.vte.get_allocation()
old_alloc = {'x': old_data['old_allocation'].width - \
old_data['old_padding'][0],
'y': old_data['old_allocation'].height - \
old_data['old_padding'][1]
}
dbg('Terminal::zoom_scale: Resized from %dx%d to %dx%d' % (
old_data['old_columns'],
old_data['old_rows'],
new_columns,
new_rows))
if (new_rows == old_data['old_rows'] or new_columns == old_data['old_columns']):
dbg('Terminal::zoom_scale: One axis unchanged, not scaling')
return
old_area = old_data['old_columns'] * old_data['old_rows']
new_area = new_columns * new_rows
area_factor = (new_area / old_area) / 2
new_font.set_size(old_data['old_font'].get_size() * area_factor)
self.vte.set_font(new_font)
def is_zoomed(self): def is_zoomed(self):
"""Determine if we are a zoomed terminal""" """Determine if we are a zoomed terminal"""
widget = self.get_parent() prop = None
while True: parent = self.get_parent()
tmp = widget.get_parent() window = parent.get_top_window(self)
if not tmp:
break
else:
widget = tmp
try: try:
prop = widget.get_property('term-zoomed') prop = window.get_property('term-zoomed')
except TypeError: except TypeError:
prop = False prop = False
return(prop) return(prop)
def zoom(self): def zoom(self, widget=None):
"""Zoom ourself to fill the window""" """Zoom ourself to fill the window"""
self.emit('zoom') self.emit('zoom')
def maximise(self): def maximise(self, widget=None):
"""Maximise ourself to fill the window""" """Maximise ourself to fill the window"""
self.emit('maximise') self.emit('maximise')
def unzoom(self, widget=None):
"""Restore normal layout"""
self.emit('unzoom')
def spawn_child(self, widget=None): def spawn_child(self, widget=None):
update_records = self.config['update_records'] update_records = self.config['update_records']
login = self.config['login_shell'] login = self.config['login_shell']
@ -849,7 +897,7 @@ class Terminal(gtk.VBox):
def zoom_orig(self): def zoom_orig(self):
"""Restore original font size""" """Restore original font size"""
print "restoring font to: %s" % self.config['font'] dbg("Terminal::zoom_orig: restoring font to: %s" % self.config['font'])
self.vte.set_font(pango.FontDescription(self.config['font'])) self.vte.set_font(pango.FontDescription(self.config['font']))
# There now begins a great list of keyboard event handlers # There now begins a great list of keyboard event handlers
@ -931,10 +979,16 @@ class Terminal(gtk.VBox):
self.terminator.move_tab (self, 'left') self.terminator.move_tab (self, 'left')
def key_toggle_zoom(self): def key_toggle_zoom(self):
self.terminator.toggle_zoom (self) if self.is_zoomed():
self.unzoom()
else:
self.maximise()
def key_scaled_zoom(self): def key_scaled_zoom(self):
self.terminator.toggle_zoom (self, True) if self.is_zoomed():
self.unzoom()
else:
self.zoom()
def key_next_tab(self): def key_next_tab(self):
self.terminator.next_tab (self) self.terminator.next_tab (self)