netsurf: branch master updated. release/3.0-299-ge8f2297
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/e8f2297d0fcfef6edfd02...
...commit http://git.netsurf-browser.org/netsurf.git/commit/e8f2297d0fcfef6edfd024c...
...tree http://git.netsurf-browser.org/netsurf.git/tree/e8f2297d0fcfef6edfd024c83...
The branch, master has been updated
via e8f2297d0fcfef6edfd024c838436b9c218d8aa9 (commit)
from 7bd01a0e7504e0b44fdade4581e57cb00151566d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=e8f2297d0fcfef6edfd...
commit e8f2297d0fcfef6edfd024c838436b9c218d8aa9
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Improve doc comments.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 0e3880b..ead92ec 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1405,6 +1405,8 @@ bool treeview_select_all(treeview *tree, struct rect *rect)
/**
* Commit a current selection drag, modifying the node's selection state.
+ *
+ * \param tree Treeview object to commit drag selection in
*/
static void treeview_commit_selection_drag(treeview *tree)
{
@@ -1428,6 +1430,10 @@ static void treeview_commit_selection_drag(treeview *tree)
/**
* Delete a selection.
+ *
+ * \param tree Treeview object to delete selected nodes from
+ * \param rect Updated to redraw rectangle
+ * \return true iff redraw required.
*/
static bool treeview_delete_selection(treeview *tree, struct rect *rect)
{
@@ -1458,6 +1464,7 @@ struct treeview_launch_walk_data {
int selected_depth;
treeview *tree;
};
+/** Treewalk node walk backward callback for tracking folder selection. */
static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
bool *end)
{
@@ -1469,6 +1476,7 @@ static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
return NSERROR_OK;
}
+/** Treewalk node walk forward callback for launching nodes. */
static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
bool *skip_children, bool *end)
{
@@ -1490,6 +1498,12 @@ static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
}
/**
* Launch a selection.
+ *
+ * \param tree Treeview object to launch selected nodes in
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Note: Selected entries are launched.
+ * Entries that are descendants of selected folders are also launched.
*/
static nserror treeview_launch_selection(treeview *tree)
{
-----------------------------------------------------------------------
Summary of changes:
desktop/treeview.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 0e3880b..ead92ec 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1405,6 +1405,8 @@ bool treeview_select_all(treeview *tree, struct rect *rect)
/**
* Commit a current selection drag, modifying the node's selection state.
+ *
+ * \param tree Treeview object to commit drag selection in
*/
static void treeview_commit_selection_drag(treeview *tree)
{
@@ -1428,6 +1430,10 @@ static void treeview_commit_selection_drag(treeview *tree)
/**
* Delete a selection.
+ *
+ * \param tree Treeview object to delete selected nodes from
+ * \param rect Updated to redraw rectangle
+ * \return true iff redraw required.
*/
static bool treeview_delete_selection(treeview *tree, struct rect *rect)
{
@@ -1458,6 +1464,7 @@ struct treeview_launch_walk_data {
int selected_depth;
treeview *tree;
};
+/** Treewalk node walk backward callback for tracking folder selection. */
static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
bool *end)
{
@@ -1469,6 +1476,7 @@ static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
return NSERROR_OK;
}
+/** Treewalk node walk forward callback for launching nodes. */
static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
bool *skip_children, bool *end)
{
@@ -1490,6 +1498,12 @@ static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
}
/**
* Launch a selection.
+ *
+ * \param tree Treeview object to launch selected nodes in
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Note: Selected entries are launched.
+ * Entries that are descendants of selected folders are also launched.
*/
static nserror treeview_launch_selection(treeview *tree)
{
--
NetSurf Browser
9 years, 8 months
netsurf: branch master updated. release/3.0-298-g7bd01a0
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/7bd01a0e7504e0b44fdad...
...commit http://git.netsurf-browser.org/netsurf.git/commit/7bd01a0e7504e0b44fdade4...
...tree http://git.netsurf-browser.org/netsurf.git/tree/7bd01a0e7504e0b44fdade458...
The branch, master has been updated
via 7bd01a0e7504e0b44fdade4581e57cb00151566d (commit)
from 67066ce47c1f65ea6ba071068a78c29a7e3b63e5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=7bd01a0e7504e0b44fd...
commit 7bd01a0e7504e0b44fdade4581e57cb00151566d
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Return key launches current selection.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 5b2d327..0e3880b 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1454,6 +1454,59 @@ static bool treeview_delete_selection(treeview *tree, struct rect *rect)
}
+struct treeview_launch_walk_data {
+ int selected_depth;
+ treeview *tree;
+};
+static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
+ bool *end)
+{
+ struct treeview_launch_walk_data *lw = ctx;
+
+ if (n->type == TREE_NODE_FOLDER && n->flags == TREE_NODE_SELECTED) {
+ lw->selected_depth--;
+ }
+
+ return NSERROR_OK;
+}
+static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end)
+{
+ struct treeview_launch_walk_data *lw = ctx;
+
+ if (n->type == TREE_NODE_FOLDER && n->flags & TREE_NODE_SELECTED) {
+ lw->selected_depth++;
+
+ } else if (n->type == TREE_NODE_ENTRY &&
+ (n->flags & TREE_NODE_SELECTED ||
+ lw->selected_depth > 0)) {
+ struct treeview_node_msg msg;
+ msg.msg = TREE_MSG_NODE_LAUNCH;
+ msg.data.node_launch.mouse = BROWSER_MOUSE_HOVER;
+ lw->tree->callbacks->entry(msg, n->client_data);
+ }
+
+ return NSERROR_OK;
+}
+/**
+ * Launch a selection.
+ */
+static nserror treeview_launch_selection(treeview *tree)
+{
+ struct treeview_launch_walk_data lw;
+
+ assert(tree != NULL);
+ assert(tree->root != NULL);
+
+ lw.selected_depth = 0;
+ lw.tree = tree;
+
+ return treeview_walk_internal(tree->root, false,
+ treeview_node_launch_walk_bwd_cb,
+ treeview_node_launch_walk_fwd_cb, &lw);
+}
+
+
/* Exported interface, documented in treeview.h */
bool treeview_keypress(treeview *tree, uint32_t key)
{
@@ -1482,7 +1535,7 @@ bool treeview_keypress(treeview *tree, uint32_t key)
break;
case KEY_CR:
case KEY_NL:
- /* TODO: Launch selection */
+ err = treeview_launch_selection(tree);
break;
case KEY_ESCAPE:
case KEY_CLEAR_SELECTION:
-----------------------------------------------------------------------
Summary of changes:
desktop/treeview.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 5b2d327..0e3880b 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -1454,6 +1454,59 @@ static bool treeview_delete_selection(treeview *tree, struct rect *rect)
}
+struct treeview_launch_walk_data {
+ int selected_depth;
+ treeview *tree;
+};
+static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx,
+ bool *end)
+{
+ struct treeview_launch_walk_data *lw = ctx;
+
+ if (n->type == TREE_NODE_FOLDER && n->flags == TREE_NODE_SELECTED) {
+ lw->selected_depth--;
+ }
+
+ return NSERROR_OK;
+}
+static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end)
+{
+ struct treeview_launch_walk_data *lw = ctx;
+
+ if (n->type == TREE_NODE_FOLDER && n->flags & TREE_NODE_SELECTED) {
+ lw->selected_depth++;
+
+ } else if (n->type == TREE_NODE_ENTRY &&
+ (n->flags & TREE_NODE_SELECTED ||
+ lw->selected_depth > 0)) {
+ struct treeview_node_msg msg;
+ msg.msg = TREE_MSG_NODE_LAUNCH;
+ msg.data.node_launch.mouse = BROWSER_MOUSE_HOVER;
+ lw->tree->callbacks->entry(msg, n->client_data);
+ }
+
+ return NSERROR_OK;
+}
+/**
+ * Launch a selection.
+ */
+static nserror treeview_launch_selection(treeview *tree)
+{
+ struct treeview_launch_walk_data lw;
+
+ assert(tree != NULL);
+ assert(tree->root != NULL);
+
+ lw.selected_depth = 0;
+ lw.tree = tree;
+
+ return treeview_walk_internal(tree->root, false,
+ treeview_node_launch_walk_bwd_cb,
+ treeview_node_launch_walk_fwd_cb, &lw);
+}
+
+
/* Exported interface, documented in treeview.h */
bool treeview_keypress(treeview *tree, uint32_t key)
{
@@ -1482,7 +1535,7 @@ bool treeview_keypress(treeview *tree, uint32_t key)
break;
case KEY_CR:
case KEY_NL:
- /* TODO: Launch selection */
+ err = treeview_launch_selection(tree);
break;
case KEY_ESCAPE:
case KEY_CLEAR_SELECTION:
--
NetSurf Browser
9 years, 8 months
netsurf: branch master updated. release/3.0-297-g67066ce
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/67066ce47c1f65ea6ba07...
...commit http://git.netsurf-browser.org/netsurf.git/commit/67066ce47c1f65ea6ba0710...
...tree http://git.netsurf-browser.org/netsurf.git/tree/67066ce47c1f65ea6ba071068...
The branch, master has been updated
via 67066ce47c1f65ea6ba071068a78c29a7e3b63e5 (commit)
from de1f0afde282acbf46c03ccba4148974ebf8b210 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=67066ce47c1f65ea6ba...
commit 67066ce47c1f65ea6ba071068a78c29a7e3b63e5
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Shave a few more px off animated background redraw, in the non-tiled cases. (Restrict area to part of image that changed.)
diff --git a/render/html_object.c b/render/html_object.c
index 0868ce3..f7ed3bd 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -259,23 +259,19 @@ html_object_callback(hlcache_handle *object,
case CSS_BACKGROUND_REPEAT_REPEAT_X:
data.redraw.x = 0;
- data.redraw.y = t;
+ data.redraw.y += t;
data.redraw.width = box->width;
- data.redraw.height = h;
break;
case CSS_BACKGROUND_REPEAT_REPEAT_Y:
- data.redraw.x = l;
+ data.redraw.x += l;
data.redraw.y = 0;
- data.redraw.width = w;
data.redraw.height = box->height;
break;
case CSS_BACKGROUND_REPEAT_NO_REPEAT:
- data.redraw.x = l;
- data.redraw.y = t;
- data.redraw.width = w;
- data.redraw.height = h;
+ data.redraw.x += l;
+ data.redraw.y += t;
break;
default:
-----------------------------------------------------------------------
Summary of changes:
render/html_object.c | 12 ++++--------
1 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/render/html_object.c b/render/html_object.c
index 0868ce3..f7ed3bd 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -259,23 +259,19 @@ html_object_callback(hlcache_handle *object,
case CSS_BACKGROUND_REPEAT_REPEAT_X:
data.redraw.x = 0;
- data.redraw.y = t;
+ data.redraw.y += t;
data.redraw.width = box->width;
- data.redraw.height = h;
break;
case CSS_BACKGROUND_REPEAT_REPEAT_Y:
- data.redraw.x = l;
+ data.redraw.x += l;
data.redraw.y = 0;
- data.redraw.width = w;
data.redraw.height = box->height;
break;
case CSS_BACKGROUND_REPEAT_NO_REPEAT:
- data.redraw.x = l;
- data.redraw.y = t;
- data.redraw.width = w;
- data.redraw.height = h;
+ data.redraw.x += l;
+ data.redraw.y += t;
break;
default:
--
NetSurf Browser
9 years, 8 months
netsurf: branch master updated. release/3.0-296-gde1f0af
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/de1f0afde282acbf46c03...
...commit http://git.netsurf-browser.org/netsurf.git/commit/de1f0afde282acbf46c03cc...
...tree http://git.netsurf-browser.org/netsurf.git/tree/de1f0afde282acbf46c03ccba...
The branch, master has been updated
via de1f0afde282acbf46c03ccba4148974ebf8b210 (commit)
via ec50fdaefa90f55e664a2e4d83c44ad37d51ca14 (commit)
via 3e33721ab6498deecd611fde8595d690a505e55e (commit)
via 5616221064b7cf503373a00faed854fc83c09a02 (commit)
from c256320b082fe7fb7ef0f0e4360fd3965170f7d4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=de1f0afde282acbf46c...
commit de1f0afde282acbf46c03ccba4148974ebf8b210
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Change how nodes are deleted.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 9a9aa41..5b2d327 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -469,34 +469,123 @@ nserror treeview_create_node_entry(treeview *tree,
}
-/**
- * Delete a treeview node
+/* Walk a treeview subtree, calling a callback at each node (depth first)
*
- * \param tree Treeview object to delete node from
- * \param n Node to delete
- * \param interaction Delete is result of user interaction with treeview
- * \return NSERROR_OK on success, appropriate error otherwise
+ * \param root Root to walk tree from (doesn't get a callback call)
+ * \param full Iff true, visit children of collapsed nodes
+ * \param callback_bwd Function to call on each node in backwards order
+ * \param callback_fwd Function to call on each node in forwards order
+ * \param ctx Context to pass to callback
+ * \return NSERROR_OK on success, or appropriate error otherwise
*
- * Will emit folder or entry deletion msg callback.
+ * Note: Any node deletion must happen in callback_bwd.
*/
-static nserror treeview_delete_node_internal(treeview *tree,
- treeview_node *n, bool interaction)
+static nserror treeview_walk_internal(treeview_node *root, bool full,
+ nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end),
+ nserror (*callback_fwd)(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end),
+ void *ctx)
{
- struct treeview_node_msg msg;
- msg.msg = TREE_MSG_NODE_DELETE;
- treeview_node *p;
- static int nest_depth = 0;
+ treeview_node *node, *child, *parent, *next_sibling;
+ bool abort = false;
+ bool skip_children = false;
+ nserror err;
- if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
- return NSERROR_OK;
- }
+ node = root;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (!skip_children &&
+ (full || (node->flags & TREE_NODE_EXPANDED))) ?
+ node->children : NULL;
+
+ while (node != NULL) {
- /* Destroy children first */
- nest_depth++;
- while (n->children != NULL) {
- treeview_delete_node_internal(tree, n->children, interaction);
+ if (child != NULL) {
+ /* Down to children */
+ node = child;
+ } else {
+ /* No children. As long as we're not at the root,
+ * go to next sibling if present, or nearest ancestor
+ * with a next sibling. */
+
+ while (node != root &&
+ next_sibling == NULL) {
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
+ }
+ node = parent;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ }
+
+ if (node == root)
+ break;
+
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
+ }
+ node = next_sibling;
+ }
+
+ assert(node != NULL);
+ assert(node != root);
+
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (full || (node->flags & TREE_NODE_EXPANDED)) ?
+ node->children : NULL;
+
+ if (callback_fwd != NULL) {
+ /* Forwards callback */
+ err = callback_fwd(node, ctx, &skip_children, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early termination */
+ return NSERROR_OK;
+ }
+ }
+ child = skip_children ? NULL : child;
}
- nest_depth--;
+ return NSERROR_OK;
+}
+
+
+struct treeview_node_delete {
+ treeview *tree;
+ int height_reduction;
+};
+/** Treewalk node callback deleting nodes. */
+static nserror treeview_delete_node_walk_cb(treeview_node *n,
+ void *ctx, bool *end)
+{
+ struct treeview_node_delete *nd = (struct treeview_node_delete *)ctx;
+ struct treeview_node_msg msg;
+ msg.msg = TREE_MSG_NODE_DELETE;
+
+ assert(n->children == NULL);
/* Unlink node from tree */
if (n->parent != NULL && n->parent->children == n) {
@@ -514,19 +603,19 @@ static nserror treeview_delete_node_internal(treeview *tree,
}
/* Reduce ancestor heights */
- p = n->parent;
- while (p != NULL && p->flags & TREE_NODE_EXPANDED) {
- p->height -= n->height;
- p = p->parent;
+ if (n->parent != NULL && n->parent->flags & TREE_NODE_EXPANDED) {
+ int height = (n->type == TREE_NODE_ENTRY) ? n->height :
+ tree_g.line_height;
+ nd->height_reduction += height;
}
/* Handle any special treatment */
switch (n->type) {
case TREE_NODE_ENTRY:
- tree->callbacks->entry(msg, n->client_data);
+ nd->tree->callbacks->entry(msg, n->client_data);
break;
case TREE_NODE_FOLDER:
- tree->callbacks->folder(msg, n->client_data);
+ nd->tree->callbacks->folder(msg, n->client_data);
break;
case TREE_NODE_ROOT:
break;
@@ -534,26 +623,145 @@ static nserror treeview_delete_node_internal(treeview *tree,
return NSERROR_BAD_PARAMETER;
}
- if (nest_depth == 0) {
- /* This is the node we were originally asked to delete */
-
- if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS &&
- n->parent != NULL &&
- n->parent->type != TREE_NODE_ROOT &&
- n->parent->children == NULL) {
- /* Delete empty parent */
- nest_depth++;
- treeview_delete_node_internal(tree, n->parent,
- interaction);
- nest_depth--;
- }
+ /* Free the node */
+ free(n);
- /* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ return NSERROR_OK;
+}
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete node from
+ * \param n Node to delete
+ * \param interaction Delete is result of user interaction with treeview
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Will emit folder or entry deletion msg callback.
+ *
+ * Note this can be called from inside a treeview_walk fwd callback.
+ * For example walking the tree and calling this for any node that's selected.
+ *
+ * This function does not delete empty nodes, so if TREEVIEW_DEL_EMPTY_DIRS is
+ * set, caller must also call treeview_delete_empty.
+ */
+static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n,
+ bool interaction)
+{
+ nserror err;
+ treeview_node *p = n->parent;
+ struct treeview_node_delete nd = {
+ .tree = tree,
+ .height_reduction = 0
+ };
+
+ if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
+ return NSERROR_OK;
}
- /* Free the node */
- free(n);
+ /* Delete any children first */
+ err = treeview_walk_internal(n, true, treeview_delete_node_walk_cb,
+ NULL, &nd);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* Now delete node */
+ if (n == tree->root)
+ tree->root = NULL;
+ err = treeview_delete_node_walk_cb(n, &nd, false);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* Reduce ancestor heights */
+ while (p != NULL && p->flags & TREE_NODE_EXPANDED) {
+ p->height -= nd.height_reduction;
+ p = p->parent;
+ }
+
+ /* Inform front end of change in dimensions */
+ if (tree->root != NULL)
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete empty nodes from
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Note this must not be called within a treeview_walk. It may delete the
+ * walker's 'current' node, making it impossible to move on without invalid
+ * reads.
+ */
+static nserror treeview_delete_empty_nodes(treeview *tree)
+{
+ treeview_node *node, *child, *parent, *next_sibling;
+ treeview_node *root = tree->root;
+ bool abort = false;
+ nserror err;
+ struct treeview_node_delete nd = {
+ .tree = tree,
+ .height_reduction = 0
+ };
+
+ node = root;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (node->flags & TREE_NODE_EXPANDED) ? node->children : NULL;
+
+ while (node != NULL) {
+
+ if (child != NULL) {
+ /* Down to children */
+ node = child;
+ } else {
+ /* No children. As long as we're not at the root,
+ * go to next sibling if present, or nearest ancestor
+ * with a next sibling. */
+
+ while (node != root &&
+ next_sibling == NULL) {
+ if (node->type == TREE_NODE_FOLDER &&
+ node->children == NULL) {
+ /* Delete node */
+ err = treeview_delete_node_walk_cb(
+ node, &nd, &abort);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+ }
+ node = parent;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ }
+
+ if (node == root)
+ break;
+
+ if (node->type == TREE_NODE_FOLDER &&
+ node->children == NULL) {
+ /* Delete node */
+ err = treeview_delete_node_walk_cb(
+ node, &nd, &abort);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+ }
+ node = next_sibling;
+ }
+
+ assert(node != NULL);
+ assert(node != root);
+
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (node->flags & TREE_NODE_EXPANDED) ?
+ node->children : NULL;
+ }
return NSERROR_OK;
}
@@ -562,7 +770,20 @@ static nserror treeview_delete_node_internal(treeview *tree,
/* Exported interface, documented in treeview.h */
nserror treeview_delete_node(treeview *tree, treeview_node *n)
{
- return treeview_delete_node_internal(tree, n, false);
+ nserror err;
+
+ err = treeview_delete_node_internal(tree, n, false);
+ if (err != NSERROR_OK)
+ return err;
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) {
+ /* Delete any empty nodes */
+ err = treeview_delete_empty_nodes(tree);
+ if (err != NSERROR_OK)
+ return err;
+ }
+
+ return NSERROR_OK;
}
@@ -668,95 +889,6 @@ nserror treeview_destroy(treeview *tree)
}
-/* Walk a treeview subtree, calling a callback at each node (depth first)
- *
- * \param root Root to walk tree from (doesn't get a callback call)
- * \param full Iff true, visit children of collapsed nodes
- * \param callback_bwd Function to call on each node in backwards order
- * \param callback_fwd Function to call on each node in forwards order
- * \param ctx Context to pass to callback
- * \return NSERROR_OK on success, or appropriate error otherwise
- */
-static nserror treeview_walk_internal(treeview_node *root, bool full,
- nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end),
- nserror (*callback_fwd)(treeview_node *n, void *ctx, bool *end),
- void *ctx)
-{
- treeview_node *node, *next;
- bool abort = false;
- nserror err;
-
- node = root;
-
- while (node != NULL) {
- next = (full || (node->flags & TREE_NODE_EXPANDED)) ?
- node->children : NULL;
-
- if (next != NULL) {
- /* Down to children */
- node = next;
- } else {
- /* No children. As long as we're not at the root,
- * go to next sibling if present, or nearest ancestor
- * with a next sibling. */
-
- while (node != root &&
- node->sibling_next == NULL) {
- if (callback_bwd != NULL) {
- /* Backwards callback */
- err = callback_bwd(node, ctx, &abort);
-
- if (err != NSERROR_OK) {
- return err;
-
- } else if (abort) {
- /* callback requested early
- * termination */
- return NSERROR_OK;
- }
- }
- node = node->parent;
- }
-
- if (node == root)
- break;
-
- if (callback_bwd != NULL) {
- /* Backwards callback */
- err = callback_bwd(node, ctx, &abort);
-
- if (err != NSERROR_OK) {
- return err;
-
- } else if (abort) {
- /* callback requested early
- * termination */
- return NSERROR_OK;
- }
- }
- node = node->sibling_next;
- }
-
- assert(node != NULL);
- assert(node != root);
-
- if (callback_fwd != NULL) {
- /* Forwards callback */
- err = callback_fwd(node, ctx, &abort);
-
- if (err != NSERROR_OK) {
- return err;
-
- } else if (abort) {
- /* callback requested early termination */
- return NSERROR_OK;
- }
- }
- }
- return NSERROR_OK;
-}
-
-
/* Exported interface, documented in treeview.h */
nserror treeview_node_expand(treeview *tree,
treeview_node *node)
@@ -844,34 +976,33 @@ nserror treeview_node_expand(treeview *tree,
/** Treewalk node callback for handling node contraction. */
-static nserror treeview_node_contract_cb(treeview_node *node, void *ctx,
- bool *end)
+static nserror treeview_node_contract_cb(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end)
{
int height_reduction;
- assert(node != NULL);
- assert(node->type != TREE_NODE_ROOT);
+ assert(n != NULL);
+ assert(n->type != TREE_NODE_ROOT);
- if ((node->flags & TREE_NODE_EXPANDED) == false) {
+ if ((n->flags & TREE_NODE_EXPANDED) == false) {
/* Nothing to do. */
return NSERROR_OK;
}
- node->flags ^= TREE_NODE_EXPANDED;
- height_reduction = node->height - tree_g.line_height;
+ n->flags ^= TREE_NODE_EXPANDED;
+ height_reduction = n->height - tree_g.line_height;
assert(height_reduction >= 0);
do {
- node->height -= height_reduction;
- node = node->parent;
- } while (node != NULL);
+ n->height -= height_reduction;
+ n = n->parent;
+ } while (n != NULL);
return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-nserror treeview_node_contract(treeview *tree,
- treeview_node *node)
+nserror treeview_node_contract(treeview *tree, treeview_node *node)
{
assert(node != NULL);
@@ -886,7 +1017,7 @@ nserror treeview_node_contract(treeview *tree,
treeview_node_contract_cb, NULL);
/* Contract node */
- treeview_node_contract_cb(node, NULL, false);
+ treeview_node_contract_cb(node, NULL, false, false);
/* Inform front end of change in dimensions */
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
@@ -1144,21 +1275,20 @@ struct treeview_selection_walk_data {
treeview *tree;
};
/** Treewalk node callback for handling selection related actions. */
-static nserror treeview_node_selection_walk_cb(treeview_node *node,
- void *ctx, bool *end)
+static nserror treeview_node_selection_walk_cb(treeview_node *n,
+ void *ctx, bool *skip_children, bool *end)
{
struct treeview_selection_walk_data *sw = ctx;
int height;
bool changed = false;
nserror err;
- height = (node->type == TREE_NODE_ENTRY) ? node->height :
- tree_g.line_height;
+ height = (n->type == TREE_NODE_ENTRY) ? n->height : tree_g.line_height;
sw->current_y += height;
switch (sw->purpose) {
case TREEVIEW_WALK_HAS_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TREE_NODE_SELECTED) {
sw->data.has_selection = true;
*end = true; /* Can abort tree walk */
return NSERROR_OK;
@@ -1166,26 +1296,26 @@ static nserror treeview_node_selection_walk_cb(treeview_node *node,
break;
case TREEVIEW_WALK_DELETE_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
- err = treeview_delete_node_internal(sw->tree, node,
- true);
+ if (n->flags & TREE_NODE_SELECTED) {
+ err = treeview_delete_node_internal(sw->tree, n, true);
if (err != NSERROR_OK) {
return err;
}
+ *skip_children = true;
changed = true;
}
break;
case TREEVIEW_WALK_CLEAR_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
- node->flags ^= TREE_NODE_SELECTED;
+ if (n->flags & TREE_NODE_SELECTED) {
+ n->flags ^= TREE_NODE_SELECTED;
changed = true;
}
break;
case TREEVIEW_WALK_SELECT_ALL:
- if (!(node->flags & TREE_NODE_SELECTED)) {
- node->flags ^= TREE_NODE_SELECTED;
+ if (!(n->flags & TREE_NODE_SELECTED)) {
+ n->flags ^= TREE_NODE_SELECTED;
changed = true;
}
break;
@@ -1194,7 +1324,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *node,
if (sw->current_y > sw->data.drag.sel_min &&
sw->current_y - height <
sw->data.drag.sel_max) {
- node->flags ^= TREE_NODE_SELECTED;
+ n->flags ^= TREE_NODE_SELECTED;
}
return NSERROR_OK;
}
@@ -1329,6 +1459,7 @@ bool treeview_keypress(treeview *tree, uint32_t key)
{
struct rect r; /**< Redraw rectangle */
bool redraw = false;
+ nserror err;
assert(tree != NULL);
@@ -1342,6 +1473,12 @@ bool treeview_keypress(treeview *tree, uint32_t key)
case KEY_DELETE_LEFT:
case KEY_DELETE_RIGHT:
redraw = treeview_delete_selection(tree, &r);
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) {
+ /* Delete any empty nodes */
+ err = treeview_delete_empty_nodes(tree);
+ r.y0 = 0;
+ }
break;
case KEY_CR:
case KEY_NL:
@@ -1380,7 +1517,7 @@ struct treeview_mouse_action {
};
/** Treewalk node callback for handling mouse action. */
static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
- bool *end)
+ bool *skip_children, bool *end)
{
struct treeview_mouse_action *ma = ctx;
struct rect r;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=ec50fdaefa90f55e664...
commit ec50fdaefa90f55e664a2e4d83c44ad37d51ca14
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Fix rendering of animated background images. Give them sensible redraw area.
diff --git a/render/html_object.c b/render/html_object.c
index aad0dac..0868ce3 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include "content/hlcache.h"
+#include "css/utils.h"
#include "utils/nsoption.h"
#include "desktop/scrollbar.h"
#include "render/box.h"
@@ -215,26 +216,109 @@ html_object_callback(hlcache_handle *object,
box_coords(box, &x, &y);
- if (hlcache_handle_get_content(object) ==
- event->data.redraw.object) {
- data.redraw.x = data.redraw.x *
- box->width / content_get_width(object);
- data.redraw.y = data.redraw.y *
- box->height /
- content_get_height(object);
- data.redraw.width = data.redraw.width *
- box->width / content_get_width(object);
- data.redraw.height = data.redraw.height *
- box->height /
- content_get_height(object);
+ if (object == box->background) {
+ /* Redraw request is for background */
+ css_fixed hpos = 0, vpos = 0;
+ css_unit hunit = CSS_UNIT_PX;
+ css_unit vunit = CSS_UNIT_PX;
+ int width = box->padding[LEFT] + box->width +
+ box->padding[RIGHT];
+ int height = box->padding[TOP] + box->height +
+ box->padding[BOTTOM];
+ int t, h, l, w;
+
+ /* Need to know background-position */
+ css_computed_background_position(box->style,
+ &hpos, &hunit, &vpos, &vunit);
+
+ w = content_get_width(box->background);
+ if (hunit == CSS_UNIT_PCT) {
+ l = (width - w) * hpos / INTTOFIX(100);
+ } else {
+ l = FIXTOINT(nscss_len2px(hpos, hunit,
+ box->style));
+ }
+
+ h = content_get_height(box->background);
+ if (vunit == CSS_UNIT_PCT) {
+ t = (height - h) * vpos / INTTOFIX(100);
+ } else {
+ t = FIXTOINT(nscss_len2px(vpos, vunit,
+ box->style));
+ }
+
+ /* Redraw area depends on background-repeat */
+ switch (css_computed_background_repeat(
+ box->style)) {
+ case CSS_BACKGROUND_REPEAT_REPEAT:
+ data.redraw.x = 0;
+ data.redraw.y = 0;
+ data.redraw.width = box->width;
+ data.redraw.height = box->height;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_REPEAT_X:
+ data.redraw.x = 0;
+ data.redraw.y = t;
+ data.redraw.width = box->width;
+ data.redraw.height = h;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_REPEAT_Y:
+ data.redraw.x = l;
+ data.redraw.y = 0;
+ data.redraw.width = w;
+ data.redraw.height = box->height;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_NO_REPEAT:
+ data.redraw.x = l;
+ data.redraw.y = t;
+ data.redraw.width = w;
+ data.redraw.height = h;
+ break;
+
+ default:
+ break;
+ }
+
data.redraw.object_width = box->width;
data.redraw.object_height = box->height;
- }
- data.redraw.x += x + box->padding[LEFT];
- data.redraw.y += y + box->padding[TOP];
- data.redraw.object_x += x + box->padding[LEFT];
- data.redraw.object_y += y + box->padding[TOP];
+ /* Add offset to box */
+ data.redraw.x += x;
+ data.redraw.y += y;
+ data.redraw.object_x += x;
+ data.redraw.object_y += y;
+
+ content_broadcast(&c->base,
+ CONTENT_MSG_REDRAW, data);
+ break;
+
+ } else {
+ /* Non-background case */
+ int w = content_get_width(object);
+ int h = content_get_height(object);
+ if (hlcache_handle_get_content(object) ==
+ event->data.redraw.object) {
+ data.redraw.x = data.redraw.x *
+ box->width / w;
+ data.redraw.y = data.redraw.y *
+ box->height / h;
+ data.redraw.width = data.redraw.width *
+ box->width / w;
+ data.redraw.height =
+ data.redraw.height *
+ box->height / h;
+ data.redraw.object_width = box->width;
+ data.redraw.object_height = box->height;
+ }
+
+ data.redraw.x += x + box->padding[LEFT];
+ data.redraw.y += y + box->padding[TOP];
+ data.redraw.object_x += x + box->padding[LEFT];
+ data.redraw.object_y += y + box->padding[TOP];
+ }
content_broadcast(&c->base, CONTENT_MSG_REDRAW, data);
}
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=3e33721ab6498deecd6...
commit 3e33721ab6498deecd611fde8595d690a505e55e
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Make tree walker use nserror.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index a31e7b9..9a9aa41 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -675,14 +675,16 @@ nserror treeview_destroy(treeview *tree)
* \param callback_bwd Function to call on each node in backwards order
* \param callback_fwd Function to call on each node in forwards order
* \param ctx Context to pass to callback
- * \return true iff callback caused premature abort
+ * \return NSERROR_OK on success, or appropriate error otherwise
*/
-static bool treeview_walk_internal(treeview_node *root, bool full,
- bool (*callback_bwd)(treeview_node *n, void *ctx),
- bool (*callback_fwd)(treeview_node *n, void *ctx),
+static nserror treeview_walk_internal(treeview_node *root, bool full,
+ nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end),
+ nserror (*callback_fwd)(treeview_node *n, void *ctx, bool *end),
void *ctx)
{
treeview_node *node, *next;
+ bool abort = false;
+ nserror err;
node = root;
@@ -700,10 +702,18 @@ static bool treeview_walk_internal(treeview_node *root, bool full,
while (node != root &&
node->sibling_next == NULL) {
- if (callback_bwd != NULL &&
- callback_bwd(node, ctx)) {
- /* callback caused early termination */
- return true;
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
}
node = node->parent;
}
@@ -711,9 +721,18 @@ static bool treeview_walk_internal(treeview_node *root, bool full,
if (node == root)
break;
- if (callback_bwd != NULL && callback_bwd(node, ctx)) {
- /* callback caused early termination */
- return true;
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
}
node = node->sibling_next;
}
@@ -721,13 +740,20 @@ static bool treeview_walk_internal(treeview_node *root, bool full,
assert(node != NULL);
assert(node != root);
- if (callback_fwd != NULL && callback_fwd(node, ctx)) {
- /* callback caused early termination */
- return true;
- }
+ if (callback_fwd != NULL) {
+ /* Forwards callback */
+ err = callback_fwd(node, ctx, &abort);
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early termination */
+ return NSERROR_OK;
+ }
+ }
}
- return false;
+ return NSERROR_OK;
}
@@ -818,7 +844,8 @@ nserror treeview_node_expand(treeview *tree,
/** Treewalk node callback for handling node contraction. */
-static bool treeview_node_contract_cb(treeview_node *node, void *ctx)
+static nserror treeview_node_contract_cb(treeview_node *node, void *ctx,
+ bool *end)
{
int height_reduction;
@@ -827,7 +854,7 @@ static bool treeview_node_contract_cb(treeview_node *node, void *ctx)
if ((node->flags & TREE_NODE_EXPANDED) == false) {
/* Nothing to do. */
- return false;
+ return NSERROR_OK;
}
node->flags ^= TREE_NODE_EXPANDED;
@@ -840,7 +867,7 @@ static bool treeview_node_contract_cb(treeview_node *node, void *ctx)
node = node->parent;
} while (node != NULL);
- return false; /* Don't want to abort tree walk */
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
nserror treeview_node_contract(treeview *tree,
@@ -859,7 +886,7 @@ nserror treeview_node_contract(treeview *tree,
treeview_node_contract_cb, NULL);
/* Contract node */
- treeview_node_contract_cb(node, NULL);
+ treeview_node_contract_cb(node, NULL, false);
/* Inform front end of change in dimensions */
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
@@ -1117,12 +1144,13 @@ struct treeview_selection_walk_data {
treeview *tree;
};
/** Treewalk node callback for handling selection related actions. */
-static bool treeview_node_selection_walk_cb(treeview_node *node,
- void *ctx)
+static nserror treeview_node_selection_walk_cb(treeview_node *node,
+ void *ctx, bool *end)
{
struct treeview_selection_walk_data *sw = ctx;
int height;
bool changed = false;
+ nserror err;
height = (node->type == TREE_NODE_ENTRY) ? node->height :
tree_g.line_height;
@@ -1132,13 +1160,18 @@ static bool treeview_node_selection_walk_cb(treeview_node *node,
case TREEVIEW_WALK_HAS_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
sw->data.has_selection = true;
- return true; /* Can abort tree walk */
+ *end = true; /* Can abort tree walk */
+ return NSERROR_OK;
}
break;
case TREEVIEW_WALK_DELETE_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
- treeview_delete_node_internal(sw->tree, node, true);
+ err = treeview_delete_node_internal(sw->tree, node,
+ true);
+ if (err != NSERROR_OK) {
+ return err;
+ }
changed = true;
}
break;
@@ -1163,7 +1196,7 @@ static bool treeview_node_selection_walk_cb(treeview_node *node,
sw->data.drag.sel_max) {
node->flags ^= TREE_NODE_SELECTED;
}
- return false; /* Don't stop walk */
+ return NSERROR_OK;
}
if (changed) {
@@ -1177,7 +1210,7 @@ static bool treeview_node_selection_walk_cb(treeview_node *node,
}
}
- return false; /* Don't stop walk */
+ return NSERROR_OK;
}
@@ -1264,7 +1297,7 @@ static void treeview_commit_selection_drag(treeview *tree)
/**
- * Commit a current selection drag, modifying the node's selection state.
+ * Delete a selection.
*/
static bool treeview_delete_selection(treeview *tree, struct rect *rect)
{
@@ -1346,7 +1379,8 @@ struct treeview_mouse_action {
int current_y; /* Y coordinate value of top of current node */
};
/** Treewalk node callback for handling mouse action. */
-static bool treeview_node_mouse_action_cb(treeview_node *node, void *ctx)
+static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
+ bool *end)
{
struct treeview_mouse_action *ma = ctx;
struct rect r;
@@ -1369,7 +1403,7 @@ static bool treeview_node_mouse_action_cb(treeview_node *node, void *ctx)
/* Skip line if we've not reached mouse y */
if (ma->y > ma->current_y + height) {
ma->current_y += height;
- return false; /* Don't want to abort tree walk */
+ return NSERROR_OK; /* Don't want to abort tree walk */
}
/* Find where the mouse is */
@@ -1500,6 +1534,9 @@ static bool treeview_node_mouse_action_cb(treeview_node *node, void *ctx)
} else {
err = treeview_node_expand(ma->tree, node);
}
+ if (err != NSERROR_OK) {
+ return err;
+ }
/* Set up redraw */
if (!redraw || r.y0 > ma->current_y)
@@ -1556,7 +1593,8 @@ static bool treeview_node_mouse_action_cb(treeview_node *node, void *ctx)
ma->tree->cw_t->redraw_request(ma->tree->cw_h, r);
}
- return true; /* Reached line with click; stop walking tree */
+ *end = true; /* Reached line with click; stop walking tree */
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
void treeview_mouse_action(treeview *tree,
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=5616221064b7cf50337...
commit 5616221064b7cf503373a00faed854fc83c09a02
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Typedefs for internal treeview and treeview_node structs.
diff --git a/desktop/global_history.c b/desktop/global_history.c
index d3d3391..a60cccd 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -46,12 +46,12 @@ enum global_history_folders {
};
struct global_history_folder {
- struct treeview_node *folder;
+ treeview_node *folder;
struct treeview_field_data data;
};
struct global_history_ctx {
- struct treeview *tree;
+ treeview *tree;
struct treeview_field_desc fields[N_FIELDS];
struct global_history_folder folders[GH_N_FOLDERS];
time_t today;
@@ -64,7 +64,7 @@ struct global_history_entry {
int slot;
nsurl *url;
time_t t;
- struct treeview_node *entry;
+ treeview_node *entry;
struct global_history_entry *next;
struct global_history_entry *prev;
@@ -113,7 +113,7 @@ static nserror global_history_create_dir(enum global_history_folders f)
{
nserror err;
time_t t = gh_ctx.today;
- struct treeview_node *relation = NULL;
+ treeview_node *relation = NULL;
enum treeview_relationship rel = TREE_REL_FIRST_CHILD;
const char *label;
int age;
@@ -200,7 +200,7 @@ static nserror global_history_create_dir(enum global_history_folders f)
* \return NSERROR_OK on success, appropriate error otherwise
*/
static inline nserror global_history_get_parent_treeview_node(
- struct treeview_node **parent, int slot)
+ treeview_node **parent, int slot)
{
int folder_index;
struct global_history_folder *f;
@@ -304,7 +304,7 @@ static nserror global_history_entry_insert(struct global_history_entry *e,
{
nserror err;
- struct treeview_node *parent;
+ treeview_node *parent;
err = global_history_get_parent_treeview_node(&parent, slot);
if (err != NSERROR_OK) {
return err;
diff --git a/desktop/treeview.c b/desktop/treeview.c
index f123c4e..a31e7b9 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -78,10 +78,10 @@ struct treeview_node {
int height; /**< Includes height of any descendants (pixels) */
int inset; /**< Node's inset depending on tree depth (pixels) */
- struct treeview_node *parent;
- struct treeview_node *sibling_prev;
- struct treeview_node *sibling_next;
- struct treeview_node *children;
+ treeview_node *parent;
+ treeview_node *sibling_prev;
+ treeview_node *sibling_next;
+ treeview_node *children;
void *client_data; /**< Passed to client on node event msg callback */
@@ -89,7 +89,7 @@ struct treeview_node {
}; /**< Treeview node */
struct treeview_node_entry {
- struct treeview_node base;
+ treeview_node base;
struct treeview_field fields[];
}; /**< Entry class inherits node base class */
@@ -107,7 +107,7 @@ struct treeview_drag {
TV_DRAG_MOVE,
TV_DRAG_TEXTAREA
} type; /**< Drag type */
- struct treeview_node *start_node; /**< Start node */
+ treeview_node *start_node; /**< Start node */
bool selected; /**< Start node is selected */
enum treeview_node_section section; /**< Node section at start */
struct treeview_pos start; /**< Start pos */
@@ -119,7 +119,7 @@ struct treeview {
treeview_flags flags; /** Treeview behaviour settings */
- struct treeview_node *root; /**< Root node */
+ treeview_node *root; /**< Root node */
struct treeview_field *fields; /**< Array of fields */
int n_fields; /**< fields[n_fields] is folder, lower are entry fields */
@@ -184,9 +184,9 @@ static struct treeview_text treeview_furn[TREE_FURN_LAST] = {
* \param root Returns root node
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror treeview_create_node_root(struct treeview_node **root)
+static nserror treeview_create_node_root(treeview_node **root)
{
- struct treeview_node *n;
+ treeview_node *n;
n = malloc(sizeof(struct treeview_node));
if (n == NULL) {
@@ -225,8 +225,8 @@ static nserror treeview_create_node_root(struct treeview_node **root)
* \param b tree node to insert a as a relation of
* \param rel a's relationship to b
*/
-static inline void treeview_insert_node(struct treeview_node *a,
- struct treeview_node *b,
+static inline void treeview_insert_node(treeview_node *a,
+ treeview_node *b,
enum treeview_relationship rel)
{
assert(a != NULL);
@@ -282,14 +282,14 @@ static inline void treeview_insert_node(struct treeview_node *a,
/* Exported interface, documented in treeview.h */
-nserror treeview_create_node_folder(struct treeview *tree,
- struct treeview_node **folder,
- struct treeview_node *relation,
+nserror treeview_create_node_folder(treeview *tree,
+ treeview_node **folder,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
void *data, treeview_node_create_flags flags)
{
- struct treeview_node *n;
+ treeview_node *n;
assert(data != NULL);
assert(tree != NULL);
@@ -334,8 +334,8 @@ nserror treeview_create_node_folder(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_update_node_entry(struct treeview *tree,
- struct treeview_node *entry,
+nserror treeview_update_node_entry(treeview *tree,
+ treeview_node *entry,
const struct treeview_field_data fields[],
void *data)
{
@@ -395,16 +395,16 @@ nserror treeview_update_node_entry(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_create_node_entry(struct treeview *tree,
- struct treeview_node **entry,
- struct treeview_node *relation,
+nserror treeview_create_node_entry(treeview *tree,
+ treeview_node **entry,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
void *data, treeview_node_create_flags flags)
{
bool match;
struct treeview_node_entry *e;
- struct treeview_node *n;
+ treeview_node *n;
int i;
assert(data != NULL);
@@ -423,7 +423,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
- n = (struct treeview_node *) e;
+ n = (treeview_node *) e;
n->flags = TREE_NODE_NONE;
n->type = TREE_NODE_ENTRY;
@@ -479,12 +479,12 @@ nserror treeview_create_node_entry(struct treeview *tree,
*
* Will emit folder or entry deletion msg callback.
*/
-static nserror treeview_delete_node_internal(struct treeview *tree,
- struct treeview_node *n, bool interaction)
+static nserror treeview_delete_node_internal(treeview *tree,
+ treeview_node *n, bool interaction)
{
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
- struct treeview_node *p;
+ treeview_node *p;
static int nest_depth = 0;
if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
@@ -560,14 +560,14 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+nserror treeview_delete_node(treeview *tree, treeview_node *n)
{
return treeview_delete_node_internal(tree, n, false);
}
/* Exported interface, documented in treeview.h */
-nserror treeview_create(struct treeview **tree,
+nserror treeview_create(treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
@@ -646,7 +646,7 @@ nserror treeview_create(struct treeview **tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_destroy(struct treeview *tree)
+nserror treeview_destroy(treeview *tree)
{
int f;
@@ -677,12 +677,12 @@ nserror treeview_destroy(struct treeview *tree)
* \param ctx Context to pass to callback
* \return true iff callback caused premature abort
*/
-static bool treeview_walk_internal(struct treeview_node *root, bool full,
- bool (*callback_bwd)(struct treeview_node *node, void *ctx),
- bool (*callback_fwd)(struct treeview_node *node, void *ctx),
+static bool treeview_walk_internal(treeview_node *root, bool full,
+ bool (*callback_bwd)(treeview_node *n, void *ctx),
+ bool (*callback_fwd)(treeview_node *n, void *ctx),
void *ctx)
{
- struct treeview_node *node, *next;
+ treeview_node *node, *next;
node = root;
@@ -732,10 +732,10 @@ static bool treeview_walk_internal(struct treeview_node *root, bool full,
/* Exported interface, documented in treeview.h */
-nserror treeview_node_expand(struct treeview *tree,
- struct treeview_node *node)
+nserror treeview_node_expand(treeview *tree,
+ treeview_node *node)
{
- struct treeview_node *child;
+ treeview_node *child;
struct treeview_node_entry *e;
int additional_height = 0;
int i;
@@ -818,7 +818,7 @@ nserror treeview_node_expand(struct treeview *tree,
/** Treewalk node callback for handling node contraction. */
-static bool treeview_node_contract_cb(struct treeview_node *node, void *ctx)
+static bool treeview_node_contract_cb(treeview_node *node, void *ctx)
{
int height_reduction;
@@ -843,8 +843,8 @@ static bool treeview_node_contract_cb(struct treeview_node *node, void *ctx)
return false; /* Don't want to abort tree walk */
}
/* Exported interface, documented in treeview.h */
-nserror treeview_node_contract(struct treeview *tree,
- struct treeview_node *node)
+nserror treeview_node_contract(treeview *tree,
+ treeview_node *node)
{
assert(node != NULL);
@@ -869,11 +869,11 @@ nserror treeview_node_contract(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
+void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
const struct redraw_context *ctx)
{
struct redraw_context new_ctx = *ctx;
- struct treeview_node *node, *root, *next;
+ treeview_node *node, *root, *next;
struct treeview_node_entry *entry;
struct treeview_node_style *style = &plot_style_odd;
struct content_redraw_data data;
@@ -1114,10 +1114,10 @@ struct treeview_selection_walk_data {
} drag;
} data;
int current_y;
- struct treeview *tree;
+ treeview *tree;
};
/** Treewalk node callback for handling selection related actions. */
-static bool treeview_node_selection_walk_cb(struct treeview_node *node,
+static bool treeview_node_selection_walk_cb(treeview_node *node,
void *ctx)
{
struct treeview_selection_walk_data *sw = ctx;
@@ -1182,7 +1182,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
/* Exported interface, documented in treeview.h */
-bool treeview_has_selection(struct treeview *tree)
+bool treeview_has_selection(treeview *tree)
{
struct treeview_selection_walk_data sw;
@@ -1197,7 +1197,7 @@ bool treeview_has_selection(struct treeview *tree)
/* Exported interface, documented in treeview.h */
-bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
+bool treeview_clear_selection(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1219,7 +1219,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
/* Exported interface, documented in treeview.h */
-bool treeview_select_all(struct treeview *tree, struct rect *rect)
+bool treeview_select_all(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1243,7 +1243,7 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect)
/**
* Commit a current selection drag, modifying the node's selection state.
*/
-static void treeview_commit_selection_drag(struct treeview *tree)
+static void treeview_commit_selection_drag(treeview *tree)
{
struct treeview_selection_walk_data sw;
@@ -1266,7 +1266,7 @@ static void treeview_commit_selection_drag(struct treeview *tree)
/**
* Commit a current selection drag, modifying the node's selection state.
*/
-static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
+static bool treeview_delete_selection(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1292,7 +1292,7 @@ static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
/* Exported interface, documented in treeview.h */
-bool treeview_keypress(struct treeview *tree, uint32_t key)
+bool treeview_keypress(treeview *tree, uint32_t key)
{
struct rect r; /**< Redraw rectangle */
bool redraw = false;
@@ -1339,14 +1339,14 @@ bool treeview_keypress(struct treeview *tree, uint32_t key)
}
struct treeview_mouse_action {
- struct treeview *tree;
+ treeview *tree;
browser_mouse_state mouse;
int x;
int y;
int current_y; /* Y coordinate value of top of current node */
};
/** Treewalk node callback for handling mouse action. */
-static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
+static bool treeview_node_mouse_action_cb(treeview_node *node, void *ctx)
{
struct treeview_mouse_action *ma = ctx;
struct rect r;
@@ -1559,7 +1559,7 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
return true; /* Reached line with click; stop walking tree */
}
/* Exported interface, documented in treeview.h */
-void treeview_mouse_action(struct treeview *tree,
+void treeview_mouse_action(treeview *tree,
browser_mouse_state mouse, int x, int y)
{
bool redraw = false;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 475b90e..5662dfa 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -30,8 +30,8 @@
#include "desktop/textinput.h"
#include "utils/types.h"
-struct treeview;
-struct treeview_node;
+typedef struct treeview treeview;
+typedef struct treeview_node treeview_node;
enum treeview_relationship {
TREE_REL_FIRST_CHILD,
@@ -127,7 +127,7 @@ nserror treeview_fini(void);
*
* So fields[0] and fields[N-1] have TREE_FLAG_DEFAULT set.
*/
-nserror treeview_create(struct treeview **tree,
+nserror treeview_create(treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
@@ -141,7 +141,7 @@ nserror treeview_create(struct treeview **tree,
*
* Will emit folder and entry deletion msg callbacks for all nodes in treeview.
*/
-nserror treeview_destroy(struct treeview *tree);
+nserror treeview_destroy(treeview *tree);
/**
* Create a folder node in given treeview
@@ -159,9 +159,9 @@ nserror treeview_destroy(struct treeview *tree);
*
* If relation is NULL, will insert as child of root node.
*/
-nserror treeview_create_node_folder(struct treeview *tree,
- struct treeview_node **folder,
- struct treeview_node *relation,
+nserror treeview_create_node_folder(treeview *tree,
+ treeview_node **folder,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
void *data, treeview_node_create_flags flags);
@@ -182,9 +182,9 @@ nserror treeview_create_node_folder(struct treeview *tree,
*
* If relation is NULL, will insert as child of root node.
*/
-nserror treeview_create_node_entry(struct treeview *tree,
- struct treeview_node **entry,
- struct treeview_node *relation,
+nserror treeview_create_node_entry(treeview *tree,
+ treeview_node **entry,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
void *data, treeview_node_create_flags flags);
@@ -200,8 +200,8 @@ nserror treeview_create_node_entry(struct treeview *tree,
*
* Fields array names must match names past in treeview_create fields[0...N-2].
*/
-nserror treeview_update_node_entry(struct treeview *tree,
- struct treeview_node *entry,
+nserror treeview_update_node_entry(treeview *tree,
+ treeview_node *entry,
const struct treeview_field_data fields[],
void *data);
@@ -214,7 +214,7 @@ nserror treeview_update_node_entry(struct treeview *tree,
*
* Will emit folder or entry deletion msg callback.
*/
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n);
+nserror treeview_delete_node(treeview *tree, treeview_node *n);
/**
* Expand a treeview node
@@ -223,8 +223,7 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n);
* \param node Node to expand
* \return NSERROR_OK on success, appropriate error otherwise
*/
-nserror treeview_node_expand(struct treeview *tree,
- struct treeview_node *node);
+nserror treeview_node_expand(treeview *tree, treeview_node *node);
/**
* Contract a treeview node
@@ -233,8 +232,7 @@ nserror treeview_node_expand(struct treeview *tree,
* \param node Node to contract
* \return NSERROR_OK on success, appropriate error otherwise
*/
-nserror treeview_node_contract(struct treeview *tree,
- struct treeview_node *node);
+nserror treeview_node_contract(treeview *tree, treeview_node *node);
/**
* Redraw a treeview object
@@ -245,7 +243,7 @@ nserror treeview_node_contract(struct treeview *tree,
* \param clip Current clip rectangle (wrt tree origin)
* \param ctx Current redraw context
*/
-void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
+void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
const struct redraw_context *ctx);
/**
@@ -255,7 +253,7 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
* \param key The ucs4 character codepoint
* \return true if the keypress is dealt with, false otherwise.
*/
-bool treeview_keypress(struct treeview *tree, uint32_t key);
+bool treeview_keypress(treeview *tree, uint32_t key);
/**
* Handles all kinds of mouse action
@@ -265,7 +263,7 @@ bool treeview_keypress(struct treeview *tree, uint32_t key);
* \param x X coordinate
* \param y Y coordinate
*/
-void treeview_mouse_action(struct treeview *tree,
+void treeview_mouse_action(treeview *tree,
browser_mouse_state mouse, int x, int y);
/**
@@ -274,7 +272,7 @@ void treeview_mouse_action(struct treeview *tree,
* \param tree Treeview object to delete node from
* \return true iff treeview has a selection
*/
-bool treeview_has_selection(struct treeview *tree);
+bool treeview_has_selection(treeview *tree);
/**
* Clear any selection in a treeview
@@ -283,7 +281,7 @@ bool treeview_has_selection(struct treeview *tree);
* \param rect Redraw rectangle (if redraw required)
* \return true iff redraw required
*/
-bool treeview_clear_selection(struct treeview *tree, struct rect *rect);
+bool treeview_clear_selection(treeview *tree, struct rect *rect);
/**
* Select all in a treeview
@@ -292,7 +290,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect);
* \param rect Redraw rectangle (if redraw required)
* \return true iff redraw required
*/
-bool treeview_select_all(struct treeview *tree, struct rect *rect);
+bool treeview_select_all(treeview *tree, struct rect *rect);
/**
* Find current height of a treeview
@@ -300,6 +298,6 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect);
* \param tree Treeview object to find height of
* \return height of treeview in px
*/
-int treeview_get_height(struct treeview *tree);
+int treeview_get_height(treeview *tree);
#endif
-----------------------------------------------------------------------
Summary of changes:
desktop/global_history.c | 12 +-
desktop/treeview.c | 535 ++++++++++++++++++++++++++++++----------------
desktop/treeview.h | 46 ++--
render/html_object.c | 118 +++++++++--
4 files changed, 484 insertions(+), 227 deletions(-)
diff --git a/desktop/global_history.c b/desktop/global_history.c
index d3d3391..a60cccd 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -46,12 +46,12 @@ enum global_history_folders {
};
struct global_history_folder {
- struct treeview_node *folder;
+ treeview_node *folder;
struct treeview_field_data data;
};
struct global_history_ctx {
- struct treeview *tree;
+ treeview *tree;
struct treeview_field_desc fields[N_FIELDS];
struct global_history_folder folders[GH_N_FOLDERS];
time_t today;
@@ -64,7 +64,7 @@ struct global_history_entry {
int slot;
nsurl *url;
time_t t;
- struct treeview_node *entry;
+ treeview_node *entry;
struct global_history_entry *next;
struct global_history_entry *prev;
@@ -113,7 +113,7 @@ static nserror global_history_create_dir(enum global_history_folders f)
{
nserror err;
time_t t = gh_ctx.today;
- struct treeview_node *relation = NULL;
+ treeview_node *relation = NULL;
enum treeview_relationship rel = TREE_REL_FIRST_CHILD;
const char *label;
int age;
@@ -200,7 +200,7 @@ static nserror global_history_create_dir(enum global_history_folders f)
* \return NSERROR_OK on success, appropriate error otherwise
*/
static inline nserror global_history_get_parent_treeview_node(
- struct treeview_node **parent, int slot)
+ treeview_node **parent, int slot)
{
int folder_index;
struct global_history_folder *f;
@@ -304,7 +304,7 @@ static nserror global_history_entry_insert(struct global_history_entry *e,
{
nserror err;
- struct treeview_node *parent;
+ treeview_node *parent;
err = global_history_get_parent_treeview_node(&parent, slot);
if (err != NSERROR_OK) {
return err;
diff --git a/desktop/treeview.c b/desktop/treeview.c
index f123c4e..5b2d327 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -78,10 +78,10 @@ struct treeview_node {
int height; /**< Includes height of any descendants (pixels) */
int inset; /**< Node's inset depending on tree depth (pixels) */
- struct treeview_node *parent;
- struct treeview_node *sibling_prev;
- struct treeview_node *sibling_next;
- struct treeview_node *children;
+ treeview_node *parent;
+ treeview_node *sibling_prev;
+ treeview_node *sibling_next;
+ treeview_node *children;
void *client_data; /**< Passed to client on node event msg callback */
@@ -89,7 +89,7 @@ struct treeview_node {
}; /**< Treeview node */
struct treeview_node_entry {
- struct treeview_node base;
+ treeview_node base;
struct treeview_field fields[];
}; /**< Entry class inherits node base class */
@@ -107,7 +107,7 @@ struct treeview_drag {
TV_DRAG_MOVE,
TV_DRAG_TEXTAREA
} type; /**< Drag type */
- struct treeview_node *start_node; /**< Start node */
+ treeview_node *start_node; /**< Start node */
bool selected; /**< Start node is selected */
enum treeview_node_section section; /**< Node section at start */
struct treeview_pos start; /**< Start pos */
@@ -119,7 +119,7 @@ struct treeview {
treeview_flags flags; /** Treeview behaviour settings */
- struct treeview_node *root; /**< Root node */
+ treeview_node *root; /**< Root node */
struct treeview_field *fields; /**< Array of fields */
int n_fields; /**< fields[n_fields] is folder, lower are entry fields */
@@ -184,9 +184,9 @@ static struct treeview_text treeview_furn[TREE_FURN_LAST] = {
* \param root Returns root node
* \return NSERROR_OK on success, appropriate error otherwise
*/
-static nserror treeview_create_node_root(struct treeview_node **root)
+static nserror treeview_create_node_root(treeview_node **root)
{
- struct treeview_node *n;
+ treeview_node *n;
n = malloc(sizeof(struct treeview_node));
if (n == NULL) {
@@ -225,8 +225,8 @@ static nserror treeview_create_node_root(struct treeview_node **root)
* \param b tree node to insert a as a relation of
* \param rel a's relationship to b
*/
-static inline void treeview_insert_node(struct treeview_node *a,
- struct treeview_node *b,
+static inline void treeview_insert_node(treeview_node *a,
+ treeview_node *b,
enum treeview_relationship rel)
{
assert(a != NULL);
@@ -282,14 +282,14 @@ static inline void treeview_insert_node(struct treeview_node *a,
/* Exported interface, documented in treeview.h */
-nserror treeview_create_node_folder(struct treeview *tree,
- struct treeview_node **folder,
- struct treeview_node *relation,
+nserror treeview_create_node_folder(treeview *tree,
+ treeview_node **folder,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
void *data, treeview_node_create_flags flags)
{
- struct treeview_node *n;
+ treeview_node *n;
assert(data != NULL);
assert(tree != NULL);
@@ -334,8 +334,8 @@ nserror treeview_create_node_folder(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_update_node_entry(struct treeview *tree,
- struct treeview_node *entry,
+nserror treeview_update_node_entry(treeview *tree,
+ treeview_node *entry,
const struct treeview_field_data fields[],
void *data)
{
@@ -395,16 +395,16 @@ nserror treeview_update_node_entry(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_create_node_entry(struct treeview *tree,
- struct treeview_node **entry,
- struct treeview_node *relation,
+nserror treeview_create_node_entry(treeview *tree,
+ treeview_node **entry,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
void *data, treeview_node_create_flags flags)
{
bool match;
struct treeview_node_entry *e;
- struct treeview_node *n;
+ treeview_node *n;
int i;
assert(data != NULL);
@@ -423,7 +423,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
- n = (struct treeview_node *) e;
+ n = (treeview_node *) e;
n->flags = TREE_NODE_NONE;
n->type = TREE_NODE_ENTRY;
@@ -469,34 +469,123 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
-/**
- * Delete a treeview node
+/* Walk a treeview subtree, calling a callback at each node (depth first)
*
- * \param tree Treeview object to delete node from
- * \param n Node to delete
- * \param interaction Delete is result of user interaction with treeview
- * \return NSERROR_OK on success, appropriate error otherwise
+ * \param root Root to walk tree from (doesn't get a callback call)
+ * \param full Iff true, visit children of collapsed nodes
+ * \param callback_bwd Function to call on each node in backwards order
+ * \param callback_fwd Function to call on each node in forwards order
+ * \param ctx Context to pass to callback
+ * \return NSERROR_OK on success, or appropriate error otherwise
*
- * Will emit folder or entry deletion msg callback.
+ * Note: Any node deletion must happen in callback_bwd.
*/
-static nserror treeview_delete_node_internal(struct treeview *tree,
- struct treeview_node *n, bool interaction)
+static nserror treeview_walk_internal(treeview_node *root, bool full,
+ nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end),
+ nserror (*callback_fwd)(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end),
+ void *ctx)
{
- struct treeview_node_msg msg;
- msg.msg = TREE_MSG_NODE_DELETE;
- struct treeview_node *p;
- static int nest_depth = 0;
+ treeview_node *node, *child, *parent, *next_sibling;
+ bool abort = false;
+ bool skip_children = false;
+ nserror err;
- if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
- return NSERROR_OK;
- }
+ node = root;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (!skip_children &&
+ (full || (node->flags & TREE_NODE_EXPANDED))) ?
+ node->children : NULL;
- /* Destroy children first */
- nest_depth++;
- while (n->children != NULL) {
- treeview_delete_node_internal(tree, n->children, interaction);
+ while (node != NULL) {
+
+ if (child != NULL) {
+ /* Down to children */
+ node = child;
+ } else {
+ /* No children. As long as we're not at the root,
+ * go to next sibling if present, or nearest ancestor
+ * with a next sibling. */
+
+ while (node != root &&
+ next_sibling == NULL) {
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
+ }
+ node = parent;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ }
+
+ if (node == root)
+ break;
+
+ if (callback_bwd != NULL) {
+ /* Backwards callback */
+ err = callback_bwd(node, ctx, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early
+ * termination */
+ return NSERROR_OK;
+ }
+ }
+ node = next_sibling;
+ }
+
+ assert(node != NULL);
+ assert(node != root);
+
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (full || (node->flags & TREE_NODE_EXPANDED)) ?
+ node->children : NULL;
+
+ if (callback_fwd != NULL) {
+ /* Forwards callback */
+ err = callback_fwd(node, ctx, &skip_children, &abort);
+
+ if (err != NSERROR_OK) {
+ return err;
+
+ } else if (abort) {
+ /* callback requested early termination */
+ return NSERROR_OK;
+ }
+ }
+ child = skip_children ? NULL : child;
}
- nest_depth--;
+ return NSERROR_OK;
+}
+
+
+struct treeview_node_delete {
+ treeview *tree;
+ int height_reduction;
+};
+/** Treewalk node callback deleting nodes. */
+static nserror treeview_delete_node_walk_cb(treeview_node *n,
+ void *ctx, bool *end)
+{
+ struct treeview_node_delete *nd = (struct treeview_node_delete *)ctx;
+ struct treeview_node_msg msg;
+ msg.msg = TREE_MSG_NODE_DELETE;
+
+ assert(n->children == NULL);
/* Unlink node from tree */
if (n->parent != NULL && n->parent->children == n) {
@@ -514,19 +603,19 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
}
/* Reduce ancestor heights */
- p = n->parent;
- while (p != NULL && p->flags & TREE_NODE_EXPANDED) {
- p->height -= n->height;
- p = p->parent;
+ if (n->parent != NULL && n->parent->flags & TREE_NODE_EXPANDED) {
+ int height = (n->type == TREE_NODE_ENTRY) ? n->height :
+ tree_g.line_height;
+ nd->height_reduction += height;
}
/* Handle any special treatment */
switch (n->type) {
case TREE_NODE_ENTRY:
- tree->callbacks->entry(msg, n->client_data);
+ nd->tree->callbacks->entry(msg, n->client_data);
break;
case TREE_NODE_FOLDER:
- tree->callbacks->folder(msg, n->client_data);
+ nd->tree->callbacks->folder(msg, n->client_data);
break;
case TREE_NODE_ROOT:
break;
@@ -534,40 +623,172 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
return NSERROR_BAD_PARAMETER;
}
- if (nest_depth == 0) {
- /* This is the node we were originally asked to delete */
-
- if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS &&
- n->parent != NULL &&
- n->parent->type != TREE_NODE_ROOT &&
- n->parent->children == NULL) {
- /* Delete empty parent */
- nest_depth++;
- treeview_delete_node_internal(tree, n->parent,
- interaction);
- nest_depth--;
- }
+ /* Free the node */
+ free(n);
- /* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ return NSERROR_OK;
+}
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete node from
+ * \param n Node to delete
+ * \param interaction Delete is result of user interaction with treeview
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Will emit folder or entry deletion msg callback.
+ *
+ * Note this can be called from inside a treeview_walk fwd callback.
+ * For example walking the tree and calling this for any node that's selected.
+ *
+ * This function does not delete empty nodes, so if TREEVIEW_DEL_EMPTY_DIRS is
+ * set, caller must also call treeview_delete_empty.
+ */
+static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n,
+ bool interaction)
+{
+ nserror err;
+ treeview_node *p = n->parent;
+ struct treeview_node_delete nd = {
+ .tree = tree,
+ .height_reduction = 0
+ };
+
+ if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
+ return NSERROR_OK;
}
- /* Free the node */
- free(n);
+ /* Delete any children first */
+ err = treeview_walk_internal(n, true, treeview_delete_node_walk_cb,
+ NULL, &nd);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* Now delete node */
+ if (n == tree->root)
+ tree->root = NULL;
+ err = treeview_delete_node_walk_cb(n, &nd, false);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
+ /* Reduce ancestor heights */
+ while (p != NULL && p->flags & TREE_NODE_EXPANDED) {
+ p->height -= nd.height_reduction;
+ p = p->parent;
+ }
+
+ /* Inform front end of change in dimensions */
+ if (tree->root != NULL)
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+
+ return NSERROR_OK;
+}
+
+
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete empty nodes from
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Note this must not be called within a treeview_walk. It may delete the
+ * walker's 'current' node, making it impossible to move on without invalid
+ * reads.
+ */
+static nserror treeview_delete_empty_nodes(treeview *tree)
+{
+ treeview_node *node, *child, *parent, *next_sibling;
+ treeview_node *root = tree->root;
+ bool abort = false;
+ nserror err;
+ struct treeview_node_delete nd = {
+ .tree = tree,
+ .height_reduction = 0
+ };
+
+ node = root;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (node->flags & TREE_NODE_EXPANDED) ? node->children : NULL;
+
+ while (node != NULL) {
+
+ if (child != NULL) {
+ /* Down to children */
+ node = child;
+ } else {
+ /* No children. As long as we're not at the root,
+ * go to next sibling if present, or nearest ancestor
+ * with a next sibling. */
+
+ while (node != root &&
+ next_sibling == NULL) {
+ if (node->type == TREE_NODE_FOLDER &&
+ node->children == NULL) {
+ /* Delete node */
+ err = treeview_delete_node_walk_cb(
+ node, &nd, &abort);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+ }
+ node = parent;
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ }
+
+ if (node == root)
+ break;
+
+ if (node->type == TREE_NODE_FOLDER &&
+ node->children == NULL) {
+ /* Delete node */
+ err = treeview_delete_node_walk_cb(
+ node, &nd, &abort);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+ }
+ node = next_sibling;
+ }
+
+ assert(node != NULL);
+ assert(node != root);
+
+ parent = node->parent;
+ next_sibling = node->sibling_next;
+ child = (node->flags & TREE_NODE_EXPANDED) ?
+ node->children : NULL;
+ }
return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+nserror treeview_delete_node(treeview *tree, treeview_node *n)
{
- return treeview_delete_node_internal(tree, n, false);
+ nserror err;
+
+ err = treeview_delete_node_internal(tree, n, false);
+ if (err != NSERROR_OK)
+ return err;
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) {
+ /* Delete any empty nodes */
+ err = treeview_delete_empty_nodes(tree);
+ if (err != NSERROR_OK)
+ return err;
+ }
+
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-nserror treeview_create(struct treeview **tree,
+nserror treeview_create(treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
@@ -646,7 +867,7 @@ nserror treeview_create(struct treeview **tree,
/* Exported interface, documented in treeview.h */
-nserror treeview_destroy(struct treeview *tree)
+nserror treeview_destroy(treeview *tree)
{
int f;
@@ -668,74 +889,11 @@ nserror treeview_destroy(struct treeview *tree)
}
-/* Walk a treeview subtree, calling a callback at each node (depth first)
- *
- * \param root Root to walk tree from (doesn't get a callback call)
- * \param full Iff true, visit children of collapsed nodes
- * \param callback_bwd Function to call on each node in backwards order
- * \param callback_fwd Function to call on each node in forwards order
- * \param ctx Context to pass to callback
- * \return true iff callback caused premature abort
- */
-static bool treeview_walk_internal(struct treeview_node *root, bool full,
- bool (*callback_bwd)(struct treeview_node *node, void *ctx),
- bool (*callback_fwd)(struct treeview_node *node, void *ctx),
- void *ctx)
-{
- struct treeview_node *node, *next;
-
- node = root;
-
- while (node != NULL) {
- next = (full || (node->flags & TREE_NODE_EXPANDED)) ?
- node->children : NULL;
-
- if (next != NULL) {
- /* Down to children */
- node = next;
- } else {
- /* No children. As long as we're not at the root,
- * go to next sibling if present, or nearest ancestor
- * with a next sibling. */
-
- while (node != root &&
- node->sibling_next == NULL) {
- if (callback_bwd != NULL &&
- callback_bwd(node, ctx)) {
- /* callback caused early termination */
- return true;
- }
- node = node->parent;
- }
-
- if (node == root)
- break;
-
- if (callback_bwd != NULL && callback_bwd(node, ctx)) {
- /* callback caused early termination */
- return true;
- }
- node = node->sibling_next;
- }
-
- assert(node != NULL);
- assert(node != root);
-
- if (callback_fwd != NULL && callback_fwd(node, ctx)) {
- /* callback caused early termination */
- return true;
- }
-
- }
- return false;
-}
-
-
/* Exported interface, documented in treeview.h */
-nserror treeview_node_expand(struct treeview *tree,
- struct treeview_node *node)
+nserror treeview_node_expand(treeview *tree,
+ treeview_node *node)
{
- struct treeview_node *child;
+ treeview_node *child;
struct treeview_node_entry *e;
int additional_height = 0;
int i;
@@ -818,33 +976,33 @@ nserror treeview_node_expand(struct treeview *tree,
/** Treewalk node callback for handling node contraction. */
-static bool treeview_node_contract_cb(struct treeview_node *node, void *ctx)
+static nserror treeview_node_contract_cb(treeview_node *n, void *ctx,
+ bool *skip_children, bool *end)
{
int height_reduction;
- assert(node != NULL);
- assert(node->type != TREE_NODE_ROOT);
+ assert(n != NULL);
+ assert(n->type != TREE_NODE_ROOT);
- if ((node->flags & TREE_NODE_EXPANDED) == false) {
+ if ((n->flags & TREE_NODE_EXPANDED) == false) {
/* Nothing to do. */
- return false;
+ return NSERROR_OK;
}
- node->flags ^= TREE_NODE_EXPANDED;
- height_reduction = node->height - tree_g.line_height;
+ n->flags ^= TREE_NODE_EXPANDED;
+ height_reduction = n->height - tree_g.line_height;
assert(height_reduction >= 0);
do {
- node->height -= height_reduction;
- node = node->parent;
- } while (node != NULL);
+ n->height -= height_reduction;
+ n = n->parent;
+ } while (n != NULL);
- return false; /* Don't want to abort tree walk */
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-nserror treeview_node_contract(struct treeview *tree,
- struct treeview_node *node)
+nserror treeview_node_contract(treeview *tree, treeview_node *node)
{
assert(node != NULL);
@@ -859,7 +1017,7 @@ nserror treeview_node_contract(struct treeview *tree,
treeview_node_contract_cb, NULL);
/* Contract node */
- treeview_node_contract_cb(node, NULL);
+ treeview_node_contract_cb(node, NULL, false, false);
/* Inform front end of change in dimensions */
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
@@ -869,11 +1027,11 @@ nserror treeview_node_contract(struct treeview *tree,
/* Exported interface, documented in treeview.h */
-void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
+void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
const struct redraw_context *ctx)
{
struct redraw_context new_ctx = *ctx;
- struct treeview_node *node, *root, *next;
+ treeview_node *node, *root, *next;
struct treeview_node_entry *entry;
struct treeview_node_style *style = &plot_style_odd;
struct content_redraw_data data;
@@ -1114,45 +1272,50 @@ struct treeview_selection_walk_data {
} drag;
} data;
int current_y;
- struct treeview *tree;
+ treeview *tree;
};
/** Treewalk node callback for handling selection related actions. */
-static bool treeview_node_selection_walk_cb(struct treeview_node *node,
- void *ctx)
+static nserror treeview_node_selection_walk_cb(treeview_node *n,
+ void *ctx, bool *skip_children, bool *end)
{
struct treeview_selection_walk_data *sw = ctx;
int height;
bool changed = false;
+ nserror err;
- height = (node->type == TREE_NODE_ENTRY) ? node->height :
- tree_g.line_height;
+ height = (n->type == TREE_NODE_ENTRY) ? n->height : tree_g.line_height;
sw->current_y += height;
switch (sw->purpose) {
case TREEVIEW_WALK_HAS_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
+ if (n->flags & TREE_NODE_SELECTED) {
sw->data.has_selection = true;
- return true; /* Can abort tree walk */
+ *end = true; /* Can abort tree walk */
+ return NSERROR_OK;
}
break;
case TREEVIEW_WALK_DELETE_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
- treeview_delete_node_internal(sw->tree, node, true);
+ if (n->flags & TREE_NODE_SELECTED) {
+ err = treeview_delete_node_internal(sw->tree, n, true);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+ *skip_children = true;
changed = true;
}
break;
case TREEVIEW_WALK_CLEAR_SELECTION:
- if (node->flags & TREE_NODE_SELECTED) {
- node->flags ^= TREE_NODE_SELECTED;
+ if (n->flags & TREE_NODE_SELECTED) {
+ n->flags ^= TREE_NODE_SELECTED;
changed = true;
}
break;
case TREEVIEW_WALK_SELECT_ALL:
- if (!(node->flags & TREE_NODE_SELECTED)) {
- node->flags ^= TREE_NODE_SELECTED;
+ if (!(n->flags & TREE_NODE_SELECTED)) {
+ n->flags ^= TREE_NODE_SELECTED;
changed = true;
}
break;
@@ -1161,9 +1324,9 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
if (sw->current_y > sw->data.drag.sel_min &&
sw->current_y - height <
sw->data.drag.sel_max) {
- node->flags ^= TREE_NODE_SELECTED;
+ n->flags ^= TREE_NODE_SELECTED;
}
- return false; /* Don't stop walk */
+ return NSERROR_OK;
}
if (changed) {
@@ -1177,12 +1340,12 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
}
}
- return false; /* Don't stop walk */
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-bool treeview_has_selection(struct treeview *tree)
+bool treeview_has_selection(treeview *tree)
{
struct treeview_selection_walk_data sw;
@@ -1197,7 +1360,7 @@ bool treeview_has_selection(struct treeview *tree)
/* Exported interface, documented in treeview.h */
-bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
+bool treeview_clear_selection(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1219,7 +1382,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
/* Exported interface, documented in treeview.h */
-bool treeview_select_all(struct treeview *tree, struct rect *rect)
+bool treeview_select_all(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1243,7 +1406,7 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect)
/**
* Commit a current selection drag, modifying the node's selection state.
*/
-static void treeview_commit_selection_drag(struct treeview *tree)
+static void treeview_commit_selection_drag(treeview *tree)
{
struct treeview_selection_walk_data sw;
@@ -1264,9 +1427,9 @@ static void treeview_commit_selection_drag(struct treeview *tree)
/**
- * Commit a current selection drag, modifying the node's selection state.
+ * Delete a selection.
*/
-static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
+static bool treeview_delete_selection(treeview *tree, struct rect *rect)
{
struct treeview_selection_walk_data sw;
@@ -1292,10 +1455,11 @@ static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
/* Exported interface, documented in treeview.h */
-bool treeview_keypress(struct treeview *tree, uint32_t key)
+bool treeview_keypress(treeview *tree, uint32_t key)
{
struct rect r; /**< Redraw rectangle */
bool redraw = false;
+ nserror err;
assert(tree != NULL);
@@ -1309,6 +1473,12 @@ bool treeview_keypress(struct treeview *tree, uint32_t key)
case KEY_DELETE_LEFT:
case KEY_DELETE_RIGHT:
redraw = treeview_delete_selection(tree, &r);
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS) {
+ /* Delete any empty nodes */
+ err = treeview_delete_empty_nodes(tree);
+ r.y0 = 0;
+ }
break;
case KEY_CR:
case KEY_NL:
@@ -1339,14 +1509,15 @@ bool treeview_keypress(struct treeview *tree, uint32_t key)
}
struct treeview_mouse_action {
- struct treeview *tree;
+ treeview *tree;
browser_mouse_state mouse;
int x;
int y;
int current_y; /* Y coordinate value of top of current node */
};
/** Treewalk node callback for handling mouse action. */
-static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
+static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx,
+ bool *skip_children, bool *end)
{
struct treeview_mouse_action *ma = ctx;
struct rect r;
@@ -1369,7 +1540,7 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
/* Skip line if we've not reached mouse y */
if (ma->y > ma->current_y + height) {
ma->current_y += height;
- return false; /* Don't want to abort tree walk */
+ return NSERROR_OK; /* Don't want to abort tree walk */
}
/* Find where the mouse is */
@@ -1500,6 +1671,9 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
} else {
err = treeview_node_expand(ma->tree, node);
}
+ if (err != NSERROR_OK) {
+ return err;
+ }
/* Set up redraw */
if (!redraw || r.y0 > ma->current_y)
@@ -1556,10 +1730,11 @@ static bool treeview_node_mouse_action_cb(struct treeview_node *node, void *ctx)
ma->tree->cw_t->redraw_request(ma->tree->cw_h, r);
}
- return true; /* Reached line with click; stop walking tree */
+ *end = true; /* Reached line with click; stop walking tree */
+ return NSERROR_OK;
}
/* Exported interface, documented in treeview.h */
-void treeview_mouse_action(struct treeview *tree,
+void treeview_mouse_action(treeview *tree,
browser_mouse_state mouse, int x, int y)
{
bool redraw = false;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 475b90e..5662dfa 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -30,8 +30,8 @@
#include "desktop/textinput.h"
#include "utils/types.h"
-struct treeview;
-struct treeview_node;
+typedef struct treeview treeview;
+typedef struct treeview_node treeview_node;
enum treeview_relationship {
TREE_REL_FIRST_CHILD,
@@ -127,7 +127,7 @@ nserror treeview_fini(void);
*
* So fields[0] and fields[N-1] have TREE_FLAG_DEFAULT set.
*/
-nserror treeview_create(struct treeview **tree,
+nserror treeview_create(treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
@@ -141,7 +141,7 @@ nserror treeview_create(struct treeview **tree,
*
* Will emit folder and entry deletion msg callbacks for all nodes in treeview.
*/
-nserror treeview_destroy(struct treeview *tree);
+nserror treeview_destroy(treeview *tree);
/**
* Create a folder node in given treeview
@@ -159,9 +159,9 @@ nserror treeview_destroy(struct treeview *tree);
*
* If relation is NULL, will insert as child of root node.
*/
-nserror treeview_create_node_folder(struct treeview *tree,
- struct treeview_node **folder,
- struct treeview_node *relation,
+nserror treeview_create_node_folder(treeview *tree,
+ treeview_node **folder,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
void *data, treeview_node_create_flags flags);
@@ -182,9 +182,9 @@ nserror treeview_create_node_folder(struct treeview *tree,
*
* If relation is NULL, will insert as child of root node.
*/
-nserror treeview_create_node_entry(struct treeview *tree,
- struct treeview_node **entry,
- struct treeview_node *relation,
+nserror treeview_create_node_entry(treeview *tree,
+ treeview_node **entry,
+ treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
void *data, treeview_node_create_flags flags);
@@ -200,8 +200,8 @@ nserror treeview_create_node_entry(struct treeview *tree,
*
* Fields array names must match names past in treeview_create fields[0...N-2].
*/
-nserror treeview_update_node_entry(struct treeview *tree,
- struct treeview_node *entry,
+nserror treeview_update_node_entry(treeview *tree,
+ treeview_node *entry,
const struct treeview_field_data fields[],
void *data);
@@ -214,7 +214,7 @@ nserror treeview_update_node_entry(struct treeview *tree,
*
* Will emit folder or entry deletion msg callback.
*/
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n);
+nserror treeview_delete_node(treeview *tree, treeview_node *n);
/**
* Expand a treeview node
@@ -223,8 +223,7 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n);
* \param node Node to expand
* \return NSERROR_OK on success, appropriate error otherwise
*/
-nserror treeview_node_expand(struct treeview *tree,
- struct treeview_node *node);
+nserror treeview_node_expand(treeview *tree, treeview_node *node);
/**
* Contract a treeview node
@@ -233,8 +232,7 @@ nserror treeview_node_expand(struct treeview *tree,
* \param node Node to contract
* \return NSERROR_OK on success, appropriate error otherwise
*/
-nserror treeview_node_contract(struct treeview *tree,
- struct treeview_node *node);
+nserror treeview_node_contract(treeview *tree, treeview_node *node);
/**
* Redraw a treeview object
@@ -245,7 +243,7 @@ nserror treeview_node_contract(struct treeview *tree,
* \param clip Current clip rectangle (wrt tree origin)
* \param ctx Current redraw context
*/
-void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
+void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
const struct redraw_context *ctx);
/**
@@ -255,7 +253,7 @@ void treeview_redraw(struct treeview *tree, int x, int y, struct rect *clip,
* \param key The ucs4 character codepoint
* \return true if the keypress is dealt with, false otherwise.
*/
-bool treeview_keypress(struct treeview *tree, uint32_t key);
+bool treeview_keypress(treeview *tree, uint32_t key);
/**
* Handles all kinds of mouse action
@@ -265,7 +263,7 @@ bool treeview_keypress(struct treeview *tree, uint32_t key);
* \param x X coordinate
* \param y Y coordinate
*/
-void treeview_mouse_action(struct treeview *tree,
+void treeview_mouse_action(treeview *tree,
browser_mouse_state mouse, int x, int y);
/**
@@ -274,7 +272,7 @@ void treeview_mouse_action(struct treeview *tree,
* \param tree Treeview object to delete node from
* \return true iff treeview has a selection
*/
-bool treeview_has_selection(struct treeview *tree);
+bool treeview_has_selection(treeview *tree);
/**
* Clear any selection in a treeview
@@ -283,7 +281,7 @@ bool treeview_has_selection(struct treeview *tree);
* \param rect Redraw rectangle (if redraw required)
* \return true iff redraw required
*/
-bool treeview_clear_selection(struct treeview *tree, struct rect *rect);
+bool treeview_clear_selection(treeview *tree, struct rect *rect);
/**
* Select all in a treeview
@@ -292,7 +290,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect);
* \param rect Redraw rectangle (if redraw required)
* \return true iff redraw required
*/
-bool treeview_select_all(struct treeview *tree, struct rect *rect);
+bool treeview_select_all(treeview *tree, struct rect *rect);
/**
* Find current height of a treeview
@@ -300,6 +298,6 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect);
* \param tree Treeview object to find height of
* \return height of treeview in px
*/
-int treeview_get_height(struct treeview *tree);
+int treeview_get_height(treeview *tree);
#endif
diff --git a/render/html_object.c b/render/html_object.c
index aad0dac..0868ce3 100644
--- a/render/html_object.c
+++ b/render/html_object.c
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include "content/hlcache.h"
+#include "css/utils.h"
#include "utils/nsoption.h"
#include "desktop/scrollbar.h"
#include "render/box.h"
@@ -215,26 +216,109 @@ html_object_callback(hlcache_handle *object,
box_coords(box, &x, &y);
- if (hlcache_handle_get_content(object) ==
- event->data.redraw.object) {
- data.redraw.x = data.redraw.x *
- box->width / content_get_width(object);
- data.redraw.y = data.redraw.y *
- box->height /
- content_get_height(object);
- data.redraw.width = data.redraw.width *
- box->width / content_get_width(object);
- data.redraw.height = data.redraw.height *
- box->height /
- content_get_height(object);
+ if (object == box->background) {
+ /* Redraw request is for background */
+ css_fixed hpos = 0, vpos = 0;
+ css_unit hunit = CSS_UNIT_PX;
+ css_unit vunit = CSS_UNIT_PX;
+ int width = box->padding[LEFT] + box->width +
+ box->padding[RIGHT];
+ int height = box->padding[TOP] + box->height +
+ box->padding[BOTTOM];
+ int t, h, l, w;
+
+ /* Need to know background-position */
+ css_computed_background_position(box->style,
+ &hpos, &hunit, &vpos, &vunit);
+
+ w = content_get_width(box->background);
+ if (hunit == CSS_UNIT_PCT) {
+ l = (width - w) * hpos / INTTOFIX(100);
+ } else {
+ l = FIXTOINT(nscss_len2px(hpos, hunit,
+ box->style));
+ }
+
+ h = content_get_height(box->background);
+ if (vunit == CSS_UNIT_PCT) {
+ t = (height - h) * vpos / INTTOFIX(100);
+ } else {
+ t = FIXTOINT(nscss_len2px(vpos, vunit,
+ box->style));
+ }
+
+ /* Redraw area depends on background-repeat */
+ switch (css_computed_background_repeat(
+ box->style)) {
+ case CSS_BACKGROUND_REPEAT_REPEAT:
+ data.redraw.x = 0;
+ data.redraw.y = 0;
+ data.redraw.width = box->width;
+ data.redraw.height = box->height;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_REPEAT_X:
+ data.redraw.x = 0;
+ data.redraw.y = t;
+ data.redraw.width = box->width;
+ data.redraw.height = h;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_REPEAT_Y:
+ data.redraw.x = l;
+ data.redraw.y = 0;
+ data.redraw.width = w;
+ data.redraw.height = box->height;
+ break;
+
+ case CSS_BACKGROUND_REPEAT_NO_REPEAT:
+ data.redraw.x = l;
+ data.redraw.y = t;
+ data.redraw.width = w;
+ data.redraw.height = h;
+ break;
+
+ default:
+ break;
+ }
+
data.redraw.object_width = box->width;
data.redraw.object_height = box->height;
- }
- data.redraw.x += x + box->padding[LEFT];
- data.redraw.y += y + box->padding[TOP];
- data.redraw.object_x += x + box->padding[LEFT];
- data.redraw.object_y += y + box->padding[TOP];
+ /* Add offset to box */
+ data.redraw.x += x;
+ data.redraw.y += y;
+ data.redraw.object_x += x;
+ data.redraw.object_y += y;
+
+ content_broadcast(&c->base,
+ CONTENT_MSG_REDRAW, data);
+ break;
+
+ } else {
+ /* Non-background case */
+ int w = content_get_width(object);
+ int h = content_get_height(object);
+ if (hlcache_handle_get_content(object) ==
+ event->data.redraw.object) {
+ data.redraw.x = data.redraw.x *
+ box->width / w;
+ data.redraw.y = data.redraw.y *
+ box->height / h;
+ data.redraw.width = data.redraw.width *
+ box->width / w;
+ data.redraw.height =
+ data.redraw.height *
+ box->height / h;
+ data.redraw.object_width = box->width;
+ data.redraw.object_height = box->height;
+ }
+
+ data.redraw.x += x + box->padding[LEFT];
+ data.redraw.y += y + box->padding[TOP];
+ data.redraw.object_x += x + box->padding[LEFT];
+ data.redraw.object_y += y + box->padding[TOP];
+ }
content_broadcast(&c->base, CONTENT_MSG_REDRAW, data);
}
--
NetSurf Browser
9 years, 8 months
netsurf: branch master updated. release/3.0-292-gc256320
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/c256320b082fe7fb7ef0f...
...commit http://git.netsurf-browser.org/netsurf.git/commit/c256320b082fe7fb7ef0f0e...
...tree http://git.netsurf-browser.org/netsurf.git/tree/c256320b082fe7fb7ef0f0e43...
The branch, master has been updated
via c256320b082fe7fb7ef0f0e4360fd3965170f7d4 (commit)
from 4f238758db628ee62e4c64411b9f7860dc9f46d1 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=c256320b082fe7fb7ef...
commit c256320b082fe7fb7ef0f0e4360fd3965170f7d4
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Treeview walker now takes two callback function pointers. One called in fwd direction, one called in bwd direction.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 45d3a08..f123c4e 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -670,14 +670,16 @@ nserror treeview_destroy(struct treeview *tree)
/* Walk a treeview subtree, calling a callback at each node (depth first)
*
- * \param root Root to walk tree from (doesn't get a callback call)
- * \param full Iff true, visit children of collapsed nodes
- * \param callback Function to call on each node
- * \param ctx Context to pass to callback
+ * \param root Root to walk tree from (doesn't get a callback call)
+ * \param full Iff true, visit children of collapsed nodes
+ * \param callback_bwd Function to call on each node in backwards order
+ * \param callback_fwd Function to call on each node in forwards order
+ * \param ctx Context to pass to callback
* \return true iff callback caused premature abort
*/
static bool treeview_walk_internal(struct treeview_node *root, bool full,
- bool (*callback)(struct treeview_node *node, void *ctx),
+ bool (*callback_bwd)(struct treeview_node *node, void *ctx),
+ bool (*callback_fwd)(struct treeview_node *node, void *ctx),
void *ctx)
{
struct treeview_node *node, *next;
@@ -698,19 +700,28 @@ static bool treeview_walk_internal(struct treeview_node *root, bool full,
while (node != root &&
node->sibling_next == NULL) {
+ if (callback_bwd != NULL &&
+ callback_bwd(node, ctx)) {
+ /* callback caused early termination */
+ return true;
+ }
node = node->parent;
}
if (node == root)
break;
+ if (callback_bwd != NULL && callback_bwd(node, ctx)) {
+ /* callback caused early termination */
+ return true;
+ }
node = node->sibling_next;
}
assert(node != NULL);
assert(node != root);
- if (callback(node, ctx)) {
+ if (callback_fwd != NULL && callback_fwd(node, ctx)) {
/* callback caused early termination */
return true;
}
@@ -844,7 +855,8 @@ nserror treeview_node_contract(struct treeview *tree,
}
/* Contract children. */
- treeview_walk_internal(node, false, treeview_node_contract_cb, NULL);
+ treeview_walk_internal(node, false, NULL,
+ treeview_node_contract_cb, NULL);
/* Contract node */
treeview_node_contract_cb(node, NULL);
@@ -1177,7 +1189,7 @@ bool treeview_has_selection(struct treeview *tree)
sw.purpose = TREEVIEW_WALK_HAS_SELECTION;
sw.data.has_selection = false;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.has_selection;
@@ -1199,7 +1211,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
sw.data.redraw.rect = rect;
sw.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1221,7 +1233,7 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect)
sw.data.redraw.rect = rect;
sw.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1246,7 +1258,7 @@ static void treeview_commit_selection_drag(struct treeview *tree)
sw.data.drag.sel_max = tree->drag.prev.y;
}
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
}
@@ -1272,7 +1284,7 @@ static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
sw.current_y = 0;
sw.tree = tree;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1643,7 +1655,7 @@ void treeview_mouse_action(struct treeview *tree,
ma.y = y;
ma.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_mouse_action_cb, &ma);
}
}
-----------------------------------------------------------------------
Summary of changes:
desktop/treeview.c | 38 +++++++++++++++++++++++++-------------
1 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 45d3a08..f123c4e 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -670,14 +670,16 @@ nserror treeview_destroy(struct treeview *tree)
/* Walk a treeview subtree, calling a callback at each node (depth first)
*
- * \param root Root to walk tree from (doesn't get a callback call)
- * \param full Iff true, visit children of collapsed nodes
- * \param callback Function to call on each node
- * \param ctx Context to pass to callback
+ * \param root Root to walk tree from (doesn't get a callback call)
+ * \param full Iff true, visit children of collapsed nodes
+ * \param callback_bwd Function to call on each node in backwards order
+ * \param callback_fwd Function to call on each node in forwards order
+ * \param ctx Context to pass to callback
* \return true iff callback caused premature abort
*/
static bool treeview_walk_internal(struct treeview_node *root, bool full,
- bool (*callback)(struct treeview_node *node, void *ctx),
+ bool (*callback_bwd)(struct treeview_node *node, void *ctx),
+ bool (*callback_fwd)(struct treeview_node *node, void *ctx),
void *ctx)
{
struct treeview_node *node, *next;
@@ -698,19 +700,28 @@ static bool treeview_walk_internal(struct treeview_node *root, bool full,
while (node != root &&
node->sibling_next == NULL) {
+ if (callback_bwd != NULL &&
+ callback_bwd(node, ctx)) {
+ /* callback caused early termination */
+ return true;
+ }
node = node->parent;
}
if (node == root)
break;
+ if (callback_bwd != NULL && callback_bwd(node, ctx)) {
+ /* callback caused early termination */
+ return true;
+ }
node = node->sibling_next;
}
assert(node != NULL);
assert(node != root);
- if (callback(node, ctx)) {
+ if (callback_fwd != NULL && callback_fwd(node, ctx)) {
/* callback caused early termination */
return true;
}
@@ -844,7 +855,8 @@ nserror treeview_node_contract(struct treeview *tree,
}
/* Contract children. */
- treeview_walk_internal(node, false, treeview_node_contract_cb, NULL);
+ treeview_walk_internal(node, false, NULL,
+ treeview_node_contract_cb, NULL);
/* Contract node */
treeview_node_contract_cb(node, NULL);
@@ -1177,7 +1189,7 @@ bool treeview_has_selection(struct treeview *tree)
sw.purpose = TREEVIEW_WALK_HAS_SELECTION;
sw.data.has_selection = false;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.has_selection;
@@ -1199,7 +1211,7 @@ bool treeview_clear_selection(struct treeview *tree, struct rect *rect)
sw.data.redraw.rect = rect;
sw.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1221,7 +1233,7 @@ bool treeview_select_all(struct treeview *tree, struct rect *rect)
sw.data.redraw.rect = rect;
sw.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1246,7 +1258,7 @@ static void treeview_commit_selection_drag(struct treeview *tree)
sw.data.drag.sel_max = tree->drag.prev.y;
}
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
}
@@ -1272,7 +1284,7 @@ static bool treeview_delete_selection(struct treeview *tree, struct rect *rect)
sw.current_y = 0;
sw.tree = tree;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_selection_walk_cb, &sw);
return sw.data.redraw.required;
@@ -1643,7 +1655,7 @@ void treeview_mouse_action(struct treeview *tree,
ma.y = y;
ma.current_y = 0;
- treeview_walk_internal(tree->root, false,
+ treeview_walk_internal(tree->root, false, NULL,
treeview_node_mouse_action_cb, &ma);
}
}
--
NetSurf Browser
9 years, 9 months
netsurf: branch master updated. release/3.0-291-g4f23875
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/4f238758db628ee62e4c6...
...commit http://git.netsurf-browser.org/netsurf.git/commit/4f238758db628ee62e4c644...
...tree http://git.netsurf-browser.org/netsurf.git/tree/4f238758db628ee62e4c64411...
The branch, master has been updated
via 4f238758db628ee62e4c64411b9f7860dc9f46d1 (commit)
via 657d6ed587a4d27510de7c5836d790e1589c1075 (commit)
from 520503bc7e8233034edb748c9075b1243789cd27 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=4f238758db628ee62e4...
commit 4f238758db628ee62e4c64411b9f7860dc9f46d1
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Don't allow empty folders.
diff --git a/desktop/global_history.c b/desktop/global_history.c
index e5326c6..d3d3391 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -712,7 +712,7 @@ nserror global_history_init(struct core_window_callback_table *cw_t,
err = treeview_create(&gh_ctx.tree, &tree_cb_t,
N_FIELDS, gh_ctx.fields,
cw_t, core_window_handle,
- TREEVIEW_NO_MOVES);
+ TREEVIEW_NO_MOVES | TREEVIEW_DEL_EMPTY_DIRS);
if (err != NSERROR_OK) {
gh_ctx.tree = NULL;
return err;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=657d6ed587a4d27510d...
commit 657d6ed587a4d27510de7c5836d790e1589c1075
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Implement DEL_EMPTY_DIRS flag.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 7603033..45d3a08 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -485,15 +485,18 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
+ static int nest_depth = 0;
if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
return NSERROR_OK;
}
/* Destroy children first */
+ nest_depth++;
while (n->children != NULL) {
treeview_delete_node_internal(tree, n->children, interaction);
}
+ nest_depth--;
/* Unlink node from tree */
if (n->parent != NULL && n->parent->children == n) {
@@ -531,8 +534,23 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
return NSERROR_BAD_PARAMETER;
}
- /* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ if (nest_depth == 0) {
+ /* This is the node we were originally asked to delete */
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS &&
+ n->parent != NULL &&
+ n->parent->type != TREE_NODE_ROOT &&
+ n->parent->children == NULL) {
+ /* Delete empty parent */
+ nest_depth++;
+ treeview_delete_node_internal(tree, n->parent,
+ interaction);
+ nest_depth--;
+ }
+
+ /* Inform front end of change in dimensions */
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ }
/* Free the node */
free(n);
-----------------------------------------------------------------------
Summary of changes:
desktop/global_history.c | 2 +-
desktop/treeview.c | 22 ++++++++++++++++++++--
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/desktop/global_history.c b/desktop/global_history.c
index e5326c6..d3d3391 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -712,7 +712,7 @@ nserror global_history_init(struct core_window_callback_table *cw_t,
err = treeview_create(&gh_ctx.tree, &tree_cb_t,
N_FIELDS, gh_ctx.fields,
cw_t, core_window_handle,
- TREEVIEW_NO_MOVES);
+ TREEVIEW_NO_MOVES | TREEVIEW_DEL_EMPTY_DIRS);
if (err != NSERROR_OK) {
gh_ctx.tree = NULL;
return err;
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 7603033..45d3a08 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -485,15 +485,18 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
+ static int nest_depth = 0;
if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
return NSERROR_OK;
}
/* Destroy children first */
+ nest_depth++;
while (n->children != NULL) {
treeview_delete_node_internal(tree, n->children, interaction);
}
+ nest_depth--;
/* Unlink node from tree */
if (n->parent != NULL && n->parent->children == n) {
@@ -531,8 +534,23 @@ static nserror treeview_delete_node_internal(struct treeview *tree,
return NSERROR_BAD_PARAMETER;
}
- /* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ if (nest_depth == 0) {
+ /* This is the node we were originally asked to delete */
+
+ if (tree->flags & TREEVIEW_DEL_EMPTY_DIRS &&
+ n->parent != NULL &&
+ n->parent->type != TREE_NODE_ROOT &&
+ n->parent->children == NULL) {
+ /* Delete empty parent */
+ nest_depth++;
+ treeview_delete_node_internal(tree, n->parent,
+ interaction);
+ nest_depth--;
+ }
+
+ /* Inform front end of change in dimensions */
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ }
/* Free the node */
free(n);
--
NetSurf Browser
9 years, 9 months
netsurf: branch master updated. release/3.0-289-g520503b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/520503bc7e8233034edb7...
...commit http://git.netsurf-browser.org/netsurf.git/commit/520503bc7e8233034edb748...
...tree http://git.netsurf-browser.org/netsurf.git/tree/520503bc7e8233034edb748c9...
The branch, master has been updated
via 520503bc7e8233034edb748c9075b1243789cd27 (commit)
from 26befde81c6d0c40ce5ebf9244b0f963587b7646 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=520503bc7e8233034ed...
commit 520503bc7e8233034edb748c9075b1243789cd27
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Allow empty folders to be open.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 062ef9b..7603033 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -724,8 +724,8 @@ nserror treeview_node_expand(struct treeview *tree,
case TREE_NODE_FOLDER:
child = node->children;
if (child == NULL) {
- /* Can't expand an empty node */
- return NSERROR_OK;
+ /* Allow expansion of empty folders */
+ break;
}
do {
@@ -781,7 +781,8 @@ nserror treeview_node_expand(struct treeview *tree,
node->height += additional_height;
/* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ if (additional_height != 0)
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
}
-----------------------------------------------------------------------
Summary of changes:
desktop/treeview.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 062ef9b..7603033 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -724,8 +724,8 @@ nserror treeview_node_expand(struct treeview *tree,
case TREE_NODE_FOLDER:
child = node->children;
if (child == NULL) {
- /* Can't expand an empty node */
- return NSERROR_OK;
+ /* Allow expansion of empty folders */
+ break;
}
do {
@@ -781,7 +781,8 @@ nserror treeview_node_expand(struct treeview *tree,
node->height += additional_height;
/* Inform front end of change in dimensions */
- tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
+ if (additional_height != 0)
+ tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
}
--
NetSurf Browser
9 years, 9 months
netsurf: branch master updated. release/3.0-288-g26befde
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/26befde81c6d0c40ce5eb...
...commit http://git.netsurf-browser.org/netsurf.git/commit/26befde81c6d0c40ce5ebf9...
...tree http://git.netsurf-browser.org/netsurf.git/tree/26befde81c6d0c40ce5ebf924...
The branch, master has been updated
via 26befde81c6d0c40ce5ebf9244b0f963587b7646 (commit)
via c010535fbe85841f096c90128ea29016e770fc56 (commit)
from 4313d4c4ec8bc45886f0ace9bdfea3f529ba433d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=26befde81c6d0c40ce5...
commit 26befde81c6d0c40ce5ebf9244b0f963587b7646
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Make READ_ONLY flag a combinator for NO_MOVES and NO_DELETES. Implement NO_DELETES.
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 5d8a72f..062ef9b 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -469,16 +469,30 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
-/* Exported interface, documented in treeview.h */
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete node from
+ * \param n Node to delete
+ * \param interaction Delete is result of user interaction with treeview
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Will emit folder or entry deletion msg callback.
+ */
+static nserror treeview_delete_node_internal(struct treeview *tree,
+ struct treeview_node *n, bool interaction)
{
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
+ if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
+ return NSERROR_OK;
+ }
+
/* Destroy children first */
while (n->children != NULL) {
- treeview_delete_node(tree, n->children);
+ treeview_delete_node_internal(tree, n->children, interaction);
}
/* Unlink node from tree */
@@ -528,6 +542,13 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
/* Exported interface, documented in treeview.h */
+nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+{
+ return treeview_delete_node_internal(tree, n, false);
+}
+
+
+/* Exported interface, documented in treeview.h */
nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
@@ -614,7 +635,7 @@ nserror treeview_destroy(struct treeview *tree)
assert(tree != NULL);
/* Destroy nodes */
- treeview_delete_node(tree, tree->root);
+ treeview_delete_node_internal(tree, tree->root, false);
/* Destroy feilds */
for (f = 0; f <= tree->n_fields; f++) {
@@ -1086,7 +1107,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
case TREEVIEW_WALK_DELETE_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
- treeview_delete_node(sw->tree, node);
+ treeview_delete_node_internal(sw->tree, node, true);
changed = true;
}
break;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 5704014..475b90e 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -44,10 +44,11 @@ typedef enum {
} treeview_node_create_flags; /**< Relationship between nodes */
typedef enum {
- TREEVIEW_NO_FLAGS = (0), /* No flags set */
- TREEVIEW_READ_ONLY = (1 << 0), /* No edits */
- TREEVIEW_NO_MOVES = (1 << 1), /* No node drags */
- TREEVIEW_DELETE_EMPTY_DIRS = (1 << 2) /* Del. dirs on empty */
+ TREEVIEW_NO_FLAGS = (0), /**< No flags set */
+ TREEVIEW_NO_MOVES = (1 << 0), /**< No node drags */
+ TREEVIEW_NO_DELETES = (1 << 1), /**< No node deletes */
+ TREEVIEW_READ_ONLY = TREEVIEW_NO_MOVES | TREEVIEW_NO_DELETES,
+ TREEVIEW_DEL_EMPTY_DIRS = (1 << 2) /**< Delete dirs on empty */
} treeview_flags;
enum treeview_msg {
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=c010535fbe85841f096...
commit c010535fbe85841f096c90128ea29016e770fc56
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Add treeview behaviour flags.
diff --git a/desktop/global_history.c b/desktop/global_history.c
index 5196c16..e5326c6 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -711,7 +711,8 @@ nserror global_history_init(struct core_window_callback_table *cw_t,
/* Create the global history treeview */
err = treeview_create(&gh_ctx.tree, &tree_cb_t,
N_FIELDS, gh_ctx.fields,
- cw_t, core_window_handle);
+ cw_t, core_window_handle,
+ TREEVIEW_NO_MOVES);
if (err != NSERROR_OK) {
gh_ctx.tree = NULL;
return err;
diff --git a/desktop/treeview.c b/desktop/treeview.c
index de57c49..5d8a72f 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -117,6 +117,8 @@ struct treeview_drag {
struct treeview {
uint32_t view_width; /** Viewport size */
+ treeview_flags flags; /** Treeview behaviour settings */
+
struct treeview_node *root; /**< Root node */
struct treeview_field *fields; /**< Array of fields */
@@ -530,7 +532,7 @@ nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
- struct core_window *cw)
+ struct core_window *cw, treeview_flags flags)
{
nserror error;
int i;
@@ -595,6 +597,8 @@ nserror treeview_create(struct treeview **tree,
(*tree)->drag.prev.node_y = 0;
(*tree)->drag.prev.node_h = 0;
+ (*tree)->flags = flags;
+
(*tree)->cw_t = cw_t;
(*tree)->cw_h = cw;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index ad6aafc..5704014 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -41,7 +41,14 @@ enum treeview_relationship {
typedef enum {
TREE_CREATE_NONE = (0), /* No flags set */
TREE_CREATE_SUPPRESS_RESIZE = (1 << 0) /* Suppress callback */
-} treeview_node_create_flags;
+} treeview_node_create_flags; /**< Relationship between nodes */
+
+typedef enum {
+ TREEVIEW_NO_FLAGS = (0), /* No flags set */
+ TREEVIEW_READ_ONLY = (1 << 0), /* No edits */
+ TREEVIEW_NO_MOVES = (1 << 1), /* No node drags */
+ TREEVIEW_DELETE_EMPTY_DIRS = (1 << 2) /* Del. dirs on empty */
+} treeview_flags;
enum treeview_msg {
TREE_MSG_NODE_DELETE, /**< Node to be deleted */
@@ -108,6 +115,7 @@ nserror treeview_fini(void);
* \param fields Array of treeview fields
* \param cw_t Callback table for core_window containing the treeview
* \param cw The core_window in which the treeview is shown
+ * \param flags Treeview behaviour flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* The fields array order is as follows (N = n_fields):
@@ -122,7 +130,7 @@ nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
- struct core_window *cw);
+ struct core_window *cw, treeview_flags flags);
/**
* Destroy a treeview object
-----------------------------------------------------------------------
Summary of changes:
desktop/global_history.c | 3 ++-
desktop/treeview.c | 37 +++++++++++++++++++++++++++++++------
desktop/treeview.h | 13 +++++++++++--
3 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/desktop/global_history.c b/desktop/global_history.c
index 5196c16..e5326c6 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -711,7 +711,8 @@ nserror global_history_init(struct core_window_callback_table *cw_t,
/* Create the global history treeview */
err = treeview_create(&gh_ctx.tree, &tree_cb_t,
N_FIELDS, gh_ctx.fields,
- cw_t, core_window_handle);
+ cw_t, core_window_handle,
+ TREEVIEW_NO_MOVES);
if (err != NSERROR_OK) {
gh_ctx.tree = NULL;
return err;
diff --git a/desktop/treeview.c b/desktop/treeview.c
index de57c49..062ef9b 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -117,6 +117,8 @@ struct treeview_drag {
struct treeview {
uint32_t view_width; /** Viewport size */
+ treeview_flags flags; /** Treeview behaviour settings */
+
struct treeview_node *root; /**< Root node */
struct treeview_field *fields; /**< Array of fields */
@@ -467,16 +469,30 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
-/* Exported interface, documented in treeview.h */
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete node from
+ * \param n Node to delete
+ * \param interaction Delete is result of user interaction with treeview
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Will emit folder or entry deletion msg callback.
+ */
+static nserror treeview_delete_node_internal(struct treeview *tree,
+ struct treeview_node *n, bool interaction)
{
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
+ if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
+ return NSERROR_OK;
+ }
+
/* Destroy children first */
while (n->children != NULL) {
- treeview_delete_node(tree, n->children);
+ treeview_delete_node_internal(tree, n->children, interaction);
}
/* Unlink node from tree */
@@ -526,11 +542,18 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
/* Exported interface, documented in treeview.h */
+nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+{
+ return treeview_delete_node_internal(tree, n, false);
+}
+
+
+/* Exported interface, documented in treeview.h */
nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
- struct core_window *cw)
+ struct core_window *cw, treeview_flags flags)
{
nserror error;
int i;
@@ -595,6 +618,8 @@ nserror treeview_create(struct treeview **tree,
(*tree)->drag.prev.node_y = 0;
(*tree)->drag.prev.node_h = 0;
+ (*tree)->flags = flags;
+
(*tree)->cw_t = cw_t;
(*tree)->cw_h = cw;
@@ -610,7 +635,7 @@ nserror treeview_destroy(struct treeview *tree)
assert(tree != NULL);
/* Destroy nodes */
- treeview_delete_node(tree, tree->root);
+ treeview_delete_node_internal(tree, tree->root, false);
/* Destroy feilds */
for (f = 0; f <= tree->n_fields; f++) {
@@ -1082,7 +1107,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
case TREEVIEW_WALK_DELETE_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
- treeview_delete_node(sw->tree, node);
+ treeview_delete_node_internal(sw->tree, node, true);
changed = true;
}
break;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index ad6aafc..475b90e 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -41,7 +41,15 @@ enum treeview_relationship {
typedef enum {
TREE_CREATE_NONE = (0), /* No flags set */
TREE_CREATE_SUPPRESS_RESIZE = (1 << 0) /* Suppress callback */
-} treeview_node_create_flags;
+} treeview_node_create_flags; /**< Relationship between nodes */
+
+typedef enum {
+ TREEVIEW_NO_FLAGS = (0), /**< No flags set */
+ TREEVIEW_NO_MOVES = (1 << 0), /**< No node drags */
+ TREEVIEW_NO_DELETES = (1 << 1), /**< No node deletes */
+ TREEVIEW_READ_ONLY = TREEVIEW_NO_MOVES | TREEVIEW_NO_DELETES,
+ TREEVIEW_DEL_EMPTY_DIRS = (1 << 2) /**< Delete dirs on empty */
+} treeview_flags;
enum treeview_msg {
TREE_MSG_NODE_DELETE, /**< Node to be deleted */
@@ -108,6 +116,7 @@ nserror treeview_fini(void);
* \param fields Array of treeview fields
* \param cw_t Callback table for core_window containing the treeview
* \param cw The core_window in which the treeview is shown
+ * \param flags Treeview behaviour flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* The fields array order is as follows (N = n_fields):
@@ -122,7 +131,7 @@ nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
const struct core_window_callback_table *cw_t,
- struct core_window *cw);
+ struct core_window *cw, treeview_flags flags);
/**
* Destroy a treeview object
--
NetSurf Browser
9 years, 9 months
netsurf: branch master updated. release/3.0-286-g4313d4c
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/4313d4c4ec8bc45886f0a...
...commit http://git.netsurf-browser.org/netsurf.git/commit/4313d4c4ec8bc45886f0ace...
...tree http://git.netsurf-browser.org/netsurf.git/tree/4313d4c4ec8bc45886f0ace9b...
The branch, master has been updated
via 4313d4c4ec8bc45886f0ace9bdfea3f529ba433d (commit)
from 6014a35ed3cb767166d281566d3d7abc4d8ee932 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=4313d4c4ec8bc45886f...
commit 4313d4c4ec8bc45886f0ace9bdfea3f529ba433d
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Make flags for suppress resize.
diff --git a/desktop/global_history.c b/desktop/global_history.c
index 29d744e..5196c16 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -185,7 +185,8 @@ static nserror global_history_create_dir(enum global_history_folders f)
relation, rel,
&gh_ctx.folders[f].data,
&gh_ctx.folders[f],
- !gh_ctx.built);
+ gh_ctx.built ? TREE_CREATE_NONE :
+ TREE_CREATE_SUPPRESS_RESIZE);
return err;
}
@@ -311,7 +312,8 @@ static nserror global_history_entry_insert(struct global_history_entry *e,
err = treeview_create_node_entry(gh_ctx.tree, &(e->entry),
parent, TREE_REL_FIRST_CHILD, e->data, e,
- !gh_ctx.built);
+ gh_ctx.built ? TREE_CREATE_NONE :
+ TREE_CREATE_SUPPRESS_RESIZE);
if (err != NSERROR_OK) {
return err;
}
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 13d35a2..de57c49 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -285,7 +285,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
- void *data, bool quiet)
+ void *data, treeview_node_create_flags flags)
{
struct treeview_node *n;
@@ -324,7 +324,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
*folder = n;
/* Inform front end of change in dimensions */
- if (!quiet)
+ if (!(flags & TREE_CREATE_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
@@ -398,7 +398,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
- void *data, bool quiet)
+ void *data, treeview_node_create_flags flags)
{
bool match;
struct treeview_node_entry *e;
@@ -460,7 +460,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
*entry = n;
/* Inform front end of change in dimensions */
- if (!quiet)
+ if (!(flags & TREE_CREATE_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 3539cf5..ad6aafc 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -38,6 +38,11 @@ enum treeview_relationship {
TREE_REL_NEXT_SIBLING
}; /**< Relationship between nodes */
+typedef enum {
+ TREE_CREATE_NONE = (0), /* No flags set */
+ TREE_CREATE_SUPPRESS_RESIZE = (1 << 0) /* Suppress callback */
+} treeview_node_create_flags;
+
enum treeview_msg {
TREE_MSG_NODE_DELETE, /**< Node to be deleted */
TREE_MSG_NODE_EDIT, /**< Node to be edited */
@@ -138,7 +143,7 @@ nserror treeview_destroy(struct treeview *tree);
* \param rel Folder's relationship to relation
* \param field Field data
* \param data Client data for node event callbacks
- * \param quiet True to suppress corewindow height update callback
+ * \param flags Node creation flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* Field name must match name past in treeview_create fields[N-1].
@@ -150,7 +155,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
- void *data, bool quiet);
+ void *data, treeview_node_create_flags flags);
/**
* Create an entry node in given treeview
@@ -161,7 +166,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
* \param rel Folder's relationship to relation
* \param fields Array of field data
* \param data Client data for node event callbacks
- * \param quiet True to suppress corewindow height update callback
+ * \param flags Node creation flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* Fields array names must match names past in treeview_create fields[0...N-2].
@@ -173,7 +178,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
- void *data, bool quiet);
+ void *data, treeview_node_create_flags flags);
/**
* Update an entry node in given treeview
-----------------------------------------------------------------------
Summary of changes:
desktop/global_history.c | 6 ++++--
desktop/treeview.c | 8 ++++----
desktop/treeview.h | 13 +++++++++----
3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/desktop/global_history.c b/desktop/global_history.c
index 29d744e..5196c16 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -185,7 +185,8 @@ static nserror global_history_create_dir(enum global_history_folders f)
relation, rel,
&gh_ctx.folders[f].data,
&gh_ctx.folders[f],
- !gh_ctx.built);
+ gh_ctx.built ? TREE_CREATE_NONE :
+ TREE_CREATE_SUPPRESS_RESIZE);
return err;
}
@@ -311,7 +312,8 @@ static nserror global_history_entry_insert(struct global_history_entry *e,
err = treeview_create_node_entry(gh_ctx.tree, &(e->entry),
parent, TREE_REL_FIRST_CHILD, e->data, e,
- !gh_ctx.built);
+ gh_ctx.built ? TREE_CREATE_NONE :
+ TREE_CREATE_SUPPRESS_RESIZE);
if (err != NSERROR_OK) {
return err;
}
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 13d35a2..de57c49 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -285,7 +285,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
- void *data, bool quiet)
+ void *data, treeview_node_create_flags flags)
{
struct treeview_node *n;
@@ -324,7 +324,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
*folder = n;
/* Inform front end of change in dimensions */
- if (!quiet)
+ if (!(flags & TREE_CREATE_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
@@ -398,7 +398,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
- void *data, bool quiet)
+ void *data, treeview_node_create_flags flags)
{
bool match;
struct treeview_node_entry *e;
@@ -460,7 +460,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
*entry = n;
/* Inform front end of change in dimensions */
- if (!quiet)
+ if (!(flags & TREE_CREATE_SUPPRESS_RESIZE))
tree->cw_t->update_size(tree->cw_h, -1, tree->root->height);
return NSERROR_OK;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 3539cf5..ad6aafc 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -38,6 +38,11 @@ enum treeview_relationship {
TREE_REL_NEXT_SIBLING
}; /**< Relationship between nodes */
+typedef enum {
+ TREE_CREATE_NONE = (0), /* No flags set */
+ TREE_CREATE_SUPPRESS_RESIZE = (1 << 0) /* Suppress callback */
+} treeview_node_create_flags;
+
enum treeview_msg {
TREE_MSG_NODE_DELETE, /**< Node to be deleted */
TREE_MSG_NODE_EDIT, /**< Node to be edited */
@@ -138,7 +143,7 @@ nserror treeview_destroy(struct treeview *tree);
* \param rel Folder's relationship to relation
* \param field Field data
* \param data Client data for node event callbacks
- * \param quiet True to suppress corewindow height update callback
+ * \param flags Node creation flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* Field name must match name past in treeview_create fields[N-1].
@@ -150,7 +155,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data *field,
- void *data, bool quiet);
+ void *data, treeview_node_create_flags flags);
/**
* Create an entry node in given treeview
@@ -161,7 +166,7 @@ nserror treeview_create_node_folder(struct treeview *tree,
* \param rel Folder's relationship to relation
* \param fields Array of field data
* \param data Client data for node event callbacks
- * \param quiet True to suppress corewindow height update callback
+ * \param flags Node creation flags
* \return NSERROR_OK on success, appropriate error otherwise
*
* Fields array names must match names past in treeview_create fields[0...N-2].
@@ -173,7 +178,7 @@ nserror treeview_create_node_entry(struct treeview *tree,
struct treeview_node *relation,
enum treeview_relationship rel,
const struct treeview_field_data fields[],
- void *data, bool quiet);
+ void *data, treeview_node_create_flags flags);
/**
* Update an entry node in given treeview
--
NetSurf Browser
9 years, 9 months
netsurf: branch master updated. release/3.0-285-g6014a35
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/6014a35ed3cb767166d28...
...commit http://git.netsurf-browser.org/netsurf.git/commit/6014a35ed3cb767166d2815...
...tree http://git.netsurf-browser.org/netsurf.git/tree/6014a35ed3cb767166d281566...
The branch, master has been updated
via 6014a35ed3cb767166d281566d3d7abc4d8ee932 (commit)
from 2476af4c65add3b94e4b1a30c0f17cd7b78f1256 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=6014a35ed3cb767166d...
commit 6014a35ed3cb767166d281566d3d7abc4d8ee932
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Implement entry launching. Currently only launches in new window.
diff --git a/desktop/global_history.c b/desktop/global_history.c
index ee09c1c..29d744e 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -648,6 +648,29 @@ static nserror global_history_tree_node_entry_cb(
break;
case TREE_MSG_NODE_LAUNCH:
+ {
+ nserror error;
+ struct browser_window *clone = NULL;
+ enum browser_window_nav_flags flags =
+ BROWSER_WINDOW_VERIFIABLE |
+ BROWSER_WINDOW_HISTORY |
+ BROWSER_WINDOW_TAB;
+
+ /* TODO: Set clone window, to window that new tab appears in */
+
+ if (msg.data.node_launch.mouse &
+ (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
+ clone == NULL) {
+ /* Shift or Ctrl launch, open in new window rather
+ * than tab. */
+ flags ^= BROWSER_WINDOW_TAB;
+ }
+
+ error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+ }
break;
}
return NSERROR_OK;
-----------------------------------------------------------------------
Summary of changes:
desktop/global_history.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/desktop/global_history.c b/desktop/global_history.c
index ee09c1c..29d744e 100644
--- a/desktop/global_history.c
+++ b/desktop/global_history.c
@@ -648,6 +648,29 @@ static nserror global_history_tree_node_entry_cb(
break;
case TREE_MSG_NODE_LAUNCH:
+ {
+ nserror error;
+ struct browser_window *clone = NULL;
+ enum browser_window_nav_flags flags =
+ BROWSER_WINDOW_VERIFIABLE |
+ BROWSER_WINDOW_HISTORY |
+ BROWSER_WINDOW_TAB;
+
+ /* TODO: Set clone window, to window that new tab appears in */
+
+ if (msg.data.node_launch.mouse &
+ (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_2) ||
+ clone == NULL) {
+ /* Shift or Ctrl launch, open in new window rather
+ * than tab. */
+ flags ^= BROWSER_WINDOW_TAB;
+ }
+
+ error = browser_window_create(flags, e->url, NULL, clone, NULL);
+ if (error != NSERROR_OK) {
+ warn_user(messages_get_errorcode(error), 0);
+ }
+ }
break;
}
return NSERROR_OK;
--
NetSurf Browser
9 years, 9 months