view nodejs/mbfly_njs.cc @ 1453:0cb89e204824

Implement tree-traveling for JS
author Thinker K.F. Li <thinker@codemud.net>
date Wed, 13 Apr 2011 17:34:09 +0800
parents 8ecee58c85c6
children
line wrap: on
line source

// -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*-
// vim: sw=4:ts=8:sts=4
#include <stdio.h>
#include <string.h>
#include <v8.h>

extern "C" {
#include "njs_mb_supp.h"
}

#include "mbfly_njs.h"

using namespace v8;

/*! \defgroup xnjsmb_mb_rt JS binding for MB runtime.
 * \ingroup xnjsmb
 *
 * @{
 */
static coord_t *
xnjsmb_coord_new(njs_runtime_t *rt, coord_t *parent, const char **err) {
    coord_t *coord;
    redraw_man_t *rdman;

    rdman = njs_mb_rdman(rt);
    coord = rdman_coord_new(rdman, parent);
    if(coord == NULL) {
        *err = "Can not allocate a redraw_man_t";
	return NULL;
    }
    rdman_coord_changed(rdman, coord);

    return coord;
}

static void
xnjsmb_mb_rt_objs_mod(Handle<Object> mbrt, Handle<Value> ret) {
    Handle<Object> ret_obj = ret->ToObject();

    SET(ret_obj, "mbrt", mbrt);
}

static void
xnjsmb_redraw_changed(njs_runtime_t *rt) {
    redraw_man_t *rdman;

    rdman = njs_mb_rdman(rt);
    rdman_redraw_changed(rdman);
}

static void
xnjsmb_redraw_all(njs_runtime_t *rt) {
    redraw_man_t *rdman;

    rdman = njs_mb_rdman(rt);
    rdman_redraw_all(rdman);
}

static void
xnjsmb_handle_single_event(njs_runtime_t *rt, void *evt) {
    njs_mb_handle_single_event(rt, evt);
}

static void
xnjsmb_no_more_event(njs_runtime_t *rt) {
    njs_mb_no_more_event(rt);
}

static njs_runtime_t *
_njs_mb_new(Handle<Object> self, char *display_name,
	      int width, int height) {
    njs_runtime_t *obj;
    subject_t *subject;
    Handle<Value> subject_o;

    obj = njs_mb_new(display_name, width, height);
    WRAP(self, obj);		/* mkroot need a wrapped object, but
				 * it is wrapped after returning of
				 * this function.  So, we wrap it
				 * here. */
    xnjsmb_coord_mkroot(self);

    subject = njs_mb_kbevents(obj);
    subject_o = export_xnjsmb_auto_subject_new(subject);
    SET(self, "kbevents", subject_o);

    return obj;
}

static njs_runtime_t *
_njs_mb_new_with_win(Handle<Object> self, void *display,
		       long win) {
    njs_runtime_t *obj;
    subject_t *subject;
    Handle<Value> subject_o;

    obj = njs_mb_new_with_win(display, win);
    WRAP(self, obj);		/* mkroot need a wrapped object, but
				 * it is wrapped after returning of
				 * this function.  So, we wrap it
				 * here. */
    xnjsmb_coord_mkroot(self);

    subject = njs_mb_kbevents(obj);
    subject_o = export_xnjsmb_auto_subject_new(subject);
    SET(self, "kbevents", subject_o);

    return obj;
}

/*! \defgroup njs_template_cb Callback functions for v8 engine and nodejs.
 *
 * @{
 */

/*
 * Redirect following function to respective exported version from
 * other modules.  Since gen_v8_binding.m4 make all functions static,
 * we need a exported version to call them indrectly from other
 * modules.
 */
#define xnjsmb_auto_coord_new export_xnjsmb_auto_coord_new
#define xnjsmb_auto_path_new export_xnjsmb_auto_path_new
#define xnjsmb_auto_stext_new export_xnjsmb_auto_stext_new
#define xnjsmb_auto_image_new export_xnjsmb_auto_image_new
#define xnjsmb_auto_rect_new export_xnjsmb_auto_rect_new
#define xnjsmb_auto_paint_color_new export_xnjsmb_auto_paint_color_new
#define xnjsmb_auto_paint_image_new export_xnjsmb_auto_paint_image_new
#define xnjsmb_auto_paint_linear_new export_xnjsmb_auto_paint_linear_new
#define xnjsmb_auto_paint_radial_new export_xnjsmb_auto_paint_radial_new

#include "mbfly_njs-inc.h"

/* @} */

/*! \brief Get rdman associated with the runtime.
 */
redraw_man_t *
xnjsmb_rt_rdman(Handle<Object> mbrt) {
    HandleScope scope;
    njs_runtime_t *rt;
    redraw_man_t *rdman;

    rt = (njs_runtime_t *)UNWRAP(mbrt);
    rdman = njs_mb_rdman(rt);

    return rdman;
}

Handle<Value>
hello_func(const Arguments &args) {
    HandleScope scope;

    return String::Concat(String::New("World"), args[0]->ToString());
}

extern "C" void
init(Handle<Object> target) {
    HandleScope scope;
    Handle<FunctionTemplate> func, mb_rt_func;
    Handle<ObjectTemplate> rt_instance_temp, rt_proto_temp;

    func = FunctionTemplate::New(hello_func);
    target->Set(String::New("Hello"), func->GetFunction());

    /*
     * Initialize template for MadButterfly runtime objects.
     */
    xnjsmb_auto_mb_rt_init();
    xnjsmb_auto_mb_rt_display_init();
    xnjsmb_auto_mb_rt_with_win_init();
    njs_mb_reg_timer_man();
    njs_mb_reg_IO_man();

    /*
     * Add properties to mb_rt templates for other modules.
     */
    xnjsmb_shapes_init_mb_rt_temp(xnjsmb_auto_mb_rt_temp);
    xnjsmb_paints_init_mb_rt_temp(xnjsmb_auto_mb_rt_temp);
    xnjsmb_font_init_mb_rt_temp(xnjsmb_auto_mb_rt_temp);
    xnjsmb_img_ldr_init_mb_rt_temp(target);
    xnjsmb_observer_init();

    target->Set(String::New("mb_rt"),
		xnjsmb_auto_mb_rt_temp->GetFunction());
    target->Set(String::New("mb_rt_with_win"),
		xnjsmb_auto_mb_rt_with_win_temp->GetFunction());
}

/* @} */