summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2011-11-11 13:09:12 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2011-11-11 13:09:12 +0000
commitdd267bd90a9d4ddd6f6247fc4eceaf7ed80839d0 (patch)
treec88b1b50fd5359fe0632815fd6f86ca00a16b9ff
parent36599a09cead791900935aeadcea49d46ff6a786 (diff)
downloadnetsurf-dd267bd90a9d4ddd6f6247fc4eceaf7ed80839d0.tar.gz
netsurf-dd267bd90a9d4ddd6f6247fc4eceaf7ed80839d0.tar.bz2
Trap RMB and select the node under the pointer if no other node selected
svn path=/trunk/netsurf/; revision=13146
-rwxr-xr-xamiga/tree.c29
-rw-r--r--desktop/tree.c23
-rw-r--r--desktop/tree.h1
3 files changed, 52 insertions, 1 deletions
diff --git a/amiga/tree.c b/amiga/tree.c
index 60bf21aaa..d3694bc2e 100755
--- a/amiga/tree.c
+++ b/amiga/tree.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 - 2010 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008 - 2011 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -95,6 +95,7 @@ struct treeview_window {
int max_height;
struct gui_globals globals;
struct sslcert_session_data *ssl_data;
+ BOOL rmbtrapped;
};
void ami_tree_draw(struct treeview_window *twin);
@@ -840,6 +841,26 @@ BOOL ami_tree_event(struct treeview_window *twin)
GetAttr(SPACE_AreaBox, twin->objects[GID_BROWSER], (ULONG *)&bbox);
+ if((twin->win->MouseX - bbox->Left >=0) &&
+ (twin->win->MouseX - bbox->Width - bbox->Left <=0) &&
+ (twin->win->MouseY - bbox->Top >=0) &&
+ (twin->win->MouseY - bbox->Height - bbox->Top <=0))
+ {
+ if(twin->rmbtrapped == FALSE)
+ {
+ SetWindowAttr(twin->win, WA_RMBTrap, (APTR)(BOOL)TRUE, sizeof(BOOL));
+ twin->rmbtrapped = FALSE;
+ }
+ }
+ else
+ {
+ if(twin->rmbtrapped == TRUE)
+ {
+ SetWindowAttr(twin->win, WA_RMBTrap, (APTR)(BOOL)FALSE, sizeof(BOOL));
+ twin->rmbtrapped = TRUE;
+ }
+ }
+
GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs);
x = twin->win->MouseX - bbox->Left + xs;
@@ -920,6 +941,12 @@ BOOL ami_tree_event(struct treeview_window *twin)
if(twin->drag_x == 0) twin->drag_x = x;
if(twin->drag_y == 0) twin->drag_y = y;
break;
+ case MENUDOWN:
+ if(tree_node_has_selection(tree_get_root(twin->tree)) == false)
+ {
+ tree_set_node_selected_at(twin->tree, x, y, true);
+ }
+ break;
}
}
diff --git a/desktop/tree.c b/desktop/tree.c
index 2ddedf620..097408e87 100644
--- a/desktop/tree.c
+++ b/desktop/tree.c
@@ -2314,6 +2314,29 @@ void tree_launch_selected(struct tree *tree, bool tabs)
/**
+ * Updates the node at position x,y to a selected state.
+ * The required areas of the tree are redrawn.
+ *
+ * \param tree the tree to update nodes for, may be NULL
+ * \param x x position in tree
+ * \param y y position in tree
+ * \param selected the selection state to set
+ */
+void tree_set_node_selected_at(struct tree *tree, int x, int y, bool selected)
+{
+ bool expansion_toggle;
+ struct node *node;
+
+ node = tree_get_node_at(tree->root, x, y, &expansion_toggle);
+
+ if ((node == NULL) || (expansion_toggle == true))
+ return;
+
+ tree_set_node_selected(tree, node, false, selected);
+}
+
+
+/**
* Handles a mouse action for a tree
*
* \param tree the tree to handle a click for
diff --git a/desktop/tree.h b/desktop/tree.h
index ed71f911e..1f3ee0c74 100644
--- a/desktop/tree.h
+++ b/desktop/tree.h
@@ -157,6 +157,7 @@ void tree_set_node_expanded(struct tree *tree, struct node *node, bool expanded,
bool folder, bool leaf);
void tree_set_node_selected(struct tree *tree, struct node *node, bool all,
bool selected);
+void tree_set_node_selected_at(struct tree *tree, int x, int y, bool selected);
void tree_set_node_sort_function(struct tree *tree, struct node *node,
int (*sort) (struct node *, struct node *));
void tree_set_node_user_callback(struct node *node,