be4311c07e14feb728abc6425ee606ffaa611a58
markd
  Fri Jan 22 06:46:58 2021 -0800
merge with master

diff --git src/hg/hgTracks/snakeTrack.c src/hg/hgTracks/snakeTrack.c
index 8a7bdf5..1e9c9bc 100644
--- src/hg/hgTracks/snakeTrack.c
+++ src/hg/hgTracks/snakeTrack.c
@@ -1111,31 +1111,31 @@
                 if (frac > 1.0)
                     frac = 1.0;
                 red = 255 - 255 * frac;
                 blue = 255 * frac;
             } else {
                 double frac = ((double) targetInsertSize - queryInsertSize) / targetInsertSize;
                 if (frac > 1.0)
                     frac = 1.0;
                 red = 255 - 255 * frac;
                 green = 255 * frac;
             }
             color = hvGfxFindColorIx(hvg, red, green, blue);
         }
         double queryGapNFrac = 0.0;
         double queryGapMaskedFrac = 0.0;
-        if (qs - lastQEnd != 0 && qs - lastQEnd < 1000000) {
+        if ((qs > lastQEnd) && qs - lastQEnd < 1000000) {
             // sketchy
             char *fileName = trackDbSetting(tg->tdb, "bigDataUrl");
             char *otherSpecies = trackDbSetting(tg->tdb, "otherSpecies");
             int handle = halOpenLOD(fileName, NULL);
             char *queryGapDna = halGetDna(handle, otherSpecies, sf->qName, lastQEnd, qs, NULL);
             long long numNs = 0;
             long long numMasked = 0;
             char *i = queryGapDna;
             while (*i != '\0') {
                 if (*i == 'N' || *i == 'n') {
                     numNs++;
                     numMasked++;
                 }
                 if (*i == 'a' || *i == 't' || *i == 'g' || *i == 'c') {
                         numMasked++;
@@ -1342,31 +1342,31 @@
 char *aliasName = chromName;
 if (chromAlias)
    {
        if (differentWord(chromAlias, aliasName))
           aliasName = chromAlias;
    }
 
 boolean isPsl = sameString(tg->tdb->type, "pslSnake");
 
 // if we have a network error we want to put out a message about it
 struct errCatch *errCatch = errCatchNew();
 if (errCatchStart(errCatch))
     {
     char *fileName = trackDbSetting(tg->tdb, "bigDataUrl");
     char *otherSpecies = trackDbSetting(tg->tdb, "otherSpecies");
-    char *errString = "empty";
+    char *errString = "<HAL error message not set>";
     int handle = -1;
     if (!isPsl)
         {
         handle = halOpenLOD(fileName, &errString);
         if (handle < 0)
             {
             errAbort("HAL open error: %s\n", errString);
             goto out;
             }
         }
     boolean isPackOrFull = (tg->visibility == tvFull) || 
 	(tg->visibility == tvPack);
     hal_dup_type_t dupMode =  (isPackOrFull) ? HAL_QUERY_AND_TARGET_DUPS :
 	HAL_QUERY_DUPS;
     hal_seqmode_type_t needSeq = isPackOrFull && (winBaseCount < showSnpWidth) ? HAL_LOD0_SEQUENCE : HAL_NO_SEQUENCE;
@@ -1532,30 +1532,31 @@
 void halSnakeMethods(struct track *tg, struct trackDb *tdb, 
 	int wordCount, char *words[])
 {
 linkedFeaturesMethods(tg);
 tg->canPack = tdb->canPack = TRUE;
 tg->loadItems = halSnakeLoadItems;
 tg->drawItems = snakeDraw;
 tg->mapItemName = lfMapNameFromExtra;
 tg->subType = lfSubChain;
 //tg->extraUiData = (void *) chainCart;
 tg->totalHeight = snakeHeight; 
 tg->drawLeftLabels = halSnakeDrawLeftLabels;
 
 tg->drawItemAt = snakeDrawAt;
 tg->itemHeight = snakeItemHeight;
+tg->nextItemButtonable = FALSE;
 }
 #endif  // USE_HAL
 
 #ifdef NOTNOW
 
 // from here down are routines to support the visualization of chains as snakes
 // this code is currently BROKEN, and may be removed completely in the future
 
 struct cartOptions
     {
     enum chainColorEnum chainColor; /*  ChromColors, ScoreColors, NoColors */
     int scoreFilter ; /* filter chains by score if > 0 */
     };
 
 // mySQL code to read in chains