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