aboutsummaryrefslogblamecommitdiffstats
path: root/examples/xmonad
blob: cd6e623de9edc395b7f2f913cfe31a8423e77daa (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                   

                                  





                                          

            


                         

                   
            
                          

                       

















                                                                                    
                           
                      





                                    

                                                                      

                                         
                                                  


                                                                        
                                                            
                                                                              




                              
                   
                                                



                           
# -*- python -*-

# A simple xpybar configuration for replacing dzen2

import sys
import threading

from util import *

import Xlib.X, Xlib.protocol.event


OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 0, True

text = ''

start_ = start
def start():
    start_()
    bar.clear()
    get_display().flush()
    
    def refresh():
        global text
        try:
            text = input()
        except:
            sys.exit(0)
        # Dummy event for performing update in the main thread # TODO do this better
        e = Xlib.protocol.event.KeyPress(detail = 1,
                                         time = Xlib.X.CurrentTime,
                                         root = get_display().screen().root,
                                         window = bar.window,
                                         child = Xlib.X.NONE,
                                         root_x = 1, root_y = 1,
                                         event_x = 1, event_y = 1,
                                         state = 0, same_screen = 1)
        get_display().send_event(bar.window, e)
        get_display().flush()
    async(lambda : forever(refresh))


semaphore = threading.Semaphore()
def redraw():
    global text
    if semaphore.acquire(blocking = False):
        buf, esc = '', None
        for c in text:
            if esc is not None:
                esc += c
                if esc == '^':
                    buf += '^'
                    esc = None
                elif esc[-1] == ')':
                    if esc.startswith('bg(') or esc.startswith('fg('):
                        c = 4 if esc.startswith('bg(') else 3
                        esc = esc[3 : -1]
                        if esc == '':
                            buf += '\033[%i9m' % c
                        else:
                            r, g, b = esc[1 : 3], esc[3 : 5], esc[5 : 7]
                            r, g, b = int(r, 16), int(g, 16), int(b, 16)
                            r, g, b = str(r), str(g), str(b)
                            buf += '\033[%i8;2;%sm' % (c, ';'.join([r, g, b]))
                    esc = None
            elif c == '^':
                esc = ''
            else:
                buf += c
        bar.clear()
        bar.draw_coloured_text(0, 10, 0, 2, buf)
        semaphore.release()
        return True
    return False