From 90331dd4caff60e9517c862101a37d1ae4ee00d1 Mon Sep 17 00:00:00 2001
From: pin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Date: Mon, 17 May 2010 14:09:33 +0000
Subject: [PATCH] =?utf8?q?Clignotement=20du=20curseur=20bas=C3=A9=20sur=20?=
 =?utf8?q?un=20thread=20ind=C3=A9pendant=20de=20pygame.=20Bugfix.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@166 fe552daf-6dbe-4428-90eb-1537e0879342
---
 src/app/events.py                |  5 ++---
 src/app/log.py                   |  3 +--
 src/app/logfilereader.py         |  2 ++
 src/app/widgets/cursors.py       | 35 ++++++++++++++++++++++++++------
 src/app/widgets/playingscreen.py |  2 +-
 5 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/src/app/events.py b/src/app/events.py
index 6b90d92..a67a416 100755
--- a/src/app/events.py
+++ b/src/app/events.py
@@ -1,8 +1,7 @@
 import pygame
 from sys import modules
 
-events = ['TIMEOUT',
-          'NOTEON',
+events = ['NOTEON',
           'NOTEOFF',
           'NOTEEND',
           'COLDOWN',
@@ -14,7 +13,7 @@ eventNames = {}
 self = modules[__name__]
 
 for i, name in enumerate(events) :
-    eventType = pygame.USEREVENT+i
+    eventType = pygame.USEREVENT + 1 + i
     eventNames[eventType] = name
     setattr(self, name, eventType)
 
diff --git a/src/app/log.py b/src/app/log.py
index 3cffbb3..abbb858 100755
--- a/src/app/log.py
+++ b/src/app/log.py
@@ -6,7 +6,7 @@ $Id$
 $URL$
 """
 
-from events import TIMEOUT, COLOVER, eventNames
+from events import COLOVER, eventNames
 from event_pprinters import pprinters
 import sys
 import pygame
@@ -18,7 +18,6 @@ LOG_FORMAT_VERSION='1.0'
 hiddenEvents = {pygame.MOUSEMOTION:True,
                 pygame.MOUSEBUTTONDOWN:True,
                 pygame.MOUSEBUTTONUP:True,
-                TIMEOUT:True,
                 #COLOVER:True,
                 }
 
diff --git a/src/app/logfilereader.py b/src/app/logfilereader.py
index f5f5d54..64711c1 100755
--- a/src/app/logfilereader.py
+++ b/src/app/logfilereader.py
@@ -209,4 +209,6 @@ class LogFilePlayer(PlayingScreenBase) :
             
             previousTicks = ticks
         
+        self.stop()
+        
     
\ No newline at end of file
diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py
index 1e3fc4e..c8df104 100755
--- a/src/app/widgets/cursors.py
+++ b/src/app/widgets/cursors.py
@@ -8,8 +8,9 @@ $URL$
 
 import pygame
 import os
+from threading import Thread
+import time
 from eventutils import EventHandlerMixin, event_handler
-from events import TIMEOUT
 from itertools import cycle
 
 class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
@@ -60,22 +61,27 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
         self.blinkMode = blinkMode
         self._startBlink()
     
+    def __del__(self) :
+        if hasattr(self, 'timer') :
+            try : self.timer.stop()
+            except : pass
+    
     def _startBlink(self) :
         if self.blinkMode :
             self._blinking = True
-            pygame.time.set_timer(TIMEOUT, self.duration)
             self.iterator = self.iterImages()
+            self.timer = ForeverTimer(self.duration, self.loadNext)
+            self.timer.start()
     
     def _stopBlink(self) :
         if self.blinkMode :
-            pygame.time.set_timer(TIMEOUT, 0)
+            self.timer.stop()
             
     def iterImages(self) :
         for img in cycle(self.images) :
             yield img
     
-    @event_handler(TIMEOUT)
-    def loadNext(self, event) :
+    def loadNext(self) :
         if self._blinking :
             self.dirty = 1
             self.image = self.iterator.next()
@@ -91,7 +97,6 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
         self.dirty = 1
         if self.blinkMode :
             self._blinking = True
-            self.loadNext(event)
         else :
             self.image = self.images[0]
     
@@ -105,3 +110,21 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin):
         x, y = pos
         rx, ry = self.rect.centerx, self.rect.centery
         self.rect.move_ip(x-rx, y-ry)
+
+
+class ForeverTimer(Thread) :
+    def __init__(self, duration, func, *args, **kw) :
+        Thread.__init__(self)
+        self.duration = duration / 1000.
+        self.func = func
+        self.args = args
+        self.kw = kw
+        self.running = True
+
+    def run(self) :
+        while self.running :
+            self.func(*self.args, **self.kw)
+            time.sleep(self.duration)
+    
+    def stop(self) :
+        self.running = False
\ No newline at end of file
diff --git a/src/app/widgets/playingscreen.py b/src/app/widgets/playingscreen.py
index 67039e7..75f68fd 100755
--- a/src/app/widgets/playingscreen.py
+++ b/src/app/widgets/playingscreen.py
@@ -88,7 +88,7 @@ class PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
             EventDispatcher.dispatchEvents()
             dirty = self.draw(pygame.display.get_surface())
             pygame.display.update(dirty)
-            clock.tick()
+            clock.tick(FRAMERATE)
     
     def stop(self) :
         self._running = False
-- 
2.20.1