summaryrefslogtreecommitdiff
path: root/src/bindings/ecore_js/ecore_js_idle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/bindings/ecore_js/ecore_js_idle.cc')
-rw-r--r--src/bindings/ecore_js/ecore_js_idle.cc294
1 files changed, 294 insertions, 0 deletions
diff --git a/src/bindings/ecore_js/ecore_js_idle.cc b/src/bindings/ecore_js/ecore_js_idle.cc
new file mode 100644
index 0000000000..293cef2f45
--- /dev/null
+++ b/src/bindings/ecore_js/ecore_js_idle.cc
@@ -0,0 +1,294 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <Ecore_Js.hh>
+
+namespace efl { namespace ecore { namespace js {
+
+static Ecore_Idler* extract_idler(v8::Local<v8::Object> object)
+{
+ auto ptr = v8::External::Cast(*object->GetInternalField(0))->Value();
+ return reinterpret_cast<Ecore_Idler*>(ptr);
+}
+
+static
+v8::Local<v8::Object> wrap_idler(Ecore_Idler *idler, v8::Isolate *isolate)
+{
+ using v8::Boolean;
+ using v8::String;
+ using v8::ObjectTemplate;
+ using v8::FunctionTemplate;
+
+ auto obj_tpl = compatibility_new<ObjectTemplate>(isolate);
+ obj_tpl->SetInternalFieldCount(1);
+ auto ret = obj_tpl->NewInstance();
+
+ auto del = [](compatibility_callback_info_type info)
+ -> compatibility_return_type {
+ if (info.Length() != 0)
+ return compatibility_return();
+
+ ecore_idler_del(extract_idler(info.This()));
+ return compatibility_return();
+ };
+
+ ret->Set(compatibility_new<String>(isolate, "del"),
+ compatibility_new<FunctionTemplate>(isolate, del)->GetFunction());
+
+ ret->SetInternalField(0, compatibility_new<v8::External>(isolate, idler));
+
+ return ret;
+}
+
+static Ecore_Idle_Enterer* extract_idle_enterer(v8::Local<v8::Object> object)
+{
+ auto ptr = v8::External::Cast(*object->GetInternalField(0))->Value();
+ return reinterpret_cast<Ecore_Idle_Enterer*>(ptr);
+}
+
+static v8::Local<v8::Object> wrap_idle_enterer(Ecore_Idle_Enterer *idle_enterer,
+ v8::Isolate *isolate)
+{
+ using v8::Boolean;
+ using v8::String;
+ using v8::ObjectTemplate;
+ using v8::FunctionTemplate;
+ using v8::External;
+
+ auto obj_tpl = compatibility_new<ObjectTemplate>(isolate);
+ obj_tpl->SetInternalFieldCount(1);
+ auto ret = obj_tpl->NewInstance();
+
+ auto del = [](compatibility_callback_info_type info)
+ -> compatibility_return_type {
+ if (info.Length() != 0)
+ return compatibility_return();
+
+ ecore_idle_enterer_del(extract_idle_enterer(info.This()));
+ return compatibility_return();
+ };
+
+ ret->Set(compatibility_new<String>(isolate, "del"),
+ compatibility_new<FunctionTemplate>(isolate, del)->GetFunction());
+
+ ret->SetInternalField(0,
+ compatibility_new<External>(isolate, idle_enterer));
+
+ return ret;
+}
+
+static Ecore_Idle_Exiter* extract_idle_exiter(v8::Local<v8::Object> object)
+{
+ auto ptr = v8::External::Cast(*object->GetInternalField(0))->Value();
+ return reinterpret_cast<Ecore_Idle_Exiter*>(ptr);
+}
+
+static v8::Local<v8::Object> wrap_idle_exiter(Ecore_Idle_Exiter *idle_exiter,
+ v8::Isolate *isolate)
+{
+ using v8::Boolean;
+ using v8::String;
+ using v8::ObjectTemplate;
+ using v8::FunctionTemplate;
+ using v8::External;
+
+ auto obj_tpl = compatibility_new<ObjectTemplate>(isolate);
+ obj_tpl->SetInternalFieldCount(1);
+ auto ret = obj_tpl->NewInstance();
+
+ auto del = [](compatibility_callback_info_type info)
+ -> compatibility_return_type {
+ if (info.Length() != 0)
+ return compatibility_return();
+
+ ecore_idle_exiter_del(extract_idle_exiter(info.This()));
+ return compatibility_return();
+ };
+
+ ret->Set(compatibility_new<String>(isolate, "del"),
+ compatibility_new<FunctionTemplate>(isolate, del)->GetFunction());
+
+ ret->SetInternalField(0, compatibility_new<External>(isolate, idle_exiter));
+
+ return ret;
+}
+
+void register_idler_add(v8::Isolate *isolate, v8::Handle<v8::Object> global,
+ v8::Handle<v8::String> name)
+{
+ using v8::Local;
+ using v8::Value;
+ using v8::Undefined;
+ using v8::Function;
+ using v8::FunctionTemplate;
+
+ auto f = [](compatibility_callback_info_type args)
+ -> compatibility_return_type {
+ if (args.Length() != 1 || !args[0]->IsFunction())
+ return compatibility_return();
+
+ auto f = new efl::eina::js::global_ref<Value>(args.GetIsolate(), args[0]);
+ auto ret = ecore_idler_add([](void *data) -> Eina_Bool {
+ auto persistent = static_cast<efl::eina::js::global_ref<Value>*>(data);
+ auto o = persistent->handle();
+
+ auto ret = Function::Cast(*o)->Call(o->ToObject(), 0, NULL);
+ auto bret = ret->IsBoolean() && ret->BooleanValue();
+
+ if (!bret)
+ {
+ persistent->dispose();
+ delete persistent;
+ }
+
+ return bret ? EINA_TRUE : EINA_FALSE;
+ }, f);
+
+ return compatibility_return(wrap_idler(ret, args.GetIsolate()), args);
+ };
+
+ global->Set(name,
+ compatibility_new<FunctionTemplate>(isolate, f)->GetFunction());
+}
+
+void register_idle_enterer_add(v8::Isolate *isolate,
+ v8::Handle<v8::Object> global,
+ v8::Handle<v8::String> name)
+{
+ using v8::Local;
+ using v8::Value;
+ using v8::Undefined;
+ using v8::Function;
+ using v8::FunctionTemplate;
+
+ auto f = [](compatibility_callback_info_type args)
+ -> compatibility_return_type {
+ if (args.Length() != 1 || !args[0]->IsFunction())
+ return compatibility_return();
+
+ auto f = new efl::eina::js::global_ref<Value>(args.GetIsolate(), args[0]);
+ auto ret = ecore_idle_enterer_add([](void *data) -> Eina_Bool {
+ auto persistent = static_cast<efl::eina::js::global_ref<Value>*>(data);
+ auto o = persistent->handle();
+
+ auto ret = Function::Cast(*o)->Call(o->ToObject(), 0, NULL);
+ auto bret = ret->IsBoolean() && ret->BooleanValue();
+
+ if (!bret)
+ {
+ persistent->dispose();
+ delete persistent;
+ }
+
+ return bret ? EINA_TRUE : EINA_FALSE;
+ }, f);
+
+ return compatibility_return(wrap_idle_enterer(ret, args.GetIsolate()),
+ args);
+ };
+
+ global->Set(name,
+ compatibility_new<FunctionTemplate>(isolate, f)->GetFunction());
+}
+
+void register_idle_enterer_before_add(v8::Isolate *isolate,
+ v8::Handle<v8::Object> global,
+ v8::Handle<v8::String> name)
+{
+ using v8::Local;
+ using v8::Value;
+ using v8::Undefined;
+ using v8::Function;
+ using v8::FunctionTemplate;
+
+ auto f = [](compatibility_callback_info_type args)
+ -> compatibility_return_type {
+ if (args.Length() != 1 || !args[0]->IsFunction())
+ return compatibility_return();
+
+ auto f = new efl::eina::js::global_ref<Value>(args.GetIsolate(), args[0]);
+ auto ret = ecore_idle_enterer_before_add([](void *data) -> Eina_Bool {
+ auto persistent = static_cast<efl::eina::js::global_ref<Value>*>(data);
+ auto o = persistent->handle();
+
+ auto ret = Function::Cast(*o)->Call(o->ToObject(), 0, NULL);
+ auto bret = ret->IsBoolean() && ret->BooleanValue();
+
+ if (!bret)
+ {
+ persistent->dispose();
+ delete persistent;
+ }
+
+ return bret ? EINA_TRUE : EINA_FALSE;
+ }, f);
+
+ return compatibility_return(wrap_idle_enterer(ret, args.GetIsolate()),
+ args);
+ };
+
+ global->Set(name,
+ compatibility_new<FunctionTemplate>(isolate, f)->GetFunction());
+}
+
+void register_idle_exiter_add(v8::Isolate *isolate,
+ v8::Handle<v8::Object> global,
+ v8::Handle<v8::String> name)
+{
+ using v8::Local;
+ using v8::Value;
+ using v8::Undefined;
+ using v8::Function;
+ using v8::FunctionTemplate;
+
+ auto f = [](compatibility_callback_info_type args)
+ -> compatibility_return_type {
+ if (args.Length() != 1 || !args[0]->IsFunction())
+ return compatibility_return();
+
+ auto f = new efl::eina::js::global_ref<Value>(args.GetIsolate(), args[0]);
+ auto ret = ecore_idle_exiter_add([](void *data) -> Eina_Bool {
+ auto persistent = static_cast<efl::eina::js::global_ref<Value>*>(data);
+ auto o = persistent->handle();
+
+ auto ret = Function::Cast(*o)->Call(o->ToObject(), 0, NULL);
+ auto bret = ret->IsBoolean() && ret->BooleanValue();
+
+ if (!bret)
+ {
+ persistent->dispose();
+ delete persistent;
+ }
+
+ return bret ? EINA_TRUE : EINA_FALSE;
+ }, f);
+
+ return compatibility_return(wrap_idle_exiter(ret, args.GetIsolate()),
+ args);
+ };
+
+ global->Set(name,
+ compatibility_new<FunctionTemplate>(isolate, f)->GetFunction());
+}
+
+EAPI
+void register_ecore_idle(v8::Isolate *isolate,v8::Handle<v8::Object> exports)
+{
+ register_idler_add(isolate, exports,
+ compatibility_new<v8::String>(isolate, "ecore_idler_add"));
+ register_idle_enterer_add(isolate, exports,
+ compatibility_new<v8::String>(isolate,
+ "ecore_idle_enterer"
+ "_add"));
+ register_idle_enterer_before_add(isolate, exports,
+ compatibility_new<v8::String>(isolate,
+ "ecore_idle"
+ "_enterer_before"
+ "_add"));
+ register_idle_exiter_add(isolate, exports,
+ compatibility_new<v8::String>(isolate,
+ "ecore_idle_exiter_add"));
+}
+
+} } } // namespace efl { namespace js {