|
|
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
1.1.1.2 root 7: * Copyright 1998 Michael Krause
1.1 root 8: *
9: * The Tk GUI doesn't work.
10: * The X Forms Library isn't available as source, and there aren't any
11: * binaries compiled against glibc
12: *
13: * So let's try this...
14: */
15:
16: #include "sysconfig.h"
17: #include "sysdeps.h"
18:
19: #include "config.h"
20: #include "options.h"
21: #include "uae.h"
22: #include "memory.h"
23: #include "custom.h"
24: #include "gui.h"
25: #include "newcpu.h"
26: #include "threaddep/penguin.h"
1.1.1.2 root 27: #include "sounddep/sound.h"
1.1.1.10! root 28: #include "savestate.h"
1.1 root 29:
30: #include <gtk/gtk.h>
31:
1.1.1.4 root 32: /* One of the 1.1.6 "features" is a gratuitous name change */
33: #ifndef HAVE_GTK_FEATURES_1_1_6
34: #define gtk_container_set_border_width gtk_container_border_width
35: #endif
36: /* Likewise for 1.1.8. */
37: #ifndef HAVE_GTK_FEATURES_1_1_8
38: #define gtk_label_set_text gtk_label_set
39: #endif
1.1.1.5 root 40: /* This is beginning to suck... */
41: #ifndef HAVE_GTK_FEATURES_1_1_13
42: #define gtk_toggle_button_set_active gtk_toggle_button_set_state
43: #endif
1.1.1.4 root 44:
1.1 root 45: static int gui_active;
46:
1.1.1.10! root 47: static GtkWidget *pause_uae_widget, *snap_save_widget, *snap_load_widget;
! 48:
! 49: static GtkWidget *chipsize_widget[5];
! 50: static GtkWidget *bogosize_widget[4];
! 51: static GtkWidget *fastsize_widget[5];
! 52: static GtkWidget *z3size_widget[10];
! 53: static GtkWidget *p96size_widget[7];
1.1.1.6 root 54:
1.1 root 55: static GtkWidget *disk_insert_widget[4], *disk_eject_widget[4], *disk_text_widget[4];
56: static char *new_disk_string[4];
57:
58: static GtkAdjustment *cpuspeed_adj;
1.1.1.3 root 59: static GtkWidget *cpuspeed_widgets[4], *cpuspeed_scale;
1.1.1.8 root 60: static GtkWidget *cpu_widget[5], *a24m_widget, *ccpu_widget;
1.1.1.9 root 61: static GtkWidget *sound_widget[4], *sound_bits_widget[2], *sound_freq_widget[3], *sound_ch_widget[3];
1.1 root 62:
1.1.1.10! root 63: static GtkWidget *coll_widget[4], *cslevel_widget[4];
! 64: static GtkWidget *fcop_widget;
! 65:
1.1 root 66: static GtkAdjustment *framerate_adj;
1.1.1.7 root 67: static GtkWidget *bimm_widget, *b32_widget, *afscr_widget, *pfscr_widget;
1.1 root 68:
69: static GtkWidget *joy_widget[2][6];
70:
71: static GtkWidget *led_widgets[5];
72: static GdkColor led_on[5], led_off[5];
73: static unsigned int prevledstate;
74:
1.1.1.2 root 75: static smp_comm_pipe to_gui_pipe, from_gui_pipe;
76: static uae_sem_t gui_sem, gui_quit_sem; /* gui_sem protects the DFx fields */
77:
78: static volatile int quit_gui = 0, quitted_gui = 0;
79:
1.1 root 80: static void save_config (void)
81: {
82: FILE *f;
83: char tmp[257];
84:
85: /* Backup the options file. */
86: strcpy (tmp, optionsfile);
87: strcat (tmp, "~");
88: rename (optionsfile, tmp);
89:
90: f = fopen (optionsfile, "w");
91: if (f == NULL) {
1.1.1.2 root 92: fprintf (stderr, "Error saving options file!\n");
1.1 root 93: return;
94: }
1.1.1.4 root 95: save_options (f, &currprefs);
1.1 root 96: fclose (f);
97: }
98:
99: static int nr_for_led (GtkWidget *led)
100: {
101: int i;
102: i = 0;
103: while (led_widgets[i] != led)
104: i++;
105: return i;
106: }
107:
108: static void enable_disk_buttons (int enable)
109: {
110: int i;
111: for (i = 0; i < 4; i++) {
112: gtk_widget_set_sensitive (disk_insert_widget[i], enable);
113: gtk_widget_set_sensitive (disk_eject_widget[i], enable);
114: }
115: }
116:
1.1.1.10! root 117: static void enable_snap_buttons (int enable)
! 118: {
! 119: gtk_widget_set_sensitive (snap_save_widget, enable);
! 120: gtk_widget_set_sensitive (snap_load_widget, enable);
! 121: }
! 122:
1.1 root 123: static void set_cpu_state (void)
124: {
1.1.1.10! root 125: int i;
! 126:
1.1.1.5 root 127: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0);
1.1.1.8 root 128: gtk_widget_set_sensitive (a24m_widget, changed_prefs.cpu_level > 1 && changed_prefs.cpu_level < 4);
1.1.1.5 root 129: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0);
1.1 root 130: gtk_widget_set_sensitive (ccpu_widget, changed_prefs.cpu_level == 0);
1.1.1.3 root 131: gtk_widget_set_sensitive (cpuspeed_scale, changed_prefs.m68k_speed > 0);
1.1.1.10! root 132: for (i = 0; i < 10; i++)
! 133: gtk_widget_set_sensitive (z3size_widget[i],
! 134: changed_prefs.cpu_level >= 2 && ! changed_prefs.address_space_24);
1.1 root 135: }
136:
137: static void set_cpu_widget (void)
138: {
139: int nr = changed_prefs.cpu_level;
1.1.1.10! root 140:
1.1.1.5 root 141: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE);
1.1.1.3 root 142: nr = currprefs.m68k_speed + 1 < 3 ? currprefs.m68k_speed + 1 : 2;
1.1.1.5 root 143: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpuspeed_widgets[nr]), TRUE);
1.1.1.10! root 144:
1.1 root 145: }
146:
147: static void set_gfx_state (void)
148: {
1.1.1.5 root 149: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0);
1.1.1.10! root 150: #if 0
1.1.1.5 root 151: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0);
1.1.1.7 root 152: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (afscr_widget), currprefs.gfx_afullscreen != 0);
153: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pfscr_widget), currprefs.gfx_pfullscreen != 0);
1.1.1.10! root 154: #endif
! 155: }
! 156:
! 157: static void set_chipset_state (void)
! 158: {
! 159: int t0 = 0;
! 160: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (coll_widget[currprefs.collision_level]), TRUE);
! 161: if (currprefs.chipset_mask & CSMASK_AGA)
! 162: t0 = 3;
! 163: else if (currprefs.chipset_mask & CSMASK_ECS_DENISE)
! 164: t0 = 2;
! 165: else if (currprefs.chipset_mask & CSMASK_ECS_AGNUS)
! 166: t0 = 1;
! 167: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cslevel_widget[t0]), TRUE);
! 168: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fcop_widget), currprefs.fast_copper != 0);
1.1 root 169: }
170:
1.1.1.2 root 171: static void set_sound_state (void)
172: {
1.1.1.9 root 173: int stereo = currprefs.stereo + currprefs.mixed_stereo;
1.1.1.5 root 174: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_widget[currprefs.produce_sound]), 1);
1.1.1.9 root 175: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_ch_widget[stereo]), 1);
1.1.1.5 root 176: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_bits_widget[currprefs.sound_bits == 16]), 1);
1.1.1.2 root 177: }
178:
1.1.1.10! root 179: static void set_mem_state (void)
! 180: {
! 181: int t, t2;
! 182:
! 183: t = 0;
! 184: t2 = currprefs.chipmem_size;
! 185: while (t < 4 && t2 > 0x80000)
! 186: t++, t2 >>= 1;
! 187: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chipsize_widget[t]), 1);
! 188:
! 189: t = 0;
! 190: t2 = currprefs.bogomem_size;
! 191: while (t < 3 && t2 >= 0x80000)
! 192: t++, t2 >>= 1;
! 193: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bogosize_widget[t]), 1);
! 194:
! 195: t = 0;
! 196: t2 = currprefs.fastmem_size;
! 197: while (t < 4 && t2 >= 0x100000)
! 198: t++, t2 >>= 1;
! 199: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fastsize_widget[t]), 1);
! 200:
! 201: t = 0;
! 202: t2 = currprefs.z3fastmem_size;
! 203: while (t < 9 && t2 >= 0x100000)
! 204: t++, t2 >>= 1;
! 205: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (z3size_widget[t]), 1);
! 206:
! 207: t = 0;
! 208: t2 = currprefs.gfxmem_size;
! 209: while (t < 6 && t2 >= 0x100000)
! 210: t++, t2 >>= 1;
! 211: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (p96size_widget[t]), 1);
! 212: }
! 213:
1.1 root 214: static void set_joy_state (void)
215: {
1.1.1.4 root 216: int j0t = changed_prefs.jport0;
217: int j1t = changed_prefs.jport1;
1.1 root 218: int i;
219:
220: if (j0t == j1t) {
221: /* Can't happen */
222: j0t++;
223: j0t %= 6;
224: }
225: for (i = 0; i < 6; i++) {
1.1.1.5 root 226: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i);
227: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i);
1.1 root 228: gtk_widget_set_sensitive (joy_widget[0][i], j1t != i);
229: gtk_widget_set_sensitive (joy_widget[1][i], j0t != i);
230: }
231: }
232:
233: static void draw_led (int nr)
234: {
235: GtkWidget *thing = led_widgets[nr];
236: GdkWindow *window = thing->window;
237: GdkGC *gc = gdk_gc_new (window);
238: GdkColor *col;
239:
240: if (gui_ledstate & (1 << nr))
241: col = led_on + nr;
242: else
243: col = led_off + nr;
244: gdk_gc_set_foreground (gc, col);
245: gdk_draw_rectangle (window, gc, 1, 0, 0, -1, -1);
246: gdk_gc_destroy (gc);
247: }
248:
249: static int my_idle (void)
250: {
251: unsigned int leds = gui_ledstate;
252: int i;
253:
254: if (quit_gui) {
255: /*printf("Foo...\n");*/
256: gtk_main_quit ();
257: goto out;
258: }
259: while (comm_pipe_has_data (&to_gui_pipe)) {
260: int cmd = read_comm_pipe_int_blocking (&to_gui_pipe);
261: int n;
262: switch (cmd) {
263: case 0:
264: n = read_comm_pipe_int_blocking (&to_gui_pipe);
1.1.1.4 root 265: gtk_label_set_text (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]);
1.1 root 266: break;
267: case 1:
268: /* Initialization. */
269: set_cpu_widget ();
270: set_cpu_state ();
271: set_gfx_state ();
272: set_joy_state ();
1.1.1.2 root 273: set_sound_state ();
1.1.1.10! root 274: set_mem_state ();
! 275: set_chipset_state ();
1.1.1.3 root 276:
1.1 root 277: gui_active = 1;
278: break;
279: }
280: }
1.1.1.10! root 281:
1.1 root 282: for (i = 0; i < 5; i++) {
283: unsigned int mask = 1 << i;
1.1.1.2 root 284: unsigned int on = leds & mask;
1.1 root 285:
286: if (on == (prevledstate & mask))
287: continue;
288:
289: /* printf(": %d %d\n", i, on);*/
290: draw_led (i);
291: }
292: prevledstate = leds;
293: out:
294: return 1;
295: }
296:
1.1.1.2 root 297: static int find_current_toggle (GtkWidget **widgets, int count)
298: {
299: int i;
300: for (i = 0; i < count; i++)
301: if (GTK_TOGGLE_BUTTON (*widgets++)->active)
302: return i;
303: fprintf (stderr, "GTKUI: Can't happen!\n");
304: return -1;
305: }
306:
1.1 root 307: static void joy_changed (void)
308: {
309: if (! gui_active)
310: return;
311:
1.1.1.4 root 312: changed_prefs.jport0 = find_current_toggle (joy_widget[0], 6);
313: changed_prefs.jport1 = find_current_toggle (joy_widget[1], 6);
1.1 root 314: set_joy_state ();
315: }
316:
1.1.1.10! root 317: static void coll_changed (void)
! 318: {
! 319: changed_prefs.collision_level = find_current_toggle (coll_widget, 4);
! 320: }
! 321:
! 322: static void cslevel_changed (void)
! 323: {
! 324: int t = find_current_toggle (cslevel_widget, 4);
! 325: int t1 = 0;
! 326: if (t > 0)
! 327: t1 |= CSMASK_ECS_AGNUS;
! 328: if (t > 1)
! 329: t1 |= CSMASK_ECS_DENISE;
! 330: if (t > 2)
! 331: t1 |= CSMASK_AGA;
! 332: changed_prefs.chipset_mask = t1;
! 333: }
! 334:
1.1.1.2 root 335: static void custom_changed (void)
1.1 root 336: {
1.1.1.6 root 337: changed_prefs.gfx_framerate = framerate_adj->value;
1.1 root 338: changed_prefs.immediate_blits = GTK_TOGGLE_BUTTON (bimm_widget)->active;
1.1.1.10! root 339: changed_prefs.fast_copper = GTK_TOGGLE_BUTTON (fcop_widget)->active;
! 340: #if 0
! 341: changed_prefs.blits_32bit_enabled = GTK_TOGGLE_BUTTON (b32_widget)->active;
1.1.1.7 root 342: changed_prefs.gfx_afullscreen = GTK_TOGGLE_BUTTON (afscr_widget)->active;
343: changed_prefs.gfx_pfullscreen = GTK_TOGGLE_BUTTON (pfscr_widget)->active;
1.1.1.10! root 344: #endif
1.1 root 345: }
346:
347: static void cpuspeed_changed (void)
348: {
1.1.1.3 root 349: int which = find_current_toggle (cpuspeed_widgets, 3);
350: changed_prefs.m68k_speed = (which == 0 ? -1
351: : which == 1 ? 0
352: : cpuspeed_adj->value);
353: set_cpu_state ();
1.1 root 354: }
355:
356: static void cputype_changed (void)
357: {
358: int i, oldcl;
359: if (! gui_active)
360: return;
361:
362: oldcl = changed_prefs.cpu_level;
363:
1.1.1.8 root 364: changed_prefs.cpu_level = find_current_toggle (cpu_widget, 5);
1.1 root 365: changed_prefs.cpu_compatible = GTK_TOGGLE_BUTTON (ccpu_widget)->active;
366: changed_prefs.address_space_24 = GTK_TOGGLE_BUTTON (a24m_widget)->active;
367:
368: if (changed_prefs.cpu_level != 0)
369: changed_prefs.cpu_compatible = 0;
370: /* 68000/68010 always have a 24 bit address space. */
371: if (changed_prefs.cpu_level < 2)
372: changed_prefs.address_space_24 = 1;
373: /* Changing from 68000/68010 to 68020 should set a sane default. */
374: else if (oldcl < 2)
375: changed_prefs.address_space_24 = 0;
1.1.1.8 root 376:
1.1 root 377: set_cpu_state ();
378: }
379:
1.1.1.10! root 380: static void chipsize_changed (void)
! 381: {
! 382: int t = find_current_toggle (chipsize_widget, 5);
! 383: changed_prefs.chipmem_size = 0x80000 << t;
! 384: for (t = 0; t < 5; t++)
! 385: gtk_widget_set_sensitive (fastsize_widget[t], changed_prefs.chipmem_size <= 0x200000);
! 386: if (changed_prefs.chipmem_size > 0x200000) {
! 387: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fastsize_widget[0]), 1);
! 388: changed_prefs.fastmem_size = 0;
! 389: }
! 390: }
! 391:
! 392: static void bogosize_changed (void)
! 393: {
! 394: int t = find_current_toggle (bogosize_widget, 4);
! 395: changed_prefs.bogomem_size = (0x40000 << t) & ~0x40000;
! 396: }
! 397:
! 398: static void fastsize_changed (void)
! 399: {
! 400: int t = find_current_toggle (fastsize_widget, 5);
! 401: changed_prefs.fastmem_size = (0x80000 << t) & ~0x80000;
! 402: }
! 403:
! 404: static void z3size_changed (void)
! 405: {
! 406: int t = find_current_toggle (z3size_widget, 10);
! 407: changed_prefs.z3fastmem_size = (0x80000 << t) & ~0x80000;
! 408: }
! 409:
! 410: static void p96size_changed (void)
! 411: {
! 412: int t = find_current_toggle (p96size_widget, 7);
! 413: changed_prefs.gfxmem_size = (0x80000 << t) & ~0x80000;
! 414: }
! 415:
1.1.1.2 root 416: static void sound_changed (void)
417: {
418: changed_prefs.produce_sound = find_current_toggle (sound_widget, 4);
1.1.1.9 root 419: changed_prefs.stereo = find_current_toggle (sound_ch_widget, 3);
420: changed_prefs.mixed_stereo = 0;
421: if (changed_prefs.stereo == 2)
422: changed_prefs.mixed_stereo = changed_prefs.stereo = 1;
1.1.1.2 root 423: changed_prefs.sound_bits = (find_current_toggle (sound_bits_widget, 2) + 1) * 8;
424: }
425:
1.1 root 426: static void did_reset (void)
427: {
428: if (quit_gui)
429: return;
430:
431: write_comm_pipe_int (&from_gui_pipe, 2, 1);
432: }
433:
434: static void did_debug (void)
435: {
436: if (quit_gui)
437: return;
438:
439: write_comm_pipe_int (&from_gui_pipe, 3, 1);
440: }
441:
442: static void did_quit (void)
443: {
444: if (quit_gui)
445: return;
446:
447: write_comm_pipe_int (&from_gui_pipe, 4, 1);
448: }
449:
1.1.1.2 root 450: static void did_eject (GtkWidget *w, gpointer data)
451: {
1.1 root 452: if (quit_gui)
453: return;
454:
455: write_comm_pipe_int (&from_gui_pipe, 0, 0);
1.1.1.2 root 456: write_comm_pipe_int (&from_gui_pipe, (int)data, 1);
1.1 root 457: }
458:
1.1.1.6 root 459: static void pause_uae (GtkWidget *widget, gpointer data)
460: {
461: if (quit_gui)
462: return;
463:
464: write_comm_pipe_int (&from_gui_pipe, GTK_TOGGLE_BUTTON (widget)->active ? 5 : 6, 1);
465: }
466:
467: static void end_pause_uae (void)
468: {
469: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_uae_widget), FALSE);
470: }
471:
1.1 root 472: static int filesel_active = -1;
1.1.1.10! root 473: static GtkWidget *disk_selector;
! 474:
! 475: static int snapsel_active = -1;
! 476: static GtkWidget *snap_selector;
! 477: static char *gui_snapname;
1.1 root 478:
479: static void did_close_insert (GtkObject *o, GtkWidget *w)
480: {
481: filesel_active = -1;
482: enable_disk_buttons (1);
1.1.1.10! root 483: gtk_widget_hide (disk_selector);
1.1 root 484: }
485:
486: static void did_cancel_insert (GtkObject *o)
487: {
488: filesel_active = -1;
489: enable_disk_buttons (1);
1.1.1.10! root 490: gtk_widget_hide (disk_selector);
1.1 root 491: }
492:
493: static void did_insert_select (GtkObject *o)
494: {
1.1.1.10! root 495: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (disk_selector));
1.1 root 496: printf ("%s\n", s);
497: if (quit_gui)
498: return;
499:
500: uae_sem_wait (&gui_sem);
501: if (new_disk_string[filesel_active] != 0)
502: free (new_disk_string[filesel_active]);
503: new_disk_string[filesel_active] = strdup (s);
504: uae_sem_post (&gui_sem);
505: write_comm_pipe_int (&from_gui_pipe, 1, 0);
506: write_comm_pipe_int (&from_gui_pipe, filesel_active, 1);
507: filesel_active = -1;
508: enable_disk_buttons (1);
1.1.1.10! root 509: gtk_widget_hide (disk_selector);
1.1 root 510: }
511:
512: static char fsbuffer[100];
513:
1.1.1.2 root 514: static void did_insert (GtkWidget *w, gpointer data)
1.1 root 515: {
1.1.1.2 root 516: int n = (int)data;
1.1 root 517: if (filesel_active != -1)
518: return;
519: filesel_active = n;
520: enable_disk_buttons (0);
521:
522: sprintf (fsbuffer, "Select a disk image file for DF%d", n);
1.1.1.10! root 523: gtk_window_set_title (GTK_WINDOW (disk_selector), fsbuffer);
1.1 root 524:
1.1.1.10! root 525: /*printf("%p\n", disk_selector);*/
! 526: gtk_widget_show (disk_selector);
1.1 root 527: }
528:
529: static gint driveled_event (GtkWidget *thing, GdkEvent *event)
530: {
531: int lednr = nr_for_led (thing);
532:
533: switch (event->type) {
534: case GDK_MAP:
535: draw_led (lednr);
536: break;
537: case GDK_EXPOSE:
538: draw_led (lednr);
539: break;
540: default:
541: break;
542: }
543:
544: return 0;
545: }
546:
1.1.1.10! root 547: static void did_close_snap (GtkObject *o, GtkWidget *w)
! 548: {
! 549: snapsel_active = -1;
! 550: enable_snap_buttons (1);
! 551: gtk_widget_hide (snap_selector);
! 552: }
! 553:
! 554: static void did_cancel_snap (GtkObject *o)
! 555: {
! 556: snapsel_active = -1;
! 557: enable_snap_buttons (1);
! 558: gtk_widget_hide (snap_selector);
! 559: }
! 560:
! 561: static void did_snap_select (GtkObject *o)
! 562: {
! 563: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (snap_selector));
! 564: printf ("%s\n", s);
! 565: if (quit_gui)
! 566: return;
! 567:
! 568: uae_sem_wait (&gui_sem);
! 569: gui_snapname = strdup (s);
! 570: uae_sem_post (&gui_sem);
! 571: write_comm_pipe_int (&from_gui_pipe, 7, 0);
! 572: write_comm_pipe_int (&from_gui_pipe, snapsel_active, 1);
! 573: snapsel_active = -1;
! 574: enable_snap_buttons (1);
! 575: gtk_widget_hide (snap_selector);
! 576: }
! 577:
! 578: static void did_loadstate (void)
! 579: {
! 580: if (snapsel_active != -1)
! 581: return;
! 582: snapsel_active = STATE_DORESTORE;
! 583: enable_snap_buttons (0);
! 584:
! 585: gtk_window_set_title (GTK_WINDOW (snap_selector),
! 586: "Select a state file to restore");
! 587:
! 588: gtk_widget_show (snap_selector);
! 589: }
! 590:
! 591: static void did_savestate (void)
! 592: {
! 593: if (snapsel_active != -1)
! 594: return;
! 595: snapsel_active = STATE_DOSAVE;
! 596: enable_snap_buttons (0);
! 597:
! 598: gtk_window_set_title (GTK_WINDOW (snap_selector),
! 599: "Select a filename for the state file");
! 600:
! 601: gtk_widget_show (snap_selector);
! 602: }
! 603:
1.1.1.2 root 604: static void add_empty_vbox (GtkWidget *tobox)
605: {
606: GtkWidget *thing = gtk_vbox_new (FALSE, 0);
607: gtk_widget_show (thing);
608: gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0);
609: }
610:
1.1.1.3 root 611: static void add_empty_hbox (GtkWidget *tobox)
612: {
613: GtkWidget *thing = gtk_hbox_new (FALSE, 0);
614: gtk_widget_show (thing);
615: gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0);
616: }
617:
1.1.1.2 root 618: static void add_centered_to_vbox (GtkWidget *vbox, GtkWidget *w)
619: {
620: GtkWidget *hbox = gtk_hbox_new (TRUE, 0);
621: gtk_widget_show (hbox);
622: gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, FALSE, 0);
623: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
624: }
625:
626: static GtkWidget *make_labelled_widget (const char *str, GtkWidget *thing)
627: {
628: GtkWidget *label = gtk_label_new (str);
629: GtkWidget *hbox2 = gtk_hbox_new (FALSE, 4);
630:
631: gtk_widget_show (label);
632: gtk_widget_show (thing);
633:
634: gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
635: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
636:
637: return hbox2;
638: }
639:
1.1.1.3 root 640: static GtkWidget *add_labelled_widget_centered (const char *str, GtkWidget *thing, GtkWidget *vbox)
1.1.1.2 root 641: {
642: GtkWidget *w = make_labelled_widget (str, thing);
643: gtk_widget_show (w);
644: add_centered_to_vbox (vbox, w);
1.1.1.3 root 645: return w;
1.1.1.2 root 646: }
647:
1.1.1.10! root 648: static int make_radio_group (const char **labels, GtkWidget *tobox,
1.1.1.2 root 649: GtkWidget **saveptr, gint t1, gint t2,
1.1.1.10! root 650: void (*sigfunc) (void), int count, GSList *group)
1.1.1.2 root 651: {
1.1.1.10! root 652: int t = 0;
! 653:
! 654: while (*labels && (count == -1 || count-- > 0)) {
! 655: GtkWidget *thing = gtk_radio_button_new_with_label (group, *labels++);
! 656: group = gtk_radio_button_group (GTK_RADIO_BUTTON (thing));
1.1.1.2 root 657:
658: *saveptr++ = thing;
659: gtk_widget_show (thing);
660: gtk_box_pack_start (GTK_BOX (tobox), thing, t1, t2, 0);
661: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) sigfunc, NULL);
1.1.1.10! root 662: t++;
1.1.1.2 root 663: }
1.1.1.10! root 664: return t;
1.1.1.2 root 665: }
666:
667: static GtkWidget *make_radio_group_box (const char *title, const char **labels,
668: GtkWidget **saveptr, int horiz,
669: void (*sigfunc) (void))
670: {
671: GtkWidget *frame, *newbox;
672:
673: frame = gtk_frame_new (title);
674: newbox = (horiz ? gtk_hbox_new : gtk_vbox_new) (FALSE, 4);
675: gtk_widget_show (newbox);
1.1.1.4 root 676: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.2 root 677: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1.1.10! root 678: make_radio_group (labels, newbox, saveptr, horiz, !horiz, sigfunc, -1, NULL);
! 679: return frame;
! 680: }
! 681:
! 682: static GtkWidget *make_radio_group_box_1 (const char *title, const char **labels,
! 683: GtkWidget **saveptr, int horiz,
! 684: void (*sigfunc) (void), int elts_per_column)
! 685: {
! 686: GtkWidget *frame, *newbox;
! 687: GtkWidget *column;
! 688: GSList *group = 0;
! 689:
! 690: frame = gtk_frame_new (title);
! 691: column = (horiz ? gtk_vbox_new : gtk_hbox_new) (FALSE, 4);
! 692: gtk_container_add (GTK_CONTAINER (frame), column);
! 693: gtk_widget_show (column);
! 694:
! 695: while (*labels) {
! 696: int count;
! 697: newbox = (horiz ? gtk_hbox_new : gtk_vbox_new) (FALSE, 4);
! 698: gtk_widget_show (newbox);
! 699: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
! 700: gtk_container_add (GTK_CONTAINER (column), newbox);
! 701: count = make_radio_group (labels, newbox, saveptr, horiz, !horiz, sigfunc, elts_per_column, group);
! 702: labels += count;
! 703: saveptr += count;
! 704: group = gtk_radio_button_group (GTK_RADIO_BUTTON (saveptr[-1]));
! 705: }
1.1.1.2 root 706: return frame;
707: }
708:
1.1 root 709: static GtkWidget *make_led (int nr)
710: {
711: GtkWidget *subframe, *the_led, *thing;
712: GdkColormap *colormap;
713:
714: the_led = gtk_vbox_new (FALSE, 0);
715: gtk_widget_show (the_led);
716:
717: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
718: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
719: gtk_widget_show (thing);
720:
721: subframe = gtk_frame_new (NULL);
722: gtk_box_pack_start (GTK_BOX (the_led), subframe, TRUE, TRUE, 0);
723: gtk_widget_show (subframe);
724:
725: thing = gtk_drawing_area_new ();
726: gtk_drawing_area_size (GTK_DRAWING_AREA (thing), 20, 5);
727: gtk_widget_set_events (thing, GDK_EXPOSURE_MASK);
728: gtk_container_add (GTK_CONTAINER (subframe), thing);
729: colormap = gtk_widget_get_colormap (thing);
730: led_on[nr].red = nr == 0 ? 0xEEEE : 0xCCCC;
731: led_on[nr].green = nr == 0 ? 0: 0xFFFF;
732: led_on[nr].blue = 0;
733: led_on[nr].pixel = 0;
734: led_off[nr].red = 0;
735: led_off[nr].green = 0;
736: led_off[nr].blue = 0;
737: led_off[nr].pixel = 0;
738: gdk_color_alloc (colormap, led_on + nr);
739: gdk_color_alloc (colormap, led_off + nr);
740: led_widgets[nr] = thing;
741: gtk_signal_connect (GTK_OBJECT (thing), "event",
742: (GtkSignalFunc) driveled_event, (gpointer) thing);
743: gtk_widget_show (thing);
744:
745: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
746: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
747: gtk_widget_show (thing);
748:
749: return the_led;
750: }
751:
752: static void make_floppy_disks (GtkWidget *vbox)
753: {
1.1.1.2 root 754: GtkWidget *thing, *subthing, *subframe, *buttonbox;
755: char buf[5];
1.1 root 756: int i;
1.1.1.2 root 757:
758: add_empty_vbox (vbox);
759:
1.1 root 760: for (i = 0; i < 4; i++) {
1.1.1.2 root 761: /* Frame with an hbox and the "DFx:" title */
1.1 root 762: sprintf (buf, "DF%d:", i);
1.1.1.2 root 763: thing = gtk_frame_new (buf);
764: buttonbox = gtk_hbox_new (FALSE, 4);
1.1.1.4 root 765: gtk_container_set_border_width (GTK_CONTAINER (buttonbox), 4);
1.1.1.2 root 766: gtk_container_add (GTK_CONTAINER (thing), buttonbox);
767: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
1.1 root 768: gtk_widget_show (buttonbox);
769: gtk_widget_show (thing);
770:
1.1.1.2 root 771: /* LED */
1.1 root 772: subthing = make_led (i + 1);
773: gtk_box_pack_start (GTK_BOX (buttonbox), subthing, FALSE, TRUE, 0);
774:
1.1.1.2 root 775: /* Current file display */
1.1 root 776: subframe = gtk_frame_new (NULL);
777: gtk_frame_set_shadow_type (GTK_FRAME (subframe), GTK_SHADOW_ETCHED_OUT);
1.1.1.2 root 778: gtk_box_pack_start (GTK_BOX (buttonbox), subframe, TRUE, TRUE, 0);
1.1 root 779: gtk_widget_show (subframe);
780: subthing = gtk_vbox_new (FALSE, 0);
781: gtk_widget_show (subthing);
782: gtk_container_add (GTK_CONTAINER (subframe), subthing);
783: thing = gtk_label_new ("");
784: disk_text_widget[i] = thing;
785: gtk_widget_show (thing);
1.1.1.2 root 786: gtk_box_pack_start (GTK_BOX (subthing), thing, TRUE, TRUE, 0);
1.1 root 787:
788: /* Now, the buttons. */
789: thing = gtk_button_new_with_label ("Eject");
790: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
791: gtk_widget_show (thing);
792: disk_eject_widget[i] = thing;
1.1.1.2 root 793: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_eject, (gpointer) i);
1.1 root 794:
795: thing = gtk_button_new_with_label ("Insert");
796: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
797: gtk_widget_show (thing);
798: disk_insert_widget[i] = thing;
1.1.1.2 root 799: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_insert, (gpointer) i);
1.1 root 800: }
1.1.1.2 root 801:
802: add_empty_vbox (vbox);
1.1 root 803: }
804:
1.1.1.3 root 805: static GtkWidget *make_cpu_speed_sel (void)
806: {
1.1.1.10! root 807: int t;
1.1.1.3 root 808: static const char *labels[] = {
809: "Optimize for host CPU speed","Approximate 68000/7MHz speed", "Adjustable",
810: NULL
811: };
812: GtkWidget *frame, *newbox;
813:
814: frame = gtk_frame_new ("CPU speed");
815: newbox = gtk_vbox_new (FALSE, 4);
816: gtk_widget_show (newbox);
1.1.1.4 root 817: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.3 root 818: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1.1.10! root 819: make_radio_group (labels, newbox, cpuspeed_widgets, 0, 1, cpuspeed_changed, -1, NULL);
1.1.1.3 root 820:
1.1.1.10! root 821: t = currprefs.m68k_speed > 0 ? currprefs.m68k_speed : 4 * CYCLE_UNIT;
! 822: cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (t, 1.0, 5120.0, 1.0, 1.0, 1.0));
1.1.1.3 root 823: gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed",
824: GTK_SIGNAL_FUNC (cpuspeed_changed), NULL);
825:
826: cpuspeed_scale = gtk_hscale_new (cpuspeed_adj);
827: gtk_range_set_update_policy (GTK_RANGE (cpuspeed_scale), GTK_UPDATE_DELAYED);
828: gtk_scale_set_digits (GTK_SCALE (cpuspeed_scale), 0);
829: gtk_scale_set_value_pos (GTK_SCALE (cpuspeed_scale), GTK_POS_RIGHT);
830: cpuspeed_scale = add_labelled_widget_centered ("Cycles per instruction:", cpuspeed_scale, newbox);
831:
832: return frame;
833: }
834:
1.1.1.2 root 835: static void make_cpu_widgets (GtkWidget *vbox)
1.1 root 836: {
837: int i;
1.1.1.3 root 838: GtkWidget *newbox, *hbox, *frame;
1.1 root 839: GtkWidget *thing;
1.1.1.2 root 840: static const char *radiolabels[] = {
1.1.1.8 root 841: "68000", "68010", "68020", "68020+68881", "68040",
1.1.1.2 root 842: NULL
843: };
844:
845: add_empty_vbox (vbox);
846:
1.1.1.3 root 847: hbox = gtk_hbox_new (FALSE, 0);
848: add_empty_vbox (hbox);
849:
850: newbox = make_radio_group_box ("CPU type", radiolabels, cpu_widget, 0, cputype_changed);
1.1.1.2 root 851: gtk_widget_show (newbox);
1.1.1.3 root 852: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0);
853:
854: newbox = make_cpu_speed_sel ();
855: gtk_widget_show (newbox);
856: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0);
857:
858: add_empty_vbox (hbox);
859: gtk_widget_show (hbox);
860: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1.1 root 861:
862: frame = gtk_frame_new ("CPU flags");
1.1.1.2 root 863: add_centered_to_vbox (vbox, frame);
1.1 root 864: gtk_widget_show (frame);
1.1.1.2 root 865: newbox = gtk_vbox_new (FALSE, 4);
866: gtk_widget_show (newbox);
1.1.1.4 root 867: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.2 root 868: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1 root 869:
870: a24m_widget = gtk_check_button_new_with_label ("24 bit address space");
1.1.1.2 root 871: add_centered_to_vbox (newbox, a24m_widget);
1.1 root 872: gtk_widget_show (a24m_widget);
873: ccpu_widget = gtk_check_button_new_with_label ("Slow but compatible");
1.1.1.2 root 874: add_centered_to_vbox (newbox, ccpu_widget);
1.1 root 875: gtk_widget_show (ccpu_widget);
1.1.1.8 root 876:
1.1.1.2 root 877: add_empty_vbox (vbox);
878:
1.1 root 879: gtk_signal_connect (GTK_OBJECT (ccpu_widget), "clicked",
880: (GtkSignalFunc) cputype_changed, NULL);
881: gtk_signal_connect (GTK_OBJECT (a24m_widget), "clicked",
882: (GtkSignalFunc) cputype_changed, NULL);
883: }
884:
1.1.1.2 root 885: static void make_gfx_widgets (GtkWidget *vbox)
1.1 root 886: {
1.1.1.10! root 887: GtkWidget *thing, *frame, *newbox, *hbox;
! 888: static const char *p96labels[] = {
! 889: "None", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB", "32 MB", NULL
! 890: };
1.1 root 891:
1.1.1.2 root 892: add_empty_vbox (vbox);
1.1 root 893:
1.1.1.10! root 894: hbox = gtk_hbox_new (FALSE, 10);
! 895: gtk_widget_show (hbox);
! 896: add_centered_to_vbox (vbox, hbox);
! 897:
! 898: frame = make_radio_group_box_1 ("P96 RAM", p96labels, p96size_widget, 0, p96size_changed, 4);
! 899: gtk_widget_show (frame);
! 900: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
! 901:
! 902: frame = gtk_frame_new ("Miscellaneous");
! 903: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
! 904:
! 905: gtk_widget_show (frame);
! 906: newbox = gtk_vbox_new (FALSE, 4);
! 907: gtk_widget_show (newbox);
! 908: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
! 909: gtk_container_add (GTK_CONTAINER (frame), newbox);
! 910:
1.1.1.6 root 911: framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.gfx_framerate, 1.0, 21.0, 1.0, 1.0, 1.0));
1.1 root 912: gtk_signal_connect (GTK_OBJECT (framerate_adj), "value_changed",
1.1.1.2 root 913: GTK_SIGNAL_FUNC (custom_changed), NULL);
1.1 root 914:
915: thing = gtk_hscale_new (framerate_adj);
916: gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
917: gtk_scale_set_digits (GTK_SCALE (thing), 0);
918: gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
1.1.1.10! root 919: add_labelled_widget_centered ("Framerate:", thing, newbox);
1.1 root 920:
921: b32_widget = gtk_check_button_new_with_label ("32 bit blitter");
1.1.1.10! root 922: add_centered_to_vbox (newbox, b32_widget);
1.1.1.7 root 923: #if 0
1.1 root 924: gtk_widget_show (b32_widget);
1.1.1.7 root 925: #endif
1.1 root 926: bimm_widget = gtk_check_button_new_with_label ("Immediate blits");
1.1.1.10! root 927: add_centered_to_vbox (newbox, bimm_widget);
1.1 root 928: gtk_widget_show (bimm_widget);
929:
1.1.1.7 root 930: afscr_widget = gtk_check_button_new_with_label ("Amiga modes fullscreen");
1.1.1.10! root 931: add_centered_to_vbox (newbox, afscr_widget);
1.1.1.7 root 932: #if 0
933: gtk_widget_show (afscr_widget);
934: #endif
935: pfscr_widget = gtk_check_button_new_with_label ("Picasso modes fullscreen");
1.1.1.10! root 936: add_centered_to_vbox (newbox, pfscr_widget);
1.1.1.7 root 937: #if 0
938: gtk_widget_show (pfscr_widget);
939: #endif
1.1.1.2 root 940: add_empty_vbox (vbox);
941:
1.1 root 942: gtk_signal_connect (GTK_OBJECT (bimm_widget), "clicked",
1.1.1.2 root 943: (GtkSignalFunc) custom_changed, NULL);
1.1.1.10! root 944: #if 0
1.1 root 945: gtk_signal_connect (GTK_OBJECT (b32_widget), "clicked",
1.1.1.2 root 946: (GtkSignalFunc) custom_changed, NULL);
1.1.1.7 root 947: gtk_signal_connect (GTK_OBJECT (afscr_widget), "clicked",
948: (GtkSignalFunc) custom_changed, NULL);
949: gtk_signal_connect (GTK_OBJECT (pfscr_widget), "clicked",
950: (GtkSignalFunc) custom_changed, NULL);
1.1.1.10! root 951: #endif
! 952: }
! 953:
! 954: static void make_chipset_widgets (GtkWidget *vbox)
! 955: {
! 956: GtkWidget *frame, *newbox, *hbox;
! 957: static const char *colllabels[] = {
! 958: "None (fastest)", "Sprites only", "Sprites & playfields", "Full (very slow)",
! 959: NULL
! 960: };
! 961: static const char *cslevellabels[] = {
! 962: "OCS", "ECS Agnus", "Full ECS", "AGA", NULL
! 963: };
! 964:
! 965: add_empty_vbox (vbox);
! 966:
! 967: hbox = gtk_hbox_new (FALSE, 10);
! 968: gtk_widget_show (hbox);
! 969: add_centered_to_vbox (vbox, hbox);
! 970:
! 971: newbox = make_radio_group_box ("Sprite collisions", colllabels, coll_widget, 0, coll_changed);
! 972: gtk_widget_show (newbox);
! 973: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
! 974:
! 975: newbox = make_radio_group_box ("Chipset", cslevellabels, cslevel_widget, 0, cslevel_changed);
! 976: gtk_widget_show (newbox);
! 977: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
! 978:
! 979: fcop_widget = gtk_check_button_new_with_label ("Enable copper speedup code");
! 980: add_centered_to_vbox (vbox, fcop_widget);
! 981: gtk_widget_show (fcop_widget);
! 982:
! 983: gtk_signal_connect (GTK_OBJECT (fcop_widget), "clicked",
! 984: (GtkSignalFunc) custom_changed, NULL);
! 985:
! 986: add_empty_vbox (vbox);
1.1.1.2 root 987: }
988:
989: static void make_sound_widgets (GtkWidget *vbox)
990: {
991: GtkWidget *frame, *newbox;
992: int i;
993: GtkWidget *hbox;
994: static const char *soundlabels1[] = {
995: "None", "No output", "Normal", "Accurate",
996: NULL
997: }, *soundlabels2[] = {
998: "8 bit", "16 bit",
999: NULL
1000: }, *soundlabels3[] = {
1.1.1.9 root 1001: "Mono", "Stereo", "Mixed",
1.1.1.2 root 1002: NULL
1003: };
1004:
1005: add_empty_vbox (vbox);
1006:
1007: newbox = make_radio_group_box ("Mode", soundlabels1, sound_widget, 1, sound_changed);
1008: gtk_widget_show (newbox);
1009: add_centered_to_vbox (vbox, newbox);
1010:
1011: hbox = gtk_hbox_new (FALSE, 10);
1012: gtk_widget_show (hbox);
1013: add_centered_to_vbox (vbox, hbox);
1014: newbox = make_radio_group_box ("Channels", soundlabels3, sound_ch_widget, 1, sound_changed);
1015: gtk_widget_show (newbox);
1016: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1017: newbox = make_radio_group_box ("Resolution", soundlabels2, sound_bits_widget, 1, sound_changed);
1018: gtk_widget_show (newbox);
1019: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1.1.1.3 root 1020:
1.1.1.2 root 1021: add_empty_vbox (vbox);
1.1 root 1022: }
1023:
1.1.1.10! root 1024: static void make_mem_widgets (GtkWidget *vbox)
! 1025: {
! 1026: GtkWidget *hbox = gtk_hbox_new (FALSE, 10);
! 1027: GtkWidget *label, *frame;
! 1028:
! 1029: static const char *chiplabels[] = {
! 1030: "512 KB", "1 MB", "2 MB", "4 MB", "8 MB", NULL
! 1031: };
! 1032: static const char *bogolabels[] = {
! 1033: "None", "512 KB", "1 MB", "1.8 MB", NULL
! 1034: };
! 1035: static const char *fastlabels[] = {
! 1036: "None", "1 MB", "2 MB", "4 MB", "8 MB", NULL
! 1037: };
! 1038: static const char *z3labels[] = {
! 1039: "None", "1 MB", "2 MB", "4 MB", "8 MB",
! 1040: "16 MB", "32 MB", "64 MB", "128 MB", "256 MB",
! 1041: NULL
! 1042: };
! 1043:
! 1044: add_empty_vbox (vbox);
! 1045: gtk_widget_show (hbox);
! 1046: add_centered_to_vbox (vbox, hbox);
! 1047:
! 1048: add_empty_vbox (vbox);
! 1049:
! 1050: label = gtk_label_new ("These settings take effect after the next reset.");
! 1051: gtk_widget_show (label);
! 1052: add_centered_to_vbox (vbox, label);
! 1053:
! 1054: frame = make_radio_group_box ("Chip Mem", chiplabels, chipsize_widget, 0, chipsize_changed);
! 1055: gtk_widget_show (frame);
! 1056: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
! 1057:
! 1058: frame = make_radio_group_box ("Slow Mem", bogolabels, bogosize_widget, 0, bogosize_changed);
! 1059: gtk_widget_show (frame);
! 1060: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
! 1061:
! 1062: frame = make_radio_group_box ("Fast Mem", fastlabels, fastsize_widget, 0, fastsize_changed);
! 1063: gtk_widget_show (frame);
! 1064: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
! 1065:
! 1066: frame = make_radio_group_box_1 ("Z3 Mem", z3labels, z3size_widget, 0, z3size_changed, 5);
! 1067: gtk_widget_show (frame);
! 1068: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
! 1069: }
! 1070:
1.1.1.2 root 1071: static void make_joy_widgets (GtkWidget *dvbox)
1.1 root 1072: {
1073: int i;
1.1.1.2 root 1074: GtkWidget *hbox = gtk_hbox_new (FALSE, 10);
1075: static const char *joylabels[] = {
1076: "Joystick 0", "Joystick 1", "Mouse", "Numeric pad",
1077: "Cursor keys/Right Ctrl", "T/F/H/B/Left Alt",
1078: NULL
1079: };
1080:
1081: add_empty_vbox (dvbox);
1082: gtk_widget_show (hbox);
1083: add_centered_to_vbox (dvbox, hbox);
1.1 root 1084:
1085: for (i = 0; i < 2; i++) {
1086: GtkWidget *vbox, *frame;
1087: GtkWidget *thing;
1088: char buffer[20];
1089: int j;
1090:
1091: sprintf (buffer, "Port %d", i);
1.1.1.2 root 1092: frame = make_radio_group_box (buffer, joylabels, joy_widget[i], 0, joy_changed);
1.1 root 1093: gtk_widget_show (frame);
1.1.1.2 root 1094: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1.1 root 1095: }
1.1.1.2 root 1096:
1097: add_empty_vbox (dvbox);
1098: }
1099:
1.1.1.6 root 1100: static GtkWidget *make_buttons (const char *label, GtkWidget *box, void (*sigfunc) (void), GtkWidget *(*create)(const char *label))
1.1.1.2 root 1101: {
1.1.1.6 root 1102: GtkWidget *thing = create (label);
1.1.1.2 root 1103: gtk_widget_show (thing);
1104: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) sigfunc, NULL);
1105: gtk_box_pack_start (GTK_BOX (box), thing, TRUE, TRUE, 0);
1.1.1.6 root 1106:
1107: return thing;
1.1 root 1108: }
1.1.1.6 root 1109: #define make_button(label, box, sigfunc) make_buttons(label, box, sigfunc, gtk_button_new_with_label)
1.1 root 1110:
1111: static void *gtk_penguin (void *dummy)
1112: {
1113: GtkWidget *window, *notebook;
1.1.1.2 root 1114: GtkWidget *buttonbox, *vbox, *hbox;
1.1 root 1115: GtkWidget *thing;
1116: int i;
1117: int argc = 1;
1118: char *a[] = {"UAE"};
1119: char **argv = a;
1.1.1.2 root 1120: static const struct _pages {
1121: const char *title;
1122: void (*createfunc)(GtkWidget *);
1123: } pages[] = {
1.1.1.10! root 1124: /* ??? If this isn't the first page, there are errors in draw_led. */
1.1.1.2 root 1125: { "Floppy disks", make_floppy_disks },
1.1.1.10! root 1126: { "Memory", make_mem_widgets },
1.1.1.2 root 1127: { "CPU emulation", make_cpu_widgets },
1128: { "Graphics", make_gfx_widgets },
1.1.1.10! root 1129: { "Chipset", make_chipset_widgets },
1.1.1.2 root 1130: { "Sound", make_sound_widgets },
1131: { "Game ports", make_joy_widgets }
1132: };
1.1 root 1133:
1134: gtk_init (&argc, &argv);
1135: gtk_rc_parse ("uaegtkrc");
1136:
1137: window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1.1.1.2 root 1138: gtk_window_set_title (GTK_WINDOW (window), "UAE control");
1.1 root 1139:
1140: vbox = gtk_vbox_new (FALSE, 4);
1141: gtk_container_add (GTK_CONTAINER (window), vbox);
1.1.1.4 root 1142: gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1.1 root 1143:
1.1.1.2 root 1144: /* First line - buttons and power LED */
1145: hbox = gtk_hbox_new (FALSE, 10);
1146: gtk_widget_show (hbox);
1147: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
1.1 root 1148:
1.1.1.2 root 1149: /* The buttons */
1150: buttonbox = gtk_hbox_new (TRUE, 4);
1.1 root 1151: gtk_widget_show (buttonbox);
1.1.1.2 root 1152: gtk_box_pack_start (GTK_BOX (hbox), buttonbox, TRUE, TRUE, 0);
1153: make_button ("Reset", buttonbox, did_reset);
1154: make_button ("Debug", buttonbox, did_debug);
1155: make_button ("Quit", buttonbox, did_quit);
1156: make_button ("Save config", buttonbox, save_config);
1.1.1.6 root 1157: pause_uae_widget = make_buttons ("Pause", buttonbox, pause_uae, gtk_toggle_button_new_with_label);
1.1 root 1158:
1.1.1.2 root 1159: /* The LED */
1160: thing = make_led (0);
1161: thing = make_labelled_widget ("Power:", thing);
1.1 root 1162: gtk_widget_show (thing);
1.1.1.2 root 1163: gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, TRUE, 0);
1.1 root 1164:
1.1.1.10! root 1165: /* More buttons */
! 1166: buttonbox = gtk_hbox_new (TRUE, 4);
! 1167: gtk_widget_show (buttonbox);
! 1168: gtk_box_pack_start (GTK_BOX (vbox), buttonbox, TRUE, TRUE, 0);
! 1169: snap_save_widget = make_button ("Save state", buttonbox, did_savestate);
! 1170: snap_load_widget = make_button ("Load state", buttonbox, did_loadstate);
! 1171:
1.1.1.2 root 1172: /* Place a separator below those buttons. */
1.1 root 1173: thing = gtk_hseparator_new ();
1174: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
1175: gtk_widget_show (thing);
1176:
1.1.1.2 root 1177: /* Now the notebook */
1.1 root 1178: notebook = gtk_notebook_new ();
1.1.1.2 root 1179: gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
1.1 root 1180: gtk_widget_show (notebook);
1181:
1.1.1.2 root 1182: for (i = 0; i < sizeof pages / sizeof (struct _pages); i++) {
1183: thing = gtk_vbox_new (FALSE, 4);
1184: gtk_widget_show (thing);
1.1.1.4 root 1185: gtk_container_set_border_width (GTK_CONTAINER (thing), 10);
1.1.1.2 root 1186: pages[i].createfunc (thing);
1187: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new (pages[i].title));
1188: }
1.1 root 1189:
1190: enable_disk_buttons (1);
1191:
1192: gtk_widget_show (vbox);
1193: gtk_widget_show (window);
1194:
1195: /* We're going to need that later. */
1.1.1.10! root 1196: disk_selector = gtk_file_selection_new ("");
! 1197: gtk_signal_connect (GTK_OBJECT (disk_selector), "destroy",
! 1198: (GtkSignalFunc) did_close_insert, disk_selector);
1.1 root 1199:
1.1.1.10! root 1200: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (disk_selector)->ok_button),
1.1 root 1201: "clicked", (GtkSignalFunc) did_insert_select,
1.1.1.10! root 1202: GTK_OBJECT (disk_selector));
! 1203: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (disk_selector)->cancel_button),
1.1 root 1204: "clicked", (GtkSignalFunc) did_cancel_insert,
1.1.1.10! root 1205: GTK_OBJECT (disk_selector));
1.1 root 1206: filesel_active = -1;
1207:
1.1.1.10! root 1208: snap_selector = gtk_file_selection_new ("");
! 1209: gtk_signal_connect (GTK_OBJECT (snap_selector), "destroy",
! 1210: (GtkSignalFunc) did_close_snap, snap_selector);
! 1211:
! 1212: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (snap_selector)->ok_button),
! 1213: "clicked", (GtkSignalFunc) did_snap_select,
! 1214: GTK_OBJECT (snap_selector));
! 1215: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (snap_selector)->cancel_button),
! 1216: "clicked", (GtkSignalFunc) did_cancel_snap,
! 1217: GTK_OBJECT (snap_selector));
! 1218: snapsel_active = -1;
! 1219:
1.1 root 1220: gtk_timeout_add (1000, (GtkFunction)my_idle, 0);
1221: gtk_main ();
1222:
1223: quitted_gui = 1;
1224: uae_sem_post (&gui_quit_sem);
1225: return 0;
1226: }
1227:
1228: void gui_changesettings(void)
1229: {
1230:
1231: }
1232:
1233: int gui_init (void)
1234: {
1235: penguin_id tid;
1236:
1237: gui_active = 0;
1238:
1239: init_comm_pipe (&to_gui_pipe, 20, 1);
1240: init_comm_pipe (&from_gui_pipe, 20, 1);
1241: uae_sem_init (&gui_sem, 0, 1);
1242: uae_sem_init (&gui_quit_sem, 0, 0);
1243: start_penguin (gtk_penguin, NULL, &tid);
1244: return 1;
1245: }
1246:
1247: int gui_update (void)
1248: {
1249: if (no_gui)
1250: return 0;
1251:
1252: write_comm_pipe_int (&to_gui_pipe, 1, 1);
1253: return 0;
1254: }
1255:
1256: void gui_exit (void)
1257: {
1258: if (no_gui)
1259: return;
1260:
1261: quit_gui = 1;
1262: uae_sem_wait (&gui_quit_sem);
1263: }
1264:
1.1.1.4 root 1265: void gui_fps (int x)
1266: {
1267: }
1268:
1269: void gui_led (int num, int on)
1.1 root 1270: {
1271: if (no_gui)
1272: return;
1273:
1274: /* if (num == 0)
1275: return;
1276: printf("LED %d %d\n", num, on);
1277: write_comm_pipe_int (&to_gui_pipe, 1, 0);
1278: write_comm_pipe_int (&to_gui_pipe, num == 0 ? 4 : num - 1, 0);
1279: write_comm_pipe_int (&to_gui_pipe, on, 1);
1280: printf("#LED %d %d\n", num, on);*/
1281: }
1282:
1283: void gui_filename(int num, const char *name)
1284: {
1285: if (no_gui)
1286: return;
1287:
1288: write_comm_pipe_int (&to_gui_pipe, 0, 0);
1289: write_comm_pipe_int (&to_gui_pipe, num, 1);
1290:
1291: /* gui_update ();*/
1292: }
1293:
1.1.1.10! root 1294: void gui_handle_events (void)
1.1 root 1295: {
1.1.1.6 root 1296: int pause_uae = FALSE;
1297:
1.1 root 1298: if (no_gui)
1299: return;
1300:
1.1.1.6 root 1301: do {
1302: while (pause_uae || comm_pipe_has_data (&from_gui_pipe)) {
1303: int cmd = read_comm_pipe_int_blocking (&from_gui_pipe);
1304: int n;
1305: switch (cmd) {
1306: case 0:
1307: n = read_comm_pipe_int_blocking (&from_gui_pipe);
1308: changed_prefs.df[n][0] = '\0';
1309: break;
1310: case 1:
1311: n = read_comm_pipe_int_blocking (&from_gui_pipe);
1312: uae_sem_wait (&gui_sem);
1313: strncpy (changed_prefs.df[n], new_disk_string[n], 255);
1314: changed_prefs.df[n][255] = '\0';
1315: uae_sem_post (&gui_sem);
1316: break;
1317: case 2:
1318: uae_reset ();
1319: end_pause_uae ();
1320: break;
1321: case 3:
1322: activate_debugger ();
1323: end_pause_uae ();
1324: break;
1325: case 4:
1326: uae_quit ();
1327: end_pause_uae ();
1328: break;
1329: case 5:
1330: pause_uae = TRUE;
1331: break;
1332: case 6:
1333: pause_uae = FALSE;
1334: break;
1.1.1.10! root 1335: case 7:
! 1336: printf ("STATESAVE\n");
! 1337: savestate_state = read_comm_pipe_int_blocking (&from_gui_pipe);
! 1338: uae_sem_wait (&gui_sem);
! 1339: savestate_filename = gui_snapname;
! 1340: uae_sem_post (&gui_sem);
! 1341: break;
1.1.1.6 root 1342: }
1343: }
1344: } while (pause_uae);
1.1 root 1345: }
1.1.1.7 root 1346:
1347: void gui_update_gfx (void)
1348: {
1349: #if 0 /* This doesn't work... */
1350: set_gfx_state ();
1351: #endif
1352: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.