summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/browser.c33
-rw-r--r--desktop/gui.h1
-rw-r--r--render/box.c69
-rw-r--r--render/box.h15
-rw-r--r--render/layout.c14
-rw-r--r--riscos/gui.c56
-rw-r--r--riscos/htmlredraw.c74
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"));