Annotation of uae/src/gtkui.c, revision 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.