Added:
trunk/gom/xulapp/components/gom/public/xgIGObjectHolder.idl
- copied, changed from r79,
/trunk/gom/xulapp/components/gom/public/xgIGObjectWrapper.idl
trunk/gom/xulapp/components/gom/src/gomcamel.c
trunk/gom/xulapp/components/gom/src/gomvalue.c
trunk/gom/xulapp/components/gom/src/xgGObjectUtils.cpp
trunk/gom/xulapp/components/gom/src/xgGObjectUtils.h
Removed:
trunk/gom/xulapp/components/gom/public/xgIGObjectWrapper.idl
Modified:
trunk/gom/include/gom/gomvalue.h
trunk/gom/include/gommacros.h
trunk/gom/xulapp/Makefile.inc
trunk/gom/xulapp/components/gom/public/Makefile.in
trunk/gom/xulapp/components/gom/src/Makefile.in
trunk/gom/xulapp/components/gom/src/xgGomModule.cpp
trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp
trunk/gom/xulapp/components/gom/src/xgGtkElement.h
Log:
2008-08-30 jacob berkman <ja...@ilovegom.org>
* xulapp/components/gom/src/gomcamel.c:
* xulapp/components/gom/src/gomvalue.c: copy from libgom
* xulapp/components/gom/src/xgGObjectUtils.h: static class which
handles some GObject/JSObject interaction for us
* xulapp/components/gom/src/xgGtkElement.cpp:
(xgGtkElement::WidgetActivate): handle activate events on
GtkEntries
(xgGtkElement::OnCreated): add our GObject's properties to our
JSObject
(xgGtkElement::HandlesAttribute): only handle attributes for which
we have a property
* include/gommacros.h (GOM_LOC): print the file's basename, not
its full path
* include/gom/gomvalue.h (GOM_VALUE_ERROR): C++ doesn't allow
trailing commas, or something daft
Modified: trunk/gom/include/gom/gomvalue.h
==============================================================================
--- trunk/gom/include/gom/gomvalue.h (original)
+++ trunk/gom/include/gom/gomvalue.h Sat Aug 30 16:47:01 2008
@@ -35,7 +35,7 @@
GOM_VALUE_ERROR_UNKNOWN_JSVAL_TAG = 1,
GOM_VALUE_ERROR_G_OBJECT_NOT_FOUND,
GOM_VALUE_ERROR_UNHANDLED_G_TYPE,
- GOM_VALUE_ERROR_JS_OBJECT_NOT_FOUND,
+ GOM_VALUE_ERROR_JS_OBJECT_NOT_FOUND
} GomValueError;
GQuark gom_value_error_quark (void);
Modified: trunk/gom/include/gommacros.h
==============================================================================
--- trunk/gom/include/gommacros.h (original)
+++ trunk/gom/include/gommacros.h Sat Aug 30 16:47:01 2008
@@ -26,10 +26,11 @@
#define JSVAL_CHARS(jval) (JS_GetStringBytes (JSVAL_TO_STRING (jval)))
+#define GOM_BASENAME(f) strchr (__FILE__, G_DIR_SEPARATOR) ? strrchr
(__FILE__, G_DIR_SEPARATOR) + 1 : __FILE__
#ifdef __cplusplus
-#define GOM_LOC(s) G_STRLOC":%s: "s, G_STRFUNC
+#define GOM_LOC(s) "%s:" G_STRINGIFY (__LINE__) ":%s: " s, GOM_BASENAME
(__FILE__), G_STRFUNC
#else
-#define GOM_LOC(s) G_STRLOC":%s(): "s, G_STRFUNC
+#define GOM_LOC(s) "%s:" G_STRINGIFY (__LINE__) ":%s(): " s, GOM_BASENAME
(__FILE__), G_STRFUNC
#endif
#define GOM_NOT_IMPLEMENTED (g_message (GOM_LOC("Not implemented yet.")))
Modified: trunk/gom/xulapp/Makefile.inc
==============================================================================
--- trunk/gom/xulapp/Makefile.inc (original)
+++ trunk/gom/xulapp/Makefile.inc Sat Aug 30 16:47:01 2008
@@ -56,7 +56,7 @@
dist_noinst_DATA += xulapp/components/gom/Makefile.in
dist_noinst_DATA += xulapp/components/gom/public/Makefile.in
-dist_noinst_DATA += xulapp/components/gom/public/xgIGObjectWrapper.idl
+dist_noinst_DATA += xulapp/components/gom/public/xgIGObjectHolder.idl
dist_noinst_DATA += xulapp/components/gom/src/Makefile.in
dist_noinst_DATA += xulapp/components/gom/src/xgGomElementFactory.cpp
Modified: trunk/gom/xulapp/components/gom/public/Makefile.in
==============================================================================
--- trunk/gom/xulapp/components/gom/public/Makefile.in (original)
+++ trunk/gom/xulapp/components/gom/public/Makefile.in Sat Aug 30 16:47:01
2008
@@ -44,6 +44,6 @@
MODULE = $(MOZ_APP_NAME)
-XPIDLSRCS = xgIGObjectWrapper.idl
+XPIDLSRCS = xgIGObjectHolder.idl
include $(topsrcdir)/config/rules.mk
Copied: trunk/gom/xulapp/components/gom/public/xgIGObjectHolder.idl (from
r79, /trunk/gom/xulapp/components/gom/public/xgIGObjectWrapper.idl)
==============================================================================
--- /trunk/gom/xulapp/components/gom/public/xgIGObjectWrapper.idl (original)
+++ trunk/gom/xulapp/components/gom/public/xgIGObjectHolder.idl Sat Aug 30
16:47:01 2008
@@ -27,10 +27,10 @@
#include <glib-object.h>
%}
-[ptr] native xgNativeGObject(GObject);
+[ptr] native GObjectPtr(GObject);
[uuid(97457374-87E2-4213-9B18-9ED575692D2E)]
-interface xgIGObjectWrapper : nsISupports
+interface xgIGObjectHolder : nsISupports
{
- xgNativeGObject getWrappedGObject();
+ GObjectPtr getGObject();
};
Modified: trunk/gom/xulapp/components/gom/src/Makefile.in
==============================================================================
--- trunk/gom/xulapp/components/gom/src/Makefile.in (original)
+++ trunk/gom/xulapp/components/gom/src/Makefile.in Sat Aug 30 16:47:01 2008
@@ -47,7 +47,7 @@
IS_COMPONENT = 1
USE_STATIC_LIBS = 1
-REQUIRES = \
+REQUIRES := \
content \
dom \
js \
@@ -59,17 +59,24 @@
LOCAL_INCLUDES += $(MOZ_GTK2_CFLAGS)
-CPPSRCS = \
+CPPSRCS := \
+ xgGObjectUtils.cpp \
xgGomElementFactory.cpp \
+ xgGomModule.cpp \
xgGtkElement.cpp \
xgGtkElementFactory.cpp \
- xgGomModule.cpp \
xgScriptElement.cpp \
$(NULL)
+CSRCS := \
+ gomcamel.c \
+ gomvalue.c \
+ $(NULL)
+
EXTRA_DSO_LDOPTS = \
$(XPCOM_GLUE_LDOPTS) \
$(MOZ_GTK2_LIBS) \
+ $(MOZ_JS_LIBS) \
$(NSPR_LIBS) \
$(NULL)
Added: trunk/gom/xulapp/components/gom/src/gomcamel.c
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/gomcamel.c Sat Aug 30 16:47:01 2008
@@ -0,0 +1,96 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gom/gomcamel.h"
+
+#include <glib/gstrfuncs.h>
+
+#include <string.h>
+
+const char *
+gom_camel_case (const char *s)
+{
+ int si, ri;
+ char *r = (char *)s;
+ gboolean upper = FALSE;
+ for (ri = si = 0; s[si]; si++) {
+ switch (s[si]) {
+ case '-':
+ case '_':
+ upper = TRUE;
+ break;
+ default:
+ if (upper) {
+ if (r == s) {
+ r = g_malloc (strlen (s) + 1);
+ memcpy (r, s, ri);
+ }
+ r[ri++] = g_ascii_toupper (s[si]);
+ upper = FALSE;
+ } else if (r != s) {
+ r[ri++] = s[si];
+ } else {
+ ri++;
+ }
+ break;
+ }
+ }
+ if (r != s) {
+ r[ri] = s[si];
+ }
+#if 0
+ g_print ("\n"GOM_LOC ("%s -> %s\n"), s, r);
+#endif
+ return (const char *)r;
+}
+
+const char *
+gom_camel_uncase (const char *s)
+{
+ int si, ri;
+ char *r = (char *)s;
+ for (si = 0; s[si]; si++) {
+ if (g_ascii_isupper (s[si])) {
+ if (r == s) {
+ r = g_malloc (si + 2 * strlen (s+si) + 1);
+ memcpy (r, s, si);
+ ri = si;
+ }
+ r[ri++] = '_';
+ r[ri++] = g_ascii_tolower (s[si]);
+ } else if (r != s) {
+ r[ri++] = s[si];
+ }
+ }
+ if (r != s) {
+ r[ri] = s[si];
+ }
+#if 0
+ g_print (GOM_LOC ("%s -> %s\n"), s, r);
+#endif
+ return (const char *)r;
+}
Added: trunk/gom/xulapp/components/gom/src/gomvalue.c
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/gomvalue.c Sat Aug 30 16:47:01 2008
@@ -0,0 +1,184 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gom/gomvalue.h"
+
+#include <gom/gomjsobject.h>
+
+GQuark
+gom_value_error_quark (void)
+{
+ return g_quark_from_static_string ("gom-value-error-quark");
+}
+
+gboolean
+gom_g_value (JSContext *cx, GValue *gval, jsval jval, GError **error)
+{
+ switch (JSVAL_TAG (jval)) {
+#if 0
+ case JSVAL_OBJECT: {
+ GObject *gobj;
+ gobj = gom_js_object_get_g_object (cx, JSVAL_TO_OBJECT (jval));
+ if (!gobj) {
+ g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_G_OBJECT_NOT_FOUND,
+ "Cannot get GObject from JSObject %p (%s)",
+ JSVAL_TO_OBJECT (jval),
+ JS_GET_CLASS (cx, JSVAL_TO_OBJECT (jval))->name);
+ return FALSE;
+ }
+ break;
+ }
+#endif
+ case JSVAL_DOUBLE:
+ g_value_init (gval, G_TYPE_DOUBLE);
+ g_value_set_double (gval, *JSVAL_TO_DOUBLE (jval));
+ break;
+ case JSVAL_STRING:
+ g_value_init (gval, G_TYPE_STRING);
+ g_value_set_string (gval, JS_GetStringBytes (JSVAL_TO_STRING
(jval)));
+ break;
+ case JSVAL_BOOLEAN:
+ g_value_init (gval, G_TYPE_BOOLEAN);
+ g_value_set_boolean (gval, JSVAL_TO_BOOLEAN (jval));
+ break;
+ default:
+ /* since these are 31-bit, they can have multiple tag values;
+ * only the lsb is significant in determining if it's a
+ * JSVAL_INT */
+ if (JSVAL_IS_INT (jval)) {
+ g_value_init (gval, G_TYPE_INT);
+ g_value_set_int (gval, JSVAL_TO_INT (jval));
+ break;
+ }
+
+ g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_UNKNOWN_JSVAL_TAG,
+ "Unknown jsval tag: %#x in jsval %p",
+ (int)JSVAL_TAG (jval), GINT_TO_POINTER (jval));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gom_jsval (JSContext *cx, jsval *jval, const GValue *gval, GError **error)
+{
+ gboolean ret = FALSE;
+ JSString *jstr;
+ GObject *gobj;
+ JSObject *jsobj;
+ jschar jc;
+ char c;
+
+ g_return_val_if_fail (jval != NULL, FALSE);
+ g_return_val_if_fail (gval != NULL, FALSE);
+
+ switch (G_TYPE_FUNDAMENTAL (G_VALUE_TYPE (gval))) {
+ case G_TYPE_CHAR:
+ c = g_value_get_char (gval);
+ jstr = JS_NewStringCopyN (cx, &c, 1);
+ ret = jstr != NULL;
+ *jval = STRING_TO_JSVAL (jstr);
+ break;
+ case G_TYPE_UCHAR:
+ jc = g_value_get_uchar (gval);
+ jstr = JS_NewUCStringCopyN (cx, &jc, 1);
+ ret = jstr != NULL;
+ *jval = STRING_TO_JSVAL (jstr);
+ break;
+ case G_TYPE_BOOLEAN:
+ *jval = BOOLEAN_TO_JSVAL (g_value_get_boolean (gval));
+ ret = TRUE;
+ break;
+
+ case G_TYPE_ENUM:
+ ret = JS_NewNumberValue (cx, g_value_get_enum (gval), jval);
+ break;
+
+ case G_TYPE_INT:
+ ret = JS_NewNumberValue (cx, g_value_get_int (gval), jval);
+ break;
+ case G_TYPE_UINT:
+ ret = JS_NewNumberValue (cx, g_value_get_uint (gval), jval);
+ break;
+
+ case G_TYPE_LONG:
+ ret = JS_NewNumberValue (cx, g_value_get_long (gval), jval);
+ break;
+ case G_TYPE_ULONG:
+ ret = JS_NewNumberValue (cx, g_value_get_ulong (gval), jval);
+ break;
+
+ case G_TYPE_INT64:
+ ret = JS_NewNumberValue (cx, g_value_get_int64 (gval), jval);
+ break;
+ case G_TYPE_UINT64:
+ ret = JS_NewNumberValue (cx, g_value_get_uint64 (gval), jval);
+ break;
+
+ case G_TYPE_FLOAT:
+ ret = JS_NewNumberValue (cx, g_value_get_float (gval), jval);
+ break;
+ case G_TYPE_DOUBLE:
+ ret = JS_NewNumberValue (cx, g_value_get_double (gval), jval);
+ break;
+
+ case G_TYPE_STRING:
+ *jval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx, g_value_get_string
(gval)));
+ ret = TRUE;
+ break;
+
+ default:
+#if 0
+ if (G_VALUE_HOLDS_OBJECT (gval)) {
+ gobj = g_value_get_object (gval);
+ if (!gobj) {
+ *jval = JSVAL_NULL;
+ } else {
+ jsobj = gom_js_object_get_or_create_js_object (cx, gobj);
+ if (!jsobj) {
+ g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_JS_OBJECT_NOT_FOUND,
+ "Cannot get JSObject from Object %p (%s)",
+ gobj, g_type_name (G_TYPE_FROM_INSTANCE
(gobj)));
+ return FALSE;
+ }
+ *jval = OBJECT_TO_JSVAL (jsobj);
+ }
+ ret = TRUE;
+ }
+#endif
+ break;
+ }
+
+ if (!ret) {
+ g_set_error (error, GOM_VALUE_ERROR,
GOM_VALUE_ERROR_UNHANDLED_G_TYPE,
+ "Cannot convert from GType %s to jsval",
+ G_VALUE_TYPE_NAME (gval));
+ }
+
+ return ret;
+}
Added: trunk/gom/xulapp/components/gom/src/xgGObjectUtils.cpp
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/xgGObjectUtils.cpp Sat Aug 30
16:47:01 2008
@@ -0,0 +1,299 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xgGObjectUtils.h"
+
+#include "xgIGObjectHolder.h"
+
+#include "gommacros.h"
+#include "gom/gomcamel.h"
+#include "gom/gomvalue.h"
+
+#include <jsapi.h>
+
+#include <nsCOMPtr.h>
+//#include <nsDOMClassInfo.h>
+#include <nsIDOMDocument.h>
+#include <nsIDOMNode.h>
+#include <nsIDocument.h>
+#include <nsIScriptContext.h>
+#include <nsIScriptGlobalObject.h>
+#include <nsIXPConnect.h>
+#include <nsServiceManagerUtils.h>
+
+// static
+nsresult
+xgGObjectUtils::DefineProperties (nsIDOMNode *aNode, GType aType)
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIDOMDocument> doc;
+ rv = aNode->GetOwnerDocument (getter_AddRefs (doc));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIDocument> nsdoc (do_QueryInterface (doc, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIScriptGlobalObject> global (nsdoc->GetScriptGlobalObject
());
+ NS_ENSURE_TRUE (global, NS_ERROR_UNEXPECTED);
+
+ rv = global->EnsureScriptEnvironment
(nsIProgrammingLanguage::JAVASCRIPT);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIScriptContext> cx (global->GetScriptContext
(nsIProgrammingLanguage::JAVASCRIPT));
+ NS_ENSURE_TRUE (cx, NS_ERROR_UNEXPECTED);
+
+ JSContext *jscx = (JSContext *)cx->GetNativeContext ();
+ NS_ENSURE_TRUE (jscx, NS_ERROR_UNEXPECTED);
+
+ JSObject *jsglobal = (JSObject *)cx->GetNativeGlobal ();
+ NS_ENSURE_TRUE (jsglobal, NS_ERROR_UNEXPECTED);
+
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService
("@mozilla.org/js/xpc/XPConnect;1", &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIXPConnectJSObjectHolder> jswrapper;
+ rv = xpc->WrapNative (jscx, jsglobal, aNode, NS_GET_IID (nsISupports),
getter_AddRefs (jswrapper));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+#if 0
+ nsCOMPtr<nsIXPConnectWrappedNative> wrapper (do_QueryInterface
(jswrapper, &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+ nsDOMClassInfo::PreserveNodeWrapper(wrapper);
+#endif
+
+ JSObject *jsobj;
+ rv = jswrapper->GetJSObject (&jsobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ g_message (GOM_LOC ("Got JSObject: %p"), (void *)jsobj);
+
+ guint n_properties;
+ GParamSpec **props = g_object_class_list_properties ((GObjectClass
*)g_type_class_peek (aType), &n_properties);
+ g_message (GOM_LOC ("Adding %d properties from %s"), n_properties,
g_type_name (aType));
+
+ const char *camelName;
+ for (guint i = 0; i < n_properties; i++) {
+ camelName = gom_camel_case (props[i]->name);
+ if (!JS_DefineProperty (jscx, jsobj, camelName, JSVAL_VOID,
+ xgGObjectUtils::GetProperty,
+ xgGObjectUtils::SetProperty,
+ JSPROP_ENUMERATE | JSPROP_PERMANENT)) {
+ g_printerr ("Could not define a property for %s\n", camelName);
+ } else {
+ g_print (GOM_LOC ("Defined property: %s.%s\n"),
+ g_type_name (aType), camelName);
+ }
+ GOM_CAMEL_FREE (camelName, props[i]->name);
+ }
+ return NS_OK;
+}
+
+// static
+JSBool
+xgGObjectUtils::GetProperty (JSContext *cx,
+ JSObject *obj,
+ jsval id,
+ jsval *vp)
+{
+ if (JSVAL_IS_INT (id)) {
+ return JS_TRUE;
+ }
+
+ nsresult rv;
+
+ nsCOMPtr<nsISupports> native;
+ rv = GetNative (cx, obj, getter_AddRefs (native));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ nsCOMPtr<xgIGObjectHolder> holder (do_QueryInterface (native, &rv));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ GObject *gobj;
+ rv = holder->GetGObject (&gobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+ NS_ENSURE_TRUE (G_IS_OBJECT (gobj), NS_ERROR_UNEXPECTED);
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ if (!Resolve (G_TYPE_FROM_INSTANCE (gobj), name, &spec, &signal_id)) {
+ return JS_TRUE;
+ }
+
+#if 0
+ if (signal_id) {
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ g_print ("closure: %p\n", closure);
+ *vp = closure ? OBJECT_TO_JSVAL (JS_GetFunctionObject
(closure->fun)) : JSVAL_VOID;
+ return JS_TRUE;
+ }
+#endif
+
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ g_value_init (&gval, G_PARAM_SPEC_VALUE_TYPE (spec));
+ g_object_get_property (gobj, spec->name, &gval);
+
+ GError *error = NULL;
+ if (!gom_jsval (cx, vp, &gval, &error)) {
+ g_printerr ("Could not get jsval: %s\n", error->message);
+ g_value_unset (&gval);
+ g_error_free (error);
+ return JS_FALSE;
+ }
+ g_value_unset (&gval);
+
+ return JS_TRUE;
+}
+
+// static
+JSBool
+xgGObjectUtils::SetProperty (JSContext *cx,
+ JSObject *obj,
+ jsval id,
+ jsval *vp)
+{
+ if (JSVAL_IS_INT (id)) {
+ return JS_TRUE;
+ }
+
+#if 0
+ g_print (GOM_LOC (""));
+#endif
+ nsresult rv;
+
+ nsCOMPtr<nsISupports> native;
+ rv = GetNative (cx, obj, getter_AddRefs (native));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ nsCOMPtr<xgIGObjectHolder> holder (do_QueryInterface (native, &rv));
+ NS_ENSURE_SUCCESS (rv, JS_FALSE);
+
+ GObject *gobj;
+ rv = holder->GetGObject (&gobj);
+ NS_ENSURE_SUCCESS (rv, rv);
+ NS_ENSURE_TRUE (G_IS_OBJECT (gobj), NS_ERROR_UNEXPECTED);
+
+ const char *name = JSVAL_CHARS (id);
+ GParamSpec *spec;
+ guint signal_id;
+
+ if (!Resolve (G_TYPE_FROM_INSTANCE (gobj), name, &spec, &signal_id)) {
+ return JS_TRUE;
+ }
+
+#if 0
+ GomJSClosure *closure;
+ if (signal_id) {
+ JSFunction *fun;
+ if (!JSVAL_IS_OBJECT (*vp) ||
+ !JS_ObjectIsFunction (cx, JSVAL_TO_OBJECT (*vp))) {
+ g_printerr ("jsval is not a function. sucka.\n");
+ return JS_FALSE;
+ }
+ fun = JS_ValueToFunction (cx, *vp);
+ if (!fun) {
+ g_printerr ("could not get function from value\n");
+ return JS_FALSE;
+ }
+ closure = gom_js_object_get_closure_prop (gobj, signal_id);
+ if (closure) {
+ closure->fun = fun;
+ } else {
+ closure = (GomJSClosure *)gom_js_closure_new (cx, obj, fun);
+ gom_js_object_set_closure_prop (gobj, signal_id, closure);
+ g_signal_connect_closure_by_id (gobj, signal_id, 0,
&closure->closure, FALSE);
+ }
+ return JS_TRUE;
+ }
+#endif
+ g_assert (spec);
+
+ GValue gval = { 0 };
+ GError *error = NULL;
+ if (!gom_g_value (cx, &gval, *vp, &error)) {
+ g_printerr ("Could not get GValue: %s\n", error->message);
+ g_error_free (error);
+ return JS_FALSE;
+ }
+
+ g_object_set_property (gobj, spec->name, &gval);
+ g_value_unset (&gval);
+
+ return JS_TRUE;
+}
+
+PRBool
+xgGObjectUtils::Resolve (GType aType,
+ const char *name,
+ GParamSpec **spec,
+ guint *signal_id)
+{
+ const char *n;
+
+ n = gom_camel_uncase (name);
+
+ if (n[0] == 'o' && n[1] == 'n' &&
+ (*signal_id = g_signal_lookup (&n[2], aType))) {
+#if 1
+ g_print ("resolve %s.%s -> signal %u\n", g_type_name (aType), n,
*signal_id);
+#endif
+ *spec = NULL;
+ GOM_CAMEL_FREE (n, name);
+ return PR_TRUE;
+ }
+
+ *spec = g_object_class_find_property ((GObjectClass
*)g_type_class_peek (aType), n);
+ *signal_id = 0;
+#if 1
+ g_print ("resolve %s.%s -> %s: %s\n",
+ g_type_name (aType), name, n,
+ *spec ? g_type_name (G_PARAM_SPEC_VALUE_TYPE
(*spec)) : "FAIL");
+#endif
+ GOM_CAMEL_FREE (n, name);
+
+ return *spec != NULL;
+}
+
+nsresult
+xgGObjectUtils::GetNative (JSContext *cx,
+ JSObject *obj,
+ nsISupports **_retval)
+{
+ nsresult rv;
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService
("@mozilla.org/js/xpc/XPConnect;1", &rv));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ nsCOMPtr<nsIXPConnectWrappedNative> wrappedNative;
+ rv = xpc->GetWrappedNativeOfJSObject (cx, obj, getter_AddRefs
(wrappedNative));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ return wrappedNative->GetNative (_retval);
+}
Added: trunk/gom/xulapp/components/gom/src/xgGObjectUtils.h
==============================================================================
--- (empty file)
+++ trunk/gom/xulapp/components/gom/src/xgGObjectUtils.h Sat Aug 30
16:47:01 2008
@@ -0,0 +1,47 @@
+/*
+The MIT License
+
+Copyright (c) 2008 jacob berkman <ja...@ilovegom.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a
copy
+of this software and associated documentation files (the "Software"), to
deal
+in the Software without restriction, including without limitation the
rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+#ifndef XG_G_OBJECT_UTILS_H
+#define XG_G_OBJECT_UTILS_H
+
+#include <glib-object.h>
+#include <jspubtd.h>
+#include <nscore.h>
+
+class nsISupports;
+class nsIDOMNode;
+
+class xgGObjectUtils
+{
+public:
+ static nsresult DefineProperties (nsIDOMNode *aNode, GType aType);
+
+ static gboolean Resolve (GType aType, const char *name, GParamSpec
**spec, guint *signal_id);
+
+ static JSBool GetProperty (JSContext *cx, JSObject *obj, jsval id,
jsval *vp);
+ static JSBool SetProperty (JSContext *cx, JSObject *obj, jsval id,
jsval *vp);
+
+ static nsresult GetNative (JSContext *cx, JSObject *obj, nsISupports
**_retval);
+};
+
+#endif // XG_G_OBJECT_UTILS_H
Modified: trunk/gom/xulapp/components/gom/src/xgGomModule.cpp
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgGomModule.cpp (original)
+++ trunk/gom/xulapp/components/gom/src/xgGomModule.cpp Sat Aug 30 16:47:01
2008
@@ -48,12 +48,12 @@
{
"Gom Gtk Element Factory",
XG_GTKELEMENTFACTORY_CID, XG_GTKELEMENTFACTORY_CONTRACTID,
- xgGtkElementFactoryConstructor
+ xgGtkElementFactoryConstructor,
},
};
static nsresult
-nsGomModuleConstructor (nsIModule *self)
+xgGomModuleConstructor (nsIModule *self)
{
if (!gtk_init_check (NULL, NULL)) {
g_warning ("Could not initialize Gtk; Gom module unavailable.");
@@ -67,4 +67,4 @@
return NS_OK;
}
-NS_IMPL_NSGETMODULE_WITH_CTOR(nsGomModule, components,
nsGomModuleConstructor)
+NS_IMPL_NSGETMODULE_WITH_CTOR (xgGomModule, components,
xgGomModuleConstructor)
Modified: trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp (original)
+++ trunk/gom/xulapp/components/gom/src/xgGtkElement.cpp Sat Aug 30
16:47:01 2008
@@ -26,112 +26,145 @@
#endif
#include "xgGtkElement.h"
+#include "xgGObjectUtils.h"
#include <gtk/gtk.h>
+#include "gom/gomcamel.h"
#include "gommacros.h"
#include <nsIAtom.h>
#include <nsIAtomService.h>
-#include <nsIDOMNode.h>
+#include <nsIDOMDocument.h>
+#include <nsIDOMDocumentEvent.h>
#include <nsIDOMElement.h>
+#include <nsIDOMEvent.h>
+#include <nsIDOMEventTarget.h>
+#include <nsIDOMNode.h>
+#include <nsIDOMUIEvent.h>
+#include <nsMemory.h>
#include <nsServiceManagerUtils.h>
+#include <nsStringAPI.h>
xgGtkElement::xgGtkElement ()
- : mType (0),
- mObject (NULL),
- mAttrs (NULL),
- mKeys (NULL)
{
}
xgGtkElement::~xgGtkElement()
{
- if (mKeys) {
- g_list_free (mKeys);
- mKeys = NULL;
- }
- if (mAttrs) {
- g_hash_table_destroy (mAttrs);
- mAttrs = NULL;
- }
- if (mObject) {
- g_object_unref (mObject);
- mObject = NULL;
- }
-}
-
-NS_IMPL_ISUPPORTS3 (xgGtkElement, nsIXTFElement, nsIXTFAttributeHandler,
xgIGObjectWrapper)
-
-void
-xgGtkElement::AttrsModified ()
-{
- if (mKeys) {
- g_list_free (mKeys);
- mKeys = NULL;
- }
-}
-
-void
-xgGtkElement::EnsureKeys ()
-{
- if (!mKeys) {
- mKeys = g_hash_table_get_keys (mAttrs);
- }
}
-static void
-free_value (gpointer data)
-{
- GValue *value = (GValue *)data;
- g_value_unset (value);
- g_free (value);
-}
+NS_IMPL_ISUPPORTS3 (xgGtkElement, nsIXTFAttributeHandler, nsIXTFElement,
xgIGObjectHolder)
nsresult
-xgGtkElement::Init (GType type)
+xgGtkElement::Init (GType gtype)
{
- mAttrs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
free_value);
- if (!mAttrs) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
- mType = type;
+ mType = gtype;
return NS_OK;
}
-/* xgNativeGObject getWrappedGObject (); */
+/* GObjectPtr getGObject (); */
NS_IMETHODIMP
-xgGtkElement::GetWrappedGObject (GObject **_retval)
+xgGtkElement::GetGObject (GObject **_retval)
{
*_retval = mObject ? G_OBJECT (g_object_ref (mObject)) : NULL;
return NS_OK;
}
-#if 0
-/* xgNativeGtkElement getGtkElement (); */
-NS_IMETHODIMP
-xgGtkElement::GetGtkElement (xgGtkElement **_retval)
+void
+xgGtkElement::WidgetActivate (GtkWidget *w, gpointer data)
{
- *_retval = this;
- return NS_OK;
+ xgGtkElement *self = (xgGtkElement *)data;
+ nsresult rv;
+
+ nsCOMPtr<nsIDOMElement> elem;
+ rv = self->mWrapper->GetElementNode (getter_AddRefs (elem));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to get element: %#x"), rv);
+ return;
+ }
+
+ nsCOMPtr<nsIDOMDocument> doc;
+ rv = elem->GetOwnerDocument (getter_AddRefs (doc));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to get doc: %#x"), rv);
+ return;
+ }
+
+ nsCOMPtr<nsIDOMDocumentEvent> docEvent (do_QueryInterface (doc, &rv));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to get doc event: %#x"), rv);
+ return;
+ }
+
+ nsCOMPtr<nsIDOMEvent> evt;
+ rv = docEvent->CreateEvent (NS_LITERAL_STRING ("UIEvent"),
getter_AddRefs (evt));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to create event: %#x"), rv);
+ return;
+ }
+
+ nsCOMPtr<nsIDOMUIEvent> uiEvt (do_QueryInterface (evt, &rv));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to QI for ui event: %#x"), rv);
+ return;
+ }
+
+ rv = uiEvt->InitUIEvent (NS_LITERAL_STRING ("DOMActivate"),
+ PR_TRUE, PR_TRUE, NULL, 0);
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to init UI event: %#x"), rv);
+ return;
+ }
+
+ nsCOMPtr<nsIDOMEventTarget> target (do_QueryInterface (elem, &rv));
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to QI for an event target: %#x"), rv);
+ return;
+ }
+
+ PRBool doDefault;
+ rv = target->DispatchEvent (evt, &doDefault);
+ if (NS_FAILED (rv)) {
+ g_warning (GOM_LOC ("Failed to dispatch event: %#x"), rv);
+ return;
+ }
+
+ g_message (GOM_LOC ("Event dispatch returned %#x"), doDefault);
}
-#endif
/* void onCreated (in nsIXTFElementWrapper wrapper); */
NS_IMETHODIMP
xgGtkElement::OnCreated (nsIXTFElementWrapper *wrapper)
{
+ nsresult rv;
if (!mType) {
return NS_ERROR_FAILURE;
}
g_print (GOM_LOC ("Creating new <%s>...\n"), g_type_name (mType));
mObject = (GObject *)g_object_new (mType, NULL);
- gtk_widget_show (GTK_WIDGET (mObject));
+ if (!mObject) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
mWrapper = wrapper;
mWrapper->SetNotificationMask (NOTIFY_PARENT_CHANGED |
NOTIFY_WILL_INSERT_CHILD |
NOTIFY_WILL_APPEND_CHILD |
NOTIFY_CHILD_REMOVED);
+
+ nsCOMPtr<nsIDOMElement> elem;
+ rv = mWrapper->GetElementNode (getter_AddRefs (elem));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ xgGObjectUtils::DefineProperties (elem, mType);
+
+ if (GTK_IS_ENTRY (mObject)) {
+ g_signal_connect (mObject, "activate",
+ G_CALLBACK (&xgGtkElement::WidgetActivate), this);
+ }
+ gtk_widget_show (GTK_WIDGET (mObject));
+
return NS_OK;
}
@@ -227,9 +260,9 @@
}
/* just as a sanity check */
- nsCOMPtr<xgIGObjectWrapper> wrappedParent (do_QueryInterface
(newParent));
+ nsCOMPtr<xgIGObjectHolder> wrappedParent (do_QueryInterface
(newParent));
GObject *parent = NULL;
- if (!wrappedParent || NS_FAILED (wrappedParent->GetWrappedGObject
(&parent)) ||
+ if (!wrappedParent || NS_FAILED (wrappedParent->GetGObject (&parent)) |
|
!GTK_IS_CONTAINER (parent)) {
g_warning (GOM_LOC ("Could not get parent widget for node: <%s>"),
G_OBJECT_TYPE_NAME (mObject));
@@ -238,7 +271,7 @@
g_assert ((GtkWidget *)parent == gtk_widget_get_parent (GTK_WIDGET
(mObject)));
g_object_unref (parent);
- g_hash_table_foreach (mAttrs, append_child_attrs_foreach, mObject);
+ //g_hash_table_foreach (mAttrs, append_child_attrs_foreach, mObject);
return NS_OK;
}
@@ -265,9 +298,9 @@
return NS_ERROR_FAILURE;
}
- nsCOMPtr<xgIGObjectWrapper> wrappedChild (do_QueryInterface (child));
+ nsCOMPtr<xgIGObjectHolder> wrappedChild (do_QueryInterface (child));
GObject *widget = NULL;
- if (!wrappedChild || NS_FAILED (wrappedChild->GetWrappedGObject
(&widget)) ||
+ if (!wrappedChild || NS_FAILED (wrappedChild->GetGObject (&widget)) ||
!GTK_IS_WIDGET (widget)) {
if (widget) {
g_object_unref (widget);
@@ -374,7 +407,11 @@
NS_IMETHODIMP
xgGtkElement::HandlesAttribute (nsIAtom *name, PRBool *_retval)
{
- *_retval = PR_TRUE;
+ GOM_ATOM_TO_GSTRING_RETURN (prop, name, NS_ERROR_INVALID_ARG);
+ GParamSpec *spec;
+ guint signal_id;
+ *_retval = xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id) ?
PR_TRUE : PR_FALSE;
+ g_print (GOM_LOC ("%s -> %d\n"), prop, *_retval);
return NS_OK;
}
@@ -385,30 +422,29 @@
GOM_ATOM_TO_GSTRING_RETURN (prop, name, NS_ERROR_INVALID_ARG);
GOM_ASTRING_TO_GSTRING_RETURN (value, newValue, NS_ERROR_INVALID_ARG);
- GParamSpec *spec = g_object_class_find_property (G_OBJECT_GET_CLASS
(mObject), prop);
- GValue *newval = NULL;
- if (spec) {
- GError *error = NULL;
- GValue gval = { 0 };
- if (G_TYPE_FUNDAMENTAL (G_PARAM_SPEC_VALUE_TYPE (spec)) ==
G_TYPE_OBJECT) {
- g_warning (GOM_LOC ("Attribute %s.%s is a %s, which a string
cannot be converted to"),
- g_type_name (mType), prop,
- g_type_name (G_PARAM_SPEC_VALUE_TYPE (spec)));
- return NS_ERROR_FAILURE;
- } else if (gtk_builder_value_from_string (NULL, spec, value,
&gval, &error)) {
- g_object_set_property (mObject, prop, &gval);
- g_value_unset (&gval);
- } else {
- g_warning (GOM_LOC ("Could not get value from string: '%s'"), value);
- return NS_ERROR_FAILURE;
- }
+ GParamSpec *spec;
+ guint signal_id;
+ if (!xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id)) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!spec) {
+ return NS_ERROR_FAILURE;
+ }
+
+ GError *error = NULL;
+ GValue gval = { 0 };
+ if (G_TYPE_FUNDAMENTAL (G_PARAM_SPEC_VALUE_TYPE (spec)) ==
G_TYPE_OBJECT) {
+ g_warning (GOM_LOC ("Attribute %s.%s is a %s, which a string cannot be
converted to"),
+ g_type_name (mType), prop,
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (spec)));
+ return NS_ERROR_FAILURE;
+ } else if (gtk_builder_value_from_string (NULL, spec, value, &gval,
&error)) {
+ g_object_set_property (mObject, spec->name, &gval);
+ g_value_unset (&gval);
} else {
- newval = g_new0 (GValue, 1);
- g_value_init (newval, G_TYPE_STRING);
- g_value_set_string (newval, value);
+ g_warning (GOM_LOC ("Could not get value from string: '%s'"), value);
+ return NS_ERROR_FAILURE;
}
- g_hash_table_insert (mAttrs, g_strdup (prop), newval);
- AttrsModified();
return NS_OK;
}
@@ -425,26 +461,24 @@
{
GOM_ATOM_TO_GSTRING_RETURN (prop, name, NS_ERROR_INVALID_ARG);
- GParamSpec *spec = g_object_class_find_property (G_OBJECT_GET_CLASS
(mObject), prop);
- if (spec) {
- GValue gval = { 0 };
- g_value_init (&gval, G_TYPE_STRING);
- g_object_get_property (G_OBJECT (mObject), prop, &gval);
- if (G_VALUE_HOLDS (&gval, G_TYPE_STRING)) {
- _retval = NS_ConvertUTF8toUTF16 (nsCAutoString (g_value_get_string
(&gval)));
- g_value_unset (&gval);
- return NS_OK;
- }
- g_value_unset (&gval);
- } else {
- const GValue *gvalp = (const GValue *)g_hash_table_lookup (mAttrs,
prop);
- if (gvalp) {
- if (G_VALUE_HOLDS_STRING (gvalp)) {
- _retval = NS_ConvertUTF8toUTF16 (nsCAutoString (g_value_get_string
(gvalp)));
- return NS_OK;
- }
- }
+ GParamSpec *spec;
+ guint signal_id;
+ if (!xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id)) {
+ return NS_ERROR_FAILURE;
+ }
+ if (!spec) {
+ return NS_ERROR_FAILURE;
}
+
+ GValue gval = { 0 };
+ g_value_init (&gval, G_TYPE_STRING);
+ g_object_get_property (G_OBJECT (mObject), spec->name, &gval);
+ if (G_VALUE_HOLDS (&gval, G_TYPE_STRING)) {
+ _retval = NS_ConvertUTF8toUTF16 (nsCAutoString (g_value_get_string
(&gval)));
+ g_value_unset (&gval);
+ return NS_OK;
+ }
+ g_value_unset (&gval);
return NS_ERROR_FAILURE;
}
@@ -454,10 +488,10 @@
{
GOM_ATOM_TO_GSTRING_RETURN (prop, name, NS_ERROR_INVALID_ARG);
- GParamSpec *spec = g_object_class_find_property (G_OBJECT_GET_CLASS
(mObject), prop);
- const GValue *gvalp = (const GValue *)g_hash_table_lookup (mAttrs,
prop);
+ GParamSpec *spec;
+ guint signal_id;
+ *_retval = xgGObjectUtils::Resolve (mType, prop, &spec, &signal_id);
- *_retval = spec || gvalp;
return NS_OK;
}
@@ -465,24 +499,12 @@
NS_IMETHODIMP
xgGtkElement::GetAttributeCount (PRUint32 *_retval)
{
- EnsureKeys ();
- *_retval = g_list_length (mKeys);
- return NS_OK;
+ XG_RETURN_NOT_IMPLEMENTED;
}
/* nsIAtom getAttributeNameAt (in unsigned long index); */
NS_IMETHODIMP
xgGtkElement::GetAttributeNameAt (PRUint32 index, nsIAtom **_retval)
{
- EnsureKeys ();
- const char *key = (const char *)g_list_nth_data (mKeys, index);
- if (!key) {
- return NS_ERROR_INVALID_ARG;
- }
-
- nsresult rv;
- nsCOMPtr<nsIAtomService> as (do_GetService (NS_ATOMSERVICE_CONTRACTID,
&rv));
- NS_ENSURE_SUCCESS (rv, rv);
-
- return as->GetAtomUTF8 (key, _retval);
+ XG_RETURN_NOT_IMPLEMENTED;
}
Modified: trunk/gom/xulapp/components/gom/src/xgGtkElement.h
==============================================================================
--- trunk/gom/xulapp/components/gom/src/xgGtkElement.h (original)
+++ trunk/gom/xulapp/components/gom/src/xgGtkElement.h Sat Aug 30 16:47:01
2008
@@ -24,7 +24,7 @@
#ifndef XG_GTK_ELEMENT_H
#define XG_GTK_ELEMENT_H
-#include "xgIGObjectWrapper.h"
+#include "xgIGObjectHolder.h"
#include <nsIXTFElement.h>
#include <nsIXTFElementWrapper.h>
@@ -32,32 +32,31 @@
#include <nsCOMPtr.h>
#include <glib-object.h>
+#include <gtk/gtk.h>
-class xgGtkElement : public nsIXTFElement,
+class xgGtkElement : public xgIGObjectHolder,
public nsIXTFAttributeHandler,
- public xgIGObjectWrapper
+ public nsIXTFElement
{
public:
NS_DECL_ISUPPORTS
- NS_DECL_NSIXTFELEMENT
+ NS_DECL_XGIGOBJECTHOLDER
NS_DECL_NSIXTFATTRIBUTEHANDLER
- NS_DECL_XGIGOBJECTWRAPPER
+ NS_DECL_NSIXTFELEMENT
xgGtkElement();
- nsresult Init(GType type);
-
-private:
- ~xgGtkElement();
+ nsresult Init (GType aType);
protected:
- void AttrsModified ();
- void EnsureKeys ();
+ nsCOMPtr<nsIXTFElementWrapper> mWrapper;
GType mType;
GObject *mObject;
- nsCOMPtr<nsIXTFElementWrapper> mWrapper;
- GHashTable *mAttrs;
- GList *mKeys;
+
+private:
+ ~xgGtkElement();
+
+ static void WidgetActivate (GtkWidget *w, gpointer data);
};
#endif // XG_GTK_ELEMENT_H