summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2014-01-05 16:14:17 +0000
committerDaniel Silverstone <dsilvers@digital-scurf.org>2014-01-05 16:14:17 +0000
commit6bf609a1a4b313d49e5a657b2cf421c092aa1414 (patch)
tree68c20f5b2f9dbed3a270f42e22eb8c001290ee79
parentb1e6c63a2f00a84c1774d7a5165a7518d8bd7b4d (diff)
downloadnetsurf-6bf609a1a4b313d49e5a657b2cf421c092aa1414.tar.gz
netsurf-6bf609a1a4b313d49e5a657b2cf421c092aa1414.tar.bz2
Support image inputs
-rw-r--r--render/form.c24
-rw-r--r--render/form.h5
-rw-r--r--render/html.c2
-rw-r--r--render/html_interaction.c60
-rw-r--r--utils/corestrings.c3
-rw-r--r--utils/corestrings.h1
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