[vlc-commits] commit: python-vlc: tweak EventManager (Jean Brouwers )

git at videolan.org git at videolan.org
Tue Dec 7 21:41:53 CET 2010


vlc/python | branch: master | Jean Brouwers <MrJean1 at EarthLink.net> | Tue Dec  7 18:23:49 2010 +0100| [d0e891ee4cd6c3dcfde341482af1746782c68e3b] | committer: Olivier Aubert 

python-vlc: tweak EventManager

Signed-off-by: Olivier Aubert <olivier.aubert at liris.cnrs.fr>

> http://git.videolan.org/gitweb.cgi/vlc/python.git/?a=commit;h=d0e891ee4cd6c3dcfde341482af1746782c68e3b
---

 override.py |   64 +++++++++++++++++++++++++++++++---------------------------
 1 files changed, 34 insertions(+), 30 deletions(-)

diff --git a/override.py b/override.py
index f78fffa..5e6aa49 100644
--- a/override.py
+++ b/override.py
@@ -284,67 +284,71 @@ class EventManager:
     @note: Only a single notification can be registered
     for each event type in an EventManager instance.
     """
+    _callback_handler_ = None
+    _callbacks_ = {}
+
     def __new__(cls, ptr=None):
         if ptr is None:
-            raise LibVLCException("(INTERNAL) ctypes class.")
+            raise VLCException("(INTERNAL) ctypes class.")
         if ptr == 0:
             return None
-        o = object.__new__(cls)
-        o._as_parameter_ = ptr  # was ctypes.c_void_p(ptr)
-        o._callbacks_ = {}  # 3-tuples of Python objs
-        o._callback_handler = None
-        return o
+        return _Cobject(cls, ptr)  # ctypes.c_void_p(ptr)
 
     def event_attach(self, eventtype, callback, *args, **kwds):
         """Register an event notification.
 
-        @param eventtype: the desired event type to be notified about
-        @param callback: the function to call when the event occurs
-        @param args: optional positional arguments for the callback
-        @param kwds: optional keyword arguments for the callback
-        @return: 0 on success, ENOMEM on error
+        @param eventtype: the desired event type to be notified about.
+        @param callback: the function to call when the event occurs.
+        @param args: optional positional arguments for the callback.
+        @param kwds: optional keyword arguments for the callback.
+        @return: 0 on success, ENOMEM on error.
 
-        NOTE: The callback must have at least one argument, the Event
-        instance.  The optional positional and keyword arguments are
-        in addition to the first one.
+        @note: The callback function must have at least one argument,
+        an Event instance.  Any other, optional positional and keyword
+        arguments are in B{addition} to the first one.
         """
         if not isinstance(eventtype, EventType):
-            raise LibVLCException("%s required: %r" % ('EventType', eventtype))
+            raise VLCException("%s required: %r" % ('EventType', eventtype))
         if not hasattr(callback, '__call__'):  # callable()
-            raise LibVLCException("%s required: %r" % ('callable', callback))
+            raise VLCException("%s required: %r" % ('callable', callback))
+         # check that the callback expects arguments
+        if getargspec and not any(getargspec(callback)[:2]):  # list(...)
+            raise VLCException("%s required: %r" % ('argument', callback))
 
         if self._callback_handler is None:
             _called_from_ctypes = ctypes.CFUNCTYPE(None, ctypes.POINTER(Event), ctypes.c_void_p)
             @_called_from_ctypes
-            def _callback_handler(event, unused):
+            def _callback_handler(event, k):
                 """(INTERNAL) handle callback call from ctypes.
 
-                Note: we cannot simply make this an instance method of
-                EventManager since ctypes callback does not append
-                self as first parameter. Hence we use a closure.
+                @note: We cannot simply make this an EventManager
+                method since ctypes does not prepend self as the
+                first parameter, hence this closure.
                 """
                 try: # retrieve Python callback and arguments
-                    call, args, kwds = self._callbacks_[event.contents.type.value]
-                    # We dereference event.contents here to simplify callback code.
+                    call, args, kwds = self._callbacks_[k]
+                     # deref event.contents to simplify callback code
                     call(event.contents, *args, **kwds)
                 except KeyError:  # detached?
                     pass
             self._callback_handler = _callback_handler
+            self._callbacks = {}
 
-        r = libvlc_event_attach(self, eventtype, self._callback_handler, None)
+        k = eventtype.value
+        r = libvlc_event_attach(self, eventtype, self._callback_handler, k)
         if not r:
-            self._callbacks_[eventtype.value] = (callback, args, kwds)
+            self._callbacks[k] = (callback, args, kwds)
         return r
 
     def event_detach(self, eventtype):
         """Unregister an event notification.
 
-        @param eventtype: the event type notification to be removed
+        @param eventtype: the event type notification to be removed.
         """
         if not isinstance(eventtype, EventType):
-            raise LibVLCException("%s required: %r" % ('EventType', eventtype))
+            raise VLCException("%s required: %r" % ('EventType', eventtype))
 
-        t = eventtype.value
-        if t in self._callbacks_:
-            del self._callbacks_[t] # remove, regardless of libvlc return value
-            libvlc_event_detach(self, eventtype, self._callback_handler, None)
+        k = eventtype.value
+        if k in self._callbacks_:
+            del self._callbacks_[k] # remove, regardless of libvlc return value
+            libvlc_event_detach(self, eventtype, self._callback_handler_, k)



More information about the vlc-commits mailing list