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

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

unix.superglobalmegacorp.com

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