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