diff --git a/terminatorlib/config.py b/terminatorlib/config.py index 053e4357..4ab74b9b 100755 --- a/terminatorlib/config.py +++ b/terminatorlib/config.py @@ -34,6 +34,7 @@ up, set a default for it first.""" import os, platform, sys, re import pwd import gtk, pango +import gio # set this to true to enable debugging output # These should be moved somewhere better. @@ -183,8 +184,9 @@ class TerminatorConfValuestore: # Our settings def __getitem__ (self, keyname): if self.values.has_key (keyname): - dbg ("Returning '%s'"%keyname) - return self.values[keyname] + value = self.values[keyname] + dbg ("Returning '%s':'%s'"%(keyname, value)) + return value else: dbg ("Failed to find '%s'"%keyname) raise (KeyError) @@ -197,8 +199,6 @@ class TerminatorConfValuestoreDefault (TerminatorConfValuestore): class TerminatorConfValuestoreRC (TerminatorConfValuestore): rcfilename = "" type = "RCFile" - #FIXME: use inotify to watch the rc, split __init__ into a parsing function - # that can be re-used when rc changes. def __init__ (self): try: directory = os.environ['XDG_CONFIG_HOME'] @@ -207,12 +207,36 @@ class TerminatorConfValuestoreRC (TerminatorConfValuestore): directory = os.path.join (os.path.expanduser("~"), ".config") self.rcfilename = os.path.join(directory, "terminator/config") dbg(" VS_RCFile: config file located at %s" % self.rcfilename) - if os.path.exists (self.rcfilename): - ini = ConfigFile(self.rcfilename, self._rc_set_callback()) - try: - ini.parse() - except ParsedWithErrors, e: - msg = _("""Configuration error + self.call_parser(True) + + monfile = gio.File(self.rcfilename) + monmon = monfile.monitor_file() + monmon.connect("changed", self.file_changed) + + def set_reconfigure_callback (self, function): + dbg (" VS_RCFile: setting callback to: %s"%function) + self.reconfigure_callback = function + return (True) + + def file_changed (self, monitor, file, unknown, event): + if event == gio.FILE_MONITOR_EVENT_CHANGES_DONE_HINT: + print "VS_RCFile: config file changed, reload" + self.values = {} + self.call_parser() + self.reconfigure_callback() + + def call_parser (self, is_init = False): + dbg (" VS_RCFile: parsing config file") + if not os.path.exists (self.rcfilename): + err (" VS_RCFile: %s does not exist" % self.rcfilename) + ini = ConfigFile(self.rcfilename, self._rc_set_callback()) + try: + ini.parse() + except ParsedWithErrors, e: + # We don't really want to produce an error dialog every run + if not is_init: + pass + msg = _("""Configuration error Errors were encountered while parsing terminator_config(5) file: @@ -220,41 +244,41 @@ Errors were encountered while parsing terminator_config(5) file: %d line(s) have been ignored.""") % (self.rcfilename, len(e.errors)) - dialog = gtk.Dialog(_("Configuration error"), None, gtk.DIALOG_MODAL, - (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) - dialog.set_has_separator(False) - dialog.set_resizable(False) + dialog = gtk.Dialog(_("Configuration error"), None, gtk.DIALOG_MODAL, + (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) + dialog.set_has_separator(False) + dialog.set_resizable(False) - image = gtk.image_new_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) - image.set_alignment (0.5, 0) - dmsg = gtk.Label(msg) - dmsg.set_use_markup(True) - dmsg.set_alignment(0, 0.5) + image = gtk.image_new_from_stock(gtk.STOCK_DIALOG_WARNING, gtk.ICON_SIZE_DIALOG) + image.set_alignment (0.5, 0) + dmsg = gtk.Label(msg) + dmsg.set_use_markup(True) + dmsg.set_alignment(0, 0.5) - textbuff = gtk.TextBuffer() - textbuff.set_text("\n".join(map(lambda e: str(e), e.errors))) - textview = gtk.TextView(textbuff) - textview.set_editable(False) + textbuff = gtk.TextBuffer() + textbuff.set_text("\n".join(map(lambda e: str(e), e.errors))) + textview = gtk.TextView(textbuff) + textview.set_editable(False) - textview.modify_font(pango.FontDescription(Defaults['font'])) - textscroll = gtk.ScrolledWindow() - textscroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - textscroll.add(textview) - # This should be scaled with the size of the text and font - textscroll.set_size_request(600, 200) + textview.modify_font(pango.FontDescription(Defaults['font'])) + textscroll = gtk.ScrolledWindow() + textscroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + textscroll.add(textview) + # This should be scaled with the size of the text and font + textscroll.set_size_request(600, 200) - root = gtk.VBox() - root.pack_start(dmsg, padding = 6) - root.pack_start(textscroll, padding = 6) + root = gtk.VBox() + root.pack_start(dmsg, padding = 6) + root.pack_start(textscroll, padding = 6) - box = gtk.HBox() - box.pack_start (image, False, False, 6) - box.pack_start (root, False, False, 6) - dialog.vbox.pack_start (box, False, False, 12) - dialog.show_all() + box = gtk.HBox() + box.pack_start (image, False, False, 6) + box.pack_start (root, False, False, 6) + dialog.vbox.pack_start (box, False, False, 12) + dialog.show_all() - dialog.run() - dialog.destroy() + dialog.run() + dialog.destroy() dbg("ConfigFile settings are: %s" % repr(self.values)) diff --git a/terminatorlib/terminator.py b/terminatorlib/terminator.py index 403be869..5ea107f7 100755 --- a/terminatorlib/terminator.py +++ b/terminatorlib/terminator.py @@ -106,7 +106,10 @@ class Terminator: self.term_list = [] self.gnome_client = None stores = [] - stores.append (config.TerminatorConfValuestoreRC ()) + + store = config.TerminatorConfValuestoreRC () + store.set_reconfigure_callback (self.reconfigure_vtes) + stores.append (store) self._tab_reorderable = True if not hasattr(gtk.Notebook, "set_tab_reorderable") or not hasattr(gtk.Notebook, "get_tab_reorderable"):