/* ------- display a window's border ----- */ void RepaintBorder(WINDOW wnd, RECT *rcc) { int y; int lin, side, ne, nw, se, sw; RECT rc, clrc; if (!TestAttribute(wnd, HASBORDER)) return; if (rcc == NULL) { rc = SetRect(0, 0, WindowWidth(wnd)-1, WindowHeight(wnd)-1); if (TestAttribute(wnd, SHADOW)) { rc.rt++; rc.bt++; } } else rc = *rcc; clrc = rc; /* -------- adjust the client rectangle ------- */ if (RectLeft(rc) == 0) --clrc.rt; else --clrc.lf; if (RectTop(rc) == 0) --clrc.bt; else --clrc.tp; RectRight(clrc) = min(RectRight(clrc), WindowWidth(wnd)-3); RectBottom(clrc) = min(RectBottom(clrc), WindowHeight(wnd)-3); if (wnd == inFocus) { lin = FOCUS_LINE; side = FOCUS_SIDE; ne = FOCUS_NE; nw = FOCUS_NW; se = FOCUS_SE; sw = FOCUS_SW; } else { lin = LINE; side = SIDE; ne = NE; nw = NW; se = SE; sw = SW; } line[WindowWidth(wnd)] = '\0'; /* ---------- window title ------------ */ if (RectTop(rc) == 0) if (RectLeft(rc) < WindowWidth(wnd)) if (TestAttribute(wnd, TITLEBAR)) DisplayTitle(wnd, clrc); foreground = FrameForeground(wnd); background = FrameBackground(wnd); /* -------- top frame corners --------- */ if (RectTop(rc) == 0) { if (RectLeft(rc) == 0) PutWindowChar(wnd, -1, -1, nw); if (RectLeft(rc) < RectRight(rc)) { if (RectRight(rc) >= WindowWidth(wnd)-1) PutWindowChar(wnd, WindowWidth(wnd)-2, -1, ne); if (TestAttribute(wnd, TITLEBAR) == 0) { /* ----------- top line ------------- */ memset(line,lin,WindowWidth(wnd)-1); line[RectRight(clrc)+1] = '\0'; if (strlen(line+RectLeft(clrc)) > 1 || TestAttribute(wnd, SHADOW) == 0) writeline(wnd, line+RectLeft(clrc), RectLeft(clrc), -1, FALSE); } } } /* ----------- window body ------------ */ for (y = 0; y < ClientHeight(wnd); y++) { int ch; if (y >= RectTop(clrc) && y <= RectBottom(clrc)) { if (RectLeft(rc) == 0) PutWindowChar(wnd, -1, y, side); if (RectLeft(rc) < RectRight(rc)) { if (RectRight(rc) >= ClientWidth(wnd)) { if (TestAttribute(wnd, VSCROLLBAR)) ch = ( y == 0 ? UPSCROLLBOX : y == WindowHeight(wnd)-3 ? DOWNSCROLLBOX : y == wnd->VScrollBox ? SCROLLBOXCHAR : SCROLLBARCHAR ); else ch = side; PutWindowChar(wnd, WindowWidth(wnd)-2,y,ch); } } if (RectRight(rc) == WindowWidth(wnd)) shadow_char(wnd, y); } } if (RectTop(rc) < RectBottom(rc) && RectBottom(rc) >= WindowHeight(wnd)-1) { /* -------- bottom frame corners ---------- */ if (RectLeft(rc) == 0) PutWindowChar(wnd, -1, WindowHeight(wnd)-2, sw); if (RectRight(rc) >= WindowWidth(wnd)-1) PutWindowChar(wnd, WindowWidth(wnd)-2, WindowHeight(wnd)-2, se); /* ----------- bottom line ------------- */ memset(line,lin,WindowWidth(wnd)-1); if (TestAttribute(wnd, HSCROLLBAR)) { line[0] = LEFTSCROLLBOX; line[WindowWidth(wnd)-3] = RIGHTSCROLLBOX; memset(line+1, SCROLLBARCHAR, WindowWidth(wnd)-4); line[wnd->HScrollBox] = SCROLLBOXCHAR; } line[RectRight(clrc)+1] = '\0'; if (strlen(line+RectLeft(clrc)) > 1 || TestAttribute(wnd, SHADOW) == 0) writeline(wnd, line+RectLeft(clrc), RectLeft(clrc), WindowHeight(wnd)-2, FALSE); if (RectRight(rc) == WindowWidth(wnd)) shadow_char(wnd, WindowHeight(wnd)-2); } if (RectBottom(rc) == WindowHeight(wnd)) /* ---------- bottom shadow ------------- */ shadowline(wnd, clrc); }