4 * Manage borders by using alternate character set.
6 * Copyright (c) 1995 Christian Werner
8 * See the file "license.terms" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
16 * Variables used in this module.
19 static Tcl_HashTable gCharTable; /* Maps gChar names to values. */
20 static int initialized = 0; /* gCharTable initialized. */
24 *------------------------------------------------------------------------
28 * Return curses ACS character given string.
30 *------------------------------------------------------------------------
34 Ck_GetGChar(interp, name, gchar)
44 Tcl_InitHashTable(&gCharTable, TCL_STRING_KEYS);
45 hPtr = Tcl_CreateHashEntry(&gCharTable, "ulcorner", &new);
46 Tcl_SetHashValue(hPtr, (ClientData) ACS_ULCORNER);
47 hPtr = Tcl_CreateHashEntry(&gCharTable, "urcorner", &new);
48 Tcl_SetHashValue(hPtr, (ClientData) ACS_URCORNER);
49 hPtr = Tcl_CreateHashEntry(&gCharTable, "llcorner", &new);
50 Tcl_SetHashValue(hPtr, (ClientData) ACS_LLCORNER);
51 hPtr = Tcl_CreateHashEntry(&gCharTable, "lrcorner", &new);
52 Tcl_SetHashValue(hPtr, (ClientData) ACS_LRCORNER);
53 hPtr = Tcl_CreateHashEntry(&gCharTable, "rtee", &new);
54 Tcl_SetHashValue(hPtr, (ClientData) ACS_RTEE);
55 hPtr = Tcl_CreateHashEntry(&gCharTable, "ltee", &new);
56 Tcl_SetHashValue(hPtr, (ClientData) ACS_LTEE);
57 hPtr = Tcl_CreateHashEntry(&gCharTable, "btee", &new);
58 Tcl_SetHashValue(hPtr, (ClientData) ACS_BTEE);
59 hPtr = Tcl_CreateHashEntry(&gCharTable, "ttee", &new);
60 Tcl_SetHashValue(hPtr, (ClientData) ACS_TTEE);
61 hPtr = Tcl_CreateHashEntry(&gCharTable, "hline", &new);
62 Tcl_SetHashValue(hPtr, (ClientData) ACS_HLINE);
63 hPtr = Tcl_CreateHashEntry(&gCharTable, "vline", &new);
64 Tcl_SetHashValue(hPtr, (ClientData) ACS_VLINE);
65 hPtr = Tcl_CreateHashEntry(&gCharTable, "plus", &new);
66 Tcl_SetHashValue(hPtr, (ClientData) ACS_PLUS);
67 hPtr = Tcl_CreateHashEntry(&gCharTable, "s1", &new);
68 Tcl_SetHashValue(hPtr, (ClientData) ACS_S1);
69 hPtr = Tcl_CreateHashEntry(&gCharTable, "s9", &new);
70 Tcl_SetHashValue(hPtr, (ClientData) ACS_S9);
71 hPtr = Tcl_CreateHashEntry(&gCharTable, "diamond", &new);
72 Tcl_SetHashValue(hPtr, (ClientData) ACS_DIAMOND);
73 hPtr = Tcl_CreateHashEntry(&gCharTable, "ckboard", &new);
74 Tcl_SetHashValue(hPtr, (ClientData) ACS_CKBOARD);
75 hPtr = Tcl_CreateHashEntry(&gCharTable, "degree", &new);
76 Tcl_SetHashValue(hPtr, (ClientData) ACS_DEGREE);
77 hPtr = Tcl_CreateHashEntry(&gCharTable, "plminus", &new);
78 Tcl_SetHashValue(hPtr, (ClientData) ACS_PLMINUS);
79 hPtr = Tcl_CreateHashEntry(&gCharTable, "bullet", &new);
80 Tcl_SetHashValue(hPtr, (ClientData) ACS_BULLET);
81 hPtr = Tcl_CreateHashEntry(&gCharTable, "larrow", &new);
82 Tcl_SetHashValue(hPtr, (ClientData) ACS_LARROW);
83 hPtr = Tcl_CreateHashEntry(&gCharTable, "rarrow", &new);
84 Tcl_SetHashValue(hPtr, (ClientData) ACS_RARROW);
85 hPtr = Tcl_CreateHashEntry(&gCharTable, "darrow", &new);
86 Tcl_SetHashValue(hPtr, (ClientData) ACS_DARROW);
87 hPtr = Tcl_CreateHashEntry(&gCharTable, "uarrow", &new);
88 Tcl_SetHashValue(hPtr, (ClientData) ACS_UARROW);
89 hPtr = Tcl_CreateHashEntry(&gCharTable, "board", &new);
90 Tcl_SetHashValue(hPtr, (ClientData) ACS_BOARD);
91 hPtr = Tcl_CreateHashEntry(&gCharTable, "lantern", &new);
92 Tcl_SetHashValue(hPtr, (ClientData) ACS_LANTERN);
93 hPtr = Tcl_CreateHashEntry(&gCharTable, "block", &new);
94 Tcl_SetHashValue(hPtr, (ClientData) ACS_BLOCK);
99 hPtr = Tcl_FindHashEntry(&gCharTable, name);
102 Tcl_AppendResult(interp,
103 "bad gchar \"", name, "\"", (char *) NULL);
107 *gchar = (int) Tcl_GetHashValue(hPtr);
112 *------------------------------------------------------------------------
116 * Modify ACS mapping.
118 *------------------------------------------------------------------------
122 Ck_SetGChar(interp, name, gchar)
130 Ck_GetGChar(interp, "ulcorner", NULL);
131 hPtr = Tcl_FindHashEntry(&gCharTable, name);
133 Tcl_AppendResult(interp, "bad gchar \"", name, "\"", (char *) NULL);
136 Tcl_SetHashValue(hPtr, (ClientData) gchar);
141 *------------------------------------------------------------------------
145 * Create border from string.
147 *------------------------------------------------------------------------
151 Ck_GetBorder(interp, string)
155 int i, largc, bchar[8];
159 if (Tcl_SplitList(interp, string, &largc, &largv) != TCL_OK)
161 if (largc != 1 && largc != 3 && largc != 6 && largc != 8) {
162 ckfree((char *) largv);
163 Tcl_AppendResult(interp, "illegal number of box characters",
167 for (i = 0; i < sizeof (bchar) / sizeof (bchar[0]); i++)
169 for (i = 0; i < largc; i++) {
170 if (strlen(largv[i]) == 1)
171 bchar[i] = (unsigned char) largv[i][0];
172 else if (Ck_GetGChar(interp, largv[i], &bchar[i]) != TCL_OK) {
173 ckfree((char *) largv);
178 for (i = 1; i < sizeof (bchar) / sizeof (bchar[0]); i++)
180 } else if (largc == 3) {
181 bchar[3] = bchar[7] = bchar[2];
182 bchar[2] = bchar[4] = bchar[6] = bchar[0];
184 } else if (largc == 6) {
189 ckfree((char *) largv);
190 borderPtr = (CkBorder *) ckalloc(sizeof (CkBorder));
191 memset(borderPtr, 0, sizeof (CkBorder));
192 for (i = 0; i < 8; i++)
193 borderPtr->gchar[i] = bchar[i];
194 borderPtr->name = ckalloc(strlen(string) + 1);
195 strcpy(borderPtr->name, string);
200 *------------------------------------------------------------------------
204 * Release memory related to border.
206 *------------------------------------------------------------------------
210 Ck_FreeBorder(borderPtr)
213 ckfree(borderPtr->name);
214 ckfree((char *) borderPtr);
218 *------------------------------------------------------------------------
222 * Create border from string.
224 *------------------------------------------------------------------------
228 Ck_NameOfBorder(borderPtr)
231 return borderPtr->name;
235 *------------------------------------------------------------------------
239 * Given window, border and bounding box, draw border.
241 *------------------------------------------------------------------------
245 Ck_DrawBorder(winPtr, borderPtr, x, y, width, height)
248 int x, y, width, height;
253 if (winPtr->window == NULL)
256 gchar = borderPtr->gchar;
257 if (width < 1 || height < 1)
260 for (i = y; i < height + y; i++)
261 mvwaddch(w, i, x, gchar[3]);
265 for (i = x; i < width + x; i++)
266 mvwaddch(w, y, i, gchar[1]);
270 mvwaddch(w, y, x, gchar[0]);
271 mvwaddch(w, y, x + 1, gchar[2]);
272 for (i = y + 1; i < height - 1 + y; i++)
273 mvwaddch(w, i, x, gchar[7]);
274 for (i = y + 1; i < height - 1 + y; i++)
275 mvwaddch(w, i, x + 1, gchar[3]);
276 mvwaddch(w, height - 1 + y, x, gchar[6]);
277 mvwaddch(w, height - 1 + y, x + 1, gchar[4]);
281 mvwaddch(w, y, x, gchar[0]);
282 mvwaddch(w, y + 1, x, gchar[6]);
283 for (i = x + 1; i < width - 1 + x; i++)
284 mvwaddch(w, y, i, gchar[1]);
285 for (i = x + 1; i < width - 1 + x; i++)
286 mvwaddch(w, y + 1, i, gchar[5]);
287 mvwaddch(w, y, width - 1 + x, gchar[2]);
288 mvwaddch(w, y + 1, width - 1 + x, gchar[4]);
291 mvwaddch(w, y, x, gchar[0]);
292 for (i = x + 1; i < width - 1 + x; i++)
293 mvwaddch(w, y, i, gchar[1]);
294 mvwaddch(w, y, width - 1 + x, gchar[2]);
295 for (i = y + 1; i < height - 1 + y; i++)
296 mvwaddch(w, i, width - 1 + x, gchar[3]);
297 mvwaddch(w, height - 1 + y, width - 1 + x, gchar[4]);
298 for (i = x + 1; i < width - 1 + x; i++)
299 mvwaddch(w, height - 1 + y, i, gchar[5]);
300 mvwaddch(w, height - 1 + y, x, gchar[6]);
301 for (i = y + 1; i < height - 1 + y; i++)
302 mvwaddch(w, i, x, gchar[7]);