Annotation of uae/src/gtkui.c, revision 1.1.1.15

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.