Index: FL/Fl_Tree.H
===================================================================
--- FL/Fl_Tree.H	(revision 9823)
+++ FL/Fl_Tree.H	(working copy)
@@ -330,6 +330,7 @@
   void item_clicked(Fl_Tree_Item* val);
   void do_callback_for_item(Fl_Tree_Item* item, Fl_Tree_Reason reason);
   Fl_Tree_Item *next_visible_item(Fl_Tree_Item *start, int dir);
+  Fl_Tree_Item *next_active_item(Fl_Tree_Item *item, int dir);
   void extend_selection(Fl_Tree_Item *from, Fl_Tree_Item *to);
   int draw_tree();
 
@@ -367,10 +368,12 @@
   Fl_Tree_Item *item_clicked();
   Fl_Tree_Item *first();
   Fl_Tree_Item *first_visible();
+  Fl_Tree_Item *first_active();
   Fl_Tree_Item *next(Fl_Tree_Item *item=0);
   Fl_Tree_Item *prev(Fl_Tree_Item *item=0);
   Fl_Tree_Item *last();
   Fl_Tree_Item *last_visible();
+  Fl_Tree_Item *last_active();
   Fl_Tree_Item *first_selected_item();
   Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item=0);
 
Index: src/Fl_Tree.cxx
===================================================================
--- src/Fl_Tree.cxx	(revision 9823)
+++ src/Fl_Tree.cxx	(working copy)
@@ -168,18 +168,18 @@
 	switch (Fl::event_key()) {				// determine if focus was navigated..
 	  case FL_Tab: {					// received focus via TAB?
 	    int updown = is_shift ? FL_Up : FL_Down;		// SHIFT-TAB similar to Up, TAB similar to Down
-	    set_item_focus(next_visible_item(0, updown));
+	    set_item_focus(next_active_item(0, updown));
 	    break;
 	  }
 	  case FL_Left:		// received focus via LEFT or UP?
 	  case FL_Up: { 	// XK_ISO_Left_Tab
-	    set_item_focus(next_visible_item(0, FL_Up));
+	    set_item_focus(next_active_item(0, FL_Up));
 	    break;
 	  }
 	  case FL_Right: 	// received focus via RIGHT or DOWN?
 	  case FL_Down:
 	  default: {
-	    set_item_focus(next_visible_item(0, FL_Down));
+	    set_item_focus(next_active_item(0, FL_Down));
 	    break;
 	  }
 	}
@@ -255,7 +255,7 @@
 	    }
 	    case FL_Up:		// UP: next item up, or extend selection up
 	    case FL_Down: {	// DOWN: next item down, or extend selection down
-	      set_item_focus(next_visible_item(_item_focus, ekey));	// next item up|dn
+	      set_item_focus(next_active_item(_item_focus, ekey));	// next item up|dn
 	      if ( _item_focus ) {					// item in focus?
 	        // Autoscroll
 		int itemtop = _item_focus->y();
@@ -324,9 +324,10 @@
 	}
 	break;
       }
+      ret |= 1;						// handled
+      if ( ! item->is_active() ) break;			// item not active? no changes
       set_item_focus(item);				// becomes new focus widget
       redraw();
-      ret |= 1;						// handled
       if ( Fl::event_button() == FL_LEFT_MOUSE ) {
 	if ( item->event_on_collapse_icon(_prefs) ) {	// collapse icon clicked?
 	  open_toggle(item);
@@ -337,7 +338,11 @@
 	    case FL_TREE_SELECT_NONE:
 	      break;
 	    case FL_TREE_SELECT_SINGLE:
-	      select_only(item, when());
+	      if ( is_ctrl ) {			// CTRL+LEFT-CLICK?
+	        select_toggle(item, when());	// toggle
+	      } else {				// LEFT-CLICK?
+	        select_only(item, when());	// select only this item
+	      }
 	      _lastselect = item;
 	      break;
 	    case FL_TREE_SELECT_MULTI: {
@@ -375,9 +380,10 @@
       if ( Fl::event_button() != FL_LEFT_MOUSE ) break;
       Fl_Tree_Item *item = _root->find_clicked(_prefs);
       if ( ! item ) break;
+      ret |= 1;
+      if ( ! item->is_active() ) break;		// no change if deactivated
       set_item_focus(item);			// becomes new focus widget
       redraw();
-      ret |= 1;
       // Item's label clicked?
       if ( item->event_on_label(_prefs) && 
 	   (!item->widget() || !Fl::event_inside(item->widget())) &&
@@ -752,8 +758,8 @@
   return(_callback_item);
 }
 
-/// Returns next visible item above (dir==Fl_Up) or below (dir==Fl_Down) the specified \p item.
-/// If \p item is 0, returns first() if \p dir is Fl_Up, or last() if \p dir is FL_Down.
+/// Returns next visible item above (dir==FL_Up) or below (dir==FL_Down) the specified \p item.
+/// If \p item is 0, returns first() if \p dir is FL_Up, or last() if \p dir is FL_Down.
 ///
 /// \param[in] item The item above/below which we'll find the next visible item
 /// \param[in] dir The direction to search. Can be FL_Up or FL_Down.
@@ -773,6 +779,22 @@
   }
 }
 
+/// Returns next activated visible item above (dir==FL_Up) or below (dir==FL_Down) the specified \p item.
+/// If \p item is 0, returns first() if \p dir is FL_Up, or last() if \p dir is FL_Down.
+///
+/// \param[in] item The item above/below which we'll find the next activated visible item
+/// \param[in] dir The direction to search. Can be FL_Up or FL_Down.
+/// \returns The item found, or 0 if there's no activated visible items above/below the specified \p item.
+///
+Fl_Tree_Item *Fl_Tree::next_active_item(Fl_Tree_Item *item, int dir) {
+  while ( (item = next_visible_item(item, dir) ) ) {
+    if ( item->is_active() ) {
+      break;
+    }
+  }
+  return(item);
+}
+
 /// Returns the first item in the tree.
 ///
 /// Use this to walk the tree in the forward direction, eg:
@@ -802,6 +824,17 @@
   return(0);
 }
 
+/// Returns the first activated visible item in the tree.
+/// \returns first active visible item in tree, or 0 if none.
+/// \see first_active(), last_active()
+///
+Fl_Tree_Item* Fl_Tree::first_active() {
+  Fl_Tree_Item *i = first_visible();
+  if ( !i ) return(0);
+  if ( i->is_active() ) return(i);
+  return(next_active_item(i, FL_Up));
+}
+
 /// Return the next item after \p item, or 0 if no more items.
 ///
 /// Use this code to walk the entire tree:
@@ -884,6 +917,17 @@
   return(item);
 }
 
+/// Returns the last activated visible item in the tree.
+/// \returns last active visible item in tree, or 0 if none.
+/// \see first_active(), last_active()
+///
+Fl_Tree_Item* Fl_Tree::last_active() {
+  Fl_Tree_Item *i = last_visible();
+  if ( !i ) return(0);
+  if ( i->is_active() ) return(i);
+  return(next_active_item(i, FL_Down));
+}
+
 /// Returns the first selected item in the tree.
 ///
 /// Use this to walk the tree looking for all the selected items, eg:
