diff options
author | James Bursa <james@netsurf-browser.org> | 2003-09-28 23:41:07 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2003-09-28 23:41:07 +0000 |
commit | 73f7db2a75a7cee2add50973e8861b767f5bb650 (patch) | |
tree | bc546b7a31ae7b7f95e83ae42d6568c4df23fdc4 /desktop | |
parent | fd7078b1ad470c3de96d32c3699eb862259df990 (diff) | |
download | netsurf-73f7db2a75a7cee2add50973e8861b767f5bb650.tar.gz netsurf-73f7db2a75a7cee2add50973e8861b767f5bb650.tar.bz2 |
[project @ 2003-09-28 23:41:06 by bursa]
Rewrite text and password inputs to stop using wimp icons.
svn path=/import/netsurf/; revision=330
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/browser.c | 152 | ||||
-rw-r--r-- | desktop/gui.h | 2 |
2 files changed, 130 insertions, 24 deletions
diff --git a/desktop/browser.c b/desktop/browser.c index 1b0a85d88..cc845d4e5 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -51,6 +51,11 @@ static void browser_window_textarea_click(struct browser_window* bw, unsigned long x, unsigned long y, struct box *box); static void browser_window_textarea_callback(struct browser_window *bw, char key, void *p); +static void browser_window_input_click(struct browser_window* bw, + unsigned long actual_x, unsigned long actual_y, + unsigned long x, unsigned long y, + struct box *input); +static void browser_window_input_callback(struct browser_window *bw, char key, void *p); static void browser_window_place_caret(struct browser_window *bw, int x, int y, int height, void (*callback)(struct browser_window *bw, char key, void *p), void *p); @@ -318,14 +323,6 @@ void browser_window_callback(content_msg msg, struct content *c, if (bw->current_content != NULL) { - if (bw->current_content->type == CONTENT_HTML) - { - int gc; - for (gc = 0; gc < bw->current_content->data.html.elements.numGadgets; gc++) - { - gui_remove_gadget(bw->current_content->data.html.elements.gadgets[gc]); - } - } if (bw->current_content->status == CONTENT_STATUS_DONE) content_remove_instance(bw->current_content, bw, 0, 0, 0, &bw->current_content_state); content_remove_user(bw->current_content, browser_window_callback, bw, 0); @@ -534,10 +531,14 @@ int browser_window_gadget_click(struct browser_window* bw, unsigned long click_x click_boxes[i].box); break; case GADGET_TEXTBOX: - gui_edit_textbox(bw, g); - break; case GADGET_PASSWORD: - gui_edit_password(bw, g); + browser_window_input_click(bw, + click_boxes[i].actual_x, + click_boxes[i].actual_y, + click_x - click_boxes[i].actual_x, + click_y - click_boxes[i].actual_y, + click_boxes[i].box); + break; case GADGET_HIDDEN: break; case GADGET_IMAGE: @@ -611,9 +612,9 @@ void browser_window_textarea_click(struct browser_window* bw, &char_offset, &pixel_offset); } } - textarea->gadget->data.textarea.caret_inline_container = inline_container; - textarea->gadget->data.textarea.caret_text_box = text_box; - textarea->gadget->data.textarea.caret_char_offset = char_offset; + textarea->gadget->caret_inline_container = inline_container; + textarea->gadget->caret_text_box = text_box; + textarea->gadget->caret_char_offset = char_offset; browser_window_place_caret(bw, actual_x + text_box->x + pixel_offset, actual_y + inline_container->y + text_box->y, text_box->height, @@ -628,9 +629,9 @@ void browser_window_textarea_click(struct browser_window* bw, void browser_window_textarea_callback(struct browser_window *bw, char key, void *p) { struct box *textarea = p; - struct box *inline_container = textarea->gadget->data.textarea.caret_inline_container; - struct box *text_box = textarea->gadget->data.textarea.caret_text_box; - int char_offset = textarea->gadget->data.textarea.caret_char_offset; + struct box *inline_container = textarea->gadget->caret_inline_container; + struct box *text_box = textarea->gadget->caret_text_box; + int char_offset = textarea->gadget->caret_char_offset; int pixel_offset; unsigned long actual_x, actual_y; unsigned long width, height; @@ -798,9 +799,9 @@ void browser_window_textarea_callback(struct browser_window *bw, char key, void pixel_offset = font_width(text_box->font, text_box->text, char_offset); - textarea->gadget->data.textarea.caret_inline_container = inline_container; - textarea->gadget->data.textarea.caret_text_box = text_box; - textarea->gadget->data.textarea.caret_char_offset = char_offset; + textarea->gadget->caret_inline_container = inline_container; + textarea->gadget->caret_text_box = text_box; + textarea->gadget->caret_char_offset = char_offset; browser_window_place_caret(bw, actual_x + text_box->x + pixel_offset, actual_y + inline_container->y + text_box->y, text_box->height, @@ -815,6 +816,113 @@ void browser_window_textarea_callback(struct browser_window *bw, char key, void /** + * Handle clicks in a text or password input box by placing the caret. + */ + +void browser_window_input_click(struct browser_window* bw, + unsigned long actual_x, unsigned long actual_y, + unsigned long x, unsigned long y, + struct box *input) +{ + int char_offset, pixel_offset; + struct box *text_box = input->children->children; + + font_position_in_string(text_box->text, text_box->font, + text_box->length, x - text_box->x, + &char_offset, &pixel_offset); + + text_box->x = 0; + if ((input->width < text_box->width) && (input->width / 2 < pixel_offset)) { + text_box->x = input->width / 2 - pixel_offset; + if (text_box->x < input->width - text_box->width) + text_box->x = input->width - text_box->width; + } + input->gadget->caret_char_offset = char_offset; + browser_window_place_caret(bw, actual_x + text_box->x + pixel_offset, + actual_y + text_box->y, + text_box->height, + browser_window_input_callback, input); + + gui_window_redraw(bw->window, + actual_x, + actual_y, + actual_x + input->width, + actual_y + input->height); +} + + +/** + * Key press callback for text or password input boxes. + */ + +void browser_window_input_callback(struct browser_window *bw, char key, void *p) +{ + struct box *input = p; + struct box *text_box = input->children->children; + int char_offset = input->gadget->caret_char_offset; + int pixel_offset; + unsigned long actual_x, actual_y; + + box_coords(input, &actual_x, &actual_y); + + if ((32 <= key && key != 127) && text_box->length < input->gadget->maxlength) { + /* normal character insertion */ + text_box->text = xrealloc(text_box->text, text_box->length + 2); + input->gadget->value = xrealloc(input->gadget->value, text_box->length + 2); + memmove(text_box->text + char_offset + 1, + text_box->text + char_offset, + text_box->length - char_offset); + memmove(input->gadget->value + char_offset + 1, + input->gadget->value + char_offset, + text_box->length - char_offset); + if (input->gadget->type == GADGET_PASSWORD) + text_box->text[char_offset] = '*'; + else + text_box->text[char_offset] = key == ' ' ? 160 : key; + input->gadget->value[char_offset] = key; + text_box->length++; + text_box->text[text_box->length] = 0; + input->gadget->value[text_box->length] = 0; + char_offset++; + } else if ((key == 8 || key == 127) && char_offset != 0) { + /* delete to left */ + memmove(text_box->text + char_offset - 1, + text_box->text + char_offset, + text_box->length - char_offset); + memmove(input->gadget->value + char_offset - 1, + input->gadget->value + char_offset, + text_box->length - char_offset); + text_box->length--; + input->gadget->value[text_box->length] = 0; + char_offset--; + } else { + return; + } + + text_box->width = font_width(text_box->font, text_box->text, + text_box->length); + pixel_offset = font_width(text_box->font, text_box->text, char_offset); + text_box->x = 0; + if ((input->width < text_box->width) && (input->width / 2 < pixel_offset)) { + text_box->x = input->width / 2 - pixel_offset; + if (text_box->x < input->width - text_box->width) + text_box->x = input->width - text_box->width; + } + input->gadget->caret_char_offset = char_offset; + browser_window_place_caret(bw, actual_x + text_box->x + pixel_offset, + actual_y + text_box->y, + text_box->height, + browser_window_input_callback, input); + + gui_window_redraw(bw->window, + actual_x, + actual_y, + actual_x + input->width, + actual_y + input->height); +} + + +/** * Position the caret and assign a callback for key presses. */ @@ -1333,9 +1441,9 @@ char* browser_form_construct_get(struct page_elements *elements, struct formsubm case GADGET_HIDDEN: value = elements->gadgets[i]->data.hidden.value; break; - case GADGET_TEXTBOX: value = elements->gadgets[i]->data.textbox.text; + case GADGET_TEXTBOX: value = elements->gadgets[i]->value; break; - case GADGET_PASSWORD: value = elements->gadgets[i]->data.password.text; + case GADGET_PASSWORD: value = elements->gadgets[i]->value; break; case GADGET_RADIO: if(elements->gadgets[i]->data.radio.selected == -1) value = elements->gadgets[i]->data.radio.value; diff --git a/desktop/gui.h b/desktop/gui.h index c4cb60d85..619ded567 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -59,8 +59,6 @@ void gui_window_start_throbber(gui_window* g); 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_password(struct browser_window* bw, struct gui_gadget* g); void gui_window_place_caret(gui_window *g, int x, int y, int height); |