[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/kmplayer [POSSIBLY UNSAFE]
From:       Koos Vriezen <koos.vriezen () xs4all ! nl>
Date:       2006-03-11 20:43:42
Message-ID: 1142109822.507382.14085.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 517684 by vriezen:

Adding an event chain for nested documents, like smil having realpix 
images, so that a document can register itself by its parent Mrl node up 
to the root document. Because smil multiplexes events through its 
regions, this should pass only relevant (by means of x,y coord) to a 
nested document.
Adding a test smil, that actually doesn't work yet ..


 M  +4 -0      src/kmplayer_rp.cpp  
 M  +10 -13    src/kmplayer_smil.cpp  
 M  +47 -0     src/kmplayerplaylist.cpp  
 M  +19 -0     src/kmplayerplaylist.h   [POSSIBLY UNSAFE: gets]
 A             tests/nested_smil.smil  


--- trunk/extragear/multimedia/kmplayer/src/kmplayer_rp.cpp #517683:517684
@@ -88,6 +88,8 @@
         image = new QPixmap (width, height);
         image->fill ();
     }
+    if (parentNode ())
+        parentNode ()->registerEventHandler (this);
     if (duration > 0)
         duration_timer = document ()->setTimeout (this, duration * 100);
     else if (!timings_count)
@@ -132,6 +134,8 @@
     delete image;
     image = 0L;
     invalidateCachedImage ();
+    if (parentNode ())
+        parentNode ()->deregisterEventHandler (this);
 }
 
 KDE_NO_EXPORT void RP::Imfl::invalidateCachedImage () {
--- trunk/extragear/multimedia/kmplayer/src/kmplayer_smil.cpp #517683:517684
@@ -1334,12 +1334,13 @@
 KDE_NO_EXPORT void SMIL::Smil::activate () {
     //kdDebug () << "Smil::activate" << endl;
     current_av_media_type = NodePtr ();
+    event_handler = layout_node;
     PlayListNotify * n = document()->notify_listener;
-    if (n) {
-        n->setEventDispatcher (layout_node);
+    if (n)
         n->setCurrent (this);
-    }
     Element::activate ();
+    if (parentNode ())
+        parentNode ()->registerEventHandler (this);
 }
 
 KDE_NO_EXPORT void SMIL::Smil::deactivate () {
@@ -1350,10 +1351,10 @@
             rb->repaint ();
         }
     }
-    PlayListNotify * n = document()->notify_listener;
-    if (n)
-        n->setEventDispatcher (NodePtr ());
+    event_handler = 0;
     Mrl::deactivate ();
+    if (parentNode ())
+        parentNode ()->deregisterEventHandler (this);
 }
 
 KDE_NO_EXPORT void SMIL::Smil::closed () {
@@ -2202,13 +2203,7 @@
         default:
             ret = TimedMrl::handleEvent (event);
     }
-    for (NodePtr n = firstChild (); n; n = n->nextSibling ())
-        switch (n->id) {
-            case id_node_smil:        // support nested documents
-            case RP::id_node_imfl:
-                n->handleEvent (event);
-        }
-    return ret;
+    return Mrl::handleEvent (event);
 }
 
 KDE_NO_EXPORT NodeRefListPtr SMIL::MediaType::listeners (unsigned int id) {
@@ -2231,6 +2226,8 @@
 
 KDE_NO_EXPORT void SMIL::AVMediaType::positionVideoWidget () {
     //kdDebug () << "AVMediaType::sized " << endl;
+    if (hasChildNodes ())
+        return;
     PlayListNotify * n = document()->notify_listener;
     MediaTypeRuntime * mtr = static_cast <MediaTypeRuntime *> (timedRuntime ());
     if (n && mtr && mtr->region_node) {
--- trunk/extragear/multimedia/kmplayer/src/kmplayerplaylist.cpp #517683:517684
@@ -467,6 +467,10 @@
     return QString::null;
 }
 
+void Node::registerEventHandler (NodePtr) {}
+
+void Node::deregisterEventHandler (NodePtr) {}
+
 //-----------------------------------------------------------------------------
 
 RefNode::RefNode (NodePtr & d, NodePtr ref)
@@ -596,6 +600,37 @@
         deactivate (); // nothing to activate
 }
 
+static NodePtr findChainEventHandler (NodePtr node) {
+    Node * p = node->parentNode ().ptr ();
+    Mrl * mrl = p ? p->mrl () : 0L;
+    while (p && (!mrl || !mrl->event_handler)) {
+        p = p->parentNode ().ptr ();
+        mrl = p ? p->mrl () : 0L;
+    }
+    if (!mrl)
+        return node->document ();
+    else
+        return mrl->event_handler;
+}
+
+void Mrl::registerEventHandler (NodePtr handler) {
+    event_handler = handler;
+    findChainEventHandler (this)->registerEventHandler (this);
+}
+
+void Mrl::deregisterEventHandler (NodePtr handler) {
+    if (event_handler == handler) {
+        event_handler = 0L;
+        findChainEventHandler (this)->deregisterEventHandler (this);
+    }
+}
+
+bool Mrl::handleEvent (EventPtr event) {
+    if (event_handler)
+        return event_handler->handleEvent (event);
+    return false;
+}
+
 //-----------------------------------------------------------------------------
 
 namespace KMPlayer {
@@ -816,6 +851,18 @@
     }
 }
 
+void Document::registerEventHandler (NodePtr handler) {
+    event_handler = handler;
+    if (notify_listener)
+        notify_listener->setEventDispatcher (this);
+}
+
+void Document::deregisterEventHandler (NodePtr handler) {
+    event_handler = 0L;
+    if (notify_listener)
+        notify_listener->setEventDispatcher (0L);
+}
+
 NodeRefListPtr Document::listeners (unsigned int id) {
     if (id == event_postponed)
         return m_PostponedListeners;
--- trunk/extragear/multimedia/kmplayer/src/kmplayerplaylist.h #517683:517684
@@ -412,6 +412,12 @@
      */
     void propagateEvent (EventPtr event);
     /**
+     * Adds node to call 'handleEvent()' for all events that gets
+     * delivered to this node, ignored by default
+     */
+    virtual void registerEventHandler (NodePtr handler);
+    virtual void deregisterEventHandler (NodePtr handler);
+    /**
      * Activates element, sets state to state_activated. Will call activate() on
      * firstChild or call deactivate().
      */
@@ -568,6 +574,14 @@
      * Reimplement to callback with requestPlayURL if isMrl()
      */ 
     virtual void activate ();
+    /**
+     * By default support one event handler (eg. SMIL or RP child document)
+     */
+    virtual void registerEventHandler (NodePtr handler);
+    virtual void deregisterEventHandler (NodePtr handler);
+    virtual bool handleEvent (EventPtr event);
+
+    NodePtrW event_handler;
     QString src;
     QString pretty_name;
     QString mimetype;
@@ -711,6 +725,11 @@
      * Document has list of postponed listeners, eg. for running (gif)movies
      */
     virtual NodeRefListPtr listeners (unsigned int event_id);
+    /**
+     * Reimplement, so it will call PlayListNotify::setEventDispatcher
+     */
+    virtual void registerEventHandler (NodePtr handler);
+    virtual void deregisterEventHandler (NodePtr handler);
 
     NodePtrW rootLayout;
     List <TimerInfo> timers; //FIXME: make as connections
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic