|
|
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"
1.1.1.11 root 26: #include "autoconf.h"
27: #include "threaddep/thread.h"
1.1.1.2 root 28: #include "sounddep/sound.h"
1.1.1.10 root 29: #include "savestate.h"
1.1.1.14 root 30: #include "debug.h"
1.1 root 31:
32: #include <gtk/gtk.h>
1.1.1.11 root 33: #include <gdk/gdk.h>
1.1 root 34:
1.1.1.4 root 35: /* One of the 1.1.6 "features" is a gratuitous name change */
36: #ifndef HAVE_GTK_FEATURES_1_1_6
37: #define gtk_container_set_border_width gtk_container_border_width
38: #endif
39: /* Likewise for 1.1.8. */
40: #ifndef HAVE_GTK_FEATURES_1_1_8
41: #define gtk_label_set_text gtk_label_set
42: #endif
1.1.1.5 root 43: /* This is beginning to suck... */
44: #ifndef HAVE_GTK_FEATURES_1_1_13
45: #define gtk_toggle_button_set_active gtk_toggle_button_set_state
46: #endif
1.1.1.4 root 47:
1.1 root 48: static int gui_active;
49:
1.1.1.11 root 50: static GtkWidget *gui_window;
51:
1.1.1.10 root 52: static GtkWidget *pause_uae_widget, *snap_save_widget, *snap_load_widget;
53:
54: static GtkWidget *chipsize_widget[5];
55: static GtkWidget *bogosize_widget[4];
56: static GtkWidget *fastsize_widget[5];
57: static GtkWidget *z3size_widget[10];
58: static GtkWidget *p96size_widget[7];
1.1.1.11 root 59: static GtkWidget *rom_text_widget, *key_text_widget;
60: static GtkWidget *rom_change_widget, *key_change_widget;
1.1.1.6 root 61:
1.1 root 62: static GtkWidget *disk_insert_widget[4], *disk_eject_widget[4], *disk_text_widget[4];
63: static char *new_disk_string[4];
64:
65: static GtkAdjustment *cpuspeed_adj;
1.1.1.3 root 66: static GtkWidget *cpuspeed_widgets[4], *cpuspeed_scale;
1.1.1.8 root 67: static GtkWidget *cpu_widget[5], *a24m_widget, *ccpu_widget;
1.1.1.9 root 68: static GtkWidget *sound_widget[4], *sound_bits_widget[2], *sound_freq_widget[3], *sound_ch_widget[3];
1.1 root 69:
1.1.1.10 root 70: static GtkWidget *coll_widget[4], *cslevel_widget[4];
71: static GtkWidget *fcop_widget;
72:
1.1 root 73: static GtkAdjustment *framerate_adj;
1.1.1.7 root 74: static GtkWidget *bimm_widget, *b32_widget, *afscr_widget, *pfscr_widget;
1.1 root 75:
76: static GtkWidget *joy_widget[2][6];
77:
78: static GtkWidget *led_widgets[5];
79: static GdkColor led_on[5], led_off[5];
80: static unsigned int prevledstate;
81:
1.1.1.11 root 82: static GtkWidget *hdlist_widget;
83: static int selected_hd_row;
84: static GtkWidget *hdchange_button, *hddel_button;
85: static GtkWidget *volname_entry, *path_entry;
86: static GtkWidget *dirdlg;
87: static char dirdlg_volname[256], dirdlg_path[256];
88:
1.1.1.14 root 89: static GtkWidget *lab_info;
1.1.1.15 root 90: static GtkWidget *notebook;
1.1.1.14 root 91:
1.1.1.2 root 92: static smp_comm_pipe to_gui_pipe, from_gui_pipe;
1.1.1.11 root 93: static uae_sem_t gui_sem, gui_init_sem, gui_quit_sem; /* gui_sem protects the DFx fields */
1.1.1.2 root 94:
95: static volatile int quit_gui = 0, quitted_gui = 0;
96:
1.1 root 97: static void save_config (void)
98: {
99: FILE *f;
100: char tmp[257];
101:
102: /* Backup the options file. */
103: strcpy (tmp, optionsfile);
104: strcat (tmp, "~");
105: rename (optionsfile, tmp);
106:
107: f = fopen (optionsfile, "w");
108: if (f == NULL) {
1.1.1.13 root 109: write_log ("Error saving options file!\n");
1.1 root 110: return;
111: }
1.1.1.4 root 112: save_options (f, &currprefs);
1.1 root 113: fclose (f);
114: }
115:
116: static int nr_for_led (GtkWidget *led)
117: {
118: int i;
119: i = 0;
120: while (led_widgets[i] != led)
121: i++;
122: return i;
123: }
124:
125: static void enable_disk_buttons (int enable)
126: {
127: int i;
128: for (i = 0; i < 4; i++) {
129: gtk_widget_set_sensitive (disk_insert_widget[i], enable);
130: gtk_widget_set_sensitive (disk_eject_widget[i], enable);
131: }
132: }
133:
1.1.1.10 root 134: static void enable_snap_buttons (int enable)
135: {
136: gtk_widget_set_sensitive (snap_save_widget, enable);
137: gtk_widget_set_sensitive (snap_load_widget, enable);
138: }
139:
1.1 root 140: static void set_cpu_state (void)
141: {
1.1.1.10 root 142: int i;
143:
1.1.1.5 root 144: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0);
1.1.1.8 root 145: gtk_widget_set_sensitive (a24m_widget, changed_prefs.cpu_level > 1 && changed_prefs.cpu_level < 4);
1.1.1.5 root 146: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0);
1.1 root 147: gtk_widget_set_sensitive (ccpu_widget, changed_prefs.cpu_level == 0);
1.1.1.3 root 148: gtk_widget_set_sensitive (cpuspeed_scale, changed_prefs.m68k_speed > 0);
1.1.1.10 root 149: for (i = 0; i < 10; i++)
150: gtk_widget_set_sensitive (z3size_widget[i],
151: changed_prefs.cpu_level >= 2 && ! changed_prefs.address_space_24);
1.1 root 152: }
153:
154: static void set_cpu_widget (void)
155: {
156: int nr = changed_prefs.cpu_level;
1.1.1.10 root 157:
1.1.1.5 root 158: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE);
1.1.1.3 root 159: nr = currprefs.m68k_speed + 1 < 3 ? currprefs.m68k_speed + 1 : 2;
1.1.1.5 root 160: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpuspeed_widgets[nr]), TRUE);
1.1.1.10 root 161:
1.1 root 162: }
163:
164: static void set_gfx_state (void)
165: {
1.1.1.5 root 166: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0);
1.1.1.10 root 167: #if 0
1.1.1.5 root 168: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0);
1.1.1.7 root 169: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (afscr_widget), currprefs.gfx_afullscreen != 0);
170: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pfscr_widget), currprefs.gfx_pfullscreen != 0);
1.1.1.10 root 171: #endif
172: }
173:
174: static void set_chipset_state (void)
175: {
176: int t0 = 0;
177: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (coll_widget[currprefs.collision_level]), TRUE);
178: if (currprefs.chipset_mask & CSMASK_AGA)
179: t0 = 3;
180: else if (currprefs.chipset_mask & CSMASK_ECS_DENISE)
181: t0 = 2;
182: else if (currprefs.chipset_mask & CSMASK_ECS_AGNUS)
183: t0 = 1;
184: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cslevel_widget[t0]), TRUE);
185: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fcop_widget), currprefs.fast_copper != 0);
1.1 root 186: }
187:
1.1.1.2 root 188: static void set_sound_state (void)
189: {
1.1.1.16! root 190: int stereo = currprefs.sound_stereo + currprefs.mixed_stereo;
1.1.1.5 root 191: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_widget[currprefs.produce_sound]), 1);
1.1.1.9 root 192: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_ch_widget[stereo]), 1);
1.1.1.5 root 193: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_bits_widget[currprefs.sound_bits == 16]), 1);
1.1.1.2 root 194: }
195:
1.1.1.10 root 196: static void set_mem_state (void)
197: {
198: int t, t2;
199:
200: t = 0;
201: t2 = currprefs.chipmem_size;
202: while (t < 4 && t2 > 0x80000)
203: t++, t2 >>= 1;
204: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chipsize_widget[t]), 1);
205:
206: t = 0;
207: t2 = currprefs.bogomem_size;
208: while (t < 3 && t2 >= 0x80000)
209: t++, t2 >>= 1;
210: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bogosize_widget[t]), 1);
211:
212: t = 0;
213: t2 = currprefs.fastmem_size;
214: while (t < 4 && t2 >= 0x100000)
215: t++, t2 >>= 1;
216: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fastsize_widget[t]), 1);
217:
218: t = 0;
219: t2 = currprefs.z3fastmem_size;
220: while (t < 9 && t2 >= 0x100000)
221: t++, t2 >>= 1;
222: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (z3size_widget[t]), 1);
223:
224: t = 0;
225: t2 = currprefs.gfxmem_size;
226: while (t < 6 && t2 >= 0x100000)
227: t++, t2 >>= 1;
228: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (p96size_widget[t]), 1);
1.1.1.11 root 229:
230: gtk_label_set_text (GTK_LABEL (rom_text_widget), currprefs.romfile);
231: gtk_label_set_text (GTK_LABEL (key_text_widget), currprefs.keyfile);
1.1.1.10 root 232: }
233:
1.1 root 234: static void set_joy_state (void)
235: {
1.1.1.4 root 236: int j0t = changed_prefs.jport0;
237: int j1t = changed_prefs.jport1;
1.1 root 238: int i;
239:
240: if (j0t == j1t) {
241: /* Can't happen */
242: j0t++;
243: j0t %= 6;
244: }
245: for (i = 0; i < 6; i++) {
1.1.1.5 root 246: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i);
247: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i);
1.1 root 248: gtk_widget_set_sensitive (joy_widget[0][i], j1t != i);
249: gtk_widget_set_sensitive (joy_widget[1][i], j0t != i);
250: }
251: }
252:
1.1.1.11 root 253: static void set_hd_state (void)
254: {
255: char texts[9][256];
256: char *tptrs[] = { texts[0], texts[1], texts[2], texts[3], texts[4], texts[5], texts[6], texts[7], texts[8] };
257: int nr = nr_units (currprefs.mountinfo);
258: int i;
259:
260: gtk_clist_freeze (GTK_CLIST (hdlist_widget));
261: gtk_clist_clear (GTK_CLIST (hdlist_widget));
262: for (i = 0; i < nr; i++) {
263: int secspertrack, surfaces, reserved, blocksize, size;
264: int cylinders, readonly;
265: char *volname, *rootdir;
266: char *failure;
267:
268: /* We always use currprefs.mountinfo for the GUI. The filesystem
269: code makes a private copy which is updated every reset. */
270: failure = get_filesys_unit (currprefs.mountinfo, i,
271: &volname, &rootdir, &readonly,
272: &secspertrack, &surfaces, &reserved,
273: &cylinders, &size, &blocksize);
274:
275: if (is_hardfile (currprefs.mountinfo, i)) {
276: sprintf (texts[0], "DH%d", i );
277: sprintf (texts[3], "%d", surfaces);
278: sprintf (texts[4], "%d", cylinders);
279: sprintf (texts[5], "%d", secspertrack);
280: sprintf (texts[6], "%d", reserved);
281: sprintf (texts[7], "%d", size);
282: sprintf (texts[8], "%d", blocksize);
283: } else {
284: strcpy (texts[0], volname);
285: strcpy (texts[3], "n/a");
286: strcpy (texts[4], "n/a");
287: strcpy (texts[5], "n/a");
288: strcpy (texts[6], "n/a");
289: strcpy (texts[7], "n/a");
290: strcpy (texts[8], "n/a");
291: }
292: strcpy (texts[1], rootdir);
293: strcpy (texts[2], readonly ? "y" : "n");
294: gtk_clist_append (GTK_CLIST (hdlist_widget), tptrs);
295: }
296: gtk_clist_thaw (GTK_CLIST (hdlist_widget));
297: gtk_widget_set_sensitive (hdchange_button, FALSE);
298: gtk_widget_set_sensitive (hddel_button, FALSE);
299: }
300:
1.1 root 301: static void draw_led (int nr)
302: {
303: GtkWidget *thing = led_widgets[nr];
304: GdkWindow *window = thing->window;
305: GdkGC *gc = gdk_gc_new (window);
306: GdkColor *col;
307:
308: if (gui_ledstate & (1 << nr))
309: col = led_on + nr;
310: else
311: col = led_off + nr;
312: gdk_gc_set_foreground (gc, col);
313: gdk_draw_rectangle (window, gc, 1, 0, 0, -1, -1);
314: gdk_gc_destroy (gc);
315: }
316:
317: static int my_idle (void)
318: {
319: unsigned int leds = gui_ledstate;
320: int i;
321:
322: if (quit_gui) {
323: gtk_main_quit ();
324: goto out;
325: }
326: while (comm_pipe_has_data (&to_gui_pipe)) {
327: int cmd = read_comm_pipe_int_blocking (&to_gui_pipe);
328: int n;
329: switch (cmd) {
1.1.1.15 root 330: case 0:
1.1 root 331: n = read_comm_pipe_int_blocking (&to_gui_pipe);
1.1.1.4 root 332: gtk_label_set_text (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]);
1.1 root 333: break;
1.1.1.15 root 334: case 1:
1.1 root 335: /* Initialization. */
336: set_cpu_widget ();
337: set_cpu_state ();
338: set_gfx_state ();
339: set_joy_state ();
1.1.1.2 root 340: set_sound_state ();
1.1.1.10 root 341: set_mem_state ();
1.1.1.11 root 342: set_hd_state ();
1.1.1.10 root 343: set_chipset_state ();
1.1.1.3 root 344:
1.1.1.11 root 345: gtk_widget_show (gui_window);
346: uae_sem_post (&gui_init_sem);
1.1 root 347: gui_active = 1;
348: break;
1.1.1.15 root 349: case 2:
1.1.1.14 root 350: /* Set Pause-Button active */
351: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_uae_widget), TRUE);
352: break;
1.1.1.15 root 353: case 3:
1.1.1.14 root 354: /* Set Pause-Button inactive */
355: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_uae_widget), FALSE);
356: break;
1.1 root 357: }
358: }
1.1.1.10 root 359:
1.1.1.15 root 360: if (gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook)) == 0) {
361: for (i = 0; i < 5; i++) {
362: unsigned int mask = 1 << i;
363: unsigned int on = leds & mask;
364:
365: if (on == (prevledstate & mask))
366: continue;
367:
368: /* printf(": %d %d\n", i, on);*/
369: draw_led (i);
370: }
371: prevledstate = leds;
1.1 root 372: }
1.1.1.15 root 373: out:
1.1 root 374: return 1;
375: }
376:
1.1.1.2 root 377: static int find_current_toggle (GtkWidget **widgets, int count)
378: {
379: int i;
380: for (i = 0; i < count; i++)
381: if (GTK_TOGGLE_BUTTON (*widgets++)->active)
382: return i;
1.1.1.13 root 383: write_log ("GTKUI: Can't happen!\n");
1.1.1.2 root 384: return -1;
385: }
386:
1.1 root 387: static void joy_changed (void)
388: {
389: if (! gui_active)
390: return;
391:
1.1.1.4 root 392: changed_prefs.jport0 = find_current_toggle (joy_widget[0], 6);
393: changed_prefs.jport1 = find_current_toggle (joy_widget[1], 6);
1.1 root 394: set_joy_state ();
395: }
396:
1.1.1.10 root 397: static void coll_changed (void)
398: {
399: changed_prefs.collision_level = find_current_toggle (coll_widget, 4);
400: }
401:
402: static void cslevel_changed (void)
403: {
404: int t = find_current_toggle (cslevel_widget, 4);
405: int t1 = 0;
406: if (t > 0)
407: t1 |= CSMASK_ECS_AGNUS;
408: if (t > 1)
409: t1 |= CSMASK_ECS_DENISE;
410: if (t > 2)
411: t1 |= CSMASK_AGA;
412: changed_prefs.chipset_mask = t1;
413: }
414:
1.1.1.2 root 415: static void custom_changed (void)
1.1 root 416: {
1.1.1.6 root 417: changed_prefs.gfx_framerate = framerate_adj->value;
1.1 root 418: changed_prefs.immediate_blits = GTK_TOGGLE_BUTTON (bimm_widget)->active;
1.1.1.10 root 419: changed_prefs.fast_copper = GTK_TOGGLE_BUTTON (fcop_widget)->active;
420: #if 0
421: changed_prefs.blits_32bit_enabled = GTK_TOGGLE_BUTTON (b32_widget)->active;
1.1.1.7 root 422: changed_prefs.gfx_afullscreen = GTK_TOGGLE_BUTTON (afscr_widget)->active;
423: changed_prefs.gfx_pfullscreen = GTK_TOGGLE_BUTTON (pfscr_widget)->active;
1.1.1.10 root 424: #endif
1.1 root 425: }
426:
427: static void cpuspeed_changed (void)
428: {
1.1.1.3 root 429: int which = find_current_toggle (cpuspeed_widgets, 3);
430: changed_prefs.m68k_speed = (which == 0 ? -1
431: : which == 1 ? 0
432: : cpuspeed_adj->value);
433: set_cpu_state ();
1.1 root 434: }
435:
436: static void cputype_changed (void)
437: {
438: int i, oldcl;
439: if (! gui_active)
440: return;
441:
442: oldcl = changed_prefs.cpu_level;
443:
1.1.1.8 root 444: changed_prefs.cpu_level = find_current_toggle (cpu_widget, 5);
1.1 root 445: changed_prefs.cpu_compatible = GTK_TOGGLE_BUTTON (ccpu_widget)->active;
446: changed_prefs.address_space_24 = GTK_TOGGLE_BUTTON (a24m_widget)->active;
447:
448: if (changed_prefs.cpu_level != 0)
449: changed_prefs.cpu_compatible = 0;
450: /* 68000/68010 always have a 24 bit address space. */
451: if (changed_prefs.cpu_level < 2)
452: changed_prefs.address_space_24 = 1;
453: /* Changing from 68000/68010 to 68020 should set a sane default. */
454: else if (oldcl < 2)
455: changed_prefs.address_space_24 = 0;
1.1.1.8 root 456:
1.1 root 457: set_cpu_state ();
458: }
459:
1.1.1.10 root 460: static void chipsize_changed (void)
461: {
462: int t = find_current_toggle (chipsize_widget, 5);
463: changed_prefs.chipmem_size = 0x80000 << t;
464: for (t = 0; t < 5; t++)
465: gtk_widget_set_sensitive (fastsize_widget[t], changed_prefs.chipmem_size <= 0x200000);
466: if (changed_prefs.chipmem_size > 0x200000) {
467: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fastsize_widget[0]), 1);
468: changed_prefs.fastmem_size = 0;
469: }
470: }
471:
472: static void bogosize_changed (void)
473: {
474: int t = find_current_toggle (bogosize_widget, 4);
475: changed_prefs.bogomem_size = (0x40000 << t) & ~0x40000;
476: }
477:
478: static void fastsize_changed (void)
479: {
480: int t = find_current_toggle (fastsize_widget, 5);
481: changed_prefs.fastmem_size = (0x80000 << t) & ~0x80000;
482: }
483:
484: static void z3size_changed (void)
485: {
486: int t = find_current_toggle (z3size_widget, 10);
487: changed_prefs.z3fastmem_size = (0x80000 << t) & ~0x80000;
488: }
489:
490: static void p96size_changed (void)
491: {
492: int t = find_current_toggle (p96size_widget, 7);
493: changed_prefs.gfxmem_size = (0x80000 << t) & ~0x80000;
494: }
495:
1.1.1.2 root 496: static void sound_changed (void)
497: {
498: changed_prefs.produce_sound = find_current_toggle (sound_widget, 4);
1.1.1.16! root 499: changed_prefs.sound_stereo = find_current_toggle (sound_ch_widget, 3);
1.1.1.9 root 500: changed_prefs.mixed_stereo = 0;
1.1.1.16! root 501: if (changed_prefs.sound_stereo == 2)
! 502: changed_prefs.mixed_stereo = changed_prefs.sound_stereo = 1;
1.1.1.2 root 503: changed_prefs.sound_bits = (find_current_toggle (sound_bits_widget, 2) + 1) * 8;
504: }
505:
1.1 root 506: static void did_reset (void)
507: {
508: if (quit_gui)
509: return;
510:
511: write_comm_pipe_int (&from_gui_pipe, 2, 1);
512: }
513:
514: static void did_debug (void)
515: {
516: if (quit_gui)
517: return;
1.1.1.14 root 518:
1.1 root 519: write_comm_pipe_int (&from_gui_pipe, 3, 1);
520: }
521:
522: static void did_quit (void)
523: {
524: if (quit_gui)
525: return;
1.1.1.14 root 526:
1.1 root 527: write_comm_pipe_int (&from_gui_pipe, 4, 1);
528: }
529:
1.1.1.2 root 530: static void did_eject (GtkWidget *w, gpointer data)
531: {
1.1 root 532: if (quit_gui)
533: return;
1.1.1.14 root 534:
1.1 root 535: write_comm_pipe_int (&from_gui_pipe, 0, 0);
1.1.1.2 root 536: write_comm_pipe_int (&from_gui_pipe, (int)data, 1);
1.1.1.14 root 537: gtk_label_set_text (GTK_LABEL (disk_text_widget[(int)data]), "");
1.1 root 538: }
539:
1.1.1.14 root 540: static void pause_uae (void)
1.1.1.6 root 541: {
542: if (quit_gui)
543: return;
544:
1.1.1.14 root 545: write_comm_pipe_int (&from_gui_pipe, GTK_TOGGLE_BUTTON (pause_uae_widget)->active ? 5 : 6, 1);
546: if (! GTK_TOGGLE_BUTTON (pause_uae_widget)->active)
547: gtk_widget_hide (lab_info);
1.1.1.6 root 548: }
549:
550: static void end_pause_uae (void)
551: {
1.1.1.14 root 552: write_comm_pipe_int (&to_gui_pipe, 3, 1);
1.1.1.6 root 553: }
554:
1.1 root 555: static int filesel_active = -1;
1.1.1.10 root 556: static GtkWidget *disk_selector;
557:
558: static int snapsel_active = -1;
1.1.1.11 root 559: static char *gui_snapname, *gui_romname, *gui_keyname;
1.1 root 560:
1.1.1.11 root 561: static void did_close_insert (gpointer data)
1.1 root 562: {
563: filesel_active = -1;
564: enable_disk_buttons (1);
565: }
566:
567: static void did_insert_select (GtkObject *o)
568: {
1.1.1.10 root 569: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (disk_selector));
1.1.1.13 root 570: printf ("%d %s\n", filesel_active, s);
1.1 root 571: if (quit_gui)
572: return;
573:
574: uae_sem_wait (&gui_sem);
575: if (new_disk_string[filesel_active] != 0)
576: free (new_disk_string[filesel_active]);
577: new_disk_string[filesel_active] = strdup (s);
578: uae_sem_post (&gui_sem);
579: write_comm_pipe_int (&from_gui_pipe, 1, 0);
580: write_comm_pipe_int (&from_gui_pipe, filesel_active, 1);
1.1.1.14 root 581: gtk_label_set_text (GTK_LABEL (disk_text_widget[filesel_active]), strdup (s));
1.1 root 582: filesel_active = -1;
583: enable_disk_buttons (1);
1.1.1.11 root 584: gtk_widget_destroy (disk_selector);
1.1 root 585: }
586:
587: static char fsbuffer[100];
588:
1.1.1.11 root 589: static GtkWidget *make_file_selector (const char *title,
590: void (*insertfunc)(GtkObject *),
591: void (*closefunc)(gpointer))
592: {
593: GtkWidget *p = gtk_file_selection_new (title);
594: gtk_signal_connect (GTK_OBJECT (p), "destroy", (GtkSignalFunc) closefunc, p);
595:
596: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (p)->ok_button),
597: "clicked", (GtkSignalFunc) insertfunc,
598: GTK_OBJECT (p));
599: gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (p)->cancel_button),
600: "clicked", (GtkSignalFunc) gtk_widget_destroy,
601: GTK_OBJECT (p));
602:
603: #if 0
604: gtk_window_set_title (GTK_WINDOW (p), title);
605: #endif
606:
607: gtk_widget_show (p);
608: return p;
609: }
610:
611: static void filesel_set_path (GtkWidget *p, const char *path)
612: {
613: size_t len = strlen (path);
614: if (len > 0 && ! access (path, R_OK)) {
615: char *tmp = xmalloc (len + 2);
616: strcpy (tmp, path);
617: strcat (tmp, "/");
618: gtk_file_selection_set_filename (GTK_FILE_SELECTION (p),
619: tmp);
620: }
621: }
622:
1.1.1.2 root 623: static void did_insert (GtkWidget *w, gpointer data)
1.1 root 624: {
1.1.1.2 root 625: int n = (int)data;
1.1 root 626: if (filesel_active != -1)
627: return;
628: filesel_active = n;
629: enable_disk_buttons (0);
630:
631: sprintf (fsbuffer, "Select a disk image file for DF%d", n);
1.1.1.11 root 632: disk_selector = make_file_selector (fsbuffer, did_insert_select, did_close_insert);
633: filesel_set_path (disk_selector, currprefs.path_floppy);
1.1 root 634: }
635:
636: static gint driveled_event (GtkWidget *thing, GdkEvent *event)
637: {
638: int lednr = nr_for_led (thing);
639:
640: switch (event->type) {
641: case GDK_MAP:
642: draw_led (lednr);
643: break;
644: case GDK_EXPOSE:
645: draw_led (lednr);
646: break;
647: default:
648: break;
649: }
650:
651: return 0;
652: }
653:
1.1.1.11 root 654: static GtkWidget *snap_selector;
1.1.1.10 root 655:
1.1.1.11 root 656: static void did_close_snap (gpointer gdata)
1.1.1.10 root 657: {
658: snapsel_active = -1;
659: enable_snap_buttons (1);
660: }
661:
662: static void did_snap_select (GtkObject *o)
663: {
664: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (snap_selector));
1.1.1.11 root 665:
1.1.1.10 root 666: if (quit_gui)
667: return;
668:
669: uae_sem_wait (&gui_sem);
670: gui_snapname = strdup (s);
671: uae_sem_post (&gui_sem);
672: write_comm_pipe_int (&from_gui_pipe, 7, 0);
673: write_comm_pipe_int (&from_gui_pipe, snapsel_active, 1);
674: snapsel_active = -1;
675: enable_snap_buttons (1);
1.1.1.11 root 676: gtk_widget_destroy (snap_selector);
1.1.1.10 root 677: }
678:
679: static void did_loadstate (void)
680: {
681: if (snapsel_active != -1)
682: return;
683: snapsel_active = STATE_DORESTORE;
684: enable_snap_buttons (0);
685:
1.1.1.11 root 686: snap_selector = make_file_selector ("Select a state file to restore",
687: did_snap_select, did_close_snap);
1.1.1.10 root 688: }
689:
690: static void did_savestate (void)
691: {
692: if (snapsel_active != -1)
693: return;
694: snapsel_active = STATE_DOSAVE;
695: enable_snap_buttons (0);
696:
1.1.1.11 root 697: snap_selector = make_file_selector ("Select a filename for the state file",
698: did_snap_select, did_close_snap);
699: }
700:
701: static GtkWidget *rom_selector;
702:
703: static void did_close_rom (gpointer gdata)
704: {
705: gtk_widget_set_sensitive (rom_change_widget, 1);
706: }
707:
708: static void did_rom_select (GtkObject *o)
709: {
710: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (rom_selector));
711:
712: if (quit_gui)
713: return;
714:
715: gtk_widget_set_sensitive (rom_change_widget, 1);
716:
717: uae_sem_wait (&gui_sem);
718: gui_romname = strdup (s);
719: uae_sem_post (&gui_sem);
720: write_comm_pipe_int (&from_gui_pipe, 8, 0);
721: gtk_label_set_text (GTK_LABEL (rom_text_widget), gui_romname);
722: gtk_widget_destroy (rom_selector);
723: }
724:
725: static void did_romchange (GtkWidget *w, gpointer data)
726: {
727: gtk_widget_set_sensitive (rom_change_widget, 0);
728:
729: rom_selector = make_file_selector ("Select a ROM file",
730: did_rom_select, did_close_rom);
731: filesel_set_path (rom_selector, currprefs.path_rom);
732: }
733:
734: static GtkWidget *key_selector;
1.1.1.10 root 735:
1.1.1.11 root 736: static void did_close_key (gpointer gdata)
737: {
738: gtk_widget_set_sensitive (key_change_widget, 1);
739: }
740:
741: static void did_key_select (GtkObject *o)
742: {
743: char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (key_selector));
744:
745: if (quit_gui)
746: return;
747:
748: gtk_widget_set_sensitive (key_change_widget, 1);
749:
750: uae_sem_wait (&gui_sem);
751: gui_keyname = strdup (s);
752: uae_sem_post (&gui_sem);
753: write_comm_pipe_int (&from_gui_pipe, 9, 0);
754: gtk_label_set_text (GTK_LABEL (key_text_widget), gui_keyname);
755: gtk_widget_destroy (key_selector);
756: }
757:
758: static void did_keychange (GtkWidget *w, gpointer data)
759: {
760: gtk_widget_set_sensitive (key_change_widget, 0);
761:
762: key_selector = make_file_selector ("Select a Kickstart key file",
763: did_key_select, did_close_key);
764: filesel_set_path (key_selector, currprefs.path_rom);
1.1.1.10 root 765: }
766:
1.1.1.2 root 767: static void add_empty_vbox (GtkWidget *tobox)
768: {
769: GtkWidget *thing = gtk_vbox_new (FALSE, 0);
770: gtk_widget_show (thing);
771: gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0);
772: }
773:
1.1.1.3 root 774: static void add_empty_hbox (GtkWidget *tobox)
775: {
776: GtkWidget *thing = gtk_hbox_new (FALSE, 0);
777: gtk_widget_show (thing);
778: gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0);
779: }
780:
1.1.1.2 root 781: static void add_centered_to_vbox (GtkWidget *vbox, GtkWidget *w)
782: {
783: GtkWidget *hbox = gtk_hbox_new (TRUE, 0);
784: gtk_widget_show (hbox);
785: gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, FALSE, 0);
786: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
787: }
788:
789: static GtkWidget *make_labelled_widget (const char *str, GtkWidget *thing)
790: {
791: GtkWidget *label = gtk_label_new (str);
792: GtkWidget *hbox2 = gtk_hbox_new (FALSE, 4);
793:
794: gtk_widget_show (label);
795: gtk_widget_show (thing);
796:
797: gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
798: gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
799:
800: return hbox2;
801: }
802:
1.1.1.3 root 803: static GtkWidget *add_labelled_widget_centered (const char *str, GtkWidget *thing, GtkWidget *vbox)
1.1.1.2 root 804: {
805: GtkWidget *w = make_labelled_widget (str, thing);
806: gtk_widget_show (w);
807: add_centered_to_vbox (vbox, w);
1.1.1.3 root 808: return w;
1.1.1.2 root 809: }
810:
1.1.1.10 root 811: static int make_radio_group (const char **labels, GtkWidget *tobox,
1.1.1.2 root 812: GtkWidget **saveptr, gint t1, gint t2,
1.1.1.10 root 813: void (*sigfunc) (void), int count, GSList *group)
1.1.1.2 root 814: {
1.1.1.10 root 815: int t = 0;
816:
817: while (*labels && (count == -1 || count-- > 0)) {
818: GtkWidget *thing = gtk_radio_button_new_with_label (group, *labels++);
819: group = gtk_radio_button_group (GTK_RADIO_BUTTON (thing));
1.1.1.2 root 820:
821: *saveptr++ = thing;
822: gtk_widget_show (thing);
823: gtk_box_pack_start (GTK_BOX (tobox), thing, t1, t2, 0);
824: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) sigfunc, NULL);
1.1.1.10 root 825: t++;
1.1.1.2 root 826: }
1.1.1.10 root 827: return t;
1.1.1.2 root 828: }
829:
830: static GtkWidget *make_radio_group_box (const char *title, const char **labels,
831: GtkWidget **saveptr, int horiz,
832: void (*sigfunc) (void))
833: {
834: GtkWidget *frame, *newbox;
835:
836: frame = gtk_frame_new (title);
837: newbox = (horiz ? gtk_hbox_new : gtk_vbox_new) (FALSE, 4);
838: gtk_widget_show (newbox);
1.1.1.4 root 839: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.2 root 840: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1.1.10 root 841: make_radio_group (labels, newbox, saveptr, horiz, !horiz, sigfunc, -1, NULL);
842: return frame;
843: }
844:
845: static GtkWidget *make_radio_group_box_1 (const char *title, const char **labels,
846: GtkWidget **saveptr, int horiz,
847: void (*sigfunc) (void), int elts_per_column)
848: {
849: GtkWidget *frame, *newbox;
850: GtkWidget *column;
851: GSList *group = 0;
852:
853: frame = gtk_frame_new (title);
854: column = (horiz ? gtk_vbox_new : gtk_hbox_new) (FALSE, 4);
855: gtk_container_add (GTK_CONTAINER (frame), column);
856: gtk_widget_show (column);
857:
858: while (*labels) {
859: int count;
860: newbox = (horiz ? gtk_hbox_new : gtk_vbox_new) (FALSE, 4);
861: gtk_widget_show (newbox);
862: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
863: gtk_container_add (GTK_CONTAINER (column), newbox);
864: count = make_radio_group (labels, newbox, saveptr, horiz, !horiz, sigfunc, elts_per_column, group);
865: labels += count;
866: saveptr += count;
867: group = gtk_radio_button_group (GTK_RADIO_BUTTON (saveptr[-1]));
868: }
1.1.1.2 root 869: return frame;
870: }
871:
1.1 root 872: static GtkWidget *make_led (int nr)
873: {
874: GtkWidget *subframe, *the_led, *thing;
875: GdkColormap *colormap;
876:
877: the_led = gtk_vbox_new (FALSE, 0);
878: gtk_widget_show (the_led);
879:
880: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
881: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
882: gtk_widget_show (thing);
883:
884: subframe = gtk_frame_new (NULL);
885: gtk_box_pack_start (GTK_BOX (the_led), subframe, TRUE, TRUE, 0);
886: gtk_widget_show (subframe);
887:
888: thing = gtk_drawing_area_new ();
889: gtk_drawing_area_size (GTK_DRAWING_AREA (thing), 20, 5);
890: gtk_widget_set_events (thing, GDK_EXPOSURE_MASK);
891: gtk_container_add (GTK_CONTAINER (subframe), thing);
892: colormap = gtk_widget_get_colormap (thing);
893: led_on[nr].red = nr == 0 ? 0xEEEE : 0xCCCC;
894: led_on[nr].green = nr == 0 ? 0: 0xFFFF;
895: led_on[nr].blue = 0;
896: led_on[nr].pixel = 0;
897: led_off[nr].red = 0;
898: led_off[nr].green = 0;
899: led_off[nr].blue = 0;
900: led_off[nr].pixel = 0;
901: gdk_color_alloc (colormap, led_on + nr);
902: gdk_color_alloc (colormap, led_off + nr);
903: led_widgets[nr] = thing;
904: gtk_signal_connect (GTK_OBJECT (thing), "event",
905: (GtkSignalFunc) driveled_event, (gpointer) thing);
906: gtk_widget_show (thing);
907:
908: thing = gtk_preview_new (GTK_PREVIEW_COLOR);
909: gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
910: gtk_widget_show (thing);
1.1.1.15 root 911:
1.1 root 912: return the_led;
913: }
914:
1.1.1.11 root 915: static GtkWidget *make_file_container (const char *title, GtkWidget *vbox)
916: {
917: GtkWidget *thing = gtk_frame_new (title);
918: GtkWidget *buttonbox = gtk_hbox_new (FALSE, 4);
919:
920: gtk_container_set_border_width (GTK_CONTAINER (buttonbox), 4);
921: gtk_container_add (GTK_CONTAINER (thing), buttonbox);
922: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
923: gtk_widget_show (buttonbox);
924: gtk_widget_show (thing);
925:
926: return buttonbox;
927: }
928:
929: static GtkWidget *make_file_widget (GtkWidget *buttonbox)
930: {
931: GtkWidget *thing, *subthing;
932: GtkWidget *subframe = gtk_frame_new (NULL);
933:
934: gtk_frame_set_shadow_type (GTK_FRAME (subframe), GTK_SHADOW_ETCHED_OUT);
935: gtk_box_pack_start (GTK_BOX (buttonbox), subframe, TRUE, TRUE, 0);
936: gtk_widget_show (subframe);
937: subthing = gtk_vbox_new (FALSE, 0);
938: gtk_widget_show (subthing);
939: gtk_container_add (GTK_CONTAINER (subframe), subthing);
940: thing = gtk_label_new ("");
941: gtk_widget_show (thing);
942: gtk_box_pack_start (GTK_BOX (subthing), thing, TRUE, TRUE, 0);
943:
944: return thing;
945: }
946:
1.1 root 947: static void make_floppy_disks (GtkWidget *vbox)
948: {
1.1.1.2 root 949: GtkWidget *thing, *subthing, *subframe, *buttonbox;
950: char buf[5];
1.1 root 951: int i;
1.1.1.2 root 952:
953: add_empty_vbox (vbox);
954:
1.1 root 955: for (i = 0; i < 4; i++) {
1.1.1.2 root 956: /* Frame with an hbox and the "DFx:" title */
1.1 root 957: sprintf (buf, "DF%d:", i);
1.1.1.11 root 958: buttonbox = make_file_container (buf, vbox);
959:
1.1.1.2 root 960: /* LED */
1.1 root 961: subthing = make_led (i + 1);
962: gtk_box_pack_start (GTK_BOX (buttonbox), subthing, FALSE, TRUE, 0);
963:
1.1.1.2 root 964: /* Current file display */
1.1.1.11 root 965: disk_text_widget[i] = make_file_widget (buttonbox);
1.1 root 966:
967: /* Now, the buttons. */
968: thing = gtk_button_new_with_label ("Eject");
969: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
970: gtk_widget_show (thing);
971: disk_eject_widget[i] = thing;
1.1.1.2 root 972: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_eject, (gpointer) i);
1.1 root 973:
974: thing = gtk_button_new_with_label ("Insert");
975: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
976: gtk_widget_show (thing);
977: disk_insert_widget[i] = thing;
1.1.1.2 root 978: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_insert, (gpointer) i);
1.1 root 979: }
1.1.1.2 root 980:
981: add_empty_vbox (vbox);
1.1 root 982: }
983:
1.1.1.3 root 984: static GtkWidget *make_cpu_speed_sel (void)
985: {
1.1.1.10 root 986: int t;
1.1.1.3 root 987: static const char *labels[] = {
988: "Optimize for host CPU speed","Approximate 68000/7MHz speed", "Adjustable",
989: NULL
990: };
991: GtkWidget *frame, *newbox;
992:
993: frame = gtk_frame_new ("CPU speed");
994: newbox = gtk_vbox_new (FALSE, 4);
995: gtk_widget_show (newbox);
1.1.1.4 root 996: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.3 root 997: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1.1.10 root 998: make_radio_group (labels, newbox, cpuspeed_widgets, 0, 1, cpuspeed_changed, -1, NULL);
1.1.1.3 root 999:
1.1.1.10 root 1000: t = currprefs.m68k_speed > 0 ? currprefs.m68k_speed : 4 * CYCLE_UNIT;
1001: cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (t, 1.0, 5120.0, 1.0, 1.0, 1.0));
1.1.1.3 root 1002: gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed",
1003: GTK_SIGNAL_FUNC (cpuspeed_changed), NULL);
1004:
1005: cpuspeed_scale = gtk_hscale_new (cpuspeed_adj);
1006: gtk_range_set_update_policy (GTK_RANGE (cpuspeed_scale), GTK_UPDATE_DELAYED);
1007: gtk_scale_set_digits (GTK_SCALE (cpuspeed_scale), 0);
1008: gtk_scale_set_value_pos (GTK_SCALE (cpuspeed_scale), GTK_POS_RIGHT);
1009: cpuspeed_scale = add_labelled_widget_centered ("Cycles per instruction:", cpuspeed_scale, newbox);
1010:
1011: return frame;
1012: }
1013:
1.1.1.2 root 1014: static void make_cpu_widgets (GtkWidget *vbox)
1.1 root 1015: {
1016: int i;
1.1.1.3 root 1017: GtkWidget *newbox, *hbox, *frame;
1.1 root 1018: GtkWidget *thing;
1.1.1.2 root 1019: static const char *radiolabels[] = {
1.1.1.8 root 1020: "68000", "68010", "68020", "68020+68881", "68040",
1.1.1.2 root 1021: NULL
1022: };
1023:
1024: add_empty_vbox (vbox);
1025:
1.1.1.3 root 1026: hbox = gtk_hbox_new (FALSE, 0);
1027: add_empty_vbox (hbox);
1028:
1029: newbox = make_radio_group_box ("CPU type", radiolabels, cpu_widget, 0, cputype_changed);
1.1.1.2 root 1030: gtk_widget_show (newbox);
1.1.1.3 root 1031: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0);
1032:
1033: newbox = make_cpu_speed_sel ();
1034: gtk_widget_show (newbox);
1035: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0);
1036:
1037: add_empty_vbox (hbox);
1038: gtk_widget_show (hbox);
1039: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1.1 root 1040:
1041: frame = gtk_frame_new ("CPU flags");
1.1.1.2 root 1042: add_centered_to_vbox (vbox, frame);
1.1 root 1043: gtk_widget_show (frame);
1.1.1.2 root 1044: newbox = gtk_vbox_new (FALSE, 4);
1045: gtk_widget_show (newbox);
1.1.1.4 root 1046: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1.1.1.2 root 1047: gtk_container_add (GTK_CONTAINER (frame), newbox);
1.1 root 1048:
1049: a24m_widget = gtk_check_button_new_with_label ("24 bit address space");
1.1.1.2 root 1050: add_centered_to_vbox (newbox, a24m_widget);
1.1 root 1051: gtk_widget_show (a24m_widget);
1052: ccpu_widget = gtk_check_button_new_with_label ("Slow but compatible");
1.1.1.2 root 1053: add_centered_to_vbox (newbox, ccpu_widget);
1.1 root 1054: gtk_widget_show (ccpu_widget);
1.1.1.8 root 1055:
1.1.1.2 root 1056: add_empty_vbox (vbox);
1057:
1.1 root 1058: gtk_signal_connect (GTK_OBJECT (ccpu_widget), "clicked",
1059: (GtkSignalFunc) cputype_changed, NULL);
1060: gtk_signal_connect (GTK_OBJECT (a24m_widget), "clicked",
1061: (GtkSignalFunc) cputype_changed, NULL);
1062: }
1063:
1.1.1.2 root 1064: static void make_gfx_widgets (GtkWidget *vbox)
1.1 root 1065: {
1.1.1.10 root 1066: GtkWidget *thing, *frame, *newbox, *hbox;
1067: static const char *p96labels[] = {
1068: "None", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB", "32 MB", NULL
1069: };
1.1 root 1070:
1.1.1.2 root 1071: add_empty_vbox (vbox);
1.1 root 1072:
1.1.1.10 root 1073: hbox = gtk_hbox_new (FALSE, 10);
1074: gtk_widget_show (hbox);
1075: add_centered_to_vbox (vbox, hbox);
1076:
1077: frame = make_radio_group_box_1 ("P96 RAM", p96labels, p96size_widget, 0, p96size_changed, 4);
1078: gtk_widget_show (frame);
1079: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1080:
1081: frame = gtk_frame_new ("Miscellaneous");
1082: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
1083:
1084: gtk_widget_show (frame);
1085: newbox = gtk_vbox_new (FALSE, 4);
1086: gtk_widget_show (newbox);
1087: gtk_container_set_border_width (GTK_CONTAINER (newbox), 4);
1088: gtk_container_add (GTK_CONTAINER (frame), newbox);
1089:
1.1.1.6 root 1090: framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.gfx_framerate, 1.0, 21.0, 1.0, 1.0, 1.0));
1.1 root 1091: gtk_signal_connect (GTK_OBJECT (framerate_adj), "value_changed",
1.1.1.2 root 1092: GTK_SIGNAL_FUNC (custom_changed), NULL);
1.1 root 1093:
1094: thing = gtk_hscale_new (framerate_adj);
1095: gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
1096: gtk_scale_set_digits (GTK_SCALE (thing), 0);
1097: gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
1.1.1.10 root 1098: add_labelled_widget_centered ("Framerate:", thing, newbox);
1.1 root 1099:
1100: b32_widget = gtk_check_button_new_with_label ("32 bit blitter");
1.1.1.10 root 1101: add_centered_to_vbox (newbox, b32_widget);
1.1.1.7 root 1102: #if 0
1.1 root 1103: gtk_widget_show (b32_widget);
1.1.1.7 root 1104: #endif
1.1 root 1105: bimm_widget = gtk_check_button_new_with_label ("Immediate blits");
1.1.1.10 root 1106: add_centered_to_vbox (newbox, bimm_widget);
1.1 root 1107: gtk_widget_show (bimm_widget);
1108:
1.1.1.7 root 1109: afscr_widget = gtk_check_button_new_with_label ("Amiga modes fullscreen");
1.1.1.10 root 1110: add_centered_to_vbox (newbox, afscr_widget);
1.1.1.7 root 1111: #if 0
1112: gtk_widget_show (afscr_widget);
1113: #endif
1114: pfscr_widget = gtk_check_button_new_with_label ("Picasso modes fullscreen");
1.1.1.10 root 1115: add_centered_to_vbox (newbox, pfscr_widget);
1.1.1.7 root 1116: #if 0
1117: gtk_widget_show (pfscr_widget);
1118: #endif
1.1.1.2 root 1119: add_empty_vbox (vbox);
1120:
1.1 root 1121: gtk_signal_connect (GTK_OBJECT (bimm_widget), "clicked",
1.1.1.2 root 1122: (GtkSignalFunc) custom_changed, NULL);
1.1.1.10 root 1123: #if 0
1.1 root 1124: gtk_signal_connect (GTK_OBJECT (b32_widget), "clicked",
1.1.1.2 root 1125: (GtkSignalFunc) custom_changed, NULL);
1.1.1.7 root 1126: gtk_signal_connect (GTK_OBJECT (afscr_widget), "clicked",
1127: (GtkSignalFunc) custom_changed, NULL);
1128: gtk_signal_connect (GTK_OBJECT (pfscr_widget), "clicked",
1129: (GtkSignalFunc) custom_changed, NULL);
1.1.1.10 root 1130: #endif
1131: }
1132:
1133: static void make_chipset_widgets (GtkWidget *vbox)
1134: {
1135: GtkWidget *frame, *newbox, *hbox;
1136: static const char *colllabels[] = {
1137: "None (fastest)", "Sprites only", "Sprites & playfields", "Full (very slow)",
1138: NULL
1139: };
1140: static const char *cslevellabels[] = {
1141: "OCS", "ECS Agnus", "Full ECS", "AGA", NULL
1142: };
1143:
1144: add_empty_vbox (vbox);
1145:
1146: hbox = gtk_hbox_new (FALSE, 10);
1147: gtk_widget_show (hbox);
1148: add_centered_to_vbox (vbox, hbox);
1149:
1150: newbox = make_radio_group_box ("Sprite collisions", colllabels, coll_widget, 0, coll_changed);
1151: gtk_widget_show (newbox);
1152: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1153:
1154: newbox = make_radio_group_box ("Chipset", cslevellabels, cslevel_widget, 0, cslevel_changed);
1155: gtk_widget_show (newbox);
1156: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1157:
1158: fcop_widget = gtk_check_button_new_with_label ("Enable copper speedup code");
1159: add_centered_to_vbox (vbox, fcop_widget);
1160: gtk_widget_show (fcop_widget);
1161:
1162: gtk_signal_connect (GTK_OBJECT (fcop_widget), "clicked",
1163: (GtkSignalFunc) custom_changed, NULL);
1164:
1165: add_empty_vbox (vbox);
1.1.1.2 root 1166: }
1167:
1168: static void make_sound_widgets (GtkWidget *vbox)
1169: {
1170: GtkWidget *frame, *newbox;
1171: int i;
1172: GtkWidget *hbox;
1173: static const char *soundlabels1[] = {
1174: "None", "No output", "Normal", "Accurate",
1175: NULL
1176: }, *soundlabels2[] = {
1177: "8 bit", "16 bit",
1178: NULL
1179: }, *soundlabels3[] = {
1.1.1.9 root 1180: "Mono", "Stereo", "Mixed",
1.1.1.2 root 1181: NULL
1182: };
1183:
1184: add_empty_vbox (vbox);
1185:
1186: newbox = make_radio_group_box ("Mode", soundlabels1, sound_widget, 1, sound_changed);
1187: gtk_widget_show (newbox);
1188: add_centered_to_vbox (vbox, newbox);
1189:
1190: hbox = gtk_hbox_new (FALSE, 10);
1191: gtk_widget_show (hbox);
1192: add_centered_to_vbox (vbox, hbox);
1193: newbox = make_radio_group_box ("Channels", soundlabels3, sound_ch_widget, 1, sound_changed);
1194: gtk_widget_show (newbox);
1195: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1196: newbox = make_radio_group_box ("Resolution", soundlabels2, sound_bits_widget, 1, sound_changed);
1197: gtk_widget_show (newbox);
1198: gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0);
1.1.1.3 root 1199:
1.1.1.2 root 1200: add_empty_vbox (vbox);
1.1 root 1201: }
1202:
1.1.1.10 root 1203: static void make_mem_widgets (GtkWidget *vbox)
1204: {
1205: GtkWidget *hbox = gtk_hbox_new (FALSE, 10);
1206: GtkWidget *label, *frame;
1207:
1208: static const char *chiplabels[] = {
1209: "512 KB", "1 MB", "2 MB", "4 MB", "8 MB", NULL
1210: };
1211: static const char *bogolabels[] = {
1212: "None", "512 KB", "1 MB", "1.8 MB", NULL
1213: };
1214: static const char *fastlabels[] = {
1215: "None", "1 MB", "2 MB", "4 MB", "8 MB", NULL
1216: };
1217: static const char *z3labels[] = {
1218: "None", "1 MB", "2 MB", "4 MB", "8 MB",
1219: "16 MB", "32 MB", "64 MB", "128 MB", "256 MB",
1220: NULL
1221: };
1222:
1223: add_empty_vbox (vbox);
1.1.1.11 root 1224:
1225: {
1226: GtkWidget *buttonbox = make_file_container ("Kickstart ROM file:", vbox);
1227: GtkWidget *thing = gtk_button_new_with_label ("Change");
1228:
1229: /* Current file display */
1230: rom_text_widget = make_file_widget (buttonbox);
1231:
1232: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
1233: gtk_widget_show (thing);
1234: rom_change_widget = thing;
1235: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_romchange, 0);
1236: }
1237:
1238: {
1239: GtkWidget *buttonbox = make_file_container ("ROM key file for Cloanto Amiga Forever:", vbox);
1240: GtkWidget *thing = gtk_button_new_with_label ("Change");
1241:
1242: /* Current file display */
1243: key_text_widget = make_file_widget (buttonbox);
1244:
1245: gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
1246: gtk_widget_show (thing);
1247: key_change_widget = thing;
1248: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_keychange, 0);
1249: }
1250:
1.1.1.10 root 1251: gtk_widget_show (hbox);
1252: add_centered_to_vbox (vbox, hbox);
1253:
1254: add_empty_vbox (vbox);
1255:
1256: label = gtk_label_new ("These settings take effect after the next reset.");
1257: gtk_widget_show (label);
1258: add_centered_to_vbox (vbox, label);
1259:
1260: frame = make_radio_group_box ("Chip Mem", chiplabels, chipsize_widget, 0, chipsize_changed);
1261: gtk_widget_show (frame);
1262: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1263:
1264: frame = make_radio_group_box ("Slow Mem", bogolabels, bogosize_widget, 0, bogosize_changed);
1265: gtk_widget_show (frame);
1266: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1267:
1268: frame = make_radio_group_box ("Fast Mem", fastlabels, fastsize_widget, 0, fastsize_changed);
1269: gtk_widget_show (frame);
1270: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1271:
1272: frame = make_radio_group_box_1 ("Z3 Mem", z3labels, z3size_widget, 0, z3size_changed, 5);
1273: gtk_widget_show (frame);
1274: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1275: }
1276:
1.1.1.2 root 1277: static void make_joy_widgets (GtkWidget *dvbox)
1.1 root 1278: {
1279: int i;
1.1.1.2 root 1280: GtkWidget *hbox = gtk_hbox_new (FALSE, 10);
1281: static const char *joylabels[] = {
1282: "Joystick 0", "Joystick 1", "Mouse", "Numeric pad",
1283: "Cursor keys/Right Ctrl", "T/F/H/B/Left Alt",
1284: NULL
1285: };
1286:
1287: add_empty_vbox (dvbox);
1288: gtk_widget_show (hbox);
1289: add_centered_to_vbox (dvbox, hbox);
1.1 root 1290:
1291: for (i = 0; i < 2; i++) {
1292: GtkWidget *vbox, *frame;
1293: GtkWidget *thing;
1294: char buffer[20];
1295: int j;
1296:
1297: sprintf (buffer, "Port %d", i);
1.1.1.2 root 1298: frame = make_radio_group_box (buffer, joylabels, joy_widget[i], 0, joy_changed);
1.1 root 1299: gtk_widget_show (frame);
1.1.1.2 root 1300: gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
1.1 root 1301: }
1.1.1.2 root 1302:
1303: add_empty_vbox (dvbox);
1304: }
1305:
1.1.1.12 root 1306: static int hd_change_mode;
1307:
1.1.1.11 root 1308: static void newdir_ok (void)
1309: {
1310: int n;
1311: strcpy (dirdlg_volname, gtk_entry_get_text (GTK_ENTRY (volname_entry)));
1312: strcpy (dirdlg_path, gtk_entry_get_text (GTK_ENTRY (path_entry)));
1313:
1314: n = strlen (dirdlg_volname);
1315: /* Strip colons from the end. */
1316: if (n > 0) {
1317: if (dirdlg_volname[n - 1] == ':')
1318: dirdlg_volname[n - 1] = '\0';
1319: }
1320: if (strlen (dirdlg_volname) == 0 || strlen (dirdlg_path) == 0) {
1321: /* Uh, no messageboxes in gtk? */
1.1.1.12 root 1322: } else if (hd_change_mode) {
1323: set_filesys_unit (currprefs.mountinfo, selected_hd_row, dirdlg_volname, dirdlg_path,
1324: 0, 0, 0, 0, 0);
1325: set_hd_state ();
1.1.1.11 root 1326: } else {
1327: add_filesys_unit (currprefs.mountinfo, dirdlg_volname, dirdlg_path,
1328: 0, 0, 0, 0, 0);
1329: set_hd_state ();
1330: }
1331: gtk_widget_destroy (dirdlg);
1332: }
1333:
1334: static GtkWidget *create_dirdlg (const char *title)
1335: {
1336: GtkWidget *vbox, *hbox, *thing, *label1, *button;
1337:
1338: dirdlg = gtk_dialog_new ();
1339:
1340: gtk_window_set_title (GTK_WINDOW (dirdlg), title);
1341: gtk_window_set_position (GTK_WINDOW (dirdlg), GTK_WIN_POS_MOUSE);
1342: gtk_window_set_modal (GTK_WINDOW (dirdlg), TRUE);
1343: gtk_widget_show (dirdlg);
1344:
1345: vbox = GTK_DIALOG (dirdlg)->vbox;
1346: hbox = gtk_hbox_new (FALSE, 10);
1347: gtk_widget_show (hbox);
1348: gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 10);
1349: label1 = gtk_label_new ("Path:");
1350: gtk_box_pack_start (GTK_BOX (hbox), label1, FALSE, TRUE, 10);
1351: gtk_widget_show (label1);
1352: thing = gtk_entry_new_with_max_length (255);
1353: gtk_box_pack_start (GTK_BOX (hbox), thing, TRUE, TRUE, 10);
1354: gtk_widget_show (thing);
1355: path_entry = thing;
1356:
1357: hbox = gtk_hbox_new (FALSE, 10);
1358: gtk_widget_show (hbox);
1359: gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 10);
1360: thing = gtk_label_new ("Volume name:");
1361: gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, TRUE, 10);
1362: gtk_widget_show (thing);
1363: thing = gtk_entry_new_with_max_length (255);
1364: gtk_box_pack_start (GTK_BOX (hbox), thing, TRUE, TRUE, 10);
1365: gtk_widget_show (thing);
1366: gtk_widget_set_usize (thing, 200, -1);
1367: volname_entry = thing;
1368:
1369: hbox = GTK_DIALOG (dirdlg)->action_area;
1370: button = gtk_button_new_with_label ("OK");
1371: gtk_signal_connect (GTK_OBJECT (button), "clicked",
1372: GTK_SIGNAL_FUNC(newdir_ok), NULL);
1373: GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
1374: gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
1375: gtk_widget_grab_default (button);
1.1.1.12 root 1376: gtk_widget_show (button);
1.1.1.11 root 1377:
1378: button = gtk_button_new_with_label ("Cancel");
1379: gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
1380: GTK_SIGNAL_FUNC (gtk_widget_destroy),
1381: GTK_OBJECT (dirdlg));
1382: gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
1383: gtk_widget_show (button);
1.1.1.14 root 1384: return 0;
1.1.1.11 root 1385: }
1386:
1387: static void did_newdir (void)
1388: {
1.1.1.12 root 1389: hd_change_mode = 0;
1.1.1.11 root 1390: create_dirdlg ("Add a new mounted directory");
1391: }
1392: static void did_newhdf (void)
1393: {
1.1.1.12 root 1394: hd_change_mode = 0;
1.1.1.11 root 1395: }
1396:
1397: static void did_hdchange (void)
1398: {
1399: int secspertrack, surfaces, reserved, blocksize, size;
1400: int cylinders, readonly;
1401: char *volname, *rootdir;
1402: char *failure;
1403:
1404: failure = get_filesys_unit (currprefs.mountinfo, selected_hd_row,
1405: &volname, &rootdir, &readonly,
1406: &secspertrack, &surfaces, &reserved,
1407: &cylinders, &size, &blocksize);
1408:
1.1.1.12 root 1409: hd_change_mode = 1;
1.1.1.11 root 1410: if (is_hardfile (currprefs.mountinfo, selected_hd_row)) {
1411: } else {
1412: create_dirdlg ("Change a mounted directory");
1413: gtk_entry_set_text (GTK_ENTRY (volname_entry), volname);
1414: gtk_entry_set_text (GTK_ENTRY (path_entry), rootdir);
1415: }
1416: }
1417: static void did_hddel (void)
1418: {
1419: kill_filesys_unit (currprefs.mountinfo, selected_hd_row);
1420: set_hd_state ();
1421: }
1422:
1423: static void hdselect (GtkWidget *widget, gint row, gint column, GdkEventButton *bevent,
1424: gpointer user_data)
1425: {
1426: selected_hd_row = row;
1427: gtk_widget_set_sensitive (hdchange_button, TRUE);
1428: gtk_widget_set_sensitive (hddel_button, TRUE);
1429: }
1430:
1431: static void hdunselect (GtkWidget *widget, gint row, gint column, GdkEventButton *bevent,
1432: gpointer user_data)
1433: {
1434: gtk_widget_set_sensitive (hdchange_button, FALSE);
1435: gtk_widget_set_sensitive (hddel_button, FALSE);
1436: }
1437:
1438:
1.1.1.6 root 1439: static GtkWidget *make_buttons (const char *label, GtkWidget *box, void (*sigfunc) (void), GtkWidget *(*create)(const char *label))
1.1.1.2 root 1440: {
1.1.1.6 root 1441: GtkWidget *thing = create (label);
1.1.1.2 root 1442: gtk_widget_show (thing);
1443: gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) sigfunc, NULL);
1444: gtk_box_pack_start (GTK_BOX (box), thing, TRUE, TRUE, 0);
1.1.1.6 root 1445:
1446: return thing;
1.1 root 1447: }
1.1.1.6 root 1448: #define make_button(label, box, sigfunc) make_buttons(label, box, sigfunc, gtk_button_new_with_label)
1.1 root 1449:
1.1.1.11 root 1450: static void make_hd_widgets (GtkWidget *dvbox)
1451: {
1452: GtkWidget *thing, *buttonbox, *hbox;
1453: char *titles [] = {
1454: "Volume", "File/Directory", "R/O", "Heads", "Cyl.", "Sec.", "Rsrvd", "Size", "Blksize"
1455: };
1456:
1457: thing = gtk_clist_new_with_titles (9, titles);
1458: gtk_clist_set_selection_mode (GTK_CLIST (thing), GTK_SELECTION_SINGLE);
1459: gtk_signal_connect (GTK_OBJECT (thing), "select_row", (GtkSignalFunc) hdselect, NULL);
1460: gtk_signal_connect (GTK_OBJECT (thing), "unselect_row", (GtkSignalFunc) hdunselect, NULL);
1.1.1.14 root 1461: gtk_clist_set_column_auto_resize (GTK_CLIST (thing), 0, TRUE);
1462: gtk_clist_set_column_auto_resize (GTK_CLIST (thing), 1, TRUE);
1.1.1.11 root 1463: gtk_widget_set_usize (thing, -1, 200);
1.1.1.14 root 1464: hdlist_widget = thing;
1.1.1.11 root 1465:
1466: gtk_widget_show (thing);
1467: add_centered_to_vbox (dvbox, thing);
1468:
1469: hbox = gtk_hbox_new (FALSE, 10);
1470: gtk_widget_show (hbox);
1471: gtk_box_pack_start (GTK_BOX (dvbox), hbox, FALSE, TRUE, 0);
1472:
1473: /* The buttons */
1474: buttonbox = gtk_hbox_new (TRUE, 4);
1475: gtk_widget_show (buttonbox);
1476: gtk_box_pack_start (GTK_BOX (hbox), buttonbox, TRUE, TRUE, 0);
1477: make_button ("New filesystem...", buttonbox, did_newdir);
1478: #if 0 /* later... */
1479: make_button ("New hardfile...", buttonbox, did_newhdf);
1480: #endif
1481: hdchange_button = make_button ("Change...", buttonbox, did_hdchange);
1482: hddel_button = make_button ("Delete", buttonbox, did_hddel);
1483:
1484: thing = gtk_label_new ("These settings take effect after the next reset.");
1485: gtk_widget_show (thing);
1486: add_centered_to_vbox (dvbox, thing);
1487: }
1488:
1489: static void make_about_widgets (GtkWidget *dvbox)
1490: {
1.1.1.14 root 1491: GtkWidget *lab_version;
1.1.1.11 root 1492: GtkStyle *style;
1493: GdkFont *font;
1494: char t[20];
1495:
1496: add_empty_vbox (dvbox);
1497:
1498: sprintf (t, "UAE %d.%d.%d", UAEMAJOR, UAEMINOR, UAESUBREV);
1.1.1.14 root 1499: lab_version = gtk_label_new (t);
1500: lab_info = gtk_label_new ("Choose your settings, then deselect the Pause button to start!");
1.1.1.11 root 1501:
1502: font = gdk_font_load ("-*-helvetica-medium-r-normal--*-240-*-*-*-*-*-*");
1503: if (font) {
1.1.1.14 root 1504: style = gtk_style_new ();
1.1.1.11 root 1505: gdk_font_unref (style->font);
1506: style->font = font;
1507: gdk_font_ref (style->font);
1.1.1.14 root 1508: gtk_widget_set_style (lab_version, style);
1509: /*gtk_widget_set_style (lab_info, style); */
1.1.1.11 root 1510: }
1.1.1.14 root 1511:
1512: add_centered_to_vbox (dvbox, lab_version);
1513: add_centered_to_vbox (dvbox, lab_info);
1514: gtk_widget_show (lab_version);
1515: if (currprefs.start_gui == 1)
1516: gtk_widget_show (lab_info);
1.1.1.11 root 1517:
1518: add_empty_vbox (dvbox);
1519: }
1520:
1521: static void create_guidlg (void)
1.1 root 1522: {
1.1.1.15 root 1523: GtkWidget *window;
1.1.1.2 root 1524: GtkWidget *buttonbox, *vbox, *hbox;
1.1 root 1525: GtkWidget *thing;
1.1.1.14 root 1526: unsigned int i;
1.1 root 1527: int argc = 1;
1528: char *a[] = {"UAE"};
1529: char **argv = a;
1.1.1.2 root 1530: static const struct _pages {
1531: const char *title;
1532: void (*createfunc)(GtkWidget *);
1533: } pages[] = {
1.1.1.10 root 1534: /* ??? If this isn't the first page, there are errors in draw_led. */
1.1.1.2 root 1535: { "Floppy disks", make_floppy_disks },
1.1.1.10 root 1536: { "Memory", make_mem_widgets },
1.1.1.2 root 1537: { "CPU emulation", make_cpu_widgets },
1538: { "Graphics", make_gfx_widgets },
1.1.1.10 root 1539: { "Chipset", make_chipset_widgets },
1.1.1.2 root 1540: { "Sound", make_sound_widgets },
1.1.1.11 root 1541: { "Game ports", make_joy_widgets },
1542: { "Harddisks", make_hd_widgets },
1543: { "About", make_about_widgets }
1.1.1.2 root 1544: };
1.1 root 1545:
1546: gtk_init (&argc, &argv);
1547: gtk_rc_parse ("uaegtkrc");
1548:
1.1.1.11 root 1549: gui_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1550: gtk_window_set_title (GTK_WINDOW (gui_window), "UAE control");
1.1 root 1551:
1552: vbox = gtk_vbox_new (FALSE, 4);
1.1.1.11 root 1553: gtk_container_add (GTK_CONTAINER (gui_window), vbox);
1554: gtk_container_set_border_width (GTK_CONTAINER (gui_window), 10);
1.1 root 1555:
1.1.1.2 root 1556: /* First line - buttons and power LED */
1557: hbox = gtk_hbox_new (FALSE, 10);
1558: gtk_widget_show (hbox);
1559: gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
1.1 root 1560:
1.1.1.2 root 1561: /* The buttons */
1562: buttonbox = gtk_hbox_new (TRUE, 4);
1.1 root 1563: gtk_widget_show (buttonbox);
1.1.1.2 root 1564: gtk_box_pack_start (GTK_BOX (hbox), buttonbox, TRUE, TRUE, 0);
1565: make_button ("Reset", buttonbox, did_reset);
1566: make_button ("Debug", buttonbox, did_debug);
1567: make_button ("Quit", buttonbox, did_quit);
1568: make_button ("Save config", buttonbox, save_config);
1.1.1.6 root 1569: pause_uae_widget = make_buttons ("Pause", buttonbox, pause_uae, gtk_toggle_button_new_with_label);
1.1 root 1570:
1.1.1.2 root 1571: /* The LED */
1572: thing = make_led (0);
1573: thing = make_labelled_widget ("Power:", thing);
1.1 root 1574: gtk_widget_show (thing);
1.1.1.2 root 1575: gtk_box_pack_start (GTK_BOX (hbox), thing, FALSE, TRUE, 0);
1.1 root 1576:
1.1.1.10 root 1577: /* More buttons */
1578: buttonbox = gtk_hbox_new (TRUE, 4);
1579: gtk_widget_show (buttonbox);
1580: gtk_box_pack_start (GTK_BOX (vbox), buttonbox, TRUE, TRUE, 0);
1581: snap_save_widget = make_button ("Save state", buttonbox, did_savestate);
1582: snap_load_widget = make_button ("Load state", buttonbox, did_loadstate);
1583:
1.1.1.2 root 1584: /* Place a separator below those buttons. */
1.1 root 1585: thing = gtk_hseparator_new ();
1586: gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
1587: gtk_widget_show (thing);
1588:
1.1.1.2 root 1589: /* Now the notebook */
1.1 root 1590: notebook = gtk_notebook_new ();
1.1.1.2 root 1591: gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
1.1 root 1592: gtk_widget_show (notebook);
1593:
1.1.1.2 root 1594: for (i = 0; i < sizeof pages / sizeof (struct _pages); i++) {
1595: thing = gtk_vbox_new (FALSE, 4);
1596: gtk_widget_show (thing);
1.1.1.4 root 1597: gtk_container_set_border_width (GTK_CONTAINER (thing), 10);
1.1.1.2 root 1598: pages[i].createfunc (thing);
1599: gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new (pages[i].title));
1600: }
1.1 root 1601:
1.1.1.11 root 1602: /* Put "about" screen first. */
1603: gtk_notebook_set_page (GTK_NOTEBOOK (notebook), i - 1);
1.1 root 1604: enable_disk_buttons (1);
1.1.1.11 root 1605: enable_snap_buttons (1);
1.1 root 1606:
1607: gtk_widget_show (vbox);
1608:
1609: filesel_active = -1;
1.1.1.10 root 1610: snapsel_active = -1;
1611:
1.1 root 1612: gtk_timeout_add (1000, (GtkFunction)my_idle, 0);
1.1.1.11 root 1613: }
1614:
1615: static void *gtk_gui_thread (void *dummy)
1616: {
1.1 root 1617: gtk_main ();
1.1.1.11 root 1618:
1.1 root 1619: quitted_gui = 1;
1620: uae_sem_post (&gui_quit_sem);
1621: return 0;
1622: }
1623:
1624: void gui_changesettings(void)
1625: {
1626: }
1627:
1.1.1.4 root 1628: void gui_fps (int x)
1629: {
1630: }
1631:
1632: void gui_led (int num, int on)
1.1 root 1633: {
1634: if (no_gui)
1635: return;
1636:
1637: /* if (num == 0)
1638: return;
1639: printf("LED %d %d\n", num, on);
1640: write_comm_pipe_int (&to_gui_pipe, 1, 0);
1641: write_comm_pipe_int (&to_gui_pipe, num == 0 ? 4 : num - 1, 0);
1642: write_comm_pipe_int (&to_gui_pipe, on, 1);
1643: printf("#LED %d %d\n", num, on);*/
1644: }
1645:
1.1.1.11 root 1646: void gui_filename (int num, const char *name)
1.1 root 1647: {
1648: if (no_gui)
1649: return;
1650:
1651: write_comm_pipe_int (&to_gui_pipe, 0, 0);
1652: write_comm_pipe_int (&to_gui_pipe, num, 1);
1653:
1654: /* gui_update ();*/
1655: }
1656:
1.1.1.10 root 1657: void gui_handle_events (void)
1.1 root 1658: {
1.1.1.6 root 1659: int pause_uae = FALSE;
1660:
1.1 root 1661: if (no_gui)
1662: return;
1663:
1.1.1.6 root 1664: do {
1665: while (pause_uae || comm_pipe_has_data (&from_gui_pipe)) {
1666: int cmd = read_comm_pipe_int_blocking (&from_gui_pipe);
1667: int n;
1668: switch (cmd) {
1.1.1.11 root 1669: case 0:
1670: n = read_comm_pipe_int_blocking (&from_gui_pipe);
1671: changed_prefs.df[n][0] = '\0';
1672: break;
1673: case 1:
1674: n = read_comm_pipe_int_blocking (&from_gui_pipe);
1675: uae_sem_wait (&gui_sem);
1676: strncpy (changed_prefs.df[n], new_disk_string[n], 255);
1677: free (new_disk_string[n]);
1.1.1.13 root 1678: new_disk_string[n] = 0;
1.1.1.11 root 1679: changed_prefs.df[n][255] = '\0';
1680: uae_sem_post (&gui_sem);
1681: break;
1682: case 2:
1683: uae_reset ();
1684: end_pause_uae ();
1685: break;
1686: case 3:
1687: activate_debugger ();
1688: end_pause_uae ();
1689: break;
1690: case 4:
1691: uae_quit ();
1692: end_pause_uae ();
1693: break;
1694: case 5:
1695: pause_uae = TRUE;
1696: break;
1697: case 6:
1698: pause_uae = FALSE;
1699: break;
1.1.1.10 root 1700: case 7:
1701: printf ("STATESAVE\n");
1.1.1.11 root 1702: savestate_state = read_comm_pipe_int_blocking (&from_gui_pipe);
1703: uae_sem_wait (&gui_sem);
1704: savestate_filename = gui_snapname;
1705: uae_sem_post (&gui_sem);
1706: break;
1707: case 8:
1708: uae_sem_wait (&gui_sem);
1709: strncpy (changed_prefs.romfile, gui_romname, 255);
1710: changed_prefs.romfile[255] = '\0';
1711: free (gui_romname);
1712: uae_sem_post (&gui_sem);
1713: break;
1714: case 9:
1715: uae_sem_wait (&gui_sem);
1716: strncpy (changed_prefs.keyfile, gui_keyname, 255);
1717: changed_prefs.keyfile[255] = '\0';
1718: free (gui_keyname);
1719: uae_sem_post (&gui_sem);
1.1.1.10 root 1720: break;
1.1.1.6 root 1721: }
1722: }
1723: } while (pause_uae);
1.1 root 1724: }
1.1.1.7 root 1725:
1726: void gui_update_gfx (void)
1727: {
1728: #if 0 /* This doesn't work... */
1729: set_gfx_state ();
1730: #endif
1731: }
1.1.1.11 root 1732:
1733: int gui_init (void)
1734: {
1735: uae_thread_id tid;
1736:
1737: gui_active = 0;
1738:
1739: init_comm_pipe (&to_gui_pipe, 20, 1);
1740: init_comm_pipe (&from_gui_pipe, 20, 1);
1741: uae_sem_init (&gui_sem, 0, 1);
1742: uae_sem_init (&gui_init_sem, 0, 0);
1743: uae_sem_init (&gui_quit_sem, 0, 0);
1744:
1745: create_guidlg ();
1746: uae_start_thread (gtk_gui_thread, NULL, &tid);
1747: gui_update ();
1748:
1749: if (currprefs.start_gui == 1) {
1.1.1.14 root 1750: write_comm_pipe_int (&to_gui_pipe, 2, 1);
1.1.1.11 root 1751: write_comm_pipe_int (&from_gui_pipe, 5, 1);
1752: /* Handle events until Pause is unchecked. */
1753: gui_handle_events ();
1754: /* Quit requested? */
1755: if (quit_program == -1) {
1756: gui_exit ();
1757: return -2;
1758: }
1759: }
1760:
1761: return 1;
1762: }
1763:
1764: int gui_update (void)
1765: {
1766: if (no_gui)
1767: return 0;
1768:
1769: write_comm_pipe_int (&to_gui_pipe, 1, 1);
1770: uae_sem_wait (&gui_init_sem);
1771: return 0;
1772: }
1773:
1774: void gui_exit (void)
1775: {
1776: if (no_gui)
1777: return;
1778:
1779: quit_gui = 1;
1780: uae_sem_wait (&gui_quit_sem);
1781: }
1.1.1.13 root 1782:
1783: void gui_lock (void)
1784: {
1.1.1.14 root 1785: if (no_gui)
1786: return;
1.1.1.13 root 1787: uae_sem_wait (&gui_sem);
1788: }
1789:
1790: void gui_unlock (void)
1791: {
1.1.1.14 root 1792: if (no_gui)
1793: return;
1.1.1.13 root 1794: uae_sem_post (&gui_sem);
1795: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.