diff options
author | James Bursa <james@netsurf-browser.org> | 2004-05-03 22:05:40 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2004-05-03 22:05:40 +0000 |
commit | 8da6079f6f777e509c84f552b6a31f02698599b0 (patch) | |
tree | 728d29ae023e6402502ab7cec2bbc2209995d78a /riscos/window.c | |
parent | 24c57d3215f7e906ee312f19c6b1a870e984e765 (diff) | |
download | netsurf-8da6079f6f777e509c84f552b6a31f02698599b0.tar.gz netsurf-8da6079f6f777e509c84f552b6a31f02698599b0.tar.bz2 |
[project @ 2004-05-03 22:05:40 by bursa]
Implement dragging files into <input type="file" ...>.
svn path=/import/netsurf/; revision=821
Diffstat (limited to 'riscos/window.c')
-rw-r--r-- | riscos/window.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/riscos/window.c b/riscos/window.c index 9a245028a..cbe37e166 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -27,6 +27,7 @@ #include "netsurf/riscos/save_draw.h" #include "netsurf/riscos/theme.h" #include "netsurf/riscos/thumbnail.h" +#include "netsurf/render/form.h" #include "netsurf/utils/log.h" #include "netsurf/utils/url.h" #include "netsurf/utils/utils.h" @@ -1003,3 +1004,73 @@ int window_y_units(int y, wimp_window_state *state) { return y - (state->visible.y1 - state->yscroll); } + + +/** + * Handle Message_DataLoad (file dragged in) for a window. + * + * \param g window + * \param message Message_DataLoad block + * \return true if the load was processed + * + * If the file was dragged into a form file input, it is used as the value. + */ + +bool ro_gui_window_dataload(gui_window *g, wimp_message *message) +{ + struct browser_window *bw = g->data.browser.bw; + struct box_selection *click_boxes = 0; + int x, y; + int i; + int found = 0; + int plot_index = 0; + wimp_window_state state; + + /* HTML content only. */ + if (!bw->current_content || bw->current_content->type != CONTENT_HTML) + return false; + + /* Ignore directories etc. */ + if (0x1000 <= message->data.data_xfer.file_type) + return false; + + /* Search for a file input at the drop point. */ + state.w = message->data.data_xfer.w; + wimp_get_window_state(&state); + x = window_x_units(message->data.data_xfer.pos.x, &state) / 2; + y = -window_y_units(message->data.data_xfer.pos.y, &state) / 2; + + box_under_area(bw->current_content, + bw->current_content->data.html.layout->children, + x, y, 0, 0, &click_boxes, &found, &plot_index); + if (found == 0) + return false; + for (i = 0; i != found; i++) { + if (click_boxes[i].box->gadget && + click_boxes[i].box->gadget->type == + GADGET_FILE) + break; + } + if (i == found) { + free(click_boxes); + return false; + } + + /* Found: update form input. */ + free(click_boxes[i].box->gadget->value); + click_boxes[i].box->gadget->value = + strdup(message->data.data_xfer.file_name); + + /* Redraw box. */ + box_coords(click_boxes[i].box, &x, &y); + gui_window_redraw(bw->window, x, y, + x + click_boxes[i].box->width, + y + click_boxes[i].box->height); + + /* send DataLoadAck */ + message->action = message_DATA_LOAD_ACK; + message->your_ref = message->my_ref; + wimp_send_message(wimp_USER_MESSAGE, message, message->sender); + + return true; +} |