|
|
1.1 root 1: /*
2: * UAE - the Un*x Amiga Emulator
3: *
4: * Yet Another User Interface for the X11 version
5: *
6: * Copyright 1997, 1998 Bernd Schmidt
7: *
8: * The Tk GUI doesn't work.
9: * The X Forms Library isn't available as source, and there aren't any
10: * binaries compiled against glibc
11: *
12: * So let's try this...
13: */
14:
15: #include "sysconfig.h"
16: #include "sysdeps.h"
17:
18: #include "config.h"
19: #include "options.h"
20: #include "uae.h"
21: #include "memory.h"
22: #include "custom.h"
23: #include "readcpu.h"
24: #include "gui.h"
25: #include "newcpu.h"
26: #include "threaddep/penguin.h"
27:
28: #include <gtk/gtk.h>
29:
30: static int gui_active;
31:
32: static GtkWidget *disk_insert_widget[4], *disk_eject_widget[4], *disk_text_widget[4];
33: static char *disk_string[4];
34: static char *new_disk_string[4];
35:
36: static GtkAdjustment *cpuspeed_adj;
37: static GtkWidget *cpu_widget[4], *a24m_widget, *ccpu_widget;
38:
39: static GtkAdjustment *framerate_adj;
40: static GtkWidget *bimm_widget, *b32_widget;
41:
42: static GtkWidget *joy_widget[2][6];
43:
44: static GtkWidget *led_widgets[5];
45: static GdkColor led_on[5], led_off[5];
46: static unsigned int prevledstate;
47:
48: static void save_config (void)
49: {
50: FILE *f;
51: char tmp[257];
52:
53: /* Backup the options file. */
54: strcpy (tmp, optionsfile);
55: strcat (tmp, "~");
56: rename (optionsfile, tmp);
57:
58: f = fopen (optionsfile, "w");
59: if (f == NULL) {
60: fprintf(stderr, "Error saving options file!\n");
61: return;
62: }
63: save_options (f);
64: fclose (f);
65: }
66:
67: static int nr_for_led (GtkWidget *led)
68: {
69: int i;
70: i = 0;
71: while (led_widgets[i] != led)
72: i++;
73: return i;
74: }
75:
76: static smp_comm_pipe to_gui_pipe, from_gui_pipe;
77: static uae_sem_t gui_sem, gui_quit_sem;
78:
79: static volatile int quit_gui = 0, quitted_gui = 0;
80:
81: static void enable_disk_buttons (int enable)
82: {
83: int i;
84: for (i = 0; i < 4; i++) {
85: gtk_widget_set_sensitive (disk_insert_widget[i], enable);
86: gtk_widget_set_sensitive (disk_eject_widget[i], enable);
87: }
88: }
89:
90: static void set_cpu_state (void)
91: {
92: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0);
93: gtk_widget_set_sensitive (a24m_widget, changed_prefs.cpu_level > 1);
94: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0);
95: gtk_widget_set_sensitive (ccpu_widget, changed_prefs.cpu_level == 0);
96: }
97:
98: static void set_cpu_widget (void)
99: {
100: int nr = changed_prefs.cpu_level;
101: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE);
102: }
103:
104: static void set_gfx_state (void)
105: {
106: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0);
107: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0);
108: }
109:
110: static void set_joy_state (void)
111: {
112: int j0t = changed_prefs.fake_joystick & 255;
113: int j1t = (changed_prefs.fake_joystick >> 8) & 255;
114: int i;
115:
116: if (j0t == j1t) {
117: /* Can't happen */
118: j0t++;
119: j0t %= 6;
120: }
121: for (i = 0; i < 6; i++) {
122: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i);
123: gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i);
124: gtk_widget_set_sensitive (joy_widget[0][i], j1t != i);
125: gtk_widget_set_sensitive (joy_widget[1][i], j0t != i);
126: }
127: }
128:
129: static void draw_led (int nr)
130: {
131: GtkWidget *thing = led_widgets[nr];
132: GdkWindow *window = thing->window;
133: GdkGC *gc = gdk_gc_new (window);
134: GdkColor *col;
135:
136: if (gui_ledstate & (1 << nr))
137: col = led_on + nr;
138: else
139: col = led_off + nr;
140: gdk_gc_set_foreground (gc, col);
141: gdk_draw_rectangle (window, gc, 1, 0, 0, -1, -1);
142: gdk_gc_destroy (gc);
143: }
144:
145: static int my_idle (void)
146: {
147: unsigned int leds = gui_ledstate;
148: int i;
149:
150: if (quit_gui) {
151: /*printf("Foo...\n");*/
152: gtk_main_quit ();
153: goto out;
154: }
155: while (comm_pipe_has_data (&to_gui_pipe)) {
156: int cmd = read_comm_pipe_int_blocking (&to_gui_pipe);
157: int n;
158: /*printf ("cmd %d\n", cmd);*/
159: switch (cmd) {
160: case 0:
161: n = read_comm_pipe_int_blocking (&to_gui_pipe);
162: gtk_label_set (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]);
163: break;
164: case 1:
165: /* Initialization. */
166: set_cpu_widget ();
167: set_cpu_state ();
168: set_gfx_state ();
169: set_joy_state ();
170: gui_active = 1;
171: break;
172: }
173: }
174:
175: for (i = 0; i < 5; i++) {
176: unsigned int mask = 1 << i;
177: int on = leds & mask;
178:
179: if (on == (prevledstate & mask))
180: continue;
181:
182: /* printf(": %d %d\n", i, on);*/
183: draw_led (i);
184: }
185: prevledstate = leds;
186: out:
187: return 1;
188: }
189:
190: static void joy_changed (void)
191: {
192: int j0t = 0, j1t = 0;
193: int i;
194: if (! gui_active)
195: return;
196:
197: for (i = 0; i < 6; i++)
198: if (GTK_TOGGLE_BUTTON (joy_widget[0][i])->active) {
199: j0t = i;
200: break;
201: }
202: for (i = 0; i < 6; i++)
203: if (GTK_TOGGLE_BUTTON (joy_widget[1][i])->active) {
204: j1t = i;
205: break;
206: }
207: changed_prefs.fake_joystick = j0t | (j1t << 8);
208: set_joy_state ();
209: }
210:
211: static void gfx_changed (void)
212: {
213: changed_prefs.framerate = framerate_adj->value;
214: changed_prefs.blits_32bit_enabled = GTK_TOGGLE_BUTTON (b32_widget)->active;
215: changed_prefs.immediate_blits = GTK_TOGGLE_BUTTON (bimm_widget)->active;
216: }
217:
218: static void cpuspeed_changed (void)
219: {
220: changed_prefs.m68k_speed = cpuspeed_adj->value;
221: }
222:
223: static void cputype_changed (void)
224: {
225: int i, oldcl;
226: if (! gui_active)
227: return;
228:
229: oldcl = changed_prefs.cpu_level;
230:
231: changed_prefs.cpu_level = 0;
232: for (i = 0; i < 4; i++)
233: if (GTK_TOGGLE_BUTTON (cpu_widget[i])->active) {
234: changed_prefs.cpu_level = i;
235: break;
236: }
237:
238: changed_prefs.cpu_compatible = GTK_TOGGLE_BUTTON (ccpu_widget)->active;
239: changed_prefs.address_space_24 = GTK_TOGGLE_BUTTON (a24m_widget)->active;
240:
241: if (changed_prefs.cpu_level != 0)
242: changed_prefs.cpu_compatible = 0;
243: /* 68000/68010 always have a 24 bit address space. */
244: if (changed_prefs.cpu_level < 2)
245: changed_prefs.address_space_24 = 1;
246: /* Changing from 68000/68010 to 68020 should set a sane default. */
247: else if (oldcl < 2)
248: changed_prefs.address_space_24 = 0;
249:
250: set_cpu_state ();
251: }
252:
253: static void did_reset (void)
254: {
255: if (quit_gui)
256: return;
257:
258: write_comm_pipe_int (&from_gui_pipe, 2, 1);
259: }
260:
261: static void did_debug (void)
262: {
263: if (quit_gui)
264: return;
265:
266: write_comm_pipe_int (&from_gui_pipe, 3, 1);
267: }
268:
269: static void did_quit (void)
270: {
271: if (quit_gui)
272: return;
273:
274: write_comm_pipe_int (&from_gui_pipe, 4, 1);
275: }
276:
277: static void did_eject (int n)
278: {
279: if (quit_gui)
280: return;
281:
282: write_comm_pipe_int (&from_gui_pipe, 0, 0);
283: write_comm_pipe_int (&from_gui_pipe, n, 1);
284: }
285:
286: static int filesel_active = -1;
287: static GtkWidget *selector;
288:
289: static void did_close_insert (GtkObject *o, GtkWidget *w)
290: {
291: filesel_active = -1;
292: enable_disk_buttons (1);
293: gtk_widget_hide (selector);
294: }
295:
296: static void did_cancel_insert (GtkObject *o)
297: {
298: filesel_active = -1;
299: enable_disk_buttons (1);
300: gtk_widget_hide (selector);
301: }
302:
303: static void did_insert_select (GtkObject *o)
304: {
305: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (selector));
306: printf ("%s\n", s);
307: if (quit_gui)
308: return;
309:
310: uae_sem_wait (&gui_sem);
311: if (new_disk_string[filesel_active] != 0)
312: free (new_disk_string[filesel_active]);
313: new_disk_string[filesel_active] = strdup (s);
314: uae_sem_post (&gui_sem);
315: write_comm_pipe_int (&from_gui_pipe, 1, 0);
316: write_comm_pipe_int (&from_gui_pipe, filesel_active, 1);
317: filesel_active = -1;
318: enable_disk_buttons (1);
319: gtk_widget_hide (selector);
320: }
321:
322: static char fsbuffer[100];
323:
324: static void did_insert (int n)
325: {
326: if (filesel_active != -1)
327: return;
328: filesel_active = n;
329: enable_disk_buttons (0);
330:
331: sprintf (fsbuffer, "Select a disk image file for DF%d", n);
332: gtk_window_set_title (GTK_WINDOW (selector), fsbuffer);
333:
334: /*printf("%p\n", selector);*/
335: gtk_widget_show (selector);
336: }
337:
338: static void did_eject_0 (void) { did_eject (0); }
339: static void did_eject_1 (void) { did_eject (1); }
340: static void did_eject_2 (void) { did_eject (2); }
341: static void did_eject_3 (void) { did_eject (3); }
342:
343: static void did_insert_0 (void) { did_insert (0); }
344: static void did_insert_1 (void) { did_insert (1); }
345: static void did_insert_2 (void) { did_insert (2); }
346: static void did_insert_3 (void) { did_insert (3); }
347:
348: static gint driveled_event (GtkWidget *thing, GdkEvent *event)
349: {
350: gint x, y;
351: GtkStyle *style;
352: int lednr = nr_for_led (thing);
353:
354: switch (event->type) {
355: case GDK_MAP:
356: draw_led (lednr);
357: break;
358: case GDK_EXPOSE:
359: draw_led (lednr);
360: break;
361: default:
362: break;
363: }
364:
365: return 0;
366: }
367:
368: static GtkWidget *make_led (int nr)
369: {
370: GtkWidget *subframe, *the_led, *thing;
371: GdkColormap *colormap;
372:
373: the_led = gtk_vbox_new (FALSE, 0);
374: gtk_widget_show (the_led);
375:
376: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
377: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
378: gtk_widget_show (thing);
379:
380: subframe = gtk_frame_new (NULL);
381: gtk_box_pack_start (GTK_BOX (the_led), subframe, TRUE, TRUE, 0);
382: gtk_widget_show (subframe);
383:
384: thing = gtk_drawing_area_new ();
385: gtk_drawing_area_size (GTK_DRAWING_AREA (thing), 20, 5);
386: gtk_widget_set_events (thing, GDK_EXPOSURE_MASK);
387: gtk_container_add (GTK_CONTAINER (subframe), thing);
388: colormap = gtk_widget_get_colormap (thing);
389: led_on[nr].red = nr == 0 ? 0xEEEE : 0xCCCC;
390: led_on[nr].green = nr == 0 ? 0: 0xFFFF;
391: led_on[nr].blue = 0;
392: led_on[nr].pixel = 0;
393: led_off[nr].red = 0;
394: led_off[nr].green = 0;
395: led_off[nr].blue = 0;
396: led_off[nr].pixel = 0;
397: gdk_color_alloc (colormap, led_on + nr);
398: gdk_color_alloc (colormap, led_off + nr);
399: led_widgets[nr] = thing;
400: gtk_signal_connect (GTK_OBJECT (thing), "event",
401: (GtkSignalFunc) driveled_event, (gpointer) thing);
402: gtk_widget_show (thing);
403:
404: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
405: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
406: gtk_widget_show (thing);
407:
408: return the_led;
409: }
410:
411: static void make_floppy_disks (GtkWidget *vbox)
412: {
413: int i;
414: /* Now, the floppy disk control. */
415: for (i = 0; i < 4; i++) {
416: GtkWidget *thing, *subthing, *subframe, *buttonbox;
417: char buf[5];
418: sprintf (buf, "DF%d:", i);
419:
420: /* Each line: a frame with a hbox in it. The hbox contains
421: * the LED, the name of the drive and the diskfile in it, an
422: * Insert button, and an Eject button. */
423: buttonbox = gtk_frame_new (buf);
424: thing = gtk_hbox_new (FALSE, 4);
425: gtk_container_add (GTK_CONTAINER (buttonbox), thing);
426: gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
427: gtk_widget_show (buttonbox);
428: gtk_widget_show (thing);
429: buttonbox = thing;
430:
431: subthing = make_led (i + 1);
432: gtk_box_pack_start (GTK_BOX (buttonbox), subthing, FALSE, TRUE, 0);
433:
434: /* Make the "DF0:xxx" label. */
435: subframe = gtk_frame_new (NULL);
436: gtk_frame_set_shadow_type (GTK_FRAME (subframe), GTK_SHADOW_ETCHED_OUT);
437: gtk_box_pack_start (GTK_BOX (buttonbox), subframe, FALSE, TRUE, 0);
438: gtk_widget_show (subframe);
439:
440: subthing = gtk_vbox_new (FALSE, 0);
441: gtk_widget_show (subthing);
442: gtk_container_add (GTK_CONTAINER (subframe), subthing);
443:
444: thing = gtk_label_new ("");
445: disk_text_widget[i] = thing;
446: gtk_widget_show (thing);
447: gtk_box_pack_start (GTK_BOX (subthing), thing, FALSE, TRUE, 0);
448:
449: gtk_widget_set_usize (subthing,
450: gdk_string_measure (subframe->style->font,
451: "This is a very long name for a disk file, should be enough") + 7, 0);
452: gtk_container_disable_resize (GTK_CONTAINER (subthing));
453:
454: /* Now, the buttons. */
455: thing = gtk_button_new_with_label ("Eject");
456: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
457: gtk_widget_show (thing);
458: disk_eject_widget[i] = thing;
459: gtk_signal_connect (GTK_OBJECT (thing), "clicked",
460: (GtkSignalFunc) (i == 0 ? did_eject_0
461: : i == 1 ? did_eject_1
462: : i == 2 ? did_eject_2 : did_eject_3),
463: NULL);
464:
465: thing = gtk_button_new_with_label ("Insert");
466: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
467: gtk_widget_show (thing);
468: disk_insert_widget[i] = thing;
469: gtk_signal_connect (GTK_OBJECT (thing), "clicked",
470: (GtkSignalFunc) (i == 0 ? did_insert_0
471: : i == 1 ? did_insert_1
472: : i == 2 ? did_insert_2 : did_insert_3),
473: NULL);
474: }
475: }
476:
477: static void make_cpu_widgets (GtkWidget *hbox)
478: {
479: int i;
480: GtkWidget *vbox, *hbox2, *frame;
481: GtkWidget *thing;
482:
483: frame = gtk_frame_new ("CPU type");
484: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
485: gtk_widget_show (frame);
486: vbox = gtk_vbox_new (FALSE, 4);
487: gtk_widget_show (vbox);
488: gtk_container_add (GTK_CONTAINER (frame), vbox);
489:
490: thing = gtk_radio_button_new_with_label (0, "68000");
491: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
492: gtk_widget_show (thing);
493: cpu_widget[0] = thing;
494: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68010");
495: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
496: gtk_widget_show (thing);
497: cpu_widget[1] = thing;
498: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68020");
499: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
500: gtk_widget_show (thing);
501: cpu_widget[2] = thing;
502: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68020/68881");
503: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
504: gtk_widget_show (thing);
505: cpu_widget[3] = thing;
506:
507: for (i = 0; i < 4; i++)
508: gtk_signal_connect (GTK_OBJECT (cpu_widget[i]), "clicked",
509: (GtkSignalFunc) cputype_changed, NULL);
510:
511: frame = gtk_frame_new ("CPU flags");
512: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
513: gtk_widget_show (frame);
514: vbox = gtk_vbox_new (FALSE, 4);
515: gtk_widget_show (vbox);
516: gtk_container_add (GTK_CONTAINER (frame), vbox);
517:
518: hbox2 = gtk_hbox_new (FALSE, 4);
519: gtk_widget_show (hbox2);
520: gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
521:
522: thing = gtk_label_new ("Cycles per instruction:");
523: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
524: gtk_widget_show (thing);
525:
526: cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.m68k_speed, 1.0, 10.0, 1.0, 1.0, 1.0));
527: gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed",
528: GTK_SIGNAL_FUNC (cpuspeed_changed), NULL);
529:
530: thing = gtk_hscale_new (cpuspeed_adj);
531: gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
532: gtk_scale_set_digits (GTK_SCALE (thing), 0);
533: gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
534: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
535: gtk_widget_show (thing);
536:
537: a24m_widget = gtk_check_button_new_with_label ("24 bit address space");
538: gtk_box_pack_start (GTK_BOX (vbox), a24m_widget, FALSE, TRUE, 0);
539: gtk_widget_show (a24m_widget);
540: ccpu_widget = gtk_check_button_new_with_label ("Slow but compatible");
541: gtk_box_pack_start (GTK_BOX (vbox), ccpu_widget, FALSE, TRUE, 0);
542: gtk_widget_show (ccpu_widget);
543:
544: gtk_signal_connect (GTK_OBJECT (ccpu_widget), "clicked",
545: (GtkSignalFunc) cputype_changed, NULL);
546: gtk_signal_connect (GTK_OBJECT (a24m_widget), "clicked",
547: (GtkSignalFunc) cputype_changed, NULL);
548: }
549:
550: static void make_gfx_widgets (GtkWidget *hbox)
551: {
552: int i;
553: GtkWidget *vbox, *hbox2, *frame;
554: GtkWidget *thing;
555:
556: #if 0
557: frame = gtk_frame_new ("CPU type");
558: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
559: gtk_widget_show (frame);
560: #endif
561: vbox = gtk_vbox_new (FALSE, 4);
562: gtk_widget_show (vbox);
563: gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
564: #if 0
565: gtk_container_add (GTK_CONTAINER (frame), vbox);
566: #endif
567:
568: hbox2 = gtk_hbox_new (FALSE, 4);
569: gtk_widget_show (hbox2);
570: gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
571:
572: thing = gtk_label_new ("Framerate:");
573: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
574: gtk_widget_show (thing);
575:
576: framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.framerate, 1.0, 21.0, 1.0, 1.0, 1.0));
577: gtk_signal_connect (GTK_OBJECT (framerate_adj), "value_changed",
578: GTK_SIGNAL_FUNC (gfx_changed), NULL);
579:
580: thing = gtk_hscale_new (framerate_adj);
581: gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
582: gtk_scale_set_digits (GTK_SCALE (thing), 0);
583: gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
584: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
585: gtk_widget_show (thing);
586:
587: b32_widget = gtk_check_button_new_with_label ("32 bit blitter");
588: gtk_box_pack_start (GTK_BOX (vbox), b32_widget, FALSE, TRUE, 0);
589: gtk_widget_show (b32_widget);
590: bimm_widget = gtk_check_button_new_with_label ("Immediate blits");
591: gtk_box_pack_start (GTK_BOX (vbox), bimm_widget, FALSE, TRUE, 0);
592: gtk_widget_show (bimm_widget);
593:
594: gtk_signal_connect (GTK_OBJECT (bimm_widget), "clicked",
595: (GtkSignalFunc) gfx_changed, NULL);
596: gtk_signal_connect (GTK_OBJECT (b32_widget), "clicked",
597: (GtkSignalFunc) gfx_changed, NULL);
598: }
599:
600: static void make_joy_widgets (GtkWidget *hbox)
601: {
602: int i;
603:
604: for (i = 0; i < 2; i++) {
605: GtkWidget *vbox, *frame;
606: GtkWidget *thing;
607: char buffer[20];
608: int j;
609:
610: sprintf (buffer, "Port %d", i);
611: frame = gtk_frame_new (buffer);
612: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
613: gtk_widget_show (frame);
614: vbox = gtk_vbox_new (FALSE, 4);
615: gtk_widget_show (vbox);
616: gtk_container_add (GTK_CONTAINER (frame), vbox);
617:
618: thing = gtk_radio_button_new_with_label (0, "Joystick 0");
619: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
620: gtk_widget_show (thing);
621: joy_widget[i][0] = thing;
622: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Joystick 1");
623: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
624: gtk_widget_show (thing);
625: joy_widget[i][1] = thing;
626: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Mouse");
627: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
628: gtk_widget_show (thing);
629: joy_widget[i][2] = thing;
630: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Numeric pad");
631: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
632: gtk_widget_show (thing);
633: joy_widget[i][3] = thing;
634: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Cursor keys/Right Ctrl");
635: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
636: gtk_widget_show (thing);
637: joy_widget[i][4] = thing;
638: thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "T/F/H/B/Left Alt");
639: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
640: gtk_widget_show (thing);
641: joy_widget[i][5] = thing;
642:
643: for (j = 0; j < 6; j++)
644: gtk_signal_connect (GTK_OBJECT (joy_widget[i][j]), "clicked",
645: (GtkSignalFunc) joy_changed, NULL);
646: }
647: }
648:
649: static void *gtk_penguin (void *dummy)
650: {
651: GtkWidget *window, *notebook;
652: GtkWidget *buttonbox, *vbox, *vbox2, *hbox;
653: GtkWidget *thing;
654:
655: int i;
656:
657: int argc = 1;
658: char *a[] = {"UAE"};
659: char **argv = a;
660:
661: gtk_init (&argc, &argv);
662: gtk_rc_parse ("uaegtkrc");
663:
664: window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
665: gtk_widget_set_name (window, "UAE control");
666:
667: vbox = gtk_vbox_new (FALSE, 4);
668: gtk_container_add (GTK_CONTAINER (window), vbox);
669:
670: /* Make a box with the Reset/Debug/Quit buttons and place it at the top
671: * of our vbox. */
672: buttonbox = gtk_hbox_new (FALSE, 4);
673: gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
674: gtk_widget_show (buttonbox);
675: thing = gtk_button_new_with_label ("Reset");
676: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_reset, NULL);
677: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
678: gtk_widget_show (thing);
679: thing = gtk_button_new_with_label ("Debug");
680: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_debug, NULL);
681: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
682: gtk_widget_show (thing);
683: thing = gtk_button_new_with_label ("Quit");
684: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_quit, NULL);
685: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
686: gtk_widget_show (thing);
687: /* An empty but expanded vbox to make the LED appear at the right border. */
688: thing = gtk_vbox_new (FALSE, 0);
689: gtk_box_pack_start (GTK_BOX (buttonbox), thing, TRUE, TRUE, 0);
690: gtk_widget_show (thing);
691: thing = make_led (0);
692: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
693: gtk_widget_show (thing);
694:
695: /* The next box contains the "Save configuration" button. */
696: buttonbox = gtk_hbox_new (FALSE, 4);
697: gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
698: gtk_widget_show (buttonbox);
699:
700: thing = gtk_button_new_with_label ("Save config");
701: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) save_config, NULL);
702: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
703: gtk_widget_show (thing);
704:
705: /* Place a separator below those three buttons. */
706: thing = gtk_hseparator_new ();
707: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
708: gtk_widget_show (thing);
709:
710: notebook = gtk_notebook_new ();
711: gtk_box_pack_start (GTK_BOX (vbox), notebook, FALSE, TRUE, 0);
712: gtk_widget_show (notebook);
713:
714: thing = gtk_vbox_new (FALSE, 4);
715: gtk_widget_show (thing);
716: make_floppy_disks (thing);
717: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Floppy disks"));
718:
719: thing = gtk_hbox_new (FALSE, 4);
720: gtk_widget_show (thing);
721: make_cpu_widgets (thing);
722: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("CPU emulation"));
723:
724: thing = gtk_hbox_new (FALSE, 4);
725: gtk_widget_show (thing);
726: make_gfx_widgets (thing);
727: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Graphics"));
728:
729: thing = gtk_hbox_new (FALSE, 4);
730: gtk_widget_show (thing);
731: make_joy_widgets (thing);
732: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Game ports"));
733:
734: enable_disk_buttons (1);
735:
736: gtk_widget_show (vbox);
737: gtk_widget_show (window);
738:
739: /* We're going to need that later. */
740: selector = gtk_file_selection_new ("");
741: gtk_signal_connect (GTK_OBJECT (selector), "destroy",
742: (GtkSignalFunc) did_close_insert, selector);
743:
744: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->ok_button),
745: "clicked", (GtkSignalFunc) did_insert_select,
746: GTK_OBJECT (selector));
747: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->cancel_button),
748: "clicked", (GtkSignalFunc) did_cancel_insert,
749: GTK_OBJECT (selector));
750: filesel_active = -1;
751:
752: gtk_timeout_add (1000, (GtkFunction)my_idle, 0);
753: gtk_main ();
754:
755: quitted_gui = 1;
756: uae_sem_post (&gui_quit_sem);
757: return 0;
758: }
759:
760: void gui_changesettings(void)
761: {
762:
763: }
764:
765: int gui_init (void)
766: {
767: penguin_id tid;
768:
769: gui_active = 0;
770:
771: init_comm_pipe (&to_gui_pipe, 20, 1);
772: init_comm_pipe (&from_gui_pipe, 20, 1);
773: uae_sem_init (&gui_sem, 0, 1);
774: uae_sem_init (&gui_quit_sem, 0, 0);
775: start_penguin (gtk_penguin, NULL, &tid);
776: return 1;
777: }
778:
779: int gui_update (void)
780: {
781: if (no_gui)
782: return 0;
783:
784: write_comm_pipe_int (&to_gui_pipe, 1, 1);
785: return 0;
786: }
787:
788: void gui_exit (void)
789: {
790: if (no_gui)
791: return;
792:
793: quit_gui = 1;
794: uae_sem_wait (&gui_quit_sem);
795: }
796:
797: void gui_led(int num, int on)
798: {
799: if (no_gui)
800: return;
801:
802: /* if (num == 0)
803: return;
804: printf("LED %d %d\n", num, on);
805: write_comm_pipe_int (&to_gui_pipe, 1, 0);
806: write_comm_pipe_int (&to_gui_pipe, num == 0 ? 4 : num - 1, 0);
807: write_comm_pipe_int (&to_gui_pipe, on, 1);
808: printf("#LED %d %d\n", num, on);*/
809: }
810:
811: void gui_filename(int num, const char *name)
812: {
813: if (no_gui)
814: return;
815:
816: write_comm_pipe_int (&to_gui_pipe, 0, 0);
817: write_comm_pipe_int (&to_gui_pipe, num, 1);
818:
819: /* gui_update ();*/
820: }
821:
822: void gui_handle_events(void)
823: {
824: if (no_gui)
825: return;
826:
827: while (comm_pipe_has_data (&from_gui_pipe)) {
828: int cmd = read_comm_pipe_int_blocking (&from_gui_pipe);
829: int n;
830: switch (cmd) {
831: case 0:
832: n = read_comm_pipe_int_blocking (&from_gui_pipe);
833: changed_prefs.df[n][0] = '\0';
834: break;
835: case 1:
836: n = read_comm_pipe_int_blocking (&from_gui_pipe);
837: uae_sem_wait (&gui_sem);
838: strncpy (changed_prefs.df[n], new_disk_string[n], 255);
839: changed_prefs.df[n][255] = '\0';
840: uae_sem_post (&gui_sem);
841: break;
842: case 2:
843: uae_reset ();
844: break;
845: case 3:
846: activate_debugger ();
847: break;
848: case 4:
849: uae_quit ();
850: break;
851: }
852: }
853:
854: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.