diff options
-rw-r--r-- | desktop/browser.c | 33 | ||||
-rw-r--r-- | desktop/gui.h | 1 | ||||
-rw-r--r-- | render/box.c | 69 | ||||
-rw-r--r-- | render/box.h | 15 | ||||
-rw-r--r-- | render/layout.c | 14 | ||||
-rw-r--r-- | riscos/gui.c | 56 | ||||
-rw-r--r-- | riscos/htmlredraw.c | 74 |
7 files changed, 241 insertions, 21 deletions
diff --git a/desktop/browser.c b/desktop/browser.c index 818ca4952..e4c98b3c2 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -468,6 +468,7 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x struct box_selection* click_boxes; int found, plot_index; int i; + unsigned long x, y; found = 0; click_boxes = NULL; @@ -516,8 +517,16 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x case GADGET_TEXTBOX: gui_edit_textbox(bw, g); break; + case GADGET_PASSWORD: + gui_edit_password(bw, g); case GADGET_HIDDEN: break; + case GADGET_IMAGE: + box_coords(click_boxes[i].box, &x, &y); + g->data.image.mx = click_x - x; + g->data.image.my = click_y - y; + browser_form_submit(bw, g->form); + break; } xfree(click_boxes); @@ -1025,6 +1034,8 @@ char* browser_form_construct_get(struct page_elements *elements, struct formsubm break; case GADGET_TEXTBOX: value = elements->gadgets[i]->data.textbox.text; break; + case GADGET_PASSWORD: value = elements->gadgets[i]->data.password.text; + break; case GADGET_RADIO: if(elements->gadgets[i]->data.radio.selected == -1) value = elements->gadgets[i]->data.radio.value; break; @@ -1043,6 +1054,28 @@ char* browser_form_construct_get(struct page_elements *elements, struct formsubm break; case GADGET_TEXTAREA: value = elements->gadgets[i]->data.textarea.text; break; + case GADGET_IMAGE: sprintf(elements->gadgets[i]->data.image.name, + "%s.x", + elements->gadgets[i]->data.image.n); + sprintf(elements->gadgets[i]->data.image.value, + "%d", + elements->gadgets[i]->data.image.mx); + browser_form_get_append(&ret, &length, + j == 0 ? '?' : '&', + elements->gadgets[i]->data.image.name, + elements->gadgets[i]->data.image.value); + sprintf(elements->gadgets[i]->data.image.name, + "%s.y", + elements->gadgets[i]->data.image.n); + sprintf(elements->gadgets[i]->data.image.value, + "%d", + elements->gadgets[i]->data.image.my); + browser_form_get_append(&ret, &length, + j == 0 ? '?' : '&', + elements->gadgets[i]->data.image.name, + elements->gadgets[i]->data.image.value); + j++; + break; default: break; } diff --git a/desktop/gui.h b/desktop/gui.h index 821d528b3..01f1f9fb5 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -61,5 +61,6 @@ void gui_window_stop_throbber(gui_window* g); void gui_gadget_combo(struct browser_window* bw, struct gui_gadget* g, unsigned long mx, unsigned long my); void gui_edit_textarea(struct browser_window* bw, struct gui_gadget* g); void gui_edit_textbox(struct browser_window* bw, struct gui_gadget* g); +void gui_edit_password(struct browser_window* bw, struct gui_gadget* g); #endif diff --git a/render/box.c b/render/box.c index 307df5848..382429bb1 100644 --- a/render/box.c +++ b/render/box.c @@ -751,13 +751,12 @@ struct result box_input(xmlNode *n, struct status *status, { struct box* box = 0; struct gui_gadget *gadget = 0; - char *s, *type; + char *s, *type, *url; type = (char *) xmlGetProp(n, (const xmlChar *) "type"); /* the default type is "text" */ - if (type == 0 || stricmp(type, "text") == 0 || - stricmp(type, "password") == 0) + if (type == 0 || stricmp(type, "text") == 0) { box = box_create(style, NULL, 0); box->gadget = gadget = xcalloc(1, sizeof(struct gui_gadget)); @@ -785,6 +784,34 @@ struct result box_input(xmlNode *n, struct status *status, } } + if (stricmp(type, "password") == 0) + { + box = box_create(style, NULL, 0); + box->gadget = gadget = xcalloc(1, sizeof(struct gui_gadget)); + gadget->type = GADGET_PASSWORD; + + gadget->data.password.maxlength = 32; + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "maxlength"))) { + gadget->data.password.maxlength = atoi(s); + xmlFree(s); + } + + gadget->data.password.size = box->gadget->data.password.maxlength; + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "size"))) { + gadget->data.password.size = atoi(s); + xmlFree(s); + } + + gadget->data.password.text = xcalloc( + gadget->data.password.maxlength + 2, sizeof(char)); + + if ((s = (char *) xmlGetProp(n, (const xmlChar *) "value"))) { + strncpy(gadget->data.password.text, s, + gadget->data.password.maxlength); + xmlFree(s); + } + + } else if (stricmp(type, "hidden") == 0) { /* no box for hidden inputs */ @@ -835,6 +862,29 @@ struct result box_input(xmlNode *n, struct status *status, box->gadget->data.actionbutt.butttype = strdup(type); } + else if (stricmp(type, "image") == 0) + { + box = box_create(style, NULL, 0); + box->gadget = gadget = xcalloc(1, sizeof(struct gui_gadget)); + gadget->type = GADGET_IMAGE; + if ((s = (char *) xmlGetProp(n, (const xmlChar*) "name"))) { + gadget->data.image.n = s; + } + if ((s = (char *) xmlGetProp(n, (const xmlChar*) "width"))) { + gadget->data.image.width = (atoi(s)); + } + if ((s = (char *) xmlGetProp(n, (const xmlChar*) "height"))) { + gadget->data.image.height = (atoi(s)); + } + if ((s = (char *) xmlGetProp(n, (const xmlChar*) "src"))) { + url = url_join(strdup(s), status->content->url); + html_fetch_object(status->content, url, box); + } + gadget->data.image.name = + xcalloc(strlen(gadget->data.image.n) + 5, sizeof(char)); + gadget->data.image.value = + xcalloc(strlen(gadget->data.image.n) + 20, sizeof(char)); + } if (type != 0) xmlFree(type); @@ -1319,10 +1369,23 @@ void gadget_free(struct gui_gadget* g) if (g->data.textbox.text != 0) xmlFree(g->data.textbox.text); break; + case GADGET_PASSWORD: + gui_remove_gadget(g); + if (g->data.password.text != 0) + xmlFree(g->data.password.text); + break; case GADGET_ACTIONBUTTON: if (g->data.actionbutt.label != 0) xmlFree(g->data.actionbutt.label); break; + case GADGET_IMAGE: + if (g->data.image.n != 0) + xmlFree(g->data.image.n); + if (g->data.image.name != 0) + xfree(g->data.image.name); + if (g->data.image.value != 0) + xfree(g->data.image.value); + break; case GADGET_SELECT: o = g->data.select.items; while (o != NULL) diff --git a/render/box.h b/render/box.h index a00daee48..002bb0601 100644 --- a/render/box.h +++ b/render/box.h @@ -40,7 +40,8 @@ struct formoption { struct gui_gadget { enum { GADGET_HIDDEN = 0, GADGET_TEXTBOX, GADGET_RADIO, GADGET_CHECKBOX, - GADGET_SELECT, GADGET_TEXTAREA, GADGET_ACTIONBUTTON } type; + GADGET_SELECT, GADGET_TEXTAREA, GADGET_ACTIONBUTTON, + GADGET_IMAGE, GADGET_PASSWORD } type; char* name; struct form* form; union { @@ -53,11 +54,23 @@ struct gui_gadget { int size; } textbox; struct { + unsigned int maxlength; + char* text; + int size; + } password; + struct { char* butttype; char* label; int pressed; } actionbutt; struct { + char* name; + char* value; + char* n; + int width, height; + int mx, my; + } image; + struct { int numitems; struct formoption* items; int size; diff --git a/render/layout.c b/render/layout.c index f428ae36d..9a6785025 100644 --- a/render/layout.c +++ b/render/layout.c @@ -101,7 +101,7 @@ int gadget_width(struct gui_gadget* gadget) struct formoption* current; int max; - /* should use wimp_textop via a gui wraper for these */ + /* should use wimp_textop via a gui wrapper for these */ switch (gadget->type) { case GADGET_CHECKBOX: @@ -109,8 +109,12 @@ int gadget_width(struct gui_gadget* gadget) return 22; case GADGET_TEXTBOX: return gadget->data.textbox.size * 8; + case GADGET_PASSWORD: + return gadget->data.password.size * 8; case GADGET_ACTIONBUTTON: return strlen(gadget->data.actionbutt.label) * 8 + 16; + case GADGET_IMAGE: + return gadget->data.image.width; case GADGET_SELECT: current = gadget->data.select.items; max = 32; @@ -138,10 +142,14 @@ int gadget_height(struct gui_gadget* gadget) return 22; case GADGET_TEXTBOX: return 28; + case GADGET_PASSWORD: + return 28; case GADGET_ACTIONBUTTON: return 28; + case GADGET_IMAGE: + return gadget->data.image.height; case GADGET_SELECT: - return 28; + return 28; // * gadget->data.select.size; case GADGET_TEXTAREA: return gadget->data.textarea.rows * 16 + 8; default: @@ -925,7 +933,7 @@ void calculate_table_widths(struct box *table) col = table->col; else col = xcalloc(table->columns, sizeof(*col)); - + assert(table->children != 0 && table->children->children != 0); for (pass = 0; pass != 2; pass++) { for (row_group = table->children; row_group != 0; row_group = row_group->next) { diff --git a/riscos/gui.c b/riscos/gui.c index 5f964c6e0..40113dc0e 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -35,6 +35,7 @@ const char *__dynamic_da_name = "NetSurf"; static char empty_text[] = ""; +static char password_v[] = "D*"; char *NETSURF_DIR; gui_window *window_list = 0; @@ -1318,7 +1319,7 @@ void gui_multitask(void) case message_QUIT : netsurf_quit = 1; break; - + default: ro_gui_poll_queue(event, &block); break; @@ -1860,6 +1861,59 @@ void gui_edit_textbox(struct browser_window* bw, struct gui_gadget* g) wimp_set_caret_position(current_textbox_w, current_textbox_i, 0,0,-1, offset); } +void gui_edit_password(struct browser_window* bw, struct gui_gadget* g) +{ + wimp_icon_create icon; + wimp_pointer pointer; + wimp_window_state state; + int pointer_x; + int letter_x; + int textbox_x; + int offset; + + wimp_get_pointer_info(&pointer); + + if (current_textbox != 0) + { + wimp_delete_icon(current_textbox_w, current_textbox_i); + gui_redraw_gadget(current_textbox_bw, current_textbox); + } + + current_textbox_bw = bw; + current_textbox_w = bw->window->data.browser.window; + + icon.w = current_textbox_w; + gui_set_gadget_extent(bw->current_content->data.html.layout->children, 0, 0, &icon.icon.extent, g); + fprintf(stderr, "ICON EXTENT %d %d %d %d\n", icon.icon.extent.x0, icon.icon.extent.y0, icon.icon.extent.x1, icon.icon.extent.y1); + icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_BORDER | + wimp_ICON_VCENTRED | wimp_ICON_FILLED | + wimp_ICON_INDIRECTED | + (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | + (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT) | + (wimp_BUTTON_WRITABLE << wimp_ICON_BUTTON_TYPE_SHIFT); + icon.icon.data.indirected_text.text = g->data.password.text; + icon.icon.data.indirected_text.size = g->data.password.maxlength + 1; + icon.icon.data.indirected_text.validation = password_v; + current_textbox_i = wimp_create_icon(&icon); + current_textbox = g; + gui_redraw_gadget(bw, current_textbox); + + state.w = current_textbox_w; + wimp_get_window_state(&state); + pointer_x = window_x_units(pointer.pos.x, &state); + textbox_x = icon.icon.extent.x0; + offset = strlen(g->data.password.text); + while (offset > 0) + { + letter_x = wimptextop_string_width(g->data.password.text, offset); + if (letter_x < pointer_x - textbox_x) + break; + offset--; + } + + wimp_set_caret_position(current_textbox_w, current_textbox_i, 0,0,-1, offset); +} + void gui_remove_gadget(struct gui_gadget* g) { if (g == current_textbox && g != 0) diff --git a/riscos/htmlredraw.c b/riscos/htmlredraw.c index d3ef7d500..588dde2a3 100644 --- a/riscos/htmlredraw.c +++ b/riscos/htmlredraw.c @@ -50,6 +50,7 @@ void html_redraw(struct content *c, long x, long y, /* validation strings can't be const */ static char validation_textarea[] = "R7;L"; static char validation_textbox[] = ""; +static char validation_password[] = "D*"; static char validation_actionbutton[] = "R5"; static char validation_actionbutton_pressed[] = "R5,3"; static char validation_select[] = "R2"; @@ -72,6 +73,7 @@ void html_redraw_box(struct content *content, struct box * box, struct box * c; char* select_text; struct formoption* opt; + int i; if (x + (signed long) (box->x*2 + box->width*2) /* right edge */ >= clip->x0 && x + (signed long) (box->x*2) /* left edge */ <= clip->x1 && @@ -143,6 +145,19 @@ void html_redraw_box(struct content *content, struct box * box, wimp_plot_icon(&icon); break; + case GADGET_PASSWORD: + icon.flags = wimp_ICON_TEXT | wimp_ICON_BORDER | + wimp_ICON_VCENTRED | wimp_ICON_FILLED | + wimp_ICON_INDIRECTED | + (wimp_COLOUR_DARK_GREY << wimp_ICON_FG_COLOUR_SHIFT) | + (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT); + icon.data.indirected_text.text = box->gadget->data.password.text; + icon.data.indirected_text.size = box->gadget->data.password.maxlength + 1; + icon.data.indirected_text.validation = validation_password; + LOG(("writing GADGET PASSWORD")); + wimp_plot_icon(&icon); + break; + case GADGET_ACTIONBUTTON: icon.flags = wimp_ICON_TEXT | wimp_ICON_BORDER | wimp_ICON_VCENTRED | wimp_ICON_FILLED | @@ -172,20 +187,52 @@ void html_redraw_box(struct content *content, struct box * box, (wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT); select_text = 0; opt = box->gadget->data.select.items; - while (opt != NULL) - { - if (opt->selected) - { - if (select_text == 0) - select_text = opt->text; - else - select_text = select_text_multiple; - } - opt = opt->next; +// if (box->gadget->data.select.size == 1) { + while (opt != NULL) + { + if (opt->selected) + { + if (select_text == 0) + select_text = opt->text; + else + select_text = select_text_multiple; + } + opt = opt->next; + } + if (select_text == 0) + select_text = select_text_none; +/* } + else { + while (opt != NULL) + { + if (opt->selected) + { + select_text = opt->text; + opt = opt->next; + break; + } + opt = opt->next; + } + if (select_text == 0) { + // display the first n options + opt = box->gadget->data.select.items; + select_text = opt->text; + opt = opt->next; + for(i = box->gadget->data.select.size-1; + i != 0; i--, opt=opt->next) { + strcat(select_text, "\n"); + strcat(select_text, opt->text); + } + } + else { + for(i = box->gadget->data.select.size-1; + i != 0; i--, opt=opt->next) { + strcat(select_text, "\n"); + strcat(select_text, opt->text); + } + } } - if (select_text == 0) - select_text = select_text_none; - icon.data.indirected_text.text = select_text; +*/ icon.data.indirected_text.text = select_text; icon.data.indirected_text.size = strlen(icon.data.indirected_text.text); icon.data.indirected_text.validation = validation_select; LOG(("writing GADGET ACTION")); @@ -218,6 +265,7 @@ void html_redraw_box(struct content *content, struct box * box, break; case GADGET_HIDDEN: + case GADGET_IMAGE: break; } LOG(("gadgets finished")); |