4abb8b25cdc147ee22fb88f20ee7bf5e98962a41 angie Wed Sep 2 16:18:21 2015 -0700 Look for trackDbSetting "trackHandler" in lookupTrackHandler instead of looking it up at the end of lookupTrackHandlerClosestToHome after modifying tdb. That was losing child trackHandler settings. diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index d4ec2d0..32d076e 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -13176,63 +13176,63 @@ 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. -static TrackHandler lookupTrackHandler(char *name) +static TrackHandler lookupTrackHandler(struct trackDb *tdb) /* Lookup handler for track of give name. Return NULL if none. */ { if (handlerHash == NULL) return NULL; -return hashFindVal(handlerHash, name); +TrackHandler handler = hashFindVal(handlerHash, tdb->table); +// if nothing found, try the "trackHandler" statement +if (handler == NULL) + { + char *handlerName = trackDbSetting(tdb, "trackHandler"); + if (handlerName != NULL) + { + handler = hashFindVal(handlerHash, handlerName); + if (handler==NULL) + errAbort("track %s defined a trackHandler '%s' in trackDb which does not exist", + tdb->track, handlerName); + } + } +return handler; } 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); +TrackHandler handler = lookupTrackHandler(tdb); // 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); + handler = lookupTrackHandler(tdb); } - -// if nothing found, try the "trackHandler" statement -if (handler == NULL) - { - char *handlerName = trackDbSetting(tdb, "trackHandler"); - if (handlerName != NULL) - { - handler = lookupTrackHandler(handlerName); - if (handler==NULL) - errAbort("track %s defined a trackHandler in trackDb which does not exist", tdb->track); - } - } - 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", bacEndPairsMethods); registerTrackHandler("bacEndPairsLong", bacEndPairsMethods);