home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #31 / NN_1992_31.iso / spool / alt / sources / 2895 < prev    next >
Encoding:
Text File  |  1992-12-29  |  55.5 KB  |  2,273 lines

  1. Newsgroups: alt.sources
  2. Path: sparky!uunet!elroy.jpl.nasa.gov!swrinde!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!eagle!sandman.lerc.nasa.gov!drich
  3. From: drich@sandman.lerc.nasa.gov (Daniel Rich)
  4. Subject: xcdplayer-2.2, Part (4/5) - X11 CD player for Sun and SGI
  5. Message-ID: <1992Dec28.225655.23538@eagle.lerc.nasa.gov>
  6. Sender: news@eagle.lerc.nasa.gov
  7. Nntp-Posting-Host: sandman.lerc.nasa.gov
  8. Organization: NASA Lewis Research Center
  9. Date: Mon, 28 Dec 1992 22:56:55 GMT
  10. Lines: 2261
  11.  
  12. Submitted-by: drich@lerc.nasa.gov
  13. Archive-name: xcdplayer-2.2/part04
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 4 (of 5)."
  22. # Contents:  xcdplayer-2.2/button_setup.c xcdplayer-2.2/cdrom_callb.c
  23. #   xcdplayer-2.2/program.c
  24. # Wrapped by drich@sandman on Mon Dec 28 17:30:38 1992
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -d 'xcdplayer-2.2' ; then
  27. :
  28. else
  29.   mkdir xcdplayer-2.2
  30. fi
  31. if test -f 'xcdplayer-2.2/button_setup.c' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/button_setup.c'\"
  33. else
  34. echo shar: Extracting \"'xcdplayer-2.2/button_setup.c'\" \(15741 characters\)
  35. sed "s/^X//" >'xcdplayer-2.2/button_setup.c' <<'END_OF_FILE'
  36. X/*
  37. X * Copyright (C) 1990 Regents of the University of California.
  38. X *
  39. X * Permission to use, copy, modify, distribute, and sell this software and
  40. X * its documentation for any purpose is hereby granted without fee,
  41. X * provided that the above copyright notice appear in all copies and that
  42. X * both that copyright notice and this permission notice appear in
  43. X * supporting documentation, and that the name of the University of
  44. X * California not be used in advertising or publicity pertaining to
  45. X * distribution of the software without specific, written prior
  46. X * permission.  the University of California makes no representations
  47. X * about the suitability of this software for any purpose.  It is provided
  48. X * "as is" without express or implied warranty.
  49. X */
  50. X
  51. X#include <stdio.h>
  52. X# include <X11/Intrinsic.h>
  53. X# include <X11/StringDefs.h>
  54. X# include <X11/Xaw/Form.h>
  55. X# include <X11/Xaw/Toggle.h>
  56. X
  57. X# include "cdrom_globs.h"
  58. X#ifdef sun
  59. X# include "cdrom_sun.h"
  60. X#endif
  61. X#ifdef sgi
  62. X# include "cdrom_sgi.h"
  63. X#endif
  64. X
  65. X# include "play.xbm"
  66. X# include "pause.xbm"
  67. X# include "stop.xbm"
  68. X# include "prev.xbm"
  69. X# include "next.xbm"
  70. X# include "eject.xbm"
  71. X#ifdef sgi
  72. X# include "audio.xbm"
  73. X#endif
  74. X
  75. X# include "quit.xbm"
  76. X# include "cycle.xbm"
  77. X# include "shuffle.xbm"
  78. X# include "rewind.xbm"
  79. X# include "ff.xbm"
  80. X# include "pgm.xbm"
  81. X
  82. X
  83. Xstatic Widget    buttons_form_widget;
  84. Xstatic Widget    play_button_widget;
  85. Xstatic Widget    stop_button_widget;
  86. Xstatic Widget    pause_button_widget;
  87. Xstatic Widget    eject_button_widget;
  88. X#ifdef sgi
  89. Xstatic Widget    audio_button_widget;
  90. X#endif
  91. Xstatic Widget    shuffle_button_widget;
  92. Xstatic Widget    cycle_button_widget;
  93. Xstatic Widget    pgm_button_widget;
  94. X
  95. X/* 
  96. X * these are global for the "scan" functions to query their state;
  97. X * they and the code that they work with should probably be be switched
  98. X * to repeater widgets once R5 becomes universal...
  99. X */
  100. XWidget    rew_button_widget;
  101. XWidget    ff_button_widget;
  102. X
  103. X
  104. Xvoid
  105. Xbutton_setup(parent_widget)
  106. X    Widget        parent_widget;
  107. X{
  108. X    Arg        args[1];
  109. X
  110. X    extern void    title_dialog_setup();
  111. X    extern void    play_button_setup();
  112. X    extern void    stop_button_setup();
  113. X    extern void    pause_button_setup();
  114. X    extern void    prev_button_setup();
  115. X    extern void    next_button_setup();
  116. X    extern void    eject_button_setup();
  117. X#ifdef sgi
  118. X    extern void    audio_button_setup();
  119. X#endif
  120. X    extern void    quit_button_setup();
  121. X    extern void    cycle_button_setup();
  122. X    extern void    shuffle_button_setup();
  123. X    extern void    rew_button_setup();
  124. X    extern void    ff_button_setup();
  125. X    extern void    pgm_button_setup();
  126. X    extern void    buttons_reset();
  127. X
  128. X
  129. X    buttons_form_widget = XtCreateManagedWidget("buttonsForm",
  130. X                            formWidgetClass,
  131. X                            parent_widget,
  132. X                            (ArgList) NULL, 0);
  133. X
  134. X    play_button_setup(buttons_form_widget);
  135. X
  136. X    pause_button_setup(buttons_form_widget);
  137. X
  138. X    stop_button_setup(buttons_form_widget);
  139. X
  140. X    prev_button_setup(buttons_form_widget);
  141. X
  142. X    next_button_setup(buttons_form_widget);
  143. X
  144. X    eject_button_setup(buttons_form_widget);
  145. X
  146. X#ifdef sgi
  147. X    audio_button_setup(buttons_form_widget);
  148. X#endif
  149. X
  150. X    quit_button_setup(buttons_form_widget);
  151. X
  152. X    cycle_button_setup(buttons_form_widget);
  153. X
  154. X    shuffle_button_setup(buttons_form_widget);
  155. X
  156. X    rew_button_setup(buttons_form_widget);
  157. X
  158. X    ff_button_setup(buttons_form_widget);
  159. X
  160. X    pgm_button_setup(buttons_form_widget);
  161. X
  162. X
  163. X    /* set the initial state of the buttons */
  164. X    buttons_reset();
  165. X}
  166. X
  167. Xstatic void
  168. Xplay_button_setup(parent_widget)
  169. X    Widget        parent_widget;
  170. X{
  171. X    Pixmap        play_button_pixmap;
  172. X    Arg        args[1];
  173. X
  174. X    play_button_widget = XtCreateManagedWidget("playButton",
  175. X                           toggleWidgetClass,
  176. X                           parent_widget,
  177. X                           (ArgList) NULL, 0);
  178. X
  179. X    play_button_pixmap = XCreateBitmapFromData(XtDisplay(play_button_widget),
  180. X                           rootwin(play_button_widget),
  181. X                           play_bits,
  182. X                           play_width, play_height);
  183. X
  184. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) play_button_pixmap);
  185. X    XtSetValues(play_button_widget, args, 1);
  186. X
  187. X    XtAddCallback(play_button_widget, XtNcallback, cb_cdrom_play, 0);
  188. X
  189. X}
  190. X
  191. Xstatic void
  192. Xpause_button_setup(parent_widget)
  193. X    Widget        parent_widget;
  194. X{
  195. X    Pixmap        pause_button_pixmap;
  196. X    Arg        args[1];
  197. X
  198. X    pause_button_widget = XtCreateManagedWidget("pauseButton",
  199. X                            toggleWidgetClass,
  200. X                            parent_widget,
  201. X                            (ArgList) NULL, 0);
  202. X
  203. X    pause_button_pixmap = XCreateBitmapFromData(XtDisplay(pause_button_widget),
  204. X                            rootwin(pause_button_widget),
  205. X                            pause_bits,
  206. X                            pause_width, pause_height);
  207. X
  208. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) pause_button_pixmap);
  209. X    XtSetValues(pause_button_widget, args, 1);
  210. X
  211. X    XtAddCallback(pause_button_widget, XtNcallback, cb_cdrom_pause, 0);
  212. X}
  213. X
  214. Xstatic void
  215. Xstop_button_setup(parent_widget)
  216. X    Widget        parent_widget;
  217. X{
  218. X    Pixmap        stop_button_pixmap;
  219. X    Arg        args[1];
  220. X
  221. X    stop_button_widget = XtCreateManagedWidget("stopButton",
  222. X                           toggleWidgetClass,
  223. X                           parent_widget,
  224. X                           (ArgList) NULL, 0);
  225. X
  226. X    stop_button_pixmap = XCreateBitmapFromData(XtDisplay(stop_button_widget),
  227. X                           rootwin(stop_button_widget),
  228. X                           stop_bits,
  229. X                           stop_width, stop_height);
  230. X
  231. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) stop_button_pixmap);
  232. X    XtSetValues(stop_button_widget, args, 1);
  233. X
  234. X    XtAddCallback(stop_button_widget, XtNcallback, cb_cdrom_stop, 0);
  235. X
  236. X}
  237. X
  238. Xstatic void
  239. Xprev_button_setup(parent_widget)
  240. X    Widget        parent_widget;
  241. X{
  242. X    Widget        prev_button_widget;
  243. X    Pixmap        prev_button_pixmap;
  244. X    Arg        args[1];
  245. X
  246. X    prev_button_widget = XtCreateManagedWidget("prevButton",
  247. X                          toggleWidgetClass,
  248. X                          parent_widget,
  249. X                          (ArgList) NULL, 0);
  250. X
  251. X    prev_button_pixmap = XCreateBitmapFromData(XtDisplay(prev_button_widget),
  252. X                          rootwin(prev_button_widget),
  253. X                          prev_bits,
  254. X                          prev_width, prev_height);
  255. X
  256. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) prev_button_pixmap);
  257. X    XtSetValues(prev_button_widget, args, 1);
  258. X
  259. X    XtAddCallback(prev_button_widget, XtNcallback, cb_cdrom_previous, 0);
  260. X}
  261. X
  262. Xstatic void
  263. Xnext_button_setup(parent_widget)
  264. X    Widget        parent_widget;
  265. X{
  266. X    Widget        next_button_widget;
  267. X    Pixmap        next_button_pixmap;
  268. X    Arg        args[1];
  269. X
  270. X    next_button_widget = XtCreateManagedWidget("nextButton",
  271. X                         toggleWidgetClass,
  272. X                         parent_widget,
  273. X                         (ArgList) NULL, 0);
  274. X
  275. X    next_button_pixmap = XCreateBitmapFromData(XtDisplay(next_button_widget),
  276. X                         rootwin(next_button_widget),
  277. X                         next_bits,
  278. X                         next_width, next_height);
  279. X
  280. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) next_button_pixmap);
  281. X    XtSetValues(next_button_widget, args, 1);
  282. X
  283. X    XtAddCallback(next_button_widget, XtNcallback, cb_cdrom_next, 0);
  284. X}
  285. X
  286. Xstatic void
  287. Xeject_button_setup(parent_widget)
  288. X    Widget        parent_widget;
  289. X{
  290. X    Pixmap        eject_button_pixmap;
  291. X    Arg        args[1];
  292. X
  293. X    eject_button_widget = XtCreateManagedWidget("ejectButton",
  294. X                            toggleWidgetClass,
  295. X                            parent_widget,
  296. X                            (ArgList) NULL, 0);
  297. X
  298. X    eject_button_pixmap = XCreateBitmapFromData(XtDisplay(eject_button_widget),
  299. X                            rootwin(eject_button_widget),
  300. X                            eject_bits,
  301. X                            eject_width, eject_height);
  302. X
  303. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) eject_button_pixmap);
  304. X    XtSetValues(eject_button_widget, args, 1);
  305. X
  306. X    XtAddCallback(eject_button_widget, XtNcallback, cb_cdrom_eject, 0);
  307. X}
  308. X
  309. X#ifdef sgi
  310. Xstatic void
  311. Xaudio_button_setup(parent_widget)
  312. X    Widget        parent_widget;
  313. X{
  314. X    Pixmap        audio_button_pixmap;
  315. X    Arg        args[1];
  316. X
  317. X    audio_button_widget = XtCreateManagedWidget("audioButton",
  318. X                            toggleWidgetClass,
  319. X                            parent_widget,
  320. X                            (ArgList) NULL, 0);
  321. X
  322. X    audio_button_pixmap = XCreateBitmapFromData(XtDisplay(audio_button_widget),
  323. X                            rootwin(audio_button_widget),
  324. X                            audio_bits,
  325. X                            audio_width, audio_height);
  326. X
  327. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) audio_button_pixmap);
  328. X    XtSetValues(audio_button_widget, args, 1);
  329. X
  330. X    XtAddCallback(audio_button_widget, XtNcallback, cb_cdrom_audio, 0);
  331. X}
  332. X#endif
  333. X
  334. Xstatic void
  335. Xquit_button_setup(parent_widget)
  336. X    Widget        parent_widget;
  337. X{
  338. X    Widget        quit_button_widget;
  339. X    Pixmap        quit_button_pixmap;
  340. X    Arg        args[1];
  341. X
  342. X    quit_button_widget = XtCreateManagedWidget("quitButton",
  343. X                            toggleWidgetClass,
  344. X                            parent_widget,
  345. X                            (ArgList) NULL, 0);
  346. X
  347. X    quit_button_pixmap = XCreateBitmapFromData(XtDisplay(quit_button_widget),
  348. X                            rootwin(quit_button_widget),
  349. X                            quit_bits,
  350. X                            quit_width, quit_height);
  351. X
  352. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) quit_button_pixmap);
  353. X    XtSetValues(quit_button_widget, args, 1);
  354. X
  355. X    XtAddCallback(quit_button_widget, XtNcallback, cb_cdrom_quit, 0);
  356. X}
  357. X
  358. Xstatic void
  359. Xcycle_button_setup(parent_widget)
  360. X    Widget        parent_widget;
  361. X{
  362. X    Widget        cycle_button_widget;
  363. X    Pixmap        cycle_button_pixmap;
  364. X    Arg        args[1];
  365. X
  366. X    cycle_button_widget = XtCreateManagedWidget("cycleButton",
  367. X                            toggleWidgetClass,
  368. X                            parent_widget,
  369. X                            (ArgList) NULL, 0);
  370. X
  371. X    cycle_button_pixmap = XCreateBitmapFromData(XtDisplay(cycle_button_widget),
  372. X                            rootwin(cycle_button_widget),
  373. X                            cycle_bits,
  374. X                            cycle_width, cycle_height);
  375. X
  376. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) cycle_button_pixmap);
  377. X    XtSetValues(cycle_button_widget, args, 1);
  378. X
  379. X    XtAddCallback(cycle_button_widget, XtNcallback, cb_cdrom_cycle, 0);
  380. X}
  381. X
  382. Xstatic void
  383. Xshuffle_button_setup(parent_widget)
  384. X    Widget        parent_widget;
  385. X{
  386. X    Pixmap        shuffle_button_pixmap;
  387. X    Arg        args[1];
  388. X
  389. X    shuffle_button_widget = XtCreateManagedWidget("shuffleButton",
  390. X                              toggleWidgetClass,
  391. X                              parent_widget,
  392. X                              (ArgList) NULL, 0);
  393. X
  394. X    shuffle_button_pixmap = XCreateBitmapFromData(XtDisplay(shuffle_button_widget),
  395. X                              rootwin(shuffle_button_widget),
  396. X                              shuffle_bits,
  397. X                              shuffle_width, shuffle_height);
  398. X
  399. X    XtSetArg(args[0], XtNbitmap, (XtArgVal) shuffle_button_pixmap);
  400. X    XtSetValues(shuffle_button_widget, args, 1);
  401. X
  402. X    XtAddCallback(shuffle_button_widget, XtNcallback, cb_cdrom_shuffle, 0);
  403. X}
  404. X
  405. X
  406. Xstatic void
  407. Xrew_button_setup(parent_widget)
  408. X        Widget          parent_widget;
  409. X{
  410. X        Pixmap          rew_button_pixmap;
  411. X        Arg             args[1];
  412. X
  413. X        rew_button_widget = XtCreateManagedWidget("rewButton",
  414. X                                                  toggleWidgetClass,
  415. X                                                  parent_widget,
  416. X                                                  (ArgList) NULL, 0);
  417. X
  418. X        rew_button_pixmap = XCreateBitmapFromData(XtDisplay(rew_button_widget),
  419. X                                                  rootwin(rew_button_widget),
  420. X                                                  rewind_bits,
  421. X                                                  rewind_width, rewind_height);
  422. X
  423. X        XtSetArg(args[0], XtNbitmap, (XtArgVal) rew_button_pixmap);
  424. X        XtSetValues(rew_button_widget, args, 1);
  425. X
  426. X        XtAddCallback(rew_button_widget, XtNcallback, cb_cdrom_rewind, 0);
  427. X}
  428. X
  429. X
  430. X
  431. Xstatic void
  432. Xff_button_setup(parent_widget)
  433. X        Widget          parent_widget;
  434. X{
  435. X        Pixmap          ff_button_pixmap;
  436. X        Arg             args[1];
  437. X
  438. X        ff_button_widget = XtCreateManagedWidget("ffButton",
  439. X                                                 toggleWidgetClass,
  440. X                                                 parent_widget,
  441. X                                                 (ArgList) NULL, 0);
  442. X
  443. X        ff_button_pixmap = XCreateBitmapFromData(XtDisplay(ff_button_widget),
  444. X                                                 rootwin(ff_button_widget),
  445. X                                                 ff_bits,
  446. X                                                 ff_width, ff_height);
  447. X
  448. X        XtSetArg(args[0], XtNbitmap, (XtArgVal) ff_button_pixmap);
  449. X        XtSetValues(ff_button_widget, args, 1);
  450. X
  451. X        XtAddCallback(ff_button_widget, XtNcallback, cb_cdrom_ff, 0);
  452. X}
  453. X
  454. Xstatic void
  455. Xpgm_button_setup(parent_widget)
  456. X        Widget          parent_widget;
  457. X{
  458. X        Pixmap          pgm_button_pixmap;
  459. X        Arg             args[1];
  460. X    extern Widget    top_form;
  461. X
  462. X        pgm_button_widget = XtCreateManagedWidget("pgmButton",
  463. X                                                 toggleWidgetClass,
  464. X                                                 parent_widget,
  465. X                                                 (ArgList) NULL, 0);
  466. X
  467. X        pgm_button_pixmap = XCreateBitmapFromData(XtDisplay(pgm_button_widget),
  468. X                                                 rootwin(pgm_button_widget),
  469. X                                                 pgm_bits,
  470. X                                                 pgm_width, pgm_height);
  471. X
  472. X        XtSetArg(args[0], XtNbitmap, (XtArgVal) pgm_button_pixmap);
  473. X        XtSetValues(pgm_button_widget, args, 1);
  474. X
  475. X        XtAddCallback(pgm_button_widget, XtNcallback, cb_cdrom_program,
  476. X        (XtPointer) top_form);
  477. X}
  478. X
  479. Xvoid
  480. Xplay_button_set() {
  481. X    Arg        args[1];
  482. X
  483. X    XtSetArg(args[0], XtNstate, True);
  484. X    XtSetValues(play_button_widget, args, 1);
  485. X}
  486. X
  487. Xvoid
  488. Xplay_button_reset() {
  489. X    Arg        args[1];
  490. X
  491. X    XtSetArg(args[0], XtNstate, False);
  492. X    XtSetValues(play_button_widget, args, 1);
  493. X}
  494. X
  495. Xvoid
  496. Xpause_button_reset() {
  497. X    Arg        args[1];
  498. X
  499. X    XtSetArg(args[0], XtNstate, False);
  500. X    XtSetValues(pause_button_widget, args, 1);
  501. X}
  502. X
  503. Xvoid
  504. Xstop_button_reset() {
  505. X    Arg        args[1];
  506. X
  507. X    XtSetArg(args[0], XtNstate, False);
  508. X    XtSetValues(stop_button_widget, args, 1);
  509. X}
  510. X
  511. Xvoid
  512. Xeject_button_reset() {
  513. X    Arg        args[1];
  514. X
  515. X    XtSetArg(args[0], XtNstate, False);
  516. X    XtSetValues(eject_button_widget, args, 1);
  517. X}
  518. X
  519. Xvoid
  520. Xeject_button_set() {
  521. X    Arg        args[1];
  522. X
  523. X    XtSetArg(args[0], XtNstate, True);
  524. X    XtSetValues(eject_button_widget, args, 1);
  525. X}
  526. X
  527. X#ifdef sgi
  528. Xvoid
  529. Xaudio_button_reset() {
  530. X    Arg        args[1];
  531. X
  532. X    XtSetArg(args[0], XtNstate, False);
  533. X    XtSetValues(audio_button_widget, args, 1);
  534. X}
  535. X
  536. Xvoid
  537. Xaudio_button_set() {
  538. X    Arg        args[1];
  539. X
  540. X    XtSetArg(args[0], XtNstate, True);
  541. X    XtSetValues(audio_button_widget, args, 1);
  542. X}
  543. X
  544. Xint
  545. Xaudio_button_state() {
  546. X    Arg        args[1];
  547. X    Boolean        state;
  548. X
  549. X    XtSetArg(args[0], XtNstate, &state);
  550. X    XtGetValues(audio_button_widget, args, 1);
  551. X    return(state);
  552. X}
  553. X#endif
  554. X
  555. Xvoid
  556. Xshuffle_button_set() {
  557. X    Arg        args[1];
  558. X
  559. X    XtSetArg(args[0], XtNstate, True);
  560. X    XtSetValues(shuffle_button_widget, args, 1);
  561. X}
  562. X
  563. Xvoid
  564. Xshuffle_button_reset() {
  565. X    Arg        args[1];
  566. X
  567. X    XtSetArg(args[0], XtNstate, False);
  568. X    XtSetValues(shuffle_button_widget, args, 1);
  569. X}
  570. X
  571. Xvoid
  572. Xcycle_button_reset() {
  573. X    Arg        args[1];
  574. X
  575. X    XtSetArg(args[0], XtNstate, False);
  576. X    XtSetValues(cycle_button_widget, args, 1);
  577. X}
  578. X
  579. Xvoid
  580. Xpgm_button_set() {
  581. X    Arg        args[2];
  582. X
  583. X    XtSetArg(args[0], XtNstate, True);
  584. X    XtSetValues(pgm_button_widget, args, 1);
  585. X}
  586. X
  587. Xvoid
  588. Xpgm_button_reset() {
  589. X    Arg        args[2];
  590. X
  591. X    XtSetArg(args[0], XtNstate, False);
  592. X    XtSetValues(pgm_button_widget, args, 1);
  593. X}
  594. X
  595. Xvoid
  596. Xbuttons_reset() {
  597. X    Arg        args[2];
  598. X#ifdef sun
  599. X    Boolean        state;
  600. X#endif
  601. X
  602. X#ifdef sgi
  603. X    if (cdi.scsi_audio) {
  604. X        XtSetArg(args[0], XtNstate, True);
  605. X        XtSetValues(audio_button_widget, args, 1);
  606. X    } else {
  607. X        XtSetArg(args[0], XtNstate, False);
  608. X        XtSetValues(audio_button_widget, args, 1);
  609. X    }
  610. X#endif
  611. X
  612. X    switch (cdrom_status()) {
  613. X    case -1:
  614. X        XtSetArg(args[0], XtNstate, True);
  615. X        XtSetValues(eject_button_widget, args, 1);
  616. X        cdi.state |= CDROM_STATE_EJECTED;
  617. X        disc_title = NODISCSTR;
  618. X        update_title();
  619. X        break;
  620. X
  621. X    case CDROM_PLAYING:
  622. X        XtSetArg(args[0], XtNstate, True);
  623. X        XtSetValues(play_button_widget, args, 1);
  624. X        cdi.state |= CDROM_STATE_PLAY;
  625. X        cdrom_timer_on();
  626. X        break;
  627. X
  628. X    case CDROM_PAUSED:
  629. X#ifdef sun
  630. X        /* 
  631. X         * The Sun doesn't have a "stop" state, so handle the
  632. X         * initial startup condition.
  633. X         */
  634. X        XtSetArg(args[0], XtNstate, &state);
  635. X        XtGetValues(pause_button_widget, args, 1);
  636. X        if (state == False) {
  637. X            XtSetArg(args[0], XtNstate, True);
  638. X            XtSetValues(stop_button_widget, args, 1);
  639. X            cdi.state |= CDROM_STATE_STOP;
  640. X            break;
  641. X        } 
  642. X#endif
  643. X        XtSetArg(args[0], XtNstate, True);
  644. X        XtSetValues(play_button_widget, args, 1);
  645. X        XtSetArg(args[0], XtNstate, True);
  646. X        XtSetValues(pause_button_widget, args, 1);
  647. X        cdi.state |= CDROM_STATE_PLAY;
  648. X        cdi.curtrack = cdrom_get_curtrack();
  649. X        track_button_update(); /* make track button read on startup */
  650. X        timer_button_update(); /* make timer button read on startup */
  651. X        cdi.state |= CDROM_STATE_PAUSE;
  652. X        break;
  653. X
  654. X    default:
  655. X        XtSetArg(args[0], XtNstate, True);
  656. X        XtSetValues(stop_button_widget, args, 1);
  657. X        cdi.state |= CDROM_STATE_STOP;
  658. X        break;
  659. X    }
  660. X}
  661. END_OF_FILE
  662. if test 15741 -ne `wc -c <'xcdplayer-2.2/button_setup.c'`; then
  663.     echo shar: \"'xcdplayer-2.2/button_setup.c'\" unpacked with wrong size!
  664. fi
  665. # end of 'xcdplayer-2.2/button_setup.c'
  666. fi
  667. if test -f 'xcdplayer-2.2/cdrom_callb.c' -a "${1}" != "-c" ; then 
  668.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/cdrom_callb.c'\"
  669. else
  670. echo shar: Extracting \"'xcdplayer-2.2/cdrom_callb.c'\" \(17018 characters\)
  671. sed "s/^X//" >'xcdplayer-2.2/cdrom_callb.c' <<'END_OF_FILE'
  672. X/*
  673. X * Copyright (C) 1990 Regents of the University of California.
  674. X *
  675. X * Permission to use, copy, modify, distribute, and sell this software and
  676. X * its documentation for any purpose is hereby granted without fee,
  677. X * provided that the above copyright notice appear in all copies and that
  678. X * both that copyright notice and this permission notice appear in
  679. X * supporting documentation, and that the name of the University of
  680. X * California not be used in advertising or publicity pertaining to
  681. X * distribution of the software without specific, written prior
  682. X * permission.  the University of California makes no representations
  683. X * about the suitability of this software for any purpose.  It is provided
  684. X * "as is" without express or implied warranty.
  685. X */
  686. X
  687. X# include <X11/Intrinsic.h>
  688. X# include <X11/StringDefs.h>
  689. X# include <X11/Xaw/Form.h>
  690. X# include <X11/Xaw/Toggle.h>
  691. X
  692. X# include <stdio.h>
  693. X
  694. X# include "debug.h"
  695. X# include "cdrom_globs.h"
  696. X#ifdef sun
  697. X# include "cdrom_sun.h"
  698. X#endif
  699. X#ifdef sgi
  700. X# include "cdrom_sgi.h"
  701. X#endif
  702. X
  703. Xvoid        cdrom_new_disc();
  704. X
  705. X/*
  706. X * cb_cdrom_play checks to see if we're playing; if so do nothing.
  707. X * if not playing turns on playing.  if paused then return.
  708. X * otherwise start cd playing.
  709. X */
  710. X/*ARGSUSED*/
  711. Xvoid
  712. Xcb_cdrom_play(widget, client_data, call_data)
  713. X    Widget        widget;
  714. X    XtPointer    client_data;
  715. X    XtPointer    call_data;
  716. X{
  717. X    if (cdrom_open() == -1) {
  718. X        debug_printf(1, "cb_cdrom_play: error from cdrom_open\n");
  719. X        /* Turn the play button back off */
  720. X        play_button_reset();
  721. X        eject_button_set();
  722. X        return;
  723. X    }
  724. X
  725. X    if (cdi.state & CDROM_STATE_EJECTED) {
  726. X        cdrom_new_disc(widget);
  727. X    }
  728. X
  729. X    /* 
  730. X     * toggle button weirdness; play and stop are radio toggles, ie. if
  731. X     * you hit stop, and you are playing, play is supposed to stop, so
  732. X     * toggle buttons automatically invoke the notify procedure of other
  733. X     * members of a toggle group when another member of the toggle group
  734. X     * is activated, before the requested notification takes place. 
  735. X     * The practical upshot of this is that this routine can be called
  736. X     * even if you didn't press play, and so it really takes no action.
  737. X     */
  738. X    if (cdi.state & CDROM_STATE_PLAY) {
  739. X        debug_printf(1, "cb_cdrom_play: already playing track %d\n",
  740. X                cdi.curtrack);
  741. X        return;
  742. X    }
  743. X
  744. X    if (cdi.curtrack == 0)     /* (no track selected) */
  745. X    {
  746. X        cdi.curtrack = cdi.mintrack;
  747. X        track_button_update();
  748. X    }
  749. X
  750. X    cdi.state |= CDROM_STATE_PLAY;
  751. X
  752. X    if (cdi.state & CDROM_STATE_PAUSE) {
  753. X        debug_printf(1, "cb_cdrom_play: paused on track %d\n",
  754. X                cdi.curtrack);
  755. X        return;
  756. X    }
  757. X
  758. X    timer_fsecs = 0;
  759. X    cdi.duration = 0;
  760. X
  761. X    if (cdi.state & CDROM_STATE_SHUFFLE) 
  762. X        cdi.curtrack = shuffle_next_track();
  763. X
  764. X    else if (cdi.state & CDROM_STATE_PROGRAM)
  765. X    {
  766. X        if ((cdi.curtrack = program_resume()) == 0) {
  767. X
  768. X        /* cancel program */
  769. X        debug_printf(1, "cb_cdrom_play: cancelling program\n");
  770. X        program_cancel();
  771. X            cdi.curtrack = cdi.mintrack;
  772. X        }
  773. X        else {
  774. X        debug_printf(1, "cb_cdrom_play: resetting timer button\n");
  775. X            timer_button_reset();
  776. X        }
  777. X    }
  778. X
  779. X    if (cdrom_play() != -1) {
  780. X        cdi.state &= ~CDROM_STATE_STOP;
  781. X    }
  782. X
  783. X    timer_button_update();
  784. X}
  785. X
  786. X/*
  787. X * cb_cdrom_pause toggles pausing on or off.
  788. X */
  789. X/*ARGSUSED*/
  790. Xvoid
  791. Xcb_cdrom_pause(widget, client_data, call_data)
  792. X    Widget        widget;
  793. X    XtPointer    client_data;
  794. X    XtPointer    call_data;
  795. X
  796. X{
  797. X    if (cdrom_open() == -1) {
  798. X        debug_printf(1, "cb_cdrom_pause: error from cdrom_open\n");
  799. X        pause_button_reset();
  800. X        return;
  801. X    }
  802. X
  803. X#ifdef sgi
  804. X    if (cdrom_status() == CDROM_NO_STATUS) {
  805. X        cdi.state |= CDROM_STATE_EJECTED;
  806. X        buttons_reset();
  807. X        pause_button_reset();
  808. X        return;
  809. X    }
  810. X#endif
  811. X
  812. X    if (cdi.state & CDROM_STATE_EJECTED) {
  813. X        cdrom_new_disc(widget);
  814. X    }
  815. X
  816. X    if (cdi.state & CDROM_STATE_PAUSE) {
  817. X        cdi.state &= ~CDROM_STATE_PAUSE;
  818. X
  819. X        if (cdi.state & CDROM_STATE_PROGRAM) 
  820. X            cdi.curtrack = program_resume();
  821. X
  822. X        else if (cdi.curtrack == 0)     /* (no track selected) */
  823. X        {
  824. X            cdi.curtrack = cdi.mintrack;
  825. X            track_button_update();
  826. X        }
  827. X
  828. X        debug_printf(1, "cb_cdrom_pause: resuming track %d\n",
  829. X                cdi.curtrack);
  830. X
  831. X        /*
  832. X         * if we use next or prev after a pause we can't
  833. X         * just resume but have to move to the track.
  834. X         */
  835. X        if ((cdi.curtrack == cdrom_get_curtrack())  &&
  836. X            (cdi.duration > 0))
  837. X        {
  838. X            if (cdrom_resume() != -1) {
  839. X                cdi.state &= ~CDROM_STATE_EJECTED;
  840. X                eject_button_reset();
  841. X                cdi.state &= ~CDROM_STATE_STOP;
  842. X            }
  843. X
  844. X            cdrom_timer_on();
  845. X
  846. X            return;
  847. X        }
  848. X
  849. X        if (cdrom_play() != -1) {
  850. X            cdi.state &= ~CDROM_STATE_EJECTED;
  851. X            eject_button_reset();
  852. X            cdi.state &= ~CDROM_STATE_STOP;
  853. X        }
  854. X
  855. X        return;
  856. X    }
  857. X
  858. X    cdi.state |= CDROM_STATE_PAUSE;
  859. X
  860. X    debug_printf(1, "cb_cdrom_pause: pausing on track %d\n",
  861. X            cdi.curtrack);
  862. X
  863. X    if (cdrom_pause() != -1) {
  864. X        cdi.state &= ~CDROM_STATE_STOP;
  865. X        cdi.state |= CDROM_STATE_PLAY;
  866. X        eject_button_reset();
  867. X        play_button_set();
  868. X    }
  869. X
  870. X    cdrom_timer_off();
  871. X}
  872. X
  873. X/*
  874. X * cb_cdrom_stop checks to see if we're playing; if not then
  875. X * do nothing.  sets the current track to the first audio track.
  876. X * turns off play, pause, stops the cd, and closes it so that the
  877. X * disc can be ejected with the eject button on the drive.
  878. X */
  879. X/*ARGSUSED*/
  880. Xvoid
  881. Xcb_cdrom_stop(widget, client_data, call_data)
  882. X    Widget        widget;
  883. X    XtPointer    client_data;
  884. X    XtPointer    call_data;
  885. X{
  886. X    Arg    args[1];
  887. X    Boolean    state;
  888. X
  889. X    if (cdrom_open() == -1) {
  890. X        debug_printf(1, "cb_cdrom_stop: error from cdrom_open\n");
  891. X        /* Turn the stop button back off */
  892. X        stop_button_reset();
  893. X        eject_button_set();
  894. X        return;
  895. X    }
  896. X
  897. X#ifdef sgi
  898. X    if (cdrom_status() == CDROM_NO_STATUS) {
  899. X        cdi.state |= CDROM_STATE_EJECTED;
  900. X        buttons_reset();
  901. X        /* Turn the stop button back off */
  902. X        stop_button_reset();
  903. X        return;
  904. X    }
  905. X#endif
  906. X
  907. X    /* toggle button weirdness; see comment in cb_cdrom_play for details */
  908. X    XtSetArg(args[0], XtNstate, &state);
  909. X    XtGetValues(widget, args, 1);
  910. X
  911. X    if (state == False) {
  912. X        debug_printf(1, "cb_cdrom_stop: already stopped\n");
  913. X        return;
  914. X    }
  915. X
  916. X    debug_printf(1, "cb_cdrom_stop: resetting disc\n");
  917. X
  918. X    cdrom_reset();
  919. X
  920. X    if (cdi.state & CDROM_STATE_SHUFFLE) {
  921. X        debug_printf(1, "cb_cdrom_shuffle: shuffle on\n");
  922. X        cdi.state |= CDROM_STATE_SHUFFLE;
  923. X        shuffle_setup();
  924. X    }
  925. X}
  926. X
  927. X/*
  928. X * cb_cdrom_previous decrments the current track.  if paused or stopped
  929. X * then return.  otherwise start playing the (new) current track.
  930. X */
  931. X/*ARGSUSED*/
  932. Xvoid
  933. Xcb_cdrom_previous(widget, client_data, call_data)
  934. X    Widget        widget;
  935. X    XtPointer    client_data;
  936. X    XtPointer    call_data;
  937. X{
  938. X    if (cdrom_open() == -1) {
  939. X        debug_printf(1, "cb_cdrom_previous: error from cdrom_open\n");
  940. X        return;
  941. X    }
  942. X
  943. X#ifdef sgi
  944. X    if (cdrom_status() == CDROM_NO_STATUS) {
  945. X        cdi.state |= CDROM_STATE_EJECTED;
  946. X        buttons_reset();
  947. X        return;
  948. X    }
  949. X#endif
  950. X
  951. X    cdi.state &= ~CDROM_STATE_EJECTED;
  952. X    eject_button_reset();
  953. X    cdi.state &= ~CDROM_STATE_STOP;
  954. X
  955. X    cdrom_timer_off();
  956. X
  957. X    /*
  958. X     * if playing less than replayThreshold seconds, back up to 
  959. X     * previous track; otherwise start at beginning of current track:
  960. X     */
  961. X    if (cdi.duration < replayThreshold)
  962. X    {
  963. X        if ((cdi.program != NULL) &&
  964. X             (cdi.state & CDROM_STATE_PLAY) &&
  965. X         ((cdi.state & CDROM_STATE_PAUSE) == 0))
  966. X        {
  967. X            if (program_prev_track() == 0) 
  968. X                debug_printf(1, "cb_cdrom_previous: no previous selections in program\n");
  969. X            else
  970. X        {
  971. X                 debug_printf(1, "cb_cdrom_previous: going to prev selection\n");
  972. X             cdi.curtrack = program_goto_prev_track();
  973. X        }
  974. X        }
  975. X        else if (cdi.curtrack > cdi.mintrack) /* can't go below 1st track:*/
  976. X            cdi.curtrack--;
  977. X    }
  978. X
  979. X    timer_fsecs = 0;
  980. X    cdi.duration = 0;
  981. X
  982. X    if (cdi.state & CDROM_STATE_SHUFFLE)
  983. X        cdi.curtrack = shuffle_prev_track();
  984. X
  985. X    track_button_update();
  986. X    timer_button_update();
  987. X
  988. X    if (cdi.state & CDROM_STATE_PAUSE) {
  989. X        debug_printf(1, "cb_cdrom_previous: paused on track %d\n",
  990. X                cdi.curtrack);
  991. X        if (cdrom_play() != -1) {
  992. X            cdi.state &= ~CDROM_STATE_STOP;
  993. X        }
  994. X        if (cdrom_pause() != -1) {
  995. X            cdi.state &= ~CDROM_STATE_STOP;
  996. X        }
  997. X        cdrom_timer_off();
  998. X        return;
  999. X    }
  1000. X
  1001. X    if ((cdi.state & CDROM_STATE_PLAY) == 0) {
  1002. X        debug_printf(1, "cb_cdrom_previous: stopped on track %d\n",
  1003. X                cdi.curtrack);
  1004. X        return;
  1005. X    }
  1006. X
  1007. X    debug_printf(1, "cb_cdrom_previous: playing track %d\n",
  1008. X             cdi.curtrack);
  1009. X
  1010. X
  1011. X    /* restart playing if not paused and currently playing */
  1012. X    (void) cdrom_play();
  1013. X}
  1014. X
  1015. X
  1016. X/*
  1017. X * cb_cdrom_next incrments the current track.  if paused or stopped
  1018. X * then return.  otherwise start playing the (new) current track.
  1019. X */
  1020. X/*ARGSUSED*/
  1021. Xvoid
  1022. Xcb_cdrom_next(widget, client_data, call_data)
  1023. X    Widget        widget;
  1024. X    XtPointer    client_data;
  1025. X    XtPointer    call_data;
  1026. X{
  1027. X    if (cdrom_open() == -1) {
  1028. X        debug_printf(1, "cb_cdrom_next: error from cdrom_open\n");
  1029. X        return;
  1030. X    }
  1031. X
  1032. X#ifdef sgi
  1033. X    if (cdrom_status() == CDROM_NO_STATUS) {
  1034. X        cdi.state |= CDROM_STATE_EJECTED;
  1035. X        buttons_reset();
  1036. X        return;
  1037. X    }
  1038. X#endif
  1039. X
  1040. X    if (cdi.state & CDROM_STATE_EJECTED) {
  1041. X        cdrom_new_disc(widget);
  1042. X    }
  1043. X
  1044. X    cdi.state &= ~CDROM_STATE_EJECTED;
  1045. X    eject_button_reset();
  1046. X    cdi.state &= ~CDROM_STATE_STOP;
  1047. X
  1048. X    if (cdi.state & CDROM_STATE_SHUFFLE) {
  1049. X        if (cdi.currand == cdi.ntracks) {
  1050. X            debug_printf(1, "cb_cdrom_next: at last track\n");
  1051. X            return;
  1052. X        }
  1053. X    }
  1054. X    else if ((cdi.program != NULL) &&
  1055. X             (cdi.state & CDROM_STATE_PLAY) &&
  1056. X         ((cdi.state & CDROM_STATE_PAUSE) == 0))
  1057. X    {
  1058. X        if (program_next_track() == 0)
  1059. X            debug_printf(1, "cb_cdrom_next: no further selections in program\n");
  1060. X        else
  1061. X        {
  1062. X            debug_printf(1, "cb_cdrom_next: going to next selection\n");
  1063. X            cdi.curtrack = program_goto_next_track();
  1064. X        }
  1065. X    }
  1066. X    else {
  1067. X        if (cdi.curtrack >= cdi.maxtrack) {
  1068. X            debug_printf(1, "cb_cdrom_next: at last track\n");
  1069. X            return;
  1070. X        }
  1071. X        else
  1072. X            cdi.curtrack++;
  1073. X    }
  1074. X
  1075. X    cdrom_timer_off();
  1076. X
  1077. X    timer_fsecs = 0;
  1078. X    cdi.duration = 0;
  1079. X
  1080. X
  1081. X    track_button_update();
  1082. X    timer_button_update();
  1083. X
  1084. X    if (cdi.state & CDROM_STATE_PAUSE) {
  1085. X        debug_printf(1, "cb_cdrom_next: paused on track %d\n",
  1086. X                cdi.curtrack);
  1087. X        if (cdrom_play() != -1) {
  1088. X            cdi.state &= ~CDROM_STATE_STOP;
  1089. X        }
  1090. X        if (cdrom_pause() != -1) {
  1091. X            cdi.state &= ~CDROM_STATE_STOP;
  1092. X        }
  1093. X        cdrom_timer_off();
  1094. X        return;
  1095. X    }
  1096. X
  1097. X    if ((cdi.state & CDROM_STATE_PLAY) == 0) {
  1098. X        debug_printf(1, "cb_cdrom_next: stopped on track %d\n",
  1099. X                cdi.curtrack);
  1100. X        return;
  1101. X    }
  1102. X
  1103. X    if (cdi.state & CDROM_STATE_SHUFFLE)
  1104. X        cdi.curtrack = shuffle_next_track();
  1105. X
  1106. X    debug_printf(1, "cb_cdrom_next: playing track %d\n",
  1107. X            cdi.curtrack);
  1108. X
  1109. X    /* restart playing if not paused and currently playing */
  1110. X    (void) cdrom_play();
  1111. X}
  1112. X
  1113. X
  1114. X/*ARGSUSED*/
  1115. Xvoid
  1116. Xcb_cdrom_eject(widget, client_data, call_data)
  1117. X    Widget        widget;
  1118. X    XtPointer    client_data;
  1119. X    XtPointer    call_data;
  1120. X{
  1121. X    Arg    args[1];
  1122. X    Boolean    state;
  1123. X
  1124. X    if (cdrom_open() == -1) {
  1125. X        debug_printf(1, "cb_cdrom_eject: error from cdrom_open\n");
  1126. X        return;
  1127. X    }
  1128. X
  1129. X#ifdef sgi
  1130. X    if (cdrom_status() == CDROM_NO_STATUS) {
  1131. X        cdi.state |= CDROM_STATE_EJECTED;
  1132. X        buttons_reset();
  1133. X        return;
  1134. X    }
  1135. X#endif
  1136. X
  1137. X    /* Check if this is just a toggle event.  If so, do nothing */
  1138. X    XtSetArg(args[0], XtNstate, &state);
  1139. X    XtGetValues(widget, args, 1);
  1140. X    if (state == False) {
  1141. X        return;
  1142. X    }
  1143. X
  1144. X    /* toggle button weirdness; see comment in cb_cdrom_play for details */
  1145. X    if (cdi.state & CDROM_STATE_EJECTED) {
  1146. X        debug_printf(1, "cb_cdrom_eject: already ejected\n");
  1147. X        return;
  1148. X    }
  1149. X
  1150. X    debug_printf(1, "cb_cdrom_eject: ejecting on track %d\n",
  1151. X            cdi.curtrack);
  1152. X
  1153. X    cdrom_reset();
  1154. X    cdi.maxtrack = 0;
  1155. X
  1156. X    program_cancel();
  1157. X    cdrom_eject();
  1158. X    cdi.state |= CDROM_STATE_EJECTED;
  1159. X    cdrom_close();
  1160. X
  1161. X    disc_title = NODISCSTR;
  1162. X    update_title();
  1163. X}
  1164. X
  1165. X#ifdef sgi
  1166. X/*ARGSUSED*/
  1167. Xvoid
  1168. Xcb_cdrom_audio(widget, client_data, call_data)
  1169. X    Widget        widget;
  1170. X    XtPointer    client_data;
  1171. X    XtPointer    call_data;
  1172. X{
  1173. X    if (cdrom_open() == -1) {
  1174. X        debug_printf(1, "cb_cdrom_audio: error from cdrom_open\n");
  1175. X        return;
  1176. X    }
  1177. X
  1178. X    if (cdi.state & CDROM_STATE_PLAY) {
  1179. X        XBell(XtDisplay(widget), 100);
  1180. X        if (cdi.scsi_audio) {
  1181. X            audio_button_set();
  1182. X        } else {
  1183. X            audio_button_reset();
  1184. X        }
  1185. X        return;
  1186. X    }
  1187. X
  1188. X    if (cdi.scsi_audio) {
  1189. X        debug_printf(1, "cb_cdrom_audio: toggling audio off\n");
  1190. X        cdrom_toggle_audio();
  1191. X        audio_button_reset();
  1192. X        return;
  1193. X    }
  1194. X
  1195. X    /* Check if it's available before turning it on */
  1196. X    if ( cdrom_audio_avail() ) {
  1197. X        debug_printf(1, "cb_cdrom_audio: toggling audio on\n");
  1198. X        cdrom_toggle_audio();
  1199. X        audio_button_set();
  1200. X        return;
  1201. X    }
  1202. X    XBell(XtDisplay(widget), 100);
  1203. X    audio_button_reset();
  1204. X}
  1205. X#endif /* sgi */
  1206. X
  1207. X/*ARGSUSED*/
  1208. Xvoid
  1209. Xcb_cdrom_cycle(widget, client_data, call_data)
  1210. X    Widget        widget;
  1211. X    XtPointer    client_data;
  1212. X    XtPointer    call_data;
  1213. X{
  1214. X    if (cdi.state & CDROM_STATE_CYCLE) {
  1215. X        debug_printf(1, "cb_cdrom_cycle: cycle off\n");
  1216. X        cdi.state &= ~CDROM_STATE_CYCLE;
  1217. X
  1218. X        return;
  1219. X    }
  1220. X
  1221. X    debug_printf(1, "cb_cdrom_cycle: cycle on\n");
  1222. X    cdi.state |= CDROM_STATE_CYCLE;
  1223. X}
  1224. X
  1225. X/*ARGSUSED*/
  1226. Xvoid
  1227. Xcb_cdrom_shuffle(widget, client_data, call_data)
  1228. X    Widget        widget;
  1229. X    XtPointer    client_data;
  1230. X    XtPointer    call_data;
  1231. X{
  1232. X    if (cdi.state & CDROM_STATE_SHUFFLE) {
  1233. X
  1234. X        debug_printf(1, "cb_cdrom_shuffle: shuffle off\n");
  1235. X        cdi.state &= ~CDROM_STATE_SHUFFLE;
  1236. X
  1237. X        return;
  1238. X    }
  1239. X
  1240. X    if (cdi.state & CDROM_STATE_PLAY) {
  1241. X        XBell(XtDisplay(widget), 100);
  1242. X        shuffle_button_reset();
  1243. X        return;
  1244. X    }
  1245. X
  1246. X    if (cdi.state & CDROM_STATE_PROGRAM) {
  1247. X        debug_printf(1, "cb_cdrom_shuffle: cancelling program\n");
  1248. X        program_cancel();
  1249. X    }
  1250. X
  1251. X    debug_printf(1, "cb_cdrom_shuffle: shuffle on\n");
  1252. X    cdi.state |= CDROM_STATE_SHUFFLE;
  1253. X    shuffle_setup();
  1254. X}
  1255. X
  1256. X/*ARGSUSED*/
  1257. Xvoid
  1258. Xcb_cdrom_quit(widget, client_data, call_data)
  1259. X    Widget        widget;
  1260. X    XtPointer    client_data;
  1261. X    XtPointer    call_data;
  1262. X{
  1263. X    debug_printf(1, "cb_cdrom_quit: bye\n");
  1264. X
  1265. X    cdrom_timer_off();
  1266. X    cdrom_close();
  1267. X
  1268. X    exit(0);
  1269. X}
  1270. X
  1271. X
  1272. X/*ARGSUSED*/
  1273. Xvoid
  1274. Xcb_cdrom_rewind(widget, client_data, call_data)
  1275. X    Widget        widget;
  1276. X    XtPointer    client_data;
  1277. X    XtPointer    call_data;
  1278. X{
  1279. X    if (cdrom_open() == -1) {
  1280. X        debug_printf(1, "cb_cdrom_rew: error from cdrom_open\n");
  1281. X        return;
  1282. X    }
  1283. X
  1284. X    if ((cdi.state & CDROM_STATE_PLAY) || (cdi.state & CDROM_STATE_PAUSE)) {
  1285. X        debug_printf(1, "cb_cdrom_rew: moving backward in track %d\n",
  1286. X                cdi.curtrack);
  1287. X
  1288. X        cdrom_rewind();
  1289. X    }
  1290. X}
  1291. X
  1292. X
  1293. X/*ARGSUSED*/
  1294. Xvoid
  1295. Xcb_cdrom_ff(widget, client_data, call_data)
  1296. X    Widget        widget;
  1297. X    XtPointer    client_data;
  1298. X    XtPointer    call_data;
  1299. X{
  1300. X    if (cdrom_open() == -1) {
  1301. X        debug_printf(1, "cb_cdrom_ff: error from cdrom_open\n");
  1302. X        return;
  1303. X    }
  1304. X
  1305. X
  1306. X    if ((cdi.state & CDROM_STATE_PLAY) || (cdi.state & CDROM_STATE_PAUSE)) {
  1307. X        debug_printf(1, "cb_cdrom_ff: moving forward in track %d\n",
  1308. X                cdi.curtrack);
  1309. X
  1310. X        cdrom_ff();
  1311. X    }
  1312. X}
  1313. X
  1314. Xstatic Boolean pgmButtonUp = False;
  1315. X
  1316. X/*ARGSUSED*/
  1317. Xvoid
  1318. Xcb_cdrom_program(widget, topLevel, call_data)
  1319. X    Widget        widget;
  1320. X    Widget        topLevel;
  1321. X    XtPointer    call_data;
  1322. X{
  1323. X    if (pgmButtonUp)
  1324. X    {
  1325. X        track_button_reset();
  1326. X        pgm_button_set();
  1327. X
  1328. X        /*
  1329. X             * have to keep track of button position internally, since toggle
  1330. X             * widgets screw up when you mess with their state programatically,
  1331. X             * in that if you set the state to false when notified on a button
  1332. X             * press, if you also notify on button release, the state is
  1333. X             * auto-reset to true prior to notification, so there is no
  1334. X             * longer any way to tell if it's a button release:
  1335. X             * THIS IS A HACK! (necessary, but *still* a hack.)
  1336. X             */
  1337. X            pgmButtonUp = False;
  1338. X
  1339. X        return;
  1340. X    }
  1341. X
  1342. X    if ((cdi.state & CDROM_STATE_PROGRAM) == 0)
  1343. X    {
  1344. X        if (cdrom_open() == -1) {
  1345. X        debug_printf(1, "cb_cdrom_play: error from cdrom_open\n");
  1346. X        return;
  1347. X        }
  1348. X        if (cdi.state & CDROM_STATE_EJECTED) {
  1349. X            cdrom_new_disc(widget);
  1350. X        }
  1351. X        if (cdi.state & CDROM_STATE_SHUFFLE) {
  1352. X            debug_printf(1, "cb_cdrom_program: cancelling shuffle mode\n");
  1353. X            cdi.state &= ~CDROM_STATE_SHUFFLE;
  1354. X        shuffle_button_reset();
  1355. X        }
  1356. X        cdi.state &= ~CDROM_STATE_EJECTED;
  1357. X        eject_button_reset();
  1358. X        cdi.state &= ~CDROM_STATE_STOP;
  1359. X
  1360. X        debug_printf(1, "cb_cdrom_program: program on\n");
  1361. X        cdi.state |= CDROM_STATE_PROGRAM;
  1362. X        timer_button_set();
  1363. X        popup_program_form (widget, topLevel, call_data);
  1364. X            /*
  1365. X             * have to keep track of button position internally, since command
  1366. X             * widgets screw up if you mess with their state programatically:
  1367. X             */
  1368. X            pgmButtonUp = True;
  1369. X        return;
  1370. X    }
  1371. X
  1372. X    if (((cdi.state & CDROM_STATE_PAUSE) || 
  1373. X         ((cdi.state & CDROM_STATE_PLAY) == 0)) &&
  1374. X        (cdi.curtrack != 0))
  1375. X    {
  1376. X        /* indicate to user he's programmed a track: */
  1377. X        pgm_button_reset();
  1378. X        track_button_set();
  1379. X        timer_button_update();
  1380. X
  1381. X        debug_printf(1, "cb_cdrom_program: adding track %d to program list\n",
  1382. X        cdi.curtrack);
  1383. X        program_add_track (cdi.curtrack);
  1384. X    }
  1385. X        /*
  1386. X         * have to keep track of button position internally, since command
  1387. X         * widgets screw up if you mess with their state programatically:
  1388. X         */
  1389. X        pgmButtonUp = True;
  1390. X
  1391. X}
  1392. X
  1393. X
  1394. Xvoid
  1395. Xcdrom_new_disc(widget)
  1396. X    Widget    widget;
  1397. X{
  1398. X    Arg    args[1];
  1399. X    Boolean    state;
  1400. X
  1401. X    debug_printf(1, "cdrom_new_disc: resetting disc\n");
  1402. X
  1403. X    cdrom_reset();
  1404. X    
  1405. X    cdi.state &= ~CDROM_STATE_EJECTED;
  1406. X    eject_button_reset();
  1407. X
  1408. X    /* toggle button weirdness; see comment in cb_cdrom_play for details */
  1409. X    XtSetArg(args[0], XtNstate, &state);
  1410. X    XtGetValues(widget, args, 1);
  1411. X    if (state == False) {
  1412. X        XtSetArg(args[0], XtNstate, True);
  1413. X        XtSetValues(widget, args, 1);
  1414. X    }
  1415. X
  1416. X    if (cdi.state & CDROM_STATE_SHUFFLE) {
  1417. X        debug_printf(1, "cb_cdrom_shuffle: shuffle on\n");
  1418. X        cdi.state |= CDROM_STATE_SHUFFLE;
  1419. X        shuffle_setup();
  1420. X    }
  1421. X}
  1422. END_OF_FILE
  1423. if test 17018 -ne `wc -c <'xcdplayer-2.2/cdrom_callb.c'`; then
  1424.     echo shar: \"'xcdplayer-2.2/cdrom_callb.c'\" unpacked with wrong size!
  1425. fi
  1426. # end of 'xcdplayer-2.2/cdrom_callb.c'
  1427. fi
  1428. if test -f 'xcdplayer-2.2/program.c' -a "${1}" != "-c" ; then 
  1429.   echo shar: Will not clobber existing file \"'xcdplayer-2.2/program.c'\"
  1430. else
  1431. echo shar: Extracting \"'xcdplayer-2.2/program.c'\" \(18485 characters\)
  1432. sed "s/^X//" >'xcdplayer-2.2/program.c' <<'END_OF_FILE'
  1433. X/*
  1434. X * Copyright (C) 1990 Regents of the University of California.
  1435. X *
  1436. X * Permission to use, copy, modify, distribute, and sell this software and
  1437. X * its documentation for any purpose is hereby granted without fee,
  1438. X * provided that the above copyright notice appear in all copies and that
  1439. X * both that copyright notice and this permission notice appear in
  1440. X * supporting documentation, and that the name of the University of
  1441. X * California not be used in advertising or publicity pertaining to
  1442. X * distribution of the software without specific, written prior
  1443. X * permission.  the University of California makes no representations
  1444. X * about the suitability of this software for any purpose.  It is provided
  1445. X * "as is" without express or implied warranty.
  1446. X */
  1447. X
  1448. X# include <X11/Intrinsic.h>
  1449. X# include <X11/StringDefs.h>
  1450. X# include <X11/Shell.h>
  1451. X# include <X11/Xaw/Form.h>
  1452. X# include <X11/Xaw/Label.h>
  1453. X# include <X11/Xaw/List.h>
  1454. X# include <X11/Xaw/Command.h>
  1455. X# include <X11/Xaw/Toggle.h>
  1456. X# include <X11/Xaw/Viewport.h>
  1457. X# include <X11/Xaw/Dialog.h>
  1458. X
  1459. X
  1460. X# include <stdio.h>
  1461. X# include <string.h>
  1462. X# include <malloc.h>
  1463. X
  1464. X# include "debug.h"
  1465. X# include "cdrom_globs.h"
  1466. X#ifdef sun
  1467. X# include "cdrom_sun.h"
  1468. X#endif
  1469. X#ifdef sgi
  1470. X# include "cdrom_sgi.h"
  1471. X#endif
  1472. X
  1473. X
  1474. X/* externally manipulated vars: */
  1475. Xchar    program_str[100];
  1476. Xchar    *disc_title = NULL;
  1477. X
  1478. Xstatic    Widget    program_form;
  1479. Xstatic    Widget    program_display_form;
  1480. Xstatic    Widget    program_anchor;
  1481. Xstatic    Widget    trackbuttons[9];
  1482. Xstatic    Widget    plus10_button;
  1483. Xstatic    Widget    new_track_button;
  1484. Xstatic    Boolean    adding_to_new_track = False;
  1485. Xstatic    struct    prognode *current_node = NULL;
  1486. X
  1487. Xvoid
  1488. Xprogram_form_setup (parent_widget)
  1489. X    Widget    parent_widget;
  1490. X{
  1491. X        Arg    args[10];
  1492. X    char    namestr[2];
  1493. X    int    i;
  1494. X
  1495. X    Widget    program_display_viewport;
  1496. X    Widget    track_select_form;
  1497. X    Widget    clear_button;
  1498. X    Widget    cancel_button;
  1499. X    Widget    save_button;
  1500. X    Widget    all_button;
  1501. X
  1502. X    extern    void    cb_move_program_ptr();
  1503. X    extern    void    cb_clear_program();
  1504. X    extern    void    cb_cancel_program();
  1505. X    extern    void    cb_save_program();
  1506. X    extern    void    cb_trackbuttons();
  1507. X    extern    void    cb_add_10();
  1508. X    extern    void    cb_new_track();
  1509. X    extern    void    cb_program_all();
  1510. X
  1511. X    /* 
  1512. X     * create program form as a non-managed widget, because this 
  1513. X     * form "pops up" when requested, as part of the main form, and
  1514. X     * therefore moves along with the main form. (Pop-ups don't do this
  1515. X     * easily.)
  1516. X     */
  1517. X        program_form = XtCreateWidget("programForm",
  1518. X                formWidgetClass,
  1519. X                                parent_widget,
  1520. X                                (ArgList) NULL, 0);
  1521. X
  1522. X        program_display_viewport = XtCreateManagedWidget(
  1523. X                "programDisplayViewport",
  1524. X                                viewportWidgetClass,
  1525. X                program_form,
  1526. X                                (ArgList) NULL, 0);
  1527. X
  1528. X        program_display_form = XtCreateManagedWidget("programDisplayForm",
  1529. X                                formWidgetClass,
  1530. X                                program_display_viewport,
  1531. X                                (ArgList) NULL, 0);
  1532. X
  1533. X
  1534. X    XtSetArg(args[0], XtNlabel, " ");
  1535. X    XtSetArg(args[1], XtNstate, TRUE);
  1536. X    program_anchor = XtCreateManagedWidget("programSelection",
  1537. X                toggleWidgetClass,
  1538. X                program_display_form,
  1539. X                (ArgList) args, 2);
  1540. X    XtAddCallback (program_anchor, XtNcallback, cb_move_program_ptr, NULL);
  1541. X
  1542. X
  1543. X    XtSetArg(args[0], XtNfromVert, program_display_viewport);
  1544. X    clear_button = XtCreateManagedWidget("Clear",
  1545. X                commandWidgetClass,
  1546. X                program_form,
  1547. X                (ArgList) args, 1);
  1548. X    XtAddCallback (clear_button, XtNcallback, cb_clear_program, NULL);
  1549. X
  1550. X    XtSetArg(args[0], XtNfromVert, program_display_viewport);
  1551. X    XtSetArg(args[1], XtNfromHoriz, clear_button);
  1552. X    cancel_button = XtCreateManagedWidget("Cancel",
  1553. X                commandWidgetClass,
  1554. X                program_form,
  1555. X                (ArgList) args, 2);
  1556. X    XtAddCallback (cancel_button, XtNcallback, cb_cancel_program, NULL);
  1557. X
  1558. X
  1559. X    XtSetArg(args[0], XtNfromVert, program_display_viewport);
  1560. X    XtSetArg(args[1], XtNfromHoriz, cancel_button);
  1561. X    save_button = XtCreateManagedWidget("Save",
  1562. X                commandWidgetClass,
  1563. X                program_form,
  1564. X                (ArgList) args, 2);
  1565. X    XtAddCallback (save_button, XtNcallback, cb_save_program, NULL);
  1566. X
  1567. X
  1568. X    XtSetArg(args[0], XtNfromVert, clear_button);
  1569. X        track_select_form = XtCreateManagedWidget("selectForm",
  1570. X                formWidgetClass,
  1571. X                program_form,
  1572. X                (ArgList) args, 1);
  1573. X
  1574. X
  1575. X    for (i = 1; i <= 9; i++)
  1576. X    {
  1577. X        sprintf(namestr, "%d",i);
  1578. X        trackbuttons[i-1] = XtCreateManagedWidget(namestr,
  1579. X                    commandWidgetClass,
  1580. X                    track_select_form,
  1581. X                    (ArgList) NULL, 0);
  1582. X                
  1583. X    }
  1584. X
  1585. X    XtAddCallback (trackbuttons[0], XtNcallback, cb_trackbuttons, NULL);
  1586. X
  1587. X    for (i = 1; i < 9; i++)
  1588. X    {
  1589. X        XtSetArg(args[0], XtNfromHoriz, trackbuttons[i-1]);
  1590. X        XtSetValues(trackbuttons[i], args, 1);
  1591. X        XtAddCallback (trackbuttons[i], XtNcallback, cb_trackbuttons, NULL);
  1592. X    }    
  1593. X
  1594. X    XtSetArg(args[0], XtNfromVert, trackbuttons[0]);
  1595. X    plus10_button = XtCreateManagedWidget("+10",
  1596. X                commandWidgetClass,
  1597. X                track_select_form,
  1598. X                (ArgList) args, 1);
  1599. X    XtAddCallback (plus10_button, XtNcallback, cb_add_10, NULL);
  1600. X
  1601. X    XtSetArg(args[0], XtNfromVert, trackbuttons[0]);
  1602. X    XtSetArg(args[1], XtNfromHoriz, plus10_button);
  1603. X    new_track_button = XtCreateManagedWidget("  ",
  1604. X                commandWidgetClass,
  1605. X                track_select_form,
  1606. X                (ArgList) args, 2);
  1607. X    XtAddCallback (new_track_button, XtNcallback, cb_new_track, NULL);
  1608. X
  1609. X    XtSetArg(args[0], XtNfromVert, trackbuttons[0]);
  1610. X    XtSetArg(args[1], XtNfromHoriz, trackbuttons[6]);
  1611. X    all_button = XtCreateManagedWidget("All",
  1612. X                commandWidgetClass,
  1613. X                track_select_form,
  1614. X                (ArgList) args, 2);
  1615. X    XtAddCallback (all_button, XtNcallback, cb_program_all, NULL);
  1616. X
  1617. X}
  1618. X
  1619. Xvoid
  1620. Xpopup_program_form (widget, topLevel, call_data)
  1621. XWidget        widget;
  1622. XWidget        topLevel;
  1623. XXtPointer    call_data;
  1624. X{
  1625. X        Arg             args[2];
  1626. X    int        i;
  1627. X    char        *progstr;
  1628. X    char        *token;
  1629. X    int        track;        
  1630. X
  1631. X    extern FILE     *disc_info;
  1632. X
  1633. X
  1634. X    cdi.selection = NULL;
  1635. X
  1636. X    /* load saved program (if any) */
  1637. X    if (disc_info != NULL)
  1638. X    {
  1639. X        /* copy "open" program str for tokenization */
  1640. X        progstr = strdup(program_str);    
  1641. X        token = strtok(progstr, "-");     /* find 1st programmed track */
  1642. X        if (token != NULL)
  1643. X        {
  1644. X            debug_printf(1, "using stored program\n");
  1645. X            while (token != NULL)
  1646. X            {
  1647. X                sscanf(token, "%d",&track); /* convert to # */
  1648. X                program_add_track((unsigned char)track);
  1649. X                token = strtok(NULL,"-"); /* get next track str */
  1650. X            }
  1651. X        }
  1652. X    }
  1653. X
  1654. X    /* clear sensitivity for all */
  1655. X    for (i=0; i < 9; i++)
  1656. X    {
  1657. X        XtSetArg(args[0], XtNsensitive, FALSE);
  1658. X        XtSetValues(trackbuttons[i], args, 1);
  1659. X    }
  1660. X
  1661. X    XtSetArg(args[0], XtNsensitive, FALSE);
  1662. X    XtSetValues(plus10_button, args, 1);
  1663. X    XtSetValues(new_track_button, args, 1);
  1664. X
  1665. X    for (i = 0; (i < 9) && (i < cdi.maxtrack); i++)
  1666. X    {
  1667. X        /* set sensitivity for active buttons */
  1668. X        XtSetArg(args[0], XtNsensitive, TRUE);
  1669. X        XtSetValues(trackbuttons[i], args, 1);
  1670. X    }
  1671. X    if (cdi.maxtrack > 9)
  1672. X    {
  1673. X        XtSetArg(args[0], XtNsensitive, TRUE);
  1674. X        XtSetValues(plus10_button, args, 1);
  1675. X    }
  1676. X
  1677. X
  1678. X    XtManageChild(program_form);
  1679. X}
  1680. X
  1681. X
  1682. X
  1683. Xvoid 
  1684. Xmake_program_button(node, next_to, label)
  1685. Xstruct    prognode *node;
  1686. XWidget    next_to;
  1687. Xchar    label[];
  1688. X{
  1689. X    Arg    args[10];
  1690. X    char    name[2];
  1691. X    int    i = 0;
  1692. X
  1693. X    XtSetArg(args[i], XtNfromHoriz, next_to); i++;
  1694. X    XtSetArg(args[i], XtNlabel, label); i++;
  1695. X    XtSetArg(args[i], XtNradioGroup, program_anchor); i++;
  1696. X    XtSetArg(args[i], XtNstate, TRUE); i++; /* activates *this* button */
  1697. X
  1698. X    node->button = XtCreateManagedWidget("programSelection",
  1699. X                toggleWidgetClass,
  1700. X                program_display_form,
  1701. X                (ArgList) args, i);
  1702. X    XtAddCallback(node->button, XtNcallback, cb_move_program_ptr, 
  1703. X              (XtPointer) node);
  1704. X
  1705. X    if (node->next != NULL) /* then reposition widget following */
  1706. X    {
  1707. X        XtSetArg(args[0], XtNfromHoriz, node->button);
  1708. X        XtSetValues(node->next->button, args, 1);
  1709. X    }    
  1710. X}
  1711. X
  1712. Xvoid 
  1713. Xprogram_add_track (track)
  1714. Xunsigned char    track;
  1715. X{
  1716. X    struct prognode    *insert_point, *new, *next;
  1717. X    Arg    args[10];
  1718. X    char    *p;
  1719. X    char    label[3];
  1720. X    int    i;
  1721. X
  1722. X    XawFormDoLayout (program_display_form, FALSE);
  1723. X
  1724. X    if (cdi.program == NULL)
  1725. X    {
  1726. X        new = (struct prognode *) malloc(sizeof(struct prognode));
  1727. X        new->track = track;
  1728. X        new->next = NULL;
  1729. X        new->prev = NULL;
  1730. X        current_node = cdi.program = new;
  1731. X        cdi.lastprog = 1;
  1732. X
  1733. X        sprintf(label, "%d", track);
  1734. X        make_program_button(new, program_anchor, label);
  1735. X    }
  1736. X
  1737. X    else if (current_node == NULL) /* pre-insert */
  1738. X    {
  1739. X        new = (struct prognode *) malloc(sizeof(struct prognode));
  1740. X            new->track = track;
  1741. X            new->next = cdi.program;
  1742. X            new->prev = NULL;
  1743. X        current_node = cdi.program->prev = new;
  1744. X        cdi.program = cdi.program->prev;
  1745. X        cdi.lastprog++;
  1746. X
  1747. X        sprintf(label, "%d", track);
  1748. X        make_program_button(new, program_anchor, label);
  1749. X
  1750. X        sprintf(label, "-%d", new->next->track);
  1751. X        XtSetArg(args[0], XtNlabel, label);
  1752. X        XtSetValues(new->next->button, args, 1);
  1753. X    }
  1754. X    else
  1755. X    {
  1756. X        insert_point = cdi.program;
  1757. X
  1758. X        while ((insert_point->next != NULL) && 
  1759. X           (insert_point != current_node))
  1760. X         insert_point = insert_point->next;
  1761. X
  1762. X        new = (struct prognode *) malloc(sizeof(struct prognode));
  1763. X        new->track = track;
  1764. X        new->next = insert_point->next;
  1765. X        new->prev = insert_point;
  1766. X        if (new->next != NULL)
  1767. X            new->next->prev = new; /* complete link back */
  1768. X
  1769. X        cdi.lastprog++;
  1770. X        current_node = insert_point->next = new;
  1771. X
  1772. X        sprintf(label, "-%d", track);
  1773. X        make_program_button(new, insert_point->button, label);
  1774. X    }
  1775. X
  1776. X    next = cdi.program;
  1777. X    sprintf(program_str, "%d", next->track);
  1778. X    for (i = 1; i < cdi.lastprog; i++)
  1779. X    {
  1780. X        next = next->next;
  1781. X        sprintf(program_str, "%s-%d", program_str, next->track);
  1782. X    }
  1783. X
  1784. X
  1785. X    XawFormDoLayout (program_display_form, TRUE);
  1786. X
  1787. X
  1788. X    if (cdi.state & CDROM_STATE_PAUSE) 
  1789. X    {
  1790. X        cdi.selection = new;
  1791. X        cdi.curtrack = new->track;
  1792. X        track_button_update();
  1793. X        timer_button_update();
  1794. X    }
  1795. X}
  1796. X        
  1797. Xvoid 
  1798. Xprogram_delete_track (node)
  1799. Xstruct prognode    *node;
  1800. X{
  1801. X    int i;
  1802. X    Arg    args[2];
  1803. X    char    *p;
  1804. X    char    label[3];
  1805. X
  1806. X    if (cdi.program == NULL)
  1807. X        return;
  1808. X    
  1809. X    if (node->prev != NULL)
  1810. X    {
  1811. X        node->prev->next = node->next;
  1812. X        current_node = node->prev;
  1813. X        XtSetArg(args[0], XtNstate, True);
  1814. X        XtSetValues(current_node->button, args, 1);
  1815. X
  1816. X        XtSetArg(args[0], XtNfromHoriz, node->prev->button);
  1817. X    }
  1818. X    else
  1819. X    {
  1820. X        cdi.program = node->next;
  1821. X        current_node = cdi.program;
  1822. X        if (current_node != NULL)
  1823. X        {
  1824. X            sprintf(label, "%d", current_node->track);
  1825. X            XtSetArg(args[0], XtNlabel, label);
  1826. X            XtSetArg(args[1], XtNstate, True);
  1827. X            XtSetValues(current_node->button, args, 2);
  1828. X
  1829. X            XtSetArg(args[0], XtNfromHoriz, program_anchor);
  1830. X
  1831. X        }
  1832. X        else
  1833. X        {
  1834. X            XtSetArg(args[0], XtNstate, True);
  1835. X            XtSetValues(program_anchor, args, 1);
  1836. X        }
  1837. X    }
  1838. X
  1839. X    if (node->next != NULL)
  1840. X    {
  1841. X        node->next->prev = node->prev;
  1842. X        XtSetValues(node->next->button, args, 1);
  1843. X    }
  1844. X
  1845. X
  1846. X    XtDestroyWidget(node->button);
  1847. X    free(node);
  1848. X
  1849. X    cdi.lastprog--;
  1850. X
  1851. X    if (cdi.program == NULL)
  1852. X    {
  1853. X        program_str[0] = '\0';
  1854. X        cdi.selection = NULL;
  1855. X    }
  1856. X    else
  1857. X    {
  1858. X        cdi.selection = current_node;
  1859. X
  1860. X        if (cdi.state & CDROM_STATE_PAUSE) 
  1861. X        {
  1862. X        cdi.curtrack = current_node->track;
  1863. X            track_button_update();
  1864. X            timer_button_update();
  1865. X        }
  1866. X
  1867. X        node = cdi.program;
  1868. X        sprintf(program_str, "%d", node->track);
  1869. X        for (i = 1; i < cdi.lastprog; i++)
  1870. X        {
  1871. X        node = node->next;
  1872. X        sprintf(program_str, "%s-%d", program_str, node->track);
  1873. X        }
  1874. X    }
  1875. X
  1876. X}
  1877. X
  1878. X        
  1879. Xint
  1880. Xprogram_time_remaining()
  1881. X{
  1882. X    struct prognode *node;
  1883. X    int        time_remaining = 0;
  1884. X
  1885. X    if ((cdi.program == NULL) || (cdi.selection == NULL))
  1886. X        return (0);
  1887. X        
  1888. X    node = cdi.selection;
  1889. X    while (node != NULL)
  1890. X    {
  1891. X        time_remaining += cdi.times[node->track - 1];
  1892. X        node = node->next;
  1893. X    }
  1894. X    time_remaining -= cdi.duration;
  1895. X    return (time_remaining);
  1896. X}
  1897. X
  1898. X
  1899. Xunsigned char
  1900. Xprogram_goto_next_track()
  1901. X{
  1902. X    Arg    arg;
  1903. X    Boolean    already_on;
  1904. X
  1905. X    if (cdi.program == NULL)
  1906. X        return (0);
  1907. X    else if (cdi.selection == NULL)
  1908. X        cdi.selection = cdi.program;
  1909. X    else if (cdi.selection->next == NULL)
  1910. X    {
  1911. X        cdi.selection = NULL;
  1912. X        return (0);
  1913. X    }
  1914. X    else
  1915. X        cdi.selection = cdi.selection->next;
  1916. X    
  1917. X
  1918. X    XtSetArg(arg, XtNstate, &already_on);
  1919. X    XtGetValues(cdi.selection->button, &arg, 1);
  1920. X    if (already_on == FALSE)
  1921. X    {
  1922. X        XtSetArg(arg, XtNstate, TRUE);
  1923. X        XtSetValues(cdi.selection->button, &arg, 1);
  1924. X    }
  1925. X
  1926. X    pgm_button_set();
  1927. X    return(cdi.selection->track);
  1928. X}
  1929. X
  1930. Xunsigned char
  1931. Xprogram_resume()
  1932. X{
  1933. X    unsigned char    track;
  1934. X
  1935. X    if (cdi.program != NULL)
  1936. X    {
  1937. X        if (cdi.selection == NULL)
  1938. X        track = program_goto_next_track();
  1939. X        else
  1940. X        track = cdi.selection->track;
  1941. X    }
  1942. X    else
  1943. X        track = cdi.curtrack;
  1944. X    pgm_button_set();
  1945. X
  1946. X    return(track);
  1947. X}
  1948. X
  1949. X
  1950. Xunsigned char
  1951. Xprogram_goto_prev_track()
  1952. X{
  1953. X    Arg    arg;
  1954. X    Boolean    already_on;
  1955. X
  1956. X    if ((cdi.program == NULL) || (cdi.selection->prev == NULL))
  1957. X        return (0);
  1958. X
  1959. X    cdi.selection = cdi.selection->prev;
  1960. X
  1961. X    XtSetArg(arg, XtNstate, &already_on);
  1962. X    XtGetValues(cdi.selection->button, &arg, 1);
  1963. X    if (already_on == FALSE)
  1964. X    {
  1965. X        XtSetArg(arg, XtNstate, TRUE);
  1966. X        XtSetValues(cdi.selection->button, &arg, 1);
  1967. X    }
  1968. X
  1969. X    pgm_button_set();
  1970. X    return (cdi.selection->track);
  1971. X}
  1972. X
  1973. Xunsigned char
  1974. Xprogram_next_track()
  1975. X{
  1976. X    if (cdi.program == NULL)
  1977. X        return (0);
  1978. X
  1979. X    else if (cdi.selection == NULL)
  1980. X        return (cdi.program->track);
  1981. X
  1982. X    else if (cdi.selection->next == NULL)
  1983. X        return (0);
  1984. X    else
  1985. X        return (cdi.selection->next->track);
  1986. X
  1987. X}
  1988. X
  1989. Xunsigned char
  1990. Xprogram_prev_track()
  1991. X{
  1992. X    if ((cdi.program == NULL) || (cdi.selection == NULL) ||
  1993. X        (cdi.selection->prev == NULL))
  1994. X        return (0);
  1995. X
  1996. X    else 
  1997. X        return (cdi.selection->prev->track);
  1998. X
  1999. X}
  2000. X        
  2001. Xvoid
  2002. Xclear_program()
  2003. X{
  2004. X    Arg    arg;
  2005. X
  2006. X    /* clear new_track button and deactivate */
  2007. X    XtSetArg(arg, XtNlabel, "  ");
  2008. X    XtSetValues(new_track_button, &arg, 1);
  2009. X    XtSetArg(arg, XtNsensitive, False);
  2010. X    XtSetValues(new_track_button, &arg, 1);
  2011. X    adding_to_new_track = False;
  2012. X
  2013. X    if (cdi.program == NULL)
  2014. X        return;
  2015. X
  2016. X    cdi.selection = cdi.program;
  2017. X    while (cdi.selection->next != NULL)
  2018. X    {
  2019. X        cdi.program = cdi.program-> next;
  2020. X        XtDestroyWidget(cdi.selection->button);
  2021. X        free(cdi.selection);
  2022. X        cdi.selection = cdi.program;
  2023. X    }
  2024. X    XtDestroyWidget(cdi.selection->button);
  2025. X    free(cdi.selection);
  2026. X    cdi.selection = cdi.program = NULL;
  2027. X    cdi.lastprog = 0;
  2028. X    XtSetArg(arg, XtNstate, True);
  2029. X    XtSetValues(program_anchor, &arg, 1);
  2030. X
  2031. X    program_str[0]= '\0'; /* clear "store" string */
  2032. X
  2033. X}
  2034. X
  2035. Xvoid
  2036. Xprogram_cancel()
  2037. X{
  2038. X    debug_printf(1, "program mode cancelled\n");
  2039. X    clear_program();
  2040. X
  2041. X    XtUnmanageChild(program_form);
  2042. X    pgm_button_reset();
  2043. X    timer_button_reset();
  2044. X    timer_button_update();
  2045. X    cdi.state &= ~CDROM_STATE_PROGRAM;
  2046. X}
  2047. X
  2048. Xvoid    
  2049. Xcb_move_program_ptr(widget, node, call_data)
  2050. XWidget        widget;
  2051. Xstruct prognode *node;
  2052. XXtPointer    call_data;
  2053. X{
  2054. X    /*
  2055. X     * I cannot get XawToggleGetCurrent to work at all, so this
  2056. X     * is a bastardized way of doing this:
  2057. X     */
  2058. X
  2059. X    Arg    arg;
  2060. X    Boolean    state;
  2061. X
  2062. X    XtSetArg(arg, XtNstate, &state);
  2063. X    XtGetValues(widget, &arg, 1);
  2064. X
  2065. X    if (state == True)
  2066. X    {
  2067. X        if ((current_node == node) && (current_node != NULL))
  2068. X        {
  2069. X        debug_printf(1, "deleting selection from program\n");
  2070. X        program_delete_track(node);
  2071. X        }
  2072. X        else
  2073. X        {
  2074. X            current_node = node;
  2075. X
  2076. X        if ((current_node != NULL) &&
  2077. X            ((cdi.state & CDROM_STATE_PAUSE) ||
  2078. X             ((cdi.state & CDROM_STATE_PLAY) == 0)))
  2079. X        {
  2080. X            cdi.selection = node;
  2081. X            cdi.curtrack = node->track;
  2082. X                track_button_update();
  2083. X                timer_button_update();
  2084. X        }
  2085. X        }
  2086. X    }
  2087. X
  2088. X}
  2089. X
  2090. X
  2091. Xstatic void
  2092. Xcb_program_all(widget, client_data, call_data)
  2093. XWidget        widget;
  2094. XXtPointer    client_data;
  2095. XXtPointer    call_data;
  2096. X{
  2097. X    Arg    arg;
  2098. X    int i;
  2099. X
  2100. X    clear_program(); 
  2101. X
  2102. X    debug_printf(1, "program replaced by in-sequence track list\n");
  2103. X    for (i = 1; i <= cdi.maxtrack; i++)
  2104. X        program_add_track ((unsigned char) i);
  2105. X}
  2106. X
  2107. Xstatic void
  2108. Xcb_clear_program (widget, client_data, call_data)
  2109. XWidget        widget;
  2110. XXtPointer    client_data;
  2111. XXtPointer    call_data;
  2112. X{
  2113. X    clear_program(); /* get rid of program */
  2114. X    debug_printf(1, "program cleared\n");
  2115. X}
  2116. X
  2117. Xstatic void
  2118. Xcb_cancel_program (widget, client_data, call_data)
  2119. XWidget        widget;
  2120. XXtPointer    client_data;
  2121. XXtPointer    call_data;
  2122. X{
  2123. X    program_cancel(); /* get rid of program and form */
  2124. X}
  2125. X
  2126. Xvoid
  2127. Xcb_save_program (widget, client_data, call_data)
  2128. XWidget        widget;
  2129. XXtPointer    client_data;
  2130. XXtPointer    call_data;
  2131. X{
  2132. X    Arg    arg;
  2133. X    char    *progstr;
  2134. X    extern FILE    *disc_info;
  2135. X
  2136. X    disc_info = fopen(info_filename, "w+"); /* open for r/w */
  2137. X    if (disc_info == NULL) {
  2138. X        fprintf(stderr,"Can't open save file %s\n",info_filename);
  2139. X        perror("cb_save_program");
  2140. X        return;
  2141. X    }
  2142. X    fprintf(disc_info, "Title:%s\nProgram: %s\n", disc_title, program_str);
  2143. X    fflush(disc_info);
  2144. X
  2145. X    debug_printf(1, "program saved to %s\n", info_filename);
  2146. X}
  2147. X
  2148. Xvoid
  2149. Xadd_to_new_track (number)
  2150. Xint    number;
  2151. X{
  2152. X    Arg    arg;
  2153. X    char    *namestr;
  2154. X    int    track = 0;
  2155. X
  2156. X    /* an apparent bug in my system won't allow the auto-display of this
  2157. X     * label change without explicit forcing redraw via something other
  2158. X     * than the label itself
  2159. X     */
  2160. X    XtSetArg(arg, XtNsensitive, False);
  2161. X    XtSetValues(new_track_button, &arg, 1);
  2162. X
  2163. X    XtSetArg(arg, XtNlabel, &namestr);
  2164. X    XtGetValues(new_track_button, &arg, 1);
  2165. X    if (namestr[0] != ' ')
  2166. X        sscanf (namestr, "%d", &track);
  2167. X    track += number;
  2168. X    sprintf(namestr, "%d\n", track);
  2169. X    XtSetArg(arg, XtNlabel, namestr);
  2170. X    XtSetValues(new_track_button, &arg, 1);
  2171. X
  2172. X    /* reset the sensitive flage for redraw */
  2173. X    XtSetArg(arg, XtNsensitive, True);
  2174. X    XtSetValues(new_track_button, &arg, 1);
  2175. X}
  2176. X
  2177. Xstatic void
  2178. Xcb_add_10(widget, client_data, call_data)
  2179. XWidget        widget;
  2180. XXtPointer    client_data;
  2181. XXtPointer    call_data;
  2182. X{
  2183. X    Arg    arg;
  2184. X    char    *namestr;
  2185. X    int    track = 0;
  2186. X
  2187. X    XtSetArg(arg, XtNsensitive, True);
  2188. X    XtSetValues(new_track_button, &arg, 1);
  2189. X    adding_to_new_track = True;
  2190. X    add_to_new_track(10);
  2191. X}
  2192. X
  2193. Xstatic void
  2194. Xcb_new_track(widget, client_data, call_data)
  2195. XWidget        widget;
  2196. XXtPointer    client_data;
  2197. XXtPointer    call_data;
  2198. X{
  2199. X    Arg    arg;
  2200. X    char    *namestr;
  2201. X    int    track;
  2202. X
  2203. X    XtSetArg(arg, XtNlabel, &namestr);
  2204. X    XtGetValues(widget, &arg, 1);
  2205. X    sscanf (namestr, "%d", &track);
  2206. X
  2207. X    if ((track >= cdi.mintrack) && (track <= cdi.maxtrack))
  2208. X    {
  2209. X        debug_printf(1, "adding track %d to program\n", track);
  2210. X        program_add_track((unsigned char) track);
  2211. X    }
  2212. X    XtSetArg(arg, XtNlabel, "  ");
  2213. X    XtSetValues(new_track_button, &arg, 1);
  2214. X    XtSetArg(arg, XtNsensitive, False);
  2215. X    XtSetValues(new_track_button, &arg, 1);
  2216. X    adding_to_new_track = False;
  2217. X}
  2218. X
  2219. X
  2220. Xstatic void
  2221. Xcb_trackbuttons(widget, client_data, call_data)
  2222. XWidget        widget;
  2223. XXtPointer    client_data;
  2224. XXtPointer    call_data;
  2225. X{
  2226. X    Arg    arg;
  2227. X    char    *namestr;
  2228. X    int    track;
  2229. X    Boolean state;
  2230. X
  2231. X    XtSetArg(arg, XtNlabel, &namestr);
  2232. X    XtGetValues(widget, &arg, 1);
  2233. X    sscanf (namestr, "%d", &track);
  2234. X
  2235. X    if (adding_to_new_track)
  2236. X        add_to_new_track(track);
  2237. X    else
  2238. X    {
  2239. X        debug_printf(1, "adding track %d to program\n", track);
  2240. X        program_add_track((unsigned char) track);
  2241. X    }
  2242. X
  2243. X}
  2244. END_OF_FILE
  2245. if test 18485 -ne `wc -c <'xcdplayer-2.2/program.c'`; then
  2246.     echo shar: \"'xcdplayer-2.2/program.c'\" unpacked with wrong size!
  2247. fi
  2248. # end of 'xcdplayer-2.2/program.c'
  2249. fi
  2250. echo shar: End of archive 4 \(of 5\).
  2251. cp /dev/null ark4isdone
  2252. MISSING=""
  2253. for I in 1 2 3 4 5 ; do
  2254.     if test ! -f ark${I}isdone ; then
  2255.     MISSING="${MISSING} ${I}"
  2256.     fi
  2257. done
  2258. if test "${MISSING}" = "" ; then
  2259.     echo You have unpacked all 5 archives.
  2260.     rm -f ark[1-9]isdone
  2261. else
  2262.     echo You still need to unpack the following archives:
  2263.     echo "        " ${MISSING}
  2264. fi
  2265. ##  End of shell archive.
  2266. exit 0
  2267. -- 
  2268. Dan Rich                    | drich@lerc.nasa.gov   |  (216) 433-4000
  2269. Sr. Systems Engineer        | "Danger, you haven't seen the last of me!"
  2270. RMS Technologies, Inc.      |    "No, but the first of you turns my stomach!"
  2271. NASA Lewis Research Center  | -- The Firesign Theatre's Nick Danger
  2272.  
  2273.