--- BasiliskII/src/Unix/prefs_editor_gtk.cpp 1999/10/14 11:37:45 1.4 +++ BasiliskII/src/Unix/prefs_editor_gtk.cpp 2002/10/15 16:25:04 1.24 @@ -1,7 +1,7 @@ /* * prefs_editor_gtk.cpp - Preferences editor, Unix implementation using GTK+ * - * Basilisk II (C) 1997-1999 Christian Bauer + * Basilisk II (C) 1997-2002 Christian Bauer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +28,10 @@ #include #include +#ifdef HAVE_GNOMEUI +#include +#endif + #include "user_strings.h" #include "version.h" #include "cdrom.h" @@ -45,8 +49,10 @@ static bool start_clicked = true; // Ret static void create_volumes_pane(GtkWidget *top); static void create_scsi_pane(GtkWidget *top); static void create_graphics_pane(GtkWidget *top); +static void create_input_pane(GtkWidget *top); static void create_serial_pane(GtkWidget *top); static void create_memory_pane(GtkWidget *top); +static void create_jit_pane(GtkWidget *top); static void read_settings(void); @@ -59,6 +65,10 @@ struct opt_desc { GtkSignalFunc func; }; +struct combo_desc { + int label_id; +}; + static void add_menu_item(GtkWidget *menu, int label_id, GtkSignalFunc func) { GtkWidget *item = gtk_menu_item_new_with_label(GetString(label_id)); @@ -149,7 +159,7 @@ static GtkWidget *make_option_menu(GtkWi return menu; } -static GtkWidget *make_entry(GtkWidget *top, int label_id, const char *prefs_item) +static GtkWidget *make_file_entry(GtkWidget *top, int label_id, const char *prefs_item, bool only_dirs = false) { GtkWidget *box, *label, *entry; @@ -161,16 +171,33 @@ static GtkWidget *make_entry(GtkWidget * gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); - entry = gtk_entry_new(); - gtk_widget_show(entry); const char *str = PrefsFindString(prefs_item); if (str == NULL) str = ""; + +#ifdef HAVE_GNOMEUI + entry = gnome_file_entry_new(NULL, GetString(label_id)); + if (only_dirs) + gnome_file_entry_set_directory(GNOME_FILE_ENTRY(entry), true); + gtk_entry_set_text(GTK_ENTRY(gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(entry))), str); +#else + entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(entry), str); +#endif + gtk_widget_show(entry); gtk_box_pack_start(GTK_BOX(box), entry, TRUE, TRUE, 0); return entry; } +static char *get_file_entry_path(GtkWidget *entry) +{ +#ifdef HAVE_GNOMEUI + return gnome_file_entry_get_full_path(GNOME_FILE_ENTRY(entry), false); +#else + return gtk_entry_get_text(GTK_ENTRY(entry)); +#endif +} + static GtkWidget *make_checkbox(GtkWidget *top, int label_id, const char *prefs_item, GtkSignalFunc func) { GtkWidget *button = gtk_check_button_new_with_label(GetString(label_id)); @@ -181,7 +208,37 @@ static GtkWidget *make_checkbox(GtkWidge return button; } +static GtkWidget *make_combobox(GtkWidget *top, int label_id, const char *prefs_item, const combo_desc *options) +{ + GtkWidget *box, *label, *combo; + char str[32]; + box = gtk_hbox_new(FALSE, 4); + gtk_widget_show(box); + gtk_box_pack_start(GTK_BOX(top), box, FALSE, FALSE, 0); + + label = gtk_label_new(GetString(label_id)); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); + + GList *glist = NULL; + while (options->label_id) { + glist = g_list_append(glist, (void *)GetString(options->label_id)); + options++; + } + + combo = gtk_combo_new(); + gtk_widget_show(combo); + gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); + + sprintf(str, "%d", PrefsFindInt32(prefs_item)); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), str); + gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0); + + return combo; +} + + /* * Show preferences editor * Returns true when user clicked on "Start", false otherwise @@ -224,15 +281,59 @@ static void dl_quit(GtkWidget *dialog) // "About" selected static void mn_about(...) { - GtkWidget *dialog, *label, *button; + GtkWidget *dialog; - char str[256]; - sprintf(str, GetString(STR_ABOUT_TEXT1), VERSION_MAJOR, VERSION_MINOR); - strncat(str, "\n", 255); - strncat(str, GetString(STR_ABOUT_TEXT2), 255); +#ifdef HAVE_GNOMEUI + + char version[32]; + sprintf(version, "Version %d.%d", VERSION_MAJOR, VERSION_MINOR); + const char *authors[] = { + "Christian Bauer", + "Orlando Bassotto", + "Gwenolé Beauchesne", + "Marc Chabanas", + "Marc Hellwig", + "Biill Huey", + "Brian J. Johnson", + "Jürgen Lachmann", + "Samuel Lander", + "David Lawrence", + "Lauri Pesonen", + "Bernd Schmidt", + "and others", + NULL + }; + dialog = gnome_about_new( + "Basilisk II", + version, + "Copyright (C) 1997-2002 Christian Bauer", + authors, + "Basilisk II comes with ABSOLUTELY NO WARRANTY." + "This is free software, and you are welcome to redistribute it" + "under the terms of the GNU General Public License.", + NULL + ); + gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(win)); + +#else + + GtkWidget *label, *button; + + char str[512]; + sprintf(str, + "Basilisk II\nVersion %d.%d\n\n" + "Copyright (C) 1997-2002 Christian Bauer et al.\n" + "E-mail: Christian.Bauer@uni-mainz.de\n" + "http://www.uni-mainz.de/~bauec002/B2Main.html\n\n" + "Basilisk II comes with ABSOLUTELY NO\n" + "WARRANTY. This is free software, and\n" + "you are welcome to redistribute it\n" + "under the terms of the GNU General\n" + "Public License.\n", + VERSION_MAJOR, VERSION_MINOR + ); dialog = gtk_dialog_new(); - gtk_widget_set_usize(GTK_WIDGET(dialog), strlen(GetString(STR_ABOUT_TEXT2)) + 200, 120); gtk_window_set_title(GTK_WINDOW(dialog), GetString(STR_ABOUT_TITLE)); gtk_container_border_width(GTK_CONTAINER(dialog), 5); gtk_widget_set_uposition(GTK_WIDGET(dialog), 100, 150); @@ -247,6 +348,9 @@ static void mn_about(...) gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), button, FALSE, FALSE, 0); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_grab_default(button); + +#endif + gtk_widget_show(dialog); } @@ -291,14 +395,16 @@ bool PrefsEditor(void) GtkWidget *notebook = gtk_notebook_new(); gtk_widget_show(notebook); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); - gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), FALSE); gtk_box_pack_start(GTK_BOX(box), notebook, TRUE, TRUE, 0); create_volumes_pane(notebook); create_scsi_pane(notebook); create_graphics_pane(notebook); + create_input_pane(notebook); create_serial_pane(notebook); create_memory_pane(notebook); + create_jit_pane(notebook); static const opt_desc buttons[] = { {STR_START_BUTTON, GTK_SIGNAL_FUNC(cb_start)}, @@ -318,7 +424,7 @@ bool PrefsEditor(void) * "Volumes" pane */ -static GtkWidget *volume_list; +static GtkWidget *volume_list, *w_extfs; static int selected_volume; // Volume in list selected @@ -400,8 +506,8 @@ static void cb_remove_volume(...) } // "Boot From" selected -static void mn_boot_any(...) {PrefsReplaceInt16("bootdriver", 0);} -static void mn_boot_cdrom(...) {PrefsReplaceInt16("bootdriver", CDROMRefNum);} +static void mn_boot_any(...) {PrefsReplaceInt32("bootdriver", 0);} +static void mn_boot_cdrom(...) {PrefsReplaceInt32("bootdriver", CDROMRefNum);} // "No CD-ROM Driver" button toggled static void tb_nocdrom(GtkWidget *widget) @@ -420,6 +526,8 @@ static void read_volumes_settings(void) gtk_clist_get_text(GTK_CLIST(volume_list), i, 0, &str); PrefsAddString("disk", str); } + + PrefsReplaceString("extfs", get_file_entry_path(w_extfs)); } // Create "Volumes" pane @@ -436,10 +544,11 @@ static void create_volumes_pane(GtkWidge gtk_widget_show(volume_list); gtk_clist_set_selection_mode(GTK_CLIST(volume_list), GTK_SELECTION_SINGLE); gtk_clist_set_shadow_type(GTK_CLIST(volume_list), GTK_SHADOW_NONE); + gtk_clist_set_reorderable(GTK_CLIST(volume_list), true); gtk_signal_connect(GTK_OBJECT(volume_list), "select_row", GTK_SIGNAL_FUNC(cl_selected), NULL); char *str; int32 index = 0; - while ((str = (char *)PrefsFindString("disk", index++)) != NULL) + while ((str = const_cast(PrefsFindString("disk", index++))) != NULL) gtk_clist_append(GTK_CLIST(volume_list), &str); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), volume_list); gtk_box_pack_start(GTK_BOX(box), scroll, TRUE, TRUE, 0); @@ -454,12 +563,14 @@ static void create_volumes_pane(GtkWidge make_button_box(box, 0, buttons); make_separator(box); + w_extfs = make_file_entry(box, STR_EXTFS_CTRL, "extfs", true); + static const opt_desc options[] = { {STR_BOOT_ANY_LAB, GTK_SIGNAL_FUNC(mn_boot_any)}, {STR_BOOT_CDROM_LAB, GTK_SIGNAL_FUNC(mn_boot_cdrom)}, {0, NULL} }; - int bootdriver = PrefsFindInt16("bootdriver"), active = 0; + int bootdriver = PrefsFindInt32("bootdriver"), active = 0; switch (bootdriver) { case 0: active = 0; break; case CDROMRefNum: active = 1; break; @@ -471,6 +582,84 @@ static void create_volumes_pane(GtkWidge /* + * "JIT Compiler" pane + */ + +static GtkWidget *w_jit_fpu; +static GtkWidget *w_jit_atraps; +static GtkWidget *w_jit_cache_size; +static GtkWidget *w_jit_lazy_flush; + +// Set sensitivity of widgets +static void set_jit_sensitive(void) +{ + const bool jit_enabled = PrefsFindBool("jit"); + gtk_widget_set_sensitive(w_jit_fpu, jit_enabled); + gtk_widget_set_sensitive(w_jit_cache_size, jit_enabled); + gtk_widget_set_sensitive(w_jit_lazy_flush, jit_enabled); +} + +// "Use JIT Compiler" button toggled +static void tb_jit(GtkWidget *widget) +{ + PrefsReplaceBool("jit", GTK_TOGGLE_BUTTON(widget)->active); + set_jit_sensitive(); +} + +// "Compile FPU Instructions" button toggled +static void tb_jit_fpu(GtkWidget *widget) +{ + PrefsReplaceBool("jitfpu", GTK_TOGGLE_BUTTON(widget)->active); +} + +// "Lazy translation cache invalidation" button toggled +static void tb_jit_lazy_flush(GtkWidget *widget) +{ + PrefsReplaceBool("jitlazyflush", GTK_TOGGLE_BUTTON(widget)->active); +} + +// Read settings from widgets and set preferences +static void read_jit_settings(void) +{ +#if USE_JIT + bool jit_enabled = PrefsFindBool("jit"); + if (jit_enabled) { + const char *str = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(w_jit_cache_size)->entry)); + PrefsReplaceInt32("jitcachesize", atoi(str)); + } +#endif +} + +// Create "JIT Compiler" pane +static void create_jit_pane(GtkWidget *top) +{ +#if USE_JIT + GtkWidget *box, *table, *label, *menu; + char str[32]; + + box = make_pane(top, STR_JIT_PANE_TITLE); + make_checkbox(box, STR_JIT_CTRL, "jit", GTK_SIGNAL_FUNC(tb_jit)); + + w_jit_fpu = make_checkbox(box, STR_JIT_FPU_CTRL, "jitfpu", GTK_SIGNAL_FUNC(tb_jit_fpu)); + + // Translation cache size + static const combo_desc options[] = { + STR_JIT_CACHE_SIZE_2MB_LAB, + STR_JIT_CACHE_SIZE_4MB_LAB, + STR_JIT_CACHE_SIZE_8MB_LAB, + STR_JIT_CACHE_SIZE_16MB_LAB, + 0 + }; + w_jit_cache_size = make_combobox(box, STR_JIT_CACHE_SIZE_CTRL, "jitcachesize", options); + + // Lazy translation cache invalidation + w_jit_lazy_flush = make_checkbox(box, STR_JIT_LAZY_CINV_CTRL, "jitlazyflush", GTK_SIGNAL_FUNC(tb_jit_lazy_flush)); + + set_jit_sensitive(); +#endif +} + +/* * "SCSI" pane */ @@ -482,7 +671,7 @@ static void read_scsi_settings(void) for (int id=0; id<7; id++) { char prefs_name[32]; sprintf(prefs_name, "scsi%d", id); - const char *str = gtk_entry_get_text(GTK_ENTRY(w_scsi[id])); + const char *str = get_file_entry_path(w_scsi[id]); if (str && strlen(str)) PrefsReplaceString(prefs_name, str); else @@ -500,7 +689,7 @@ static void create_scsi_pane(GtkWidget * for (int id=0; id<7; id++) { char prefs_name[32]; sprintf(prefs_name, "scsi%d", id); - w_scsi[id] = make_entry(box, STR_SCSI_ID_0 + id, prefs_name); + w_scsi[id] = make_file_entry(box, STR_SCSI_ID_0 + id, prefs_name); } } @@ -520,15 +709,33 @@ static GtkWidget *l_frameskip, *l_displa static int display_type; static int dis_width, dis_height; +#ifdef ENABLE_FBDEV_DGA +static GtkWidget *w_fbdev_name, *w_fbdevice_file; +static GtkWidget *l_fbdev_name, *l_fbdevice_file; +static char fbdev_name[256]; +#endif + +static GtkWidget *w_dspdevice_file, *w_mixerdevice_file; + // Hide/show graphics widgets static void hide_show_graphics_widgets(void) { switch (display_type) { case DISPLAY_WINDOW: gtk_widget_show(w_frameskip); gtk_widget_show(l_frameskip); +#ifdef ENABLE_FBDEV_DGA + gtk_widget_show(w_display_x); gtk_widget_show(l_display_x); + gtk_widget_show(w_display_y); gtk_widget_show(l_display_y); + gtk_widget_hide(w_fbdev_name); gtk_widget_hide(l_fbdev_name); +#endif break; case DISPLAY_SCREEN: gtk_widget_hide(w_frameskip); gtk_widget_hide(l_frameskip); +#ifdef ENABLE_FBDEV_DGA + gtk_widget_hide(w_display_x); gtk_widget_hide(l_display_x); + gtk_widget_hide(w_display_y); gtk_widget_hide(l_display_y); + gtk_widget_show(w_fbdev_name); gtk_widget_show(l_fbdev_name); +#endif break; } } @@ -554,11 +761,21 @@ static void mn_10hz(...) {PrefsReplaceIn static void mn_15hz(...) {PrefsReplaceInt32("frameskip", 4);} static void mn_30hz(...) {PrefsReplaceInt32("frameskip", 2);} static void mn_60hz(...) {PrefsReplaceInt32("frameskip", 1);} +static void mn_dynamic(...) {PrefsReplaceInt32("frameskip", 0);} + +// Set sensitivity of widgets +static void set_graphics_sensitive(void) +{ + const bool sound_enabled = !PrefsFindBool("nosound"); + gtk_widget_set_sensitive(w_dspdevice_file, sound_enabled); + gtk_widget_set_sensitive(w_mixerdevice_file, sound_enabled); +} // "Disable Sound Output" button toggled static void tb_nosound(GtkWidget *widget) { PrefsReplaceBool("nosound", GTK_TOGGLE_BUTTON(widget)->active); + set_graphics_sensitive(); } // Read graphics preferences @@ -567,12 +784,19 @@ static void parse_graphics_prefs(void) display_type = DISPLAY_WINDOW; dis_width = 512; dis_height = 384; +#ifdef ENABLE_FBDEV_DGA + fbdev_name[0] = 0; +#endif const char *str = PrefsFindString("screen"); if (str) { if (sscanf(str, "win/%d/%d", &dis_width, &dis_height) == 2) display_type = DISPLAY_WINDOW; +#ifdef ENABLE_FBDEV_DGA + else if (sscanf(str, "dga/%255s", fbdev_name) == 1) +#else else if (sscanf(str, "dga/%d/%d", &dis_width, &dis_height) == 2) +#endif display_type = DISPLAY_SCREEN; } } @@ -594,13 +818,28 @@ static void read_graphics_settings(void) sprintf(pref, "win/%d/%d", dis_width, dis_height); break; case DISPLAY_SCREEN: +#ifdef ENABLE_FBDEV_DGA + str = gtk_entry_get_text(GTK_ENTRY(w_fbdev_name)); + sprintf(pref, "dga/%s", str); +#else sprintf(pref, "dga/%d/%d", dis_width, dis_height); +#endif break; default: PrefsRemoveItem("screen"); return; } PrefsReplaceString("screen", pref); + +#ifdef ENABLE_FBDEV_DGA + str = get_file_entry_path(w_fbdevice_file); + if (str && strlen(str)) + PrefsReplaceString("fbdevicefile", str); + else + PrefsRemoveItem("fbdevicefile"); +#endif + PrefsReplaceString("dsp", get_file_entry_path(w_dspdevice_file)); + PrefsReplaceString("mixer", get_file_entry_path(w_mixerdevice_file)); } // Create "Graphics/Sound" pane @@ -612,7 +851,7 @@ static void create_graphics_pane(GtkWidg parse_graphics_prefs(); box = make_pane(top, STR_GRAPHICS_SOUND_PANE_TITLE); - table = make_table(box, 2, 4); + table = make_table(box, 2, 5); label = gtk_label_new(GetString(STR_VIDEO_TYPE_CTRL)); gtk_widget_show(label); @@ -647,27 +886,20 @@ static void create_graphics_pane(GtkWidg add_menu_item(menu, STR_REF_15HZ_LAB, GTK_SIGNAL_FUNC(mn_15hz)); add_menu_item(menu, STR_REF_30HZ_LAB, GTK_SIGNAL_FUNC(mn_30hz)); add_menu_item(menu, STR_REF_60HZ_LAB, GTK_SIGNAL_FUNC(mn_60hz)); + add_menu_item(menu, STR_REF_DYNAMIC_LAB, GTK_SIGNAL_FUNC(mn_dynamic)); int frameskip = PrefsFindInt32("frameskip"); + int item = -1; switch (frameskip) { - case 12: - gtk_menu_set_active(GTK_MENU(menu), 0); - break; - case 8: - gtk_menu_set_active(GTK_MENU(menu), 1); - break; - case 6: - gtk_menu_set_active(GTK_MENU(menu), 2); - break; - case 4: - gtk_menu_set_active(GTK_MENU(menu), 3); - break; - case 2: - gtk_menu_set_active(GTK_MENU(menu), 4); - break; - case 1: - gtk_menu_set_active(GTK_MENU(menu), 5); - break; + case 12: item = 0; break; + case 8: item = 1; break; + case 6: item = 2; break; + case 4: item = 3; break; + case 2: item = 4; break; + case 1: item = 5; break; + case 0: item = 6; break; } + if (item >= 0) + gtk_menu_set_active(GTK_MENU(menu), item); gtk_option_menu_set_menu(GTK_OPTION_MENU(w_frameskip), menu); gtk_table_attach(GTK_TABLE(table), w_frameskip, 1, 2, 1, 2, (GtkAttachOptions)GTK_FILL, (GtkAttachOptions)0, 4, 4); @@ -713,17 +945,130 @@ static void create_graphics_pane(GtkWidg gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 3, 4, (GtkAttachOptions)GTK_FILL, (GtkAttachOptions)0, 4, 4); w_display_y = GTK_COMBO(combo)->entry; +#ifdef ENABLE_FBDEV_DGA + l_fbdev_name = gtk_label_new(GetString(STR_FBDEV_NAME_CTRL)); + gtk_widget_show(l_fbdev_name); + gtk_table_attach(GTK_TABLE(table), l_fbdev_name, 0, 1, 4, 5, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + + w_fbdev_name = gtk_entry_new(); + gtk_widget_show(w_fbdev_name); + gtk_entry_set_text(GTK_ENTRY(w_fbdev_name), fbdev_name); + gtk_table_attach(GTK_TABLE(table), w_fbdev_name, 1, 2, 4, 5, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + + w_fbdevice_file = make_file_entry(box, STR_FBDEVICE_FILE_CTRL, "fbdevicefile"); +#endif + + make_separator(box); make_checkbox(box, STR_NOSOUND_CTRL, "nosound", GTK_SIGNAL_FUNC(tb_nosound)); + w_dspdevice_file = make_file_entry(box, STR_DSPDEVICE_FILE_CTRL, "dsp"); + w_mixerdevice_file = make_file_entry(box, STR_MIXERDEVICE_FILE_CTRL, "mixer"); + + set_graphics_sensitive(); hide_show_graphics_widgets(); } /* + * "Input" pane + */ + +static GtkWidget *w_keycode_file; +static GtkWidget *w_mouse_wheel_lines; + +// Set sensitivity of widgets +static void set_input_sensitive(void) +{ + gtk_widget_set_sensitive(w_keycode_file, PrefsFindBool("keycodes")); + gtk_widget_set_sensitive(w_mouse_wheel_lines, PrefsFindInt32("mousewheelmode") == 1); +} + +// "Use Raw Keycodes" button toggled +static void tb_keycodes(GtkWidget *widget) +{ + PrefsReplaceBool("keycodes", GTK_TOGGLE_BUTTON(widget)->active); + set_input_sensitive(); +} + +// "Mouse Wheel Mode" selected +static void mn_wheel_page(...) {PrefsReplaceInt32("mousewheelmode", 0); set_input_sensitive();} +static void mn_wheel_cursor(...) {PrefsReplaceInt32("mousewheelmode", 1); set_input_sensitive();} + +// Read settings from widgets and set preferences +static void read_input_settings(void) +{ + const char *str = get_file_entry_path(w_keycode_file); + if (str && strlen(str)) + PrefsReplaceString("keycodefile", str); + else + PrefsRemoveItem("keycodefile"); + + PrefsReplaceInt32("mousewheellines", gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w_mouse_wheel_lines))); +} + +// Create "Input" pane +static void create_input_pane(GtkWidget *top) +{ + GtkWidget *box, *hbox, *menu, *label; + GtkObject *adj; + + box = make_pane(top, STR_INPUT_PANE_TITLE); + + make_checkbox(box, STR_KEYCODES_CTRL, "keycodes", GTK_SIGNAL_FUNC(tb_keycodes)); + w_keycode_file = make_file_entry(box, STR_KEYCODE_FILE_CTRL, "keycodefile"); + + make_separator(box); + + static const opt_desc options[] = { + {STR_MOUSEWHEELMODE_PAGE_LAB, GTK_SIGNAL_FUNC(mn_wheel_page)}, + {STR_MOUSEWHEELMODE_CURSOR_LAB, GTK_SIGNAL_FUNC(mn_wheel_cursor)}, + {0, NULL} + }; + int wheelmode = PrefsFindInt32("mousewheelmode"), active = 0; + switch (wheelmode) { + case 0: active = 0; break; + case 1: active = 1; break; + } + menu = make_option_menu(box, STR_MOUSEWHEELMODE_CTRL, options, active); + + hbox = gtk_hbox_new(FALSE, 4); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(GetString(STR_MOUSEWHEELLINES_CTRL)); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + adj = gtk_adjustment_new(PrefsFindInt32("mousewheellines"), 1, 1000, 1, 5, 0); + w_mouse_wheel_lines = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.0, 0); + gtk_widget_show(w_mouse_wheel_lines); + gtk_box_pack_start(GTK_BOX(hbox), w_mouse_wheel_lines, FALSE, FALSE, 0); + + set_input_sensitive(); +} + + +/* * "Serial/Network" pane */ -static GtkWidget *w_seriala, *w_serialb, *w_ether; +static GtkWidget *w_seriala, *w_serialb, *w_ether, *w_udp_port; + +// Set sensitivity of widgets +static void set_serial_sensitive(void) +{ +#if SUPPORTS_UDP_TUNNEL + gtk_widget_set_sensitive(w_ether, !PrefsFindBool("udptunnel")); + gtk_widget_set_sensitive(w_udp_port, PrefsFindBool("udptunnel")); +#endif +} + +// "Tunnel AppleTalk over IP" button toggled +static void tb_udptunnel(GtkWidget *widget) +{ + PrefsReplaceBool("udptunnel", GTK_TOGGLE_BUTTON(widget)->active); + set_serial_sensitive(); +} // Read settings from widgets and set preferences static void read_serial_settings(void) @@ -741,6 +1086,10 @@ static void read_serial_settings(void) PrefsReplaceString("ether", str); else PrefsRemoveItem("ether"); + +#if SUPPORTS_UDP_TUNNEL + PrefsReplaceInt32("udpport", gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w_udp_port))); +#endif } // Add names of serial devices @@ -824,16 +1173,17 @@ static GList *add_ether_names(void) // Create "Serial/Network" pane static void create_serial_pane(GtkWidget *top) { - GtkWidget *box, *table, *label, *combo; - GList *glist = add_serial_names(); + GtkWidget *box, *hbox, *table, *label, *combo, *sep; + GtkObject *adj; box = make_pane(top, STR_SERIAL_NETWORK_PANE_TITLE); - table = make_table(box, 2, 3); + table = make_table(box, 2, 4); label = gtk_label_new(GetString(STR_SERIALA_CTRL)); gtk_widget_show(label); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + GList *glist = add_serial_names(); combo = gtk_combo_new(); gtk_widget_show(combo); gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); @@ -858,9 +1208,13 @@ static void create_serial_pane(GtkWidget gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 1, 2, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); w_serialb = GTK_COMBO(combo)->entry; + sep = gtk_hseparator_new(); + gtk_widget_show(sep); + gtk_table_attach(GTK_TABLE(table), sep, 0, 2, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + label = gtk_label_new(GetString(STR_ETHERNET_IF_CTRL)); gtk_widget_show(label); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); glist = add_ether_names(); combo = gtk_combo_new(); @@ -870,8 +1224,27 @@ static void create_serial_pane(GtkWidget if (str == NULL) str = ""; gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), str); - gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 2, 3, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); + gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 3, 4, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); w_ether = GTK_COMBO(combo)->entry; + +#if SUPPORTS_UDP_TUNNEL + make_checkbox(box, STR_UDPTUNNEL_CTRL, "udptunnel", GTK_SIGNAL_FUNC(tb_udptunnel)); + + hbox = gtk_hbox_new(FALSE, 4); + gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); + + label = gtk_label_new(GetString(STR_UDPPORT_CTRL)); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + adj = gtk_adjustment_new(PrefsFindInt32("udpport"), 1, 65535, 1, 5, 0); + w_udp_port = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 0.0, 0); + gtk_widget_show(w_udp_port); + gtk_box_pack_start(GTK_BOX(hbox), w_udp_port, FALSE, FALSE, 0); +#endif + + set_serial_sensitive(); } @@ -881,40 +1254,43 @@ static void create_serial_pane(GtkWidget static GtkObject *w_ramsize_adj; static GtkWidget *w_rom_file; -static GtkWidget *w_keycode_file; + +// "Ignore SEGV" button toggled +#ifdef HAVE_SIGSEGV_SKIP_INSTRUCTION +static void tb_ignoresegv(GtkWidget *widget) +{ + PrefsReplaceBool("ignoresegv", GTK_TOGGLE_BUTTON(widget)->active); +} +#endif // Model ID selected static void mn_modelid_5(...) {PrefsReplaceInt32("modelid", 5);} static void mn_modelid_14(...) {PrefsReplaceInt32("modelid", 14);} -// "Use Raw Keycodes" button toggled -static void tb_keycodes(GtkWidget *widget) -{ - PrefsReplaceBool("keycodes", GTK_TOGGLE_BUTTON(widget)->active); -} +// CPU/FPU type +static void mn_cpu_68020(...) {PrefsReplaceInt32("cpu", 2); PrefsReplaceBool("fpu", false);} +static void mn_cpu_68020_fpu(...) {PrefsReplaceInt32("cpu", 2); PrefsReplaceBool("fpu", true);} +static void mn_cpu_68030(...) {PrefsReplaceInt32("cpu", 3); PrefsReplaceBool("fpu", false);} +static void mn_cpu_68030_fpu(...) {PrefsReplaceInt32("cpu", 3); PrefsReplaceBool("fpu", true);} +static void mn_cpu_68040(...) {PrefsReplaceInt32("cpu", 4); PrefsReplaceBool("fpu", true);} // Read settings from widgets and set preferences static void read_memory_settings(void) { PrefsReplaceInt32("ramsize", int(GTK_ADJUSTMENT(w_ramsize_adj)->value) << 20); - const char *str = gtk_entry_get_text(GTK_ENTRY(w_rom_file)); + const char *str = get_file_entry_path(w_rom_file); if (str && strlen(str)) PrefsReplaceString("rom", str); else PrefsRemoveItem("rom"); - str = gtk_entry_get_text(GTK_ENTRY(w_keycode_file)); - if (str && strlen(str)) - PrefsReplaceString("keycodefile", str); - else - PrefsRemoveItem("keycodefile"); } // Create "Memory/Misc" pane static void create_memory_pane(GtkWidget *top) { - GtkWidget *box, *vbox, *hbox, *hbox2, *label, *scale, *menu; + GtkWidget *box, *hbox, *vbox, *hbox2, *label, *scale; box = make_pane(top, STR_MEMORY_MISC_PANE_TITLE); @@ -956,7 +1332,7 @@ static void create_memory_pane(GtkWidget gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0); - static const opt_desc options[] = { + static const opt_desc model_options[] = { {STR_MODELID_5_LAB, GTK_SIGNAL_FUNC(mn_modelid_5)}, {STR_MODELID_14_LAB, GTK_SIGNAL_FUNC(mn_modelid_14)}, {0, NULL} @@ -966,12 +1342,33 @@ static void create_memory_pane(GtkWidget case 5: active = 0; break; case 14: active = 1; break; } - menu = make_option_menu(box, STR_MODELID_CTRL, options, active); + make_option_menu(box, STR_MODELID_CTRL, model_options, active); + +#if EMULATED_68K + static const opt_desc cpu_options[] = { + {STR_CPU_68020_LAB, GTK_SIGNAL_FUNC(mn_cpu_68020)}, + {STR_CPU_68020_FPU_LAB, GTK_SIGNAL_FUNC(mn_cpu_68020_fpu)}, + {STR_CPU_68030_LAB, GTK_SIGNAL_FUNC(mn_cpu_68030)}, + {STR_CPU_68030_FPU_LAB, GTK_SIGNAL_FUNC(mn_cpu_68030_fpu)}, + {STR_CPU_68040_LAB, GTK_SIGNAL_FUNC(mn_cpu_68040)}, + {0, NULL} + }; + int cpu = PrefsFindInt32("cpu"); + bool fpu = PrefsFindBool("fpu"); + active = 0; + switch (cpu) { + case 2: active = fpu ? 1 : 0; break; + case 3: active = fpu ? 3 : 2; break; + case 4: active = 4; + } + make_option_menu(box, STR_CPU_CTRL, cpu_options, active); +#endif - w_rom_file = make_entry(box, STR_ROM_FILE_CTRL, "rom"); + w_rom_file = make_file_entry(box, STR_ROM_FILE_CTRL, "rom"); - make_checkbox(box, STR_KEYCODES_CTRL, "keycodes", GTK_SIGNAL_FUNC(tb_keycodes)); - w_keycode_file = make_entry(box, STR_KEYCODE_FILE_CTRL, "keycodefile"); +#ifdef HAVE_SIGSEGV_SKIP_INSTRUCTION + make_checkbox(box, STR_IGNORESEGV_CTRL, "ignoresegv", GTK_SIGNAL_FUNC(tb_ignoresegv)); +#endif } @@ -984,6 +1381,8 @@ static void read_settings(void) read_volumes_settings(); read_scsi_settings(); read_graphics_settings(); + read_input_settings(); read_serial_settings(); read_memory_settings(); + read_jit_settings(); }