|
|
1.1 ! root 1: /* display.c - screen display stuff for tree */ ! 2: ! 3: #include <conio.h> ! 4: #include <process.h> ! 5: #include <stdio.h> ! 6: #include <stdlib.h> ! 7: ! 8: #include "ds.h" ! 9: #include "vars.h" ! 10: ! 11: ! 12: /* External routines */ ! 13: ! 14: extern pruneTree (Directory **); ! 15: ! 16: ! 17: /* Local variables */ ! 18: ! 19: static char helpMsg[] = "Press F1 for Help"; ! 20: ! 21: ! 22: /*** getKey - return two-byte key stroke; includes IBM extended ASCII codes ! 23: * ! 24: * ! 25: */ ! 26: unsigned int getKey () ! 27: { ! 28: char c; ! 29: unsigned int key; ! 30: ! 31: if (c = getch()) /* Get character */ ! 32: key = c << 8; /* Make scan code zero */ ! 33: else ! 34: key = getch(); /* Get scan code */ ! 35: } /* getKey */ ! 36: ! 37: ! 38: /*** screenInit - Initialize the screen ! 39: * ! 40: * ! 41: */ ! 42: screenInit () ! 43: { ! 44: struct ModeData TheModeData; /* Mode return data from VIOGETMODE */ ! 45: ! 46: VIOGETMODE ((struct ModeData far *) &TheModeData, VioHandle); ! 47: N_of_Cols = TheModeData.col; ! 48: N_of_Rows = TheModeData.row; ! 49: WINDOW_RIGHT = N_of_Cols - 1; ! 50: WINDOW_BOTTOM = N_of_Rows - 1; ! 51: WINDOW_SIZE = WINDOW_BOTTOM - WINDOW_TOP + 1; ! 52: } /* screenInit */ ! 53: ! 54: ! 55: /*** handleDisplay - display tree and handel user keystrokes ! 56: * ! 57: * ! 58: */ ! 59: handleDisplay (root) ! 60: Directory *root; ! 61: { ! 62: int topRow; ! 63: unsigned int key; ! 64: char tmp[MAX_PATH_LEN]; ! 65: char path[MAX_PATH_LEN]; ! 66: int imageRow; ! 67: Directory *curDir,*lastDir,*p; ! 68: int rc; ! 69: char *commandPath; ! 70: ! 71: LastTopRow = LastRow-WINDOW_SIZE+1; /* Top row when last row displayed */ ! 72: /* at the bottom of the window */ ! 73: if (LastTopRow < 0) ! 74: LastTopRow = 0; ! 75: ! 76: topRow = 0; ! 77: displayWindow (WINDOW_TOP,topRow,WINDOW_SIZE); ! 78: curDir = root->d_child; ! 79: highlightDir (topRow, curDir, color[cursorC]); ! 80: key = 0; ! 81: while (key != exitKey) { ! 82: lastDir = curDir; ! 83: key = getKey(); ! 84: switch (key) { ! 85: case optKey: ! 86: showOption (); ! 87: refreshDisplay (topRow, curDir); ! 88: break; ! 89: case helpKey: ! 90: showHelp (); ! 91: refreshDisplay (topRow, curDir); ! 92: break; ! 93: case enterKey: /* Exec shell */ ! 94: p = curDir; ! 95: path[0] = '\0'; /* Empty path */ ! 96: while (p->d_parent) { /* Process all but root */ ! 97: strcpy (tmp, path); /* Save path so far */ ! 98: strcpy (path,"\\"); /* Put in separator */ ! 99: strcat (path, p->d_name); /* Append directory name */ ! 100: strcat (path, tmp); /* Append rest of path so far */ ! 101: p = p->d_parent; /* Go up to parent */ ! 102: } ! 103: strcpy (tmp, path); /* Save tail of path */ ! 104: strcpy (path, IntRootPath); /* Get root path */ ! 105: strcat (path, tmp); /* Append tail of path */ ! 106: ! 107: if (chdir(path) == -1) /* Change directory failed */ ! 108: pruneTree (&curDir); /* Node is gone, update tree */ ! 109: else { ! 110: commandPath = getenv ("COMSPEC"); /* Get shell path */ ! 111: clearBottomLine (); ! 112: if (commandPath) ! 113: rc = spawnl(P_WAIT,commandPath,"COMMAND",NULL); ! 114: else ! 115: rc = spawnlp(P_WAIT,"COMMAND","COMMAND",NULL); ! 116: if (rc == -1) { /* Exec failed */ ! 117: perror ("\nCouldn't spawn shell"); ! 118: exitError (2); ! 119: } ! 120: clearScreen (); ! 121: } ! 122: refreshDisplay (topRow, curDir); ! 123: break; ! 124: case upKey: /* Go to previous sibling */ ! 125: if (curDir->d_prev) /* Previous sibling exists */ ! 126: curDir = curDir->d_prev; /* Go to previous sibling */ ! 127: break; ! 128: case downKey: /* Go to next sibling */ ! 129: if (curDir->d_next) /* Next sibling exists */ ! 130: curDir = curDir->d_next; /* Go to next sibling */ ! 131: break; ! 132: case leftKey: /* Go to parent */ ! 133: if (curDir->d_parent->d_parent) /* Not top level directory */ ! 134: curDir = curDir->d_parent; /* Go to parent */ ! 135: break; ! 136: case rightKey: /* Go to first child */ ! 137: if (curDir->d_child) /* Child exists */ ! 138: curDir = curDir->d_child; /* Go to child */ ! 139: break; ! 140: default: ! 141: break; ! 142: } /* switch */ ! 143: if (curDir != lastDir) ! 144: adjustWindow (&topRow, curDir, lastDir); ! 145: } /* while */ ! 146: } /* handleDisplay */ ! 147: ! 148: ! 149: /*** clearScreen - blank out the entire screen ! 150: * ! 151: * ! 152: */ ! 153: clearScreen () ! 154: { ! 155: Cell c; ! 156: ! 157: c.ch = ' '; ! 158: c.at = color[blankC]; ! 159: VIOWRTNCELL(cefs(&c), N_of_Rows*N_of_Cols, 0, 0, VioHandle); ! 160: ! 161: } /* clearScreen */ ! 162: ! 163: ! 164: /*** clearBottomLine - Clear the bottom line on the screen ! 165: * ! 166: * ! 167: */ ! 168: clearBottomLine () ! 169: { ! 170: Cell c; ! 171: ! 172: c.ch = ' '; ! 173: c.at = color[blankC]; ! 174: VIOWRTNCELL(cefs(&c), N_of_Cols, N_of_Rows-1,0, VioHandle); ! 175: ! 176: } /* clearBottomLine */ ! 177: ! 178: ! 179: /*** refreshDisplay - Repaint the main screen ! 180: * ! 181: * ! 182: */ ! 183: refreshDisplay (topRow, curDir) ! 184: int topRow; ! 185: Directory *curDir; ! 186: { ! 187: int col; ! 188: char buf[MAX_PATH_LEN]; ! 189: int lStr; ! 190: Cell c; ! 191: Attr a; ! 192: ! 193: c.ch = '['; ! 194: c.at = color[statusC]; ! 195: VIOWRTNCELL(cefs(&c), 1, 0,0, VioHandle); ! 196: ! 197: lStr = strlen(RootPath); ! 198: a = color[nameC]; ! 199: VIOWRTCHARSTRATT (chfs(RootPath), lStr, 0,1, afs(&a), VioHandle); ! 200: ! 201: c.ch = ']'; ! 202: c.at = color[statusC]; ! 203: VIOWRTNCELL(cefs(&c), 1, 0,lStr+1, VioHandle); ! 204: ! 205: lStr = strlen(helpMsg); ! 206: col = N_of_Cols - lStr; ! 207: a = color[statusC]; ! 208: VIOWRTCHARSTRATT (chfs(helpMsg), lStr, 0,col, afs(&a), VioHandle); ! 209: ! 210: if (topRow >= 0) { ! 211: displayWindow (WINDOW_TOP,topRow,WINDOW_SIZE); ! 212: highlightDir (topRow, curDir, color[cursorC]); ! 213: } ! 214: VIOSETCURPOS (N_of_Rows-1, N_of_Cols-1, VioHandle); /* Hide cursor */ ! 215: } ! 216: ! 217: ! 218: /*** adjustWindow - Repaint tree with minimum screen writing ! 219: * ! 220: * ! 221: */ ! 222: adjustWindow (topRow, curDir, lastDir) ! 223: int *topRow; ! 224: Directory *curDir; ! 225: Directory *lastDir; ! 226: { ! 227: int botRow, cRow, lRow; ! 228: ! 229: botRow = *topRow + WINDOW_SIZE - 1; ! 230: cRow = curDir->d_row; ! 231: lRow = lastDir->d_row; ! 232: if ((*topRow <= cRow) && (cRow <= botRow)) { /* Window doesn't move */ ! 233: highlightDir (*topRow, lastDir, color[nameC]); /* Turn off old cursor */ ! 234: highlightDir (*topRow, curDir, color[cursorC]); /* Turn on new cursor */ ! 235: } ! 236: else if ((cRow <= *topRow - WINDOW_SIZE) || ! 237: (botRow + WINDOW_SIZE <= cRow)) { /* Repaint entire window */ ! 238: *topRow = (cRow < LastTopRow) ? cRow : LastTopRow; ! 239: displayWindow (WINDOW_TOP,*topRow,WINDOW_SIZE); ! 240: highlightDir (*topRow, curDir, color[cursorC]); ! 241: } ! 242: else { /* Can do a scroll */ ! 243: if (cRow < lRow) /* Pretend scroll up */ ! 244: *topRow = (cRow < LastTopRow) ? cRow : LastTopRow; ! 245: else { /* Pretend scroll down */ ! 246: cRow = cRow - WINDOW_SIZE + 1; ! 247: *topRow = cRow ? cRow : 0; ! 248: } ! 249: displayWindow (WINDOW_TOP,*topRow,WINDOW_SIZE); ! 250: highlightDir (*topRow, curDir, color[cursorC]); ! 251: } ! 252: } /* adjustWindow */ ! 253: ! 254: ! 255: /*** highlightDir - Highlight the currently selected directory ! 256: * ! 257: * ! 258: */ ! 259: highlightDir (topRow, p, color) ! 260: int topRow; ! 261: Directory *p; ! 262: int color; ! 263: { ! 264: int dLen,cCol,cRow; ! 265: Attr a; ! 266: ! 267: cRow = WINDOW_TOP + p->d_row - topRow; ! 268: cCol = p->d_col; ! 269: ! 270: dLen = strlen(p->d_name); ! 271: a = color; ! 272: VIOWRTNATTR (afs(&a), dLen, cRow, cCol, VioHandle); ! 273: ! 274: } /* highlightDir */ ! 275: ! 276: ! 277: /*** displayWindow - Displaya a portion of the tree in the tree window ! 278: * ! 279: * ! 280: */ ! 281: displayWindow (screenRow,imageRow,count) ! 282: int screenRow,imageRow,count; ! 283: { ! 284: int row; ! 285: Cell c; ! 286: ! 287: while (count-- && (imageRow <= LastRow)) { ! 288: VIOWRTCELLSTR (cefs(DisplayRow[imageRow]), N_of_Cols*sizeof(Cell), ! 289: screenRow,0, VioHandle); ! 290: screenRow++; ! 291: imageRow++; ! 292: } ! 293: c.ch = ' '; ! 294: c.at = color[blankC]; ! 295: for (row=screenRow; row<N_of_Rows; row++) /* Clear remaining lines */ ! 296: VIOWRTNCELL (cefs(&c), N_of_Cols, row,0, VioHandle); ! 297: } /* displayWindow */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.