--- uae/src/gtkui.c 2018/04/24 16:42:09 1.1.1.2 +++ uae/src/gtkui.c 2018/04/24 16:54:52 1.1.1.7 @@ -29,17 +29,33 @@ #include +/* One of the 1.1.6 "features" is a gratuitous name change */ +#ifndef HAVE_GTK_FEATURES_1_1_6 +#define gtk_container_set_border_width gtk_container_border_width +#endif +/* Likewise for 1.1.8. */ +#ifndef HAVE_GTK_FEATURES_1_1_8 +#define gtk_label_set_text gtk_label_set +#endif +/* This is beginning to suck... */ +#ifndef HAVE_GTK_FEATURES_1_1_13 +#define gtk_toggle_button_set_active gtk_toggle_button_set_state +#endif + static int gui_active; +static GtkWidget *pause_uae_widget; + static GtkWidget *disk_insert_widget[4], *disk_eject_widget[4], *disk_text_widget[4]; static char *new_disk_string[4]; static GtkAdjustment *cpuspeed_adj; +static GtkWidget *cpuspeed_widgets[4], *cpuspeed_scale; static GtkWidget *cpu_widget[4], *a24m_widget, *ccpu_widget; static GtkWidget *sound_widget[4], *sound_bits_widget[2], *sound_freq_widget[3], *sound_ch_widget[2]; static GtkAdjustment *framerate_adj; -static GtkWidget *bimm_widget, *b32_widget; +static GtkWidget *bimm_widget, *b32_widget, *afscr_widget, *pfscr_widget; static GtkWidget *joy_widget[2][6]; @@ -67,7 +83,7 @@ static void save_config (void) fprintf (stderr, "Error saving options file!\n"); return; } - save_options (f); + save_options (f, &currprefs); fclose (f); } @@ -91,35 +107,40 @@ static void enable_disk_buttons (int ena static void set_cpu_state (void) { - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (a24m_widget), changed_prefs.address_space_24 != 0); gtk_widget_set_sensitive (a24m_widget, changed_prefs.cpu_level > 1); - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ccpu_widget), changed_prefs.cpu_compatible != 0); gtk_widget_set_sensitive (ccpu_widget, changed_prefs.cpu_level == 0); + gtk_widget_set_sensitive (cpuspeed_scale, changed_prefs.m68k_speed > 0); } static void set_cpu_widget (void) { int nr = changed_prefs.cpu_level; - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpu_widget[nr]), TRUE); + nr = currprefs.m68k_speed + 1 < 3 ? currprefs.m68k_speed + 1 : 2; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cpuspeed_widgets[nr]), TRUE); } static void set_gfx_state (void) { - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0); - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bimm_widget), currprefs.immediate_blits != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b32_widget), currprefs.blits_32bit_enabled != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (afscr_widget), currprefs.gfx_afullscreen != 0); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pfscr_widget), currprefs.gfx_pfullscreen != 0); } static void set_sound_state (void) { - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (sound_widget[currprefs.produce_sound]), 1); - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (sound_ch_widget[currprefs.stereo]), 1); - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (sound_bits_widget[currprefs.sound_bits == 16]), 1); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_widget[currprefs.produce_sound]), 1); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_ch_widget[currprefs.stereo]), 1); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sound_bits_widget[currprefs.sound_bits == 16]), 1); } static void set_joy_state (void) { - int j0t = changed_prefs.fake_joystick & 255; - int j1t = (changed_prefs.fake_joystick >> 8) & 255; + int j0t = changed_prefs.jport0; + int j1t = changed_prefs.jport1; int i; if (j0t == j1t) { @@ -128,8 +149,8 @@ static void set_joy_state (void) j0t %= 6; } for (i = 0; i < 6; i++) { - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i); - gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[0][i]), j0t == i); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (joy_widget[1][i]), j1t == i); gtk_widget_set_sensitive (joy_widget[0][i], j1t != i); gtk_widget_set_sensitive (joy_widget[1][i], j0t != i); } @@ -168,7 +189,7 @@ static int my_idle (void) switch (cmd) { case 0: n = read_comm_pipe_int_blocking (&to_gui_pipe); - gtk_label_set (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]); + gtk_label_set_text (GTK_LABEL (disk_text_widget[n]), currprefs.df[n]); break; case 1: /* Initialization. */ @@ -176,9 +197,8 @@ static int my_idle (void) set_cpu_state (); set_gfx_state (); set_joy_state (); -#ifdef SOUND_RECONFIG_SUPPORT set_sound_state (); -#endif + gui_active = 1; break; } @@ -211,28 +231,30 @@ static int find_current_toggle (GtkWidge static void joy_changed (void) { - int j0t = 0, j1t = 0; - int i; if (! gui_active) return; - j0t = find_current_toggle (joy_widget[0], 6); - j1t = find_current_toggle (joy_widget[1], 6); - - changed_prefs.fake_joystick = j0t | (j1t << 8); + changed_prefs.jport0 = find_current_toggle (joy_widget[0], 6); + changed_prefs.jport1 = find_current_toggle (joy_widget[1], 6); set_joy_state (); } static void custom_changed (void) { - changed_prefs.framerate = framerate_adj->value; + changed_prefs.gfx_framerate = framerate_adj->value; changed_prefs.blits_32bit_enabled = GTK_TOGGLE_BUTTON (b32_widget)->active; changed_prefs.immediate_blits = GTK_TOGGLE_BUTTON (bimm_widget)->active; + changed_prefs.gfx_afullscreen = GTK_TOGGLE_BUTTON (afscr_widget)->active; + changed_prefs.gfx_pfullscreen = GTK_TOGGLE_BUTTON (pfscr_widget)->active; } static void cpuspeed_changed (void) { - changed_prefs.m68k_speed = cpuspeed_adj->value; + int which = find_current_toggle (cpuspeed_widgets, 3); + changed_prefs.m68k_speed = (which == 0 ? -1 + : which == 1 ? 0 + : cpuspeed_adj->value); + set_cpu_state (); } static void cputype_changed (void) @@ -243,7 +265,7 @@ static void cputype_changed (void) oldcl = changed_prefs.cpu_level; - changed_prefs.cpu_level = find_current_toggle(cpu_widget, 4); + changed_prefs.cpu_level = find_current_toggle (cpu_widget, 4); changed_prefs.cpu_compatible = GTK_TOGGLE_BUTTON (ccpu_widget)->active; changed_prefs.address_space_24 = GTK_TOGGLE_BUTTON (a24m_widget)->active; @@ -299,6 +321,19 @@ static void did_eject (GtkWidget *w, gpo write_comm_pipe_int (&from_gui_pipe, (int)data, 1); } +static void pause_uae (GtkWidget *widget, gpointer data) +{ + if (quit_gui) + return; + + write_comm_pipe_int (&from_gui_pipe, GTK_TOGGLE_BUTTON (widget)->active ? 5 : 6, 1); +} + +static void end_pause_uae (void) +{ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_uae_widget), FALSE); +} + static int filesel_active = -1; static GtkWidget *selector; @@ -377,6 +412,13 @@ static void add_empty_vbox (GtkWidget *t gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0); } +static void add_empty_hbox (GtkWidget *tobox) +{ + GtkWidget *thing = gtk_hbox_new (FALSE, 0); + gtk_widget_show (thing); + gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, TRUE, 0); +} + static void add_centered_to_vbox (GtkWidget *vbox, GtkWidget *w) { GtkWidget *hbox = gtk_hbox_new (TRUE, 0); @@ -399,11 +441,12 @@ static GtkWidget *make_labelled_widget ( return hbox2; } -static void add_labelled_widget_centered (const char *str, GtkWidget *thing, GtkWidget *vbox) +static GtkWidget *add_labelled_widget_centered (const char *str, GtkWidget *thing, GtkWidget *vbox) { GtkWidget *w = make_labelled_widget (str, thing); gtk_widget_show (w); add_centered_to_vbox (vbox, w); + return w; } static void make_radio_group (const char **labels, GtkWidget *tobox, @@ -433,7 +476,7 @@ static GtkWidget *make_radio_group_box ( frame = gtk_frame_new (title); newbox = (horiz ? gtk_hbox_new : gtk_vbox_new) (FALSE, 4); gtk_widget_show (newbox); - gtk_container_border_width (GTK_CONTAINER (newbox), 4); + gtk_container_set_border_width (GTK_CONTAINER (newbox), 4); gtk_container_add (GTK_CONTAINER (frame), newbox); make_radio_group (labels, newbox, saveptr, horiz, !horiz, sigfunc); return frame; @@ -495,7 +538,7 @@ static void make_floppy_disks (GtkWidget sprintf (buf, "DF%d:", i); thing = gtk_frame_new (buf); buttonbox = gtk_hbox_new (FALSE, 4); - gtk_container_border_width (GTK_CONTAINER (buttonbox), 4); + gtk_container_set_border_width (GTK_CONTAINER (buttonbox), 4); gtk_container_add (GTK_CONTAINER (thing), buttonbox); gtk_box_pack_start (GTK_BOX (vbox), thing, FALSE, TRUE, 0); gtk_widget_show (buttonbox); @@ -535,10 +578,38 @@ static void make_floppy_disks (GtkWidget add_empty_vbox (vbox); } +static GtkWidget *make_cpu_speed_sel (void) +{ + static const char *labels[] = { + "Optimize for host CPU speed","Approximate 68000/7MHz speed", "Adjustable", + NULL + }; + GtkWidget *frame, *newbox; + + frame = gtk_frame_new ("CPU speed"); + newbox = gtk_vbox_new (FALSE, 4); + gtk_widget_show (newbox); + gtk_container_set_border_width (GTK_CONTAINER (newbox), 4); + gtk_container_add (GTK_CONTAINER (frame), newbox); + make_radio_group (labels, newbox, cpuspeed_widgets, 0, 1, cpuspeed_changed); + + cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.m68k_speed, 1.0, 10.0, 1.0, 1.0, 1.0)); + gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed", + GTK_SIGNAL_FUNC (cpuspeed_changed), NULL); + + cpuspeed_scale = gtk_hscale_new (cpuspeed_adj); + gtk_range_set_update_policy (GTK_RANGE (cpuspeed_scale), GTK_UPDATE_DELAYED); + gtk_scale_set_digits (GTK_SCALE (cpuspeed_scale), 0); + gtk_scale_set_value_pos (GTK_SCALE (cpuspeed_scale), GTK_POS_RIGHT); + cpuspeed_scale = add_labelled_widget_centered ("Cycles per instruction:", cpuspeed_scale, newbox); + + return frame; +} + static void make_cpu_widgets (GtkWidget *vbox) { int i; - GtkWidget *newbox, *frame; + GtkWidget *newbox, *hbox, *frame; GtkWidget *thing; static const char *radiolabels[] = { "68000", "68010", "68020", "68020+68881", @@ -547,35 +618,36 @@ static void make_cpu_widgets (GtkWidget add_empty_vbox (vbox); - newbox = make_radio_group_box ("CPU type", radiolabels, cpu_widget, 1, cputype_changed); + hbox = gtk_hbox_new (FALSE, 0); + add_empty_vbox (hbox); + + newbox = make_radio_group_box ("CPU type", radiolabels, cpu_widget, 0, cputype_changed); gtk_widget_show (newbox); - add_centered_to_vbox (vbox, newbox); + gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0); + + newbox = make_cpu_speed_sel (); + gtk_widget_show (newbox); + gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, FALSE, 0); + + add_empty_vbox (hbox); + gtk_widget_show (hbox); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); frame = gtk_frame_new ("CPU flags"); add_centered_to_vbox (vbox, frame); gtk_widget_show (frame); newbox = gtk_vbox_new (FALSE, 4); gtk_widget_show (newbox); - gtk_container_border_width (GTK_CONTAINER (newbox), 4); + gtk_container_set_border_width (GTK_CONTAINER (newbox), 4); gtk_container_add (GTK_CONTAINER (frame), newbox); - cpuspeed_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.m68k_speed, 1.0, 10.0, 1.0, 1.0, 1.0)); - gtk_signal_connect (GTK_OBJECT (cpuspeed_adj), "value_changed", - GTK_SIGNAL_FUNC (cpuspeed_changed), NULL); - - thing = gtk_hscale_new (cpuspeed_adj); - gtk_range_set_update_policy (GTK_RANGE (thing), GTK_UPDATE_DELAYED); - gtk_scale_set_digits (GTK_SCALE (thing), 0); - gtk_scale_set_value_pos (GTK_SCALE (thing), GTK_POS_RIGHT); - add_labelled_widget_centered ("Cycles per instruction:", thing, newbox); - a24m_widget = gtk_check_button_new_with_label ("24 bit address space"); add_centered_to_vbox (newbox, a24m_widget); gtk_widget_show (a24m_widget); ccpu_widget = gtk_check_button_new_with_label ("Slow but compatible"); add_centered_to_vbox (newbox, ccpu_widget); gtk_widget_show (ccpu_widget); - + add_empty_vbox (vbox); gtk_signal_connect (GTK_OBJECT (ccpu_widget), "clicked", @@ -590,7 +662,7 @@ static void make_gfx_widgets (GtkWidget add_empty_vbox (vbox); - framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.framerate, 1.0, 21.0, 1.0, 1.0, 1.0)); + framerate_adj = GTK_ADJUSTMENT (gtk_adjustment_new (currprefs.gfx_framerate, 1.0, 21.0, 1.0, 1.0, 1.0)); gtk_signal_connect (GTK_OBJECT (framerate_adj), "value_changed", GTK_SIGNAL_FUNC (custom_changed), NULL); @@ -602,18 +674,33 @@ static void make_gfx_widgets (GtkWidget b32_widget = gtk_check_button_new_with_label ("32 bit blitter"); add_centered_to_vbox (vbox, b32_widget); +#if 0 gtk_widget_show (b32_widget); - +#endif bimm_widget = gtk_check_button_new_with_label ("Immediate blits"); add_centered_to_vbox (vbox, bimm_widget); gtk_widget_show (bimm_widget); + afscr_widget = gtk_check_button_new_with_label ("Amiga modes fullscreen"); + add_centered_to_vbox (vbox, afscr_widget); +#if 0 + gtk_widget_show (afscr_widget); +#endif + pfscr_widget = gtk_check_button_new_with_label ("Picasso modes fullscreen"); + add_centered_to_vbox (vbox, pfscr_widget); +#if 0 + gtk_widget_show (pfscr_widget); +#endif add_empty_vbox (vbox); gtk_signal_connect (GTK_OBJECT (bimm_widget), "clicked", (GtkSignalFunc) custom_changed, NULL); gtk_signal_connect (GTK_OBJECT (b32_widget), "clicked", (GtkSignalFunc) custom_changed, NULL); + gtk_signal_connect (GTK_OBJECT (afscr_widget), "clicked", + (GtkSignalFunc) custom_changed, NULL); + gtk_signal_connect (GTK_OBJECT (pfscr_widget), "clicked", + (GtkSignalFunc) custom_changed, NULL); } static void make_sound_widgets (GtkWidget *vbox) @@ -634,7 +721,6 @@ static void make_sound_widgets (GtkWidge add_empty_vbox (vbox); -#ifdef SOUND_RECONFIG_SUPPORT newbox = make_radio_group_box ("Mode", soundlabels1, sound_widget, 1, sound_changed); gtk_widget_show (newbox); add_centered_to_vbox (vbox, newbox); @@ -648,11 +734,7 @@ static void make_sound_widgets (GtkWidge newbox = make_radio_group_box ("Resolution", soundlabels2, sound_bits_widget, 1, sound_changed); gtk_widget_show (newbox); gtk_box_pack_start (GTK_BOX (hbox), newbox, FALSE, TRUE, 0); -#else - hbox = gtk_label_new ("Your sound system doesn't support\nrun-time reconfiguration."); - gtk_widget_show (hbox); - add_centered_to_vbox (vbox, hbox); -#endif + add_empty_vbox (vbox); } @@ -685,13 +767,16 @@ static void make_joy_widgets (GtkWidget add_empty_vbox (dvbox); } -static void make_button (const char *label, GtkWidget *box, void (*sigfunc) (void)) +static GtkWidget *make_buttons (const char *label, GtkWidget *box, void (*sigfunc) (void), GtkWidget *(*create)(const char *label)) { - GtkWidget *thing = gtk_button_new_with_label (label); + GtkWidget *thing = create (label); gtk_widget_show (thing); gtk_signal_connect (GTK_OBJECT (thing), "clicked", (GtkSignalFunc) sigfunc, NULL); gtk_box_pack_start (GTK_BOX (box), thing, TRUE, TRUE, 0); + + return thing; } +#define make_button(label, box, sigfunc) make_buttons(label, box, sigfunc, gtk_button_new_with_label) static void *gtk_penguin (void *dummy) { @@ -721,7 +806,7 @@ static void *gtk_penguin (void *dummy) vbox = gtk_vbox_new (FALSE, 4); gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_border_width (GTK_CONTAINER (window), 10); + gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* First line - buttons and power LED */ hbox = gtk_hbox_new (FALSE, 10); @@ -736,6 +821,7 @@ static void *gtk_penguin (void *dummy) make_button ("Debug", buttonbox, did_debug); make_button ("Quit", buttonbox, did_quit); make_button ("Save config", buttonbox, save_config); + pause_uae_widget = make_buttons ("Pause", buttonbox, pause_uae, gtk_toggle_button_new_with_label); /* The LED */ thing = make_led (0); @@ -756,7 +842,7 @@ static void *gtk_penguin (void *dummy) for (i = 0; i < sizeof pages / sizeof (struct _pages); i++) { thing = gtk_vbox_new (FALSE, 4); gtk_widget_show (thing); - gtk_container_border_width (GTK_CONTAINER (thing), 10); + gtk_container_set_border_width (GTK_CONTAINER (thing), 10); pages[i].createfunc (thing); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), thing, gtk_label_new (pages[i].title)); } @@ -824,7 +910,11 @@ void gui_exit (void) uae_sem_wait (&gui_quit_sem); } -void gui_led(int num, int on) +void gui_fps (int x) +{ +} + +void gui_led (int num, int on) { if (no_gui) return; @@ -851,34 +941,53 @@ void gui_filename(int num, const char *n void gui_handle_events(void) { + int pause_uae = FALSE; + if (no_gui) return; - while (comm_pipe_has_data (&from_gui_pipe)) { - int cmd = read_comm_pipe_int_blocking (&from_gui_pipe); - int n; - switch (cmd) { - case 0: - n = read_comm_pipe_int_blocking (&from_gui_pipe); - changed_prefs.df[n][0] = '\0'; - break; - case 1: - n = read_comm_pipe_int_blocking (&from_gui_pipe); - uae_sem_wait (&gui_sem); - strncpy (changed_prefs.df[n], new_disk_string[n], 255); - changed_prefs.df[n][255] = '\0'; - uae_sem_post (&gui_sem); - break; - case 2: - uae_reset (); - break; - case 3: - activate_debugger (); - break; - case 4: - uae_quit (); - break; - } - } - + do { + while (pause_uae || comm_pipe_has_data (&from_gui_pipe)) { + int cmd = read_comm_pipe_int_blocking (&from_gui_pipe); + int n; + switch (cmd) { + case 0: + n = read_comm_pipe_int_blocking (&from_gui_pipe); + changed_prefs.df[n][0] = '\0'; + break; + case 1: + n = read_comm_pipe_int_blocking (&from_gui_pipe); + uae_sem_wait (&gui_sem); + strncpy (changed_prefs.df[n], new_disk_string[n], 255); + changed_prefs.df[n][255] = '\0'; + uae_sem_post (&gui_sem); + break; + case 2: + uae_reset (); + end_pause_uae (); + break; + case 3: + activate_debugger (); + end_pause_uae (); + break; + case 4: + uae_quit (); + end_pause_uae (); + break; + case 5: + pause_uae = TRUE; + break; + case 6: + pause_uae = FALSE; + break; + } + } + } while (pause_uae); +} + +void gui_update_gfx (void) +{ +#if 0 /* This doesn't work... */ + set_gfx_state (); +#endif }