summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/Pointers,ff9bin540 -> 1228 bytes
-rw-r--r--css/css.c8
-rw-r--r--css/css.h1
-rw-r--r--css/css_enums1
-rw-r--r--css/ruleset.c20
-rw-r--r--desktop/browser.c61
-rw-r--r--desktop/gui.h4
-rw-r--r--riscos/gui.c24
8 files changed, 111 insertions, 8 deletions
diff --git a/!NetSurf/Resources/Pointers,ff9 b/!NetSurf/Resources/Pointers,ff9
index 5c68403c7..520cea2e5 100644
--- a/!NetSurf/Resources/Pointers,ff9
+++ b/!NetSurf/Resources/Pointers,ff9
Binary files differ
diff --git a/css/css.c b/css/css.c
index 3b8dbeee9..6b83291fe 100644
--- a/css/css.c
+++ b/css/css.c
@@ -49,6 +49,7 @@ const struct css_style css_base_style = {
{ 2, CSS_UNIT_PX } }, CSS_BORDER_STYLE_NONE } },
CSS_CLEAR_NONE,
0x000000,
+ CSS_CURSOR_AUTO,
CSS_DISPLAY_BLOCK,
CSS_FLOAT_NONE,
{ CSS_FONT_SIZE_LENGTH, { { 10, CSS_UNIT_PT } } },
@@ -87,6 +88,7 @@ const struct css_style css_empty_style = {
{ 0, CSS_UNIT_PX } }, CSS_BORDER_STYLE_INHERIT } },
CSS_CLEAR_INHERIT,
CSS_COLOR_INHERIT,
+ CSS_CURSOR_INHERIT,
CSS_DISPLAY_INHERIT,
CSS_FLOAT_INHERIT,
{ CSS_FONT_SIZE_INHERIT, { { 1, CSS_UNIT_EM } } },
@@ -125,6 +127,7 @@ const struct css_style css_blank_style = {
{ 2, CSS_UNIT_PX } }, CSS_BORDER_STYLE_NONE } },
CSS_CLEAR_NONE,
CSS_COLOR_INHERIT,
+ CSS_CURSOR_INHERIT,
CSS_DISPLAY_INLINE,
CSS_FLOAT_NONE,
{ CSS_FONT_SIZE_INHERIT, { { 1, CSS_UNIT_EM } } },
@@ -681,6 +684,7 @@ void css_dump_style(const struct css_style * const style)
fprintf(stderr, "background-color: #%lx; ", style->background_color);
fprintf(stderr, "clear: %s; ", css_clear_name[style->clear]);
fprintf(stderr, "color: #%lx; ", style->color);
+ fprintf(stderr, "cursor: %s", css_cursor_name[style->cursor]);
fprintf(stderr, "display: %s; ", css_display_name[style->display]);
fprintf(stderr, "float: %s; ", css_float_name[style->float_]);
fprintf(stderr, "font: %s %s ", css_font_style_name[style->font_style],
@@ -826,6 +830,8 @@ void css_cascade(struct css_style * const style, const struct css_style * const
style->clear = apply->clear;
if (apply->color != CSS_COLOR_INHERIT)
style->color = apply->color;
+ if (apply->cursor != CSS_CURSOR_INHERIT)
+ style->cursor = apply->cursor;
if (apply->display != CSS_DISPLAY_INHERIT)
style->display = apply->display;
if (apply->float_ != CSS_FLOAT_INHERIT)
@@ -920,6 +926,8 @@ void css_merge(struct css_style * const style, const struct css_style * const ap
style->clear = apply->clear;
if (apply->color != CSS_COLOR_INHERIT)
style->color = apply->color;
+ if (apply->cursor != CSS_CURSOR_INHERIT)
+ style->cursor = apply->cursor;
if (apply->display != CSS_DISPLAY_INHERIT)
style->display = apply->display;
if (apply->float_ != CSS_FLOAT_INHERIT)
diff --git a/css/css.h b/css/css.h
index 0c1f65e6f..a756ea316 100644
--- a/css/css.h
+++ b/css/css.h
@@ -72,6 +72,7 @@ struct css_style {
css_clear clear;
colour color;
+ css_cursor cursor;
css_display display;
css_float float_;
diff --git a/css/css_enums b/css/css_enums
index e8d85ae5e..2cccda18a 100644
--- a/css/css_enums
+++ b/css/css_enums
@@ -4,6 +4,7 @@ css_background_position inherit top center bottom left right length percent
css_background_repeat inherit repeat repeat_x repeat_y no_repeat
css_border_style inherit none hidden dotted dashed solid double groove ridge inset outset
css_clear inherit none both left right
+css_cursor inherit auto crosshair default pointer move e-resize ne-resize nw-resize n-resize se-resize sw-resize s-resize w-resize text wait help
css_display inherit inline block list-item run-in inline-block table inline-table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption none
css_float inherit none left right
css_font_family inherit sans-serif serif monospace cursive fantasy
diff --git a/css/ruleset.c b/css/ruleset.c
index 7ae15bd02..381e1fea3 100644
--- a/css/ruleset.c
+++ b/css/ruleset.c
@@ -70,6 +70,7 @@ static void parse_border_width_side(struct css_style * const s,
const struct css_node * const v, unsigned int i);
static void parse_clear(struct css_style * const s, const struct css_node * const v);
static void parse_color(struct css_style * const s, const struct css_node * const v);
+static void parse_cursor(struct css_style * const s, const struct css_node * v);
static void parse_display(struct css_style * const s, const struct css_node * const v);
static void parse_float(struct css_style * const s, const struct css_node * const v);
static void parse_font(struct css_style * const s, const struct css_node * v);
@@ -130,6 +131,7 @@ static const struct property_entry property_table[] = {
{ "border-width", parse_border_width },
{ "clear", parse_clear },
{ "color", parse_color },
+ { "cursor", parse_cursor },
{ "display", parse_display },
{ "float", parse_float },
{ "font", parse_font },
@@ -735,6 +737,24 @@ void parse_color(struct css_style * const s, const struct css_node * const v)
s->color = c;
}
+void parse_cursor(struct css_style * const s, const struct css_node * v)
+{
+ css_cursor z;
+ for (; v; v = v->next) {
+ switch (v->type) {
+ case CSS_NODE_IDENT:
+ z = css_cursor_parse(v->data);
+ if (z != CSS_CURSOR_UNKNOWN) {
+ s->cursor = z;
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
void parse_display(struct css_style * const s, const struct css_node * const v)
{
css_display z;
diff --git a/desktop/browser.c b/desktop/browser.c
index aec455fc2..2413df7aa 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -79,6 +79,7 @@ static void browser_window_input_click(struct browser_window* bw,
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);
+static gui_pointer_shape get_pointer_shape(css_cursor cursor);
/**
@@ -1332,6 +1333,47 @@ void box_under_area(struct box *box, unsigned long x, unsigned long y,
return;
}
+gui_pointer_shape get_pointer_shape(css_cursor cursor) {
+
+ gui_pointer_shape pointer;
+
+ switch (cursor) {
+ 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:
+ case CSS_CURSOR_W_RESIZE:
+ pointer = GUI_POINTER_LR;
+ break;
+ case CSS_CURSOR_N_RESIZE:
+ case CSS_CURSOR_S_RESIZE:
+ pointer = GUI_POINTER_UD;
+ break;
+ case CSS_CURSOR_NE_RESIZE:
+ case CSS_CURSOR_SW_RESIZE:
+ pointer = GUI_POINTER_LD;
+ break;
+ case CSS_CURSOR_SE_RESIZE:
+ case CSS_CURSOR_NW_RESIZE:
+ pointer = GUI_POINTER_RD;
+ break;
+ case CSS_CURSOR_TEXT:
+ pointer = GUI_POINTER_CARET;
+ break;
+ default:
+ pointer = GUI_POINTER_DEFAULT;
+ break;
+ }
+
+ return pointer;
+}
+
void browser_window_follow_link(struct browser_window *bw,
unsigned long click_x,
unsigned long click_y, int click_type)
@@ -1340,6 +1382,7 @@ void browser_window_follow_link(struct browser_window *bw,
int found, plot_index;
int i;
int done = 0;
+ gui_pointer_shape pointer = GUI_POINTER_DEFAULT;
found = 0;
click_boxes = NULL;
@@ -1385,7 +1428,7 @@ void browser_window_follow_link(struct browser_window *bw,
}
} else if (click_type == 0) {
browser_window_set_status(bw, url);
- browser_window_set_pointer(GUI_POINTER_POINT);
+ pointer = GUI_POINTER_POINT;
done = 1;
}
free(url);
@@ -1426,7 +1469,7 @@ void browser_window_follow_link(struct browser_window *bw,
}
} else if (click_type == 0) {
browser_window_set_status(bw, url);
- browser_window_set_pointer(GUI_POINTER_POINT);
+ pointer = GUI_POINTER_POINT;
done = 1;
}
free(url);
@@ -1437,12 +1480,12 @@ void browser_window_follow_link(struct browser_window *bw,
click_boxes[i].box->gadget->type == GADGET_TEXTAREA ||
click_boxes[i].box->gadget->type == GADGET_PASSWORD ||
click_boxes[i].box->gadget->type == GADGET_FILE) {
- browser_window_set_pointer(GUI_POINTER_CARET);
+ pointer = GUI_POINTER_CARET;
done = 1;
break;
}
else if (click_boxes[i].box->gadget->type == GADGET_SELECT) {
- browser_window_set_pointer(GUI_POINTER_MENU);
+ pointer = GUI_POINTER_MENU;
done = 1;
break;
}
@@ -1465,10 +1508,14 @@ void browser_window_follow_link(struct browser_window *bw,
browser_window_set_status(bw,
click_boxes[i].box->
title);
- browser_window_set_pointer(GUI_POINTER_DEFAULT);
done = 1;
break;
}
+ if (click_type == 0 && click_boxes[i].box->style->cursor != CSS_CURSOR_UNKNOWN) {
+ pointer = get_pointer_shape(click_boxes[i].box->style->cursor);
+ done = 1;
+ break;
+ }
}
if (click_type == 0 && done == 0) {
@@ -1476,16 +1523,16 @@ void browser_window_follow_link(struct browser_window *bw,
browser_window_set_status(bw,
bw->loading_content->
status_message);
- browser_window_set_pointer(GUI_POINTER_DEFAULT);
}
else {
browser_window_set_status(bw,
bw->current_content->
status_message);
- browser_window_set_pointer(GUI_POINTER_DEFAULT);
}
}
+ browser_window_set_pointer(pointer);
+
free(click_boxes);
return;
diff --git a/desktop/gui.h b/desktop/gui.h
index 9bb8412e4..95b18083f 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -16,7 +16,9 @@
struct gui_window;
typedef struct gui_window gui_window;
typedef enum { GUI_POINTER_DEFAULT, GUI_POINTER_POINT, GUI_POINTER_CARET,
- GUI_POINTER_MENU } gui_pointer_shape;
+ GUI_POINTER_MENU, GUI_POINTER_UD, GUI_POINTER_LR,
+ GUI_POINTER_LD, GUI_POINTER_RD, GUI_POINTER_CROSS,
+ GUI_POINTER_MOVE } gui_pointer_shape;
#include <stdbool.h>
#include "netsurf/desktop/browser.h"
diff --git a/riscos/gui.c b/riscos/gui.c
index d5e16c3f4..0560a2687 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -540,6 +540,30 @@ void gui_window_set_pointer(gui_pointer_shape shape)
xosspriteop_set_pointer_shape(0x100, pointers,
(osspriteop_id)"ptr_menu", 1, 6, 4, 0, 0);
break;
+ case GUI_POINTER_UD:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_ud", 1, 6, 0, 0, 0);
+ break;
+ case GUI_POINTER_LR:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_lr", 1, 0, 6, 0, 0);
+ break;
+ case GUI_POINTER_LD:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_ld", 1, 13, 0, 0, 0);
+ break;
+ case GUI_POINTER_RD:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_rd", 1, 0, 0, 0, 0);
+ break;
+ case GUI_POINTER_CROSS:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_cross", 1, 8, 0, 0, 0);
+ break;
+ case GUI_POINTER_MOVE:
+ xosspriteop_set_pointer_shape(0x100, pointers,
+ (osspriteop_id)"ptr_move", 1, 8, 0, 0, 0);
+ break;
}
curr_pointer = shape;