diff -ru xv-3.10a-orig/xvbrowse.c xv-3.10a/xvbrowse.c --- xv-3.10a-orig/xvbrowse.c 2003-11-01 15:28:20.000000000 -0600 +++ xv-3.10a/xvbrowse.c 2003-11-01 16:21:39.000000000 -0600 @@ -211,6 +211,13 @@ } BROWINFO; +/* keep track of last icon visible in each path */ +typedef struct IVIS IVIS; + struct IVIS { IVIS *next; + char *name; + int icon; + }; + static Cursor movecurs, copycurs, delcurs; static BROWINFO binfo[MAXBRWIN]; static Pixmap bfIcons[BF_MAX], trashPix; @@ -300,6 +307,8 @@ static int selmatch PARM((char *, char *)); static int selmatch1 PARM((char *, char *)); +static void recIconVisible PARM((char *, int)); +static void restIconVisible PARM((BROWINFO *)); @@ -1602,6 +1611,10 @@ { int sval, first, numvis; + /* if we know what path we have, remember last visible icon for this path */ + if (br->path) + recIconVisible(br->path, num); + /* if icon #i isn't visible, adjust scrollbar so it *is* */ sval = br->scrl.val; @@ -1653,29 +1666,14 @@ return; } - /***************************************************************/ -static int clickIconWin(br, mx, my, mtime, multi) - BROWINFO *br; - int mx,my,multi; - unsigned long mtime; +static int updateSel(br, sel, multi, mtime) + BROWINFO *br; + int sel, multi; + unsigned long mtime; { - /* returns '-1' normally, returns an index into bfList[] if the user - double-clicks an icon */ - - int i,j, base, num, x,y,ix,iy, rv, sel, cpymode, dodel; - BROWINFO *destBr; - BFIL *bf; - char buf[256], *destFolderName; - - rv = -1; /* default return value */ - if (!br->bfList || !br->bfLen) return rv; - - destBr = br; destFolderName = "."; - - sel = mouseInWhichIcon(br, mx, my); - - dodel = 0; + int i; + BFIL *bf; if (sel == -1) { /* clicked on nothing */ if (!multi) { /* deselect all */ @@ -1732,12 +1730,13 @@ /* see if we've double-clicked something */ - if (sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) { + if (mtime && + sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) { int k; br->lastIconClicked = -1; /* YES */ doubleClick(br, sel); - return rv; + return -1; } else { @@ -1746,9 +1745,36 @@ } } - changedNumLit(br, -1, 0); + return 0; +} + + +/***************************************************************/ +static int clickIconWin(br, mx, my, mtime, multi) + BROWINFO *br; + int mx,my,multi; + unsigned long mtime; +{ + /* returns '-1' normally, returns an index into bfList[] if the user + double-clicks an icon */ + + int i,j, base, num, x,y,ix,iy, sel, cpymode, dodel; + BROWINFO *destBr; + BFIL *bf; + char buf[256], *destFolderName; + + if (!br->bfList || !br->bfLen) return -1; + + destBr = br; destFolderName = "."; + + sel = mouseInWhichIcon(br, mx, my); + dodel = 0; + + recIconVisible(br->path, sel); + if (updateSel(br, sel, multi, mtime)) + return -1; { /* track mouse until button1 is released */ @@ -2104,7 +2130,7 @@ } } /* end of 'tracking' sub-function */ - return rv; + return -1; } /*******************************************/ @@ -2179,6 +2205,7 @@ else { scanDir(br); SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */ + restIconVisible(br); } } @@ -2569,6 +2596,7 @@ else { scanDir(br); SCSetVal(&br->scrl, 0); /* reset to top of window on a chdir */ + restIconVisible(br); } } } @@ -2595,6 +2623,7 @@ XBell(theDisp, 50); } + restIconVisible(br); strcat(br->path, "/"); /* put trailing '/' back on */ return rv; } @@ -4213,6 +4242,7 @@ else { scanDir(br); SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */ + restIconVisible(br); } } @@ -4461,6 +4491,7 @@ for (i=0; inext) { + if (!strcmp(ptr->name, name)) { + ptr->icon = icon; + return; + } + } + + ptr = calloc(sizeof(IVIS), 1); + if (!ptr) + return; + + ptr->name = strdup(name); + + if (!ptr->name) { + free(ptr); + return; + } + + if (!prev) { + icon_vis_list = ptr; + } else { + prev->next = ptr; + } + + ptr->next = NULL; + ptr->icon = icon; +} + +/***************************************************************/ +static void restIconVisible(br) + BROWINFO *br; +{ + IVIS *ptr; + + for (ptr = icon_vis_list; ptr; ptr = ptr->next) { + if (!strcmp(ptr->name, br->path)) { + if (ptr->icon >= 0) { + makeIconVisible(br, ptr->icon); + updateSel(br, ptr->icon, 0, 0); + } + return; + } + } +}