|
|
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:41 $ ! 24: * $Source: /users/faustus/xchess/RCS/button.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 buttons. ! 30: * The configuration we're using is: Draw Back Pause ! 31: * Resign Fwd Flip ! 32: * Reset Save Easy (Switch) ! 33: */ ! 34: ! 35: #include "xchess.h" ! 36: ! 37: typedef enum choice { NOCHOICE, DRAW, RESIGN, REPLAY, SWITCH, FORE, SAVE, ! 38: STOP, FLIP, RESTART, EASY } choice; ! 39: ! 40: static struct but { ! 41: char *label; ! 42: int x, y; ! 43: int width, height; ! 44: choice which; ! 45: } buts[] = { ! 46: { "Draw", 0, 20, 108, 29, DRAW } , ! 47: { "Back", 109, 20, 108, 29, REPLAY } , ! 48: { "Pause", 219, 20, 108, 29, STOP } , ! 49: { "Resign", 0, 50, 108, 29, RESIGN } , ! 50: { "Fwd", 109, 50, 108, 29, FORE } , ! 51: { "Flip", 219, 50, 108, 29, FLIP } , ! 52: { "Reset", 0, 80, 108, 29, RESTART } , ! 53: { "Save", 109, 80, 108, 29, SAVE } , ! 54: #define EASY_OFFSET 8 ! 55: { "Switch", 219, 80, 108, 29, SWITCH } ! 56: /* { "NoEasy", 219, 80, 108, 29, EASY }*/ ! 57: } ; ! 58: static int easy = 1; ! 59: ! 60: void ! 61: button_draw(win) ! 62: windata *win; ! 63: { ! 64: int i, x, numbuts = sizeof (buts) / sizeof (struct but); ! 65: ! 66: XSetState(win->display, DefaultGC(win->display, 0), ! 67: win->border.pixel, WhitePixel(win->display, 0), ! 68: GXcopy, AllPlanes); ! 69: XSetLineAttributes(win->display, DefaultGC(win->display, 0), ! 70: BORDER_WIDTH, LineSolid, CapButt, ! 71: JoinMiter); ! 72: ! 73: XDrawLine(win->display, win->buttonwin, ! 74: DefaultGC(win->display, 0), ! 75: 0, 29, BUTTON_WIDTH, 29); ! 76: XDrawLine(win->display, win->buttonwin, ! 77: DefaultGC(win->display, 0), ! 78: 0, 60, BUTTON_WIDTH, 60); ! 79: XDrawLine(win->display, win->buttonwin, ! 80: DefaultGC(win->display, 0), ! 81: 108, 0, 108, BUTTON_HEIGHT); ! 82: XDrawLine(win->display, win->buttonwin, ! 83: DefaultGC(win->display, 0), ! 84: 219, 0, 219, BUTTON_HEIGHT); ! 85: ! 86: XSetFont(win->display, DefaultGC(win->display, 0), win->large->fid); ! 87: XSetForeground(win->display, DefaultGC(win->display, 0), ! 88: win->textcolor.pixel); ! 89: XSetBackground(win->display, DefaultGC(win->display, 0), ! 90: win->textback.pixel); ! 91: ! 92: for (i = 0; i < numbuts; i++) { ! 93: x = (buts[i].width - ! 94: XTextWidth(win->large, buts[i].label, ! 95: strlen(buts[i].label))) / 2; ! 96: ! 97: XDrawImageString(win->display, win->buttonwin, ! 98: DefaultGC(win->display, 0), ! 99: buts[i].x + x, buts[i].y, buts[i].label, ! 100: strlen(buts[i].label)); ! 101: } ! 102: return; ! 103: } ! 104: ! 105: void ! 106: button_service(win, event) ! 107: windata *win; ! 108: XEvent *event; ! 109: { ! 110: XKeyEvent *ev = &event->xkey; ! 111: choice c; ! 112: int i, numbuts = sizeof (buts) / sizeof (struct but); ! 113: char *s; ! 114: ! 115: ev->y += 15; ! 116: for (i = 0; i < numbuts; i++) ! 117: if ((ev->x >= buts[i].x) && (ev->x <= buts[i].x + ! 118: buts[i].width) && (ev->y >= buts[i].y) && ! 119: (ev->y <= buts[i].y + buts[i].height)) { ! 120: c = buts[i].which; ! 121: break; ! 122: } ! 123: if ((i == numbuts) || (c == NOCHOICE)) { ! 124: message_add(win, "Bad choice.\n", true); ! 125: return; ! 126: } ! 127: ! 128: if (loading_flag && (c != STOP)) { ! 129: message_add(win, "You can only use PAUSE now\n", true); ! 130: return; ! 131: } ! 132: ! 133: switch (c) { ! 134: case DRAW: ! 135: if (!oneboard) { ! 136: message_add(win, "Just a sec...\n", false); ! 137: if (!pop_question(((win == win1) ? win2 : win1), ! 138: "The other player wants\nto call the game a draw.\nDo you agree?\n")) { ! 139: message_add(win, ! 140: "The other player declines the draw\n", false); ! 141: return; ! 142: } ! 143: } ! 144: message_add(win1, "Draw agreed.\n", false); ! 145: if (!oneboard) ! 146: message_add(win2, "Draw agreed.\n", false); ! 147: cleanup("Draw agreed."); ! 148: break; ! 149: ! 150: case RESIGN: ! 151: if (!pop_question(win, "Are you sure\nyou want to resign?")) ! 152: return; ! 153: if ((oneboard && !progflag) || (nexttomove == win->color)) { ! 154: if (nexttomove == WHITE) ! 155: s = "White resigns."; ! 156: else ! 157: s = "Black resigns."; ! 158: if (oneboard) { ! 159: message_add(win, s, false); ! 160: message_add(win, "\n", false); ! 161: } else { ! 162: message_add(win1, s, false); ! 163: message_add(win, "\n", false); ! 164: message_add(win2, s, false); ! 165: message_add(win, "\n", false); ! 166: } ! 167: sleep(5); ! 168: cleanup(s); ! 169: } else { ! 170: message_add(win, "It's not your turn.\n", true); ! 171: } ! 172: break; ! 173: ! 174: case REPLAY: ! 175: if (!oneboard) { ! 176: message_add(win, "Just a sec...\n", false); ! 177: if (!pop_question(((win == win1) ? win2 : win1), ! 178: "The other player wants\nto take back his last move.\nDo you let him?\n")) { ! 179: message_add(win, ! 180: "The other player refuses...\n", false); ! 181: return; ! 182: } ! 183: } ! 184: if (!moves) { ! 185: message_add(win, "Can't back up...\n", true); ! 186: break; ! 187: } ! 188: message_add(win1, "Replaying...\n", false); ! 189: if (!oneboard) ! 190: message_add(win2, "Replaying...\n", false); ! 191: replay(); ! 192: if (progflag) ! 193: replay(); ! 194: break; ! 195: ! 196: case FORE: ! 197: if (!oneboard) { ! 198: message_add(win, "Just a sec...\n", false); ! 199: if (!pop_question(((win == win1) ? win2 : win1), ! 200: "The other player wants\nto do a 'fore'.\nIs that ok with you?\n")) { ! 201: message_add(win, ! 202: "The other player refuses...\n", false); ! 203: return; ! 204: } ! 205: } ! 206: if (!foremoves) { ! 207: message_add(win, "Can't go forward...\n", true); ! 208: break; ! 209: } ! 210: message_add(win1, "Moving forward...\n", false); ! 211: if (!oneboard) ! 212: message_add(win2, "Moving forward...\n", false); ! 213: forward(); ! 214: break; ! 215: ! 216: case SWITCH: ! 217: message_add(win, "You can't switch yet.\n", false); ! 218: break; ! 219: ! 220: case SAVE: ! 221: if (saveflag) { ! 222: message_add(win, ! 223: "Game is already being logged in file '", true); ! 224: message_add(win, record_file, true); ! 225: message_add(win, "'.\n", true); ! 226: } else { ! 227: message_add(win, "Saving game to file '", false); ! 228: message_add(win, record_file, false); ! 229: message_add(win, "'.\n", false); ! 230: record_save(); ! 231: } ! 232: break; ! 233: ! 234: case STOP: ! 235: if (loading_flag) { ! 236: loading_paused = (loading_paused ? false : true); ! 237: message_add(win, loading_paused ? ! 238: "Stopped.\nHit 'Pause' again to restart.\n" : ! 239: "Restarted.\n", false); ! 240: } else if (clock_started) { ! 241: if (!oneboard) { ! 242: message_add(win, "Just a sec...\n", false); ! 243: if (!pop_question(((win == win1) ? win2 : win1), ! 244: "The other player wants\nto stop the clock.\nDo you let him?\n")) { ! 245: message_add(win, ! 246: "The other player refuses to pause.\n", ! 247: false); ! 248: return; ! 249: } ! 250: } ! 251: message_add(win1, ! 252: "Clock stopped.\nHit 'Pause' again to restart.\n", ! 253: false); ! 254: if (!oneboard) ! 255: message_add(win2, ! 256: "Clock stopped.\nHit 'Pause' again to restart.\n", ! 257: false); ! 258: clock_started = false; ! 259: } else { ! 260: if (!oneboard) { ! 261: message_add(win, "Just a sec...\n", false); ! 262: if (!pop_question(((win == win1) ? win2 : win1), ! 263: "The other player wants\nto start the clock again.\nIs that ok?\n")) { ! 264: message_add(win, ! 265: "The other player refuses to resume.\n", ! 266: false); ! 267: return; ! 268: } ! 269: } ! 270: message_add(win1, "Clock restarted.\n", false); ! 271: if (!oneboard) ! 272: message_add(win2, "Clock restarted.\n", false); ! 273: clock_started = true; ! 274: } ! 275: break; ! 276: ! 277: case FLIP: ! 278: message_add(win, "Flipping window...\n", false); ! 279: win->flipped = win->flipped ? false : true; ! 280: win_redraw(win, (XEvent *) NULL); ! 281: break; ! 282: ! 283: case RESTART: ! 284: if (!oneboard) { ! 285: message_add(win, "Just a sec...\n", false); ! 286: if (!pop_question(((win == win1) ? win2 : win1), ! 287: "The other player wants\nto restart the game.\nDo you agree?\n")) { ! 288: message_add(win, ! 289: "The other player refuses to reset\n", false); ! 290: return; ! 291: } ! 292: } ! 293: message_add(win, "Restarting game.\n", false); ! 294: restart(); ! 295: break; ! 296: case EASY: ! 297: if (oneboard) { ! 298: int x; ! 299: if (easy) ! 300: easy = 0; ! 301: else ! 302: easy = 1; ! 303: ! 304: if (easy) ! 305: buts[EASY_OFFSET].label = " Easy "; ! 306: else ! 307: buts[EASY_OFFSET].label = "NoEasy"; ! 308: ! 309: program_easy(easy); ! 310: ! 311: x = (buts[EASY_OFFSET].width - ! 312: XTextWidth(win->large, ! 313: buts[EASY_OFFSET].label, ! 314: strlen(buts[EASY_OFFSET].label))) / 2; ! 315: ! 316: XSetFont(win->display, DefaultGC(win->display, ! 317: 0), win->large->fid); ! 318: XSetForeground(win->display, ! 319: DefaultGC(win->display, 0), ! 320: win->textcolor.pixel); ! 321: XSetBackground(win->display, ! 322: DefaultGC(win->display, 0), ! 323: win->textback.pixel); ! 324: ! 325: XDrawImageString(win->display, ! 326: win->buttonwin, ! 327: DefaultGC(win->display, 0), ! 328: buts[EASY_OFFSET].x + x, ! 329: buts[EASY_OFFSET].y, ! 330: buts[EASY_OFFSET].label, ! 331: strlen(buts[EASY_OFFSET].label)); ! 332: } ! 333: break; ! 334: } ! 335: return; ! 336: } ! 337:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.