Start landing configclass work

This commit is contained in:
Chris Jones 2008-04-02 22:10:32 +01:00
parent 8ce3f6f626
commit 65cb27c2bb
2 changed files with 86 additions and 200 deletions

View File

@ -31,34 +31,8 @@ gettext.install (APP_NAME)
# import unix-lib # import unix-lib
import pwd import pwd
# import gconf if possible, if not construct a fake replacement # import our configuration loader
class fakegconfclient: import terminatorconfig
def get_string (self, key):
return ("")
def get_list (self, key, type):
return ([])
def add_dir (self, profile, path):
return (True)
def notify_add (self, profile, callback):
return (True)
def get_bool (self, key):
return (False)
def get (self, key):
return (0)
class fakegconf:
CLIENT_PRELOAD_RECURSIVE = False
VALUE_STRING = ""
VALUE_INT = 0
VALUE_FLOAT = 0.0
VALUE_BOOL = False
def client_get_default (self):
foo = fakegconfclient ()
return (foo)
try:
import gconf
except:
pass
# import gtk libs # import gtk libs
# check just in case anyone runs it on a non-gnome system. # check just in case anyone runs it on a non-gnome system.
@ -96,92 +70,19 @@ def openurl (url):
class TerminatorTerm: class TerminatorTerm:
# Our settings
defaults = {
'gt_dir' : '/apps/gnome-terminal',
'_profile_dir' : '%s/profiles',
'titlebars' : True,
'titletips' : False,
'allow_bold' : True,
'silent_bell' : True,
'background_color' : '#000000',
'background_darkness' : 0.5,
'background_type' : 'solid',
'backspace_binding' : 'ascii-del',
'delete_binding' : 'delete-sequence',
'cursor_blink' : False,
'emulation' : 'xterm',
'font' : 'Serif 10',
'foreground_color' : '#AAAAAA',
'scrollbar_position' : "right",
'scroll_background' : True,
'scroll_on_keystroke' : False,
'scroll_on_output' : False,
'scrollback_lines' : 100,
'focus' : 'sloppy',
'exit_action' : 'close',
'palette' : '#000000000000:#CDCD00000000:#0000CDCD0000:#CDCDCDCD0000:#30BF30BFA38E:#A53C212FA53C:#0000CDCDCDCD:#FAFAEBEBD7D7:#404040404040:#FFFF00000000:#0000FFFF0000:#FFFFFFFF0000:#00000000FFFF:#FFFF0000FFFF:#0000FFFFFFFF:#FFFFFFFFFFFF',
'word_chars' : '-A-Za-z0-9,./?%&#:_',
'mouse_autohide' : True,
}
matches = {} matches = {}
def __init__ (self, terminator, profile = None, command = None, cwd = None): def __init__ (self, terminator, profile = None, command = None, cwd = None):
self.defaults['profile_dir'] = self.defaults['_profile_dir']%(self.defaults['gt_dir'])
self.terminator = terminator self.terminator = terminator
self.gconf_client = gconf.client_get_default () self.conf = terminator.conf
self.command = command self.command = command
self.cwd = cwd or os.getcwd(); self.cwd = cwd or os.getcwd();
if not os.path.exists(self.cwd) or not os.path.isdir(self.cwd): if not os.path.exists(self.cwd) or not os.path.isdir(self.cwd):
self.cwd = pwd.getpwuid(os.getuid ())[5] self.cwd = pwd.getpwuid(os.getuid ())[5]
if profile == None:
profile = self.gconf_client.get_string (self.defaults['gt_dir'] + '/global/default_profile')
self.profile = ""
profiles = self.gconf_client.get_list (self.defaults['gt_dir'] + '/global/profile_list', 'string')
if profile in profiles:
self.profile = '%s/%s'%(self.defaults['profile_dir'], profile)
else:
if profile != "Default" and "Default" in profiles:
self.profile = '%s/Default'%(self.defaults['profile_dir'])
if self.profile:
self.gconf_client.add_dir (self.profile, gconf.CLIENT_PRELOAD_RECURSIVE)
self.gconf_client.notify_add (self.profile, self.on_gconf_notification)
if os.path.exists (pwd.getpwuid(os.getuid ())[5] + "/." + APP_NAME + "rc"):
f = open (pwd.getpwuid (os.getuid ())[5] + "/." + APP_NAME + "rc")
config = f.readlines ()
f.close ()
for line in config:
try:
line = line.strip ()
if line[0] == '#':
pass
elif line:
(key,value) = line.split ("=")
print >> sys.stderr, _('''Overriding setting '%s' from value '%s' to: '%s' ''')%(key.strip (), self.defaults[key.strip ()], value.strip ())
if value.strip() == "True":
self.defaults[key.strip ()] = True
elif value.strip() == "False":
self.defaults[key.strip ()] = False
else:
self.defaults[key.strip ()] = value.strip ()
except:
pass
self.gconf_client.add_dir ('/apps/metacity/general', gconf.CLIENT_PRELOAD_RECURSIVE)
self.gconf_client.notify_add ('/apps/metacity/general/focus_mode', self.on_gconf_notification)
self.clipboard = gtk.clipboard_get (gtk.gdk.SELECTION_CLIPBOARD) self.clipboard = gtk.clipboard_get (gtk.gdk.SELECTION_CLIPBOARD)
self.scrollbar_position = self.conf.scrollbar_position
self.scrollbar_position = self.reconf ('scrollbar_position')
self._vte = vte.Terminal () self._vte = vte.Terminal ()
self._vte.set_size (80, 24) self._vte.set_size (80, 24)
@ -198,7 +99,7 @@ class TerminatorTerm:
self._box.show() self._box.show()
self._box.pack_start(self._titlebox, False) self._box.pack_start(self._titlebox, False)
self._box.pack_start(self._termbox) self._box.pack_start(self._termbox)
if self.reconf('titlebars'): if self.conf.titlebars:
self._titlebox.show() self._titlebox.show()
else: else:
self._titlebox.hide() self._titlebox.hide()
@ -224,8 +125,7 @@ class TerminatorTerm:
self._vte.connect ("focus-out-event", self.on_vte_focus_out) self._vte.connect ("focus-out-event", self.on_vte_focus_out)
self._vte.connect ("focus-in-event", self.on_vte_focus_in) self._vte.connect ("focus-in-event", self.on_vte_focus_in)
exit_action = self.gconf_client.get_string (self.profile + "/exit_action") exit_action = self.conf.exit_action
exit_action = self.reconf ("exit_action")
if exit_action == "restart": if exit_action == "restart":
self._vte.connect ("child-exited", self.spawn_child) self._vte.connect ("child-exited", self.spawn_child)
# We need to support "left" because some buggy versions of gnome-terminal # We need to support "left" because some buggy versions of gnome-terminal
@ -246,14 +146,14 @@ class TerminatorTerm:
self.spawn_child () self.spawn_child ()
def spawn_child (self, event=None): def spawn_child (self, event=None):
update_records = self.gconf_client.get_bool (self.profile + "/update_records") or True update_records = self.conf.update_records
login = self.gconf_client.get_bool (self.profile + "/login_shell") or False login = self.conf.login_shell
if self.command: if self.command:
args = self.command args = self.command
shell = self.command[0] shell = self.command[0]
elif self.gconf_client.get_bool (self.profile + "/use_custom_command") == True: elif self.conf.use_custom_command:
args = self.gconf_client.get_string (self.profile + "/custom_command").split () args = self.conf.custom_command.split ()
shell = args[0] shell = args[0]
else: else:
shell = pwd.getpwuid (os.getuid ())[6] shell = pwd.getpwuid (os.getuid ())[6]
@ -275,42 +175,19 @@ class TerminatorTerm:
cwd = None cwd = None
return (cwd) return (cwd)
def reconf (self, property):
value = self.gconf_client.get ('%s/%s'%(self.profile, property))
ret = None
if not value:
try:
ret = self.defaults[property]
except:
pass
else:
if value.type == gconf.VALUE_STRING:
ret = value.get_string ()
elif value.type == gconf.VALUE_INT:
ret = value.get_int ()
elif value.type == gconf.VALUE_FLOAT:
ret = value.get_float ()
elif value.type == gconf.VALUE_BOOL:
ret = value.get_bool ()
if ret == None:
print >> sys.stderr, _('Unknown value requested. Unable to find in gconf profile or default settings: ') + property
return (ret)
def reconfigure_vte (self): def reconfigure_vte (self):
# Set our emulation # Set our emulation
self._vte.set_emulation (self.defaults['emulation']) self._vte.set_emulation (self.conf.emulation)
# Set our wordchars # Set our wordchars
self._vte.set_word_chars (self.reconf ('word_chars')) self._vte.set_word_chars (self.conf.word_chars)
# Set our mouselation # Set our mouselation
self._vte.set_mouse_autohide (self.defaults['mouse_autohide']) self._vte.set_mouse_autohide (self.conf.mouse_autohide)
# Set our compatibility # Set our compatibility
backspace = self.reconf ('backspace_binding') backspace = self.conf.backspace_binding
delete = self.reconf ('delete_binding') delete = self.conf.delete_binding
# Note, each of the 4 following comments should replace the line beneath it, but the python-vte bindings don't appear to support this constant, so the magic values are being assumed from the C enum :/ # Note, each of the 4 following comments should replace the line beneath it, but the python-vte bindings don't appear to support this constant, so the magic values are being assumed from the C enum :/
if backspace == "ascii-del": if backspace == "ascii-del":
@ -330,28 +207,23 @@ class TerminatorTerm:
self._vte.set_backspace_binding (backbind) self._vte.set_backspace_binding (backbind)
self._vte.set_delete_binding (delbind) self._vte.set_delete_binding (delbind)
# Set our font, preferably from gconf settings # Set our font
if self.gconf_client.get_bool (self.profile + "/use_system_font"):
font_name = (self.gconf_client.get_string ("/desktop/gnome/interface/monospace_font_name") or self.defaults['font'])
else:
font_name = self.reconf ('font')
try: try:
self._vte.set_font (pango.FontDescription (font_name)) self._vte.set_font (pango.FontDescription (self.conf.font))
except: except:
pass pass
# Set our boldness # Set our boldness
self._vte.set_allow_bold (self.reconf ('allow_bold')) self._vte.set_allow_bold (self.conf.allow_bold)
# Set our color scheme, preferably from gconf settings # Set our color scheme
palette = self.reconf ('palette') palette = self.conf.palette
if self.gconf_client.get_bool (self.profile + "/use_theme_colors"): if self.conf.use_theme_colors:
fg_color = self._vte.get_style ().text[gtk.STATE_NORMAL] fg_color = self._vte.get_style ().text[gtk.STATE_NORMAL]
bg_color = self._vte.get_style ().base[gtk.STATE_NORMAL] bg_color = self._vte.get_style ().base[gtk.STATE_NORMAL]
else: else:
fg_color = gtk.gdk.color_parse (self.reconf ('foreground_color')) fg_color = gtk.gdk.color_parse (self.conf.foreground_color)
bg_color = gtk.gdk.color_parse (self.reconf ('background_color')) bg_color = gtk.gdk.color_parse (self.conf.background_color)
colors = palette.split (':') colors = palette.split (':')
palette = [] palette = []
@ -362,12 +234,12 @@ class TerminatorTerm:
# Set our background image, transparency and type # Set our background image, transparency and type
# Many thanks to the authors of gnome-terminal, on which this code is based. # Many thanks to the authors of gnome-terminal, on which this code is based.
background_type = self.reconf ('background_type') background_type = self.conf.background_type
# set background image settings # set background image settings
if background_type == "image": if background_type == "image":
self._vte.set_background_image_file (self.reconf ('background_image')) self._vte.set_background_image_file (self.conf.background_image)
self._vte.set_scroll_background (self.reconf('scroll_background')) self._vte.set_scroll_background (self.conf.scroll_background)
else: else:
self._vte.set_background_image_file('') self._vte.set_background_image_file('')
self._vte.set_scroll_background(False) self._vte.set_scroll_background(False)
@ -375,8 +247,8 @@ class TerminatorTerm:
# set transparency for the background (image) # set transparency for the background (image)
if background_type in ("image", "transparent"): if background_type in ("image", "transparent"):
self._vte.set_background_tint_color (bg_color) self._vte.set_background_tint_color (bg_color)
self._vte.set_background_saturation(1 - (self.reconf ('background_darkness'))) self._vte.set_background_saturation(1 - (self.conf.background_darkness))
self._vte.set_opacity(int(self.reconf('background_darkness') * 65535)) self._vte.set_opacity(int(self.conf.background_darkness * 65535))
else: else:
self._vte.set_background_saturation(1) self._vte.set_background_saturation(1)
self._vte.set_opacity(65535) self._vte.set_opacity(65535)
@ -387,43 +259,39 @@ class TerminatorTerm:
self._vte.set_background_transparent (False) self._vte.set_background_transparent (False)
# Set our cursor blinkiness # Set our cursor blinkiness
self._vte.set_cursor_blinks = (self.reconf ('cursor_blink')) self._vte.set_cursor_blinks = (self.conf.cursor_blink)
# Set our audible belliness # Set our audible belliness
silent_bell = self.reconf ('silent_bell') silent_bell = self.conf.silent_bell
self._vte.set_audible_bell = not silent_bell self._vte.set_audible_bell = not silent_bell
self._vte.set_visible_bell = silent_bell self._vte.set_visible_bell = silent_bell
# Set our scrolliness # Set our scrolliness
self._vte.set_scrollback_lines (self.reconf ('scrollback_lines')) self._vte.set_scrollback_lines (self.conf.scrollback_lines)
self._vte.set_scroll_on_keystroke (self.reconf ('scroll_on_keystroke')) self._vte.set_scroll_on_keystroke (self.conf.scroll_on_keystroke)
self._vte.set_scroll_on_output (self.reconf ('scroll_on_output')) self._vte.set_scroll_on_output (self.conf.scroll_on_output)
scrollbar_position = self.reconf ('scrollbar_position') if self.scrollbar_position != self.conf.scrollbar_position:
self.scrollbar_position = self.conf.scrollbar_position
if scrollbar_position != self.scrollbar_position: if self.scrollbar_position == 'hidden' or self.scrollbar_position == 'disabled':
if scrollbar_position == 'hidden' or scrollbar_position == 'disabled':
self._scrollbar.hide () self._scrollbar.hide ()
else: else:
self._scrollbar.show () self._scrollbar.show ()
if scrollbar_position == 'right': if self.scrollbar_position == 'right':
self._box.remove (self._scrollbar) self._box.remove (self._scrollbar)
self._box.remove (self._vte) self._box.remove (self._vte)
self._box.pack_start (self._vte) self._box.pack_start (self._vte)
self._box.pack_start (self._scrollbar) self._box.pack_start (self._scrollbar)
elif scrollbar_position == 'left': elif self.scrollbar_position == 'left':
self._box.remove (self._vte) self._box.remove (self._vte)
self._box.remove (self._scrollbar) self._box.remove (self._scrollbar)
self._box.pack_start(self._scrollbar) self._box.pack_start(self._scrollbar)
self._box.pack_start(self._vte) self._box.pack_start(self._vte)
self.scrollbar_position = scrollbar_position
# Set our sloppiness # Set our sloppiness
self.focus = self.gconf_client.get_string ("/apps/metacity/general/focus_mode") or self.defaults['focus'] self.focus = self.conf.focus
def on_gconf_notification (self, client, cnxn_id, entry, what):
self.reconfigure_vte ()
def on_composited_changed (self, widget): def on_composited_changed (self, widget):
self.reconfigure_vte () self.reconfigure_vte ()
@ -612,7 +480,7 @@ class TerminatorTerm:
return menu return menu
def on_vte_title_change(self, vte): def on_vte_title_change(self, vte):
if self.reconf ('titletips'): if self.conf.titletips:
vte.set_property ("has-tooltip", True) vte.set_property ("has-tooltip", True)
vte.set_property ("tooltip-text", vte.get_window_title ()) vte.set_property ("tooltip-text", vte.get_window_title ())
#set the title anyhow, titlebars setting only show/hide the label #set the title anyhow, titlebars setting only show/hide the label
@ -639,11 +507,24 @@ class TerminatorTerm:
class Terminator: class Terminator:
def __init__ (self, profile, command = None, fullscreen = False, maximise = False, borderless = False): def __init__ (self, profile, command = None, fullscreen = False, maximise = False, borderless = False):
self.profile = profile self.profile = profile
self.gconf_client = gconf.client_get_default ()
self.command = command self.command = command
self._fullscreen = False self._fullscreen = False
stores = []
stores.append (terminatorconfig.TerminatorConfValuestoreRC ())
# FIXME: enable this again, we should trap and discard broken gconf stuff
# try:
import gconf
store = terminatorconfig.TerminatorConfValuestoreGConf ()
store.set_reconfigure_callback (self.reconfigure_vtes)
stores.append (store)
# except:
# pass
self.conf = terminatorconfig.TerminatorConfig (stores)
self.window = gtk.Window () self.window = gtk.Window ()
self.window.set_title (APP_NAME.capitalize()) self.window.set_title (APP_NAME.capitalize())
@ -875,9 +756,6 @@ class Terminator:
#self.window.set_title(self.term_list[previous]._vte.get_window_title()) #self.window.set_title(self.term_list[previous]._vte.get_window_title())
self.term_list[previous]._vte.grab_focus () self.term_list[previous]._vte.grab_focus ()
def resizeterm (self, widget, keyname): def resizeterm (self, widget, keyname):
vertical = False vertical = False
if keyname in ('Up', 'Down'): if keyname in ('Up', 'Down'):
@ -903,13 +781,11 @@ class Terminator:
if keyname in ('Up', 'Left'): if keyname in ('Up', 'Left'):
move = -10 move = -10
move = max(2, parent.get_position() + move) move = max(2, parent.get_position() + move)
move = min(maxi, move) move = min(maxi, move)
parent.set_position(move) parent.set_position(move)
def get_first_parent_paned (self, widget, vertical = None): def get_first_parent_paned (self, widget, vertical = None):
"""This method returns the first parent pane of a widget. """This method returns the first parent pane of a widget.
if vertical is True returns the first VPaned if vertical is True returns the first VPaned
@ -926,13 +802,11 @@ class Terminator:
return parent return parent
return self.get_first_parent_paned(parent, vertical) return self.get_first_parent_paned(parent, vertical)
def reconfigure_vtes (self):
for term in self.term_list:
term.reconfigure_vte ()
if __name__ == '__main__': if __name__ == '__main__':
try:
if (gconf):
pass
except:
# Install a fake gconf setup
gconf = fakegconf ()
def execute_cb (option, opt, value, parser): def execute_cb (option, opt, value, parser):
assert value is None assert value is None
@ -953,7 +827,6 @@ if __name__ == '__main__':
parser.add_option ("-p", "--profile", dest="profile", help="Specify a GNOME Terminal profile to emulate") parser.add_option ("-p", "--profile", dest="profile", help="Specify a GNOME Terminal profile to emulate")
parser.add_option ("-e", "--command", dest="command", help="Execute the argument to this option inside the terminal") parser.add_option ("-e", "--command", dest="command", help="Execute the argument to this option inside the terminal")
parser.add_option ("-x", "--execute", dest="execute", action="callback", callback=execute_cb, help="Execute the remainder of the command line inside the terminal") parser.add_option ("-x", "--execute", dest="execute", action="callback", callback=execute_cb, help="Execute the remainder of the command line inside the terminal")
parser.add_option ("-g", "--no-gconf", dest="nogconf", action="store_true", help="Disable gconf usage, falling back on ~/." + APP_NAME.capitalize() + "rc and defaults")
(options, args) = parser.parse_args () (options, args) = parser.parse_args ()
if len (args) != 0: if len (args) != 0:
@ -968,9 +841,6 @@ if __name__ == '__main__':
command.append (options.command) command.append (options.command)
if (options.execute): if (options.execute):
command = options.execute command = options.execute
if (options.nogconf):
del (gconf)
gconf = fakegconf ()
term = Terminator (options.profile, command, options.fullscreen, options.maximise, options.borderless) term = Terminator (options.profile, command, options.fullscreen, options.maximise, options.borderless)

View File

@ -70,10 +70,6 @@ class TerminatorConfig:
dbg ("Config: Out of sources") dbg ("Config: Out of sources")
raise (AttributeError) raise (AttributeError)
def set_reconfigure_callback (self, function):
self.reconfigure_callback = function
return (True)
class TerminatorConfValuestore: class TerminatorConfValuestore:
type = "Base" type = "Base"
values = {} values = {}
@ -108,6 +104,12 @@ class TerminatorConfValuestore:
'palette' : [str, '#000000000000:#CDCD00000000:#0000CDCD0000:#CDCDCDCD0000:#30BF30BFA38E:#A53C212FA53C:#0000CDCDCDCD:#FAFAEBEBD7D7:#404040404040:#FFFF00000000:#0000FFFF0000:#FFFFFFFF0000:#00000000FFFF:#FFFF0000FFFF:#0000FFFFFFFF:#FFFFFFFFFFFF'], 'palette' : [str, '#000000000000:#CDCD00000000:#0000CDCD0000:#CDCDCDCD0000:#30BF30BFA38E:#A53C212FA53C:#0000CDCDCDCD:#FAFAEBEBD7D7:#404040404040:#FFFF00000000:#0000FFFF0000:#FFFFFFFF0000:#00000000FFFF:#FFFF0000FFFF:#0000FFFFFFFF:#FFFFFFFFFFFF'],
'word_chars' : [str, '-A-Za-z0-9,./?%&#:_'], 'word_chars' : [str, '-A-Za-z0-9,./?%&#:_'],
'mouse_autohide' : [bool, True], 'mouse_autohide' : [bool, True],
'update_records' : [bool, True],
'login_shell' : [bool, False],
'use_custom_command' : [bool, False],
'custom_command' : [str, ''],
'use_system_font' : [bool, True],
'use_theme_colors' : [bool, True],
} }
def __getattr__ (self, keyname): def __getattr__ (self, keyname):
@ -150,6 +152,8 @@ class TerminatorConfValuestoreGConf (TerminatorConfValuestore):
def __init__ (self, profile = None): def __init__ (self, profile = None):
self.type = "GConf" self.type = "GConf"
import gconf
self.client = gconf.client_get_default () self.client = gconf.client_get_default ()
# Grab a couple of values from base class to avoid recursing with our __getattr__ # Grab a couple of values from base class to avoid recursing with our __getattr__
@ -178,8 +182,15 @@ class TerminatorConfValuestoreGConf (TerminatorConfValuestore):
self.client.add_dir ('/apps/metacity/general', gconf.CLIENT_PRELOAD_RECURSIVE) self.client.add_dir ('/apps/metacity/general', gconf.CLIENT_PRELOAD_RECURSIVE)
self.client.notify_add ('/apps/metacity/general/focus_mode', self.on_gconf_notify) self.client.notify_add ('/apps/metacity/general/focus_mode', self.on_gconf_notify)
# FIXME: Do we need to watch more non-profile stuff here?
def set_reconfigure_callback (self, function):
dbg ("Config: setting callback to: %s"%function)
self.reconfigure_callback = function
return (True)
def on_gconf_notify (self, client, cnxn_id, entry, what): def on_gconf_notify (self, client, cnxn_id, entry, what):
dbg ("VSGConf: gconf changed, callback is: %s"%self.reconfigure_callback)
if self.reconfigure_callback: if self.reconfigure_callback:
self.reconfigure_callback () self.reconfigure_callback ()
@ -187,6 +198,11 @@ class TerminatorConfValuestoreGConf (TerminatorConfValuestore):
ret = None ret = None
dbg ('VSGConf: preparing: %s/%s'%(self.profile, key)) dbg ('VSGConf: preparing: %s/%s'%(self.profile, key))
if key == 'font':
if self.use_system_font:
value = self.client.get ('/desktop/gnome/interface/monospace_font_name')
else:
value = self.client.get ('%s/%s'%(self.profile, key)) value = self.client.get ('%s/%s'%(self.profile, key))
dbg ('VSGConf: getting: %s'%value) dbg ('VSGConf: getting: %s'%value)
if value: if value: