--- BasiliskII/src/Windows/prefs_editor_gtk.cpp 2005/11/20 17:26:16 1.3 +++ BasiliskII/src/Windows/prefs_editor_gtk.cpp 2005/11/20 23:47:42 1.5 @@ -20,8 +20,11 @@ #include "sysdeps.h" -#include #include +#include +#include +#include +#include #include "user_strings.h" #include "version.h" @@ -461,7 +464,7 @@ bool PrefsEditor(void) gtk_box_pack_start(GTK_BOX(box), notebook, TRUE, TRUE, 0); create_volumes_pane(notebook); - create_scsi_pane(notebook); +// create_scsi_pane(notebook); XXX not ready yet (merge scsi_windows.cpp from original B2/Win) create_graphics_pane(notebook); create_input_pane(notebook); create_serial_pane(notebook); @@ -489,9 +492,17 @@ bool PrefsEditor(void) * "Volumes" pane */ +static GtkWidget *w_enableextfs, *w_extdrives; static GtkWidget *volume_list; static int selected_volume; +// Set sensitivity of widgets +static void set_volumes_sensitive(void) +{ + const bool enable_extfs = PrefsFindBool("enableextfs"); + gtk_widget_set_sensitive(w_extdrives, enable_extfs); +} + // Volume in list selected static void cl_selected(GtkWidget *list, int row, int column) { @@ -513,13 +524,14 @@ static void create_volume_ok(GtkWidget * gchar *file = (gchar *)gtk_file_selection_get_filename(GTK_FILE_SELECTION(assoc->req)); const gchar *str = gtk_entry_get_text(GTK_ENTRY(assoc->entry)); - int size = atoi(str); + size_t size = atoi(str) << 20; - char cmd[1024]; - sprintf(cmd, "dd if=/dev/zero \"of=%s\" bs=1024k count=%d", file, size); - int ret = system(cmd); - if (ret == 0) + int fd = _open(file, _O_WRONLY | _O_CREAT | _O_BINARY | _O_TRUNC, _S_IREAD | _S_IWRITE); + if (fd >= 0) { + if (_chsize(fd, size) == 0) gtk_clist_append(GTK_CLIST(volume_list), &file); + _close(fd); + } gtk_widget_destroy(GTK_WIDGET(assoc->req)); delete assoc; } @@ -568,12 +580,25 @@ static void cb_remove_volume(...) static void mn_boot_any(...) {PrefsReplaceInt32("bootdriver", 0);} static void mn_boot_cdrom(...) {PrefsReplaceInt32("bootdriver", CDROMRefNum);} +// "Enable external file system" button toggled +static void tb_enableextfs(GtkWidget *widget) +{ + PrefsReplaceBool("enableextfs", GTK_TOGGLE_BUTTON(widget)->active); + set_volumes_sensitive(); +} + // "No CD-ROM Driver" button toggled static void tb_nocdrom(GtkWidget *widget) { PrefsReplaceBool("nocdrom", GTK_TOGGLE_BUTTON(widget)->active); } +// "Enable polling" button toggled +static void tb_pollmedia(GtkWidget *widget) +{ + PrefsReplaceBool("pollmedia", GTK_TOGGLE_BUTTON(widget)->active); +} + // Read settings from widgets and set preferences static void read_volumes_settings(void) { @@ -585,6 +610,8 @@ static void read_volumes_settings(void) gtk_clist_get_text(GTK_CLIST(volume_list), i, 0, &str); PrefsAddString("disk", str); } + + PrefsReplaceString("extdrives", get_file_entry_path(w_extdrives)); } // Create "Volumes" pane @@ -633,6 +660,14 @@ static void create_volumes_pane(GtkWidge menu = make_option_menu(box, STR_BOOTDRIVER_CTRL, options, active); make_checkbox(box, STR_NOCDROM_CTRL, "nocdrom", GTK_SIGNAL_FUNC(tb_nocdrom)); + + make_checkbox(box, STR_POLLMEDIA_CTRL, "pollmedia", GTK_SIGNAL_FUNC(tb_pollmedia)); + + make_separator(box); + w_enableextfs = make_checkbox(box, STR_EXTFS_ENABLE_CTRL, "enableextfs", GTK_SIGNAL_FUNC(tb_enableextfs)); + w_extdrives = make_file_entry(box, STR_EXTFS_DRIVES_CTRL, "extdrives", true); + + set_volumes_sensitive(); } @@ -988,7 +1023,9 @@ 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")); + const bool use_keycodes = PrefsFindBool("keycodes"); + gtk_widget_set_sensitive(w_keycode_file, use_keycodes); + gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data(G_OBJECT(w_keycode_file), "chooser_button")), use_keycodes); gtk_widget_set_sensitive(w_mouse_wheel_lines, PrefsFindInt32("mousewheelmode") == 1); } @@ -1018,13 +1055,33 @@ static void read_input_settings(void) // Create "Input" pane static void create_input_pane(GtkWidget *top) { - GtkWidget *box, *hbox, *menu, *label; + GtkWidget *box, *hbox, *menu, *label, *button; 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"); + + 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_KEYCODES_CTRL)); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + + const char *str = PrefsFindString("keycodefile"); + if (str == NULL) + str = ""; + + w_keycode_file = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(w_keycode_file), str); + gtk_widget_show(w_keycode_file); + gtk_box_pack_start(GTK_BOX(hbox), w_keycode_file, TRUE, TRUE, 0); + + button = make_browse_button(w_keycode_file); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + g_object_set_data(G_OBJECT(w_keycode_file), "chooser_button", button); make_separator(box); @@ -1102,7 +1159,6 @@ static void read_serial_settings(void) // Port changed in combo static void cb_serial_port_changed(...) { - printf("serial port changed\n"); set_serial_sensitive(); } @@ -1160,21 +1216,43 @@ static void create_serial_pane(GtkWidget * "Ethernet" pane */ -static GtkWidget *w_ether, *w_udp_port; +static GtkWidget *w_ether; +static GtkWidget *w_ftp_port_list, *w_tcp_port_list; +static const char s_nat_router[] = "NAT/Router module"; // Set sensitivity of widgets static void set_ethernet_sensitive(void) { + const char *str = gtk_entry_get_text(GTK_ENTRY(w_ether)); + + bool is_nat_router = strcmp(str, s_nat_router) == 0; + gtk_widget_set_sensitive(w_ftp_port_list, is_nat_router); + gtk_widget_set_sensitive(w_tcp_port_list, is_nat_router); } // Read settings from widgets and set preferences static void read_ethernet_settings(void) { const char *str = gtk_entry_get_text(GTK_ENTRY(w_ether)); - if (str && strlen(str)) - PrefsReplaceString("ether", str); + if (str && strlen(str) > 6 && strncmp(str, "NDIS: ", 6) == 0) + PrefsReplaceString("ether", &str[6]); else PrefsRemoveItem("ether"); + + const bool router_enabled = str && strcmp(str, s_nat_router) == 0; + PrefsReplaceBool("routerenabled", router_enabled); + if (router_enabled) { + str = gtk_entry_get_text(GTK_ENTRY(w_ftp_port_list)); + PrefsReplaceString("ftp_port_list", str); + str = gtk_entry_get_text(GTK_ENTRY(w_tcp_port_list)); + PrefsReplaceString("tcp_port", str); + } +} + +// Ethernet emulation type changed in menulist +static void cb_ether_changed(...) +{ + set_ethernet_sensitive(); } // Add names of ethernet interfaces @@ -1184,15 +1262,11 @@ static GList *add_ether_names(void) // TODO: Get list of all Ethernet interfaces #ifdef HAVE_SLIRP - static char s_slirp[] = "slirp"; - glist = g_list_append(glist, s_slirp); -#endif -#if 0 - if (glist) - g_list_sort(glist, gl_str_cmp); - else + static const char s_slirp[] = "slirp"; + glist = g_list_append(glist, (void *)s_slirp); #endif - glist = g_list_append(glist, (void *)GetString(STR_NONE_LAB)); + glist = g_list_append(glist, (void *)s_nat_router); + glist = g_list_append(glist, (void *)GetString(STR_NONE_LAB)); return glist; } @@ -1214,11 +1288,46 @@ static void create_ethernet_pane(GtkWidg gtk_widget_show(combo); gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist); const char *str = PrefsFindString("ether"); - if (str == NULL) - str = ""; + if (str == NULL || str[0] == '\0') { + if (PrefsFindBool("routerenabled")) + str = s_nat_router; + else + str = GetString(STR_NONE_LAB); + } gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), str); gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 0, 1, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); w_ether = GTK_COMBO(combo)->entry; + gtk_signal_connect(GTK_OBJECT(w_ether), "changed", GTK_SIGNAL_FUNC(cb_ether_changed), NULL); + + sep = gtk_hseparator_new(); + gtk_widget_show(sep); + gtk_table_attach(GTK_TABLE(table), sep, 0, 2, 1, 2, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + + label = gtk_label_new(GetString(STR_ETHER_FTP_PORT_LIST_CTRL)); + gtk_widget_show(label); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + + entry = gtk_entry_new(); + str = PrefsFindString("ftp_port_list"); + if (str == NULL) + str = ""; + gtk_entry_set_text(GTK_ENTRY(entry), str); + gtk_widget_show(entry); + gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 2, 3, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); + w_ftp_port_list = entry; + + label = gtk_label_new(GetString(STR_ETHER_TCP_PORT_LIST_CTRL)); + gtk_widget_show(label); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, (GtkAttachOptions)0, (GtkAttachOptions)0, 4, 4); + + entry = gtk_entry_new(); + str = PrefsFindString("tcp_port"); + if (str == NULL) + str = ""; + gtk_entry_set_text(GTK_ENTRY(entry), str); + gtk_widget_show(entry); + gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 3, 4, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)0, 4, 4); + w_tcp_port_list = entry; set_ethernet_sensitive(); } @@ -1368,6 +1477,21 @@ void SysAddSerialPrefs(void) /* + * Display alerts + */ + +static void display_alert(int title_id, const char *text, int flags) +{ + MessageBox(NULL, text, GetString(title_id), MB_OK | flags); +} + +static void ErrorAlert(const char *text) +{ + display_alert(STR_ERROR_ALERT_TITLE, text, MB_ICONSTOP); +} + + +/* * Start standalone GUI */ @@ -1388,7 +1512,24 @@ int main(int argc, char *argv[]) // Transfer control to the Basilisk II executable if (start) { - printf("Start Basilisk II\n"); + char path[_MAX_PATH]; + bool ok = GetModuleFileName(NULL, path, sizeof(path)) != 0; + if (ok) { + char b2_path[_MAX_PATH]; + char *p = strrchr(path, '\\'); + *++p = '\0'; + SetCurrentDirectory(path); + strcpy(b2_path, path); + strcat(b2_path, "BasiliskII.exe"); + HINSTANCE h = ShellExecute(GetDesktopWindow(), "open", + b2_path, "", path, SW_SHOWNORMAL); + if ((int)h <= 32) + ok = false; + } + if (!ok) { + ErrorAlert("Coult not start BasiliskII executable"); + return 1; + } } return 0;