|
|
1.1 ! root 1: ! 2: /* This file contains code for X-CHESS. ! 3: Copyright (C) 1986 Free Software Foundation, Inc. ! 4: ! 5: This file is part of X-CHESS. ! 6: ! 7: X-CHESS is distributed in the hope that it will be useful, ! 8: but WITHOUT ANY WARRANTY. No author or distributor ! 9: accepts responsibility to anyone for the consequences of using it ! 10: or for whether it serves any particular purpose or works at all, ! 11: unless he says so in writing. Refer to the X-CHESS General Public ! 12: License for full details. ! 13: ! 14: Everyone is granted permission to copy, modify and redistribute ! 15: X-CHESS, but only under the conditions described in the ! 16: X-CHESS General Public License. A copy of this license is ! 17: supposed to have been given to you along with X-CHESS so you ! 18: can know your rights and responsibilities. It should be in a ! 19: file named COPYING. Among other things, the copyright notice ! 20: and this notice must be preserved on all copies. */ ! 21: ! 22: ! 23: /* RCS Info: $Revision: 1.4 $ on $Date: 86/11/26 12:09:47 $ ! 24: * $Source: /users/faustus/xchess/RCS/clock.c,v $ ! 25: * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group ! 26: * Permission is granted to do anything with this code except sell it ! 27: * or remove this message. ! 28: * ! 29: * Do stuff with the clocks. The way things work is as follows. We call ! 30: * clock_init to draw the clocks initially, but they don't actually start ! 31: * running until we call clock_switch for the first time. ! 32: */ ! 33: ! 34: #include "xchess.h" ! 35: ! 36: int movesperunit = 0; ! 37: int timeunit = 0; ! 38: bool clock_started = false; ! 39: int whiteseconds, blackseconds; ! 40: ! 41: static bool white_running = true; ! 42: static long lastwhite, lastblack; ! 43: static bool firstmove = true; ! 44: ! 45: extern void dohands(), hilight(); ! 46: ! 47: #define PI 3.1415926535897932384 ! 48: ! 49: void ! 50: clock_draw(win, col) ! 51: windata *win; ! 52: color col; ! 53: { ! 54: int i; ! 55: char buf[BSIZE]; ! 56: int x = CLOCK_WIDTH / 2, y = CLOCK_WIDTH / 2; ! 57: int xp, yp; ! 58: int rad = CLOCK_WIDTH / 2 - 10; ! 59: Window w = ((col == WHITE) ? win->wclockwin : win->bclockwin); ! 60: ! 61: /* Draw a clock face and the hands. */ ! 62: XCircle(w, x, y, rad, 0.0, 0.0, 1, 1, win->textcolor.pixel, GXcopy, ! 63: AllPlanes); ! 64: rad -= 8; ! 65: ! 66: XSetFont(win->display, DefaultGC(win->display, 0), ! 67: win->small->fid); ! 68: XSetForeground(win->display, DefaultGC(win->display, 0), ! 69: win->textcolor.pixel); ! 70: XSetBackground(win->display, DefaultGC(win->display, 0), ! 71: win->textback.pixel); ! 72: for (i = 1; i <= 12; i++) { ! 73: xp = x + rad * cos(PI * 3 / 2 + i * PI / 6) - 4; ! 74: yp = y + rad * sin(PI * 3 / 2 + i * PI / 6) - 5; ! 75: sprintf(buf, "%d", i); ! 76: XDrawString(win->display, w, DefaultGC(win->display, 0), ! 77: xp, yp, buf, strlen(buf)); ! 78: } ! 79: ! 80: dohands(win, col); ! 81: ! 82: if (white_running) { ! 83: hilight(win, WHITE, true); ! 84: hilight(win, BLACK, false); ! 85: } else { ! 86: hilight(win, WHITE, false); ! 87: hilight(win, BLACK, true); ! 88: } ! 89: return; ! 90: } ! 91: ! 92: void ! 93: clock_init(win, col) ! 94: windata *win; ! 95: color col; ! 96: { ! 97: whiteseconds = blackseconds = 0; ! 98: clock_started = false; ! 99: firstmove = true; ! 100: clock_draw(win, col); ! 101: ! 102: return; ! 103: } ! 104: ! 105: void ! 106: clock_update() ! 107: { ! 108: int now = time((long *) NULL); ! 109: int i; ! 110: ! 111: if (!clock_started) { ! 112: lastwhite = lastblack = now; ! 113: return; ! 114: } ! 115: ! 116: if (white_running) { ! 117: whiteseconds += now - lastwhite; ! 118: lastwhite = now; ! 119: dohands(win1, WHITE); ! 120: if (!oneboard) ! 121: dohands(win2, WHITE); ! 122: if (timeunit) { ! 123: i = whiteseconds / timeunit; ! 124: if ((i > 0) && (whiteseconds > i * timeunit) && ! 125: (whiteseconds < i * timeunit + 10) && ! 126: (movesperunit * i > movenum)) { ! 127: message_add(win1, ! 128: "White has exceeded his time limit\n", ! 129: true); ! 130: if (!oneboard) { ! 131: message_add(win2, ! 132: "White has exceeded his time limit\n", ! 133: true); ! 134: } ! 135: timeunit = 0; ! 136: } ! 137: } ! 138: } else { ! 139: blackseconds += now - lastblack; ! 140: lastblack = now; ! 141: dohands(win1, BLACK); ! 142: if (!oneboard) ! 143: dohands(win2, BLACK); ! 144: if (timeunit) { ! 145: i = blackseconds / timeunit; ! 146: if ((i > 0) && (blackseconds > i * timeunit) && ! 147: (blackseconds < i * timeunit + 10) && ! 148: (movesperunit * i > movenum)) { ! 149: message_add(win1, ! 150: "Black has exceeded his time limit\n", ! 151: true); ! 152: if (!oneboard) { ! 153: message_add(win2, ! 154: "Black has exceeded his time limit\n", ! 155: true); ! 156: } ! 157: timeunit = 0; ! 158: } ! 159: } ! 160: } ! 161: return; ! 162: } ! 163: ! 164: void ! 165: clock_switch() ! 166: { ! 167: if (firstmove) { ! 168: clock_started = true; ! 169: firstmove = false; ! 170: lastwhite = lastblack = time((long *) NULL); ! 171: } ! 172: if (white_running) { ! 173: white_running = false; ! 174: lastblack = time((long *) NULL); ! 175: hilight(win1, WHITE, false); ! 176: hilight(win1, BLACK, true); ! 177: if (!oneboard) { ! 178: hilight(win2, WHITE, false); ! 179: hilight(win2, BLACK, true); ! 180: } ! 181: } else { ! 182: white_running = true; ! 183: lastwhite = time((long *) NULL); ! 184: hilight(win1, WHITE, true); ! 185: hilight(win1, BLACK, false); ! 186: if (!oneboard) { ! 187: hilight(win2, WHITE, true); ! 188: hilight(win2, BLACK, false); ! 189: } ! 190: } ! 191: return; ! 192: } ! 193: ! 194: static void ! 195: dohands(win, col) ! 196: windata *win; ! 197: color col; ! 198: { ! 199: int cx = CLOCK_WIDTH / 2, cy = CLOCK_WIDTH / 2; ! 200: double *h = (col == WHITE) ? win->whitehands : win->blackhands; ! 201: Window w = (col == WHITE) ? win->wclockwin : win->bclockwin; ! 202: long secs = (col == WHITE) ? whiteseconds : blackseconds; ! 203: int rad, x, y, i; ! 204: ! 205: /* First erase the old hands. */ ! 206: XSetState(win->display, DefaultGC(win->display, 0), ! 207: win->textback.pixel, win->textback.pixel, ! 208: GXcopy, AllPlanes); ! 209: ! 210: rad = CLOCK_WIDTH / 2 - 30; ! 211: for (i = 0; i < 3; i++) { ! 212: x = cx + rad * sin(PI - h[i]); ! 213: y = cy + rad * cos(PI - h[i]); ! 214: XSetLineAttributes(win->display, ! 215: DefaultGC(win->display, 0), ! 216: i, LineSolid, 0, 0); ! 217: XDrawLine(win->display, w, DefaultGC(win->display, 0), ! 218: cx, cy, x, y); ! 219: rad -= 8; ! 220: } ! 221: ! 222: h[0] = (secs % 60) * 2 * PI / 60; ! 223: h[1] = ((secs / 60) % 60) * 2 * PI / 60; ! 224: h[2] = ((secs / 3600) % 12) * 2 * PI / 12; ! 225: ! 226: /* Now draw the new ones. */ ! 227: ! 228: XSetState(win->display, DefaultGC(win->display, 0), ! 229: win->textcolor.pixel, win->textback.pixel, ! 230: GXcopy, AllPlanes); ! 231: ! 232: rad = CLOCK_WIDTH / 2 - 30; ! 233: for (i = 0; i < 3; i++) { ! 234: x = cx + rad * sin(PI - h[i]); ! 235: y = cy + rad * cos(PI - h[i]); ! 236: XSetLineAttributes(win->display, ! 237: DefaultGC(win->display, 0), ! 238: i, LineSolid, 0, 0); ! 239: XDrawLine(win->display, w, DefaultGC(win->display, 0), ! 240: cx, cy, x, y); ! 241: rad -= 8; ! 242: } ! 243: XFlush(win->display); ! 244: return; ! 245: } ! 246: ! 247: static void ! 248: hilight(win, col, on) ! 249: windata *win; ! 250: color col; ! 251: bool on; ! 252: { ! 253: Window w = (col == WHITE) ? win->wclockwin : win->bclockwin; ! 254: char *s = (col == WHITE) ? " WHITE " : " BLACK "; ! 255: int x; ! 256: ! 257: ! 258: x = XTextWidth(win->large, s, strlen(s)); ! 259: if (on) ! 260: XSetState(win->display, DefaultGC(win->display, 0), ! 261: win->textback.pixel, ! 262: win->textcolor.pixel, ! 263: GXcopy, ! 264: AllPlanes); ! 265: else ! 266: XSetState(win->display, DefaultGC(win->display, 0), ! 267: win->textcolor.pixel, ! 268: win->textback.pixel, ! 269: GXcopy, AllPlanes); ! 270: ! 271: XSetLineAttributes(win->display, DefaultGC(win->display, 0), ! 272: BORDER_WIDTH, LineSolid, CapButt, JoinMiter); ! 273: XSetFont(win->display, DefaultGC(win->display, 0), ! 274: win->large->fid); ! 275: ! 276: XDrawLine(win->display, w, DefaultGC(win->display, 0), ! 277: 0, CLOCK_HEIGHT - 26, ! 278: CLOCK_WIDTH, CLOCK_HEIGHT - 26); ! 279: ! 280: XDrawImageString(win->display, w, DefaultGC(win->display, 0), ! 281: (CLOCK_WIDTH - x) / 2, CLOCK_HEIGHT, ! 282: s, strlen(s)); ! 283: ! 284: if (on) ! 285: XSetState(win->display, DefaultGC(win->display, 0), ! 286: win->textcolor.pixel, ! 287: win->textback.pixel, ! 288: GXcopy, AllPlanes); ! 289: return; ! 290: } ! 291:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.