diff options
-rw-r--r-- | !NetSurf/Resources/Pointers,ff9 | bin | 540 -> 1228 bytes | |||
-rw-r--r-- | css/css.c | 8 | ||||
-rw-r--r-- | css/css.h | 1 | ||||
-rw-r--r-- | css/css_enums | 1 | ||||
-rw-r--r-- | css/ruleset.c | 20 | ||||
-rw-r--r-- | desktop/browser.c | 61 | ||||
-rw-r--r-- | desktop/gui.h | 4 | ||||
-rw-r--r-- | riscos/gui.c | 24 |
8 files changed, 111 insertions, 8 deletions
diff --git a/!NetSurf/Resources/Pointers,ff9 b/!NetSurf/Resources/Pointers,ff9 Binary files differindex 5c68403c7..520cea2e5 100644 --- a/!NetSurf/Resources/Pointers,ff9 +++ b/!NetSurf/Resources/Pointers,ff9 @@ -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) @@ -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; |