| version 1.1, 2004/07/14 16:01:40 | version 1.6, 2007/01/02 16:43:48 | 
| Line 12 | Line 12 | 
 | * 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright | 
 | *    notice, this list of conditions and the following disclaimer in the | *    notice, this list of conditions and the following disclaimer in the | 
 | *    documentation and/or other materials provided with the distribution. | *    documentation and/or other materials provided with the distribution. | 
 | * 3. The name of the author may not be used to endorse or promote products |  | 
 | *    derived from this software without specific prior written permission. |  | 
 | * | * | 
 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 
 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
| Line 46 | Line 44 | 
 | #include "pc9861k.h" | #include "pc9861k.h" | 
 | #include "s98.h" | #include "s98.h" | 
 | #include "scrnbmp.h" | #include "scrnbmp.h" | 
 |  | #include "sxsi.h" | 
 |  |  | 
 | #include "kdispwin.h" | #include "kdispwin.h" | 
 | #include "toolwin.h" | #include "toolwin.h" | 
| Line 67  static void cb_bmpsave(GtkAction *action | Line 66  static void cb_bmpsave(GtkAction *action | 
 | static void cb_change_font(GtkAction *action, gpointer user_data); | static void cb_change_font(GtkAction *action, gpointer user_data); | 
 | static void cb_diskeject(GtkAction *action, gpointer user_data); | static void cb_diskeject(GtkAction *action, gpointer user_data); | 
 | static void cb_diskopen(GtkAction *action, gpointer user_data); | static void cb_diskopen(GtkAction *action, gpointer user_data); | 
 |  | #if defined(SUPPORT_IDEIO) | 
 |  | static void cb_ataopen(GtkAction *action, gpointer user_data); | 
 |  | static void cb_ataremove(GtkAction *action, gpointer user_data); | 
 |  | static void cb_atapiopen(GtkAction *action, gpointer user_data); | 
 |  | static void cb_atapiremove(GtkAction *action, gpointer user_data); | 
 |  | #endif | 
 | static void cb_midipanic(GtkAction *action, gpointer user_data); | static void cb_midipanic(GtkAction *action, gpointer user_data); | 
 | static void cb_newdisk(GtkAction *action, gpointer user_data); | static void cb_newdisk(GtkAction *action, gpointer user_data); | 
 | static void cb_reset(GtkAction *action, gpointer user_data); | static void cb_reset(GtkAction *action, gpointer user_data); | 
 |  | #if !defined(SUPPORT_IDEIO) | 
 | static void cb_sasiopen(GtkAction *action, gpointer user_data); | static void cb_sasiopen(GtkAction *action, gpointer user_data); | 
 | static void cb_sasiremove(GtkAction *action, gpointer user_data); | static void cb_sasiremove(GtkAction *action, gpointer user_data); | 
 |  | #endif | 
 |  |  | 
 | static void cb_dialog(GtkAction *action, gpointer user_data); | static void cb_dialog(GtkAction *action, gpointer user_data); | 
 | static void cb_radio(GtkRadioAction *action, GtkRadioAction *current, gpointer user_data); | static void cb_radio(GtkRadioAction *action, GtkRadioAction *current, gpointer user_data); | 
| Line 90  static GtkActionEntry menu_entries[] = { | Line 97  static GtkActionEntry menu_entries[] = { | 
 | { "Drive2Menu",   NULL, "Drive_2",   NULL, NULL, NULL }, | { "Drive2Menu",   NULL, "Drive_2",   NULL, NULL, NULL }, | 
 | { "Drive3Menu",   NULL, "Drive_3",   NULL, NULL, NULL }, | { "Drive3Menu",   NULL, "Drive_3",   NULL, NULL, NULL }, | 
 | { "Drive4Menu",   NULL, "Drive_4",   NULL, NULL, NULL }, | { "Drive4Menu",   NULL, "Drive_4",   NULL, NULL, NULL }, | 
 |  | #if defined(SUPPORT_IDEIO) | 
 |  | { "ATA00Menu",    NULL, "IDE0-_0",   NULL, NULL, NULL }, | 
 |  | { "ATA01Menu",    NULL, "IDE0-_1",   NULL, NULL, NULL }, | 
 |  | { "ATAPIMenu",    NULL, "_CD-ROM",   NULL, NULL, NULL }, | 
 |  | #endif | 
 | { "KeyboardMenu", NULL, "_Keyboard", NULL, NULL, NULL }, | { "KeyboardMenu", NULL, "_Keyboard", NULL, NULL, NULL }, | 
 | { "MemoryMenu",   NULL, "M_emory",   NULL, NULL, NULL }, | { "MemoryMenu",   NULL, "M_emory",   NULL, NULL, NULL }, | 
 |  | #if !defined(SUPPORT_IDEIO) | 
 | { "SASI1Menu",    NULL, "SASI-_1",   NULL, NULL, NULL }, | { "SASI1Menu",    NULL, "SASI-_1",   NULL, NULL, NULL }, | 
 | { "SASI2Menu",    NULL, "SASI-_2",   NULL, NULL, NULL }, | { "SASI2Menu",    NULL, "SASI-_2",   NULL, NULL, NULL }, | 
 |  | #endif | 
 | { "SoundMenu",    NULL, "_Sound",    NULL, NULL, NULL }, | { "SoundMenu",    NULL, "_Sound",    NULL, NULL, NULL }, | 
 |  |  | 
 | /* MenuItem */ | /* MenuItem */ | 
 | { "about",       NULL, "_About",            NULL, NULL, G_CALLBACK(cb_dialog) }, | { "about",       NULL, "_About",            NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "bmpsave",     NULL, "_BMP save...",      NULL, NULL, G_CALLBACK(cb_bmpsave) }, | { "bmpsave",     NULL, "_BMP save...",      NULL, NULL, G_CALLBACK(cb_bmpsave) }, | 
| { "calender",    NULL, "Ca_lender...",      NULL, NULL, G_CALLBACK(cb_dialog) }, | { "calendar",    NULL, "Ca_lendar...",      NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "configure",   NULL, "_Configure...",     NULL, NULL, G_CALLBACK(cb_dialog) }, | { "configure",   NULL, "_Configure...",     NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "disk1eject",  NULL, "_Eject",            NULL, NULL, G_CALLBACK(cb_diskeject), }, | { "disk1eject",  NULL, "_Eject",            NULL, NULL, G_CALLBACK(cb_diskeject), }, | 
 | { "disk1open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_diskopen), }, | { "disk1open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_diskopen), }, | 
| Line 111  static GtkActionEntry menu_entries[] = { | Line 125  static GtkActionEntry menu_entries[] = { | 
 | { "disk4open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_diskopen), }, | { "disk4open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_diskopen), }, | 
 | { "exit",        NULL, "E_xit",             NULL, NULL, G_CALLBACK(gtk_main_quit) }, | { "exit",        NULL, "E_xit",             NULL, NULL, G_CALLBACK(gtk_main_quit) }, | 
 | { "font",        NULL, "_Font...",          NULL, NULL, G_CALLBACK(cb_change_font), }, | { "font",        NULL, "_Font...",          NULL, NULL, G_CALLBACK(cb_change_font), }, | 
 |  | #if defined(SUPPORT_IDEIO) | 
 |  | { "ata00open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_ataopen), }, | 
 |  | { "ata00remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_ataremove), }, | 
 |  | { "ata01open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_ataopen), }, | 
 |  | { "ata01remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_ataremove), }, | 
 |  | { "atapiopen",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_atapiopen), }, | 
 |  | { "atapiremove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_atapiremove), }, | 
 |  | #endif | 
 | { "midiopt",     NULL, "MIDI _option...",   NULL, NULL, G_CALLBACK(cb_dialog) }, | { "midiopt",     NULL, "MIDI _option...",   NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "midipanic",   NULL, "MIDI _panic",       NULL, NULL, G_CALLBACK(cb_midipanic) }, | { "midipanic",   NULL, "MIDI _panic",       NULL, NULL, G_CALLBACK(cb_midipanic) }, | 
 | { "newdisk",     NULL, "_New disk...",      NULL, NULL, G_CALLBACK(cb_newdisk), }, | { "newdisk",     NULL, "_New disk...",      NULL, NULL, G_CALLBACK(cb_newdisk), }, | 
 |  | #if !defined(SUPPORT_IDEIO) | 
 | { "sasi1open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_sasiopen), }, | { "sasi1open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_sasiopen), }, | 
 | { "sasi1remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_sasiremove), }, | { "sasi1remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_sasiremove), }, | 
 | { "sasi2open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_sasiopen), }, | { "sasi2open",   NULL, "_Open...",          NULL, NULL, G_CALLBACK(cb_sasiopen), }, | 
 | { "sasi2remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_sasiremove), }, | { "sasi2remove", NULL, "_Remove",           NULL, NULL, G_CALLBACK(cb_sasiremove), }, | 
 |  | #endif | 
 | { "screenopt",   NULL, "Screen _option...", NULL, NULL, G_CALLBACK(cb_dialog) }, | { "screenopt",   NULL, "Screen _option...", NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "serialopt",   NULL, "Se_rial option...", NULL, NULL, G_CALLBACK(cb_dialog) }, | { "serialopt",   NULL, "Se_rial option...", NULL, NULL, G_CALLBACK(cb_dialog) }, | 
 | { "soundopt",    NULL, "So_und option...",  NULL, NULL, G_CALLBACK(cb_dialog) }, | { "soundopt",    NULL, "So_und option...",  NULL, NULL, G_CALLBACK(cb_dialog) }, | 
| Line 281  static const gchar *ui_info = | Line 305  static const gchar *ui_info = | 
 | "  <menu name='FDD' action='FDDMenu'>\n" | "  <menu name='FDD' action='FDDMenu'>\n" | 
 | "  </menu>\n" | "  </menu>\n" | 
 | "  <menu name='HardDisk' action='HardDiskMenu'>\n" | "  <menu name='HardDisk' action='HardDiskMenu'>\n" | 
 |  | #if defined(SUPPORT_IDEIO) | 
 |  | "   <menu name='ATA00' action='ATA00Menu'>\n" | 
 |  | "    <menuitem action='ata00open'/>\n" | 
 |  | "    <menuitem action='ata00remove'/>\n" | 
 |  | "   </menu>\n" | 
 |  | "   <menu name='ATA01' action='ATA01Menu'>\n" | 
 |  | "    <menuitem action='ata01open'/>\n" | 
 |  | "    <menuitem action='ata01remove'/>\n" | 
 |  | "   </menu>\n" | 
 |  | "   <menu name='ATAPI' action='ATAPIMenu'>\n" | 
 |  | "    <menuitem action='atapiopen'/>\n" | 
 |  | "    <menuitem action='atapiremove'/>\n" | 
 |  | "   </menu>\n" | 
 |  | #else   /* !SUPPORT_IDEIO */ | 
 | "   <menu name='SASI1' action='SASI1Menu'>\n" | "   <menu name='SASI1' action='SASI1Menu'>\n" | 
 | "    <menuitem action='sasi1open'/>\n" | "    <menuitem action='sasi1open'/>\n" | 
 | "    <menuitem action='sasi1remove'/>\n" | "    <menuitem action='sasi1remove'/>\n" | 
| Line 289  static const gchar *ui_info = | Line 327  static const gchar *ui_info = | 
 | "    <menuitem action='sasi2open'/>\n" | "    <menuitem action='sasi2open'/>\n" | 
 | "    <menuitem action='sasi2remove'/>\n" | "    <menuitem action='sasi2remove'/>\n" | 
 | "   </menu>\n" | "   </menu>\n" | 
 |  | #endif  /* SUPPORT_IDEIO */ | 
 | "  </menu>\n" | "  </menu>\n" | 
 | "  <menu name='Screen' action='ScreenMenu'>\n" | "  <menu name='Screen' action='ScreenMenu'>\n" | 
 | "   <menuitem action='fullscreen'/>\n" | "   <menuitem action='fullscreen'/>\n" | 
| Line 366  static const gchar *ui_info = | Line 405  static const gchar *ui_info = | 
 | "  <menu name='Other' action='OtherMenu'>\n" | "  <menu name='Other' action='OtherMenu'>\n" | 
 | "   <menuitem action='bmpsave'/>\n" | "   <menuitem action='bmpsave'/>\n" | 
 | "   <menuitem action='s98logging'/>\n" | "   <menuitem action='s98logging'/>\n" | 
| "   <menuitem action='calender'/>\n" | "   <menuitem action='calendar'/>\n" | 
 | "   <menuitem action='clockdisp'/>\n" | "   <menuitem action='clockdisp'/>\n" | 
 | "   <menuitem action='framedisp'/>\n" | "   <menuitem action='framedisp'/>\n" | 
 | "   <menuitem action='joyreverse'/>\n" | "   <menuitem action='joyreverse'/>\n" | 
| Line 720  end: | Line 759  end: | 
 | install_idle_process(); | install_idle_process(); | 
 | } | } | 
 |  |  | 
 |  | #if defined(SUPPORT_IDEIO) | 
 |  | static void | 
 |  | cb_ataopen(GtkAction *action, gpointer user_data) | 
 |  | { | 
 |  | GtkWidget *dialog = NULL; | 
 |  | GtkFileFilter *filter; | 
 |  | gchar *utf8, *path; | 
 |  | struct stat sb; | 
 |  | const gchar *name = gtk_action_get_name(action); | 
 |  | guint channel, drive; | 
 |  |  | 
 |  | UNUSED(user_data); | 
 |  |  | 
 |  | /* "ata??open" */ | 
 |  | if ((strlen(name) < 5) | 
 |  | || (!g_ascii_isdigit(name[3])) | 
 |  | || (!g_ascii_isdigit(name[4]))) { | 
 |  | return; | 
 |  | } | 
 |  |  | 
 |  | channel = g_ascii_digit_value(name[3]); | 
 |  | drive = g_ascii_digit_value(name[4]); | 
 |  | if (channel != 0 || drive >= 2) | 
 |  | return; | 
 |  |  | 
 |  | uninstall_idle_process(); | 
 |  |  | 
 |  | dialog = gtk_file_chooser_dialog_new("Open a IDE disk image", | 
 |  | GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, | 
 |  | GTK_STOCK_OPEN, GTK_RESPONSE_OK, | 
 |  | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | 
 |  | NULL); | 
 |  | if (dialog == NULL) | 
 |  | goto end; | 
 |  |  | 
 |  | g_object_set(G_OBJECT(dialog), "show-hidden", TRUE, NULL); | 
 |  | gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE); | 
 |  | utf8 = g_filename_to_utf8(hddfolder, -1, NULL, NULL, NULL); | 
 |  | if (utf8) { | 
 |  | gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), utf8); | 
 |  | g_free(utf8); | 
 |  | } | 
 |  |  | 
 |  | filter = gtk_file_filter_new(); | 
 |  | if (filter) { | 
 |  | gtk_file_filter_set_name(filter, "All files"); | 
 |  | gtk_file_filter_add_pattern(filter, "*"); | 
 |  | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | } | 
 |  | filter = gtk_file_filter_new(); | 
 |  | if (filter) { | 
 |  | gtk_file_filter_set_name(filter, "IDE disk image files"); | 
 |  | gtk_file_filter_add_pattern(filter, "*.[nN][hH][dD]"); | 
 |  | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | } | 
 |  | gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  |  | 
 |  | if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) | 
 |  | goto end; | 
 |  |  | 
 |  | utf8 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | 
 |  | if (utf8) { | 
 |  | path = g_filename_from_utf8(utf8, -1, NULL, NULL, NULL); | 
 |  | if (path) { | 
 |  | if ((stat(path, &sb) == 0) && S_ISREG(sb.st_mode) && (sb.st_mode & S_IRUSR)) { | 
 |  | file_cpyname(hddfolder, path, sizeof(hddfolder)); | 
 |  | diskdrv_sethdd(2 * channel + drive, path); | 
 |  | sysmng_update(SYS_UPDATEOSCFG); | 
 |  | } | 
 |  | g_free(path); | 
 |  | } | 
 |  | g_free(utf8); | 
 |  | } | 
 |  |  | 
 |  | end: | 
 |  | if (dialog) | 
 |  | gtk_widget_destroy(dialog); | 
 |  | install_idle_process(); | 
 |  | } | 
 |  |  | 
 |  | static void | 
 |  | cb_ataremove(GtkAction *action, gpointer user_data) | 
 |  | { | 
 |  | const gchar *name = gtk_action_get_name(GTK_ACTION(action)); | 
 |  | guint channel, drive; | 
 |  |  | 
 |  | UNUSED(user_data); | 
 |  |  | 
 |  | /* "ata??open" */ | 
 |  | if ((strlen(name) < 5) | 
 |  | || (!g_ascii_isdigit(name[3])) | 
 |  | || (!g_ascii_isdigit(name[4]))) { | 
 |  | return; | 
 |  | } | 
 |  |  | 
 |  | channel = g_ascii_digit_value(name[3]); | 
 |  | drive = g_ascii_digit_value(name[4]); | 
 |  | if (channel == 0 && drive < 2) { | 
 |  | if (2 * channel + drive < 4) { | 
 |  | diskdrv_sethdd(2 * channel + drive, ""); | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  |  | 
 |  | static void | 
 |  | cb_atapiopen(GtkAction *action, gpointer user_data) | 
 |  | { | 
 |  | GtkWidget *dialog = NULL; | 
 |  | GtkFileFilter *filter; | 
 |  | gchar *utf8, *path; | 
 |  | struct stat sb; | 
 |  |  | 
 |  | UNUSED(action); | 
 |  | UNUSED(user_data); | 
 |  |  | 
 |  | uninstall_idle_process(); | 
 |  |  | 
 |  | dialog = gtk_file_chooser_dialog_new("Open a ATAPI CD-ROM image", | 
 |  | GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, | 
 |  | GTK_STOCK_OPEN, GTK_RESPONSE_OK, | 
 |  | GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | 
 |  | NULL); | 
 |  | if (dialog == NULL) | 
 |  | goto end; | 
 |  |  | 
 |  | g_object_set(G_OBJECT(dialog), "show-hidden", TRUE, NULL); | 
 |  | gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE); | 
 |  | utf8 = g_filename_to_utf8(hddfolder, -1, NULL, NULL, NULL); | 
 |  | if (utf8) { | 
 |  | gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), utf8); | 
 |  | g_free(utf8); | 
 |  | } | 
 |  |  | 
 |  | filter = gtk_file_filter_new(); | 
 |  | if (filter) { | 
 |  | gtk_file_filter_set_name(filter, "All files"); | 
 |  | gtk_file_filter_add_pattern(filter, "*"); | 
 |  | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | } | 
 |  | filter = gtk_file_filter_new(); | 
 |  | if (filter) { | 
 |  | gtk_file_filter_set_name(filter, "ISO CD-ROM image files"); | 
 |  | gtk_file_filter_add_pattern(filter, "*.[iI][sS][oO]"); | 
 |  | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | } | 
 |  | gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | filter = gtk_file_filter_new(); | 
 |  | if (filter) { | 
 |  | gtk_file_filter_set_name(filter, "CUE CD-ROM image files"); | 
 |  | gtk_file_filter_add_pattern(filter, "*.[cC][uU][eE]"); | 
 |  | gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); | 
 |  | } | 
 |  |  | 
 |  | if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) | 
 |  | goto end; | 
 |  |  | 
 |  | utf8 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | 
 |  | if (utf8) { | 
 |  | path = g_filename_from_utf8(utf8, -1, NULL, NULL, NULL); | 
 |  | if (path) { | 
 |  | if ((stat(path, &sb) == 0) && S_ISREG(sb.st_mode) && (sb.st_mode & S_IRUSR)) { | 
 |  | file_cpyname(hddfolder, path, sizeof(hddfolder)); | 
 |  | sxsi_devopen(0x02, path); | 
 |  | sysmng_update(SYS_UPDATEOSCFG); | 
 |  | } | 
 |  | g_free(path); | 
 |  | } | 
 |  | g_free(utf8); | 
 |  | } | 
 |  |  | 
 |  | end: | 
 |  | if (dialog) | 
 |  | gtk_widget_destroy(dialog); | 
 |  | install_idle_process(); | 
 |  | } | 
 |  |  | 
 |  | static void | 
 |  | cb_atapiremove(GtkAction *action, gpointer user_data) | 
 |  | { | 
 |  |  | 
 |  | UNUSED(action); | 
 |  | UNUSED(user_data); | 
 |  |  | 
 |  | sxsi_devclose(0x02); | 
 |  | } | 
 |  | #endif  /* SUPPORT_IDEIO */ | 
 |  |  | 
 | static void | static void | 
 | cb_midipanic(GtkAction *action, gpointer user_data) | cb_midipanic(GtkAction *action, gpointer user_data) | 
 | { | { | 
| Line 810  cb_newdisk(GtkAction *action, gpointer u | Line 1036  cb_newdisk(GtkAction *action, gpointer u | 
 | } | } | 
 | gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter[0]); | gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter[0]); | 
 |  |  | 
| if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) | if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { | 
| goto end; | gtk_widget_destroy(dialog); | 
|  | install_idle_process(); | 
|  | return; | 
|  | } | 
 |  |  | 
 | utf8 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | utf8 = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | 
| if (utf8) { | if (utf8 == NULL) | 
| path = g_filename_from_utf8(utf8, -1, NULL, NULL, NULL); | goto end; | 
| if (path) { |  | 
| kind = -1; |  | 
| ext = file_getext(path); |  | 
| for (i = 0; i < NELEMENTS(exttbl); i++) { |  | 
| if (g_ascii_strcasecmp(ext, exttbl[i].name) == 0) { |  | 
| kind = exttbl[i].kind; |  | 
| break; |  | 
| } |  | 
| } |  | 
| if (i == NELEMENTS(exttbl)) { |  | 
| f = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog)); |  | 
| for (i = 0; i < NELEMENTS(filter); i++) { |  | 
| if (f == filter[i]) { |  | 
| kind = i; |  | 
| tmp = g_strjoin(".", path, extname[i]); |  | 
| if (tmp) { |  | 
| g_free(path); |  | 
| path = tmp; |  | 
| } |  | 
| break; |  | 
| } |  | 
| } |  | 
| } |  | 
|  |  | 
| uninstall_idle_process(); |  | 
| switch (kind) { |  | 
| case 0: /* D88 */ |  | 
| create_newdisk_fd_dialog(path); |  | 
| break; |  | 
 |  |  | 
| case 1: /* HDI */ | path = g_filename_from_utf8(utf8, -1, NULL, NULL, NULL); | 
| case 2: /* THD */ | g_free(utf8); | 
| case 3: /* NHD */ | if (path == NULL) | 
| create_newdisk_hd_dialog(path, kind); | goto end; | 
| break; |  | 
 |  |  | 
| default: | kind = -1; | 
|  | ext = file_getext(path); | 
|  | for (i = 0; i < NELEMENTS(exttbl); i++) { | 
|  | if (g_ascii_strcasecmp(ext, exttbl[i].name) == 0) { | 
|  | kind = exttbl[i].kind; | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (i == NELEMENTS(exttbl)) { | 
|  | f = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog)); | 
|  | for (i = 0; i < NELEMENTS(filter); i++) { | 
|  | if (f == filter[i]) { | 
|  | kind = i; | 
|  | tmp = g_strjoin(".", path, extname[i], NULL); | 
|  | if (tmp) { | 
|  | g_free(path); | 
|  | path = tmp; | 
|  | } | 
 | break; | break; | 
 | } | } | 
 | install_idle_process(); |  | 
 |  |  | 
 | g_free(path); |  | 
 | } | } | 
 | g_free(utf8); |  | 
 | } | } | 
 |  |  | 
 |  | /* XXX system has only one modal dialog? */ | 
 |  | gtk_widget_destroy(dialog); | 
 |  |  | 
 |  | switch (kind) { | 
 |  | case 0: /* D88 */ | 
 |  | create_newdisk_fd_dialog(path); | 
 |  | break; | 
 |  |  | 
 |  | case 1: /* HDI */ | 
 |  | case 2: /* THD */ | 
 |  | case 3: /* NHD */ | 
 |  | create_newdisk_hd_dialog(path, kind); | 
 |  | break; | 
 |  |  | 
 |  | default: | 
 |  | break; | 
 |  | } | 
 |  | g_free(path); | 
 |  |  | 
 |  | install_idle_process(); | 
 |  | return; | 
 |  |  | 
 | end: | end: | 
 | if (dialog) | if (dialog) | 
 | gtk_widget_destroy(dialog); | gtk_widget_destroy(dialog); | 
| Line 879  cb_reset(GtkAction *action, gpointer use | Line 1113  cb_reset(GtkAction *action, gpointer use | 
 | pccore_reset(); | pccore_reset(); | 
 | } | } | 
 |  |  | 
 |  | #if !defined(SUPPORT_IDEIO) | 
 | static void | static void | 
 | cb_sasiopen(GtkAction *action, gpointer user_data) | cb_sasiopen(GtkAction *action, gpointer user_data) | 
 | { | { | 
| Line 968  cb_sasiremove(GtkAction *action, gpointe | Line 1203  cb_sasiremove(GtkAction *action, gpointe | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  | #endif  /* !SUPPORT_IDEIO */ | 
 |  |  | 
 | static void | static void | 
 | cb_dialog(GtkAction *action, gpointer user_data) | cb_dialog(GtkAction *action, gpointer user_data) | 
| Line 979  cb_dialog(GtkAction *action, gpointer us | Line 1215  cb_dialog(GtkAction *action, gpointer us | 
 | if (g_ascii_strcasecmp(name, "configure") == 0) { | if (g_ascii_strcasecmp(name, "configure") == 0) { | 
 | create_configure_dialog(); | create_configure_dialog(); | 
 | } else if (g_ascii_strcasecmp(name, "soundopt") == 0) { | } else if (g_ascii_strcasecmp(name, "soundopt") == 0) { | 
 |  | create_sound_dialog(); | 
 | } else if (g_ascii_strcasecmp(name, "screenopt") == 0) { | } else if (g_ascii_strcasecmp(name, "screenopt") == 0) { | 
 |  | create_screen_dialog(); | 
 | } else if (g_ascii_strcasecmp(name, "midiopt") == 0) { | } else if (g_ascii_strcasecmp(name, "midiopt") == 0) { | 
 |  | create_midi_dialog(); | 
 | } else if (g_ascii_strcasecmp(name, "serialopt") == 0) { | } else if (g_ascii_strcasecmp(name, "serialopt") == 0) { | 
| } else if (g_ascii_strcasecmp(name, "calender") == 0) { | } else if (g_ascii_strcasecmp(name, "calendar") == 0) { | 
|  | create_calendar_dialog(); | 
 | } else if (g_ascii_strcasecmp(name, "about") == 0) { | } else if (g_ascii_strcasecmp(name, "about") == 0) { | 
 | create_about_dialog(); | create_about_dialog(); | 
 | } | } | 
| Line 1451  cb_radio(GtkRadioAction *action, GtkRadi | Line 1691  cb_radio(GtkRadioAction *action, GtkRadi | 
 | /* | /* | 
 | * create menubar | * create menubar | 
 | */ | */ | 
 |  | static GtkWidget *menubar; | 
 |  |  | 
 | static void | static void | 
 | equip_fddrive(GtkUIManager *ui_manager, guint no) | equip_fddrive(GtkUIManager *ui_manager, guint no) | 
 | { | { | 
| Line 1484  equip_fddrive(GtkUIManager *ui_manager, | Line 1726  equip_fddrive(GtkUIManager *ui_manager, | 
 | GtkWidget * | GtkWidget * | 
 | create_menu(void) | create_menu(void) | 
 | { | { | 
 | GtkWidget *menubar; |  | 
 | GError *err = NULL; | GError *err = NULL; | 
 | gint rv; | gint rv; | 
 | guint i; | guint i; | 
| Line 1554  create_menu(void) | Line 1795  create_menu(void) | 
 | menubar = gtk_ui_manager_get_widget(menu_hdl.ui_manager, "/MainMenu"); | menubar = gtk_ui_manager_get_widget(menu_hdl.ui_manager, "/MainMenu"); | 
 | return menubar; | return menubar; | 
 | } | } | 
 |  |  | 
 |  | void | 
 |  | xmenu_hide(void) | 
 |  | { | 
 |  |  | 
 |  | gtk_widget_hide(menubar); | 
 |  | } | 
 |  |  | 
 |  | void | 
 |  | xmenu_show(void) | 
 |  | { | 
 |  |  | 
 |  | gtk_widget_show(menubar); | 
 |  | } | 
 |  |  | 
 |  | void | 
 |  | xmenu_select_screen(UINT8 mode) | 
 |  | { | 
 |  |  | 
 |  | xmenu_select_rotate(mode & SCRNMODE_ROTATEMASK); | 
 |  | xmenu_select_screenmode(mode & SCRNMODE_FULLSCREEN); | 
 |  | } |