Rendering library ================= General notes ------------- + Potentially long-running routines probably want to exit early and ask to be resumed (or similar) + There's loads of stuff missing from here (like a typesystem :) Possible API ------------ /* Initialise library */ error html_init(void); /* Finalise library */ error html_fini(void); /* Create a context */ ctx html_create(void); /* Destroy a context */ void html_destroy(ctx); /* Configure a context * * Things that need configuring: * * Callbacks from library -> client: * * + Handler for embedded object fetch requests (how to handle frames?) * + Event notification handler (e.g. form submission / link navigation, * mouse pointer shape changing, redraw request, position caret, etc) * * Other stuff: * * + Scale? (should this be handled by the client?) * + Whether to run scripts? (possibly, not needed yet) */ error html_setopt(ctx, opttype, optparams); /* Feed HTML data to a context */ error html_process_data(ctx, data, len); /* Flag end of data to context */ error html_data_done(ctx); /* Reflow context, to given width/height */ error html_reflow(ctx, width, height); /* Redraw context, using provided plotters */ error html_redraw(ctx, rect, plot_table); /* Some kind of input event notification APIs. * These are called by the client to notify the library * that something's happened. * * e.g.: */ error html_mouse_move(ctx, x, y); error html_mouse_press(ctx, x, y, buttons, modifiers); error html_mouse_release(ctx, x, y, buttons, modifiers); error html_key_press(ctx, key, modifiers); error html_key_release(ctx, key, modifiers); error html_scroll_x(ctx, offset); error html_scroll_y(ctx, offset); /* Retrieve properties of document in context * * e.g.: */ error html_get_title(ctx, title); Example usage ------------- /* Main routine */ main: /* Initialise library */ html_init(); /* Create a context */ ctx = html_create(); /* Configure the context */ html_setopt(ctx, FETCH_HANDLER, my_fetcher); html_setopt(ctx, EVENT_HANDLER, my_event_handler); /* Get it to process data */ foreach (chunk, len) in data: html_process_data(ctx, chunk, len); html_data_done(ctx); /* Reflow content to desired dimensions */ html_reflow(ctx, width, height); /* Main client event loop -- processes UI-toolkit events */ do: on mouse event: html_mouse_{move,press,release}(ctx, event.x, event.y ...); on key event: html_key_{press,release}{ctx, event.key, event.modifiers); on scroll event: html_scroll_{x,y}(ctx, event.offset); on redraw event: html_redraw(ctx, event.rect, my_plotters); until quit; /* Destroy context */ html_destroy(ctx); /* Finalise library */ html_fini(); /* Event handler for library-generated events */ my_event_handler: on pointer shape change: set_pointer_shape(shape); on redraw request: redraw_window(window); on position caret: position caret(x, y);