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

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
                      7:  * 
                      8:  * The Tk GUI doesn't work.
                      9:  * The X Forms Library isn't available as source, and there aren't any
                     10:  * binaries compiled against glibc
                     11:  *
                     12:  * So let's try this...
                     13:  */
                     14: 
                     15: #include "sysconfig.h"
                     16: #include "sysdeps.h"
                     17: 
                     18: #include "config.h"
                     19: #include "options.h"
                     20: #include "uae.h"
                     21: #include "memory.h"
                     22: #include "custom.h"
                     23: #include "readcpu.h"
                     24: #include "gui.h"
                     25: #include "newcpu.h"
                     26: #include "threaddep/penguin.h"
                     27: 
                     28: #include <gtk/gtk.h>
                     29: 
                     30: static int gui_active;
                     31: 
                     32: static GtkWidget *disk_insert_widget[4], *disk_eject_widget[4], *disk_text_widget[4];
                     33: static char *disk_string[4];
                     34: static char *new_disk_string[4];
                     35: 
                     36: static GtkAdjustment *cpuspeed_adj;
                     37: static GtkWidget *cpu_widget[4], *a24m_widget, *ccpu_widget;
                     38: 
                     39: static GtkAdjustment *framerate_adj;
                     40: static GtkWidget *bimm_widget, *b32_widget;
                     41: 
                     42: static GtkWidget *joy_widget[2][6];
                     43: 
                     44: static GtkWidget *led_widgets[5];
                     45: static GdkColor led_on[5], led_off[5];
                     46: static unsigned int prevledstate;
                     47: 
                     48: static void save_config (void)
                     49: {
                     50:     FILE *f;
                     51:     char tmp[257];
                     52: 
                     53:     /* Backup the options file.  */
                     54:     strcpy (tmp, optionsfile);
                     55:     strcat (tmp, "~");
                     56:     rename (optionsfile, tmp);
                     57: 
                     58:     f = fopen (optionsfile, "w");
                     59:     if (f == NULL) {
                     60:        fprintf(stderr, "Error saving options file!\n");
                     61:        return;
                     62:     }
                     63:     save_options (f);
                     64:     fclose (f);
                     65: }
                     66: 
                     67: static int nr_for_led (GtkWidget *led)
                     68: {
                     69:     int i;
                     70:     i = 0;
                     71:     while (led_widgets[i] != led)
                     72:        i++;
                     73:     return i;
                     74: }
                     75: 
                     76: static smp_comm_pipe to_gui_pipe, from_gui_pipe;
                     77: static uae_sem_t gui_sem, gui_quit_sem;
                     78: 
                     79: static volatile int quit_gui = 0, quitted_gui = 0;
                     80: 
                     81: static void enable_disk_buttons (int enable)
                     82: {
                     83:     int i;
                     84:     for (i = 0; i < 4; i++) {
                     85:        gtk_widget_set_sensitive (disk_insert_widget[i], enable);
                     86:        gtk_widget_set_sensitive (disk_eject_widget[i], enable);
                     87:     }
                     88: }
                     89: 
                     90: static void set_cpu_state (void)
                     91: {
                     92:     gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0);
                     93:     gtk_widget_set_sensitive (a24m_widget, changed_prefs.cpu_level > 1);
                     94:     gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0);
                     95:     gtk_widget_set_sensitive (ccpu_widget, changed_prefs.cpu_level == 0);
                     96: }
                     97: 
                     98: static void set_cpu_widget (void)
                     99: {
                    100:     int nr = changed_prefs.cpu_level;
                    101:     gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE);
                    102: }
                    103: 
                    104: static void set_gfx_state (void)
                    105: {
                    106:     gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0);
                    107:     gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0);
                    108: }
                    109: 
                    110: static void set_joy_state (void)
                    111: {
                    112:     int j0t = changed_prefs.fake_joystick & 255;
                    113:     int j1t = (changed_prefs.fake_joystick >> 8) & 255;
                    114:     int i;
                    115: 
                    116:     if (j0t == j1t) {
                    117:        /* Can't happen */
                    118:        j0t++;
                    119:        j0t %= 6;
                    120:     }
                    121:     for (i = 0; i < 6; i++) {
                    122:        gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i);
                    123:        gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i);
                    124:        gtk_widget_set_sensitive (joy_widget[0][i], j1t != i);
                    125:        gtk_widget_set_sensitive (joy_widget[1][i], j0t != i);
                    126:     }
                    127: }
                    128: 
                    129: static void draw_led (int nr)
                    130: {
                    131:     GtkWidget *thing = led_widgets[nr];
                    132:     GdkWindow *window = thing->window;
                    133:     GdkGC *gc = gdk_gc_new (window);
                    134:     GdkColor *col;
                    135: 
                    136:     if (gui_ledstate & (1 << nr))
                    137:        col = led_on + nr;
                    138:     else
                    139:        col = led_off + nr;
                    140:     gdk_gc_set_foreground (gc, col);
                    141:     gdk_draw_rectangle (window, gc, 1, 0, 0, -1, -1);
                    142:     gdk_gc_destroy (gc);
                    143: }
                    144: 
                    145: static int my_idle (void)
                    146: {
                    147:     unsigned int leds = gui_ledstate;
                    148:     int i;
                    149: 
                    150:     if (quit_gui) {
                    151:        /*printf("Foo...\n");*/
                    152:        gtk_main_quit ();
                    153:        goto out;
                    154:     }
                    155:     while (comm_pipe_has_data (&to_gui_pipe)) {
                    156:        int cmd = read_comm_pipe_int_blocking (&to_gui_pipe);
                    157:        int n;
                    158:        /*printf ("cmd %d\n", cmd);*/
                    159:        switch (cmd) {
                    160:         case 0:
                    161:            n = read_comm_pipe_int_blocking (&to_gui_pipe);
                    162:            gtk_label_set (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]);
                    163:            break;
                    164:         case 1:
                    165:            /* Initialization.  */
                    166:            set_cpu_widget ();
                    167:            set_cpu_state ();
                    168:            set_gfx_state ();
                    169:            set_joy_state ();
                    170:            gui_active = 1;
                    171:            break;
                    172:        }
                    173:     }
                    174:     
                    175:     for (i = 0; i < 5; i++) {
                    176:        unsigned int mask = 1 << i;
                    177:        int on = leds & mask;
                    178: 
                    179:        if (on == (prevledstate & mask))
                    180:            continue;
                    181: 
                    182: /*     printf(": %d %d\n", i, on);*/
                    183:        draw_led (i);
                    184:     }
                    185:     prevledstate = leds;
                    186: out:
                    187:     return 1;
                    188: }
                    189: 
                    190: static void joy_changed (void)
                    191: {
                    192:     int j0t = 0, j1t = 0;
                    193:     int i;
                    194:     if (! gui_active)
                    195:        return;
                    196: 
                    197:     for (i = 0; i < 6; i++)
                    198:        if (GTK_TOGGLE_BUTTON (joy_widget[0][i])->active) {
                    199:            j0t = i;
                    200:            break;
                    201:        }
                    202:     for (i = 0; i < 6; i++)
                    203:        if (GTK_TOGGLE_BUTTON (joy_widget[1][i])->active) {
                    204:            j1t = i;
                    205:            break;
                    206:        }
                    207:     changed_prefs.fake_joystick = j0t | (j1t << 8);
                    208:     set_joy_state ();
                    209: }
                    210: 
                    211: static void gfx_changed (void)
                    212: {
                    213:     changed_prefs.framerate = framerate_adj->value;
                    214:     changed_prefs.blits_32bit_enabled = GTK_TOGGLE_BUTTON (b32_widget)->active;
                    215:     changed_prefs.immediate_blits = GTK_TOGGLE_BUTTON (bimm_widget)->active;
                    216: }
                    217: 
                    218: static void cpuspeed_changed (void)
                    219: {
                    220:     changed_prefs.m68k_speed = cpuspeed_adj->value;
                    221: }
                    222: 
                    223: static void cputype_changed (void)
                    224: {
                    225:     int i, oldcl;
                    226:     if (! gui_active)
                    227:        return;
                    228: 
                    229:     oldcl = changed_prefs.cpu_level;
                    230: 
                    231:     changed_prefs.cpu_level = 0;
                    232:     for (i = 0; i < 4; i++)
                    233:        if (GTK_TOGGLE_BUTTON (cpu_widget[i])->active) {
                    234:            changed_prefs.cpu_level = i;
                    235:            break;
                    236:        }
                    237: 
                    238:     changed_prefs.cpu_compatible = GTK_TOGGLE_BUTTON (ccpu_widget)->active;
                    239:     changed_prefs.address_space_24 = GTK_TOGGLE_BUTTON (a24m_widget)->active;
                    240: 
                    241:     if (changed_prefs.cpu_level != 0)
                    242:        changed_prefs.cpu_compatible = 0;
                    243:     /* 68000/68010 always have a 24 bit address space.  */
                    244:     if (changed_prefs.cpu_level < 2)
                    245:        changed_prefs.address_space_24 = 1;
                    246:     /* Changing from 68000/68010 to 68020 should set a sane default.  */
                    247:     else if (oldcl < 2)
                    248:        changed_prefs.address_space_24 = 0;
                    249:     
                    250:     set_cpu_state ();
                    251: }
                    252: 
                    253: static void did_reset (void)
                    254: {
                    255:     if (quit_gui)
                    256:        return;
                    257:     
                    258:     write_comm_pipe_int (&from_gui_pipe, 2, 1);
                    259: }
                    260: 
                    261: static void did_debug (void)
                    262: {
                    263:     if (quit_gui)
                    264:        return;
                    265:     
                    266:     write_comm_pipe_int (&from_gui_pipe, 3, 1);
                    267: }
                    268: 
                    269: static void did_quit (void)
                    270: {
                    271:     if (quit_gui)
                    272:        return;
                    273:     
                    274:     write_comm_pipe_int (&from_gui_pipe, 4, 1);
                    275: }
                    276: 
                    277: static void did_eject (int n)
                    278: { 
                    279:     if (quit_gui)
                    280:        return;
                    281:     
                    282:     write_comm_pipe_int (&from_gui_pipe, 0, 0);
                    283:     write_comm_pipe_int (&from_gui_pipe, n, 1);
                    284: }
                    285: 
                    286: static int filesel_active = -1;
                    287: static GtkWidget *selector;
                    288: 
                    289: static void did_close_insert (GtkObject *o, GtkWidget *w)
                    290: {
                    291:     filesel_active = -1;
                    292:     enable_disk_buttons (1);
                    293:     gtk_widget_hide (selector);
                    294: }
                    295: 
                    296: static void did_cancel_insert (GtkObject *o)
                    297: {
                    298:     filesel_active = -1;
                    299:     enable_disk_buttons (1);
                    300:     gtk_widget_hide (selector);
                    301: }
                    302: 
                    303: static void did_insert_select (GtkObject *o)
                    304: {
                    305:     char *s = gtk_file_selection_get_filename (GTK_FILE_SELECTION (selector));
                    306:     printf ("%s\n", s);
                    307:     if (quit_gui)
                    308:        return;
                    309: 
                    310:     uae_sem_wait (&gui_sem);
                    311:     if (new_disk_string[filesel_active] != 0)
                    312:        free (new_disk_string[filesel_active]);
                    313:     new_disk_string[filesel_active] = strdup (s);
                    314:     uae_sem_post (&gui_sem);
                    315:     write_comm_pipe_int (&from_gui_pipe, 1, 0);
                    316:     write_comm_pipe_int (&from_gui_pipe, filesel_active, 1);
                    317:     filesel_active = -1;
                    318:     enable_disk_buttons (1);
                    319:     gtk_widget_hide (selector);
                    320: }
                    321: 
                    322: static char fsbuffer[100];
                    323: 
                    324: static void did_insert (int n)
                    325: {
                    326:     if (filesel_active != -1)
                    327:        return;
                    328:     filesel_active = n;
                    329:     enable_disk_buttons (0);
                    330: 
                    331:     sprintf (fsbuffer, "Select a disk image file for DF%d", n);
                    332:     gtk_window_set_title (GTK_WINDOW (selector), fsbuffer);
                    333: 
                    334:     /*printf("%p\n", selector);*/
                    335:     gtk_widget_show (selector);
                    336: }
                    337: 
                    338: static void did_eject_0 (void) { did_eject (0); }
                    339: static void did_eject_1 (void) { did_eject (1); }
                    340: static void did_eject_2 (void) { did_eject (2); }
                    341: static void did_eject_3 (void) { did_eject (3); }
                    342: 
                    343: static void did_insert_0 (void) { did_insert (0); }
                    344: static void did_insert_1 (void) { did_insert (1); }
                    345: static void did_insert_2 (void) { did_insert (2); }
                    346: static void did_insert_3 (void) { did_insert (3); }
                    347: 
                    348: static gint driveled_event (GtkWidget *thing, GdkEvent *event)
                    349: {
                    350:     gint x, y;
                    351:     GtkStyle *style;
                    352:     int lednr = nr_for_led (thing);
                    353: 
                    354:     switch (event->type) {
                    355:      case GDK_MAP:
                    356:        draw_led (lednr);
                    357:        break;
                    358:      case GDK_EXPOSE:
                    359:        draw_led (lednr);
                    360:        break;
                    361:      default:
                    362:        break;
                    363:     }
                    364: 
                    365:   return 0;
                    366: }
                    367: 
                    368: static GtkWidget *make_led (int nr)
                    369: {
                    370:     GtkWidget *subframe, *the_led, *thing;
                    371:     GdkColormap *colormap;
                    372: 
                    373:     the_led = gtk_vbox_new (FALSE, 0);
                    374:     gtk_widget_show (the_led);
                    375: 
                    376:     thing = gtk_preview_new (GTK_PREVIEW_COLOR);
                    377:     gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
                    378:     gtk_widget_show (thing);
                    379: 
                    380:     subframe = gtk_frame_new (NULL);
                    381:     gtk_box_pack_start (GTK_BOX (the_led), subframe, TRUE, TRUE, 0);
                    382:     gtk_widget_show (subframe);
                    383: 
                    384:     thing = gtk_drawing_area_new ();
                    385:     gtk_drawing_area_size (GTK_DRAWING_AREA (thing), 20, 5);
                    386:     gtk_widget_set_events (thing, GDK_EXPOSURE_MASK);
                    387:     gtk_container_add (GTK_CONTAINER (subframe), thing);
                    388:     colormap = gtk_widget_get_colormap (thing);
                    389:     led_on[nr].red = nr == 0 ? 0xEEEE : 0xCCCC;
                    390:     led_on[nr].green = nr == 0 ? 0: 0xFFFF;
                    391:     led_on[nr].blue = 0;
                    392:     led_on[nr].pixel = 0;
                    393:     led_off[nr].red = 0;
                    394:     led_off[nr].green = 0;
                    395:     led_off[nr].blue = 0;
                    396:     led_off[nr].pixel = 0;
                    397:     gdk_color_alloc (colormap, led_on + nr);
                    398:     gdk_color_alloc (colormap, led_off + nr);
                    399:     led_widgets[nr] = thing;
                    400:     gtk_signal_connect (GTK_OBJECT (thing), "event",
                    401:                        (GtkSignalFunc) driveled_event, (gpointer) thing);
                    402:     gtk_widget_show (thing);
                    403: 
                    404:     thing = gtk_preview_new (GTK_PREVIEW_COLOR);
                    405:     gtk_box_pack_start (GTK_BOX (the_led), thing, TRUE, TRUE, 0);
                    406:     gtk_widget_show (thing);
                    407:     
                    408:     return the_led;
                    409: }
                    410: 
                    411: static void make_floppy_disks (GtkWidget *vbox)
                    412: {
                    413:     int i;
                    414:     /* Now, the floppy disk control.  */
                    415:     for (i = 0; i < 4; i++) {
                    416:        GtkWidget *thing, *subthing, *subframe, *buttonbox;
                    417:        char buf[5];
                    418:        sprintf (buf, "DF%d:", i);
                    419: 
                    420:        /* Each line: a frame with a hbox in it. The hbox contains
                    421:         * the LED, the name of the drive and the diskfile in it, an
                    422:         * Insert button, and an Eject button.  */
                    423:        buttonbox = gtk_frame_new (buf);
                    424:        thing = gtk_hbox_new (FALSE, 4);
                    425:        gtk_container_add (GTK_CONTAINER (buttonbox), thing);
                    426:         gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
                    427:        gtk_widget_show (buttonbox);
                    428:        gtk_widget_show (thing);
                    429:        buttonbox = thing;
                    430: 
                    431:        subthing = make_led (i + 1);
                    432:        gtk_box_pack_start (GTK_BOX (buttonbox), subthing, FALSE, TRUE, 0);
                    433: 
                    434:        /* Make the "DF0:xxx" label.  */
                    435:        subframe = gtk_frame_new (NULL);
                    436:        gtk_frame_set_shadow_type (GTK_FRAME (subframe), GTK_SHADOW_ETCHED_OUT);
                    437:        gtk_box_pack_start (GTK_BOX (buttonbox), subframe, FALSE, TRUE, 0);
                    438:        gtk_widget_show (subframe);
                    439: 
                    440:        subthing = gtk_vbox_new (FALSE, 0);
                    441:        gtk_widget_show (subthing);
                    442:        gtk_container_add (GTK_CONTAINER (subframe), subthing);
                    443: 
                    444:        thing = gtk_label_new ("");
                    445:        disk_text_widget[i] = thing;
                    446:        gtk_widget_show (thing);
                    447:        gtk_box_pack_start (GTK_BOX (subthing), thing, FALSE, TRUE, 0);
                    448: 
                    449:        gtk_widget_set_usize (subthing,
                    450:                              gdk_string_measure (subframe->style->font,
                    451:                                                  "This is a very long name for a disk file, should be enough") + 7, 0);
                    452:        gtk_container_disable_resize (GTK_CONTAINER (subthing));
                    453: 
                    454:        /* Now, the buttons.  */
                    455:        thing = gtk_button_new_with_label ("Eject");
                    456:        gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    457:        gtk_widget_show (thing);
                    458:        disk_eject_widget[i] = thing;
                    459:        gtk_signal_connect (GTK_OBJECT (thing), "clicked",
                    460:                            (GtkSignalFunc) (i == 0 ? did_eject_0 
                    461:                                             : i == 1 ? did_eject_1 
                    462:                                             : i == 2 ? did_eject_2 : did_eject_3),
                    463:                            NULL);
                    464: 
                    465:        thing = gtk_button_new_with_label ("Insert");
                    466:        gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    467:        gtk_widget_show (thing);
                    468:        disk_insert_widget[i] = thing;
                    469:        gtk_signal_connect (GTK_OBJECT (thing), "clicked",
                    470:                            (GtkSignalFunc) (i == 0 ? did_insert_0 
                    471:                                             : i == 1 ? did_insert_1 
                    472:                                             : i == 2 ? did_insert_2 : did_insert_3),
                    473:                            NULL);
                    474:     }
                    475: }
                    476: 
                    477: static void make_cpu_widgets (GtkWidget *hbox)
                    478: {
                    479:     int i;
                    480:     GtkWidget *vbox, *hbox2, *frame;
                    481:     GtkWidget *thing;
                    482: 
                    483:     frame = gtk_frame_new ("CPU type");
                    484:     gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
                    485:     gtk_widget_show (frame);
                    486:     vbox = gtk_vbox_new (FALSE, 4);
                    487:     gtk_widget_show (vbox);
                    488:     gtk_container_add (GTK_CONTAINER (frame), vbox);
                    489:     
                    490:     thing = gtk_radio_button_new_with_label (0, "68000");
                    491:     gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    492:     gtk_widget_show (thing);
                    493:     cpu_widget[0] = thing;
                    494:     thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68010");
                    495:     gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    496:     gtk_widget_show (thing);
                    497:     cpu_widget[1] = thing;
                    498:     thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68020");
                    499:     gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    500:     gtk_widget_show (thing);
                    501:     cpu_widget[2] = thing;
                    502:     thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "68020/68881");
                    503:     gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    504:     gtk_widget_show (thing);
                    505:     cpu_widget[3] = thing;
                    506: 
                    507:     for (i = 0; i < 4; i++)
                    508:        gtk_signal_connect (GTK_OBJECT (cpu_widget[i]), "clicked",
                    509:                            (GtkSignalFunc) cputype_changed, NULL);
                    510:     
                    511:     frame = gtk_frame_new ("CPU flags");
                    512:     gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
                    513:     gtk_widget_show (frame);
                    514:     vbox = gtk_vbox_new (FALSE, 4);
                    515:     gtk_widget_show (vbox);
                    516:     gtk_container_add (GTK_CONTAINER (frame), vbox);
                    517: 
                    518:     hbox2 = gtk_hbox_new (FALSE, 4);
                    519:     gtk_widget_show (hbox2);
                    520:     gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
                    521: 
                    522:     thing = gtk_label_new ("Cycles per instruction:");
                    523:     gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
                    524:     gtk_widget_show (thing);
                    525: 
                    526:     cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.m68k_speed, 1.0, 10.0, 1.0, 1.0, 1.0));
                    527:     gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed",
                    528:                        GTK_SIGNAL_FUNC (cpuspeed_changed), NULL);
                    529: 
                    530:     thing = gtk_hscale_new (cpuspeed_adj);
                    531:     gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
                    532:     gtk_scale_set_digits (GTK_SCALE (thing), 0);
                    533:     gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
                    534:     gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
                    535:     gtk_widget_show (thing);
                    536: 
                    537:     a24m_widget = gtk_check_button_new_with_label ("24 bit address space");
                    538:     gtk_box_pack_start (GTK_BOX (vbox), a24m_widget, FALSE, TRUE, 0);
                    539:     gtk_widget_show (a24m_widget);
                    540:     ccpu_widget = gtk_check_button_new_with_label ("Slow but compatible");
                    541:     gtk_box_pack_start (GTK_BOX (vbox), ccpu_widget, FALSE, TRUE, 0);
                    542:     gtk_widget_show (ccpu_widget);
                    543: 
                    544:     gtk_signal_connect (GTK_OBJECT (ccpu_widget), "clicked",
                    545:                        (GtkSignalFunc) cputype_changed, NULL);
                    546:     gtk_signal_connect (GTK_OBJECT (a24m_widget), "clicked",
                    547:                        (GtkSignalFunc) cputype_changed, NULL);    
                    548: }
                    549: 
                    550: static void make_gfx_widgets (GtkWidget *hbox)
                    551: {
                    552:     int i;
                    553:     GtkWidget *vbox, *hbox2, *frame;
                    554:     GtkWidget *thing;
                    555: 
                    556: #if 0
                    557:     frame = gtk_frame_new ("CPU type");
                    558:     gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
                    559:     gtk_widget_show (frame);
                    560: #endif
                    561:     vbox = gtk_vbox_new (FALSE, 4);
                    562:     gtk_widget_show (vbox);
                    563:     gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, TRUE, 0);
                    564: #if 0
                    565:     gtk_container_add (GTK_CONTAINER (frame), vbox);
                    566: #endif
                    567:     
                    568:     hbox2 = gtk_hbox_new (FALSE, 4);
                    569:     gtk_widget_show (hbox2);
                    570:     gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
                    571: 
                    572:     thing = gtk_label_new ("Framerate:");
                    573:     gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
                    574:     gtk_widget_show (thing);
                    575: 
                    576:     framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.framerate, 1.0, 21.0, 1.0, 1.0, 1.0));
                    577:     gtk_signal_connect (GTK_OBJECT (framerate_adj), "value_changed",
                    578:                        GTK_SIGNAL_FUNC (gfx_changed), NULL);
                    579: 
                    580:     thing = gtk_hscale_new (framerate_adj);
                    581:     gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED);
                    582:     gtk_scale_set_digits (GTK_SCALE (thing), 0);
                    583:     gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT);
                    584:     gtk_box_pack_start (GTK_BOX (hbox2), thing, FALSE, TRUE, 0);
                    585:     gtk_widget_show (thing);
                    586: 
                    587:     b32_widget = gtk_check_button_new_with_label ("32 bit blitter");
                    588:     gtk_box_pack_start (GTK_BOX (vbox), b32_widget, FALSE, TRUE, 0);
                    589:     gtk_widget_show (b32_widget);
                    590:     bimm_widget = gtk_check_button_new_with_label ("Immediate blits");
                    591:     gtk_box_pack_start (GTK_BOX (vbox), bimm_widget, FALSE, TRUE, 0);
                    592:     gtk_widget_show (bimm_widget);
                    593: 
                    594:     gtk_signal_connect (GTK_OBJECT (bimm_widget), "clicked",
                    595:                        (GtkSignalFunc) gfx_changed, NULL);
                    596:     gtk_signal_connect (GTK_OBJECT (b32_widget), "clicked",
                    597:                        (GtkSignalFunc) gfx_changed, NULL);    
                    598: }
                    599: 
                    600: static void make_joy_widgets (GtkWidget *hbox)
                    601: {
                    602:     int i;
                    603: 
                    604:     for (i = 0; i < 2; i++) {
                    605:        GtkWidget *vbox, *frame;
                    606:        GtkWidget *thing;
                    607:        char buffer[20];
                    608:        int j;
                    609: 
                    610:        sprintf (buffer, "Port %d", i);
                    611:        frame = gtk_frame_new (buffer);
                    612:        gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
                    613:        gtk_widget_show (frame);
                    614:        vbox = gtk_vbox_new (FALSE, 4);
                    615:        gtk_widget_show (vbox);
                    616:        gtk_container_add (GTK_CONTAINER (frame), vbox);
                    617:     
                    618:        thing = gtk_radio_button_new_with_label (0, "Joystick 0");
                    619:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    620:        gtk_widget_show (thing);
                    621:        joy_widget[i][0] = thing;
                    622:        thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Joystick 1");
                    623:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    624:        gtk_widget_show (thing);
                    625:        joy_widget[i][1] = thing;
                    626:        thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Mouse");
                    627:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    628:        gtk_widget_show (thing);
                    629:        joy_widget[i][2] = thing;
                    630:        thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Numeric pad");
                    631:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    632:        gtk_widget_show (thing);
                    633:        joy_widget[i][3] = thing;
                    634:        thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "Cursor keys/Right Ctrl");
                    635:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    636:        gtk_widget_show (thing);
                    637:        joy_widget[i][4] = thing;
                    638:        thing = gtk_radio_button_new_with_label (gtk_radio_button_group (GTK_RADIO_BUTTON (thing)), "T/F/H/B/Left Alt");
                    639:        gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    640:        gtk_widget_show (thing);
                    641:        joy_widget[i][5] = thing;
                    642: 
                    643:        for (j = 0; j < 6; j++)
                    644:            gtk_signal_connect (GTK_OBJECT (joy_widget[i][j]), "clicked",
                    645:                                (GtkSignalFunc) joy_changed, NULL);
                    646:     }
                    647: }
                    648: 
                    649: static void *gtk_penguin (void *dummy)
                    650: {
                    651:     GtkWidget *window, *notebook;
                    652:     GtkWidget *buttonbox, *vbox, *vbox2, *hbox;
                    653:     GtkWidget *thing;
                    654: 
                    655:     int i;
                    656: 
                    657:     int argc = 1;
                    658:     char *a[] = {"UAE"};
                    659:     char **argv = a;
                    660: 
                    661:     gtk_init (&argc, &argv);
                    662:     gtk_rc_parse ("uaegtkrc");
                    663: 
                    664:     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
                    665:     gtk_widget_set_name (window, "UAE control");
                    666: 
                    667:     vbox = gtk_vbox_new (FALSE, 4);
                    668:     gtk_container_add (GTK_CONTAINER (window), vbox);
                    669: 
                    670:     /* Make a box with the Reset/Debug/Quit buttons and place it at the top
                    671:      * of our vbox.  */
                    672:     buttonbox = gtk_hbox_new (FALSE, 4);
                    673:     gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
                    674:     gtk_widget_show (buttonbox);
                    675:     thing = gtk_button_new_with_label ("Reset");
                    676:     gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_reset, NULL);
                    677:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    678:     gtk_widget_show (thing);
                    679:     thing = gtk_button_new_with_label ("Debug");
                    680:     gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_debug, NULL);
                    681:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    682:     gtk_widget_show (thing);
                    683:     thing = gtk_button_new_with_label ("Quit");
                    684:     gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) did_quit, NULL);
                    685:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    686:     gtk_widget_show (thing);
                    687:     /* An empty but expanded vbox to make the LED appear at the right border.  */
                    688:     thing = gtk_vbox_new (FALSE, 0);
                    689:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, TRUE, TRUE, 0);
                    690:     gtk_widget_show (thing);
                    691:     thing = make_led (0);
                    692:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    693:     gtk_widget_show (thing);
                    694: 
                    695:     /* The next box contains the "Save configuration" button.  */
                    696:     buttonbox = gtk_hbox_new (FALSE, 4);
                    697:     gtk_box_pack_start (GTK_BOX (vbox), buttonbox, FALSE, TRUE, 0);
                    698:     gtk_widget_show (buttonbox);
                    699: 
                    700:     thing = gtk_button_new_with_label ("Save config");
                    701:     gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) save_config, NULL);
                    702:     gtk_box_pack_start (GTK_BOX (buttonbox), thing, FALSE, TRUE, 0);
                    703:     gtk_widget_show (thing);
                    704: 
                    705:     /* Place a separator below those three buttons.  */
                    706:     thing = gtk_hseparator_new ();
                    707:     gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0);
                    708:     gtk_widget_show (thing);
                    709: 
                    710:     notebook = gtk_notebook_new ();
                    711:     gtk_box_pack_start (GTK_BOX (vbox), notebook, FALSE, TRUE, 0);
                    712:     gtk_widget_show (notebook);
                    713: 
                    714:     thing = gtk_vbox_new (FALSE, 4);
                    715:     gtk_widget_show (thing);
                    716:     make_floppy_disks (thing);
                    717:     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Floppy disks"));
                    718: 
                    719:     thing = gtk_hbox_new (FALSE, 4);
                    720:     gtk_widget_show (thing);
                    721:     make_cpu_widgets (thing);
                    722:     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("CPU emulation"));
                    723:     
                    724:     thing = gtk_hbox_new (FALSE, 4);
                    725:     gtk_widget_show (thing);
                    726:     make_gfx_widgets (thing);
                    727:     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Graphics"));
                    728: 
                    729:     thing = gtk_hbox_new (FALSE, 4);
                    730:     gtk_widget_show (thing);
                    731:     make_joy_widgets (thing);
                    732:     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new ("Game ports"));
                    733: 
                    734:     enable_disk_buttons (1);
                    735: 
                    736:     gtk_widget_show (vbox);
                    737:     gtk_widget_show (window);
                    738: 
                    739:     /* We're going to need that later.  */
                    740:     selector = gtk_file_selection_new ("");
                    741:     gtk_signal_connect (GTK_OBJECT (selector), "destroy",
                    742:                        (GtkSignalFunc) did_close_insert, selector);
                    743: 
                    744:     gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->ok_button),
                    745:                               "clicked", (GtkSignalFunc) did_insert_select,
                    746:                               GTK_OBJECT (selector));
                    747:     gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (selector)->cancel_button),
                    748:                               "clicked", (GtkSignalFunc) did_cancel_insert,
                    749:                               GTK_OBJECT (selector));
                    750:     filesel_active = -1;
                    751: 
                    752:     gtk_timeout_add (1000, (GtkFunction)my_idle, 0);
                    753:     gtk_main ();
                    754:     
                    755:     quitted_gui = 1;
                    756:     uae_sem_post (&gui_quit_sem);
                    757:     return 0;
                    758: }
                    759: 
                    760: void gui_changesettings(void)
                    761: {
                    762:     
                    763: }
                    764: 
                    765: int gui_init (void)
                    766: {
                    767:     penguin_id tid;
                    768: 
                    769:     gui_active = 0;
                    770:     
                    771:     init_comm_pipe (&to_gui_pipe, 20, 1);
                    772:     init_comm_pipe (&from_gui_pipe, 20, 1);
                    773:     uae_sem_init (&gui_sem, 0, 1);
                    774:     uae_sem_init (&gui_quit_sem, 0, 0);
                    775:     start_penguin (gtk_penguin, NULL, &tid);
                    776:     return 1;
                    777: }
                    778: 
                    779: int gui_update (void)
                    780: {
                    781:     if (no_gui)
                    782:        return 0;
                    783: 
                    784:     write_comm_pipe_int (&to_gui_pipe, 1, 1);    
                    785:     return 0;
                    786: }
                    787: 
                    788: void gui_exit (void)
                    789: {
                    790:     if (no_gui)
                    791:        return;
                    792: 
                    793:     quit_gui = 1;
                    794:     uae_sem_wait (&gui_quit_sem);
                    795: }
                    796: 
                    797: void gui_led(int num, int on)
                    798: {
                    799:     if (no_gui)
                    800:        return;
                    801: 
                    802: /*    if (num == 0)
                    803:        return;
                    804:     printf("LED %d %d\n", num, on);
                    805:     write_comm_pipe_int (&to_gui_pipe, 1, 0);
                    806:     write_comm_pipe_int (&to_gui_pipe, num == 0 ? 4 : num - 1, 0);
                    807:     write_comm_pipe_int (&to_gui_pipe, on, 1);
                    808:     printf("#LED %d %d\n", num, on);*/
                    809: }
                    810: 
                    811: void gui_filename(int num, const char *name)
                    812: {
                    813:     if (no_gui)
                    814:        return;
                    815: 
                    816:     write_comm_pipe_int (&to_gui_pipe, 0, 0);
                    817:     write_comm_pipe_int (&to_gui_pipe, num, 1);
                    818: 
                    819: /*    gui_update ();*/
                    820: }
                    821: 
                    822: void gui_handle_events(void)
                    823: {
                    824:     if (no_gui)
                    825:        return;
                    826: 
                    827:     while (comm_pipe_has_data (&from_gui_pipe)) {
                    828:        int cmd = read_comm_pipe_int_blocking (&from_gui_pipe);
                    829:        int n;
                    830:        switch (cmd) {
                    831:         case 0:
                    832:            n = read_comm_pipe_int_blocking (&from_gui_pipe);
                    833:            changed_prefs.df[n][0] = '\0';
                    834:            break;
                    835:         case 1:
                    836:            n = read_comm_pipe_int_blocking (&from_gui_pipe);
                    837:            uae_sem_wait (&gui_sem);
                    838:            strncpy (changed_prefs.df[n], new_disk_string[n], 255);
                    839:            changed_prefs.df[n][255] = '\0';
                    840:            uae_sem_post (&gui_sem);
                    841:            break;
                    842:         case 2:
                    843:            uae_reset ();
                    844:            break;
                    845:         case 3:
                    846:            activate_debugger ();
                    847:            break;
                    848:         case 4:
                    849:            uae_quit ();
                    850:            break;
                    851:        }
                    852:     }
                    853:     
                    854: }

unix.superglobalmegacorp.com

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