aboutsummaryrefslogblamecommitdiffstats
path: root/xpybar/config/mycomputer.py
blob: bbfd539c86990dfeaf255ec2f787abe79249c88e (plain) (tree)































































































































































                                                                                                                  
# -*- python -*-
from plugins.pacman   import Pacman
from plugins.uname    import Uname
from plugins.users    import Users
from plugins.xdisplay import XDisplay
from plugins.xkb      import XKB

from common import *

class MyComputer(Entry):
    def __init__(self, *args, locks = None, **kwargs):
        self.have_linux_libre, self.have_pacman = True, None
        self.linux_installed, self.linux_latest = None, None
        self.last_uname_read = ''
        self.last_users_read = ''
        self.xdisplay = None
        self.you = pwd.getpwuid(os.getuid()).pw_name
        self.display = 0
        self.show_detailed = False
        self.keys = []
        if locks is None:
            locks = ['num', 'cap']
        self.num_lock = 'num' in locks or 'number' in locks or 'numerical' in locks or 'numpad' in locks
        self.cap_lock = 'cap' in locks or 'caps' in locks
        self.scr_lock = 'scr' in locks or 'scroll' in locks or 'scrl' in locks
        if self.num_lock:
            self.keys.append(Xlib.XK.XK_Num_Lock)
        if self.cap_lock:
            self.keys.append(Xlib.XK.XK_Caps_Lock)
        if self.scr_lock:
            self.keys.append(Xlib.XK.XK_Scroll_Lock)
        Entry.__init__(self, *args, **kwargs)
    
    def action(self, col, button, x, y):
        if button == LEFT_BUTTON:
            if self.display == 3:
                col -= 5
                if col % 4 == 3:
                    return
                col //= 4
                key = self.keys[col]
                G.display.xtest_fake_input(Xlib.X.KeyPress, G.display.keysym_to_keycode(key))
                G.display.xtest_fake_input(Xlib.X.KeyRelease, G.display.keysym_to_keycode(key))
                G.display.flush()
        elif button == MIDDLE_BUTTON:
            self.show_detailed = not self.show_detailed
            self.invalidate()
        elif button == RIGHT_BUTTON:
            if self.display == 0:
                xasync(lambda : subprocess.Popen(['mate-system-monitor']).wait())
            else:
                self.invalidate()
        elif button == SCROLL_UP:
            self.display = min(self.display + 1, 2) ## TODO the keyboard support is not too good
            self.invalidate()
        elif button == SCROLL_DOWN:
            self.display = max(self.display - 1, 0)
            self.invalidate()
    
    def function_uname(self):
        uname = Uname()
        nodename = uname.nodename
        kernel_release = uname.kernel_release
        operating_system = uname.operating_system
        
        lts = '-lts' if kernel_release.lower().endswith('-lts') else ''
        if self.have_pacman is None:
            self.have_pacman = True
            try:
                self.linux_installed = Pacman('linux-libre' + lts, True)
            except:
                self.have_linux_libre = False
                try:
                    self.linux_installed = Pacman('linux' + lts, True)
                except:
                    self.have_pacman = False
            if self.have_pacman:
                try:
                    self.linux_latest = Pacman(('linux-libre' if self.have_linux_libre else 'linux') + lts, False)
                except:
                    self.have_pacman = None
        elif self.have_pacman:
            try:
                self.linux_installed = Pacman(('linux-libre' if self.have_linux_libre else 'linux') + lts, True)
                self.linux_latest = Pacman(('linux-libre' if self.have_linux_libre else 'linux') + lts, False)
            except:
                self.have_pacman = None
        
        if (self.have_pacman is not None) and self.have_pacman:
            linux_running = kernel_release.split('-')
            linux_running, kernel_release = linux_running[:2], linux_running[2:]
            linux_running = '-'.join(linux_running)
            kernel_release = '-' + '-'.join(kernel_release)
            self.linux_installed = self.linux_installed.version
            self.linux_latest = self.linux_latest.version
            if self.linux_installed == self.linux_latest:
                if linux_running == self.linux_installed:
                    linux_running = '\033[32m%s\033[39m' % linux_running
            else:
                if linux_running == self.linux_installed:
                    linux_running = '\033[33m%s\033[39m' % linux_running
                else:
                    linux_running = '\033[31m%s\033[39m' % linux_running
            kernel_release = linux_running + kernel_release
        
        rc = '%s %s %s'
        rc %= (nodename, kernel_release, operating_system)
        self.last_uname_read = rc
        return rc
    
    def function_users(self): ## TODO use inotify
        users = Users('devfs').users
        def colour_user(user):
            if user == 'root':          return '\033[31m%s\033[39m'
            elif not user == self.you:  return '\033[33m%s\033[39m'
            else:                       return '%s'
        users = ['%s{%i}' % (colour_user(u) % u, len(users[u])) for u in users.keys()]
        users = 'Usr: %s' % (' '.join(users))
        self.last_users_read = users
        return users
    
    def function_xdisplay(self):
        if self.xdisplay is None:
            x = XDisplay()
            if x.connection is None:
                self.xdisplay = 'No DISPLAY environment variable set'
                self.xdisplay_detailed = self.xdisplay
            else:
                self.xdisplay = 'X: %s' % x.connection
                self.xdisplay_detailed  = 'Host: %s' % ('(localhost)' if x.host is None else x.host)
                self.xdisplay_detailed += SEPARATOR
                self.xdisplay_detailed += 'Display: %s' % (x.display)
                if x.screen is not None:
                    self.xdisplay_detailed += SEPARATOR
                    self.xdisplay_detailed += 'Screen: %s' % (x.screen)
                if x.vt is not None:
                    self.xdisplay += '%sVt: %i' % (SEPARATOR, x.vt)
                    self.xdisplay_detailed += '%sVt: %i' % (SEPARATOR, x.vt)
        return self.xdisplay_detailed if self.show_detailed else self.xdisplay
    
    def function_xkb(self): ## TODO add update listener
        xkb = XKB().get_locks()
        kbd = 'Kbd:'
        if self.num_lock:
            kbd += ' \033[3%imnum\033[0m' % (1 if (xkb & XKB.NUM)    == 0 else 2)
        if self.cap_lock:
            kbd += ' \033[3%imcap\033[0m' % (1 if (xkb & XKB.CAPS)   == 0 else 2)
        if self.scr_lock:
            kbd += ' \033[3%imscr\033[0m' % (1 if (xkb & XKB.SCROLL) == 0 else 2)
        return kbd
    
    def function(self):
        if self.display == 0:
            return self.function_uname()
        elif self.display == 1:
            return self.function_users()
        elif self.display == 2:
            return self.function_xdisplay()
        elif self.display == 3:
            return self.function_xkb()