cf4ff9e5e58ef209a24d110e3f4daf120f0ccf8a
braney
  Mon Jan 23 17:35:01 2012 -0800
always step up through the ancestors when looking for track handlers (#6499)
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 67f5991..d89ecb9 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -12538,72 +12538,56 @@
 struct track *subtrack = NULL;
 TrackHandler handler;
 boolean smart = FALSE;
 
 /* ignore if no subtracks */
 if (!subCount)
     return;
 
 char *compositeTrack = trackDbLocalSetting(tdb, "compositeTrack");
 /* look out for tracks that manage their own subtracks */
 if (startsWith("wig", tdb->type) || startsWith("bedGraph", tdb->type) ||
     (compositeTrack != NULL && rStringIn("smart", compositeTrack)))
         smart = TRUE;
 
 /* setup function handlers for composite track */
-handler = lookupTrackHandler(tdb->table);
+handler = lookupTrackHandlerClosestToHome(tdb);
 if (smart && handler != NULL)
     /* handles it's own load and height */
     handler(track);
 else
     {
     track->loadItems = compositeLoad;
     track->totalHeight = compositeTotalHeight;
     }
 
 if (altColors && (finalR || finalG || finalB))
     {
     /* not black -- make a color gradient for the subtracks,
                 from black, to the specified color */
     deltaR = (finalR - altR) / altColors;
     deltaG = (finalG - altG) / altColors;
     deltaB = (finalB - altB) / altColors;
     }
 
 /* fill in subtracks of composite track */
 for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
     {
     subTdb = tdbRef->val;
 
-    /* Initialize from composite track settings */
-    if (trackDbSettingClosestToHome(subTdb, "noInherit") == NULL)
-	{
-	/* install parent's track handler */
-	/* TODO JK - rework.  The gencode tracks currently depend on this, wgEncodeGencode in particular,
-	 * but it seems very dangerous in general.  What if the subtracks already have their own handler?
-	 * Waiting to fix until after viewInTheMiddle branch merge since preferred fix involves
-	 * edits to trackDb.ra files - that is putting in an explicit setting when you want
-	 * this behavior rather than relying on absence of an overloaded setting. */
-	subtrack = trackFromTrackDb(tdb);
-	subtrack->tdb = subTdb;
-	handler = lookupTrackHandler(tdb->table);
-	}
-    else
-	{
 	subtrack = trackFromTrackDb(subTdb);
-	handler = lookupTrackHandler(subTdb->table);
-	}
+    handler = lookupTrackHandlerClosestToHome(subTdb);
     if (handler != NULL)
         handler(subtrack);
 
     /* Add subtrack settings (table, colors, labels, vis & pri).  This is only
      * needed in the "not noInherit" case that hopefully will go away soon. */
     subtrack->track = subTdb->track;
     subtrack->table = subTdb->table;
     subtrack->shortLabel = subTdb->shortLabel;
     subtrack->longLabel = subTdb->longLabel;
     subtrack->priority = subTdb->priority;
     subtrack->parent = track;
 
     /* Add color gradient. */
     if (finalR || finalG || finalB)
 	{
@@ -12737,38 +12721,54 @@
     handlerHash = newHash(6);
 if (hashLookup(handlerHash, name))
     warn("handler duplicated for track %s", name);
 else
     hashAdd(handlerHash, name, handler);
 }
 
 #define registerTrackHandlerOnFamily(name, handler) registerTrackHandler(name, handler)
 // Marker to show that are actually registering subtracks as well.  I'd like to redo
 // this system a little.  It seems dangerous now.  There's no way to know in the .ra
 // file that there is a handler,  and as composite tracks start to allow multiple types
 // of subtracks,  the handler of the parent will still override _all_ of the children.
 // If parents and children put in different handlers, there's no way to know which one
 // the child will get.
 
-TrackHandler lookupTrackHandler(char *name)
+static TrackHandler lookupTrackHandler(char *name)
 /* Lookup handler for track of give name.  Return NULL if none. */
 {
 if (handlerHash == NULL)
     return NULL;
 return hashFindVal(handlerHash, name);
 }
 
+TrackHandler lookupTrackHandlerClosestToHome(struct trackDb *tdb)
+/* Lookup handler for track of give name.  Try parents if
+ * subtrack has a NULL handler.  Return NULL if none. */
+{
+TrackHandler handler = lookupTrackHandler(tdb->table);
+
+// while handler is NULL and we have a parent, use the parent's handler
+for( ; (handler == NULL) && (tdb->parent != NULL);  )
+    {
+    tdb = tdb->parent;
+    handler = lookupTrackHandler(tdb->table);
+    }
+
+return handler;
+}
+
 void registerTrackHandlers()
 /* Register tracks that include some non-standard methods. */
 {
 #ifndef GBROWSE
 registerTrackHandler("rgdGene", rgdGeneMethods);
 registerTrackHandler("cgapSage", cgapSageMethods);
 registerTrackHandler("cytoBand", cytoBandMethods);
 registerTrackHandler("cytoBandIdeo", cytoBandIdeoMethods);
 registerTrackHandler("bacEndPairs", bacEndPairsMethods);
 registerTrackHandler("bacEndPairsBad", bacEndPairsBadMethods);
 registerTrackHandler("bacEndPairsLong", bacEndPairsLongMethods);
 registerTrackHandler("bacEndSingles", bacEndSinglesMethods);
 registerTrackHandler("fosEndPairs", fosEndPairsMethods);
 registerTrackHandler("fosEndPairsBad", fosEndPairsBadMethods);
 registerTrackHandler("fosEndPairsLong", fosEndPairsLongMethods);