summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amiga/context_menu.c4
-rw-r--r--beos/gui.cpp4
-rw-r--r--cocoa/FormSelectMenu.m3
-rw-r--r--desktop/browser.c2
-rw-r--r--gtk/window.c17
-rw-r--r--render/form.c20
-rw-r--r--render/form.h112
-rw-r--r--render/form_internal.h88
-rw-r--r--render/layout.c2
-rw-r--r--riscos/gui.h1
-rw-r--r--riscos/window.c37
11 files changed, 168 insertions, 122 deletions
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
index f2b40373c..2385f1b42 100644
--- a/amiga/context_menu.c
+++ b/amiga/context_menu.c
@@ -1280,7 +1280,7 @@ void gui_create_form_select_menu(struct gui_window *g,
*/
struct gui_window *gwin = g;
- struct form_option *opt = control->data.select.items;
+ struct form_option *opt = form_select_get_option(control, 0);
ULONG i = 0;
if(ctxmenuobj) DisposeObject(ctxmenuobj);
@@ -1291,7 +1291,7 @@ void gui_create_form_select_menu(struct gui_window *g,
gwin->shared->control = control;
- ctxmenuobj = PMMENU(ami_utf8_easy(control->name)),
+ ctxmenuobj = PMMENU(ami_utf8_easy(form_control_get_name(control))),
PMA_MenuHandler, &ctxmenuhook, End;
while(opt)
diff --git a/beos/gui.cpp b/beos/gui.cpp
index 7c0a3c6f2..6447fd9e9 100644
--- a/beos/gui.cpp
+++ b/beos/gui.cpp
@@ -65,7 +65,6 @@ extern "C" {
#include "desktop/gui_search.h"
#include "desktop/gui_fetch.h"
#include "desktop/netsurf.h"
-#include "render/form.h"
}
@@ -102,9 +101,6 @@ BWindow *wndTooltip;
//beosLabel *labelTooltip;
BFilePanel *wndOpenFile;
-//static beosWidget *select_menu;
-static struct form_control *select_menu_control;
-
static thread_id sBAppThreadID;
static BMessage *gFirstRefsReceived = NULL;
diff --git a/cocoa/FormSelectMenu.m b/cocoa/FormSelectMenu.m
index d1548b244..842d5108d 100644
--- a/cocoa/FormSelectMenu.m
+++ b/cocoa/FormSelectMenu.m
@@ -48,7 +48,8 @@
[menu addItemWithTitle: @"" action: NULL keyEquivalent: @""];
NSInteger currentItemIndex = 0;
- for (struct form_option *opt = control->data.select.items; opt != NULL; opt = opt->next) {
+ struct form_option *opt;
+ for (opt = form_select_get_option(control, 0); opt != NULL; opt = opt->next) {
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: [NSString stringWithUTF8String: opt->text]
action: @selector( itemSelected: )
keyEquivalent: @""];
diff --git a/desktop/browser.c b/desktop/browser.c
index c139cad28..5570d4279 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -50,7 +50,7 @@
#include "content/fetch.h"
#include "content/hlcache.h"
#include "content/urldb.h"
-#include "render/form.h"
+#include "render/form_internal.h"
#include "render/html.h"
#include "render/box.h"
#include "curl/curl.h"
diff --git a/gtk/window.c b/gtk/window.c
index 1b6e6ccbe..107f68605 100644
--- a/gtk/window.c
+++ b/gtk/window.c
@@ -1217,8 +1217,7 @@ static void gui_window_start_selection(struct gui_window *g)
static void gui_window_create_form_select_menu(struct gui_window *g,
struct form_control *control)
{
-
- intptr_t i;
+ intptr_t item;
struct form_option *option;
GtkWidget *menu_item;
@@ -1228,23 +1227,29 @@ static void gui_window_create_form_select_menu(struct gui_window *g,
* Yay. \o/
*/
- if (select_menu != NULL)
+ if (select_menu != NULL) {
gtk_widget_destroy(select_menu);
+ }
select_menu = gtk_menu_new();
select_menu_control = control;
- for (i = 0, option = control->data.select.items; option;
- i++, option = option->next) {
+ item = 0;
+ option = form_select_get_option(control, item);
+ while (option != NULL) {
+ LOG(("Item %d option %p text %s", item, option, option->text));
menu_item = gtk_check_menu_item_new_with_label(option->text);
if (option->selected)
gtk_check_menu_item_set_active(
GTK_CHECK_MENU_ITEM(menu_item), TRUE);
g_signal_connect(menu_item, "toggled",
- G_CALLBACK(nsgtk_select_menu_clicked), (gpointer)i);
+ G_CALLBACK(nsgtk_select_menu_clicked), (gpointer)item);
gtk_menu_shell_append(GTK_MENU_SHELL(select_menu), menu_item);
+
+ item++;
+ option = form_select_get_option(control, item);
}
gtk_widget_show_all(select_menu);
diff --git a/render/form.c b/render/form.c
index 94cbcfcd3..7c90a5250 100644
--- a/render/form.c
+++ b/render/form.c
@@ -1332,6 +1332,26 @@ nserror form_select_process_selection(struct form_control *control, int item)
return form__select_process_selection(control->html, control, item);
}
+/* exported interface documented in render/form.h */
+struct form_option *
+form_select_get_option(struct form_control *control, int item)
+{
+ struct form_option *opt;
+
+ opt = control->data.select.items;
+ while ((opt != NULL) && (item > 0)) {
+ opt = opt->next;
+ item--;
+ }
+ return opt;
+}
+
+/* exported interface documented in render/form.h */
+char *form_control_get_name(struct form_control *control)
+{
+ return control->name;
+}
+
/**
* Handle a click on the area of the currently opened select menu.
*
diff --git a/render/form.h b/render/form.h
index eefa5ae37..82e02f61a 100644
--- a/render/form.h
+++ b/render/form.h
@@ -25,49 +25,11 @@
#ifndef _NETSURF_RENDER_FORM_H_
#define _NETSURF_RENDER_FORM_H_
-#include <stdbool.h>
-
-struct box;
struct form_control;
-struct form_option;
-struct form_select_menu;
-struct form;
-struct html_content;
-struct dom_string;
-struct content;
-struct nsurl;
-struct fetch_multipart_data;
-struct redraw_context;
-struct browser_window;
-
-enum browser_mouse_state;
-
-
-
-/** Type of a struct form_control. */
-typedef enum {
- GADGET_HIDDEN,
- GADGET_TEXTBOX,
- GADGET_RADIO,
- GADGET_CHECKBOX,
- GADGET_SELECT,
- GADGET_TEXTAREA,
- GADGET_IMAGE,
- GADGET_PASSWORD,
- GADGET_SUBMIT,
- GADGET_RESET,
- GADGET_FILE,
- GADGET_BUTTON
-} form_control_type;
-
-/** Data for textarea */
-struct form_textarea_data {
- struct form_control *gadget;
-};
/** Option in a select. */
struct form_option {
- void *node; /**< Corresponding DOM node */
+ void *node; /**< Corresponding DOM node */
bool selected;
bool initial_selected;
char *value;
@@ -75,63 +37,29 @@ struct form_option {
struct form_option* next;
};
-struct image_input_coords {
- int x;
- int y;
-};
-
-/** Form control. */
-struct form_control {
- void *node; /**< Corresponding DOM node */
- struct html_content *html; /**< HTML content containing control */
-
- form_control_type type; /**< Type of control */
-
- struct form *form; /**< Containing form */
-
- char *name; /**< Control name */
- char *value; /**< Current value of control */
- char *initial_value; /**< Initial value of control */
- bool disabled; /**< Whether control is disabled */
-
- struct box *box; /**< Box for control */
-
- unsigned int length; /**< Number of characters in control */
- unsigned int maxlength; /**< Maximum characters permitted */
-
- bool selected; /**< Whether control is selected */
-
- union {
- struct {
- int mx, my;
- } image;
- struct {
- int num_items;
- struct form_option *items, *last_item;
- bool multiple;
- int num_selected;
- /** Currently selected item, if num_selected == 1. */
- struct form_option *current;
- struct form_select_menu *menu;
- } select;
- struct {
- struct textarea *ta;
- struct dom_string *initial;
- struct form_textarea_data data;
- } text; /**< input type=text or textarea */
- } data;
-
- struct form_control *prev; /**< Previous control in this form */
- struct form_control *next; /**< Next control in this form. */
-};
-
-
/**
* Process a selection from a form select menu.
*
- * \param control form control with menu
- * \param item index of item selected from the menu
+ * \param control form control with menu.
+ * \param item index of item selected from the menu.
*/
nserror form_select_process_selection(struct form_control *control, int item);
+/**
+ * get a form select menus option.
+ *
+ * \param control The form control.
+ * \param item The index of the menu entry to return.
+ * \return The form option at that index.
+ */
+struct form_option *form_select_get_option(struct form_control *control, int item);
+
+/**
+ * Get a form control name
+ *
+ * \param control The form control
+ * \return The form control name
+ */
+char *form_control_get_name(struct form_control *control);
+
#endif
diff --git a/render/form_internal.h b/render/form_internal.h
index 07512b508..ea46b6a78 100644
--- a/render/form_internal.h
+++ b/render/form_internal.h
@@ -26,6 +26,94 @@
#include "render/form.h"
+#include <stdbool.h>
+
+struct box;
+struct form_control;
+struct form_option;
+struct form_select_menu;
+struct form;
+struct html_content;
+struct dom_string;
+struct content;
+struct nsurl;
+struct fetch_multipart_data;
+struct redraw_context;
+struct browser_window;
+
+enum browser_mouse_state;
+
+/** Type of a struct form_control. */
+typedef enum {
+ GADGET_HIDDEN,
+ GADGET_TEXTBOX,
+ GADGET_RADIO,
+ GADGET_CHECKBOX,
+ GADGET_SELECT,
+ GADGET_TEXTAREA,
+ GADGET_IMAGE,
+ GADGET_PASSWORD,
+ GADGET_SUBMIT,
+ GADGET_RESET,
+ GADGET_FILE,
+ GADGET_BUTTON
+} form_control_type;
+
+/** Data for textarea */
+struct form_textarea_data {
+ struct form_control *gadget;
+};
+
+struct image_input_coords {
+ int x;
+ int y;
+};
+
+/** Form control. */
+struct form_control {
+ void *node; /**< Corresponding DOM node */
+ struct html_content *html; /**< HTML content containing control */
+
+ form_control_type type; /**< Type of control */
+
+ struct form *form; /**< Containing form */
+
+ char *name; /**< Control name */
+ char *value; /**< Current value of control */
+ char *initial_value; /**< Initial value of control */
+ bool disabled; /**< Whether control is disabled */
+
+ struct box *box; /**< Box for control */
+
+ unsigned int length; /**< Number of characters in control */
+ unsigned int maxlength; /**< Maximum characters permitted */
+
+ bool selected; /**< Whether control is selected */
+
+ union {
+ struct {
+ int mx, my;
+ } image;
+ struct {
+ int num_items;
+ struct form_option *items, *last_item;
+ bool multiple;
+ int num_selected;
+ /** Currently selected item, if num_selected == 1. */
+ struct form_option *current;
+ struct form_select_menu *menu;
+ } select;
+ struct {
+ struct textarea *ta;
+ struct dom_string *initial;
+ struct form_textarea_data data;
+ } text; /**< input type=text or textarea */
+ } data;
+
+ struct form_control *prev; /**< Previous control in this form */
+ struct form_control *next; /**< Next control in this form. */
+};
+
/** Form submit method. */
typedef enum {
method_GET, /**< GET, always url encoded. */
diff --git a/render/layout.c b/render/layout.c
index 888c2f70a..67e3219ca 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -56,7 +56,7 @@
#include "render/box.h"
#include "render/font.h"
-#include "render/form.h"
+#include "render/form_internal.h"
#include "render/html_internal.h"
#include "render/layout.h"
#include "render/table.h"
diff --git a/riscos/gui.h b/riscos/gui.h
index 9e7704f39..4e9ce6505 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -60,7 +60,6 @@ extern wimp_w current_menu_window;
extern bool current_menu_open;
extern wimp_menu *recent_search_menu; /* search.c */
extern wimp_w history_window;
-extern struct form_control *current_gadget;
extern bool gui_redraw_debug;
extern osspriteop_area *gui_sprites;
extern bool dialog_folder_add, dialog_entry_add, hotlist_insert;
diff --git a/riscos/window.c b/riscos/window.c
index 61d5ea8a0..abb249245 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -4572,7 +4572,7 @@ void ro_gui_window_default_options(struct gui_window *gui)
bool ro_gui_window_prepare_form_select_menu(struct gui_window *g,
struct form_control *control)
{
- unsigned int i, entries;
+ unsigned int item, entries;
char *text_convert, *temp;
struct form_option *option;
bool reopen = true;
@@ -4580,19 +4580,26 @@ bool ro_gui_window_prepare_form_select_menu(struct gui_window *g,
assert(control);
- for (entries = 0, option = control->data.select.items; option;
- option = option->next)
+ /* enumerate the entries */
+ entries = 0;
+ option = form_select_get_option(control, entries);
+ while (option != NULL) {
entries++;
+ option = form_select_get_option(control, item);
+ }
+
if (entries == 0) {
+ /* no menu to display */
ro_gui_menu_destroy();
return false;
}
+ /* free riscos menu if there already is one */
if ((gui_form_select_menu) && (control != gui_form_select_control)) {
- for (i = 0; ; i++) {
- free(gui_form_select_menu->entries[i].data.
+ for (item = 0; ; item++) {
+ free(gui_form_select_menu->entries[item].data.
indirected_text.text);
- if (gui_form_select_menu->entries[i].menu_flags &
+ if (gui_form_select_menu->entries[item].menu_flags &
wimp_MENU_LAST)
break;
}
@@ -4601,6 +4608,7 @@ bool ro_gui_window_prepare_form_select_menu(struct gui_window *g,
gui_form_select_menu = 0;
}
+ /* allocate new riscos menu */
if (!gui_form_select_menu) {
reopen = false;
gui_form_select_menu = malloc(wimp_SIZEOF_MENU(entries));
@@ -4624,11 +4632,12 @@ bool ro_gui_window_prepare_form_select_menu(struct gui_window *g,
ro_gui_menu_init_structure(gui_form_select_menu, entries);
}
- for (i = 0, option = control->data.select.items; option;
- i++, option = option->next) {
- gui_form_select_menu->entries[i].menu_flags = 0;
+ /* initialise menu entries from form control */
+ for (item = 0; item < entries; item++) {
+ option = form_select_get_option(control, item);
+ gui_form_select_menu->entries[item].menu_flags = 0;
if (option->selected)
- gui_form_select_menu->entries[i].menu_flags =
+ gui_form_select_menu->entries[item].menu_flags =
wimp_MENU_TICKED;
if (!reopen) {
@@ -4659,17 +4668,17 @@ bool ro_gui_window_prepare_form_select_menu(struct gui_window *g,
free(temp);
- gui_form_select_menu->entries[i].data.indirected_text.text =
+ gui_form_select_menu->entries[item].data.indirected_text.text =
text_convert;
- gui_form_select_menu->entries[i].data.indirected_text.size =
- strlen(gui_form_select_menu->entries[i].
+ gui_form_select_menu->entries[item].data.indirected_text.size =
+ strlen(gui_form_select_menu->entries[item].
data.indirected_text.text) + 1;
}
}
gui_form_select_menu->entries[0].menu_flags |=
wimp_MENU_TITLE_INDIRECTED;
- gui_form_select_menu->entries[i - 1].menu_flags |= wimp_MENU_LAST;
+ gui_form_select_menu->entries[item - 1].menu_flags |= wimp_MENU_LAST;
return true;
}