# -*- 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()