Defer create_renderer (and thus thread creation) until .render call
May fix problem discussed in #397 Also fix documentation for Powerline.render().
This commit is contained in:
parent
af2f8f588b
commit
88865b1145
|
@ -113,7 +113,12 @@ class Powerline(object):
|
|||
self.find_config_file = lambda cfg_path: find_config_file(config_paths, cfg_path)
|
||||
|
||||
self.cr_kwargs_lock = Lock()
|
||||
self.create_renderer_kwargs = {}
|
||||
self.create_renderer_kwargs = {
|
||||
'load_main': True,
|
||||
'load_colors': True,
|
||||
'load_colorscheme': True,
|
||||
'load_theme': True,
|
||||
}
|
||||
self.shutdown_event = shutdown_event or Event()
|
||||
self.config_loader = config_loader or ConfigLoader(shutdown_event=self.shutdown_event)
|
||||
|
||||
|
@ -123,8 +128,6 @@ class Powerline(object):
|
|||
self.prev_ext_config = None
|
||||
self.pl = None
|
||||
|
||||
self.create_renderer(load_main=True, load_colors=True, load_colorscheme=True, load_theme=True)
|
||||
|
||||
def create_renderer(self, load_main=False, load_colors=False, load_colorscheme=False, load_theme=False):
|
||||
'''(Re)create renderer object. Can be used after Powerline object was
|
||||
successfully initialized. If any of the below parameters except
|
||||
|
@ -342,18 +345,25 @@ class Powerline(object):
|
|||
'''
|
||||
return None
|
||||
|
||||
def render(self, *args, **kwargs):
|
||||
'''Lock renderer from modifications and pass all arguments further to
|
||||
``self.renderer.render()``.
|
||||
'''
|
||||
def update_renderer(self):
|
||||
'''Updates/creates a renderer if needed.'''
|
||||
create_renderer_kwargs = None
|
||||
with self.cr_kwargs_lock:
|
||||
if self.create_renderer_kwargs:
|
||||
try:
|
||||
self.create_renderer(**self.create_renderer_kwargs)
|
||||
except Exception as e:
|
||||
self.pl.exception('Failed to create renderer: {0}', str(e))
|
||||
finally:
|
||||
self.create_renderer_kwargs.clear()
|
||||
create_renderer_kwargs = self.create_renderer_kwargs.copy()
|
||||
if create_renderer_kwargs:
|
||||
try:
|
||||
self.create_renderer(**create_renderer_kwargs)
|
||||
except Exception as e:
|
||||
self.pl.exception('Failed to create renderer: {0}', str(e))
|
||||
finally:
|
||||
self.create_renderer_kwargs.clear()
|
||||
|
||||
def render(self, *args, **kwargs):
|
||||
'''Update/create renderer if needed and pass all arguments further to
|
||||
``self.renderer.render()``.
|
||||
'''
|
||||
self.update_renderer()
|
||||
return self.renderer.render(*args, **kwargs)
|
||||
|
||||
def shutdown(self):
|
||||
|
|
|
@ -46,6 +46,7 @@ class VimPowerline(Powerline):
|
|||
``True`` if theme was added successfully and ``False`` if theme with
|
||||
the same matcher already exists.
|
||||
'''
|
||||
self.update_renderer()
|
||||
key = self.get_matcher(key)
|
||||
try:
|
||||
self.renderer.add_local_theme(key, {'config': config})
|
||||
|
|
|
@ -128,8 +128,8 @@ class TestConfigReload(TestCase):
|
|||
def test_reload_main(self):
|
||||
with get_powerline(run_once=False) as p:
|
||||
with replace_item(globals(), 'config', deepcopy(config)):
|
||||
self.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default')
|
||||
self.assertEqual(p.render(), '<1 2 1> s<2 4 False>>><3 4 4>g<4 False False>>><None None None>')
|
||||
self.assertAccessEvents('config', 'colors', 'colorschemes/test/default', 'themes/test/default')
|
||||
|
||||
config['config']['common']['spaces'] = 1
|
||||
add_watcher_events(p, 'config')
|
||||
|
|
Loading…
Reference in New Issue