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