home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume15 / xhearts / part02 < prev    next >
Text File  |  1992-02-03  |  56KB  |  1,803 lines

  1. Newsgroups: comp.sources.x
  2. Path: uunet!elroy.jpl.nasa.gov!ames!pasteur!nntp
  3. From: mikey@sgi.com (Mike Yang)
  4. Subject: v15i169: xhearts (w/ patch #1), Part02/06
  5. Message-ID: <1992Feb4.141903.9244@pasteur.Berkeley.EDU>
  6. Sender: dcmartin@msi.com (David C. Martin - Moderator)
  7. Nntp-Posting-Host: postgres.berkeley.edu
  8. Organization: University of California, at Berkeley
  9. References: <csx-15i168-xhearts@uunet.UU.NET>
  10. Date: Tue, 4 Feb 1992 14:19:03 GMT
  11. Approved: dcmartin@msi.com
  12.  
  13. Submitted-by: mikey@sgi.com (Mike Yang)
  14. Posting-number: Volume 15, Issue 169
  15. Archive-name: xhearts/part02
  16.  
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  21. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  22. # If this archive is complete, you will see the following message at the end:
  23. #        "End of archive 2 (of 6)."
  24. # Contents:  connect.c xawclient.c
  25. # Wrapped by dcmartin@fascet on Wed Jan 15 06:30:34 1992
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'connect.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'connect.c'\"
  29. else
  30. echo shar: Extracting \"'connect.c'\" \(1157 characters\)
  31. sed "s/^X//" >'connect.c' <<'END_OF_FILE'
  32. X/*
  33. X * connect.c
  34. X *
  35. X * client connection to hearts server
  36. X */
  37. X
  38. X#include <stdio.h>
  39. X#include "defs.h"
  40. X#include "local.h"
  41. X
  42. Xchar *getenv();
  43. X
  44. X/*
  45. X * Make connection to host running the hearts distributor server,
  46. X * return fd of new socket.
  47. X */
  48. Xconnect_to(servhost, port)
  49. Xchar    *servhost;            /* name of host running server */
  50. Xint    port;
  51. X{
  52. X    int    sock;
  53. X    struct    hostent *host;
  54. X    struct    servent *distributor;
  55. X    struct    sockaddr_in sockaddr;
  56. X    char    buf[64];
  57. X
  58. X    if ((host = gethostbyname(servhost)) == NULL)  {
  59. X        perror("gethostbyname");
  60. X        exit(1);
  61. X    }
  62. X    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)  {
  63. X        perror("socket");
  64. X        exit(1);
  65. X    }
  66. X    bzero((char *) &sockaddr, sizeof (sockaddr));
  67. X    bcopy(host->h_addr, (char *) &sockaddr.sin_addr, host->h_length);
  68. X    sockaddr.sin_family = AF_INET;
  69. X    if (port)
  70. X        sockaddr.sin_port = htons(port);
  71. X    else {
  72. X        if ((distributor = getservbyname(SERVICE, PROTO)) == NULL)  {
  73. X            (void) sprintf(buf, "%s: service not found\n", SERVICE);
  74. X            fputs(buf, stderr);
  75. X            exit(1);
  76. X        }
  77. X        sockaddr.sin_port = distributor->s_port;
  78. X    }
  79. X    if (connect(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) < 0) {
  80. X        (void) close (sock);
  81. X        return(0);
  82. X    }
  83. X    return(sock);
  84. X}
  85. END_OF_FILE
  86. if test 1157 -ne `wc -c <'connect.c'`; then
  87.     echo shar: \"'connect.c'\" unpacked with wrong size!
  88. fi
  89. # end of 'connect.c'
  90. fi
  91. if test -f 'xawclient.c' -a "${1}" != "-c" ; then 
  92.   echo shar: Will not clobber existing file \"'xawclient.c'\"
  93. else
  94. echo shar: Extracting \"'xawclient.c'\" \(50694 characters\)
  95. sed "s/^X//" >'xawclient.c' <<'END_OF_FILE'
  96. X/*****************************************************************
  97. XCopyright 1992 by Silicon Graphics Incorporated, Mountain View, CA,
  98. Xand the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  99. X
  100. X                        All Rights Reserved
  101. X
  102. XPermission to use, copy, modify, and distribute this software and its 
  103. Xdocumentation for any purpose and without fee is hereby granted, 
  104. Xprovided that the above copyright notice appear in all copies and that
  105. Xboth that copyright notice and this permission notice appear in 
  106. Xsupporting documentation, and that the names of SGI or MIT not be
  107. Xused in advertising or publicity pertaining to distribution of the
  108. Xsoftware without specific, written prior permission.  
  109. X
  110. XSGI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  111. XALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  112. XSGI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  113. XANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  114. XWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  115. XARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  116. XSOFTWARE.
  117. X
  118. X******************************************************************/
  119. X
  120. X/*
  121. X * xawclient.c - X11/Xaw client interface to hearts
  122. X * 
  123. X * Author:    Mike Yang (mikey@sgi.com)
  124. X *        Silicon Graphics, Inc.
  125. X * Date:    Fri Jan 3 1992
  126. X * Copyright (c) 1992 Mike Yang
  127. X */
  128. X
  129. X#include <stdlib.h>
  130. X#include <malloc.h>
  131. X#include <sys/errno.h>
  132. X#include <sys/types.h>
  133. X#include <sys/stat.h>
  134. X#include <fcntl.h>
  135. X#include "misc.h"
  136. X#include "defs.h"
  137. X#include "local.h"
  138. X#include "client.h"
  139. X#include "gfx.h"
  140. X#ifdef SYSV
  141. X#include <sys/termio.h>
  142. X#endif
  143. X#include <X11/cursorfont.h>
  144. X#include <X11/Intrinsic.h>
  145. X#include <X11/StringDefs.h>
  146. X#include <X11/Shell.h>
  147. X#include <X11/Xaw/Form.h>
  148. X#include <X11/Xaw/Command.h>
  149. X#include <X11/Xaw/Label.h>
  150. X#include <X11/Xaw/AsciiText.h>
  151. X#include <X11/Xaw/Text.h>
  152. X#include <X11/Xaw/Simple.h>
  153. X
  154. X#ifdef X11R4
  155. X#define XawChainTop XtChainTop
  156. X#define XawChainBottom XtChainBottom
  157. X#define XawChainLeft XtChainLeft
  158. X#define XawChainRight XtChainRight
  159. X#endif
  160. X
  161. X#define NUM_TABLES_ROWS    2
  162. X#define NUM_TABLES_COLS    4
  163. X#define NUM_TABLES    (NUM_TABLES_ROWS*NUM_TABLES_COLS)
  164. X
  165. Xstatic int count;
  166. Xstatic Arg args[20];
  167. X
  168. Xtypedef struct _CardInfo {
  169. X  int rank;
  170. X  int suit;
  171. X  struct _CardInfo *next;
  172. X} CardInfo;
  173. X
  174. Xtypedef struct {
  175. X  CardInfo *head;
  176. X} SuitInfo;
  177. X
  178. XSuitInfo my_hand[MAX_SUIT+1];
  179. X
  180. XXtAppContext appContext;
  181. XWidget toplevel, form, displayFrame, displayArea, playArea, scoreArea;
  182. XWidget messageLabel, messageArea, messageEntry;
  183. XWidget commandArea, showButton = NULL, autoButton = NULL;
  184. XWidget quitButton, helpButton;
  185. XWidget displayLabels, roundLabel, leadLabel, textArea, playLabelArea;
  186. XWidget scorePlayer, scoreScore, scoreTotal;
  187. XWidget playerLabels[5], scoreLabels[5], totalLabels[5];
  188. XWidget playLabels[4];
  189. XWidget optionForm, helpDialog = NULL, playForm, optionHeader;
  190. XWidget gameBox, anotherGame, newGame, moreGames, quitGame, helpGame;
  191. XWidget gamesHeader, gamesFrame, gamesRC, gamesMessage;
  192. XBoolean showOld, *anotherPtr;
  193. XCardInfo playCards[4], lastCards[4];
  194. Xchar playNames[4][256], lastNames[4][256];
  195. XXtInputId distId = None, dealerId = None;
  196. XBoolean readingCard;
  197. XCursor cardCursor = None;
  198. XDimension globalTableHeight;
  199. X
  200. XresizeWidget(w, width, height)
  201. XWidget w;
  202. XDimension width, height;
  203. X{
  204. X  Dimension bw;
  205. X  Position x, y;
  206. X
  207. X  count = 0;
  208. X  if (!width) {
  209. X    XtSetArg(args[count], XtNwidth, &width);  count++;
  210. X  }
  211. X  if (!height) {
  212. X    XtSetArg(args[count], XtNheight, &height);  count++;
  213. X  }
  214. X  XtSetArg(args[count], XtNborderWidth, &bw);  count++;
  215. X  XtSetArg(args[count], XtNx, &x);  count++;
  216. X  XtSetArg(args[count], XtNy, &y);  count++;
  217. X  XtGetValues(w, args, count);
  218. X  count = 0;
  219. X  XtSetArg(args[count], XtNwidth, width);  count++;
  220. X  XtSetArg(args[count], XtNheight, height);  count++;
  221. X  XtSetValues(w, args, count);
  222. X  XtConfigureWidget(w, x, y, width, height, bw);
  223. X}
  224. X
  225. XupdateLabel(w)
  226. XWidget w;
  227. X{
  228. X  XEvent event;
  229. X
  230. X  while (XCheckTypedWindowEvent(XtDisplay(w), XtWindow(w), Expose, &event)) {
  231. X    XtDispatchEvent(&event);
  232. X  }
  233. X}
  234. X
  235. XupdateDisplay()
  236. X{
  237. X  int i;
  238. X
  239. X  for (i=0; i<4; i++) {
  240. X    updateLabel(playLabels[i]);
  241. X  }
  242. X  updateLabel(roundLabel);
  243. X  updateLabel(leadLabel);
  244. X}
  245. X
  246. XRank
  247. XconvertRank(rank)
  248. Xint rank;
  249. X{
  250. X  if (rank == 13) {
  251. X    return Ace;
  252. X  } else {
  253. X    return rank;
  254. X  }
  255. X}
  256. X
  257. XSuit
  258. XconvertSuit(suit)
  259. Xint suit;
  260. X{
  261. X  Suit s;
  262. X
  263. X  switch (suit) {
  264. X  case SPADES:
  265. X    s = Spade;
  266. X    break;
  267. X  case HEARTS:
  268. X    s = Heart;
  269. X    break;
  270. X  case DIAMONDS:
  271. X    s = Diamond;
  272. X    break;
  273. X  case CLUBS:
  274. X    s = Club;
  275. X    break;
  276. X  }
  277. X  return s;
  278. X}
  279. X
  280. Xvoid
  281. XshowPlayArea(cards, names)
  282. XCardInfo *cards;
  283. Xchar names[4][256];
  284. X{
  285. X  int i;
  286. X
  287. X  for (i=0; i<4; i++) {
  288. X    if (cards[i].rank) {
  289. X      paint_card(XtWindow(playArea), i*STACK_WIDTH, 0,
  290. X         convertRank(cards[i].rank), convertSuit(cards[i].suit), 0);
  291. X    } else {
  292. X      XClearArea(XtDisplay(playArea), XtWindow(playArea), i*STACK_WIDTH, 0,
  293. X         STACK_WIDTH, 0, False);
  294. X    }
  295. X    count = 0;
  296. X    if (cards[i].rank) {
  297. X      XtSetArg(args[count], XtNlabel, names[i]);  count++;
  298. X    } else {
  299. X      XtSetArg(args[count], XtNlabel, " ");  count++;
  300. X    }
  301. X    XtSetValues(playLabels[i], args, count);
  302. X  }
  303. X}
  304. X
  305. Xvoid
  306. XsetShowOld(v)
  307. XBoolean v;
  308. X{
  309. X  if (showOld != v) {
  310. X    showOld = v;
  311. X    if (showOld) {
  312. X      showPlayArea(lastCards, lastNames);
  313. X    } else {
  314. X      showPlayArea(playCards, playNames);
  315. X    }
  316. X  }
  317. X}
  318. X
  319. Xvoid
  320. XsetReadingCard(v)
  321. XBoolean v;
  322. X{
  323. X  if (readingCard != v) {
  324. X    readingCard = v;
  325. X    if (cardCursor == None) {
  326. X      cardCursor = XCreateFontCursor(XtDisplay(toplevel), XC_hand1);
  327. X    }
  328. X    if (XtIsRealized(displayArea)) {
  329. X      if (readingCard) {
  330. X    XDefineCursor(XtDisplay(displayArea), XtWindow(displayArea),
  331. X              cardCursor);
  332. X      } else {
  333. X    XUndefineCursor(XtDisplay(displayArea), XtWindow(displayArea));
  334. X      }
  335. X      XFlush(XtDisplay(displayArea));
  336. X    }
  337. X    if (!readingCard && showOld) {
  338. X      setShowOld(False);
  339. X    }
  340. X  }
  341. X}
  342. X
  343. X/**********************************************************************/
  344. X
  345. Xvoid
  346. XexposeDisplayArea(w, client_data, call_data)
  347. XWidget w;
  348. XXtPointer client_data;
  349. XXtPointer call_data;
  350. X{
  351. X  Suit suit;
  352. X
  353. X  for (suit=CLUBS; suit<=SPADES; suit++) {
  354. X    print_cards(suit);
  355. X  }
  356. X}
  357. X
  358. Xvoid
  359. XdisplaySelect(w, client_data, event)
  360. XWidget w;
  361. XXtPointer client_data;
  362. XXEvent *event;
  363. X{
  364. X  int suit, card, count;
  365. X  CardInfo *ptr, *cardSelected;
  366. X  char rch, sch;
  367. X  static char rnames[] = " 23456789TJQKA";
  368. X
  369. X  cardSelected = NULL;
  370. X  if (readingCard &&
  371. X      event->type == ButtonPress && event->xbutton.button == Button1) {
  372. X    suit = (event->xbutton.x/STACK_WIDTH)+1;
  373. X    card = (event->xbutton.y/CARD_DELTA)+1;
  374. X    if (event->xbutton.x % STACK_WIDTH > CARD_WIDTH) {
  375. X      /* clicked on space between stacks */
  376. X    } else if (suit > 4) {
  377. X      /* clicked outside stacks */
  378. X    } else {
  379. X      ptr = my_hand[suit].head;
  380. X      count = 0;
  381. X      while (count < card && ptr->next) {
  382. X    count++;
  383. X    ptr = ptr->next;
  384. X      }
  385. X      if (count == card) {
  386. X    cardSelected = ptr;
  387. X      } else if (count < card &&
  388. X         event->xbutton.y-(count-1)*CARD_DELTA < CARD_HEIGHT) {
  389. X    /* clicked on last card */
  390. X    cardSelected = ptr;
  391. X      } else {
  392. X    /* clicked below stack */
  393. X      }
  394. X    }
  395. X  }
  396. X  if (cardSelected) {
  397. X    rch = rnames[cardSelected->rank];
  398. X    switch (cardSelected->suit) {
  399. X    case SPADES:
  400. X      sch = 's';
  401. X      break;
  402. X    case HEARTS:
  403. X      sch = 'h';
  404. X      break;
  405. X    case DIAMONDS:
  406. X      sch = 'd';
  407. X      break;
  408. X    case CLUBS:
  409. X      sch = 'c';
  410. X      break;
  411. X    }
  412. X    send_card(rch, sch);
  413. X    setReadingCard(False);
  414. X    erase_window(TEXT_WINDOW);
  415. X  } else {
  416. X    XBell(XtDisplay(toplevel), 0);
  417. X  }
  418. X}
  419. X
  420. Xvoid
  421. Xshow_button(w, client_data, call_data)
  422. XWidget w;
  423. XXtPointer client_data;
  424. XXtPointer call_data;
  425. X{
  426. X  if (readingCard) {
  427. X    setShowOld(!showOld);
  428. X  }
  429. X}
  430. X
  431. Xvoid
  432. Xauto_play(w, client_data, call_data)
  433. XWidget w;
  434. XXtPointer client_data;
  435. XXtPointer call_data;
  436. X{
  437. X  if (readingCard) {
  438. X    send_auto();
  439. X    setReadingCard(False);
  440. X    erase_window(TEXT_WINDOW);
  441. X  }
  442. X}
  443. X
  444. Xvoid
  445. Xquit_game(w, client_data, call_data)
  446. XWidget w;
  447. XXtPointer client_data;
  448. XXtPointer call_data;
  449. X{
  450. X  wimp_out();
  451. X}
  452. X
  453. Xvoid
  454. Xhelp_away(w, client_data, call_data)
  455. XWidget w;
  456. XXtPointer client_data;
  457. XXtPointer call_data;
  458. X{
  459. X  XtPopdown(helpDialog);
  460. X}
  461. X
  462. Xvoid
  463. Xhelp_me(w, client_data, call_data)
  464. XWidget w;
  465. XXtPointer client_data;
  466. XXtPointer call_data;
  467. X{
  468. X  Widget form, text, okButton, label;
  469. X  char filename[256];
  470. X  int fildes;
  471. X  struct stat buf;
  472. X  char *data;
  473. X
  474. X  if (!helpDialog) {
  475. X    count = 0;
  476. X    helpDialog = XtCreatePopupShell("xawhearts help", topLevelShellWidgetClass,
  477. X                    toplevel, args, count);
  478. X    count = 0;
  479. X    XtSetArg(args[count], XtNborderWidth, 0);  count++;
  480. X    form = XtCreateManagedWidget("helpForm", formWidgetClass, helpDialog,
  481. X                 args, count);
  482. X
  483. X    count = 0;
  484. X    XtSetArg(args[count], XtNscrollVertical, True);  count++;
  485. X    XtSetArg(args[count], XtNheight, 200);  count++;
  486. X    XtSetArg(args[count], XtNwidth, 700);  count++;
  487. X    text = XtCreateManagedWidget("helpText", asciiTextWidgetClass, form,
  488. X                 args, count);
  489. X
  490. X    count = 0;
  491. X    XtSetArg(args[count], XtNborderWidth, 0);  count++;
  492. X    XtSetArg(args[count], XtNfromVert, text);  count++;
  493. X    XtSetArg(args[count], XtNvertDistance, 10);  count++;
  494. X    XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  495. X    XtSetArg(args[count], XtNlabel, "Xawhearts, an Xaw interface to hearts.  Mike Yang, Silicon Graphics, mikey@sgi.com");  count++;
  496. X    label = XtCreateManagedWidget("label", labelWidgetClass, form,
  497. X                  args, count);
  498. X
  499. X    count = 0;
  500. X    XtSetArg(args[count], XtNfromVert, text);  count++;
  501. X    XtSetArg(args[count], XtNvertDistance, 10);  count++;
  502. X    XtSetArg(args[count], XtNfromHoriz, label);  count++;
  503. X    XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  504. X    XtSetArg(args[count], XtNleft, XawChainRight);  count++;
  505. X    XtSetArg(args[count], XtNright, XawChainRight);  count++;
  506. X    XtSetArg(args[count], XtNtop, XawChainBottom);  count++;
  507. X    XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  508. X    XtSetArg(args[count], XtNlabel, "OK");  count++;
  509. X    okButton = XtCreateManagedWidget("helpOK", commandWidgetClass, form,
  510. X                     args, count);
  511. X    XtAddCallback(okButton, XtNcallback, help_away, NULL);
  512. X
  513. X    sprintf(filename, "%s/%s", HEARTSLIB, INSTRUCT);
  514. X    if ((fildes = open(filename, O_RDONLY)) != -1) {
  515. X      fstat(fildes, &buf);
  516. X      data = (char *) malloc((size_t) buf.st_size+1);
  517. X      read(fildes, data, (unsigned) buf.st_size);
  518. X      data[buf.st_size] = '\0';
  519. X      close(fildes);
  520. X      count = 0;
  521. X      XtSetArg(args[count], XtNstring, data);  count++;
  522. X      XtSetValues(text, args, count);
  523. X      free(data);
  524. X    } else {
  525. X      count = 0;
  526. X      XtSetArg(args[count], XtNstring, "Help file missing.\n");  count++;
  527. X      XtSetValues(text, args, count);
  528. X    }
  529. X  }
  530. X  XtPopup(helpDialog, XtGrabNone);
  531. X}
  532. X
  533. Xvoid
  534. XexposePlayArea(w, client_data, call_data)
  535. XWidget w;
  536. XXtPointer client_data;
  537. XXtPointer call_data;
  538. X{
  539. X  if (showOld) {
  540. X    showPlayArea(lastCards, lastNames);
  541. X  } else {
  542. X    showPlayArea(playCards, playNames);
  543. X  }
  544. X}
  545. X
  546. Xvoid
  547. Xanother_game(w, client_data, call_data)
  548. XWidget w;
  549. XXtPointer client_data;
  550. XXtPointer call_data;
  551. X{
  552. X  *anotherPtr = TRUE;
  553. X  if (!first_game) {
  554. X    joined = TRUE;
  555. X  }
  556. X}
  557. X
  558. Xvoid
  559. Xnew_game(w, client_data, call_data)
  560. XWidget w;
  561. XXtPointer client_data;
  562. XXtPointer call_data;
  563. X{
  564. X  start_new_game();
  565. X  joined = TRUE;
  566. X}
  567. X
  568. Xvoid
  569. Xmore_games(w, client_data, call_data)
  570. XWidget w;
  571. XXtPointer client_data;
  572. XXtPointer call_data;
  573. X{
  574. X  if (table_count > NUM_TABLES) {
  575. X    if ((cur_screen_table += NUM_TABLES) > table_count) {
  576. X      cur_screen_table = 1;
  577. X    }
  578. X    show_tables(cur_screen_table);
  579. X  }
  580. X}
  581. X
  582. Xvoid
  583. XtableSelect(w, client_data, event)
  584. XWidget w;
  585. XXtPointer client_data;
  586. XXEvent *event;
  587. X{
  588. X  int i;
  589. X  Widget *widgets;
  590. X  table_ptr cur_ptr;
  591. X
  592. X  if (table_count && first_game &&
  593. X      event->type == ButtonPress && event->xbutton.button == Button1) {
  594. X    cur_ptr = first_table;
  595. X    for (i=0; i<table_count; i++) {
  596. X      if (cur_ptr->data && !cur_ptr->closed) {
  597. X    widgets = (Widget *) cur_ptr->data;
  598. X    if (w == widgets[1]) {
  599. X      join_game(cur_ptr->table_id);
  600. X      joined = TRUE;
  601. X      return;
  602. X    }
  603. X      }
  604. X      cur_ptr = cur_ptr->next_table;
  605. X    }
  606. X  } else if (XtIsSensitive(anotherGame)) {
  607. X    another_game(w, NULL, NULL);
  608. X  }
  609. X}
  610. X
  611. Xvoid
  612. Xsend_msg(w, event, params, num_params)
  613. XWidget w;
  614. XXEvent *event;
  615. XString *params;
  616. XCardinal *num_params;
  617. X{
  618. X  char *msg;
  619. X
  620. X  count = 0;
  621. X  XtSetArg(args[count], XtNstring, &msg);  count++;
  622. X  XtGetValues(messageEntry, args, count);
  623. X  count = 0;
  624. X  XtSetArg(args[count], XtNstring, "");  count++;
  625. X  XtSetValues(messageEntry, args, count);
  626. X  send_message(msg);
  627. X  XtFree(msg);
  628. X}
  629. X
  630. X/**********************************************************************/
  631. X
  632. Xvoid
  633. XdealerInput(client_data, source, id)
  634. XXtPointer client_data;
  635. Xint *source;
  636. XXtInputId *id;
  637. X{
  638. X  fd_type read_fd;
  639. X  int nready;
  640. X  struct timeval timeout;
  641. X
  642. X  timeout.tv_sec = 0;
  643. X  timeout.tv_usec = 0;
  644. X  fd_init(dealer_socket, &read_fd);
  645. X  while (dealerId &&
  646. X     (nready = select(WIDTH, &read_fd, (fd_type *) 0, (fd_type *) 0,
  647. X              &timeout)) && nready > 0) {
  648. X    do_socket();
  649. X  }
  650. X}
  651. X
  652. Xvoid
  653. XdistInput(client_data, source, id)
  654. XXtPointer client_data;
  655. Xint *source;
  656. XXtInputId *id;
  657. X{
  658. X  fd_type read_fd;
  659. X  int nready;
  660. X  struct timeval timeout;
  661. X
  662. X  timeout.tv_sec = 0;
  663. X  timeout.tv_usec = 0;
  664. X  fd_init(dist_socket, &read_fd);
  665. X  while (distId &&
  666. X     (nready = select(WIDTH, &read_fd, (fd_type *) 0, (fd_type *) 0,
  667. X              &timeout)) && nready > 0) {
  668. X    do_dist();
  669. X  }
  670. X}
  671. X
  672. XWidget
  673. XbuildScoreLabels(parent, header, array)
  674. XWidget parent;
  675. Xchar *header;
  676. XWidget *array;
  677. X{
  678. X  Widget rc, last;
  679. X  Dimension width;
  680. X  int each;
  681. X
  682. X  count = 0;
  683. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  684. X  rc = XtCreateManagedWidget("scoresColumn", formWidgetClass, parent,
  685. X                 args, count);
  686. X  count = 0;
  687. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  688. X  if (array == playerLabels) {
  689. X    XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  690. X  } else {
  691. X    XtSetArg(args[count], XtNjustify, XtJustifyRight);  count++;
  692. X  }
  693. X  XtSetArg(args[count], XtNlabel, header);  count++;
  694. X  array[0] = XtCreateManagedWidget("header", labelWidgetClass, rc,
  695. X                   args, count);
  696. X  count = 0;
  697. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  698. X  XtGetValues(array[0], args, count);
  699. X  last = array[0];
  700. X  for (each=1; each<=4; each++) {
  701. X    count = 0;
  702. X    XtSetArg(args[count], XtNborderWidth, 0);  count++;
  703. X    if (array == playerLabels) {
  704. X      XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  705. X    } else {
  706. X      XtSetArg(args[count], XtNjustify, XtJustifyRight);  count++;
  707. X    }
  708. X    XtSetArg(args[count], XtNlabel, " ");  count++; 
  709. X    XtSetArg(args[count], XtNfromVert, last);  count++;
  710. X    XtSetArg(args[count], XtNwidth, width);  count++;
  711. X    array[each] = XtCreateManagedWidget("label", labelWidgetClass, rc,
  712. X                    args, count);
  713. X    last = array[each];
  714. X  }
  715. X  return rc;
  716. X}
  717. X
  718. Xvoid
  719. XbuildScoreArea(parent)
  720. XWidget parent;
  721. X{
  722. X  Widget rc, p, s, t;
  723. X
  724. X  count = 0;
  725. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  726. X  rc = XtCreateManagedWidget("scoreArea", formWidgetClass, parent,
  727. X                 args, count);
  728. X  p = buildScoreLabels(rc, "Player:      ", playerLabels);
  729. X  s = buildScoreLabels(rc, "Score:", scoreLabels);
  730. X  count = 0;
  731. X  XtSetArg(args[count], XtNfromHoriz, p);  count++;
  732. X  XtSetValues(s, args, count);
  733. X  t = buildScoreLabels(rc, "Total:", totalLabels);
  734. X  count = 0;
  735. X  XtSetArg(args[count], XtNfromHoriz, s);  count++;
  736. X  XtSetValues(t, args, count);
  737. X}
  738. X
  739. Xvoid
  740. XbuildCommandArea(parent)
  741. XWidget parent;
  742. X{
  743. X  Widget rc;
  744. X
  745. X  count = 0;
  746. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  747. X  rc = XtCreateManagedWidget("commandArea", formWidgetClass, parent,
  748. X                 args, count);
  749. X  count = 0;
  750. X  XtSetArg(args[count], XtNlabel, "Toggle Last");  count++;
  751. X  showButton = XtCreateManagedWidget("showButton", commandWidgetClass, rc,
  752. X                     args, count);
  753. X  XtAddCallback(showButton, XtNcallback, show_button, NULL);
  754. X  count = 0;
  755. X  XtSetArg(args[count], XtNlabel, "Auto Play");  count++;
  756. X  XtSetArg(args[count], XtNfromHoriz, showButton);  count++;
  757. X  autoButton = XtCreateManagedWidget("autoButton", commandWidgetClass, rc,
  758. X                     args, count);
  759. X  XtAddCallback(autoButton, XtNcallback, auto_play, NULL);
  760. X  count = 0;
  761. X  XtSetArg(args[count], XtNlabel, "Quit");  count++;
  762. X  XtSetArg(args[count], XtNfromHoriz, autoButton);  count++;
  763. X  quitButton = XtCreateManagedWidget("quitButton", commandWidgetClass, rc,
  764. X                     args, count);
  765. X  XtAddCallback(quitButton, XtNcallback, quit_game, NULL);
  766. X  count = 0;
  767. X  XtSetArg(args[count], XtNlabel, "Help");  count++;
  768. X  XtSetArg(args[count], XtNfromHoriz, quitButton);  count++;
  769. X  helpButton = XtCreateManagedWidget("helpButton", commandWidgetClass, rc,
  770. X                     args, count);
  771. X  XtAddCallback(helpButton, XtNcallback, help_me, NULL);
  772. X}
  773. X
  774. Xvoid
  775. XbuildInterface(parent)
  776. XWidget parent;
  777. X{
  778. X  Widget form;
  779. X
  780. X  static String textTranslations = "<Key>Return:doreturn()";
  781. X  static XtActionsRec actionTable[] = {
  782. X    {"doreturn", send_msg},
  783. X    {NULL, NULL},
  784. X  };
  785. X
  786. X  count = 0;
  787. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  788. X  form = XtCreateManagedWidget("form", formWidgetClass, parent, args, count);
  789. X
  790. X  count = 0;
  791. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  792. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  793. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  794. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  795. X  XtSetArg(args[count], XtNdefaultDistance, STACK_SPACING);  count++;
  796. X  displayFrame = XtCreateManagedWidget("displayFrame", formWidgetClass, form,
  797. X                       args, count);
  798. X
  799. X  count = 0;
  800. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  801. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  802. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  803. X  XtSetArg(args[count], XtNwidth, 4*STACK_WIDTH-STACK_SPACING+2);  count++;
  804. X  XtSetArg(args[count], XtNheight, 12*CARD_DELTA+CARD_HEIGHT+2);  count++;
  805. X  displayArea = XtCreateManagedWidget("displayArea", simpleWidgetClass,
  806. X                      displayFrame, args, count);
  807. X  XtAddEventHandler(displayArea, ExposureMask, False, exposeDisplayArea, NULL);
  808. X  XtAddEventHandler(displayArea, ButtonPressMask, False, displaySelect, NULL);
  809. X
  810. X  count = 0;
  811. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  812. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  813. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  814. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  815. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  816. X  XtSetArg(args[count], XtNfromVert, displayFrame);  count++;
  817. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  818. X/* adjust for display frame margin */
  819. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  820. X  XtSetArg(args[count], XtNwidth, 4*STACK_WIDTH-STACK_SPACING+2);  count++;
  821. X  XtSetArg(args[count], XtNheight, CARD_HEIGHT+2);  count++;
  822. X  playArea = XtCreateManagedWidget("playArea", formWidgetClass,
  823. X                   form, args, count);
  824. X  XtAddEventHandler(playArea, ExposureMask, False, exposePlayArea, NULL);
  825. X
  826. X  count = 0;
  827. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  828. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  829. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  830. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  831. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  832. X  XtSetArg(args[count], XtNfromVert, playArea);  count++;
  833. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  834. X/* adjust for display frame margin */
  835. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  836. X  playLabelArea = XtCreateManagedWidget("playLabelArea", formWidgetClass,
  837. X                    form, args, count);
  838. X
  839. X  count = 0;
  840. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  841. X  XtSetArg(args[count], XtNlabel, " ");  count++;
  842. X  XtSetArg(args[count], XtNwidth, CARD_WIDTH);  count++;
  843. X  XtSetArg(args[count], XtNresize, False);  count++;
  844. X  playLabels[0] = XtCreateManagedWidget("playLabel", labelWidgetClass,
  845. X                    playLabelArea, args, count);
  846. X  count = 0;
  847. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  848. X  XtSetArg(args[count], XtNlabel, " ");  count++;
  849. X  XtSetArg(args[count], XtNwidth, CARD_WIDTH);  count++;
  850. X  XtSetArg(args[count], XtNfromHoriz, playLabels[0]);  count++;
  851. X  XtSetArg(args[count], XtNhorizDistance, STACK_SPACING);  count++;
  852. X  XtSetArg(args[count], XtNresize, False);  count++;
  853. X  playLabels[1] = XtCreateManagedWidget("playLabel", labelWidgetClass,
  854. X                    playLabelArea, args, count);
  855. X  count = 0;
  856. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  857. X  XtSetArg(args[count], XtNlabel, " ");  count++;
  858. X  XtSetArg(args[count], XtNwidth, CARD_WIDTH);  count++;
  859. X  XtSetArg(args[count], XtNfromHoriz, playLabels[1]);  count++;
  860. X  XtSetArg(args[count], XtNhorizDistance, STACK_SPACING);  count++;
  861. X  XtSetArg(args[count], XtNresize, False);  count++;
  862. X  playLabels[2] = XtCreateManagedWidget("playLabel", labelWidgetClass,
  863. X                    playLabelArea, args, count);
  864. X  count = 0;
  865. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  866. X  XtSetArg(args[count], XtNlabel, " ");  count++;
  867. X  XtSetArg(args[count], XtNwidth, CARD_WIDTH);  count++;
  868. X  XtSetArg(args[count], XtNfromHoriz, playLabels[2]);  count++;
  869. X  XtSetArg(args[count], XtNhorizDistance, STACK_SPACING);  count++;
  870. X  XtSetArg(args[count], XtNresize, False);  count++;
  871. X  playLabels[3] = XtCreateManagedWidget("playLabel", labelWidgetClass,
  872. X                    playLabelArea, args, count);
  873. X
  874. X  count = 0;
  875. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  876. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  877. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  878. X  XtSetArg(args[count], XtNfromHoriz, displayFrame);  count++;
  879. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  880. X  displayLabels = XtCreateManagedWidget("displayLabels", formWidgetClass,
  881. X                    form, args, count);
  882. X
  883. X  count = 0;
  884. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  885. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  886. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  887. X  XtSetArg(args[count], XtNlabel, "New hand...");  count++;
  888. X  XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  889. X  XtSetArg(args[count], XtNwidth, 10);  count++;
  890. X  roundLabel = XtCreateManagedWidget("roundLabel", labelWidgetClass,
  891. X                     displayLabels, args, count);
  892. X
  893. X  count = 0;
  894. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  895. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  896. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  897. X  XtSetArg(args[count], XtNlabel, "Round: 1");  count++;
  898. X  XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  899. X  XtSetArg(args[count], XtNfromVert, roundLabel);  count++;
  900. X  XtSetArg(args[count], XtNwidth, 10);  count++;
  901. X  leadLabel = XtCreateManagedWidget("roundLabel", labelWidgetClass,
  902. X                    displayLabels, args, count);
  903. X
  904. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  905. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  906. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  907. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  908. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  909. X  XtSetArg(args[count], XtNlabel, " ");  count++;
  910. X  XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  911. X  XtSetArg(args[count], XtNfromVert, leadLabel);  count++;
  912. X  XtSetArg(args[count], XtNwidth, 10);  count++;
  913. X  textArea = XtCreateManagedWidget("textArea", labelWidgetClass,
  914. X                    displayLabels, args, count);
  915. X  count = 0;
  916. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  917. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  918. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  919. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  920. X  scoreArea = XtCreateManagedWidget("scoreArea", formWidgetClass,
  921. X                    form, args, count);
  922. X  XtManageChild(scoreArea);
  923. X  buildScoreArea(scoreArea);
  924. X
  925. X  count = 0;
  926. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  927. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  928. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  929. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  930. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  931. X  XtSetArg(args[count], XtNlabel, "Messages:");  count++;
  932. X  XtSetArg(args[count], XtNfromVert, scoreArea);  count++;
  933. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  934. X  XtSetArg(args[count], XtNfromHoriz, displayFrame);  count++;
  935. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  936. X  XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  937. X  messageLabel = XtCreateManagedWidget("messageLabel", labelWidgetClass,
  938. X                       form, args, count);
  939. X
  940. X  count = 0;
  941. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  942. X  XtSetArg(args[count], XtNright, XawChainRight);  count++; 
  943. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  944. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  945. X  XtSetArg(args[count], XtNscrollVertical, True);  count++;
  946. X/* The height is important, so that the buttons line up with the bottom
  947. X   of the screen.  Unfortunately, I can't figure out how to do the
  948. X   form constraints to make this happen cleanly. */
  949. X  XtSetArg(args[count], XtNheight, 430);  count++;
  950. X  XtSetArg(args[count], XtNwidth, 500);  count++;
  951. X  XtSetArg(args[count], XtNfromVert, messageLabel);  count++;
  952. X  XtSetArg(args[count], XtNfromHoriz, displayFrame);  count++;
  953. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  954. X  messageArea = XtCreateManagedWidget("messageArea", asciiTextWidgetClass,
  955. X                      form, args, count);
  956. X
  957. X  count = 0;
  958. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  959. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  960. X  XtSetArg(args[count], XtNtop, XawChainBottom);  count++;
  961. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  962. X  XtSetArg(args[count], XtNwidth, 500);  count++;
  963. X  XtSetArg(args[count], XtNfromVert, messageArea);  count++;
  964. X  XtSetArg(args[count], XtNfromHoriz, displayFrame);  count++;
  965. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  966. X  XtSetArg(args[count], XtNeditType, XawtextEdit);  count++;
  967. X  messageEntry = XtCreateManagedWidget("messageEntry", asciiTextWidgetClass,
  968. X                      form, args, count);
  969. X  XtOverrideTranslations(messageEntry,
  970. X             XtParseTranslationTable(textTranslations));
  971. X  XtAppAddActions(XtWidgetToApplicationContext(messageEntry),
  972. X          actionTable, XtNumber(actionTable));
  973. X
  974. X  count = 0;
  975. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  976. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  977. X  XtSetArg(args[count], XtNtop, XawChainBottom);  count++;
  978. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  979. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  980. X  XtSetArg(args[count], XtNfromVert, messageEntry);  count++;
  981. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  982. X  XtSetArg(args[count], XtNfromHoriz, displayFrame);  count++;
  983. X  XtSetArg(args[count], XtNhorizDistance, 10);  count++;
  984. X  commandArea = XtCreateManagedWidget("commandArea", formWidgetClass,
  985. X                      form, args, count);
  986. X  buildCommandArea(commandArea);
  987. X}
  988. X
  989. Xvoid
  990. XbuildOptionInterface(parent)
  991. XWidget parent;
  992. X{
  993. X  count = 0;
  994. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  995. X  optionForm = XtCreateManagedWidget("optionForm", formWidgetClass,
  996. X                     parent, args, count);
  997. X
  998. X  count = 0;
  999. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1000. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  1001. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1002. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  1003. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1004. X  XtSetArg(args[count], XtNlabel, "Welcome to the Game of Hearts");  count++;
  1005. X  XtSetArg(args[count], XtNjustify, XtJustifyCenter);  count++;
  1006. X  XtSetArg(args[count], XtNresize, False);  count++;
  1007. X  optionHeader = XtCreateManagedWidget("optionHeader", labelWidgetClass,
  1008. X                       optionForm, args, count);
  1009. X
  1010. X  count = 0;
  1011. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1012. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  1013. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1014. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  1015. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1016. X  XtSetArg(args[count], XtNfromVert, optionHeader);  count++;
  1017. X  XtSetArg(args[count], XtNvertDistance, 20);  count++;
  1018. X  XtSetArg(args[count], XtNjustify, XtJustifyCenter);  count++;
  1019. X  if (MIKEYJ) {
  1020. X    XtSetArg(args[count], XtNlabel,
  1021. X         "(the Jack of Diamonds scores -10)");  count++;
  1022. X  } else {
  1023. X    XtSetArg(args[count], XtNlabel, " ");  count++;
  1024. X  }
  1025. X  gamesMessage= XtCreateManagedWidget("gamesMessage", labelWidgetClass,
  1026. X                      optionForm, args, count);
  1027. X
  1028. X  count = 0;
  1029. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1030. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  1031. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1032. X  XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  1033. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1034. X  XtSetArg(args[count], XtNfromVert, gamesMessage);  count++;
  1035. X  XtSetArg(args[count], XtNvertDistance, 20);  count++;
  1036. X  XtSetArg(args[count], XtNjustify, XtJustifyLeft);  count++;
  1037. X  XtSetArg(args[count], XtNlabel, "Current Games:");  count++;
  1038. X  gamesHeader = XtCreateManagedWidget("gamesHeader", labelWidgetClass,
  1039. X                      optionForm, args, count);
  1040. X
  1041. X  count = 0;
  1042. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1043. X  XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  1044. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1045. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  1046. X  XtSetArg(args[count], XtNfromVert, gamesHeader);  count++;
  1047. X  XtSetArg(args[count], XtNdefaultDistance, 0);  count++;
  1048. X  gamesFrame = XtCreateManagedWidget("gamesFrame", formWidgetClass,
  1049. X                     optionForm, args, count);
  1050. X
  1051. X  count = 0;
  1052. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1053. X  XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1054. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  1055. X  XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1056. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  1057. X  XtSetArg(args[count], XtNdefaultDistance, 0);  count++;
  1058. X  XtSetArg(args[count], XtNwidth, 10);  count++;
  1059. X  XtSetArg(args[count], XtNheight, 10);  count++;
  1060. X  gamesRC = XtCreateManagedWidget("gamesRC", formWidgetClass,
  1061. X                  gamesFrame, args, count);
  1062. X
  1063. X  count = 0;
  1064. X  XtSetArg(args[count], XtNleft, XawChainRight);  count++;
  1065. X  XtSetArg(args[count], XtNright, XawChainRight);  count++;
  1066. X  XtSetArg(args[count], XtNtop, XawChainBottom);  count++;
  1067. X  XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  1068. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1069. X  XtSetArg(args[count], XtNfromVert, gamesFrame);  count++;
  1070. X  XtSetArg(args[count], XtNvertDistance, 10);  count++;
  1071. X  gameBox = XtCreateManagedWidget("gameBox", formWidgetClass,
  1072. X                  optionForm, args, count);
  1073. X
  1074. X  count = 0;
  1075. X  XtSetArg(args[count], XtNlabel, "Another Game");  count++;
  1076. X  anotherGame = XtCreateManagedWidget("anotherGame", commandWidgetClass,
  1077. X                      gameBox, args, count);
  1078. X  XtAddCallback(anotherGame, XtNcallback, another_game, NULL);
  1079. X
  1080. X  count = 0;
  1081. X  XtSetArg(args[count], XtNlabel, "New Game");  count++;
  1082. X  XtSetArg(args[count], XtNfromHoriz, anotherGame);  count++;
  1083. X  newGame = XtCreateManagedWidget("newGame", commandWidgetClass,
  1084. X                  gameBox, args, count);
  1085. X  XtAddCallback(newGame, XtNcallback, new_game, NULL);
  1086. X
  1087. X  count = 0;
  1088. X  XtSetArg(args[count], XtNlabel, "More Games");  count++;
  1089. X  XtSetArg(args[count], XtNfromHoriz, newGame);  count++;
  1090. X  moreGames = XtCreateManagedWidget("moreGames", commandWidgetClass,
  1091. X                    gameBox, args, count);
  1092. X  XtAddCallback(moreGames, XtNcallback, more_games, NULL);
  1093. X
  1094. X  count = 0;
  1095. X  XtSetArg(args[count], XtNlabel, "Quit");  count++;
  1096. X  XtSetArg(args[count], XtNfromHoriz, moreGames);  count++;
  1097. X  quitGame = XtCreateManagedWidget("quitGame", commandWidgetClass,
  1098. X                   gameBox, args, count);
  1099. X  XtAddCallback(quitGame, XtNcallback, quit_game, NULL);
  1100. X
  1101. X  count = 0;
  1102. X  XtSetArg(args[count], XtNlabel, "Help");  count++;
  1103. X  XtSetArg(args[count], XtNfromHoriz, quitGame);  count++;
  1104. X  helpGame = XtCreateManagedWidget("helpGame", commandWidgetClass,
  1105. X                   gameBox, args, count);
  1106. X  XtAddCallback(helpGame, XtNcallback, help_me, NULL);
  1107. X
  1108. X  playForm = form;
  1109. X}
  1110. X
  1111. Xinit(argc_p, argv)
  1112. Xint *argc_p;
  1113. Xchar **argv;
  1114. X{
  1115. X  char ch, *pager, buffer[128];
  1116. X  int suit;
  1117. X  CardInfo *card;
  1118. X
  1119. X  toplevel = XtInitialize(argv[0], "Xawhearts", NULL, 0, argc_p, argv);
  1120. X  appContext = XtWidgetToApplicationContext(toplevel);
  1121. X
  1122. X  count = 0;
  1123. X  XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1124. X  form = XtCreateManagedWidget("form", formWidgetClass,
  1125. X                   toplevel, args, count);
  1126. X
  1127. X  buildInterface(form);
  1128. X  buildOptionInterface(form);
  1129. X  gfx_init(XtDisplay(toplevel), XScreenNumberOfScreen(XtScreen(toplevel)));
  1130. X
  1131. X  XtRealizeWidget(toplevel);
  1132. X  fixupLayout();
  1133. X  XtAddEventHandler(form, StructureNotifyMask, False,
  1134. X            (XtEventHandler) fixupLayout, NULL);
  1135. X
  1136. X  for (suit=CLUBS; suit<=SPADES; suit++) {
  1137. X    card = (CardInfo *) malloc(sizeof(CardInfo));
  1138. X    card->rank = card->suit = 0;
  1139. X    card->next = NULL;
  1140. X    my_hand[suit].head = card;
  1141. X  }
  1142. X  playCards[0].rank = 0;
  1143. X  playCards[1].rank = 0;
  1144. X  playCards[2].rank = 0;
  1145. X  playCards[3].rank = 0;
  1146. X  playNames[0][0] = '\0';
  1147. X  playNames[1][0] = '\0';
  1148. X  playNames[2][0] = '\0';
  1149. X  playNames[3][0] = '\0';
  1150. X  lastCards[0].rank = 0;
  1151. X  lastCards[1].rank = 0;
  1152. X  lastCards[2].rank = 0;
  1153. X  lastCards[3].rank = 0;
  1154. X  lastNames[0][0] = '\0';
  1155. X  lastNames[1][0] = '\0';
  1156. X  lastNames[2][0] = '\0';
  1157. X  lastNames[3][0] = '\0';
  1158. X  setReadingCard(False);
  1159. X}
  1160. X
  1161. Xprint_cards(suit)
  1162. Xint suit;
  1163. X{
  1164. X  CardInfo *ptr;
  1165. X  int y;
  1166. X  Rank r;
  1167. X  Suit s;
  1168. X
  1169. X  s = convertSuit(suit);
  1170. X  ptr = my_hand[suit].head;
  1171. X  y = 0;
  1172. X  while (ptr->next) {
  1173. X    ptr = ptr->next;
  1174. X    r = convertRank(ptr->rank);
  1175. X    paint_card(XtWindow(displayArea), (suit-1)*STACK_WIDTH, y, r, s,
  1176. X           ptr->next ? CARD_DELTA : 0);
  1177. X    y += CARD_DELTA;
  1178. X  }
  1179. X  if (y) {
  1180. X    XClearArea(XtDisplay(displayArea), XtWindow(displayArea),
  1181. X           (suit-1)*STACK_WIDTH, y+CARD_HEIGHT-CARD_DELTA+1 /* bw */,
  1182. X           STACK_WIDTH, 0, False);
  1183. X  } else {
  1184. X    XClearArea(XtDisplay(displayArea), XtWindow(displayArea),
  1185. X           (suit-1)*STACK_WIDTH, 0,
  1186. X           STACK_WIDTH, 0, False);
  1187. X  }
  1188. X}
  1189. X
  1190. Xvoid
  1191. XdisplayMessage(msg)
  1192. Xchar *msg;
  1193. X{
  1194. X  count = 0;
  1195. X  XtSetArg(args[count], XtNlabel, msg);  count++;
  1196. X  XtSetValues(textArea, args, count);
  1197. X}
  1198. X
  1199. X
  1200. Xvoid
  1201. XpositionTables()
  1202. X{
  1203. X  int i, ct;
  1204. X  table_ptr cur_ptr;
  1205. X  Widget *widgets;
  1206. X  Dimension width, height, tableHeight, tableWidth, spacing;
  1207. X  Dimension marginWidth, marginHeight, bw;
  1208. X  Position x, y;
  1209. X
  1210. X  ct = 0;
  1211. X  cur_ptr = first_table;
  1212. X  /* make the gamesRC as large as the gamesFrame */
  1213. X  count = 0;
  1214. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  1215. X  XtSetArg(args[count], XtNheight, &height);  count++;
  1216. X  XtGetValues(gamesFrame, args, count);
  1217. X  resizeWidget(gamesRC, width, height);
  1218. X  marginWidth = 10;
  1219. X  marginHeight = 10;
  1220. X  spacing = 10;
  1221. X  for (i=0; i<table_count; i++) {
  1222. X    if (cur_ptr->data) {
  1223. X      widgets = (Widget *) cur_ptr->data;
  1224. X      if (XtIsManaged(widgets[0])) {
  1225. X    count = 0;
  1226. X    XtSetArg(args[count], XtNheight, &tableHeight);  count++;
  1227. X    XtSetArg(args[count], XtNborderWidth, &bw);  count++;
  1228. X    XtGetValues(widgets[0], args, count);
  1229. X    tableHeight = globalTableHeight;
  1230. X    if (width >
  1231. X        2*marginWidth+NUM_TABLES_COLS*4+(NUM_TABLES_COLS-1)*spacing) {
  1232. X      tableWidth = (width-2*marginWidth-NUM_TABLES_COLS*4-
  1233. X            (NUM_TABLES_COLS-1)*spacing)/NUM_TABLES_COLS;
  1234. X      y = marginHeight+tableHeight*(ct/NUM_TABLES_COLS);
  1235. X      x = marginWidth+(ct % NUM_TABLES_COLS)*(tableWidth+spacing);
  1236. X      XtConfigureWidget(widgets[0], x, y, tableWidth, tableHeight, bw);
  1237. X      XtConfigureWidget(widgets[1], 0, 0, tableWidth, tableHeight, 0);
  1238. X      ct++;
  1239. X    }
  1240. X      }
  1241. X    }
  1242. X    cur_ptr = cur_ptr->next_table;
  1243. X  }
  1244. X
  1245. X}
  1246. X
  1247. XfixupLayout()
  1248. X{
  1249. X  Dimension formWidth, formHeight, width, height, bw;
  1250. X  Position x, y;
  1251. X  int hd, dd;
  1252. X
  1253. X  /*****************************************************************/
  1254. X  /* Grrr.  I hate Xaw.  The form widget is not expressive enough. */
  1255. X  /* Or, I just can't figure it out.
  1256. X  /*****************************************************************/
  1257. X
  1258. X  /* make option form as big as play form */
  1259. X  count = 0;
  1260. X  XtSetArg(args[count], XtNwidth, &formWidth);  count++;
  1261. X  XtSetArg(args[count], XtNheight, &formHeight);  count++;
  1262. X  XtGetValues(playForm, args, count);
  1263. X  resizeWidget(optionForm, formWidth-2, formHeight-2);
  1264. X
  1265. X  /* make the labels and table container as wide as the option form */
  1266. X  count = 0;
  1267. X  XtSetArg(args[count], XtNwidth, &formWidth);  count++;
  1268. X  XtSetArg(args[count], XtNdefaultDistance, &dd);  count++;
  1269. X  XtGetValues(optionForm, args, count);
  1270. X  count = 0;
  1271. X  XtSetArg(args[count], XtNhorizDistance, &hd);  count++;
  1272. X  XtGetValues(optionHeader, args, count);
  1273. X  resizeWidget(optionHeader, formWidth-2*hd-2*dd, 0);
  1274. X  resizeWidget(gamesMessage, formWidth-2*hd-2*dd, 0);
  1275. X  resizeWidget(gamesHeader, formWidth-2*hd-2*dd, 0);
  1276. X  count = 0;
  1277. X  XtSetArg(args[count], XtNborderWidth, &bw);  count++;
  1278. X  XtGetValues(gamesFrame, args, count);
  1279. X  resizeWidget(gamesFrame, formWidth-2*hd-2*dd-2*bw, 0);
  1280. X
  1281. X  /* Expand labels area, move score area to the right of the play form */
  1282. X  count = 0;
  1283. X  XtSetArg(args[count], XtNwidth, &formWidth);  count++;
  1284. X  XtSetArg(args[count], XtNdefaultDistance, &dd);  count++;
  1285. X  XtGetValues(playForm, args, count);
  1286. X  count = 0;
  1287. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  1288. X  XtSetArg(args[count], XtNheight, &height);  count++;
  1289. X  XtSetArg(args[count], XtNx, &x);  count++;
  1290. X  XtSetArg(args[count], XtNy, &y);  count++;
  1291. X  XtSetArg(args[count], XtNborderWidth, &bw);  count++;
  1292. X  XtGetValues(scoreArea, args, count);
  1293. X/* I have no idea why I need this fudge factor to line things up... */
  1294. X#define FUDGE_FACTOR 8
  1295. X  count = 0;
  1296. X  XtSetArg(args[count], XtNx, formWidth-width-dd-2*bw-FUDGE_FACTOR);  count++;
  1297. X  XtSetValues(scoreArea, args, count);
  1298. X  XtConfigureWidget(scoreArea, formWidth-width-dd-2*bw-FUDGE_FACTOR, y,
  1299. X            width, height, bw);
  1300. X  count = 0;
  1301. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  1302. X  XtGetValues(scoreArea, args, count);
  1303. X  count = 0;
  1304. X  XtSetArg(args[count], XtNx, &x);  count++;
  1305. X  XtGetValues(displayLabels, args, count);
  1306. X  if (x > formWidth-width-dd-2*bw-FUDGE_FACTOR) {
  1307. X    resizeWidget(displayLabels, 1, 0);
  1308. X  } else {
  1309. X    resizeWidget(displayLabels, formWidth-width-dd-2*bw-x-FUDGE_FACTOR, 0);
  1310. X  }
  1311. X
  1312. X  /* move the play buttons to the lower right of the play form */
  1313. X  count = 0;
  1314. X  XtSetArg(args[count], XtNwidth, &formWidth);  count++;
  1315. X  XtSetArg(args[count], XtNdefaultDistance, &dd);  count++;
  1316. X  XtGetValues(playForm, args, count);
  1317. X  count = 0;
  1318. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  1319. X  XtSetArg(args[count], XtNheight, &height);  count++;
  1320. X  XtSetArg(args[count], XtNx, &x);  count++;
  1321. X  XtSetArg(args[count], XtNy, &y);  count++;
  1322. X  XtSetArg(args[count], XtNborderWidth, &bw);  count++;
  1323. X  XtGetValues(commandArea, args, count);
  1324. X  count = 0;
  1325. X  XtSetArg(args[count], XtNx, formWidth-width-dd-2*bw);  count++;
  1326. X  XtSetValues(commandArea, args, count);
  1327. X  XtConfigureWidget(commandArea, formWidth-width-dd-2*bw, y,
  1328. X            width, height, bw);
  1329. X
  1330. X  positionTables();
  1331. X}
  1332. X
  1333. X/**********************************************************************/
  1334. X
  1335. Xenter_card(rank, suit)
  1336. Xint rank, suit;
  1337. X{
  1338. X  CardInfo *card, *ptr;
  1339. X
  1340. X  card = (CardInfo *) malloc(sizeof(CardInfo));
  1341. X  card->rank = rank;
  1342. X  card->suit = suit;
  1343. X  ptr = my_hand[suit].head;
  1344. X  while (ptr->next && ptr->next->rank > rank) {
  1345. X    ptr = ptr->next;
  1346. X  }
  1347. X  card->next = ptr->next;
  1348. X  ptr->next = card;
  1349. X  print_cards(suit);
  1350. X}
  1351. X
  1352. Xremove_card(rank, suit)
  1353. Xint rank, suit;
  1354. X{
  1355. X  CardInfo *card, *ptr;
  1356. X
  1357. X  ptr = my_hand[suit].head;
  1358. X  while (ptr->next) {
  1359. X    if (ptr->next->rank == rank) {
  1360. X      card = ptr->next;
  1361. X      ptr->next = card->next;
  1362. X      free((char *) card);
  1363. X      break;
  1364. X    } else {
  1365. X      ptr = ptr->next;
  1366. X    }
  1367. X  }
  1368. X  print_cards(suit);
  1369. X}
  1370. X
  1371. Xerase_window(window_num)
  1372. Xint window_num;
  1373. X{
  1374. X  if (window_num == PLAY_WINDOW) {
  1375. X/* if PLAY_WINDOW then save it for showing last */
  1376. X    lastCards[0] = playCards[0];
  1377. X    lastCards[1] = playCards[1];
  1378. X    lastCards[2] = playCards[2];
  1379. X    lastCards[3] = playCards[3];
  1380. X    strcpy(lastNames[0], playNames[0]);
  1381. X    strcpy(lastNames[1], playNames[1]);
  1382. X    strcpy(lastNames[2], playNames[2]);
  1383. X    strcpy(lastNames[3], playNames[3]);
  1384. X    playCards[0].rank = 0;
  1385. X    playCards[1].rank = 0;
  1386. X    playCards[2].rank = 0;
  1387. X    playCards[3].rank = 0;
  1388. X    playNames[0][0] = '\0';
  1389. X    playNames[1][0] = '\0';
  1390. X    playNames[2][0] = '\0';
  1391. X    playNames[3][0] = '\0';
  1392. X    XClearArea(XtDisplay(playArea), XtWindow(playArea), 0, 0,
  1393. X           0, 0, False);
  1394. X    count = 0;
  1395. X    XtSetArg(args[count], XtNlabel, " ");  count++;
  1396. X    XtSetValues(playLabels[0], args, count);
  1397. X    XtSetValues(playLabels[1], args, count);
  1398. X    XtSetValues(playLabels[2], args, count);
  1399. X    XtSetValues(playLabels[3], args, count);
  1400. X  } else if (window_num == TEXT_WINDOW) {
  1401. X    displayMessage("");
  1402. X  }
  1403. X}
  1404. X
  1405. Xread_card()
  1406. X{
  1407. X  setReadingCard(True);
  1408. X}
  1409. X
  1410. Xplay_card(player, rch, sch, msg)
  1411. Xint player, rch, sch;
  1412. Xchar *msg;
  1413. X{
  1414. X  playCards[player-1].rank = get_rank(rch);
  1415. X  playCards[player-1].suit = get_suit(sch);
  1416. X  if (!showOld) {
  1417. X    paint_card(XtWindow(playArea), (player-1)*STACK_WIDTH, 0,
  1418. X           convertRank(playCards[player-1].rank),
  1419. X           convertSuit(playCards[player-1].suit),
  1420. X           0);
  1421. X  }
  1422. X  if (*msg != '\0') {
  1423. X    strcpy(playNames[player-1], msg);
  1424. X    if (!showOld) {
  1425. X      count = 0;
  1426. X      XtSetArg(args[count], XtNlabel, msg);  count++;
  1427. X      XtSetValues(playLabels[player-1], args, count);
  1428. X    }
  1429. X  }
  1430. X  XSync(XtDisplay(playArea), False);
  1431. X  updateDisplay();
  1432. X  sleep(1);
  1433. X}
  1434. X
  1435. Xscore_points(player, pts, total_pts, msg)
  1436. Xint player, pts, total_pts;
  1437. Xchar *msg;
  1438. X{
  1439. X  char str[256];
  1440. X
  1441. X  count = 0;
  1442. X  XtSetArg(args[count], XtNlabel, msg);  count++;
  1443. X  XtSetValues(playerLabels[player], args, count);
  1444. X  sprintf(str, "%d  ", pts);
  1445. X  count = 0;
  1446. X  XtSetArg(args[count], XtNlabel, str);  count++;
  1447. X  XtSetValues(scoreLabels[player], args, count);
  1448. X  sprintf(str, "%d  ", total_pts);
  1449. X  count = 0;
  1450. X  XtSetArg(args[count], XtNlabel, str);  count++;
  1451. X  XtSetValues(totalLabels[player], args, count);
  1452. X}
  1453. X
  1454. Xdisplay_message(window_num, msg)
  1455. Xint window_num;
  1456. Xchar *msg;
  1457. X{
  1458. X  char *str, *str2;
  1459. X
  1460. X  if (window_num == MESG_WINDOW || window_num == PLAY_WINDOW) {
  1461. X    count = 0;
  1462. X    XtSetArg(args[count], XtNstring, &str);  count++;
  1463. X    XtGetValues(messageArea, args, count);
  1464. X    str2 = malloc(strlen(str)+strlen(msg)+2);
  1465. X    strcpy(str2, str);
  1466. X    strcat(str2, msg);
  1467. X    strcat(str2, "\n");
  1468. X    count = 0;
  1469. X    XtSetArg(args[count], XtNstring, str2);  count++;
  1470. X    XtSetValues(messageArea, args, count);
  1471. X    free(str2);
  1472. X    XtFree(str);
  1473. X  } else {
  1474. X    count = 0;
  1475. X    XtSetArg(args[count], XtNlabel, msg);  count++;
  1476. X    if (window_num == TEXT_WINDOW) {
  1477. X      XtSetValues(textArea, args, count);
  1478. X    } else if (window_num == ROUND_WINDOW) {
  1479. X      XtSetValues(roundLabel, args, count);
  1480. X    } else if (window_num == LEAD_WINDOW) {
  1481. X      XtSetValues(leadLabel, args, count);
  1482. X    }
  1483. X  }
  1484. X}
  1485. X
  1486. Xgame_is_over()
  1487. X{
  1488. X  Boolean buttonPressed;
  1489. X  XEvent event;
  1490. X
  1491. X  display_message(MESG_WINDOW,
  1492. X          "--------------------------------------------------------");
  1493. X  display_message(MESG_WINDOW, "");
  1494. X  display_message(MESG_WINDOW, "Click the left mouse button to continue...");
  1495. X
  1496. X  buttonPressed = False;
  1497. X  XGrabPointer(XtDisplay(messageArea), XtWindow(messageArea), True,
  1498. X           ButtonPressMask, GrabModeAsync, GrabModeAsync,
  1499. X           XtWindow(messageArea), None, CurrentTime);
  1500. X  while (!buttonPressed) {
  1501. X    if (XCheckTypedWindowEvent(XtDisplay(messageArea),
  1502. X                   XtWindow(messageArea),
  1503. X                   ButtonPress, &event)) {
  1504. X      XtDispatchEvent(&event);
  1505. X      XUngrabPointer(XtDisplay(messageArea), event.xbutton.time);
  1506. X      XSync(XtDisplay(messageArea), False);
  1507. X      buttonPressed = True;
  1508. X    }
  1509. X  }
  1510. X}
  1511. X
  1512. Xstart_game()
  1513. X{
  1514. X  XLowerWindow(XtDisplay(optionForm), XtWindow(optionForm));
  1515. X  XSync(XtDisplay(optionForm), False);
  1516. X  showOld = False;
  1517. X
  1518. X  playCards[0].rank = 0;
  1519. X  playCards[1].rank = 0;
  1520. X  playCards[2].rank = 0;
  1521. X  playCards[3].rank = 0;
  1522. X  playNames[0][0] = '\0';
  1523. X  playNames[1][0] = '\0';
  1524. X  playNames[2][0] = '\0';
  1525. X  playNames[3][0] = '\0';
  1526. X  lastCards[0].rank = 0;
  1527. X  lastCards[1].rank = 0;
  1528. X  lastCards[2].rank = 0;
  1529. X  lastCards[3].rank = 0;
  1530. X  lastNames[0][0] = '\0';
  1531. X  lastNames[1][0] = '\0';
  1532. X  lastNames[2][0] = '\0';
  1533. X  lastNames[3][0] = '\0';
  1534. X
  1535. X  count = 0;
  1536. X  XtSetArg(args[count], XtNstring, "");  count++;
  1537. X  XtSetValues(messageArea, args, count);
  1538. X}
  1539. X
  1540. X/*
  1541. X * Scan input for redraw screen requests or ':' messages.
  1542. X * Also scan socket for incoming commands.
  1543. X */
  1544. Xscan()
  1545. X{
  1546. X  static XEvent event;
  1547. X
  1548. X  XtAppNextEvent(appContext, &event);
  1549. X  XtDispatchEvent(&event);
  1550. X}
  1551. X
  1552. Xterminate()
  1553. X{
  1554. X  XtDestroyWidget(toplevel);
  1555. X}
  1556. X
  1557. X/*
  1558. X * show_table - display table which is position table_pos on screen.
  1559. X */
  1560. Xshow_table(cur_ptr, table_pos)
  1561. Xtable_ptr    cur_ptr;
  1562. Xint        table_pos;
  1563. X{
  1564. X  Dimension width, height, marginWidth, marginHeight, spacing;
  1565. X  Widget *widgets;
  1566. X  char str[256];
  1567. X  int each;
  1568. X
  1569. X  count = 0;
  1570. X  XtSetArg(args[count], XtNwidth, &width);  count++;
  1571. X  XtSetArg(args[count], XtNheight, &height);  count++;
  1572. X  marginWidth = 10;
  1573. X  marginHeight = 10;
  1574. X  spacing = 10;
  1575. X  XtGetValues(gamesRC, args, count);
  1576. X
  1577. X  if (!cur_ptr->data) {
  1578. X    widgets = (Widget *) malloc(8*sizeof(Widget));
  1579. X    count = 0;
  1580. X    XtSetArg(args[count], XtNresize, False);  count++;
  1581. X    XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1582. X    XtSetArg(args[count], XtNright, XawChainLeft);  count++;
  1583. X    XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1584. X    XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  1585. X    XtSetArg(args[count], XtNdefaultDistance, 0);  count++;
  1586. X    XtSetArg(args[count], XtNwidth, 10);  count++;
  1587. X    XtSetArg(args[count], XtNheight, 10);  count++;
  1588. X    widgets[0] = XtCreateManagedWidget("tableFrame", formWidgetClass,
  1589. X                       gamesRC, args, count);
  1590. X    count = 0;
  1591. X    XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1592. X    XtSetArg(args[count], XtNright, XawChainRight);  count++;
  1593. X    XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1594. X    XtSetArg(args[count], XtNbottom, XawChainBottom);  count++;
  1595. X    XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1596. X    XtSetArg(args[count], XtNresize, False);  count++;
  1597. X    XtSetArg(args[count], XtNdefaultDistance, 0);  count++;
  1598. X    XtSetArg(args[count], XtNwidth, 10);  count++;
  1599. X    XtSetArg(args[count], XtNheight, 10);  count++;
  1600. X    widgets[1] = XtCreateManagedWidget("tableW", formWidgetClass,
  1601. X                       widgets[0], args, count);
  1602. X    XtAddEventHandler(widgets[1], ButtonPressMask, False, tableSelect, NULL);
  1603. X    globalTableHeight = 0;
  1604. X    for (each=0; each<6; each++) {
  1605. X      count = 0;
  1606. X      XtSetArg(args[count], XtNlabel, " ");  count++;
  1607. X      XtSetArg(args[count], XtNborderWidth, 0);  count++;
  1608. X      XtSetArg(args[count], XtNresize, False);  count++;
  1609. X      XtSetArg(args[count], XtNleft, XawChainLeft);  count++;
  1610. X      XtSetArg(args[count], XtNright, XawChainRight);  count++;
  1611. X      XtSetArg(args[count], XtNtop, XawChainTop);  count++;
  1612. X      XtSetArg(args[count], XtNbottom, XawChainTop);  count++;
  1613. X      XtSetArg(args[count], XtNwidth, 10);  count++;
  1614. X      if (each) {
  1615. X    XtSetArg(args[count], XtNfromVert, widgets[each+1]);  count++;
  1616. X      }
  1617. X      widgets[each+2] = XtCreateManagedWidget("tableLabel", labelWidgetClass,
  1618. X                          widgets[1], args, count);
  1619. X      count = 0;
  1620. X      XtSetArg(args[count], XtNheight, &height);  count++;
  1621. X      XtGetValues(widgets[each+2], args, count);
  1622. X      globalTableHeight += height;
  1623. X    }
  1624. X    cur_ptr->data = (char *) widgets;
  1625. X  } else {
  1626. X    widgets = (Widget *) cur_ptr->data;
  1627. X    XtManageChild(widgets[0]);
  1628. X  }
  1629. X
  1630. X  sprintf(str, "Table %d", table_pos+1);
  1631. X  count = 0;
  1632. X  XtSetArg(args[count], XtNlabel, str);  count++;
  1633. X  XtSetValues(widgets[2], args, count);
  1634. X
  1635. X  if (cur_ptr->closed) {
  1636. X    count = 0;
  1637. X    XtSetArg(args[count], XtNlabel, "<game over>");  count++;
  1638. X    XtSetValues(widgets[3], args, count);
  1639. X    count = 0;
  1640. X    XtSetArg(args[count], XtNlabel, " ");  count++;
  1641. X    XtSetValues(widgets[4], args, count);
  1642. X    XtSetValues(widgets[5], args, count);
  1643. X    XtSetValues(widgets[6], args, count);
  1644. X    XtSetValues(widgets[7], args, count);
  1645. X  } else {
  1646. X    if (!cur_ptr->hand) {
  1647. X      sprintf(str, "<starting>");
  1648. X    } else {
  1649. X      sprintf(str, "Hand: %d  Round: %d", cur_ptr->hand, cur_ptr->round);
  1650. X    }
  1651. X    count = 0;
  1652. X    XtSetArg(args[count], XtNlabel, str);  count++;
  1653. X    XtSetValues(widgets[3], args, count);
  1654. X
  1655. X    for (each=0; each<4; each++) {
  1656. X      count = 0;
  1657. X      XtSetArg(args[count], XtNlabel, cur_ptr->player_name[each]);  count++;
  1658. X      XtSetValues(widgets[4+each], args, count);
  1659. X    }
  1660. X  }
  1661. X
  1662. X  /* Make the row column the right width */
  1663. X  count = 0;
  1664. X  XtSetArg(args[count], XtNwidth,
  1665. X       (width-2*marginWidth-NUM_TABLES_COLS*4-
  1666. X        (NUM_TABLES_COLS-1)*spacing)/NUM_TABLES_COLS);  count++;
  1667. X  for (each=2; each<8; each++) {
  1668. X    XtSetValues(widgets[each], args, count);
  1669. X  }
  1670. X}
  1671. X
  1672. X/*
  1673. X * show_tables - display up to NUM_TABLES tables starting with table # start_id.
  1674. X */
  1675. Xshow_tables(start_id)
  1676. Xint    start_id;
  1677. X{
  1678. X  table_ptr cur_ptr;
  1679. X  int cur_id, i;
  1680. X  char str[256];
  1681. X  Widget *widgets;
  1682. X  
  1683. X  XtSetSensitive(moreGames, (table_count > 8));
  1684. X  cur_ptr = first_table;
  1685. X  for (i=0; i<table_count; i++) {
  1686. X    if (cur_ptr->data) {
  1687. X      widgets = (Widget *) cur_ptr->data;
  1688. X      XtUnmanageChild(widgets[0]);
  1689. X    }
  1690. X    cur_ptr = cur_ptr->next_table;
  1691. X  }
  1692. X  count = 0;
  1693. X  if (table_count) {
  1694. X    sprintf(str, "Current Games (page %d of %d):",
  1695. X        (start_id + NUM_TABLES-1) / NUM_TABLES,
  1696. X        (table_count + NUM_TABLES-1) / NUM_TABLES);
  1697. X    XtSetArg(args[count], XtNlabel, str);  count++;
  1698. X  } else {
  1699. X    XtSetArg(args[count], XtNlabel, "Current Games:");  count++;
  1700. X  }
  1701. X  XtSetValues(gamesHeader, args, count);
  1702. X  cur_ptr = first_table;
  1703. X  for (cur_id = 1; cur_id < start_id; cur_id++) {
  1704. X    cur_ptr = cur_ptr->next_table;
  1705. X  }
  1706. X  XtUnmanageChild(gamesRC);
  1707. X  for (cur_id = 0; (cur_id < NUM_TABLES) && cur_ptr;
  1708. X       cur_ptr = cur_ptr->next_table) {
  1709. X    show_table(cur_ptr, cur_id++);
  1710. X  }
  1711. X  positionTables();
  1712. X  XtManageChild(gamesRC);
  1713. X}
  1714. X
  1715. Xoption_scan(another)
  1716. Xchar *another;
  1717. X{
  1718. X  XEvent event;
  1719. X
  1720. X  anotherPtr = another;
  1721. X  *anotherPtr = FALSE;
  1722. X  XtAppNextEvent(appContext, &event);
  1723. X  XtDispatchEvent(&event);
  1724. X}
  1725. X
  1726. Xoption_init()
  1727. X{
  1728. X  if (distId) {
  1729. X    XtRemoveInput(distId);
  1730. X  }
  1731. X  distId = XtAppAddInput(appContext, dist_socket,
  1732. X             (XtPointer) XtInputReadMask, distInput, NULL);
  1733. X  XtSetSensitive(anotherGame, !first_game);
  1734. X  XtSetSensitive(newGame, first_game);
  1735. X  XRaiseWindow(XtDisplay(optionForm), XtWindow(optionForm));
  1736. X  XSync(XtDisplay(optionForm), False);
  1737. X}
  1738. X
  1739. Xinit_socket()
  1740. X{
  1741. X  if (dealerId) {
  1742. X    XtRemoveInput(dealerId);
  1743. X  }
  1744. X  dealerId = XtAppAddInput(appContext, dealer_socket,
  1745. X               (XtPointer) XtInputReadMask, dealerInput, NULL);
  1746. X}
  1747. X
  1748. Xclose_socket(s)
  1749. Xint s;
  1750. X{
  1751. X  if (s == dealer_socket && dealerId) {
  1752. X    XtRemoveInput(dealerId);
  1753. X    dealerId = None;
  1754. X  } else if (s == dist_socket && distId) {
  1755. X    XtRemoveInput(distId);
  1756. X    distId = None;
  1757. X  }
  1758. X}
  1759. X
  1760. Xoption_clear()
  1761. X{
  1762. X  table_ptr cur_ptr;
  1763. X  int i;
  1764. X  Widget *widgets;
  1765. X
  1766. X  cur_ptr = first_table;
  1767. X  for (i=0; i<table_count; i++) {
  1768. X    if (cur_ptr->data) {
  1769. X      widgets = (Widget *) cur_ptr->data;
  1770. X      XtDestroyWidget(widgets[0]);
  1771. X      cur_ptr->data = NULL;
  1772. X    }
  1773. X    cur_ptr = cur_ptr->next_table;
  1774. X  }
  1775. X}
  1776. END_OF_FILE
  1777. if test 50694 -ne `wc -c <'xawclient.c'`; then
  1778.     echo shar: \"'xawclient.c'\" unpacked with wrong size!
  1779. fi
  1780. # end of 'xawclient.c'
  1781. fi
  1782. echo shar: End of archive 2 \(of 6\).
  1783. cp /dev/null ark2isdone
  1784. MISSING=""
  1785. for I in 1 2 3 4 5 6 ; do
  1786.     if test ! -f ark${I}isdone ; then
  1787.     MISSING="${MISSING} ${I}"
  1788.     fi
  1789. done
  1790. if test "${MISSING}" = "" ; then
  1791.     echo You have unpacked all 6 archives.
  1792.     rm -f ark[1-9]isdone
  1793. else
  1794.     echo You still need to unpack the following archives:
  1795.     echo "        " ${MISSING}
  1796. fi
  1797. ##  End of shell archive.
  1798. exit 0
  1799. --
  1800. Molecular Simulations, Inc.             mail: dcmartin@postgres.berkeley.edu
  1801. 796 N. Pastoria Avenue                  uucp: uwvax!ucbvax!dcmartin
  1802. Sunnyvale, California 94086             at&t: 408/522-9236
  1803.