Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/stopwatch.py
diff options
context:
space:
mode:
authorBenjamin Schwartz <bens@alum.mit.edu>2008-02-09 00:37:26 (GMT)
committer Benjamin Schwartz <bens@alum.mit.edu>2008-02-09 00:37:26 (GMT)
commit2e5ca1597ff0d23e6dffed2402f12da8a6d72a18 (patch)
treef30acb4a4cb1784780288409a18b3b293c560adc /stopwatch.py
parent89835540ffa8b17f558418217108aa2504c74995 (diff)
Improve DBusification to fix introspection errors.
Diffstat (limited to 'stopwatch.py')
-rw-r--r--stopwatch.py27
1 files changed, 22 insertions, 5 deletions
diff --git a/stopwatch.py b/stopwatch.py
index e901bb5..98fb98a 100644
--- a/stopwatch.py
+++ b/stopwatch.py
@@ -109,7 +109,7 @@ class WatchModel():
self._handler.register(self)
def get_history(self):
- return dbus.Struct((self._init_state, self._history), signature='(id)a(di)')
+ return dbus.Struct((dbus.Struct(self._init_state, signature="id"), dbus.Array(self._history, signature='(di)')), signature='(id)a(di)')
def get_state(self):
return self._state
@@ -131,7 +131,8 @@ class WatchModel():
if self.add_event((float(ev[0]), int(ev[1]))):
changed = True
if changed:
- self._update_state()
+ if self._update_state():
+ self._trigger()
self._history_lock.release()
def add_event(self, ev):
@@ -143,16 +144,30 @@ class WatchModel():
return False
def add_event_from_net(self, ev):
+ self._history_lock.acquire()
if self.add_event(ev):
- self._update_state()
+ if self._update_state(): #only trigger if the event caused a change
+ self._trigger()
+ self._history_lock.release()
def receive_message(self, msg):
self.add_event_from_net((float(msg[0]), int(msg[1])))
def add_event_from_view(self, ev):
+ self._history_lock.acquire()
if self.add_event(ev):
self._update_state()
+ self._history_lock.release()
+ self._trigger()
self._handler.send(dbus.Struct(ev, signature='di'))
+ else:
+ self._history_lock.release()
+ #We always trigger when an event is received from the UI. Otherwise,
+ #due to desynchronized clocks, it is possible to click Start/Stop
+ # and produce an old event that is irrelevant. This results in the
+ # UI reaching an inconsistent state, with the button toggled off
+ # but the clock still running.
+ self._trigger()
def _update_state(self):
self._logger.debug("_update_state")
@@ -176,13 +191,15 @@ class WatchModel():
s = WatchModel.STATE_PAUSED
timeval = event_time - timeval
- self._set_state((s, timeval))
+ return self._set_state((s, timeval))
def _set_state(self, q):
self._logger.debug("_set_state")
if self._state != q:
self._state = q
- self._trigger()
+ return True
+ else:
+ return False
def register_view_listener(self, L):
self._logger.debug("register_view_listener ")