From e268a646fc5e05f03fd2b5c766331d691d508a52 Mon Sep 17 00:00:00 2001
From: Mattias Andrée <maandree@operamail.com>
Date: Tue, 4 Mar 2014 02:40:05 +0100
Subject: fix threading issues in xmonad example
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Mattias Andrée <maandree@operamail.com>
---
 examples/xmonad | 65 ++++++++++++++++++++++++++-------------------------------
 1 file changed, 30 insertions(+), 35 deletions(-)

diff --git a/examples/xmonad b/examples/xmonad
index 0c6700f..cd6e623 100644
--- a/examples/xmonad
+++ b/examples/xmonad
@@ -7,73 +7,68 @@ import threading
 
 from util import *
 
+import Xlib.X, Xlib.protocol.event
+
 
 OUTPUT, HEIGHT, YPOS, TOP = 0, 12, 0, True
 
 text = ''
 
 start_ = start
-create = [] # FIXME this should not be required!!
 def start():
     start_()
-    bar.create_colour(0x90, 0x90, 0x90) # FIXME this should not be required!!
-    bar.create_colour(0x60, 0x60, 0x60)
-    bar.create_colour(0x30, 0x30, 0x30)
+    bar.clear()
+    get_display().flush()
+    
     def refresh():
         global text
-        text_ = None
         try:
-            text_ = input()
+            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_:
+        for c in text:
             if esc is not None:
                 esc += c
                 if esc == '^':
                     buf += '^'
                     esc = None
                 elif esc[-1] == ')':
-                    if esc.startswith('bg('):
+                    if esc.startswith('bg(') or esc.startswith('fg('):
+                        c = 4 if esc.startswith('bg(') else 3
                         esc = esc[3 : -1]
                         if esc == '':
-                            buf += '\033[49m'
+                            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)
-                            create.append((r, g, b))
                             r, g, b = str(r), str(g), str(b)
-                            buf += '\033[48;2;%sm' % ';'.join([r, g, b])
-                    elif esc.startswith('fg('):
-                        esc = esc[3 : -1]
-                        if esc == '':
-                            buf += '\033[39m'
-                        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)
-                            create.append((r, g, b))
-                            r, g, b = str(r), str(g), str(b)
-                            buf += '\033[38;2;%sm' % ';'.join([r, g, b])
+                            buf += '\033[%i8;2;%sm' % (c, ';'.join([r, g, b]))
                     esc = None
             elif c == '^':
                 esc = ''
             else:
                 buf += c
-        text = buf
-        if redraw():
-            get_display().flush()
-    async(lambda : forever(refresh))
-
-
-semaphore = threading.Semaphore()
-def redraw():
-    global create
-    if semaphore.acquire(blocking = False):
-        for r, g, b in create:
-            bar.create_colour(r, g, b)
-        create = []
         bar.clear()
-        bar.draw_coloured_text(0, 10, 0, 2, text)
+        bar.draw_coloured_text(0, 10, 0, 2, buf)
         semaphore.release()
         return True
     return False
-- 
cgit v1.2.3-70-g09d2