Packages
vix
0.16.3
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.1
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.1
0.2.0
retired
0.1.0
NIF based bindings for libvips
Current section
Files
Jump to
Current section
Files
c_src/g_object/g_object.c
#include <glib-object.h>
#include "../utils.h"
#include "g_object.h"
ErlNifResourceType *G_OBJECT_RT;
// Ownership is traferred to beam resource, `obj` must *not* be freed
// by the caller
ERL_NIF_TERM g_object_to_erl_term(ErlNifEnv *env, GObject *obj) {
ERL_NIF_TERM term;
GObjectResource *gobject_r;
gobject_r = enif_alloc_resource(G_OBJECT_RT, sizeof(GObjectResource));
// TODO: Keep gtype name and use elixir-struct instead of c-struct,
// so that type information is visible in elixir.
gobject_r->obj = obj;
term = enif_make_resource(env, gobject_r);
enif_release_resource(gobject_r);
return term;
}
ERL_NIF_TERM nif_g_object_type_name(ErlNifEnv *env, int argc,
const ERL_NIF_TERM argv[]) {
ASSERT_ARGC(argc, 1);
GObject *obj;
if (!erl_term_to_g_object(env, argv[0], &obj))
return make_error(env, "Failed to get GObject");
return make_binary(env, G_OBJECT_TYPE_NAME(obj));
}
bool erl_term_to_g_object(ErlNifEnv *env, ERL_NIF_TERM term, GObject **obj) {
GObjectResource *gobject_r = NULL;
if (enif_get_resource(env, term, G_OBJECT_RT, (void **)&gobject_r)) {
(*obj) = gobject_r->obj;
return true;
}
return false;
}
static void g_object_dtor(ErlNifEnv *env, void *ptr) {
GObjectResource *gobject_r = (GObjectResource *)ptr;
g_object_unref(gobject_r->obj);
debug("GObjectResource dtor");
}
int nif_g_object_init(ErlNifEnv *env) {
G_OBJECT_RT = enif_open_resource_type(
env, NULL, "g_object_resource", (ErlNifResourceDtor *)g_object_dtor,
ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER, NULL);
if (!G_OBJECT_RT) {
error("Failed to open gobject_resource");
return 1;
}
return 0;
}