# -*- coding: utf-8 -*- """ Displays and controls the mute status of the default microphone. Displays whether the current microphone is muted or not. A click on the icon will toggle this status. Relies on pulseaudio. Configuration parameters: format_muted: text displayed when muted (default FontAwesome) format_unmuted: text displayed when unmuted (default FontAwesome) Colors: color_mute: when muted color_unmute: when unmuted """ import subprocess class NoMicrophone(Exception): pass class Error(Exception): pass class Py3status: format_muted = '\uf131' # FontAwesome format_unmuted = '\uf130' # FontAwesome def microphone(self): try: isMute = self.__getMuteStatus__() color = self.py3.COLOR_MUTE if isMute else self.py3.COLOR_UNMUTE text = self.format_muted if isMute else self.format_unmuted return { 'full_text': text, 'color': color, } except NoMicrophone: return { 'full_text': '', } except Error: return { 'full_text': '...', } def __getPaList__(self): try: paOutput = subprocess.check_output(["pacmd", "list-sources"]) except subprocess.CalledProcessError: raise Error() return paOutput.decode() def __getMuteStatus__(self): try: paList = self.__getPaList__() fromCurrent = paList[paList.index('* index:'):] MUTED_STR = 'muted: ' fromMutestat = fromCurrent[fromCurrent.index(MUTED_STR) + len(MUTED_STR):] return fromMutestat[:3] == 'yes' except ValueError: raise NoMicrophone() def __toggleMuteStatus__(self): try: isMuted = self.__getMuteStatus__() paList = self.__getPaList__() fromCurrent = paList[paList.index('* index: ')+len('* index: '):] sourceId = int(fromCurrent[:fromCurrent.index('\n')]) subprocess.call(['pacmd', 'set-source-mute', str(sourceId), str(int(not isMuted))]) except ValueError: raise NoMicrophone() def on_click(self, event): self.__toggleMuteStatus__()