1 /*
2  * Copyright (C) 1990 Regents of the University of California.
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and
5  * its documentation for any purpose is hereby granted without fee,
6  * provided that the above copyright notice appear in all copies and that
7  * both that copyright notice and this permission notice appear in
8  * supporting documentation, and that the name of the University of
9  * California not be used in advertising or publicity pertaining to
10  * distribution of the software without specific, written prior
11  * permission.  the University of California makes no representations
12  * about the suitability of this software for any purpose.  It is provided
13  * "as is" without express or implied warranty.
14  */
15 
16 #include <stdio.h>
17 # include <X11/Intrinsic.h>
18 # include <X11/StringDefs.h>
19 # include <X11/Xaw/Form.h>
20 # include <X11/Xaw/Toggle.h>
21 
22 # include "cdrom_globs.h"
23 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
24 # include "cdrom_freebsd.h"
25 #endif
26 #ifdef sun
27 # include "cdrom_sun.h"
28 #endif
29 #ifdef sgi
30 # include "cdrom_sgi.h"
31 #endif
32 
33 # include "play.xbm"
34 # include "pause.xbm"
35 # include "stop.xbm"
36 # include "prev.xbm"
37 # include "next.xbm"
38 # include "eject.xbm"
39 #ifdef sgi
40 # include "audio.xbm"
41 #endif
42 
43 # include "quit.xbm"
44 # include "cycle.xbm"
45 # include "shuffle.xbm"
46 # include "rewind.xbm"
47 # include "ff.xbm"
48 # include "pgm.xbm"
cwdnull49 
50 void     title_dialog_setup();
51 static	void     play_button_setup();
52 static	void     stop_button_setup();
53 static	void     pause_button_setup();
54 static	void     prev_button_setup();
55 static	void     next_button_setup();
56 static	void     eject_button_setup();
57 #ifdef sgi
58 void     audio_button_setup();
59 #endif
60 static	void     quit_button_setup();
61 static	void     cycle_button_setup();
62 static	void     shuffle_button_setup();
63 static	void     rew_button_setup();
64 static	void     ff_button_setup();
65 static	void     pgm_button_setup();
machinenull66 void     buttons_reset();
67 
68 static Widget	buttons_form_widget;
69 static Widget	play_button_widget;
70 static Widget	stop_button_widget;
71 static Widget	pause_button_widget;
72 static Widget	eject_button_widget;
73 #ifdef sgi
74 static Widget	audio_button_widget;
usagenull75 #endif
76 static Widget	shuffle_button_widget;
versionnull77 static Widget	cycle_button_widget;
78 static Widget	pgm_button_widget;
79 
80 /*
81  * these are global for the "scan" functions to query their state;
82  * they and the code that they work with should probably be be switched
83  * to repeater widgets once R5 becomes universal...
84  */
85 Widget	rew_button_widget;
86 Widget	ff_button_widget;
87 
88 
89 void
90 button_setup(parent_widget)
91 	Widget		parent_widget;
read_config_datanull92 {
93 	Arg		args[1];
94 
95 	buttons_form_widget = XtCreateManagedWidget("buttonsForm",
96 						    formWidgetClass,
97 						    parent_widget,
98 						    (ArgList) NULL, 0);
99 
100 	play_button_setup(buttons_form_widget);
101 
102 	pause_button_setup(buttons_form_widget);
103 
104 	stop_button_setup(buttons_form_widget);
105 
106 	prev_button_setup(buttons_form_widget);
107 
108 	next_button_setup(buttons_form_widget);
109 
110 	eject_button_setup(buttons_form_widget);
111 
112 #ifdef sgi
113 	audio_button_setup(buttons_form_widget);
114 #endif
115 
116 	quit_button_setup(buttons_form_widget);
117 
118 	cycle_button_setup(buttons_form_widget);
119 
120 	shuffle_button_setup(buttons_form_widget);
121 
122 	rew_button_setup(buttons_form_widget);
123 
124 	ff_button_setup(buttons_form_widget);
125 
126 	pgm_button_setup(buttons_form_widget);
127 
128 
129 	/* set the initial state of the buttons */
130 	buttons_reset();
131 }
132 
133 static void
134 play_button_setup(parent_widget)
135 	Widget		parent_widget;
136 {
137 	Pixmap		play_button_pixmap;
138 	Arg		args[1];
139 
140 	play_button_widget = XtCreateManagedWidget("playButton",
141 						   toggleWidgetClass,
142 						   parent_widget,
143 						   (ArgList) NULL, 0);
144 
145 	play_button_pixmap = XCreateBitmapFromData(XtDisplay(play_button_widget),
146 						   rootwin(play_button_widget),
147 						   play_bits,
148 						   play_width, play_height);
149 
150 	XtSetArg(args[0], XtNbitmap, (XtArgVal) play_button_pixmap);
151 	XtSetValues(play_button_widget, args, 1);
152 
153 	XtAddCallback(play_button_widget, XtNcallback, cb_cdrom_play, 0);
154 
155 }
156 
157 static void
158 pause_button_setup(parent_widget)
159 	Widget		parent_widget;
160 {
161 	Pixmap		pause_button_pixmap;
162 	Arg		args[1];
163 
164 	pause_button_widget = XtCreateManagedWidget("pauseButton",
165 						    toggleWidgetClass,
166 						    parent_widget,
167 						    (ArgList) NULL, 0);
168 
169 	pause_button_pixmap = XCreateBitmapFromData(XtDisplay(pause_button_widget),
170 						    rootwin(pause_button_widget),
171 						    pause_bits,
172 						    pause_width, pause_height);
173 
174 	XtSetArg(args[0], XtNbitmap, (XtArgVal) pause_button_pixmap);
dbh=safe_connectnull175 	XtSetValues(pause_button_widget, args, 1);
176 
177 	XtAddCallback(pause_button_widget, XtNcallback, cb_cdrom_pause, 0);
178 }
179 
180 static void
181 stop_button_setup(parent_widget)
182 	Widget		parent_widget;
183 {
184 	Pixmap		stop_button_pixmap;
185 	Arg		args[1];
186 
187 	stop_button_widget = XtCreateManagedWidget("stopButton",
188 						   toggleWidgetClass,
189 						   parent_widget,
190 						   (ArgList) NULL, 0);
191 
192 	stop_button_pixmap = XCreateBitmapFromData(XtDisplay(stop_button_widget),
193 						   rootwin(stop_button_widget),
194 						   stop_bits,
195 						   stop_width, stop_height);
196 
197 	XtSetArg(args[0], XtNbitmap, (XtArgVal) stop_button_pixmap);
198 	XtSetValues(stop_button_widget, args, 1);
199 
200 	XtAddCallback(stop_button_widget, XtNcallback, cb_cdrom_stop, 0);
201 
202 }
203 
204 static void
205 prev_button_setup(parent_widget)
206 	Widget		parent_widget;
207 {
208 	Widget		prev_button_widget;
209 	Pixmap		prev_button_pixmap;
210 	Arg		args[1];
211 
212 	prev_button_widget = XtCreateManagedWidget("prevButton",
213 						  toggleWidgetClass,
214 						  parent_widget,
215 						  (ArgList) NULL, 0);
216 
217 	prev_button_pixmap = XCreateBitmapFromData(XtDisplay(prev_button_widget),
218 						  rootwin(prev_button_widget),
219 						  prev_bits,
220 						  prev_width, prev_height);
221 
222 	XtSetArg(args[0], XtNbitmap, (XtArgVal) prev_button_pixmap);
223 	XtSetValues(prev_button_widget, args, 1);
224 
225 	XtAddCallback(prev_button_widget, XtNcallback, cb_cdrom_previous, 0);
226 }
227 
228 static void
229 next_button_setup(parent_widget)
230 	Widget		parent_widget;
231 {
232 	Widget		next_button_widget;
233 	Pixmap		next_button_pixmap;
234 	Arg		args[1];
235 
236 	next_button_widget = XtCreateManagedWidget("nextButton",
237 						 toggleWidgetClass,
238 						 parent_widget,
239 						 (ArgList) NULL, 0);
240 
241 	next_button_pixmap = XCreateBitmapFromData(XtDisplay(next_button_widget),
242 						 rootwin(next_button_widget),
243 						 next_bits,
244 						 next_width, next_height);
245 
246 	XtSetArg(args[0], XtNbitmap, (XtArgVal) next_button_pixmap);
247 	XtSetValues(next_button_widget, args, 1);
248 
249 	XtAddCallback(next_button_widget, XtNcallback, cb_cdrom_next, 0);
250 }
251 
252 static void
253 eject_button_setup(parent_widget)
254 	Widget		parent_widget;
255 {
256 	Pixmap		eject_button_pixmap;
257 	Arg		args[1];
258 
259 	eject_button_widget = XtCreateManagedWidget("ejectButton",
260 						    toggleWidgetClass,
261 						    parent_widget,
262 						    (ArgList) NULL, 0);
263 
264 	eject_button_pixmap = XCreateBitmapFromData(XtDisplay(eject_button_widget),
265 						    rootwin(eject_button_widget),
266 						    eject_bits,
267 						    eject_width, eject_height);
268 
269 	XtSetArg(args[0], XtNbitmap, (XtArgVal) eject_button_pixmap);
270 	XtSetValues(eject_button_widget, args, 1);
271 
272 	XtAddCallback(eject_button_widget, XtNcallback, cb_cdrom_eject, 0);
273 }
274 
275 #ifdef sgi
276 static void
277 audio_button_setup(parent_widget)
278 	Widget		parent_widget;
279 {
280 	Pixmap		audio_button_pixmap;
281 	Arg		args[1];
282 
283 	audio_button_widget = XtCreateManagedWidget("audioButton",
284 						    toggleWidgetClass,
285 						    parent_widget,
286 						    (ArgList) NULL, 0);
287 
288 	audio_button_pixmap = XCreateBitmapFromData(XtDisplay(audio_button_widget),
289 						    rootwin(audio_button_widget),
290 						    audio_bits,
291 						    audio_width, audio_height);
292 
293 	XtSetArg(args[0], XtNbitmap, (XtArgVal) audio_button_pixmap);
294 	XtSetValues(audio_button_widget, args, 1);
295 
296 	XtAddCallback(audio_button_widget, XtNcallback, cb_cdrom_audio, 0);
297 }
298 #endif
299 
300 static void
301 quit_button_setup(parent_widget)
302 	Widget		parent_widget;
303 {
304 	Widget		quit_button_widget;
305 	Pixmap		quit_button_pixmap;
306 	Arg		args[1];
307 
308 	quit_button_widget = XtCreateManagedWidget("quitButton",
309 						    toggleWidgetClass,
310 						    parent_widget,
311 						    (ArgList) NULL, 0);
312 
313 	quit_button_pixmap = XCreateBitmapFromData(XtDisplay(quit_button_widget),
314 						    rootwin(quit_button_widget),
315 						    quit_bits,
316 						    quit_width, quit_height);
317 
318 	XtSetArg(args[0], XtNbitmap, (XtArgVal) quit_button_pixmap);
319 	XtSetValues(quit_button_widget, args, 1);
320 
321 	XtAddCallback(quit_button_widget, XtNcallback, cb_cdrom_quit, 0);
322 }
323 
324 static void
325 cycle_button_setup(parent_widget)
326 	Widget		parent_widget;
327 {
328 	Widget		cycle_button_widget;
329 	Pixmap		cycle_button_pixmap;
330 	Arg		args[1];
331 
332 	cycle_button_widget = XtCreateManagedWidget("cycleButton",
333 						    toggleWidgetClass,
334 						    parent_widget,
335 						    (ArgList) NULL, 0);
336 
337 	cycle_button_pixmap = XCreateBitmapFromData(XtDisplay(cycle_button_widget),
338 						    rootwin(cycle_button_widget),
339 						    cycle_bits,
340 						    cycle_width, cycle_height);
341 
342 	XtSetArg(args[0], XtNbitmap, (XtArgVal) cycle_button_pixmap);
343 	XtSetValues(cycle_button_widget, args, 1);
344 
345 	XtAddCallback(cycle_button_widget, XtNcallback, cb_cdrom_cycle, 0);
346 }
347 
348 static void
349 shuffle_button_setup(parent_widget)
350 	Widget		parent_widget;
351 {
352 	Pixmap		shuffle_button_pixmap;
353 	Arg		args[1];
354 
355 	shuffle_button_widget = XtCreateManagedWidget("shuffleButton",
356 						      toggleWidgetClass,
357 						      parent_widget,
358 						      (ArgList) NULL, 0);
359 
360 	shuffle_button_pixmap = XCreateBitmapFromData(XtDisplay(shuffle_button_widget),
361 						      rootwin(shuffle_button_widget),
362 						      shuffle_bits,
363 						      shuffle_width, shuffle_height);
364 
365 	XtSetArg(args[0], XtNbitmap, (XtArgVal) shuffle_button_pixmap);
366 	XtSetValues(shuffle_button_widget, args, 1);
367 
368 	XtAddCallback(shuffle_button_widget, XtNcallback, cb_cdrom_shuffle, 0);
369 }
370 
371 
372 static void
373 rew_button_setup(parent_widget)
374         Widget          parent_widget;
375 {
376         Pixmap          rew_button_pixmap;
377         Arg             args[1];
378 
379         rew_button_widget = XtCreateManagedWidget("rewButton",
380                                                   toggleWidgetClass,
381                                                   parent_widget,
382                                                   (ArgList) NULL, 0);
383 
384         rew_button_pixmap = XCreateBitmapFromData(XtDisplay(rew_button_widget),
385                                                   rootwin(rew_button_widget),
386                                                   rewind_bits,
387                                                   rewind_width, rewind_height);
388 
389         XtSetArg(args[0], XtNbitmap, (XtArgVal) rew_button_pixmap);
390         XtSetValues(rew_button_widget, args, 1);
391 
392         XtAddCallback(rew_button_widget, XtNcallback, cb_cdrom_rewind, 0);
393 }
394 
395 
396 
397 static void
398 ff_button_setup(parent_widget)
399         Widget          parent_widget;
400 {
401         Pixmap          ff_button_pixmap;
402         Arg             args[1];
403 
404         ff_button_widget = XtCreateManagedWidget("ffButton",
405                                                  toggleWidgetClass,
406                                                  parent_widget,
407                                                  (ArgList) NULL, 0);
408 
409         ff_button_pixmap = XCreateBitmapFromData(XtDisplay(ff_button_widget),
410                                                  rootwin(ff_button_widget),
411                                                  ff_bits,
412                                                  ff_width, ff_height);
413 
414         XtSetArg(args[0], XtNbitmap, (XtArgVal) ff_button_pixmap);
415         XtSetValues(ff_button_widget, args, 1);
416 
417         XtAddCallback(ff_button_widget, XtNcallback, cb_cdrom_ff, 0);
418 }
419 
420 static void
421 pgm_button_setup(parent_widget)
422         Widget          parent_widget;
423 {
424         Pixmap          pgm_button_pixmap;
425         Arg             args[1];
426 	extern Widget	top_form;
427 
428         pgm_button_widget = XtCreateManagedWidget("pgmButton",
429                                                  toggleWidgetClass,
430                                                  parent_widget,
431                                                  (ArgList) NULL, 0);
432 
433         pgm_button_pixmap = XCreateBitmapFromData(XtDisplay(pgm_button_widget),
434                                                  rootwin(pgm_button_widget),
435                                                  pgm_bits,
436                                                  pgm_width, pgm_height);
437 
438         XtSetArg(args[0], XtNbitmap, (XtArgVal) pgm_button_pixmap);
439         XtSetValues(pgm_button_widget, args, 1);
440 
441         XtAddCallback(pgm_button_widget, XtNcallback, cb_cdrom_program,
442 		(XtPointer) top_form);
443 }
444 
445 void
446 play_button_set() {
447 	Arg		args[1];
448 
449 	XtSetArg(args[0], XtNstate, True);
450 	XtSetValues(play_button_widget, args, 1);
451 }
452 
453 void
454 play_button_reset() {
455 	Arg		args[1];
456 
457 	XtSetArg(args[0], XtNstate, False);
458 	XtSetValues(play_button_widget, args, 1);
459 }
460 
461 void
462 pause_button_reset() {
463 	Arg		args[1];
464 
465 	XtSetArg(args[0], XtNstate, False);
466 	XtSetValues(pause_button_widget, args, 1);
467 }
468 
469 void
470 stop_button_reset() {
471 	Arg		args[1];
472 
473 	XtSetArg(args[0], XtNstate, False);
474 	XtSetValues(stop_button_widget, args, 1);
475 }
476 
477 void
478 eject_button_reset() {
479 	Arg		args[1];
480 
481 	XtSetArg(args[0], XtNstate, False);
482 	XtSetValues(eject_button_widget, args, 1);
483 }
484 
485 void
486 eject_button_set() {
487 	Arg		args[1];
488 
489 	XtSetArg(args[0], XtNstate, True);
490 	XtSetValues(eject_button_widget, args, 1);
491 }
492 
493 #ifdef sgi
494 void
495 audio_button_reset() {
496 	Arg		args[1];
497 
498 	XtSetArg(args[0], XtNstate, False);
499 	XtSetValues(audio_button_widget, args, 1);
500 }
501 
502 void
503 audio_button_set() {
504 	Arg		args[1];
505 
506 	XtSetArg(args[0], XtNstate, True);
507 	XtSetValues(audio_button_widget, args, 1);
508 }
509 
510 int
511 audio_button_state() {
512 	Arg		args[1];
513 	Boolean		state;
514 
515 	XtSetArg(args[0], XtNstate, &state);
516 	XtGetValues(audio_button_widget, args, 1);
517 	return(state);
518 }
519 #endif
520 
521 void
522 shuffle_button_set() {
523 	Arg		args[1];
524 
525 	XtSetArg(args[0], XtNstate, True);
526 	XtSetValues(shuffle_button_widget, args, 1);
527 }
528 
529 void
530 shuffle_button_reset() {
531 	Arg		args[1];
532 
533 	XtSetArg(args[0], XtNstate, False);
534 	XtSetValues(shuffle_button_widget, args, 1);
535 }
536 
537 void
538 cycle_button_reset() {
539 	Arg		args[1];
540 
541 	XtSetArg(args[0], XtNstate, False);
542 	XtSetValues(cycle_button_widget, args, 1);
543 }
544 
dbh=retry_connectnull545 void
546 pgm_button_set() {
547 	Arg		args[2];
548 
549 	XtSetArg(args[0], XtNstate, True);
550 	XtSetValues(pgm_button_widget, args, 1);
551 }
552 
553 void
554 pgm_button_reset() {
555 	Arg		args[2];
556 
557 	XtSetArg(args[0], XtNstate, False);
558 	XtSetValues(pgm_button_widget, args, 1);
559 }
560 
561 void
562 buttons_reset() {
563 	Arg		args[2];
564 #ifdef sun
565 	Boolean		state;
566 #endif
567 
568 #ifdef sgi
569 	if (cdi.scsi_audio) {
570 		XtSetArg(args[0], XtNstate, True);
571 		XtSetValues(audio_button_widget, args, 1);
572 	} else {
573 		XtSetArg(args[0], XtNstate, False);
574 		XtSetValues(audio_button_widget, args, 1);
575 	}
576 #endif
577 
578 	switch (cdrom_status()) {
579 	case -1:
580 		XtSetArg(args[0], XtNstate, True);
581 		XtSetValues(eject_button_widget, args, 1);
582 		cdi.state |= CDROM_STATE_EJECTED;
583 		disc_title = NODISCSTR;
584 		update_title();
585 		break;
586 
587 	case CDROM_PLAYING:
588 		XtSetArg(args[0], XtNstate, True);
589 		XtSetValues(play_button_widget, args, 1);
590 		cdi.state |= CDROM_STATE_PLAY;
591 		cdrom_timer_on();
592 		break;
593 
594 	case CDROM_PAUSED:
595 #ifdef sun
596 		/*
597 		 * The Sun doesn't have a "stop" state, so handle the
598 		 * initial startup condition.
599 		 */
600 		XtSetArg(args[0], XtNstate, &state);
601 		XtGetValues(pause_button_widget, args, 1);
602 		if (state == False) {
603 			XtSetArg(args[0], XtNstate, True);
604 			XtSetValues(stop_button_widget, args, 1);
605 			cdi.state |= CDROM_STATE_STOP;
606 			break;
607 		}
608 #endif
609 		XtSetArg(args[0], XtNstate, True);
610 		XtSetValues(play_button_widget, args, 1);
611 		XtSetArg(args[0], XtNstate, True);
612 		XtSetValues(pause_button_widget, args, 1);
613 		cdi.state |= CDROM_STATE_PLAY;
614 		cdi.curtrack = cdrom_get_curtrack();
615 		track_button_update(); /* make track button read on startup */
616 		timer_button_update(); /* make timer button read on startup */
617 		cdi.state |= CDROM_STATE_PAUSE;
618 		break;
619 
620 	default:
621 		XtSetArg(args[0], XtNstate, True);
622 		XtSetValues(stop_button_widget, args, 1);
623 		cdi.state |= CDROM_STATE_STOP;
624 		break;
625 	}
626 }
627