[gs-commits] mupdf 1.16.1.7 Add form filling to mutool run.
[email protected] (Tor Andersson)
| Newsgroups | gmane.comp.printing.ghostscript.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 21261baab6772225d14ec76187be937bc78255c5 Author: Tor Andersson <[email protected]> Date: Fri Jun 28 14:26:56 2019 +0200 Add form filling to mutool run. Drop unneccessary 'doc' argument to text and choice widget accessors. Add pdf_choice_field_option accessors. diff --git a/include/mupdf/pdf/form.h b/include/mupdf/pdf/form.h index fcbedc9..d067faa 100644 --- a/include/mupdf/pdf/form.h +++ b/include/mupdf/pdf/form.h @@ -24,20 +24,26 @@ enum pdf_widget_tx_format PDF_WIDGET_TX_FORMAT_TIME }; +pdf_widget *pdf_keep_widget(fz_context *ctx, pdf_widget *widget); +void pdf_drop_widget(fz_context *ctx, pdf_widget *widget); pdf_widget *pdf_first_widget(fz_context *ctx, pdf_page *page); pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous); +int pdf_update_widget(fz_context *ctx, pdf_widget *widget); enum pdf_widget_type pdf_widget_type(fz_context *ctx, pdf_widget *widget); fz_rect pdf_bound_widget(fz_context *ctx, pdf_widget *widget); -int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw); -int pdf_text_widget_format(fz_context *ctx, pdf_document *doc, pdf_widget *tw); +int pdf_text_widget_max_len(fz_context *ctx, pdf_widget *tw); +int pdf_text_widget_format(fz_context *ctx, pdf_widget *tw); -int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]); -int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw); -int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]); -void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]); +int pdf_choice_widget_options(fz_context *ctx, pdf_widget *tw, int exportval, const char *opts[]); +int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_widget *tw); +int pdf_choice_widget_value(fz_context *ctx, pdf_widget *tw, const char *opts[]); +void pdf_choice_widget_set_value(fz_context *ctx, pdf_widget *tw, int n, const char *opts[]); + +int pdf_choice_field_option_count(fz_context *ctx, pdf_obj *field); +const char *pdf_choice_field_option(fz_context *ctx, pdf_obj *field, int export, int i); /* Field flags */ enum diff --git a/platform/gl/gl-form.c b/platform/gl/gl-form.c index a2e06c8..5db7e4c 100644 --- a/platform/gl/gl-form.c +++ b/platform/gl/gl-form.c @@ -264,9 +264,9 @@ static void ch_dialog(void) label = pdf_field_label(ctx, ch_widget->obj); label_h = ui_break_lines((char*)label, NULL, 20, 394, NULL); - n = pdf_choice_widget_options(ctx, ch_widget->page->doc, ch_widget, 0, NULL); + n = pdf_choice_widget_options(ctx, ch_widget, 0, NULL); options = fz_malloc_array(ctx, n, const char *); - pdf_choice_widget_options(ctx, ch_widget->page->doc, ch_widget, 0, options); + pdf_choice_widget_options(ctx, ch_widget, 0, options); value = pdf_field_value(ctx, ch_widget->obj); ui_dialog_begin(400, (ui.gridsize+4)*3 + ui.lineheight*(label_h-1)); diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 6bec80f..0ae437f 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -1755,16 +1755,16 @@ static inline jobject to_PDFWidget(fz_context *ctx, JNIEnv *env, pdf_widget *wid (*env)->SetIntField(env, jwidget, fid_PDFWidget_fieldFlags, fieldFlags); if (fieldType == PDF_WIDGET_TYPE_TEXT) { - (*env)->SetIntField(env, jwidget, fid_PDFWidget_maxLen, pdf_text_widget_max_len(ctx, widget->page->doc, widget)); - (*env)->SetIntField(env, jwidget, fid_PDFWidget_textFormat, pdf_text_widget_format(ctx, widget->page->doc, widget)); + (*env)->SetIntField(env, jwidget, fid_PDFWidget_maxLen, pdf_text_widget_max_len(ctx, widget)); + (*env)->SetIntField(env, jwidget, fid_PDFWidget_textFormat, pdf_text_widget_format(ctx, widget)); } if (fieldType == PDF_WIDGET_TYPE_COMBOBOX || fieldType == PDF_WIDGET_TYPE_LISTBOX) { - nopts = pdf_choice_widget_options(ctx, widget->page->doc, widget, 0, NULL); + nopts = pdf_choice_widget_options(ctx, widget, 0, NULL); if (nopts > 0) { opts = fz_malloc(ctx, nopts * sizeof(*opts)); - pdf_choice_widget_options(ctx, widget->page->doc, widget, 0, opts); + pdf_choice_widget_options(ctx, widget, 0, opts); jopts = to_StringArray_safe(ctx, env, opts, nopts); if (jopts) (*env)->SetObjectField(env, jwidget, fid_PDFWidget_options, jopts); diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 39a1298..0f13d41 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -844,10 +844,9 @@ pdf_update_widget(fz_context *ctx, pdf_widget *widget) get the maximum number of characters permitted in a text widget */ -int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw) +int pdf_text_widget_max_len(fz_context *ctx, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; - return pdf_to_int(ctx, pdf_dict_get_inheritable(ctx, annot->obj, PDF_NAME(MaxLen))); } @@ -855,7 +854,7 @@ int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw) get the type of content required by a text widget */ -int pdf_text_widget_format(fz_context *ctx, pdf_document *doc, pdf_widget *tw) +int pdf_text_widget_format(fz_context *ctx, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; int type = PDF_WIDGET_TX_FORMAT_NONE; @@ -951,7 +950,7 @@ int pdf_set_choice_field_value(fz_context *ctx, pdf_widget *widget, const char * is true, then the export values will be returned and not the list values if there are export values present. */ -int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]) +int pdf_choice_widget_options(fz_context *ctx, pdf_widget *tw, int exportval, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -978,7 +977,23 @@ int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw return n; } -int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw) +int pdf_choice_field_option_count(fz_context *ctx, pdf_obj *field) +{ + pdf_obj *opt = pdf_dict_get_inheritable(ctx, field, PDF_NAME(Opt)); + return pdf_array_len(ctx, opt); +} + +const char *pdf_choice_field_option(fz_context *ctx, pdf_obj *field, int export, int i) +{ + pdf_obj *opt = pdf_dict_get_inheritable(ctx, field, PDF_NAME(Opt)); + pdf_obj *ent = pdf_array_get(ctx, opt, i); + if (pdf_array_len(ctx, ent) == 2) + return pdf_array_get_text_string(ctx, ent, export ? 0 : 1); + else + return pdf_to_text_string(ctx, ent); +} + +int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_widget *tw) { pdf_annot *annot = (pdf_annot *)tw; @@ -1000,7 +1015,7 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid with NULL as the array to find out how big the array need to be. The filled in elements should not be freed by the caller. */ -int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]) +int pdf_choice_widget_value(fz_context *ctx, pdf_widget *tw, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -1039,7 +1054,7 @@ int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, caller should pass the number of options selected and an array of their names */ -void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]) +void pdf_choice_widget_set_value(fz_context *ctx, pdf_widget *tw, int n, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr = NULL, *opt; @@ -1053,7 +1068,7 @@ void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget { if (n != 1) { - optarr = pdf_new_array(ctx, doc, n); + optarr = pdf_new_array(ctx, annot->page->doc, n); for (i = 0; i < n; i++) { @@ -1073,8 +1088,8 @@ void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget pdf_dict_del(ctx, annot->obj, PDF_NAME(I)); pdf_field_mark_dirty(ctx, annot->obj); - if (pdf_field_dirties_document(ctx, doc, annot->obj)) - doc->dirty = 1; + if (pdf_field_dirties_document(ctx, annot->page->doc, annot->obj)) + annot->page->doc->dirty = 1; } fz_catch(ctx) { diff --git a/source/tools/murun.c b/source/tools/murun.c index 44b7d46..df0c913 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -285,6 +285,12 @@ static void ffi_gc_fz_document_writer(js_State *J, void *wri) #if FZ_ENABLE_PDF +static void ffi_gc_pdf_widget(js_State *J, void *widget) +{ + fz_context *ctx = js_getcontext(J); + pdf_drop_widget(ctx, widget); +} + static void ffi_gc_pdf_annot(js_State *J, void *annot) { fz_context *ctx = js_getcontext(J); @@ -3442,6 +3448,16 @@ static void ffi_PDFDocument_newDictionary(js_State *J) ffi_pushobj(J, obj); } +static void ffi_PDFDocument_enableJS(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_document *pdf = js_touserdata(J, 0, "pdf_document"); + fz_try(ctx) + pdf_enable_js(ctx, pdf); + fz_catch(ctx) + rethrow(J); +} + static void ffi_PDFDocument_newGraftMap(js_State *J) { fz_context *ctx = js_getcontext(J); @@ -3884,21 +3900,48 @@ static void ffi_PDFObject_forEach(js_State *J) } } -static void ffi_PDFPage_getAnnotations(js_State *J) +static void ffi_PDFPage_getWidgets(js_State *J) { fz_context *ctx = js_getcontext(J); pdf_page *page = js_touserdata(J, 0, "pdf_page"); - pdf_annot *annot = NULL; + pdf_widget *widget = NULL; int i = 0; + fz_try(ctx) + widget = pdf_first_widget(ctx, page); + fz_catch(ctx) + rethrow(J); + js_newarray(J); + while (widget) { + js_getregistry(J, "pdf_widget"); + js_newuserdata(J, "pdf_widget", pdf_keep_widget(ctx, widget), ffi_gc_pdf_widget); + js_setindex(J, -2, i++); + + fz_try(ctx) + widget = pdf_next_widget(ctx, widget); + fz_catch(ctx) + rethrow(J); + } +} + +static void ffi_PDFPage_getAnnotations(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_page *page = js_touserdata(J, 0, "pdf_page"); + pdf_annot *annot = NULL; + int i = 0; + fz_try(ctx) annot = pdf_first_annot(ctx, page); fz_catch(ctx) rethrow(J); + js_newarray(J); + while (annot) { + js_getregistry(J, "pdf_annot"); js_newuserdata(J, "pdf_annot", pdf_keep_annot(ctx, annot), ffi_gc_pdf_annot); js_setindex(J, -2, i++); @@ -3924,6 +3967,7 @@ static void ffi_PDFPage_createAnnotation(js_State *J) } fz_catch(ctx) rethrow(J); + js_getregistry(J, "pdf_annot"); js_newuserdata(J, "pdf_annot", annot, ffi_gc_pdf_annot); } @@ -4431,6 +4475,216 @@ static void ffi_PDFAnnotation_update(js_State *J) js_pushboolean(J, changed); } + +static void ffi_PDFWidget_getFieldType(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int type; + fz_try(ctx) + type = pdf_field_type(ctx, widget->obj); + fz_catch(ctx) + rethrow(J); + switch (type) + { + default: + case PDF_WIDGET_TYPE_BUTTON: js_pushstring(J, "button"); break; + case PDF_WIDGET_TYPE_CHECKBOX: js_pushstring(J, "checkbox"); break; + case PDF_WIDGET_TYPE_COMBOBOX: js_pushstring(J, "combobox"); break; + case PDF_WIDGET_TYPE_LISTBOX: js_pushstring(J, "listbox"); break; + case PDF_WIDGET_TYPE_RADIOBUTTON: js_pushstring(J, "radiobutton"); break; + case PDF_WIDGET_TYPE_SIGNATURE: js_pushstring(J, "signature"); break; + case PDF_WIDGET_TYPE_TEXT: js_pushstring(J, "text"); break; + } +} + +static void ffi_PDFWidget_getFieldFlags(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int flags; + fz_try(ctx) + flags = pdf_field_flags(ctx, widget->obj); + fz_catch(ctx) + rethrow(J); + js_pushnumber(J, flags); +} + +static void ffi_PDFWidget_getRect(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_rect rect; + fz_try(ctx) + rect = pdf_annot_rect(ctx, widget); + fz_catch(ctx) + rethrow(J); + ffi_pushrect(J, rect); +} + +static void ffi_PDFWidget_setRect(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_rect rect = ffi_torect(J, 1); + fz_try(ctx) + pdf_set_annot_rect(ctx, widget, rect); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_getValue(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + const char *value; + fz_try(ctx) + value = pdf_field_value(ctx, widget->obj); + fz_catch(ctx) + rethrow(J); + js_pushstring(J, value); +} + +static void ffi_PDFWidget_setTextValue(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + const char *value = js_tostring(J, 1); + fz_try(ctx) + pdf_set_text_field_value(ctx, widget, value); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_setChoiceValue(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + const char *value = js_tostring(J, 1); + fz_try(ctx) + pdf_set_choice_field_value(ctx, widget, value); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_toggle(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int changed = 0; + fz_try(ctx) + changed = pdf_toggle_widget(ctx, widget); + fz_catch(ctx) + rethrow(J); + js_pushboolean(J, changed); +} + +static void ffi_PDFWidget_getMaxLen(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int maxLen = 0; + fz_try(ctx) + maxLen = pdf_text_widget_max_len(ctx, widget); + fz_catch(ctx) + rethrow(J); + js_pushnumber(J, maxLen); +} + +static void ffi_PDFWidget_getOptions(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int export = js_toboolean(J, 1); + const char *opt; + int i, n; + fz_try(ctx) + n = pdf_choice_field_option_count(ctx, widget->obj); + fz_catch(ctx) + rethrow(J); + js_newarray(J); + for (i = 0; i < n; ++i) { + fz_try(ctx) + opt = pdf_choice_field_option(ctx, widget->obj, export, i); + fz_catch(ctx) + rethrow(J); + js_pushstring(J, opt); + } + js_endtry(J); +} + +static void ffi_PDFWidget_update(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + int changed = 0; + fz_try(ctx) + changed = pdf_update_widget(ctx, widget); + fz_catch(ctx) + rethrow(J); + js_pushboolean(J, changed); +} + +static void ffi_PDFWidget_eventEnter(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_enter(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_eventExit(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_exit(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_eventDown(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_down(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_eventUp(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_up(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_eventFocus(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_focus(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_PDFWidget_eventBlur(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_widget *widget = js_touserdata(J, 0, "pdf_widget"); + fz_try(ctx) + pdf_annot_event_blur(ctx, widget); + fz_catch(ctx) + rethrow(J); +} + #endif /* FZ_ENABLE_PDF */ int murun_main(int argc, char **argv) @@ -4739,12 +4993,15 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFDocument.newGraftMap", ffi_PDFDocument_newGraftMap, 0); jsB_propfun(J, "PDFDocument.graftObject", ffi_PDFDocument_graftObject, 1); + + jsB_propfun(J, "PDFDocument.enableJS", ffi_PDFDocument_enableJS, 0); } js_setregistry(J, "pdf_document"); js_getregistry(J, "fz_page"); js_newobjectx(J); { + jsB_propfun(J, "PDFPage.getWidgets", ffi_PDFPage_getWidgets, 0); jsB_propfun(J, "PDFPage.getAnnotations", ffi_PDFPage_getAnnotations, 0); jsB_propfun(J, "PDFPage.createAnnotation", ffi_PDFPage_createAnnotation, 1); jsB_propfun(J, "PDFPage.deleteAnnotation", ffi_PDFPage_deleteAnnotation, 1); @@ -4759,6 +5016,7 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFAnnotation.run", ffi_PDFAnnotation_run, 2); jsB_propfun(J, "PDFAnnotation.toPixmap", ffi_PDFAnnotation_toPixmap, 3); jsB_propfun(J, "PDFAnnotation.toDisplayList", ffi_PDFAnnotation_toDisplayList, 0); + jsB_propfun(J, "PDFAnnotation.getType", ffi_PDFAnnotation_getType, 0); jsB_propfun(J, "PDFAnnotation.getFlags", ffi_PDFAnnotation_getFlags, 0); jsB_propfun(J, "PDFAnnotation.setFlags", ffi_PDFAnnotation_setFlags, 1); @@ -4780,14 +5038,49 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFAnnotation.setAuthor", ffi_PDFAnnotation_setAuthor, 1); jsB_propfun(J, "PDFAnnotation.getModificationDate", ffi_PDFAnnotation_getModificationDate, 0); jsB_propfun(J, "PDFAnnotation.setModificationDate", ffi_PDFAnnotation_setModificationDate, 0); + jsB_propfun(J, "PDFAnnotation.updateAppearance", ffi_PDFAnnotation_updateAppearance, 0); jsB_propfun(J, "PDFAnnotation.update", ffi_PDFAnnotation_update, 0); } + js_dup(J); + js_setglobal(J, "PDFAnnot"); js_setregistry(J, "pdf_annot"); js_getregistry(J, "Userdata"); js_newobjectx(J); { + // jsB_propfun(J, "PDFWidget.bound", ffi_PDFWidget_bound, 0); + // jsB_propfun(J, "PDFWidget.run", ffi_PDFWidget_run, 2); + // jsB_propfun(J, "PDFWidget.toPixmap", ffi_PDFWidget_toPixmap, 3); + // jsB_propfun(J, "PDFWidget.toDisplayList", ffi_PDFWidget_toDisplayList, 0); + + jsB_propfun(J, "PDFWidget.getFieldType", ffi_PDFWidget_getFieldType, 0); + jsB_propfun(J, "PDFWidget.getFieldFlags", ffi_PDFWidget_getFieldFlags, 0); + jsB_propfun(J, "PDFWidget.getRect", ffi_PDFWidget_getRect, 0); + jsB_propfun(J, "PDFWidget.setRect", ffi_PDFWidget_setRect, 1); + jsB_propfun(J, "PDFWidget.getValue", ffi_PDFWidget_getValue, 0); + jsB_propfun(J, "PDFWidget.setTextValue", ffi_PDFWidget_setTextValue, 1); + jsB_propfun(J, "PDFWidget.setChoiceValue", ffi_PDFWidget_setChoiceValue, 1); + jsB_propfun(J, "PDFWidget.toggle", ffi_PDFWidget_toggle, 0); + jsB_propfun(J, "PDFWidget.getMaxLen", ffi_PDFWidget_getMaxLen, 0); + jsB_propfun(J, "PDFWidget.getOptions", ffi_PDFWidget_getOptions, 1); + + jsB_propfun(J, "PDFWidget.update", ffi_PDFWidget_update, 0); + + jsB_propfun(J, "PDFWidget.eventEnter", ffi_PDFWidget_eventEnter, 0); + jsB_propfun(J, "PDFWidget.eventExit", ffi_PDFWidget_eventExit, 0); + jsB_propfun(J, "PDFWidget.eventDown", ffi_PDFWidget_eventDown, 0); + jsB_propfun(J, "PDFWidget.eventUp", ffi_PDFWidget_eventUp, 0); + jsB_propfun(J, "PDFWidget.eventFocus", ffi_PDFWidget_eventFocus, 0); + jsB_propfun(J, "PDFWidget.eventBlur", ffi_PDFWidget_eventBlur, 0); + } + js_dup(J); + js_setglobal(J, "PDFWidget"); + js_setregistry(J, "pdf_widget"); + + js_getregistry(J, "Userdata"); + js_newobjectx(J); + { jsB_propfun(J, "PDFObject.get", ffi_PDFObject_get, 1); jsB_propfun(J, "PDFObject.put", ffi_PDFObject_put, 2); jsB_propfun(J, "PDFObject.push", ffi_PDFObject_push, 1); http://git.ghostscript.com/?p=mupdf.git;a=commit;h=21261baab6772225d14ec76187be937bc78255c5 -- MuPDF library Artifex Software, Inc.