# pylint: disable=C0111,R0903 """Displays focused i3 window title. Requirements: * i3ipc Parameters: * title.max : Maximum character length for title before truncating. Defaults to 64. * title.placeholder : Placeholder text to be placed if title was truncated. Defaults to '...'. * title.scroll : Boolean flag for scrolling title. Defaults to False """ import threading try: import i3ipc except ImportError: pass no_title = 'n/a' import core.module import core.widget import core.decorators import util.format class Module(core.module.Module): def __init__(self, config): super().__init__(config, []) # parsing of parameters self.__scroll = util.format.asbool(self.parameter('scroll', False)) self.__max = int(self.parameter('max', 64)) self.__placeholder = self.parameter('placeholder', '...') self.__title = '' # set output of the module self.widgets([core.widget.Widget(full_text= self.__scrolling_focused_title if self.__scroll else self.__focused_title)]) # create a connection with i3ipc self.__i3 = i3ipc.Connection() # event is called both on focus change and title change self.__i3.on('window', lambda __p_i3, __p_e: self.__pollTitle()) # begin listening for events threading.Thread(target=self.__i3.main).start() # initialize the first title self.__pollTitle() def __focused_title(self, widget): return self.__title @core.decorators.scrollable def __scrolling_focused_title(self, widget): return self.__full_title def __pollTitle(self): """Updating current title.""" try: self.__full_title = self.__i3.get_tree().find_focused().name except: self.__full_title = no_title if self.__full_title is None: self.__full_title = no_title if not self.__scroll: # cut the text if it is too long if len(self.__full_title) > self.__max: self.__title = self.__full_title[0:self.__max - len(self.__placeholder)] self.__title = '{}{}'.format(self.__title, self.__placeholder) else: self.__title = self.__full_title # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4