racket/src/mysterx/mysterx.h
Matthew Flatt 91add0453f 369.4
svn: r5327
2007-01-12 07:09:56 +00:00

911 lines
27 KiB
C

// mysterx.h
#define MX_PATCH_LEVEL ""
#define MX_VERSION MZSCHEME_VERSION // "-" MX_PATCH_LEVEL
#ifndef _SINKTBL_
#include "sinktbl.h"
#endif
#define sizeray(x) (sizeof(x)/sizeof(*x))
#define MXMAIN "mxmain"
#define MX_PRIM_DECL(f) Scheme_Object *f(int,Scheme_Object **)
#define MX_DEFAULT_WIDTH (400)
#define MX_DEFAULT_HEIGHT (400)
#define MAXDIRECTARGS (256)
#define DOCHWND_TRIES 40
#define DOCDISPATCH_TRIES 60
#define MAXARRAYDIMS 32
#define CLSIDLEN 38
#define NORETVALINDEX (-1)
#define UNICODE_BUFFER_SIZE 256
#define TYPE_TBL_SIZE 1019
/* extends INVOKEKIND enum in OAIDL.H */
#define INVOKE_EVENT 16
#define NO_LCID (-1)
typedef HRESULT (STDMETHODCALLTYPE *COMPTR)(IDispatch *);
typedef struct _mx_args_ {
short int numParamsPassed;
short int numOptParams;
short int lcidIndex;
BOOL retvalInParams;
} MX_ARGS_COUNT;
typedef struct _mx_prim_ {
Scheme_Object *(*c_fun)(int argc,Scheme_Object **);
char *name;
short minargs;
short maxargs;
} MX_PRIM;
typedef struct _scheme_com_obj_ {
Scheme_Object so;
BOOL released;
IDispatch *pIDispatch;
ITypeInfo *pITypeInfo;
ITypeInfo *pEventTypeInfo;
CLSID clsId;
IConnectionPoint *pIConnectionPoint;
DWORD connectionCookie;
ISink *pISink;
Scheme_Hash_Table *types;
} MX_COM_Object;
typedef struct _scheme_com_type_ {
Scheme_Object so;
BOOL released;
ITypeInfo *pITypeInfo;
CLSID clsId; // of coclass
} MX_COM_Type;
typedef struct _scheme_mx_event_ {
Scheme_Object so;
BOOL released;
IEvent *pEvent;
} MX_Event;
typedef enum _mx_desckind_ {
funcDesc,varDesc
} MX_DESCKIND;
typedef HRESULT (STDMETHODCALLTYPE *COMFUNPTR)(IDispatch *);
#define NO_FUNPTR (-1)
typedef struct _method_desc_ {
Scheme_Object so;
BOOL released;
MEMBERID memID;
ITypeInfo *pITypeInfo;
ITypeInfo *pITypeInfoImpl;
IDispatch *pInterface;
COMPTR funPtr;
short funOffset; // NO_FUNPTR means no direct call possible
GUID implGuid;
MX_DESCKIND descKind;
union {
struct funcdescs {
FUNCDESC *pFuncDesc;
FUNCDESC *pFuncDescImpl;
} funcdescs;
VARDESC *pVarDesc;
};
} MX_TYPEDESC;
typedef struct _mx_com_data_ {
Scheme_Object so;
BOOL released;
union { // MS representations
DATE date;
CY cy;
SCODE scode;
IUnknown *pIUnknown;
};
} MX_COM_Data_Object;
typedef struct _com_browser_ {
Scheme_Object so;
BOOL released;
HWND hwnd;
IWebBrowser2 *pIWebBrowser2;
ISink *pISink;
IEventQueue *pIEventQueue;
HANDLE readSem;
int *destroy; /* malloc()ed, free()ed by msg loop */
} MX_Browser_Object;
typedef struct _com_document_ {
Scheme_Object so;
BOOL released;
IHTMLDocument2 *pIHTMLDocument2;
} MX_Document_Object;
typedef struct _mx_element_ {
Scheme_Object so;
BOOL released;
BOOL valid;
IHTMLElement *pIHTMLElement;
} MX_Element;
typedef struct _date_ {
Scheme_Object so;
} MX_Date_Object;
typedef struct _mx_omit_ {
Scheme_Object so;
} MX_OMIT;
typedef struct _mx_type_tbl_entry_ {
Scheme_Object so;
IDispatch *pIDispatch;
LPCTSTR name;
INVOKEKIND invKind;
MX_TYPEDESC *pTypeDesc;
struct _mx_type_tbl_entry_ *next;
} MX_TYPE_TBL_ENTRY;
typedef enum _mx_html_where_ {
insert,append
} MX_HTML_WHERE;
typedef struct _browser_window_ { // parameters a la MrEd frame% class
const char *label;
int width;
int height;
int x;
int y;
DWORD style;
} BROWSER_WINDOW;
typedef struct _browser_window_init_ {
BROWSER_WINDOW browserWindow;
IStream **ppIStream; // for passing COM interface back to main thread
int *destroy;
} BROWSER_WINDOW_INIT;
typedef struct _browser_window_style_option {
char *name;
DWORD bits;
BOOL enable;
} BROWSER_WINDOW_STYLE_OPTION;
// dummy type for "subtyping"
// a managed object has a Scheme_Type, followed by a released flag
typedef struct _managed_obj_ {
Scheme_Object so;
BOOL released;
} MX_MANAGED_OBJ;
#define MX_MANAGED_OBJ_RELEASED(o) (((MX_MANAGED_OBJ *)o)->released)
#define TYPE_PRED(o,ty) (!SCHEME_INTP(o) && o->type == ty)
#define MX_COM_OBJP(o) TYPE_PRED(o,mx_com_object_type)
#define MX_COM_OBJ_VAL(o) (((MX_COM_Object *)o)->pIDispatch)
#define MX_COM_OBJ_CONNECTIONPOINT(o) (((MX_COM_Object *)o)->pIConnectionPoint)
#define MX_COM_OBJ_TYPEINFO(o) (((MX_COM_Object *)o)->pITypeInfo)
#define MX_COM_OBJ_CLSID(o) (((MX_COM_Object *)o)->clsId)
#define MX_COM_OBJ_EVENTTYPEINFO(o) (((MX_COM_Object *)o)->pEventTypeInfo)
#define MX_COM_OBJ_EVENTSINK(o) (((MX_COM_Object *)o)->pISink)
#define GUARANTEE_COM_OBJ(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_COM_OBJP, "com-object")
#define MX_COM_TYPEP(o) TYPE_PRED(o,mx_com_type_type)
#define MX_COM_TYPE_VAL(o) (((MX_COM_Type *)o)->pITypeInfo)
#define GUARANTEE_COM_TYPE(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_COM_TYPEP, "com-type")
#define MX_COM_OBJ_OR_TYPE(o) (MX_COM_OBJP(o) || MX_COM_TYPEP(o))
#define GUARANTEE_COM_OBJ_OR_TYPE(fname, argnum) \
GUARANTEE_TYPE (fname, argnum, MX_COM_OBJ_OR_TYPE, "com-object or com-type")
#define MX_DOCUMENTP(o) TYPE_PRED(o,mx_document_type)
#define MX_DOCUMENT_VAL(o) (((MX_Document_Object *)o)->pIHTMLDocument2)
#define GUARANTEE_DOCUMENT(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_DOCUMENTP, "mx-document")
#define MX_BROWSERP(o) TYPE_PRED(o,mx_browser_type)
#define MX_BROWSER_VAL(o) (((MX_Browser_Object *)o)->pIWebBrowser2)
#define MX_BROWSER_EVENTQUEUE(o) (((MX_Browser_Object *)o)->pIEventQueue)
#define MX_BROWSER_SINK(o) (((MX_Browser_Object *)o)->pISink)
#define MX_BROWSER_HWND(o) (((MX_Browser_Object *)o)->hwnd)
#define GUARANTEE_BROWSER(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_BROWSERP, "mx-browser")
#define MX_ELEMENTP(o) TYPE_PRED(o,mx_element_type)
#define MX_ELEMENT_VALIDITY(o) (((MX_Element *)o)->valid)
#define MX_ELEMENT_VAL(o) (((MX_Element *)o)->pIHTMLElement)
#define GUARANTEE_ELEMENT(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_ELEMENTP, "mx-element")
#define MX_EVENTP(o) TYPE_PRED(o,mx_event_type)
#define MX_EVENT_VAL(o) (((MX_Event *)o)->pEvent)
#define GUARANTEE_EVENT(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_EVENTP, "mx-event")
#define MX_CYP(o) TYPE_PRED(o,mx_com_cy_type)
#define MX_CY_VAL(o) (((MX_COM_Data_Object *)o)->cy)
#define GUARANTEE_CY(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_CYP, "mx-currency")
#define MX_DATEP(o) TYPE_PRED(o,mx_com_date_type)
#define MX_DATE_VAL(o) (((MX_COM_Data_Object *)o)->date)
#define GUARANTEE_DATE(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_DATEP, "mx-date")
#define MX_SCODEP(o) TYPE_PRED(o,mx_com_scode_type)
#define MX_SCODE_VAL(o) (((MX_COM_Data_Object *)o)->scode)
#define GUARANTEE_SCODE(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_SCODEP, "mx-scode")
#define MX_IUNKNOWNP(o) TYPE_PRED(o,mx_com_iunknown_type)
#define MX_IUNKNOWN_VAL(o) (((MX_COM_Data_Object *)o)->pIUnknown)
#define GUARANTEE_IUNKNOWN(fname, argnum) GUARANTEE_TYPE (fname, argnum, MX_SCODEP, "mx-iunknown")
#define SCHEME_NONNEGATIVE(thing) (SCHEME_INTP(thing) && SCHEME_INT_VAL(thing) >= 0)
#define GUARANTEE_NONNEGATIVE(fname, argnum) GUARANTEE_TYPE (fname, argnum, SCHEME_NONNEGATIVE, "non-negative integer")
extern const CLSID emptyClsId;
extern Scheme_Object *scheme_date_type;
extern Scheme_Type mx_com_object_type;
extern Scheme_Type mx_com_type_type;
extern Scheme_Type mx_browser_type;
extern Scheme_Type mx_document_type;
extern Scheme_Type mx_element_type;
extern Scheme_Type mx_event_type;
extern Scheme_Type mx_com_cy_type;
extern Scheme_Type mx_com_date_type;
extern Scheme_Type mx_com_scode_type;
extern Scheme_Type mx_com_iunknown_type;
extern Scheme_Type mx_com_omit_type;
extern Scheme_Type mx_com_typedesc_type;
extern Scheme_Type mx_tbl_entry_type;
extern Scheme_Object *hash_table_get;
extern Scheme_Object *hash_table_put;
extern Scheme_Object *hash_table_remove;
extern Scheme_Object *make_hash_table;
Scheme_Object *mx_make_cy(CY *);
Scheme_Object *mx_make_date(DATE *);
Scheme_Object *mx_make_bool(unsigned);
Scheme_Object *mx_make_scode(SCODE);
Scheme_Object *mx_make_idispatch(IDispatch *);
Scheme_Object *mx_make_iunknown(IUnknown *);
BOOL mx_cy_pred(Scheme_Object *);
BOOL mx_date_pred(Scheme_Object *);
BOOL mx_scode_pred(Scheme_Object *);
BOOL mx_comobj_pred(Scheme_Object *);
BOOL mx_iunknown_pred(Scheme_Object *);
CY mx_cy_val(Scheme_Object *);
DATE mx_date_val(Scheme_Object *);
SCODE mx_scode_val(Scheme_Object *);
IDispatch *mx_comobj_val(Scheme_Object *);
IUnknown *mx_iunknown_val(Scheme_Object *);
// version
MX_PRIM_DECL(mx_version);
// browsers
MX_PRIM_DECL(mx_browser_show);
MX_PRIM_DECL(mx_block_while_browsers);
MX_PRIM_DECL(mx_navigate);
MX_PRIM_DECL(mx_go_back);
MX_PRIM_DECL(mx_go_forward);
MX_PRIM_DECL(mx_refresh);
MX_PRIM_DECL(mx_iconize);
MX_PRIM_DECL(mx_restore);
MX_PRIM_DECL(mx_current_url);
MX_PRIM_DECL(mx_register_navigate_handler);
MX_PRIM_DECL(mx_make_browser);
MX_PRIM_DECL(mx_current_document);
MX_PRIM_DECL(mx_print);
// documents
MX_PRIM_DECL(mx_document_title);
MX_PRIM_DECL(mx_find_element);
MX_PRIM_DECL(mx_find_element_by_id_or_name);
MX_PRIM_DECL(mx_elements_with_tag);
MX_PRIM_DECL(mx_document_objects);
MX_PRIM_DECL(mx_coclass_to_html);
MX_PRIM_DECL(mx_progid_to_html);
MX_PRIM_DECL(mx_insert_html);
MX_PRIM_DECL(mx_append_html);
MX_PRIM_DECL(mx_replace_html);
MX_PRIM_DECL(mx_get_event);
MX_PRIM_DECL(mx_document_pred);
// COM
MX_PRIM_DECL(mx_com_terminate);
MX_PRIM_DECL(mx_com_invoke);
MX_PRIM_DECL(mx_com_set_property);
MX_PRIM_DECL(mx_com_get_property);
MX_PRIM_DECL(mx_com_methods);
MX_PRIM_DECL(mx_com_get_properties);
MX_PRIM_DECL(mx_com_set_properties);
MX_PRIM_DECL(mx_com_events);
MX_PRIM_DECL(mx_com_method_type);
MX_PRIM_DECL(mx_com_get_property_type);
MX_PRIM_DECL(mx_com_set_property_type);
MX_PRIM_DECL(mx_com_event_type);
MX_PRIM_DECL(mx_cocreate_instance_from_coclass);
MX_PRIM_DECL(mx_cocreate_instance_from_progid);
MX_PRIM_DECL(mx_coclass);
MX_PRIM_DECL(mx_progid);
MX_PRIM_DECL(mx_set_coclass);
MX_PRIM_DECL(mx_set_coclass_from_progid);
MX_PRIM_DECL(mx_com_object_eq);
MX_PRIM_DECL(mx_com_object_pred);
MX_PRIM_DECL(mx_com_register_object);
MX_PRIM_DECL(mx_com_release_object);
MX_PRIM_DECL(mx_com_add_ref);
MX_PRIM_DECL(mx_com_ref_count);
MX_PRIM_DECL(mx_com_get_object_type);
MX_PRIM_DECL(mx_com_is_a);
MX_PRIM_DECL(mx_com_help);
MX_PRIM_DECL(mx_com_register_event_handler);
MX_PRIM_DECL(mx_com_unregister_event_handler);
MX_PRIM_DECL(mx_all_controls);
MX_PRIM_DECL(mx_all_coclasses);
// COM types
MX_PRIM_DECL(mx_cy_pred_ex);
MX_PRIM_DECL(mx_currency_to_scheme_number);
MX_PRIM_DECL(scheme_number_to_mx_currency);
MX_PRIM_DECL(mx_date_pred_ex);
MX_PRIM_DECL(mx_date_to_scheme_date);
MX_PRIM_DECL(scheme_date_to_mx_date);
MX_PRIM_DECL(mx_scode_pred_ex);
MX_PRIM_DECL(mx_scode_to_scheme_number);
MX_PRIM_DECL(scheme_number_to_mx_scode);
MX_PRIM_DECL(mx_comobj_pred_ex);
MX_PRIM_DECL(mx_iunknown_pred_ex);
// elements
MX_PRIM_DECL(mx_element_insert_html);
MX_PRIM_DECL(mx_element_append_html);
MX_PRIM_DECL(mx_element_replace_html);
MX_PRIM_DECL(mx_element_insert_text);
MX_PRIM_DECL(mx_element_append_text);
MX_PRIM_DECL(mx_element_get_html);
MX_PRIM_DECL(mx_element_get_text);
MX_PRIM_DECL(mx_element_focus);
MX_PRIM_DECL(mx_element_selection);
MX_PRIM_DECL(mx_element_set_selection);
MX_PRIM_DECL(mx_element_attribute);
MX_PRIM_DECL(mx_element_set_attribute);
MX_PRIM_DECL(mx_element_click);
MX_PRIM_DECL(mx_element_tag);
MX_PRIM_DECL(mx_element_font_family);
MX_PRIM_DECL(mx_element_set_font_family);
MX_PRIM_DECL(mx_element_font_style);
MX_PRIM_DECL(mx_element_set_font_style);
MX_PRIM_DECL(mx_element_font_variant);
MX_PRIM_DECL(mx_element_set_font_variant);
MX_PRIM_DECL(mx_element_font_weight);
MX_PRIM_DECL(mx_element_set_font_weight);
MX_PRIM_DECL(mx_element_font);
MX_PRIM_DECL(mx_element_set_font);
MX_PRIM_DECL(mx_element_background);
MX_PRIM_DECL(mx_element_set_background);
MX_PRIM_DECL(mx_element_background_attachment);
MX_PRIM_DECL(mx_element_set_background_attachment);
MX_PRIM_DECL(mx_element_background_image);
MX_PRIM_DECL(mx_element_set_background_image);
MX_PRIM_DECL(mx_element_background_repeat);
MX_PRIM_DECL(mx_element_set_background_repeat);
MX_PRIM_DECL(mx_element_background_position);
MX_PRIM_DECL(mx_element_set_background_position);
MX_PRIM_DECL(mx_element_text_decoration);
MX_PRIM_DECL(mx_element_set_text_decoration);
MX_PRIM_DECL(mx_element_text_transform);
MX_PRIM_DECL(mx_element_set_text_transform);
MX_PRIM_DECL(mx_element_text_align);
MX_PRIM_DECL(mx_element_set_text_align);
MX_PRIM_DECL(mx_element_margin);
MX_PRIM_DECL(mx_element_set_margin);
MX_PRIM_DECL(mx_element_padding);
MX_PRIM_DECL(mx_element_set_padding);
MX_PRIM_DECL(mx_element_border);
MX_PRIM_DECL(mx_element_set_border);
MX_PRIM_DECL(mx_element_border_top);
MX_PRIM_DECL(mx_element_set_border_top);
MX_PRIM_DECL(mx_element_border_bottom);
MX_PRIM_DECL(mx_element_set_border_bottom);
MX_PRIM_DECL(mx_element_border_left);
MX_PRIM_DECL(mx_element_set_border_left);
MX_PRIM_DECL(mx_element_border_right);
MX_PRIM_DECL(mx_element_set_border_right);
MX_PRIM_DECL(mx_element_border_color);
MX_PRIM_DECL(mx_element_set_border_color);
MX_PRIM_DECL(mx_element_border_width);
MX_PRIM_DECL(mx_element_set_border_width);
MX_PRIM_DECL(mx_element_border_style);
MX_PRIM_DECL(mx_element_set_border_style);
MX_PRIM_DECL(mx_element_border_top_style);
MX_PRIM_DECL(mx_element_set_border_top_style);
MX_PRIM_DECL(mx_element_border_bottom_style);
MX_PRIM_DECL(mx_element_set_border_bottom_style);
MX_PRIM_DECL(mx_element_border_left_style);
MX_PRIM_DECL(mx_element_set_border_left_style);
MX_PRIM_DECL(mx_element_border_right_style);
MX_PRIM_DECL(mx_element_set_border_right_style);
MX_PRIM_DECL(mx_element_style_float);
MX_PRIM_DECL(mx_element_set_style_float);
MX_PRIM_DECL(mx_element_clear);
MX_PRIM_DECL(mx_element_set_clear);
MX_PRIM_DECL(mx_element_display);
MX_PRIM_DECL(mx_element_set_display);
MX_PRIM_DECL(mx_element_visibility);
MX_PRIM_DECL(mx_element_set_visibility);
MX_PRIM_DECL(mx_element_list_style_type);
MX_PRIM_DECL(mx_element_set_list_style_type);
MX_PRIM_DECL(mx_element_list_style_position);
MX_PRIM_DECL(mx_element_set_list_style_position);
MX_PRIM_DECL(mx_element_list_style_image);
MX_PRIM_DECL(mx_element_set_list_style_image);
MX_PRIM_DECL(mx_element_list_style);
MX_PRIM_DECL(mx_element_set_list_style);
MX_PRIM_DECL(mx_element_position);
MX_PRIM_DECL(mx_element_overflow);
MX_PRIM_DECL(mx_element_set_overflow);
MX_PRIM_DECL(mx_element_pagebreak_before);
MX_PRIM_DECL(mx_element_set_pagebreak_before);
MX_PRIM_DECL(mx_element_pagebreak_after);
MX_PRIM_DECL(mx_element_set_pagebreak_after);
MX_PRIM_DECL(mx_element_css_text);
MX_PRIM_DECL(mx_element_set_css_text);
MX_PRIM_DECL(mx_element_cursor);
MX_PRIM_DECL(mx_element_set_cursor);
MX_PRIM_DECL(mx_element_clip);
MX_PRIM_DECL(mx_element_set_clip);
MX_PRIM_DECL(mx_element_filter);
MX_PRIM_DECL(mx_element_set_filter);
MX_PRIM_DECL(mx_element_style_string);
MX_PRIM_DECL(mx_element_text_decoration_none);
MX_PRIM_DECL(mx_element_set_text_decoration_none);
MX_PRIM_DECL(mx_element_text_decoration_underline);
MX_PRIM_DECL(mx_element_set_text_decoration_underline);
MX_PRIM_DECL(mx_element_text_decoration_overline);
MX_PRIM_DECL(mx_element_set_text_decoration_overline);
MX_PRIM_DECL(mx_element_text_decoration_linethrough);
MX_PRIM_DECL(mx_element_set_text_decoration_linethrough);
MX_PRIM_DECL(mx_element_text_decoration_blink);
MX_PRIM_DECL(mx_element_set_text_decoration_blink);
MX_PRIM_DECL(mx_element_pixel_top);
MX_PRIM_DECL(mx_element_set_pixel_top);
MX_PRIM_DECL(mx_element_pixel_left);
MX_PRIM_DECL(mx_element_set_pixel_left);
MX_PRIM_DECL(mx_element_pixel_width);
MX_PRIM_DECL(mx_element_set_pixel_width);
MX_PRIM_DECL(mx_element_pixel_height);
MX_PRIM_DECL(mx_element_set_pixel_height);
MX_PRIM_DECL(mx_element_pos_top);
MX_PRIM_DECL(mx_element_set_pos_top);
MX_PRIM_DECL(mx_element_pos_left);
MX_PRIM_DECL(mx_element_set_pos_left);
MX_PRIM_DECL(mx_element_pos_width);
MX_PRIM_DECL(mx_element_set_pos_width);
MX_PRIM_DECL(mx_element_pos_height);
MX_PRIM_DECL(mx_element_set_pos_height);
MX_PRIM_DECL(mx_element_font_size);
MX_PRIM_DECL(mx_element_set_font_size);
MX_PRIM_DECL(mx_element_color);
MX_PRIM_DECL(mx_element_set_color);
MX_PRIM_DECL(mx_element_background_color);
MX_PRIM_DECL(mx_element_set_background_color);
MX_PRIM_DECL(mx_element_background_position_x);
MX_PRIM_DECL(mx_element_set_background_position_x);
MX_PRIM_DECL(mx_element_background_position_y);
MX_PRIM_DECL(mx_element_set_background_position_y);
MX_PRIM_DECL(mx_element_letter_spacing);
MX_PRIM_DECL(mx_element_set_letter_spacing);
MX_PRIM_DECL(mx_element_vertical_align);
MX_PRIM_DECL(mx_element_set_vertical_align);
MX_PRIM_DECL(mx_element_text_indent);
MX_PRIM_DECL(mx_element_set_text_indent);
MX_PRIM_DECL(mx_element_line_height);
MX_PRIM_DECL(mx_element_set_line_height);
MX_PRIM_DECL(mx_element_margin_top);
MX_PRIM_DECL(mx_element_set_margin_top);
MX_PRIM_DECL(mx_element_margin_bottom);
MX_PRIM_DECL(mx_element_set_margin_bottom);
MX_PRIM_DECL(mx_element_margin_left);
MX_PRIM_DECL(mx_element_set_margin_left);
MX_PRIM_DECL(mx_element_margin_right);
MX_PRIM_DECL(mx_element_set_margin_right);
MX_PRIM_DECL(mx_element_padding_top);
MX_PRIM_DECL(mx_element_set_padding_top);
MX_PRIM_DECL(mx_element_padding_bottom);
MX_PRIM_DECL(mx_element_set_padding_bottom);
MX_PRIM_DECL(mx_element_padding_left);
MX_PRIM_DECL(mx_element_set_padding_left);
MX_PRIM_DECL(mx_element_padding_right);
MX_PRIM_DECL(mx_element_set_padding_right);
MX_PRIM_DECL(mx_element_border_top_color);
MX_PRIM_DECL(mx_element_set_border_top_color);
MX_PRIM_DECL(mx_element_border_bottom_color);
MX_PRIM_DECL(mx_element_set_border_bottom_color);
MX_PRIM_DECL(mx_element_border_left_color);
MX_PRIM_DECL(mx_element_set_border_left_color);
MX_PRIM_DECL(mx_element_border_right_color);
MX_PRIM_DECL(mx_element_set_border_right_color);
MX_PRIM_DECL(mx_element_border_top_width);
MX_PRIM_DECL(mx_element_set_border_top_width);
MX_PRIM_DECL(mx_element_border_bottom_width);
MX_PRIM_DECL(mx_element_set_border_bottom_width);
MX_PRIM_DECL(mx_element_border_left_width);
MX_PRIM_DECL(mx_element_set_border_left_width);
MX_PRIM_DECL(mx_element_border_right_width);
MX_PRIM_DECL(mx_element_set_border_right_width);
MX_PRIM_DECL(mx_element_width);
MX_PRIM_DECL(mx_element_set_width);
MX_PRIM_DECL(mx_element_height);
MX_PRIM_DECL(mx_element_set_height);
MX_PRIM_DECL(mx_element_top);
MX_PRIM_DECL(mx_element_set_top);
MX_PRIM_DECL(mx_element_left);
MX_PRIM_DECL(mx_element_set_left);
MX_PRIM_DECL(mx_element_z_index);
MX_PRIM_DECL(mx_element_set_z_index);
// HTML events
MX_PRIM_DECL(mx_event_keypress_pred);
MX_PRIM_DECL(mx_event_keydown_pred);
MX_PRIM_DECL(mx_event_keyup_pred);
MX_PRIM_DECL(mx_event_mousedown_pred);
MX_PRIM_DECL(mx_event_mouseover_pred);
MX_PRIM_DECL(mx_event_mousemove_pred);
MX_PRIM_DECL(mx_event_mouseout_pred);
MX_PRIM_DECL(mx_event_mouseup_pred);
MX_PRIM_DECL(mx_event_click_pred);
MX_PRIM_DECL(mx_event_dblclick_pred);
MX_PRIM_DECL(mx_event_error_pred);
MX_PRIM_DECL(mx_event_tag);
MX_PRIM_DECL(mx_event_id);
MX_PRIM_DECL(mx_event_from_tag);
MX_PRIM_DECL(mx_event_from_id);
MX_PRIM_DECL(mx_event_to_tag);
MX_PRIM_DECL(mx_event_to_id);
MX_PRIM_DECL(mx_event_keycode);
MX_PRIM_DECL(mx_event_shiftkey);
MX_PRIM_DECL(mx_event_ctrlkey);
MX_PRIM_DECL(mx_event_altkey);
MX_PRIM_DECL(mx_event_x);
MX_PRIM_DECL(mx_event_y);
MX_PRIM_DECL(mx_event_pred);
MX_PRIM_DECL(mx_event_keypress_pred);
MX_PRIM_DECL(mx_event_keydown_pred);
MX_PRIM_DECL(mx_event_keyup_pred);
MX_PRIM_DECL(mx_event_mousedown_pred);
MX_PRIM_DECL(mx_event_mouseover_pred);
MX_PRIM_DECL(mx_event_mouseout_pred);
MX_PRIM_DECL(mx_event_mouseup_pred);
MX_PRIM_DECL(mx_event_click_pred);
MX_PRIM_DECL(mx_event_dblclick_pred);
MX_PRIM_DECL(mx_event_error_pred);
MX_PRIM_DECL(mx_block_until_event);
MX_PRIM_DECL(mx_process_win_events);
MX_PRIM_DECL(mx_release_type_table);
MX_PRIM_DECL(initialize_dotnet_runtime);
void browserHwndMsgLoop(LPVOID);
void mx_register_com_object(Scheme_Object *,IDispatch *);
void mx_register_simple_com_object(Scheme_Object *,IUnknown *);
void scheme_release_browser(void *,void *);
void scheme_release_document(void *,void *);
void codedComError(const char *,HRESULT);
IHTMLElementCollection *getBodyElementsWithTag(IHTMLElement *,LPCTSTR);
IDispatch *getElementInCollection(IHTMLElementCollection *,int);
IDispatch *getObjectInCollection(IHTMLElementCollection *,int);
Scheme_Object *variantToSchemeObject(VARIANTARG *);
void marshalSchemeValueToVariant(Scheme_Object *,VARIANTARG *);
void initEventNames(void);
IHTMLElement *findBodyElement(IHTMLDocument2 *,LPCTSTR,LPCTSTR,int);
CLSID getCLSIDFromCoClass (LPCTSTR);
ITypeInfo *eventTypeInfoFromComObject(MX_COM_Object *);
void signalCodedEventSinkError(char *,HRESULT);
// array procedures
Scheme_Object *safeArrayToSchemeVector(SAFEARRAY *);
SAFEARRAY *schemeVectorToSafeArray(Scheme_Object *);
extern MYSSINK_TABLE myssink_table;
extern HINSTANCE hInstance;
extern HICON hIcon;
extern HANDLE browserHwndMutex;
extern HANDLE createHwndSem;
extern HANDLE eventSinkMutex;
extern HWND browserHwnd;
extern BROWSER_WINDOW_STYLE_OPTION styleOptions[6];
extern WCHAR *eventNames[11];
// misc
extern unsigned long browserCount;
// inline assembly
/* for 4-byte values */
#define pusharg(v) \
__asm { \
push v \
}
/* for single-byte values */
#define pushByte(v) \
__asm { \
mov al,v \
} \
pusharg(eax)
/* for two-byte values */
#define pushShort(v) \
__asm { \
mov ax,v \
} \
pusharg(eax)
/* for 8-byte values */
#define pushWords(v) do \
{ ULONG loWord = (*(ULONG *)(&v)) & 0xFFFFFFFF; \
ULONG hiWord = (ULONG)((*(ULONGLONG *)(&v)) >> 32); \
pusharg(hiWord); \
pusharg(loWord); \
} while (0)
// push right to left
// i indexes argv's, j indexes COM type info
#define pushSuppliedArgs(pFuncDesc,numParamsPassed,argc,argv, \
argVas,vaPtr,va,i,j,lcidIndex,buff) \
do { \
/* j is index into COM type descriptions */ \
j = argc - 3; \
if (lcidIndex != NO_LCID && lcidIndex <= j + 1) { \
j++; \
} \
/* i is index into argv */ \
i = argc - 1; \
if (j > MAXDIRECTARGS - 1) { \
scheme_signal_error("Too many arguments to COM method or property"); \
} \
vaPtr = argVas + j; \
for ( ; j >= 0; i--,j--,vaPtr--) { \
VariantInit(vaPtr); \
if (j == lcidIndex) { \
vaPtr->vt = VT_UI4; \
vaPtr->ulVal = LOCALE_SYSTEM_DEFAULT; \
i++; \
} \
else if (argv[i] == mx_omit_obj) { \
vaPtr->vt = VT_ERROR; \
vaPtr->lVal = DISP_E_PARAMNOTFOUND; \
va = *vaPtr; \
pushVariant(va); \
continue; \
} \
else { \
vaPtr->vt = getVarTypeFromElemDesc(&pFuncDesc->lprgelemdescParam[j]); \
if (vaPtr->vt == VT_VARIANT) { \
marshalSchemeValueToVariant(argv[i],vaPtr); \
va = *vaPtr; \
pushVariant(va); \
continue; \
} \
marshalSchemeValue(argv[i],vaPtr); \
} \
va = *vaPtr; \
pushOneArg(va,buff); \
}; } while (0)
// push right to left
#define pushOptArgs(pFuncDesc,numParamsPassed,numOptParams, \
optArgVas,vaPtr,va,argc,i,j,lcidIndex,buff) \
do { \
if (numOptParams > 0) { \
/* i is index into param type descriptions */ \
i = numParamsPassed - 1; \
if (lcidIndex != NO_LCID) { \
i++; \
} \
/* j is size of VARIANT array */ \
j = i - argc + 3; \
/* lcid to be handled in supplied loop */ \
if (lcidIndex != NO_LCID && lcidIndex < argc - 3) { \
j--; \
} \
if (j > MAXDIRECTARGS) { \
scheme_signal_error("Too many arguments to COM method or property"); \
} \
vaPtr = optArgVas + (j - 1); \
for ( ; j > 0; i--,j--,vaPtr--) { \
VariantInit(vaPtr); \
if (isDefaultParam(pFuncDesc,i)) { \
vaPtr = &(pFuncDesc->lprgelemdescParam[i].paramdesc.pparamdescex->varDefaultValue); \
} \
else if (i == lcidIndex) { \
vaPtr->vt = VT_UI4; \
vaPtr->ulVal = LOCALE_SYSTEM_DEFAULT; \
} \
else { \
vaPtr->vt = VT_ERROR; \
vaPtr->lVal = DISP_E_PARAMNOTFOUND; \
va = *vaPtr; \
pushVariant(va); \
continue; \
} \
va = *vaPtr; \
pushOneArg(va,buff); \
} \
}; } while (0)
/* VARIANT is 16 bytes */
#define pushVariant(va) do {\
ULONGLONG loDword,hiDword; \
loDword = *(ULONGLONG *)&va; \
hiDword = *((ULONGLONG *)&va + 1); \
pushWords(hiDword); \
pushWords(loDword); \
} while (0)
#define pushOneArg(va,buff) \
do {\
switch(va.vt) { \
case VT_I8 : \
pushWords(va.llVal); \
break; \
case VT_I4 : \
pusharg(va.lVal); \
break; \
case VT_UI1 : \
pushByte(va.bVal); \
break; \
case VT_I2 : \
pushShort(va.iVal); \
break; \
case VT_R4 : \
pusharg(va.fltVal); \
break; \
case VT_R8 : \
pushWords(va.dblVal); \
break; \
case VT_BOOL : \
pushShort(va.boolVal); \
break; \
case VT_ERROR : \
pusharg(va.scode); \
break; \
case VT_CY : \
pusharg(va.cyVal); \
break; \
case VT_DATE : \
pushWords(va.date); \
break; \
case VT_BSTR : \
pusharg(va.bstrVal); \
break; \
case VT_UNKNOWN : \
pusharg(va.punkVal); \
break; \
case VT_DISPATCH : \
pusharg(va.pdispVal); \
break; \
case VT_ARRAY : \
pusharg(va.parray); \
break; \
case VT_BYREF|VT_UI1 : \
pusharg(va.pbVal); \
break; \
case VT_BYREF|VT_I2 : \
pusharg(va.piVal); \
break; \
case VT_BYREF|VT_I4 : \
pusharg(va.plVal); \
break; \
case VT_BYREF|VT_I8 : \
pusharg(va.pllVal); \
break; \
case VT_BYREF|VT_R4 : \
pusharg(va.pfltVal); \
break; \
case VT_BYREF|VT_R8 : \
pusharg(va.pdblVal); \
break; \
case VT_BYREF|VT_BOOL : \
pusharg(va.pboolVal); \
break; \
case VT_BYREF|VT_ERROR : \
pusharg(va.pscode); \
break; \
case VT_BYREF|VT_CY : \
pusharg(va.pcyVal); \
break; \
case VT_BYREF|VT_DATE : \
pusharg(va.pdate); \
break; \
case VT_BYREF|VT_BSTR : \
pusharg(va.pbstrVal); \
break; \
case VT_BYREF|VT_UNKNOWN : \
pusharg(va.ppunkVal); \
break; \
case VT_BYREF|VT_PTR : \
case VT_BYREF|VT_DISPATCH : \
pusharg(va.ppdispVal); \
break; \
case VT_BYREF|VT_SAFEARRAY : \
case VT_BYREF|VT_ARRAY : \
pusharg(va.pparray); \
break; \
case VT_BYREF|VT_VARIANT : \
pusharg(va.pvarVal); \
break; \
case VT_I1 : \
pushByte(va.cVal); \
break; \
case VT_UI2 : \
pushShort(va.uiVal); \
break; \
case VT_UI4 : \
pusharg(va.ulVal); \
break; \
case VT_UI8 : \
pushWords(va.ullVal); \
break; \
case VT_INT : \
pusharg(va.intVal); \
break; \
case VT_UINT : \
pusharg(va.uintVal); \
break; \
case VT_VOID : \
/* put property */ \
break; \
case VT_BYREF|VT_I1 : \
pusharg(va.puiVal); \
break; \
case VT_BYREF|VT_UI2 : \
pusharg(va.puiVal); \
break; \
case VT_BYREF|VT_UI4 : \
pusharg(va.pulVal); \
break; \
case VT_BYREF|VT_UI8 : \
pusharg(va.pullVal); \
break; \
case VT_BYREF|VT_INT : \
pusharg(va.pintVal); \
break; \
case VT_BYREF|VT_UINT : \
pusharg(va.puintVal); \
break; \
default : \
sprintf(buff,"Can't push argument with VARIANT tag = %X",va.vt); \
scheme_signal_error(buff); }; } while (0)
/* This indirection lets us delayload libmzsch.dll: */
#define scheme_false (scheme_make_false())
#define scheme_true (scheme_make_true())
#define scheme_void (scheme_make_void())
#define scheme_null (scheme_make_null())