From 0a8976156a037bc2ec2d4d10f33334ada36eac9d Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 3 Mar 2017 14:30:39 +0000 Subject: split out browser window drag context into separate structure --- desktop/browser.c | 92 ++++++++++++++++++++++------------------ desktop/browser_private.h | 43 +++++++++++-------- desktop/frames.c | 42 ++++++++++-------- include/netsurf/browser_window.h | 3 ++ 4 files changed, 104 insertions(+), 76 deletions(-) diff --git a/desktop/browser.c b/desktop/browser.c index 8e39c0824..0a4afc19b 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -421,22 +421,24 @@ void browser_window_set_position(struct browser_window *bw, int x, int y) } /* exported interface, documented in browser.h */ -void browser_window_set_drag_type(struct browser_window *bw, - browser_drag_type type, const struct rect *rect) +void +browser_window_set_drag_type(struct browser_window *bw, + browser_drag_type type, + const struct rect *rect) { struct browser_window *top_bw = browser_window_get_root(bw); gui_drag_type gtype; - bw->drag_type = type; + bw->drag.type = type; if (type == DRAGGING_NONE) { - top_bw->drag_window = NULL; + top_bw->drag.window = NULL; } else { - top_bw->drag_window = bw; + top_bw->drag.window = bw; switch (type) { case DRAGGING_SELECTION: - /* TODO: tell front end */ + /** \todo tell front end */ return; case DRAGGING_SCR_X: case DRAGGING_SCR_Y: @@ -455,7 +457,7 @@ void browser_window_set_drag_type(struct browser_window *bw, /* exported interface, documented in browser.h */ browser_drag_type browser_window_get_drag_type(struct browser_window *bw) { - return bw->drag_type; + return bw->drag.type; } /* exported interface, documented in browser.h */ @@ -939,7 +941,7 @@ nserror browser_window_initialise_common(enum browser_window_create_flags flags, /* window characteristics */ bw->refresh_interval = -1; - bw->drag_type = DRAGGING_NONE; + bw->drag.type = DRAGGING_NONE; bw->scroll_x = NULL; bw->scroll_y = NULL; @@ -2879,7 +2881,7 @@ static void browser_window_mouse_drag_end(struct browser_window *bw, { int scr_x, scr_y; - switch (bw->drag_type) { + switch (bw->drag.type) { case DRAGGING_SELECTION: case DRAGGING_OTHER: case DRAGGING_CONTENT_SCROLLBAR: @@ -2895,7 +2897,7 @@ static void browser_window_mouse_drag_end(struct browser_window *bw, scrollbar_mouse_drag_end(bw->scroll_x, mouse, scr_x, scr_y); - bw->drag_type = DRAGGING_NONE; + bw->drag.type = DRAGGING_NONE; break; case DRAGGING_SCR_Y: @@ -2907,7 +2909,7 @@ static void browser_window_mouse_drag_end(struct browser_window *bw, scrollbar_mouse_drag_end(bw->scroll_y, mouse, scr_x, scr_y); - bw->drag_type = DRAGGING_NONE; + bw->drag.type = DRAGGING_NONE; break; default: @@ -2925,11 +2927,11 @@ void browser_window_mouse_track(struct browser_window *bw, const char *status = NULL; browser_pointer_shape pointer = BROWSER_POINTER_DEFAULT; - if (bw->window != NULL && bw->drag_window && bw != bw->drag_window) { + if (bw->window != NULL && bw->drag.window && bw != bw->drag.window) { /* This is the root browser window and there's an active drag * in a sub window. * Pass the mouse action straight on to that bw. */ - struct browser_window *drag_bw = bw->drag_window; + struct browser_window *drag_bw = bw->drag.window; int off_x = 0; int off_y = 0; @@ -2982,25 +2984,27 @@ void browser_window_mouse_track(struct browser_window *bw, return; } - if (c == NULL && bw->drag_type != DRAGGING_FRAME) + if (c == NULL && bw->drag.type != DRAGGING_FRAME) { return; + } - if (bw->drag_type != DRAGGING_NONE && !mouse) { + if (bw->drag.type != DRAGGING_NONE && !mouse) { browser_window_mouse_drag_end(bw, mouse, x, y); } /* Browser window's horizontal scrollbar */ - if (bw->scroll_x != NULL && bw->drag_type != DRAGGING_SCR_Y) { + if (bw->scroll_x != NULL && bw->drag.type != DRAGGING_SCR_Y) { int scr_x, scr_y; browser_window_get_scrollbar_pos(bw, true, &scr_x, &scr_y); scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x); scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y); - if ((scr_x > 0 && scr_x < browser_window_get_scrollbar_len(bw, - true) && - scr_y > 0 && scr_y < SCROLLBAR_WIDTH && - bw->drag_type == DRAGGING_NONE) || - bw->drag_type == DRAGGING_SCR_X) { + if ((bw->drag.type == DRAGGING_SCR_X) || + (scr_x > 0 && + scr_x < browser_window_get_scrollbar_len(bw, true) && + scr_y > 0 && + scr_y < SCROLLBAR_WIDTH && + bw->drag.type == DRAGGING_NONE)) { /* Start a scrollbar drag, or continue existing drag */ status = scrollbar_mouse_status_to_message( scrollbar_mouse_action( @@ -3008,8 +3012,9 @@ void browser_window_mouse_track(struct browser_window *bw, scr_x, scr_y)); pointer = BROWSER_POINTER_DEFAULT; - if (status != NULL) + if (status != NULL) { browser_window_set_status(bw, status); + } browser_window_set_pointer(bw, pointer); return; @@ -3023,11 +3028,12 @@ void browser_window_mouse_track(struct browser_window *bw, scr_x = x - scr_x - scrollbar_get_offset(bw->scroll_x); scr_y = y - scr_y - scrollbar_get_offset(bw->scroll_y); - if ((scr_y > 0 && scr_y < browser_window_get_scrollbar_len(bw, - false) && - scr_x > 0 && scr_x < SCROLLBAR_WIDTH && - bw->drag_type == DRAGGING_NONE) || - bw->drag_type == DRAGGING_SCR_Y) { + if ((bw->drag.type == DRAGGING_SCR_Y) || + (scr_y > 0 && + scr_y < browser_window_get_scrollbar_len(bw, false) && + scr_x > 0 && + scr_x < SCROLLBAR_WIDTH && + bw->drag.type == DRAGGING_NONE)) { /* Start a scrollbar drag, or continue existing drag */ status = scrollbar_mouse_status_to_message( scrollbar_mouse_action( @@ -3035,27 +3041,28 @@ void browser_window_mouse_track(struct browser_window *bw, scr_x, scr_y)); pointer = BROWSER_POINTER_DEFAULT; - if (status != NULL) + if (status != NULL) { browser_window_set_status(bw, status); + } browser_window_set_pointer(bw, pointer); return; } } - if (bw->drag_type == DRAGGING_FRAME) { + if (bw->drag.type == DRAGGING_FRAME) { browser_window_resize_frame(bw, bw->x + x, bw->y + y); - } else if (bw->drag_type == DRAGGING_PAGE_SCROLL) { + } else if (bw->drag.type == DRAGGING_PAGE_SCROLL) { /* mouse movement since drag started */ - int scrollx = bw->drag_start_x - x; - int scrolly = bw->drag_start_y - y; + int scrollx = bw->drag.start_x - x; + int scrolly = bw->drag.start_y - y; /* new scroll offsets */ - scrollx += bw->drag_start_scroll_x; - scrolly += bw->drag_start_scroll_y; + scrollx += bw->drag.start_scroll_x; + scrolly += bw->drag.start_scroll_y; - bw->drag_start_scroll_x = scrollx; - bw->drag_start_scroll_y = scrolly; + bw->drag.start_scroll_x = scrollx; + bw->drag.start_scroll_y = scrolly; browser_window_set_scroll(bw, scrollx, scrolly); } else { @@ -3205,19 +3212,20 @@ void browser_window_page_drag_start(struct browser_window *bw, int x, int y) browser_window_set_drag_type(bw, DRAGGING_PAGE_SCROLL, NULL); - bw->drag_start_x = x; - bw->drag_start_y = y; + bw->drag.start_x = x; + bw->drag.start_y = y; if (bw->window != NULL) { /* Front end window */ - guit->window->get_scroll(bw->window, &bw->drag_start_scroll_x, - &bw->drag_start_scroll_y); + guit->window->get_scroll(bw->window, + &bw->drag.start_scroll_x, + &bw->drag.start_scroll_y); guit->window->scroll_start(bw->window); } else { /* Core managed browser window */ - bw->drag_start_scroll_x = scrollbar_get_offset(bw->scroll_x); - bw->drag_start_scroll_y = scrollbar_get_offset(bw->scroll_y); + bw->drag.start_scroll_x = scrollbar_get_offset(bw->scroll_x); + bw->drag.start_scroll_y = scrollbar_get_offset(bw->scroll_y); } } diff --git a/desktop/browser_private.h b/desktop/browser_private.h index b8dce84bb..3e9b8467a 100644 --- a/desktop/browser_private.h +++ b/desktop/browser_private.h @@ -90,23 +90,32 @@ struct browser_window { /** Fragment identifier for current_content. */ lwc_string *frag_id; - /** Current drag status. */ - browser_drag_type drag_type; - - /** Current drag's browser window, when not in root bw. */ - struct browser_window *drag_window; - - /** Mouse position at start of current scroll drag. */ - int drag_start_x; - int drag_start_y; - /** Scroll offsets at start of current scroll draw. */ - int drag_start_scroll_x; - int drag_start_scroll_y; - /** Frame resize directions for current frame resize drag. */ - unsigned int drag_resize_left : 1; - unsigned int drag_resize_right : 1; - unsigned int drag_resize_up : 1; - unsigned int drag_resize_down : 1; + /** + * Current drag status. + * + * These values are only vald whle type is not DRAGGING_NONE + */ + struct { + /** the type of drag in progress */ + browser_drag_type type; + + /** Current drag's browser window, when not in root bw. */ + struct browser_window *window; + + /** Mouse position at start of current scroll drag. */ + int start_x; + int start_y; + + /** Scroll offsets at start of current scroll draw. */ + int start_scroll_x; + int start_scroll_y; + + /** Frame resize directions for current frame resize drag. */ + unsigned int resize_left : 1; + unsigned int resize_right : 1; + unsigned int resize_up : 1; + unsigned int resize_down : 1; + } drag; /** Current fetch is download */ bool download; diff --git a/desktop/frames.c b/desktop/frames.c index 70e51e754..9eefefe02 100644 --- a/desktop/frames.c +++ b/desktop/frames.c @@ -675,25 +675,31 @@ void browser_window_resize_frame(struct browser_window *bw, int x, int y) assert((col >= 0) && (row >= 0)); sibling = NULL; - if (bw->drag_resize_left) + if (bw->drag.resize_left) { sibling = &parent->children[row * parent->cols + (col - 1)]; - else if (bw->drag_resize_right) + } else if (bw->drag.resize_right) { sibling = &parent->children[row * parent->cols + (col + 1)]; - if (sibling) + } + if (sibling) { change |= browser_window_resolve_frame_dimension(bw, sibling, x, y, true, false); + } sibling = NULL; - if (bw->drag_resize_up) + if (bw->drag.resize_up) { sibling = &parent->children[(row - 1) * parent->cols + col]; - else if (bw->drag_resize_down) + } else if (bw->drag.resize_down) { sibling = &parent->children[(row + 1) * parent->cols + col]; - if (sibling) + } + + if (sibling) { change |= browser_window_resolve_frame_dimension(bw, sibling, x, y, false, true); + } - if (change) + if (change) { browser_window_recalculate_frameset(parent); + } } @@ -711,20 +717,22 @@ bool browser_window_resolve_frame_dimension(struct browser_window *bw, /* extend/shrink the box to the pointer */ if (width) { - if (bw->drag_resize_left) + if (bw->drag.resize_left) { bw_dimension = bw->x + bw->width - x; - else + } else { bw_dimension = x - bw->x; + } bw_pixels = bw->width; sibling_pixels = sibling->width; bw_d = &bw->frame_width; sibling_d = &sibling->frame_width; frame_size = bw->parent->width; } else { - if (bw->drag_resize_up) + if (bw->drag.resize_up) { bw_dimension = bw->y + bw->height - y; - else + } else { bw_dimension = y - bw->y; + } bw_pixels = bw->height; sibling_pixels = sibling->height; bw_d = &bw->frame_height; @@ -919,12 +927,12 @@ static bool browser_window_resize_frames(struct browser_window *bw, * front end to clamp pointer range */ browser_window_set_drag_type(bw, DRAGGING_FRAME, NULL); - bw->drag_start_x = x; - bw->drag_start_y = y; - bw->drag_resize_left = left; - bw->drag_resize_right = right; - bw->drag_resize_up = up; - bw->drag_resize_down = down; + bw->drag.start_x = x; + bw->drag.start_y = y; + bw->drag.resize_left = left; + bw->drag.resize_right = right; + bw->drag.resize_up = up; + bw->drag.resize_down = down; } return true; } diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h index 482dcb92c..858d4aeac 100644 --- a/include/netsurf/browser_window.h +++ b/include/netsurf/browser_window.h @@ -43,6 +43,9 @@ struct rect; struct redraw_context; enum content_debug; +/** + * type of browser window drag in progess + */ typedef enum { DRAGGING_NONE, DRAGGING_SELECTION, -- cgit v1.2.3