From 6bf609a1a4b313d49e5a657b2cf421c092aa1414 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 5 Jan 2014 16:14:17 +0000 Subject: Support image inputs --- render/form.c | 24 ++++++++++++------- render/form.h | 5 ++++ render/html.c | 2 +- render/html_interaction.c | 60 +++++++++++++++++++++++++++++++++++++++++++++-- utils/corestrings.c | 3 +++ utils/corestrings.h | 1 + 6 files changed, 84 insertions(+), 11 deletions(-) diff --git a/render/form.c b/render/form.c index 48648b103..b55ec171c 100644 --- a/render/form.c +++ b/render/form.c @@ -353,6 +353,7 @@ bool form_successful_controls_dom(struct form *_form, bool had_submit = false, element_disabled; char *charset, *rawfile_temp = NULL, *basename; uint32_t index, element_count; + struct image_input_coords *coords; last_success = &sentinel; sentinel.next = NULL; @@ -615,6 +616,19 @@ bool form_successful_controls_dom(struct form *_form, (dom_node *)form_element) continue; + err = dom_node_get_user_data( + form_element, + corestring_dom___ns_key_image_coords_node_data, + &coords); + if (err != DOM_NO_ERR) { + LOG(("Could not get image XY data")); + goto dom_no_memory; + } + if (coords == NULL) { + LOG(("No XY data on the image input")); + goto dom_no_memory; + } + basename = ENCODE_ITEM(inputname); success_new = calloc(1, sizeof(*success_new)); @@ -640,10 +654,7 @@ bool form_successful_controls_dom(struct form *_form, goto dom_no_memory; } sprintf(success_new->name, "%s.x", basename); - /** \todo Store this on the node and - * retrieve it here - */ - sprintf(success_new->value, "%d", 0); + sprintf(success_new->value, "%d", coords->x); success_new = calloc(1, sizeof(*success_new)); if (success_new == NULL) { @@ -668,10 +679,7 @@ bool form_successful_controls_dom(struct form *_form, goto dom_no_memory; } sprintf(success_new->name, "%s.y", basename); - /** \todo Store this on the node and - * retrieve it here - */ - sprintf(success_new->value, "%d", 0); + sprintf(success_new->value, "%d", coords->y); free(basename); continue; } else if (dom_string_caseless_isequal( diff --git a/render/form.h b/render/form.h index e65206d33..78211ee19 100644 --- a/render/form.h +++ b/render/form.h @@ -134,6 +134,11 @@ struct form_option { struct form_option* next; }; +struct image_input_coords { + int x; + int y; +}; + /** * Called by the select menu when it wants an area to be redrawn. The * coordinates are menu origin relative. diff --git a/render/html.c b/render/html.c index 04b2fda18..25147a0a0 100644 --- a/render/html.c +++ b/render/html.c @@ -1732,7 +1732,7 @@ static void html__dom_user_data_handler(dom_node_operation operation, char *oldfile; char *data = (char *)_data; - if (!dom_string_isequal(corestring_dom___ns_key_libcss_node_data, + if (!dom_string_isequal(corestring_dom___ns_key_file_name_node_data, key) || data == NULL) { return; } diff --git a/render/html_interaction.c b/render/html_interaction.c index f18daebd4..5d69c987f 100644 --- a/render/html_interaction.c +++ b/render/html_interaction.c @@ -45,8 +45,10 @@ #include "render/imagemap.h" #include "render/search.h" #include "javascript/js.h" +#include "utils/corestrings.h" #include "utils/messages.h" #include "utils/utils.h" +#include "utils/log.h" /** @@ -228,6 +230,47 @@ void html_mouse_track(struct content *c, struct browser_window *bw, html_mouse_action(c, bw, mouse, x, y); } +/** Helper for file gadgets to store their filename unencoded on the + * dom node associated with the gadget. + * + * \todo Get rid of this crap eventually + */ +static void html__image_coords_dom_user_data_handler(dom_node_operation operation, + dom_string *key, void *_data, struct dom_node *src, + struct dom_node *dst) +{ + struct image_input_coords *oldcoords, *coords = _data, *newcoords; + + if (!dom_string_isequal(corestring_dom___ns_key_image_coords_node_data, + key) || coords == NULL) { + return; + } + + switch (operation) { + case DOM_NODE_CLONED: + newcoords = calloc(1, sizeof(*newcoords)); + *newcoords = *coords; + if (dom_node_set_user_data(dst, + corestring_dom___ns_key_image_coords_node_data, + newcoords, html__image_coords_dom_user_data_handler, + &oldcoords) == DOM_NO_ERR) { + free(oldcoords); + } + break; + + case DOM_NODE_RENAMED: + case DOM_NODE_IMPORTED: + case DOM_NODE_ADOPTED: + break; + + case DOM_NODE_DELETED: + free(coords); + break; + default: + LOG(("User data operation not handled.")); + assert(0); + } +} /** * Handle mouse clicks and movements in an HTML content window. @@ -630,8 +673,21 @@ void html_mouse_action(struct content *c, struct browser_window *bw, break; case GADGET_IMAGE: if (mouse & BROWSER_MOUSE_CLICK_1) { - gadget->data.image.mx = x - gadget_box_x; - gadget->data.image.my = y - gadget_box_y; + struct image_input_coords *coords, *oldcoords; + /** \todo Find a way to not ignore errors */ + coords = calloc(1, sizeof(*coords)); + if (coords == NULL) { + return; + } + coords->x = x - gadget_box_x; + coords->y = y - gadget_box_y; + if (dom_node_set_user_data( + gadget->node, + corestring_dom___ns_key_image_coords_node_data, + coords, html__image_coords_dom_user_data_handler, + &oldcoords) != DOM_NO_ERR) + return; + free(oldcoords); } /* drop through */ case GADGET_SUBMIT: diff --git a/utils/corestrings.c b/utils/corestrings.c index 9050ffe48..e60a75bdc 100644 --- a/utils/corestrings.c +++ b/utils/corestrings.c @@ -244,6 +244,7 @@ dom_string *corestring_dom_file; dom_string *corestring_dom_on; dom_string *corestring_dom___ns_key_libcss_node_data; dom_string *corestring_dom___ns_key_file_name_node_data; +dom_string *corestring_dom___ns_key_image_coords_node_data; /* * Free the core strings @@ -488,6 +489,7 @@ void corestrings_fini(void) /* DOM userdata keys, not really CSS */ CSS_DOM_STRING_UNREF(__ns_key_libcss_node_data); CSS_DOM_STRING_UNREF(__ns_key_file_name_node_data); + CSS_DOM_STRING_UNREF(__ns_key_image_coords_node_data); #undef CSS_DOM_STRING_UNREF } @@ -763,6 +765,7 @@ nserror corestrings_init(void) /* DOM userdata keys, not really CSS */ CSS_DOM_STRING_INTERN(__ns_key_libcss_node_data); CSS_DOM_STRING_INTERN(__ns_key_file_name_node_data); + CSS_DOM_STRING_INTERN(__ns_key_image_coords_node_data); #undef CSS_DOM_STRING_INTERN exc = dom_string_create_interned((const uint8_t *) "text/javascript", diff --git a/utils/corestrings.h b/utils/corestrings.h index 839d86522..90fef5aaa 100644 --- a/utils/corestrings.h +++ b/utils/corestrings.h @@ -255,6 +255,7 @@ extern struct dom_string *corestring_dom_on; /* DOM userdata keys */ extern struct dom_string *corestring_dom___ns_key_libcss_node_data; extern struct dom_string *corestring_dom___ns_key_file_name_node_data; +extern struct dom_string *corestring_dom___ns_key_image_coords_node_data; #endif -- cgit v1.2.3