static JSBool gjs_cairo_surface_pattern_constructor(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { JSObject *surface_wrapper; cairo_surface_t *surface; cairo_pattern_t *pattern; if (!gjs_check_constructing(context)) return JS_FALSE; if (!gjs_parse_args(context, "SurfacePattern", "o", argc, argv, "surface", &surface_wrapper)) return JS_FALSE; surface = gjs_cairo_surface_get_surface(context, surface_wrapper); if (!surface) { gjs_throw(context, "first argument to SurfacePattern() should be a surface"); return JS_FALSE; } pattern = cairo_pattern_create_for_surface(surface); if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern")) return JS_FALSE; gjs_cairo_pattern_construct(context, obj, pattern); cairo_pattern_destroy(pattern); return JS_TRUE; }
static JSBool gjs_ngettext(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); char *msgid1; char *msgid2; guint32 n; const char *translated; JSBool result; jsval retval; if (!gjs_parse_args (context, "ngettext", "ssu", argc, argv, "msgid1", &msgid1, "msgid2", &msgid2, "n", &n)) return JS_FALSE; translated = ngettext(msgid1, msgid2, n); result = gjs_string_from_utf8(context, translated, -1, &retval); if (result) JS_SET_RVAL(context, vp, retval); g_free (msgid1); g_free (msgid2); return result; }
static JSBool gjs_main_loop_run(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *cancel_id; GMainLoop *main_loop; if (!gjs_parse_args(context, "run", "s", argc, argv, "cancelId", &cancel_id)) return JS_FALSE; main_loop = g_hash_table_lookup(pending_main_loops, cancel_id); if (!main_loop) { main_loop = g_main_loop_new(NULL, FALSE); g_hash_table_replace(pending_main_loops, g_strdup(cancel_id), main_loop); } else { g_main_loop_ref(main_loop); } gjs_debug(GJS_DEBUG_MAINLOOP, "main loop %s being run in context %p", cancel_id, context); g_free(cancel_id); g_main_loop_run(main_loop); g_main_loop_unref(main_loop); return JS_TRUE; }
static JSBool createFromPNG_func(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *filename; cairo_surface_t *surface; JSObject *surface_wrapper; if (!gjs_parse_args(context, "createFromPNG", "s", argc, argv, "filename", &filename)) return JS_FALSE; surface = cairo_image_surface_create_from_png(filename); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; surface_wrapper = JS_NewObject(context, &gjs_cairo_image_surface_class, NULL, NULL); if (!surface_wrapper) { gjs_throw(context, "failed to create surface"); return JS_FALSE; } gjs_cairo_surface_construct(context, surface_wrapper, surface); cairo_surface_destroy(surface); *retval = OBJECT_TO_JSVAL(surface_wrapper); return JS_TRUE; }
static JSBool gjs_cairo_ps_surface_constructor(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *filename; double width, height; cairo_surface_t *surface; if (!gjs_check_constructing(context)) return JS_FALSE; if (!gjs_parse_args(context, "PSSurface", "sff", argc, argv, "filename", &filename, "width", &width, "height", &height)) return JS_FALSE; surface = cairo_ps_surface_create(filename, width, height); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) { g_free(filename); return JS_FALSE; } gjs_cairo_surface_construct(context, obj, surface); cairo_surface_destroy(surface); g_free(filename); return JS_TRUE; }
static JSBool selectFontFace_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); char *family; cairo_font_slant_t slant; cairo_font_weight_t weight; cairo_t *cr; if (!gjs_parse_args(context, "selectFontFace", "sii", argc, argv, "family", &family, "slang", &slant, "weight", &weight)) return JS_FALSE; cr = gjs_cairo_context_get_context(context, obj); cairo_select_font_face(cr, family, slant, weight); g_free(family); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_cairo_image_surface_constructor(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { int format, width, height; cairo_surface_t *surface; if (!gjs_check_constructing(context)) return JS_FALSE; // create_for_data optional parameter if (!gjs_parse_args(context, "ImageSurface", "iii", argc, argv, "format", &format, "width", &width, "height", &height)) return JS_FALSE; surface = cairo_image_surface_create(format, width, height); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; gjs_cairo_surface_construct(context, obj, surface); cairo_surface_destroy(surface); return JS_TRUE; }
static JSBool setSourceSurface_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *surface_wrapper; double x, y; cairo_surface_t *surface; cairo_t *cr; if (!gjs_parse_args(context, "setSourceSurface", "off", argc, argv, "surface", &surface_wrapper, "x", &x, "y", &y)) return JS_FALSE; surface = gjs_cairo_surface_get_surface(context, surface_wrapper); if (!surface) { gjs_throw(context, "first argument to setSourceSurface() should be a surface"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_set_source_surface(cr, surface, x, y); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool showText_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); char *utf8; cairo_t *cr; if (!gjs_parse_args(context, "showText", "s", argc, argv, "utf8", &utf8)) return JS_FALSE; cr = gjs_cairo_context_get_context(context, obj); cairo_show_text(cr, utf8); g_free(utf8); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_pgettext(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); char *src_context; char *msgid; const char *translated; JSBool result; jsval retval; if (!gjs_parse_args (context, "pgettext", "ss", argc, argv, "context", &src_context, "msgid", &msgid)) return JS_FALSE; translated = g_dpgettext2(NULL, src_context, msgid); g_free (src_context); result = gjs_string_from_utf8(context, translated, -1, &retval); if (result) JS_SET_RVAL(context, vp, retval); g_free (msgid); return result; }
static JSBool setSource_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *pattern_wrapper; cairo_pattern_t *pattern; cairo_t *cr; if (!gjs_parse_args(context, "setSource", "o", argc, argv, "pattern", &pattern_wrapper)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, pattern_wrapper); if (!pattern) { gjs_throw(context, "first argument to setSource() should be a pattern"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_set_source(cr, pattern); if (!gjs_cairo_check_status(context, cairo_status(cr), "context")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool appendPath_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); JSObject *path_wrapper; cairo_path_t *path; cairo_t *cr; if (!gjs_parse_args(context, "path", "o", argc, argv, "path", &path_wrapper)) return JS_FALSE; path = gjs_cairo_path_get_path(context, path_wrapper); if (!path) { gjs_throw(context, "first argument to appendPath() should be a path"); return JS_FALSE; } cr = gjs_cairo_context_get_context(context, obj); cairo_append_path(cr, path); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_dgettext(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); char *domain; char *msgid; const char *translated; JSBool result; jsval retval; if (!gjs_parse_args (context, "dgettext", "zs", argc, argv, "domain", &domain, "msgid", &msgid)) return JS_FALSE; translated = dgettext(domain, msgid); g_free (domain); result = gjs_string_from_utf8(context, translated, -1, &retval); if (result) JS_SET_RVAL(context, vp, retval); g_free (msgid); return result; }
/* Methods */ static JSBool writeToPNG_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); char *filename; cairo_surface_t *surface; if (!gjs_parse_args(context, "writeToPNG", "s", argc, argv, "filename", &filename)) return JS_FALSE; surface = gjs_cairo_surface_get_surface(context, obj); if (!surface) { g_free(filename); return JS_FALSE; } cairo_surface_write_to_png(surface, filename); g_free(filename); if (!gjs_cairo_check_status(context, cairo_surface_status(surface), "surface")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_refcount(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); jsval retval; JSObject *target_obj; GObject *obj; if (!gjs_parse_args(context, "refcount", "o", argc, argv, "object", &target_obj)) return JS_FALSE; if (!gjs_typecheck_object(context, target_obj, G_TYPE_OBJECT, JS_TRUE)) return JS_FALSE; obj = gjs_g_object_from_object(context, target_obj); if (obj == NULL) return JS_FALSE; retval = INT_TO_JSVAL(obj->ref_count); JS_SET_RVAL(context, vp, retval); return JS_TRUE; }
static JSBool gjs_gc(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); if (!gjs_parse_args(context, "gc", "", argc, argv)) return JS_FALSE; JS_GC(JS_GetRuntime(context)); return JS_TRUE; }
static JSBool gjs_breakpoint(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); if (!gjs_parse_args(context, "breakpoint", "", argc, argv)) return JS_FALSE; G_BREAKPOINT(); return JS_TRUE; }
static JSBool gjs_exit(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); gint32 ecode; if (!gjs_parse_args(context, "exit", "i", argc, argv, "ecode", &ecode)) return JS_FALSE; exit(ecode); return JS_TRUE; }
static JSBool gjs_timeout_add(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { GClosure *closure; JSObject *callback; guint32 interval; guint id; /* Best I can tell, there is no way to know if argv[1] is really * callable other than to just try it. Checking whether it's a * function will not detect native objects that provide * JSClass::call, for example. */ if (!gjs_parse_args(context, "timeout_add", "uo", argc, argv, "interval", &interval, "callback", &callback)) return JS_FALSE; closure = gjs_closure_new(context, callback, "timeout"); if (closure == NULL) return JS_FALSE; g_closure_ref(closure); g_closure_sink(closure); id = g_timeout_add_full(G_PRIORITY_DEFAULT, interval, closure_source_func, closure, closure_destroy_notify); /* this is needed to remove the timeout if the JSContext is * destroyed. */ g_closure_add_invalidate_notifier(closure, GUINT_TO_POINTER(id), closure_invalidated); if (!JS_NewNumberValue(context, id, retval)) return JS_FALSE; return JS_TRUE; }
static JSBool gjs_textdomain(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); char *domain; if (!gjs_parse_args(context, "textdomain", "s", argc, argv, "domain", &domain)) return JS_FALSE; textdomain(domain); g_free(domain); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool copyPathFlat_func(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); cairo_path_t *path; cairo_t *cr; if (!gjs_parse_args(context, "", "", argc, argv)) return JS_FALSE; cr = gjs_cairo_context_get_context(context, obj); path = cairo_copy_path_flat(cr); JS_SET_RVAL(context, vp, OBJECT_TO_JSVAL(gjs_cairo_path_from_path(context, path))); return JS_TRUE; }
static JSBool gjs_source_remove(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { guint32 source_id; gboolean success; if (!gjs_parse_args(context, "source_remove", "u", argc, argv, "sourceId", &source_id)) return JS_FALSE; success = g_source_remove(source_id); *retval = BOOLEAN_TO_JSVAL(success); return JS_TRUE; }
static JSBool gjs_timeout_add_seconds(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { GClosure *closure; JSObject *callback; guint32 interval; guint id; /* See comment for timeout_add above */ if (!gjs_parse_args(context, "timeout_add_seconds", "uo", argc, argv, "interval", &interval, "callback", &callback)) return JS_FALSE; closure = gjs_closure_new(context, callback, "timeout_seconds"); if (closure == NULL) return JS_FALSE; g_closure_ref(closure); g_closure_sink(closure); id = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT, interval, closure_source_func, closure, closure_destroy_notify); /* this is needed to remove the timeout if the JSContext is * destroyed. */ g_closure_add_invalidate_notifier(closure, GUINT_TO_POINTER(id), closure_invalidated); if (!JS_NewNumberValue(context, id, retval)) return JS_FALSE; return JS_TRUE; }
static JSBool setFilter_func(JSContext *context, JSObject *object, uintN argc, jsval *argv, jsval *retval) { cairo_filter_t filter; cairo_pattern_t *pattern; if (!gjs_parse_args(context, "setFilter", "i", argc, argv, "filter", &filter)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, object); cairo_pattern_set_filter(pattern, filter); if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern")) return JS_FALSE; return JS_TRUE; }
static JSBool setExtend_func(JSContext *context, JSObject *object, uintN argc, jsval *argv, jsval *retval) { cairo_extend_t extend; cairo_pattern_t *pattern; if (!gjs_parse_args(context, "setExtend", "i", argc, argv, "extend", &extend)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, object); cairo_pattern_set_extend(pattern, extend); if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern")) return JS_FALSE; return JS_TRUE; }
static JSBool gjs_bindtextdomain(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); char *domain; char *location; if (!gjs_parse_args (context, "bindtextdomain", "sF", argc, argv, "domain", &domain, "location", &location)) return JS_FALSE; bindtextdomain(domain, location); /* Always use UTF-8; we assume it internally here */ bind_textdomain_codeset(domain, "UTF-8"); g_free (domain); g_free (location); JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_address_of(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); JSObject *target_obj; JSBool ret; char *pointer_string; jsval retval; if (!gjs_parse_args(context, "addressOf", "o", argc, argv, "object", &target_obj)) return JS_FALSE; pointer_string = g_strdup_printf("%p", target_obj); ret = gjs_string_from_utf8(context, pointer_string, -1, &retval); if (ret) JS_SET_RVAL(context, vp, retval); return ret; }
static JSBool gjs_main_loop_quit(JSContext *context, JSObject *obj, uintN argc, jsval *argv, jsval *retval) { char *cancel_id; GMainLoop *main_loop; if (!gjs_parse_args(context, "quit", "s", argc, argv, "cancelId", &cancel_id)) return JS_FALSE; main_loop = g_hash_table_lookup(pending_main_loops, cancel_id); if (!main_loop) { g_free(cancel_id); gjs_throw(context, "No main loop with this id"); return JS_FALSE; } g_hash_table_remove(pending_main_loops, cancel_id); if (!g_main_loop_is_running(main_loop)) { g_free(cancel_id); gjs_throw(context, "Main loop was stopped already"); return JS_FALSE; } gjs_debug(GJS_DEBUG_MAINLOOP, "main loop %s quitting in context %p", cancel_id, context); g_free(cancel_id); g_main_loop_quit(main_loop); return JS_TRUE; }
static JSBool setExtend_func(JSContext *context, unsigned argc, jsval *vp) { jsval *argv = JS_ARGV(context, vp); JSObject *obj = JS_THIS_OBJECT(context, vp); cairo_extend_t extend; cairo_pattern_t *pattern; if (!gjs_parse_args(context, "setExtend", "i", argc, argv, "extend", &extend)) return JS_FALSE; pattern = gjs_cairo_pattern_get_pattern(context, obj); cairo_pattern_set_extend(pattern, extend); if (!gjs_cairo_check_status(context, cairo_pattern_status(pattern), "pattern")) return JS_FALSE; JS_SET_RVAL(context, vp, JSVAL_VOID); return JS_TRUE; }
static JSBool gjs_format_int_alternative_output(JSContext *context, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); char *str; jsval rval; int intval; JSBool ret; if (!gjs_parse_args(context, "format_int_alternative_output", "i", argc, argv, "intval", &intval)) return JS_FALSE; str = g_strdup_printf("%Id", intval); ret = gjs_string_from_utf8(context, str, -1, &rval); if (ret) JS_SET_RVAL(context, vp, rval); g_free (str); return ret; }