Author: toshok
Date: 2007-12-10 15:32:13 -0500 (Mon, 10 Dec 2007)
New Revision: 91060

Modified:
   trunk/moon/plugin/ChangeLog
   trunk/moon/plugin/plugin-class.cpp
   trunk/moon/plugin/plugin-class.h
   trunk/moon/src/ChangeLog
   trunk/moon/src/dependencyobject.cpp
   trunk/moon/src/dependencyobject.h
Log:
in src/:
2007-12-10  Chris Toshok  <[EMAIL PROTECTED]>

        * dependencyobject.h, dependencyobject.cpp: more event changes.
        events keep a integer "token" per event, that starts at 0, that is
        returned from the plugin's addEventListener method, and can be can
        be passed to the plugin's removeEventListener method.

in plugin/:
2007-12-10  Chris Toshok  <[EMAIL PROTECTED]>

        * plugin-class.h, plugin-class.cpp: more event changes.  return
        the integer token for adding a handler, and change
        removeEventListener to accept either a string (unsupported at the
        moment) or integer second argument.  This allows things like
        removeEventListener (..., 0) for removing the event handler that's
        registered in xaml.

        Also, remove MoonlightEventListener{Type,Object} since we don't
        need to return a wrapped object from addEventListener any longer.



Modified: trunk/moon/plugin/ChangeLog
===================================================================
--- trunk/moon/plugin/ChangeLog 2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/plugin/ChangeLog 2007-12-10 20:32:13 UTC (rev 91060)
@@ -1,3 +1,15 @@
+2007-12-10  Chris Toshok  <[EMAIL PROTECTED]>
+
+       * plugin-class.h, plugin-class.cpp: more event changes.  return
+       the integer token for adding a handler, and change
+       removeEventListener to accept either a string (unsupported at the
+       moment) or integer second argument.  This allows things like
+       removeEventListener (..., 0) for removing the event handler that's
+       registered in xaml.
+
+       Also, remove MoonlightEventListener{Type,Object} since we don't
+       need to return a wrapped object from addEventListener any longer.
+
 2007-12-07  Rolf Bjarne Kvinge <[EMAIL PROTECTED]> 
 
        * plugin-class.cpp: Plug more leaks.

Modified: trunk/moon/plugin/plugin-class.cpp
===================================================================
--- trunk/moon/plugin/plugin-class.cpp  2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/plugin/plugin-class.cpp  2007-12-10 20:32:13 UTC (rev 91060)
@@ -401,18 +401,20 @@
        g_free (event_name);
 }
 
-void
+int
 EventListenerProxy::AddHandler (EventObject *obj)
 {
        target_object = obj;
-       event_id = obj->AddHandler (event_name, proxy_listener_to_javascript, 
this);
+       event_id = obj->GetType()->LookupEvent (event_name);
+       token = obj->AddHandler (event_id, proxy_listener_to_javascript, this);
+       return token;
 }
 
 void
 EventListenerProxy::RemoveHandler ()
 {
        if (target_object && event_id != -1)
-               target_object->RemoveHandler (event_id, 
proxy_listener_to_javascript, this);
+               target_object->RemoveHandler (event_id, token);
 }
 
 EventArgsWrapper
@@ -521,20 +523,6 @@
        proxy->AddHandler (obj);
 }
 
-static NPObject *
-event_listener_allocate (NPP instance, NPClass *klass)
-{
-       return new MoonlightEventListenerObject (instance);
-}
-
-MoonlightEventListenerType::MoonlightEventListenerType ()
-{
-       allocate = event_listener_allocate;
-}
-
-MoonlightEventListenerType *MoonlightEventListenerClass;
-
-
 /*** ErrorEventArgs ***/
 static NPObject *
 erroreventargs_allocate (NPP instance, NPClass *klass)
@@ -2023,9 +2011,16 @@
        const char *event_name = map_moon_id_to_event_name (id);
        int event_id = dob->GetType()->LookupEvent (event_name);
        if (event_id != -1) {
+#if false
                EventListenerProxy *proxy = LookupEventProxy (event_id);
                string_to_npvariant (proxy == NULL ? "" : 
proxy->GetCallbackAsString (), result);
                return true;
+#else
+               // on silverlight, these seem to always return ""
+               // regardless of how we attempt to set them.
+               string_to_npvariant ("", result);
+               return true;
+#endif
        }
 
        return false;
@@ -2044,6 +2039,8 @@
        if (p)
                return _set_dependency_property_value (dob, p, value);
 
+       // turns out that on Silverlight you can't set regular events as 
properties.
+#if false
        // it wasn't a dependency property.  let's see if it's an
        // event
        const char *event_name = map_moon_id_to_event_name (id);
@@ -2064,7 +2061,7 @@
                        return true;
                }
        }
-
+#endif
        return false;
 }
 
@@ -2177,26 +2174,27 @@
                                                                    name,
                                                                    &args[1]);
 
-               proxy->AddHandler (dob);
+               int token = proxy->AddHandler (dob);
 
                g_free (name);
 
-               MoonlightEventListenerObject *res = 
(MoonlightEventListenerObject *) NPN_CreateObject (instance,
-                                                                               
                       MoonlightEventListenerClass);
-               res->proxy = proxy;
-               res->target = dob;
-
-               OBJECT_TO_NPVARIANT (res, *result);
+               INT32_TO_NPVARIANT (token, *result);
                return true;
        }
 
        case MoonId_RemoveEventListener: {
-               if (argCount < 2 || !NPVARIANT_IS_OBJECT (args [1]))
+               if (argCount < 2)
                        THROW_JS_EXCEPTION ("removeEventListener");
+               if (!NPVARIANT_IS_STRING (args[0])
+                   || (!NPVARIANT_IS_INT32 (args [1])
+                       && !NPVARIANT_IS_STRING (args [1])))
+                       THROW_JS_EXCEPTION ("removeEventListener");
+               
+               if (NPVARIANT_IS_INT32 (args [1]))
+                       dob->RemoveHandler (STR_FROM_VARIANT (args[0]), 
NPVARIANT_TO_INT32 (args[1]));
+               else
+                       g_warning ("removeEventListener for named callbacks is 
not yet implemented");
 
-               MoonlightEventListenerObject *res = 
(MoonlightEventListenerObject *) NPVARIANT_TO_OBJECT (args [1]);
-               res->proxy->RemoveHandler ();
-
                return true;
        }
 
@@ -3736,7 +3734,6 @@
        MoonlightDownloaderClass = new MoonlightDownloaderType ();
        MoonlightDurationClass = new MoonlightDurationType ();
        MoonlightErrorEventArgsClass = new MoonlightErrorEventArgsType ();
-       MoonlightEventListenerClass = new MoonlightEventListenerType ();
        MoonlightEventObjectClass = new MoonlightEventObjectType ();
        MoonlightImageBrushClass = new MoonlightImageBrushType ();
        MoonlightImageClass = new MoonlightImageType ();
@@ -3783,6 +3780,5 @@
        delete MoonlightPointClass; MoonlightPointClass = NULL;
        delete MoonlightDurationClass; MoonlightDurationClass = NULL;
        delete MoonlightTimeSpanClass; MoonlightTimeSpanClass = NULL;
-       delete MoonlightEventListenerClass; MoonlightEventListenerClass = NULL;
        delete MoonlightMarkerReachedEventArgsClass; 
MoonlightMarkerReachedEventArgsClass = NULL;
 }

Modified: trunk/moon/plugin/plugin-class.h
===================================================================
--- trunk/moon/plugin/plugin-class.h    2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/plugin/plugin-class.h    2007-12-10 20:32:13 UTC (rev 91060)
@@ -34,7 +34,7 @@
        EventListenerProxy (NPP instance, const char *event_name, const char 
*cb_name);
        EventListenerProxy (NPP instance, const char *event_name, const 
NPVariant *cb);
        ~EventListenerProxy ();
-       void AddHandler (EventObject *obj);
+       int AddHandler (EventObject *obj);
        void RemoveHandler ();
        char* GetCallbackAsString ();
 
@@ -51,6 +51,7 @@
 
        char *event_name;
 
+       int token;
        int event_id;
        EventObject *target_object;
 
@@ -119,20 +120,6 @@
        GHashTable *event_listener_proxies;
 };
 
-/*** MoonlightEventListenerObject 
******************************************************/
-struct MoonlightEventListenerType : MoonlightObjectType {
-       MoonlightEventListenerType ();
-};
-
-extern MoonlightEventListenerType* MoonlightEventListenerClass;
-
-struct MoonlightEventListenerObject : MoonlightObject {
-       MoonlightEventListenerObject (NPP instance) : MoonlightObject 
(instance), proxy (NULL), target (NULL) { }
-
-       EventListenerProxy *proxy;
-       EventObject *target;
-};
-
 /*** MoonlightErrorEventArgsClass 
******************************************************/
 struct MoonlightErrorEventArgsType : MoonlightObjectType {
        MoonlightErrorEventArgsType ();

Modified: trunk/moon/src/ChangeLog
===================================================================
--- trunk/moon/src/ChangeLog    2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/src/ChangeLog    2007-12-10 20:32:13 UTC (rev 91060)
@@ -1,3 +1,10 @@
+2007-12-10  Chris Toshok  <[EMAIL PROTECTED]>
+
+       * dependencyobject.h, dependencyobject.cpp: more event changes.
+       events keep a integer "token" per event, that starts at 0, that is
+       returned from the plugin's addEventListener method, and can be can
+       be passed to the plugin's removeEventListener method.
+
 2007-12-10  Sebastien Pouliot  <[EMAIL PROTECTED]>
 
        * shape.cpp: Fix Shape::GetSizeForBrush to adjust to the Stretch

Modified: trunk/moon/src/dependencyobject.cpp
===================================================================
--- trunk/moon/src/dependencyobject.cpp 2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/src/dependencyobject.cpp 2007-12-10 20:32:13 UTC (rev 91060)
@@ -57,10 +57,11 @@
 
 // event handlers for c++
 struct EventClosure {
-       EventClosure (EventHandler func, gpointer data) { this->func = func; 
this->data = data; }
+       EventClosure (EventHandler func, gpointer data, int token) { this->func 
= func; this->data = data; this->token = token; }
 
        EventHandler func;
        gpointer data;
+       int token;
 };
 
 int EventObject::DestroyedEvent = -1;
@@ -76,7 +77,7 @@
 {
        if (events) {
                for (int i = 0; i < GetType()->GetEventCount(); i ++)
-                       g_slist_foreach (events[i], (GFunc)deleter, NULL);
+                       g_slist_foreach (events[i].event_list, (GFunc)deleter, 
NULL);
                g_free (events);
        }
 }
@@ -91,24 +92,27 @@
                return -1;
        }
 
-       AddHandler (id, handler, data);
-
-       return id;
+       return AddHandler (id, handler, data);
 }
 
-void
+int
 EventObject::AddHandler (int event_id, EventHandler handler, gpointer data)
 { 
        if (GetType()->GetEventCount() <= 0) {
                g_warning ("adding handler to event with id %d, which has not 
been registered\n", event_id);
-               return;
+               return -1;
        }
 
        if (events == NULL) {
-               events = (GSList**)g_new0 (GSList*, GetType()->GetEventCount());
+               events = (EventList*)g_new0 (EventList, 
GetType()->GetEventCount());
        }
 
-       events[event_id] = g_slist_append (events[event_id], new EventClosure 
(handler, data));
+       int token = events[event_id].current_token ++;
+
+       events[event_id].event_list = g_slist_append 
(events[event_id].event_list,
+                                                     new EventClosure 
(handler, data, token));
+       
+       return token;
 }
 
 void
@@ -125,6 +129,19 @@
 }
 
 void
+EventObject::RemoveHandler (const char *event_name, int token)
+{
+       int id = GetType()->LookupEvent (event_name);
+
+       if (id == -1) {
+               g_warning ("removing handler for event '%s', which has not been 
registered\n", event_name);
+               return;
+       }
+
+       RemoveHandler (id, token);
+}
+
+void
 EventObject::RemoveHandler (int event_id, EventHandler handler, gpointer data)
 {
        if (GetType()->GetEventCount() <= 0) {
@@ -135,17 +152,38 @@
        if (events == NULL)
                return;
        
-       for (GSList *l = events[event_id]; l; l = l->next) {
+       for (GSList *l = events[event_id].event_list; l; l = l->next) {
                EventClosure *closure = (EventClosure*)l->data;
                if (closure->func == handler && closure->data == data) {
                        delete (EventClosure *) l->data;
-                       events[event_id] = g_slist_delete_link 
(events[event_id], l);
+                       events[event_id].event_list = g_slist_delete_link 
(events[event_id].event_list, l);
                        break;
                }
        }
 }
 
 void
+EventObject::RemoveHandler (int event_id, int token)
+{
+       if (GetType()->GetEventCount() <= 0) {
+               g_warning ("removing handler for event with id %d, which has 
not been registered\n", event_id);
+               return;
+       }
+
+       if (events == NULL)
+               return;
+
+       for (GSList *l = events[event_id].event_list; l; l = l->next) {
+               EventClosure *closure = (EventClosure*)l->data;
+               if (closure->token == token) {
+                       delete (EventClosure *) l->data;
+                       events[event_id].event_list = g_slist_delete_link 
(events[event_id].event_list, l);
+                       break;
+               }
+       }
+}
+
+void
 EventObject::Emit (char *event_name, gpointer calldata)
 {
        int id = GetType()->LookupEvent (event_name);
@@ -166,7 +204,7 @@
                return;
        }
 
-       if (events == NULL || events[event_id] == NULL)
+       if (events == NULL || events[event_id].event_list == NULL)
                return;
        
        /* XXX yuck. this is 5 passes over the same length list.
@@ -178,10 +216,10 @@
           1 to free the list
        */
 
-       GSList *copy = g_slist_copy (events[event_id]);
+       GSList *copy = g_slist_copy (events[event_id].event_list);
        for (GSList *l = copy; l; l = l->next) {
                EventClosure *orig = (EventClosure*)l->data;
-               l->data = new EventClosure (orig->func, orig->data);
+               l->data = new EventClosure (orig->func, orig->data, 
orig->token);
        }
 
        for (GSList *l = copy; l; l = l->next) {

Modified: trunk/moon/src/dependencyobject.h
===================================================================
--- trunk/moon/src/dependencyobject.h   2007-12-10 20:02:16 UTC (rev 91059)
+++ trunk/moon/src/dependencyobject.h   2007-12-10 20:32:13 UTC (rev 91060)
@@ -28,6 +28,11 @@
 
 typedef void (*EventHandler) (EventObject *sender, gpointer calldata, gpointer 
closure);
 
+struct EventList {
+       int current_token;
+       GSList *event_list;
+};
+
 //
 // This guy provide reference counting
 // and type management.
@@ -122,9 +127,11 @@
 
        int AddHandler (const char *event_name, EventHandler handler, gpointer 
data);
        void RemoveHandler (const char *event_name, EventHandler handler, 
gpointer data);
+       void RemoveHandler (const char *event_name, int token);
 
-       void AddHandler (int event_id, EventHandler handler, gpointer data);
+       int AddHandler (int event_id, EventHandler handler, gpointer data);
        void RemoveHandler (int event_id, EventHandler handler, gpointer data);
+       void RemoveHandler (int event_id, int token);
 
        virtual Type::Kind GetObjectType () { return Type::EVENTOBJECT; }
 
@@ -137,7 +144,7 @@
  private:
        void FreeHandlers ();
 
-       GSList **events;
+       EventList *events;
 };
 
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to