summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2012-08-18 16:26:56 +0100
committerChris Young <chris@unsatisfactorysoftware.co.uk>2012-08-18 16:26:56 +0100
commit19d2a0c01185451d2e2903f116f792e591b8ff5f (patch)
tree9b3a790d659effcefcc175c1eb1abd2cc43e61ca
parent8e4819e450f5922cde793477c634df9c82c21fb6 (diff)
parenteb35a576c1b5845d4aa6b2b77d8039f49f048edc (diff)
downloadnetsurf-19d2a0c01185451d2e2903f116f792e591b8ff5f.tar.gz
netsurf-19d2a0c01185451d2e2903f116f792e591b8ff5f.tar.bz2
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
-rw-r--r--content/content.c8
-rw-r--r--content/content.h22
-rw-r--r--desktop/browser.c89
-rw-r--r--desktop/browser.h2
-rw-r--r--desktop/frames.c22
-rw-r--r--desktop/frames.h3
-rw-r--r--desktop/gui.h10
-rw-r--r--desktop/mouse.h34
-rw-r--r--javascript/jsapi.h13
-rw-r--r--javascript/jsapi/document.c3
-rw-r--r--javascript/jsapi/element.c15
-rw-r--r--javascript/jsapi/htmldocument.c8
-rw-r--r--javascript/jsapi/htmlelement.c10
-rw-r--r--javascript/jsapi/node.c25
-rw-r--r--javascript/jsapi/window.c15
-rw-r--r--render/form.c164
-rw-r--r--render/form.h2
-rw-r--r--render/html.c15
-rw-r--r--render/html_interaction.c364
-rw-r--r--render/textinput.c2
-rw-r--r--render/textplain.c8
21 files changed, 514 insertions, 320 deletions
diff --git a/content/content.c b/content/content.c
index 758a615ce..e78ead295 100644
--- a/content/content.c
+++ b/content/content.c
@@ -416,8 +416,14 @@ void content_mouse_track(hlcache_handle *h, struct browser_window *bw,
struct content *c = hlcache_handle_get_content(h);
assert(c != NULL);
- if (c->handler->mouse_track != NULL)
+ if (c->handler->mouse_track != NULL) {
c->handler->mouse_track(c, bw, mouse, x, y);
+ } else {
+ union content_msg_data msg_data;
+ msg_data.pointer = BROWSER_POINTER_AUTO;
+ content_broadcast(c, CONTENT_MSG_POINTER, msg_data);
+ }
+
return;
}
diff --git a/content/content.h b/content/content.h
index f1ff2a2c9..d0b525c85 100644
--- a/content/content.h
+++ b/content/content.h
@@ -74,7 +74,10 @@ typedef enum {
CONTENT_MSG_DOWNLOAD, /**< download, not for display */
CONTENT_MSG_LINK, /**< RFC5988 link */
CONTENT_MSG_GETCTX, /**< Javascript context */
- CONTENT_MSG_SCROLL /**< Request to scroll content */
+ CONTENT_MSG_SCROLL, /**< Request to scroll content */
+ CONTENT_MSG_DRAGSAVE, /**< Allow drag saving of content */
+ CONTENT_MSG_SAVELINK, /**< Allow URL to be saved */
+ CONTENT_MSG_POINTER /**< Wants a specific mouse pointer set */
} content_msg;
/** RFC5988 metadata link */
@@ -128,6 +131,23 @@ union content_msg_data {
int x0, y0;
int x1, y1;
} scroll;
+ /** CONTENT_MSG_DRAGSAVE - Drag save a content */
+ struct {
+ enum {
+ CONTENT_SAVE_ORIG,
+ CONTENT_SAVE_NATIVE,
+ CONTENT_SAVE_COMPLETE,
+ CONTENT_SAVE_SOURCE
+ } type;
+ struct hlcache_handle *content;
+ } dragsave;
+ /** CONTENT_MSG_SAVELINK - Save a URL */
+ struct {
+ const char *url;
+ const char *title;
+ } savelink;
+ /** CONTENT_MSG_POINTER - Mouse pointer to set */
+ browser_pointer_shape pointer;
};
/** parameters to content redraw */
diff --git a/desktop/browser.c b/desktop/browser.c
index 136557a75..f9519b011 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -1003,6 +1003,9 @@ void browser_window_go_post(struct browser_window *bw, const char *url,
warn_user("NoMemory", 0);
}
+
+ /* Record time */
+ bw->last_action = wallclock();
}
@@ -1440,6 +1443,51 @@ nserror browser_window_callback(hlcache_handle *c,
break;
+ case CONTENT_MSG_DRAGSAVE:
+ {
+ /* Content wants drag save of a content */
+ struct browser_window *root = browser_window_get_root(bw);
+
+ switch(event->data.dragsave.type) {
+ case CONTENT_SAVE_ORIG:
+ gui_drag_save_object(GUI_SAVE_OBJECT_ORIG,
+ event->data.dragsave.content,
+ root->window);
+ break;
+ case CONTENT_SAVE_NATIVE:
+ gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE,
+ event->data.dragsave.content,
+ root->window);
+ break;
+ case CONTENT_SAVE_COMPLETE:
+ gui_drag_save_object(GUI_SAVE_COMPLETE,
+ event->data.dragsave.content,
+ root->window);
+ break;
+ case CONTENT_SAVE_SOURCE:
+ gui_drag_save_object(GUI_SAVE_SOURCE,
+ event->data.dragsave.content,
+ root->window);
+ break;
+ }
+ }
+ break;
+
+ case CONTENT_MSG_SAVELINK:
+ {
+ /* Content wants a link to be saved */
+ struct browser_window *root = browser_window_get_root(bw);
+ gui_window_save_link(root->window,
+ event->data.savelink.url,
+ event->data.savelink.title);
+ }
+ break;
+
+ case CONTENT_MSG_POINTER:
+ /* Content wants to have specific mouse pointer */
+ browser_window_set_pointer(bw, event->data.pointer);
+ break;
+
default:
assert(0);
}
@@ -1887,14 +1935,37 @@ void browser_window_set_status(struct browser_window *bw, const char *text)
*/
void browser_window_set_pointer(struct browser_window *bw,
- gui_pointer_shape shape)
+ browser_pointer_shape shape)
{
struct browser_window *root = browser_window_get_root(bw);
+ gui_pointer_shape gui_shape;
+ bool loading;
assert(root);
assert(root->window);
- gui_window_set_pointer(root->window, shape);
+ loading = (bw->loading_content != NULL || (bw->current_content &&
+ content_get_status(bw->current_content) ==
+ CONTENT_STATUS_READY));
+
+ if (wallclock() - bw->last_action < 100 && loading) {
+ /* If loading and less than 1 second since last link followed,
+ * force progress indicator pointer */
+ gui_shape = GUI_POINTER_PROGRESS;
+
+ } else if (shape == BROWSER_POINTER_AUTO) {
+ /* Up to browser window to decide */
+ if (loading)
+ gui_shape = GUI_POINTER_PROGRESS;
+ else
+ gui_shape = GUI_POINTER_DEFAULT;
+
+ } else {
+ /* Use what we were told */
+ gui_shape = (gui_pointer_shape)shape;
+ }
+
+ gui_window_set_pointer(root->window, gui_shape);
}
@@ -2367,7 +2438,7 @@ void browser_window_mouse_track(struct browser_window *bw,
{
hlcache_handle *c = bw->current_content;
const char *status = NULL;
- gui_pointer_shape pointer = GUI_POINTER_DEFAULT;
+ browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT;
if (bw->window != NULL && bw->drag_window && bw != bw->drag_window) {
/* This is the root browser window and there's an active drag
@@ -2448,7 +2519,7 @@ void browser_window_mouse_track(struct browser_window *bw,
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_action(bw->scroll_x, mouse,
scr_x, scr_y);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL)
browser_window_set_status(bw, status);
@@ -2473,7 +2544,7 @@ void browser_window_mouse_track(struct browser_window *bw,
/* Start a scrollbar drag, or continue existing drag */
status = scrollbar_mouse_action(bw->scroll_y, mouse,
scr_x, scr_y);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL)
browser_window_set_status(bw, status);
@@ -2519,7 +2590,7 @@ void browser_window_mouse_click(struct browser_window *bw,
{
hlcache_handle *c = bw->current_content;
const char *status = NULL;
- gui_pointer_shape pointer = GUI_POINTER_DEFAULT;
+ browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT;
if (bw->children) {
/* Browser window has children (frames) */
@@ -2567,7 +2638,7 @@ void browser_window_mouse_click(struct browser_window *bw,
scr_y > 0 && scr_y < SCROLLBAR_WIDTH) {
status = scrollbar_mouse_action(bw->scroll_x, mouse,
scr_x, scr_y);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL)
browser_window_set_status(bw, status);
@@ -2588,7 +2659,7 @@ void browser_window_mouse_click(struct browser_window *bw,
scr_x > 0 && scr_x < SCROLLBAR_WIDTH) {
status = scrollbar_mouse_action(bw->scroll_y, mouse,
scr_x, scr_y);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
if (status != NULL)
browser_window_set_status(bw, status);
@@ -2615,7 +2686,7 @@ void browser_window_mouse_click(struct browser_window *bw,
else if (mouse & (BROWSER_MOUSE_DRAG_1 |
BROWSER_MOUSE_DRAG_2)) {
browser_window_page_drag_start(bw, x, y);
- browser_window_set_pointer(bw, GUI_POINTER_MOVE);
+ browser_window_set_pointer(bw, BROWSER_POINTER_MOVE);
}
break;
}
diff --git a/desktop/browser.h b/desktop/browser.h
index c8af7889c..489a7edad 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -301,7 +301,7 @@ void browser_window_redraw_rect(struct browser_window *bw, int x, int y,
void browser_window_set_status(struct browser_window *bw, const char *text);
void browser_window_set_pointer(struct browser_window *bw,
- gui_pointer_shape shape);
+ browser_pointer_shape shape);
void browser_window_page_drag_start(struct browser_window *bw, int x, int y);
bool browser_window_back_available(struct browser_window *bw);
diff --git a/desktop/frames.c b/desktop/frames.c
index 836108aa3..0d67ad8c5 100644
--- a/desktop/frames.c
+++ b/desktop/frames.c
@@ -91,7 +91,7 @@ void browser_window_scroll_callback(void *client_data,
case SCROLLBAR_MSG_SCROLL_FINISHED:
browser_window_set_drag_type(bw, DRAGGING_NONE, NULL);
- browser_window_set_pointer(bw, GUI_POINTER_DEFAULT);
+ browser_window_set_pointer(bw, BROWSER_POINTER_DEFAULT);
break;
}
}
@@ -800,7 +800,7 @@ bool browser_window_resolve_frame_dimension(struct browser_window *bw,
static bool browser_window_resize_frames(struct browser_window *bw,
browser_mouse_state mouse, int x, int y,
- gui_pointer_shape *pointer)
+ browser_pointer_shape *pointer)
{
struct browser_window *parent;
bool left, right, up, down;
@@ -878,22 +878,22 @@ static bool browser_window_resize_frames(struct browser_window *bw,
if (left || right || up || down) {
if (left) {
if (down)
- *pointer = GUI_POINTER_LD;
+ *pointer = BROWSER_POINTER_LD;
else if (up)
- *pointer = GUI_POINTER_LU;
+ *pointer = BROWSER_POINTER_LU;
else
- *pointer = GUI_POINTER_LEFT;
+ *pointer = BROWSER_POINTER_LEFT;
} else if (right) {
if (down)
- *pointer = GUI_POINTER_RD;
+ *pointer = BROWSER_POINTER_RD;
else if (up)
- *pointer = GUI_POINTER_RU;
+ *pointer = BROWSER_POINTER_RU;
else
- *pointer = GUI_POINTER_RIGHT;
+ *pointer = BROWSER_POINTER_RIGHT;
} else if (up) {
- *pointer = GUI_POINTER_UP;
+ *pointer = BROWSER_POINTER_UP;
} else {
- *pointer = GUI_POINTER_DOWN;
+ *pointer = BROWSER_POINTER_DOWN;
}
if (mouse & (BROWSER_MOUSE_DRAG_1 |
BROWSER_MOUSE_DRAG_2)) {
@@ -931,7 +931,7 @@ static bool browser_window_resize_frames(struct browser_window *bw,
bool browser_window_frame_resize_start(struct browser_window *bw,
browser_mouse_state mouse, int x, int y,
- gui_pointer_shape *pointer)
+ browser_pointer_shape *pointer)
{
struct browser_window *root = browser_window_get_root(bw);
int offx, offy;
diff --git a/desktop/frames.h b/desktop/frames.h
index efbe6a8c2..149921641 100644
--- a/desktop/frames.h
+++ b/desktop/frames.h
@@ -24,7 +24,6 @@
#define _NETSURF_DESKTOP_FRAMES_H_
#include "desktop/browser.h"
-#include "desktop/gui.h"
void browser_window_create_iframes(struct browser_window *bw,
@@ -35,7 +34,7 @@ void browser_window_create_frameset(struct browser_window *bw,
void browser_window_recalculate_frameset(struct browser_window *bw);
bool browser_window_frame_resize_start(struct browser_window *bw,
browser_mouse_state mouse, int x, int y,
- gui_pointer_shape *pointer);
+ browser_pointer_shape *pointer);
void browser_window_resize_frame(struct browser_window *bw, int x, int y);
void browser_window_scroll_callback(void *client_data,
diff --git a/desktop/gui.h b/desktop/gui.h
index 2fc2b9130..aa3fc8191 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -53,23 +53,15 @@ struct browser_window;
struct selection;
struct form_control;
-typedef enum { GUI_POINTER_DEFAULT, GUI_POINTER_POINT, GUI_POINTER_CARET,
- GUI_POINTER_MENU, GUI_POINTER_UP, GUI_POINTER_DOWN,
- GUI_POINTER_LEFT, GUI_POINTER_RIGHT, GUI_POINTER_RU,
- GUI_POINTER_LD, GUI_POINTER_LU, GUI_POINTER_RD,
- GUI_POINTER_CROSS, GUI_POINTER_MOVE, GUI_POINTER_WAIT,
- GUI_POINTER_HELP, GUI_POINTER_NO_DROP, GUI_POINTER_NOT_ALLOWED,
- GUI_POINTER_PROGRESS } gui_pointer_shape;
-
#include <stdbool.h>
#include <libwapcaplet/libwapcaplet.h>
#include <libcss/libcss.h>
#include "utils/config.h"
-#include "content/content.h"
#include "content/hlcache.h"
#include "desktop/download.h"
+#include "desktop/mouse.h"
#include "desktop/search.h"
#include "utils/errors.h"
diff --git a/desktop/mouse.h b/desktop/mouse.h
index 84af82f69..42603a67a 100644
--- a/desktop/mouse.h
+++ b/desktop/mouse.h
@@ -63,6 +63,40 @@ typedef enum {
* (eg. Alt) */
} browser_mouse_state;
+
+typedef enum { GUI_POINTER_DEFAULT, GUI_POINTER_POINT, GUI_POINTER_CARET,
+ GUI_POINTER_MENU, GUI_POINTER_UP, GUI_POINTER_DOWN,
+ GUI_POINTER_LEFT, GUI_POINTER_RIGHT, GUI_POINTER_RU,
+ GUI_POINTER_LD, GUI_POINTER_LU, GUI_POINTER_RD,
+ GUI_POINTER_CROSS, GUI_POINTER_MOVE, GUI_POINTER_WAIT,
+ GUI_POINTER_HELP, GUI_POINTER_NO_DROP, GUI_POINTER_NOT_ALLOWED,
+ GUI_POINTER_PROGRESS } gui_pointer_shape;
+
+/** Mouse pointer type */
+typedef enum {
+ BROWSER_POINTER_DEFAULT = GUI_POINTER_DEFAULT,
+ BROWSER_POINTER_POINT = GUI_POINTER_POINT,
+ BROWSER_POINTER_CARET = GUI_POINTER_CARET,
+ BROWSER_POINTER_MENU = GUI_POINTER_MENU,
+ BROWSER_POINTER_UP = GUI_POINTER_UP,
+ BROWSER_POINTER_DOWN = GUI_POINTER_DOWN,
+ BROWSER_POINTER_LEFT = GUI_POINTER_LEFT,
+ BROWSER_POINTER_RIGHT = GUI_POINTER_RIGHT,
+ BROWSER_POINTER_RU = GUI_POINTER_RU,
+ BROWSER_POINTER_LD = GUI_POINTER_LD,
+ BROWSER_POINTER_LU = GUI_POINTER_LU,
+ BROWSER_POINTER_RD = GUI_POINTER_RD,
+ BROWSER_POINTER_CROSS = GUI_POINTER_CROSS,
+ BROWSER_POINTER_MOVE = GUI_POINTER_MOVE,
+ BROWSER_POINTER_WAIT = GUI_POINTER_WAIT,
+ BROWSER_POINTER_HELP = GUI_POINTER_HELP,
+ BROWSER_POINTER_NO_DROP = GUI_POINTER_NO_DROP,
+ BROWSER_POINTER_NOT_ALLOWED = GUI_POINTER_NOT_ALLOWED,
+ BROWSER_POINTER_PROGRESS = GUI_POINTER_PROGRESS,
+ BROWSER_POINTER_AUTO
+} browser_pointer_shape;
+
+
void browser_mouse_state_dump(browser_mouse_state mouse);
#endif
diff --git a/javascript/jsapi.h b/javascript/jsapi.h
index 2c10d02ce..c4c1ed099 100644
--- a/javascript/jsapi.h
+++ b/javascript/jsapi.h
@@ -69,6 +69,9 @@
#define JSAPI_PS(name, tinyid, flags) \
{ #name , tinyid , flags , jsapi_property_##name##_get , jsapi_property_##name##_set }
+#define JSAPI_PS_RO(name, tinyid, flags) \
+ { #name , tinyid , flags | JSPROP_READONLY, jsapi_property_##name##_get , NULL }
+
#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL }
static inline JSObject *
@@ -126,7 +129,15 @@ JS_NewCompartmentAndGlobalObject(JSContext *cx,
jsapi_property_##name##_set \
}
-#define JSAPI_PS_END { NULL, 0,0,NULL,NULL }
+#define JSAPI_PS_RO(name, tinyid, flags) { \
+ #name , \
+ tinyid , \
+ flags | JSPROP_READONLY, \
+ jsapi_property_##name##_get , \
+ NULL \
+ }
+
+#define JSAPI_PS_END { NULL, 0, 0, NULL, NULL }
#define JSString_to_char(injsstring, outchar, outlen) \
diff --git a/javascript/jsapi/document.c b/javascript/jsapi/document.c
index e5dfcd523..2d3bde41a 100644
--- a/javascript/jsapi/document.c
+++ b/javascript/jsapi/document.c
@@ -105,3 +105,6 @@ static JSBool JSAPI_NATIVE(getElementById, JSContext *cx, uintN argc, jsval *vp)
JSAPI_FS_NODE, \
JSAPI_FS(getElementById, 1, 0) \
+
+#define JSAPI_PS_DOCUMENT \
+ JSAPI_PS_NODE
diff --git a/javascript/jsapi/element.c b/javascript/jsapi/element.c
index cefb95966..d301321d9 100644
--- a/javascript/jsapi/element.c
+++ b/javascript/jsapi/element.c
@@ -82,3 +82,18 @@ static JSBool JSAPI_NATIVE(getAttribute, JSContext *cx, uintN argc, jsval *vp)
#define JSAPI_FS_ELEMENT \
JSAPI_FS_NODE, \
JSAPI_FS(getAttribute, 0, 0)
+
+static JSBool JSAPI_PROPERTYGET(id, JSContext *cx, JSObject *obj, jsval *vp)
+{
+ JS_SET_RVAL(cx, vp, JSVAL_NULL);
+ return JS_TRUE;
+}
+
+static JSBool JSAPI_PROPERTYSET(id, JSContext *cx, JSObject *obj, jsval *vp)
+{
+ return JS_FALSE;
+}
+
+#define JSAPI_PS_ELEMENT \
+ JSAPI_PS_NODE, \
+ JSAPI_PS(id, 0, JSPROP_ENUMERATE | JSPROP_SHARED)
diff --git a/javascript/jsapi/htmldocument.c b/javascript/jsapi/htmldocument.c
index aa9efbcd1..1a58e4e19 100644
--- a/javascript/jsapi/htmldocument.c
+++ b/javascript/jsapi/htmldocument.c
@@ -209,6 +209,12 @@ static JSFunctionSpec jsfunctions_document[] = {
JSAPI_FS_END
};
+static JSPropertySpec jsproperties_document[] =
+{
+ JSAPI_PS_DOCUMENT,
+ JSAPI_PS_END
+};
+
static void jsfinalize_document(JSContext *cx, JSObject *obj)
{
struct jsclass_document_priv *document;
@@ -238,7 +244,7 @@ JSObject *jsapi_new_document(JSContext *cx, JSObject *parent, struct html_conten
&JSCLASS_OBJECT,
NULL,
0,
- NULL,
+ jsproperties_document,
jsfunctions_document,
NULL,
NULL);
diff --git a/javascript/jsapi/htmlelement.c b/javascript/jsapi/htmlelement.c
index 90cb06aba..a7846bacd 100644
--- a/javascript/jsapi/htmlelement.c
+++ b/javascript/jsapi/htmlelement.c
@@ -178,6 +178,14 @@ static JSFunctionSpec jsfunctions_element[] = {
};
+
+
+static JSPropertySpec jsproperties_element[] =
+{
+ JSAPI_PS_ELEMENT,
+ JSAPI_PS_END
+};
+
JSObject *
jsapi_new_element(JSContext *cx,
JSObject *parent,
@@ -201,7 +209,7 @@ jsapi_new_element(JSContext *cx,
&JSCLASS_OBJECT,
NULL,
0,
- NULL,
+ jsproperties_element,
jsfunctions_element,
NULL,
NULL);
diff --git a/javascript/jsapi/node.c b/javascript/jsapi/node.c
index d6a4f4406..b8c073752 100644
--- a/javascript/jsapi/node.c
+++ b/javascript/jsapi/node.c
@@ -260,8 +260,7 @@ static JSBool JSAPI_NATIVE(isDefaultNamespace, JSContext *cx, uintN argc, jsval
return JS_TRUE;
}
-
-#define JSAPI_FS_NODE \
+#define JSAPI_FS_NODE \
JSAPI_FS_EVENTTARGET, \
JSAPI_FS(hasChildNodes, 0, 0), \
JSAPI_FS(compareDocumentPosition, 0, 0), \
@@ -276,3 +275,25 @@ static JSBool JSAPI_NATIVE(isDefaultNamespace, JSContext *cx, uintN argc, jsval
JSAPI_FS(lookupPrefix, 0, 0), \
JSAPI_FS(lookupNamespaceURI, 0, 0), \
JSAPI_FS(isDefaultNamespace, 0, 0)
+
+
+static JSBool JSAPI_PROPERTYGET(nodeType, JSContext *cx, JSObject *obj, jsval *vp)
+{
+ JS_SET_RVAL(cx, vp, JSVAL_NULL);
+ return JS_TRUE;
+}
+
+static JSBool JSAPI_PROPERTYGET(textContent, JSContext *cx, JSObject *obj, jsval *vp)
+{
+ JS_SET_RVAL(cx, vp, JSVAL_NULL);
+ return JS_TRUE;
+}
+
+static JSBool JSAPI_PROPERTYSET(textContent, JSContext *cx, JSObject *obj, jsval *vp)
+{
+ return JS_FALSE;
+}
+
+#define JSAPI_PS_NODE \
+ JSAPI_PS_RO(nodeType, 0, JSPROP_ENUMERATE | JSPROP_SHARED), \
+ JSAPI_PS(textContent, 0, JSPROP_ENUMERATE | JSPROP_SHARED)
diff --git a/javascript/jsapi/window.c b/javascript/jsapi/window.c
index 4f7e75109..72d3837d9 100644
--- a/javascript/jsapi/window.c
+++ b/javascript/jsapi/window.c
@@ -248,27 +248,16 @@ static JSBool JSAPI_PROPERTYGET(window, JSContext *cx, JSObject *obj, jsval *vp)
return JS_TRUE;
}
-static JSBool JSAPI_PROPERTYSET(window, JSContext *cx, JSObject *obj, jsval *vp)
-{
- return JS_FALSE;
-}
-
static JSBool JSAPI_PROPERTYGET(self, JSContext *cx, JSObject *obj, jsval *vp)
{
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
return JS_TRUE;
}
-static JSBool JSAPI_PROPERTYSET(self, JSContext *cx, JSObject *obj, jsval *vp)
-{
- return JS_FALSE;
-}
-
-
static JSPropertySpec jsproperties_window[] =
{
- JSAPI_PS(window, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
- JSAPI_PS(self, 0, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_SHARED),
+ JSAPI_PS_RO(window, 0, JSPROP_ENUMERATE | JSPROP_SHARED),
+ JSAPI_PS_RO(self, 0, JSPROP_ENUMERATE | JSPROP_SHARED),
JSAPI_PS_END
};
diff --git a/render/form.c b/render/form.c
index c1f097f79..09579dc5b 100644
--- a/render/form.c
+++ b/render/form.c
@@ -1121,6 +1121,84 @@ bool form_clip_inside_select_menu(struct form_control *control, float scale,
return false;
}
+
+/**
+ * Process a selection from a form select menu.
+ *
+ * \param bw browser window with menu
+ * \param control form control with menu
+ * \param item index of item selected from the menu
+ */
+
+static void form__select_process_selection(html_content *html,
+ struct form_control *control, int item)
+{
+ struct box *inline_box;
+ struct form_option *o;
+ int count;
+
+ assert(control != NULL);
+ assert(html != NULL);
+
+ /** \todo Even though the form code is effectively part of the html
+ * content handler, poking around inside contents is not good */
+
+ inline_box = control->box->children->children;
+
+ for (count = 0, o = control->data.select.items;
+ o != NULL;
+ count++, o = o->next) {
+ if (!control->data.select.multiple)
+ o->selected = false;
+ if (count == item) {
+ if (control->data.select.multiple) {
+ if (o->selected) {
+ o->selected = false;
+ control->data.select.num_selected--;
+ } else {
+ o->selected = true;
+ control->data.select.num_selected++;
+ }
+ } else {
+ o->selected = true;
+ }
+ }
+ if (o->selected)
+ control->data.select.current = o;
+ }
+
+ talloc_free(inline_box->text);
+ inline_box->text = 0;
+ if (control->data.select.num_selected == 0)
+ inline_box->text = talloc_strdup(html,
+ messages_get("Form_None"));
+ else if (control->data.select.num_selected == 1)
+ inline_box->text = talloc_strdup(html,
+ control->data.select.current->text);
+ else
+ inline_box->text = talloc_strdup(html,
+ messages_get("Form_Many"));
+ if (!inline_box->text) {
+ warn_user("NoMemory", 0);
+ inline_box->length = 0;
+ } else
+ inline_box->length = strlen(inline_box->text);
+ inline_box->width = control->box->width;
+
+ html__redraw_a_box(html, control->box);
+}
+
+
+void form_select_process_selection(hlcache_handle *h,
+ struct form_control *control, int item)
+{
+ assert(h != NULL);
+
+ form__select_process_selection(
+ (html_content *)hlcache_handle_get_content(h),
+ control, item);
+}
+
/**
* Handle a click on the area of the currently opened select menu.
*
@@ -1153,9 +1231,7 @@ void form_select_menu_clicked(struct form_control *control, int x, int y)
}
if (option != NULL) {
- /* TODO: going via the bw to get a hlcache_handle is nasty */
- form_select_process_selection(html->bw->current_content,
- control, i);
+ form__select_process_selection(html, control, i);
}
menu->callback(menu->client_data, 0, 0, menu->width, menu->height);
@@ -1318,75 +1394,6 @@ void form_select_get_dimensions(struct form_control *control,
*height = control->data.select.menu->height;
}
-
-/**
- * Process a selection from a form select menu.
- *
- * \param bw browser window with menu
- * \param control form control with menu
- * \param item index of item selected from the menu
- */
-
-void form_select_process_selection(hlcache_handle *h,
- struct form_control *control, int item)
-{
- struct box *inline_box;
- struct form_option *o;
- int count;
- struct content *current_content;
-
- assert(control != NULL);
- assert(h != NULL);
-
- /** \todo Even though the form code is effectively part of the html
- * content handler, poking around inside contents is not good */
- current_content = hlcache_handle_get_content(h);
-
- inline_box = control->box->children->children;
-
- for (count = 0, o = control->data.select.items;
- o != NULL;
- count++, o = o->next) {
- if (!control->data.select.multiple)
- o->selected = false;
- if (count == item) {
- if (control->data.select.multiple) {
- if (o->selected) {
- o->selected = false;
- control->data.select.num_selected--;
- } else {
- o->selected = true;
- control->data.select.num_selected++;
- }
- } else {
- o->selected = true;
- }
- }
- if (o->selected)
- control->data.select.current = o;
- }
-
- talloc_free(inline_box->text);
- inline_box->text = 0;
- if (control->data.select.num_selected == 0)
- inline_box->text = talloc_strdup(current_content,
- messages_get("Form_None"));
- else if (control->data.select.num_selected == 1)
- inline_box->text = talloc_strdup(current_content,
- control->data.select.current->text);
- else
- inline_box->text = talloc_strdup(current_content,
- messages_get("Form_Many"));
- if (!inline_box->text) {
- warn_user("NoMemory", 0);
- inline_box->length = 0;
- } else
- inline_box->length = strlen(inline_box->text);
- inline_box->width = control->box->width;
-
- html_redraw_a_box(h, control->box);
-}
-
/**
* Callback for the core select menu.
*/
@@ -1453,7 +1460,7 @@ void form_radio_set(hlcache_handle *content,
* Collect controls and submit a form.
*/
-void form_submit(hlcache_handle *h, struct browser_window *target,
+void form_submit(nsurl *page_url, struct browser_window *target,
struct form *form, struct form_control *submit_button)
{
char *data = NULL, *url = NULL;
@@ -1500,8 +1507,7 @@ void form_submit(hlcache_handle *h, struct browser_window *target,
url_destroy_components(&components);
- browser_window_go(target, url, nsurl_access(hlcache_handle_get_url(h)),
- true);
+ browser_window_go(target, url, nsurl_access(page_url), true);
break;
case method_POST_URLENC:
@@ -1513,14 +1519,12 @@ void form_submit(hlcache_handle *h, struct browser_window *target,
}
browser_window_go_post(target, form->action, data, 0,
- true, nsurl_access(hlcache_handle_get_url(h)),
- false, true, 0);
+ true, nsurl_access(page_url), false, true, 0);
break;
case method_POST_MULTIPART:
- browser_window_go_post(target, form->action, 0,
- success, true, nsurl_access(hlcache_handle_get_url(h)),
- false, true, 0);
+ browser_window_go_post(target, form->action, 0, success,
+ true, nsurl_access(page_url), false, true, 0);
break;
}
diff --git a/render/form.h b/render/form.h
index e2f9f63b6..dab6a625d 100644
--- a/render/form.h
+++ b/render/form.h
@@ -173,7 +173,7 @@ void form_select_get_dimensions(struct form_control *control,
int *width, int *height);
void form_select_process_selection(hlcache_handle *h,
struct form_control *control, int item);
-void form_submit(struct hlcache_handle *h, struct browser_window *target,
+void form_submit(nsurl *page_url, struct browser_window *target,
struct form *form, struct form_control *submit_button);
void form_radio_set(struct hlcache_handle *content, struct form_control *radio);
diff --git a/render/html.c b/render/html.c
index 22fa80fbd..ed7e7ebaa 100644
--- a/render/html.c
+++ b/render/html.c
@@ -1242,6 +1242,21 @@ html_object_callback(hlcache_handle *object,
false);
break;
+ case CONTENT_MSG_DRAGSAVE:
+ /* Pass it on */
+ content_broadcast(&c->base, CONTENT_MSG_DRAGSAVE, event->data);
+ break;
+
+ case CONTENT_MSG_SAVELINK:
+ /* Pass it on */
+ content_broadcast(&c->base, CONTENT_MSG_SAVELINK, event->data);
+ break;
+
+ case CONTENT_MSG_POINTER:
+ /* Pass it on */
+ content_broadcast(&c->base, CONTENT_MSG_POINTER, event->data);
+ break;
+
default:
assert(0);
}
diff --git a/render/html_interaction.c b/render/html_interaction.c
index 4cdff7608..b6f2dc615 100644
--- a/render/html_interaction.c
+++ b/render/html_interaction.c
@@ -46,9 +46,135 @@
#include "utils/utils.h"
-static gui_pointer_shape get_pointer_shape(struct browser_window *bw,
- struct box *box, bool imagemap);
-static void html_box_drag_start(struct box *box, int x, int y);
+/**
+ * Get pointer shape for given box
+ *
+ * \param box box in question
+ * \param imagemap whether an imagemap applies to the box
+ */
+
+static browser_pointer_shape get_pointer_shape(struct box *box, bool imagemap)
+{
+ browser_pointer_shape pointer;
+ css_computed_style *style;
+ enum css_cursor_e cursor;
+ lwc_string **cursor_uris;
+
+ if (box->type == BOX_FLOAT_LEFT || box->type == BOX_FLOAT_RIGHT)
+ style = box->children->style;
+ else
+ style = box->style;
+
+ if (style == NULL)
+ return BROWSER_POINTER_DEFAULT;
+
+ cursor = css_computed_cursor(style, &cursor_uris);
+
+ switch (cursor) {
+ case CSS_CURSOR_AUTO:
+ if (box->href || (box->gadget &&
+ (box->gadget->type == GADGET_IMAGE ||
+ box->gadget->type == GADGET_SUBMIT)) ||
+ imagemap) {
+ /* link */
+ pointer = BROWSER_POINTER_POINT;
+ } else if (box->gadget &&
+ (box->gadget->type == GADGET_TEXTBOX ||
+ box->gadget->type == GADGET_PASSWORD ||
+ box->gadget->type == GADGET_TEXTAREA)) {
+ /* text input */
+ pointer = BROWSER_POINTER_CARET;
+ } else {
+ /* html content doesn't mind */
+ pointer = BROWSER_POINTER_AUTO;
+ }
+ break;
+ case CSS_CURSOR_CROSSHAIR:
+ pointer = BROWSER_POINTER_CROSS;
+ break;
+ case CSS_CURSOR_POINTER:
+ pointer = BROWSER_POINTER_POINT;
+ break;
+ case CSS_CURSOR_MOVE:
+ pointer = BROWSER_POINTER_MOVE;
+ break;
+ case CSS_CURSOR_E_RESIZE:
+ pointer = BROWSER_POINTER_RIGHT;
+ break;
+ case CSS_CURSOR_W_RESIZE:
+ pointer = BROWSER_POINTER_LEFT;
+ break;
+ case CSS_CURSOR_N_RESIZE:
+ pointer = BROWSER_POINTER_UP;
+ break;
+ case CSS_CURSOR_S_RESIZE:
+ pointer = BROWSER_POINTER_DOWN;
+ break;
+ case CSS_CURSOR_NE_RESIZE:
+ pointer = BROWSER_POINTER_RU;
+ break;
+ case CSS_CURSOR_SW_RESIZE:
+ pointer = BROWSER_POINTER_LD;
+ break;
+ case CSS_CURSOR_SE_RESIZE:
+ pointer = BROWSER_POINTER_RD;
+ break;
+ case CSS_CURSOR_NW_RESIZE:
+ pointer = BROWSER_POINTER_LU;
+ break;
+ case CSS_CURSOR_TEXT:
+ pointer = BROWSER_POINTER_CARET;
+ break;
+ case CSS_CURSOR_WAIT:
+ pointer = BROWSER_POINTER_WAIT;
+ break;
+ case CSS_CURSOR_PROGRESS:
+ pointer = BROWSER_POINTER_PROGRESS;
+ break;
+ case CSS_CURSOR_HELP:
+ pointer = BROWSER_POINTER_HELP;
+ break;
+ default:
+ pointer = BROWSER_POINTER_DEFAULT;
+ break;
+ }
+
+ return pointer;
+}
+
+
+/**
+ * Start drag scrolling the contents of a box
+ *
+ * \param box the box to be scrolled
+ * \param x x ordinate of initial mouse position
+ * \param y y ordinate
+ */
+
+static void html_box_drag_start(struct box *box, int x, int y)
+{
+ int box_x, box_y;
+ int scroll_mouse_x, scroll_mouse_y;
+
+ box_coords(box, &box_x, &box_y);
+
+ if (box->scroll_x != NULL) {
+ scroll_mouse_x = x - box_x ;
+ scroll_mouse_y = y - (box_y + box->padding[TOP] +
+ box->height + box->padding[BOTTOM] -
+ SCROLLBAR_WIDTH);
+ scrollbar_start_content_drag(box->scroll_x,
+ scroll_mouse_x, scroll_mouse_y);
+ } else if (box->scroll_y != NULL) {
+ scroll_mouse_x = x - (box_x + box->padding[LEFT] +
+ box->width + box->padding[RIGHT] -
+ SCROLLBAR_WIDTH);
+ scroll_mouse_y = y - box_y;
+
+ scrollbar_start_content_drag(box->scroll_y,
+ scroll_mouse_x, scroll_mouse_y);
+ }
+}
/**
@@ -175,7 +301,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
const char *target = 0;
char status_buffer[200];
const char *status = 0;
- gui_pointer_shape pointer = GUI_POINTER_DEFAULT;
+ browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT;
bool imagemap = false;
int box_x = 0, box_y = 0;
int gadget_box_x = 0, gadget_box_y = 0;
@@ -266,7 +392,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
/* search the box tree for a link, imagemap, form control, or
* box with scrollbars */
- box = html_get_box_tree(h);
+ box = html->layout;
/* Consider the margins of the html page now */
box_x = box->margin[LEFT];
@@ -314,7 +440,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
if (box->title)
title = box->title;
- pointer = get_pointer_shape(bw, box, false);
+ pointer = get_pointer_shape(box, false);
if ((box->scroll_x != NULL || box->scroll_y != NULL) &&
drag_candidate == NULL)
@@ -370,19 +496,19 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
if (scrollbar) {
status = scrollbar_mouse_action(scrollbar, mouse,
scroll_mouse_x, scroll_mouse_y);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
} else if (gadget) {
switch (gadget->type) {
case GADGET_SELECT:
status = messages_get("FormSelect");
- pointer = GUI_POINTER_MENU;
+ pointer = BROWSER_POINTER_MENU;
if (mouse & BROWSER_MOUSE_CLICK_1 &&
nsoption_bool(core_select_menu)) {
html->visible_select_menu = gadget;
form_open_select_menu(c, gadget,
form_select_menu_callback,
c);
- pointer = GUI_POINTER_DEFAULT;
+ pointer = BROWSER_POINTER_DEFAULT;
} else if (mouse & BROWSER_MOUSE_CLICK_1)
gui_create_form_select_menu(bw, gadget);
break;
@@ -410,8 +536,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
messages_get("FormSubmit"),
gadget->form->action);
status = status_buffer;
- pointer = get_pointer_shape(bw, gadget_box,
- false);
+ pointer = get_pointer_shape(gadget_box, false);
if (mouse & (BROWSER_MOUSE_CLICK_1 |
BROWSER_MOUSE_CLICK_2))
action = ACTION_SUBMIT;
@@ -421,7 +546,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
break;
case GADGET_TEXTAREA:
status = messages_get("FormTextarea");
- pointer = get_pointer_shape(bw, gadget_box, false);
+ pointer = get_pointer_shape(gadget_box, false);
if (mouse & (BROWSER_MOUSE_PRESS_1 |
BROWSER_MOUSE_PRESS_2)) {
@@ -468,7 +593,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
case GADGET_TEXTBOX:
case GADGET_PASSWORD:
status = messages_get("FormTextbox");
- pointer = get_pointer_shape(bw, gadget_box, false);
+ pointer = get_pointer_shape(gadget_box, false);
if ((mouse & BROWSER_MOUSE_PRESS_1) &&
!(mouse & (BROWSER_MOUSE_MOD_1 |
@@ -526,12 +651,16 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
} else if (object && (mouse & BROWSER_MOUSE_MOD_2)) {
- if (mouse & BROWSER_MOUSE_DRAG_2)
- gui_drag_save_object(GUI_SAVE_OBJECT_NATIVE, object,
- bw->window);
- else if (mouse & BROWSER_MOUSE_DRAG_1)
- gui_drag_save_object(GUI_SAVE_OBJECT_ORIG, object,
- bw->window);
+ if (mouse & BROWSER_MOUSE_DRAG_2) {
+ msg_data.dragsave.type = CONTENT_SAVE_NATIVE;
+ msg_data.dragsave.content = object;
+ content_broadcast(c, CONTENT_MSG_DRAGSAVE, msg_data);
+
+ } else if (mouse & BROWSER_MOUSE_DRAG_1) {
+ msg_data.dragsave.type = CONTENT_SAVE_ORIG;
+ msg_data.dragsave.content = object;
+ content_broadcast(c, CONTENT_MSG_DRAGSAVE, msg_data);
+ }
/* \todo should have a drag-saving object msg */
status = content_get_status_message(h);
@@ -561,22 +690,25 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
} else
status = nsurl_access(url);
- pointer = get_pointer_shape(bw, url_box, imagemap);
+ pointer = get_pointer_shape(url_box, imagemap);
if (mouse & BROWSER_MOUSE_CLICK_1 &&
mouse & BROWSER_MOUSE_MOD_1) {
/* force download of link */
browser_window_go_post(bw, nsurl_access(url), 0, 0,
- false, nsurl_access(hlcache_handle_get_url(h)),
+ false,
+ nsurl_access(hlcache_handle_get_url(h)),
true, true, 0);
+
} else if (mouse & BROWSER_MOUSE_CLICK_2 &&
mouse & BROWSER_MOUSE_MOD_1) {
- gui_window_save_link(bw->window,
- nsurl_access(url), title);
+ msg_data.savelink.url = nsurl_access(url);
+ msg_data.savelink.title = title;
+ content_broadcast(c, CONTENT_MSG_SAVELINK, msg_data);
+
} else if (mouse & (BROWSER_MOUSE_CLICK_1 |
BROWSER_MOUSE_CLICK_2))
action = ACTION_GO;
-
} else {
bool done = false;
@@ -593,7 +725,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
/* if clicking in the main page, remove the selection from any
* text areas */
if (!done) {
- struct box *layout = html_get_box_tree(h);
+ struct box *layout = html->layout;
if (mouse && (mouse < BROWSER_MOUSE_MOD_1) &&
selection_root(&html->sel) != layout) {
@@ -647,8 +779,12 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
if (mouse & BROWSER_MOUSE_DRAG_1) {
if (mouse & BROWSER_MOUSE_MOD_2) {
- gui_drag_save_object(GUI_SAVE_COMPLETE,
- h, bw->window);
+ msg_data.dragsave.type =
+ CONTENT_SAVE_COMPLETE;
+ msg_data.dragsave.content = h;
+ content_broadcast(c,
+ CONTENT_MSG_DRAGSAVE,
+ msg_data);
} else {
if (drag_candidate == NULL)
browser_window_page_drag_start(
@@ -658,13 +794,17 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
drag_candidate,
x, y);
}
- pointer = GUI_POINTER_MOVE;
+ pointer = BROWSER_POINTER_MOVE;
}
}
else if (mouse & BROWSER_MOUSE_DRAG_2) {
if (mouse & BROWSER_MOUSE_MOD_2) {
- gui_drag_save_object(GUI_SAVE_SOURCE,
- h, bw->window);
+ msg_data.dragsave.type =
+ CONTENT_SAVE_SOURCE;
+ msg_data.dragsave.content = h;
+ content_broadcast(c,
+ CONTENT_MSG_DRAGSAVE,
+ msg_data);
} else {
if (drag_candidate == NULL)
browser_window_page_drag_start(
@@ -674,7 +814,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
drag_candidate,
x, y);
}
- pointer = GUI_POINTER_MOVE;
+ pointer = BROWSER_POINTER_MOVE;
}
}
}
@@ -684,24 +824,22 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
}
}
-
- if (action == ACTION_SUBMIT || action == ACTION_GO)
- bw->last_action = wallclock();
-
if (status != NULL) {
msg_data.explicit_status_text = status;
content_broadcast(c, CONTENT_MSG_STATUS, msg_data);
}
- if (!iframe)
- browser_window_set_pointer(bw, pointer);
+ if (!iframe) {
+ msg_data.pointer = pointer;
+ content_broadcast(c, CONTENT_MSG_POINTER, msg_data);
+ }
/* deferred actions that can cause this browser_window to be destroyed
* and must therefore be done after set_status/pointer
*/
switch (action) {
case ACTION_SUBMIT:
- form_submit(bw->current_content,
+ form_submit(content_get_url(c),
browser_window_find_target(bw, target, mouse),
gadget->form, gadget);
break;
@@ -716,114 +854,6 @@ void html_mouse_action(struct content *c, struct browser_window *bw,
}
-gui_pointer_shape get_pointer_shape(struct browser_window *bw, struct box *box,
- bool imagemap)
-{
- gui_pointer_shape pointer;
- css_computed_style *style;
- enum css_cursor_e cursor;
- lwc_string **cursor_uris;
- bool loading;
-
- assert(bw);
-
- loading = (bw->loading_content != NULL || (bw->current_content &&
- content_get_status(bw->current_content) ==
- CONTENT_STATUS_READY));
-
- if (wallclock() - bw->last_action < 100 && loading)
- /* If less than 1 second since last link followed, show
- * progress indicating pointer and we're loading something */
- return GUI_POINTER_PROGRESS;
-
- if (box->type == BOX_FLOAT_LEFT || box->type == BOX_FLOAT_RIGHT)
- style = box->children->style;
- else
- style = box->style;
-
- if (style == NULL)
- return GUI_POINTER_DEFAULT;
-
- cursor = css_computed_cursor(style, &cursor_uris);
-
- switch (cursor) {
- case CSS_CURSOR_AUTO:
- if (box->href || (box->gadget &&
- (box->gadget->type == GADGET_IMAGE ||
- box->gadget->type == GADGET_SUBMIT)) ||
- imagemap) {
- /* link */
- pointer = GUI_POINTER_POINT;
- } else if (box->gadget &&
- (box->gadget->type == GADGET_TEXTBOX ||
- box->gadget->type == GADGET_PASSWORD ||
- box->gadget->type == GADGET_TEXTAREA)) {
- /* text input */
- pointer = GUI_POINTER_CARET;
- } else {
- /* anything else */
- if (loading) {
- /* loading new content */
- pointer = GUI_POINTER_PROGRESS;
- } else {
- pointer = GUI_POINTER_DEFAULT;
- }
- }
- break;
- case CSS_CURSOR_CROSSHAIR:
- pointer = GUI_POINTER_CROSS;
- break;
- case CSS_CURSOR_POINTER:
- pointer = GUI_POINTER_POINT;
- break;
- case CSS_CURSOR_MOVE:
- pointer = GUI_POINTER_MOVE;
- break;
- case CSS_CURSOR_E_RESIZE:
- pointer = GUI_POINTER_RIGHT;
- break;
- case CSS_CURSOR_W_RESIZE:
- pointer = GUI_POINTER_LEFT;
- break;
- case CSS_CURSOR_N_RESIZE:
- pointer = GUI_POINTER_UP;
- break;
- case CSS_CURSOR_S_RESIZE:
- pointer = GUI_POINTER_DOWN;
- break;
- case CSS_CURSOR_NE_RESIZE:
- pointer = GUI_POINTER_RU;
- break;
- case CSS_CURSOR_SW_RESIZE:
- pointer = GUI_POINTER_LD;
- break;
- case CSS_CURSOR_SE_RESIZE:
- pointer = GUI_POINTER_RD;
- break;
- case CSS_CURSOR_NW_RESIZE:
- pointer = GUI_POINTER_LU;
- break;
- case CSS_CURSOR_TEXT:
- pointer = GUI_POINTER_CARET;
- break;
- case CSS_CURSOR_WAIT:
- pointer = GUI_POINTER_WAIT;
- break;
- case CSS_CURSOR_PROGRESS:
- pointer = GUI_POINTER_PROGRESS;
- break;
- case CSS_CURSOR_HELP:
- pointer = GUI_POINTER_HELP;
- break;
- default:
- pointer = GUI_POINTER_DEFAULT;
- break;
- }
-
- return pointer;
-}
-
-
/**
* Callback for in-page scrollbars.
*/
@@ -833,6 +863,7 @@ void html_overflow_scroll_callback(void *client_data,
struct html_scrollbar_data *data = client_data;
html_content *html = (html_content *)data->c;
struct box *box = data->box;
+ union content_msg_data msg_data;
switch(scrollbar_data->msg) {
case SCROLLBAR_MSG_MOVED:
@@ -857,9 +888,10 @@ void html_overflow_scroll_callback(void *client_data,
browser_window_set_drag_type(html->bw,
DRAGGING_NONE, NULL);
-
- browser_window_set_pointer(html->bw,
- GUI_POINTER_DEFAULT);
+
+ msg_data.pointer = BROWSER_POINTER_AUTO;
+ content_broadcast(data->c, CONTENT_MSG_POINTER,
+ msg_data);
break;
}
}
@@ -899,37 +931,3 @@ void html_overflow_scroll_drag_end(struct scrollbar *scrollbar,
scroll_mouse_x, scroll_mouse_y);
}
}
-
-
-/**
- * Start drag scrolling the contents of a box
- *
- * \param box the box to be scrolled
- * \param x x ordinate of initial mouse position
- * \param y y ordinate
- */
-
-void html_box_drag_start(struct box *box, int x, int y)
-{
- int box_x, box_y;
- int scroll_mouse_x, scroll_mouse_y;
-
- box_coords(box, &box_x, &box_y);
-
- if (box->scroll_x != NULL) {
- scroll_mouse_x = x - box_x ;
- scroll_mouse_y = y - (box_y + box->padding[TOP] +
- box->height + box->padding[BOTTOM] -
- SCROLLBAR_WIDTH);
- scrollbar_start_content_drag(box->scroll_x,
- scroll_mouse_x, scroll_mouse_y);
- } else if (box->scroll_y != NULL) {
- scroll_mouse_x = x - (box_x + box->padding[LEFT] +
- box->width + box->padding[RIGHT] -
- SCROLLBAR_WIDTH);
- scroll_mouse_y = y - box_y;
-
- scrollbar_start_content_drag(box->scroll_y,
- scroll_mouse_x, scroll_mouse_y);
- }
-}
diff --git a/render/textinput.c b/render/textinput.c
index 3c3eb7361..6c580a8cd 100644
--- a/render/textinput.c
+++ b/render/textinput.c
@@ -1911,7 +1911,7 @@ bool textinput_input_callback(struct browser_window *bw, uint32_t key,
selection_clear(&html->sel, true);
if (form)
- form_submit(bw->current_content, bw, form, 0);
+ form_submit(content_get_url(c), bw, form, 0);
return true;
case KEY_SHIFT_TAB:
diff --git a/render/textplain.c b/render/textplain.c
index 7b0262be9..71d576579 100644
--- a/render/textplain.c
+++ b/render/textplain.c
@@ -675,7 +675,8 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw,
browser_mouse_state mouse, int x, int y)
{
textplain_content *text = (textplain_content *) c;
- gui_pointer_shape pointer = GUI_POINTER_DEFAULT;
+ browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT;
+ union content_msg_data msg_data;
const char *status = 0;
size_t idx;
int dir = 0;
@@ -701,14 +702,15 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw,
if (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2)) {
browser_window_page_drag_start(bw, x, y);
- pointer = GUI_POINTER_MOVE;
+ pointer = BROWSER_POINTER_MOVE;
}
}
if (status != NULL)
browser_window_set_status(bw, status);
- browser_window_set_pointer(bw, pointer);
+ msg_data.pointer = pointer;
+ content_broadcast(c, CONTENT_MSG_POINTER, msg_data);
}