--- np2/x11/gtk/Attic/gtk_menu.c 2004/06/16 12:50:49 1.5 +++ np2/x11/gtk/Attic/gtk_menu.c 2005/03/12 12:36:40 1.11 @@ -10,8 +10,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * 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 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -44,6 +42,7 @@ #include "pc9861k.h" #include "s98.h" #include "scrnbmp.h" +#include "sxsi.h" #include "kdispwin.h" #include "toolwin.h" @@ -77,10 +76,14 @@ static void exit_from_menu(gpointer, gui static void reset(gpointer, guint, GtkWidget *); static void rotate(gpointer, guint, GtkWidget *); -static void fddopen(gpointer, guint, GtkWidget *); -static void fddeject(gpointer, guint, GtkWidget *); +static void fddopen(GtkMenuItem *, gpointer); +static void fddeject(GtkMenuItem *, gpointer); static void sasiopen(gpointer, guint, GtkWidget *); static void sasiremove(gpointer, guint, GtkWidget *); +#if defined(SUPPORT_IDEIO) +static void atapiopen(gpointer, guint, GtkWidget *); +static void atapiremove(gpointer, guint, GtkWidget *); +#endif static void change_font(gpointer, guint, GtkWidget *); @@ -110,15 +113,17 @@ enum { static void sound_board(gpointer, guint, GtkWidget *); enum { - NOSOUNDBOARD = 0, - PC9801_14 = 1, - PC9801_26K = 2, - PC9801_86 = 4, - PC9801_118 = 8, - CHIBI_OTO = 0x14, - SPEAK_BOARD = 0x20, - SPARK_BOARD = 0x40, - AMD98_BOARD = 0x80 + PC9801_14 = 0x01, + PC9801_26K = 0x02, + PC9801_86 = 0x04, + PC9801_118 = 0x08, + CHIBI_OTO = 0x10, + SPEAK_BOARD = 0x20, + SPARK_BOARD = 0x40, + AMD98_BOARD = 0x80, + PC9801_26K_86 = (PC9801_26K|PC9801_86), + PC9801_86_CB = (PC9801_86|CHIBI_OTO), + NOSOUNDBOARD = 0x00 }; static void memory(gpointer, guint, GtkWidget *); @@ -220,21 +225,25 @@ static GtkItemFactoryEntry menu_items[] { "/Emulate/sep2", NULL, NULL, 0, "" }, { "/Emulate/E_xit", NULL, f(exit_from_menu), 0, NULL }, { "/FDD", NULL, NULL, 0, "" }, -{ "/FDD/Drive_1", NULL, NULL, 0, "" }, -{ "/FDD/Drive1/_Open...", NULL, f(fddopen), 0, NULL }, -{ "/FDD/Drive1/_Eject", NULL, f(fddeject), 0, NULL }, -{ "/FDD/Drive_2", NULL, NULL, 0, "" }, -{ "/FDD/Drive2/_Open...", NULL, f(fddopen), 1, NULL }, -{ "/FDD/Drive2/_Eject", NULL, f(fddeject), 1, NULL }, -{ "/FDD/sep1", NULL, NULL, 0, "" }, -{ "/FDD/_Eject All", NULL, f(fddeject), ~0, NULL }, { "/HardDisk", NULL, NULL, 0, "" }, +#if !defined(SUPPORT_IDEIO) { "/HardDisk/SASI-_1", NULL, NULL, 0, "" }, { "/HardDisk/SASI-1/_Open...", NULL, f(sasiopen), 0, NULL }, { "/HardDisk/SASI-1/_Remove", NULL, f(sasiremove), 0, NULL }, { "/HardDisk/SASI-_2", NULL, NULL, 0, "" }, { "/HardDisk/SASI-2/_Open...", NULL, f(sasiopen), 1, NULL }, { "/HardDisk/SASI-2/_Remove", NULL, f(sasiremove), 1, NULL }, +#else +{ "/HardDisk/IDE0-_0", NULL, NULL, 0, "" }, +{ "/HardDisk/IDE0-0/_Open...", NULL, f(sasiopen), 0, NULL }, +{ "/HardDisk/IDE0-0/_Remove", NULL, f(sasiremove), 0, NULL }, +{ "/HardDisk/IDE0-_1", NULL, NULL, 0, "" }, +{ "/HardDisk/IDE0-1/_Open...", NULL, f(sasiopen), 1, NULL }, +{ "/HardDisk/IDE0-1/_Remove", NULL, f(sasiremove), 1, NULL }, +{ "/HardDisk/_CD-ROM", NULL, NULL, 0, "" }, +{ "/HardDisk/CD-ROM/_Open...", NULL, f(atapiopen), 0x02, NULL }, +{ "/HardDisk/CD-ROM/_Remove", NULL, f(atapiremove), 0x02, NULL}, +#endif { "/Screen", NULL, NULL, 0, "" }, { "/Screen/_Window", NULL, NULL, 0, "" }, { "/Screen/_FullScreen", NULL, NULL, 0, "/Screen/Window" }, @@ -266,8 +275,8 @@ static GtkItemFactoryEntry menu_items[] { "/Device/Keyboard/F12 = _Mouse", NULL, f(f12), 0, "" }, { "/Device/Keyboard/F12 = Co_py",NULL, f(f12),1,"/Device/Keyboard/F12 = Mouse"}, { "/Device/Keyboard/F12 = S_top",NULL, f(f12),2,"/Device/Keyboard/F12 = Copy" }, -{ "/Device/Keyboard/F12 = tenkey [=]", NULL, f(f12),3,"/Device/Keyboard/F12 = Stop" }, -{ "/Device/Keyboard/F12 = tenkey [,]", NULL, f(f12),4,"/Device/Keyboard/F12 = tenkey [=]" }, +{ "/Device/Keyboard/F12 = tenkey [=]", NULL, f(f12),4,"/Device/Keyboard/F12 = Stop" }, +{ "/Device/Keyboard/F12 = tenkey [,]", NULL, f(f12),3,"/Device/Keyboard/F12 = tenkey [=]" }, { "/Device/_Sound", NULL, NULL, 0, "" }, { "/Device/Sound/Beep _off", NULL, f(beepvol), BEEP_OFF, "" }, { "/Device/Sound/Beep _low", NULL, f(beepvol), BEEP_LOW, "/Device/Sound/Beep off" }, @@ -278,13 +287,15 @@ static GtkItemFactoryEntry menu_items[] { "/Device/Sound/PC-9801-_14", NULL, f(sound_board), PC9801_14, "/Device/Sound/Disable board" }, { "/Device/Sound/PC-9801-_26K", NULL, f(sound_board), PC9801_26K, "/Device/Sound/PC-9801-14" }, { "/Device/Sound/PC-9801-8_6", NULL, f(sound_board), PC9801_86, "/Device/Sound/PC-9801-26K" }, -{ "/Device/Sound/PC-9801-11_8", NULL, f(sound_board), PC9801_118, "/Device/Sound/PC-9801-86" }, -{ "/Device/Sound/_Chibi-oto", NULL, f(sound_board), CHIBI_OTO, "/Device/Sound/PC-9801-118" }, -{ "/Device/Sound/S_peak board", NULL, f(sound_board), SPEAK_BOARD, "/Device/Sound/Chibi-oto" }, +{ "/Device/Sound/PC-9801-26_K+86", NULL, f(sound_board), PC9801_26K_86, "/Device/Sound/PC-9801-86" }, +{ "/Device/Sound/PC-9801-86+_Chibi-oto", NULL, f(sound_board), PC9801_86_CB, "/Device/Sound/PC-9801-26K+86" }, +{ "/Device/Sound/PC-9801-11_8", NULL, f(sound_board), PC9801_118, "/Device/Sound/PC-9801-86+Chibi-oto" }, +{ "/Device/Sound/S_peak board", NULL, f(sound_board), SPEAK_BOARD, "/Device/Sound/PC-9801-118" }, { "/Device/Sound/Sp_ark board", NULL, f(sound_board), SPARK_BOARD, "/Device/Sound/Speak board" }, -{ "/Device/Sound/_AMD98", NULL, f(sound_board), SPARK_BOARD, "/Device/Sound/Spark board" }, +{ "/Device/Sound/_AMD98", NULL, f(sound_board), AMD98_BOARD, "/Device/Sound/Spark board" }, +{ "/Device/Sound/_Jast Sound", NULL, f(toggle), JAST_SOUND, "" }, { "/Device/Sound/sep2", NULL, NULL, 0, "" }, -{ "/Device/Sound/_Seek Sound", NULL, NULL, 0, "" }, +{ "/Device/Sound/_Seek Sound", NULL, f(toggle), SEEK_SOUND, "" }, { "/Device/M_emory", NULL, NULL, 0, "" }, { "/Device/Memory/64_0KB", NULL, f(memory), 0, "" }, { "/Device/Memory/_1.6MB", NULL, f(memory), 1, "/Device/Memory/640KB" }, @@ -351,6 +362,7 @@ static struct { { "/Other/Tool Window", 0, SYS_UPDATEOSCFG }, { "/Other/Key Display", 0, SYS_UPDATEOSCFG }, { "/Other/Software Keyboard", 0, SYS_UPDATEOSCFG }, + { "/Device/Sound/Jast Sound", 0, SYS_UPDATEOSCFG }, }; static _MENU_HDL menu_hdl; @@ -360,15 +372,17 @@ static BOOL inited = FALSE; * menu initialize */ GtkWidget * -create_menu(GtkWidget *w) +create_menu(void) { GtkAccelGroup *accel_group; GtkWidget *menubar; + int i; accel_group = gtk_accel_group_new(); menu_hdl.item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", accel_group); gtk_item_factory_create_items(menu_hdl.item_factory, NELEMENTS(menu_items), menu_items, NULL); - gtk_accel_group_attach(accel_group, GTK_OBJECT(w)); + + menubar = gtk_item_factory_get_widget(menu_hdl.item_factory, "
"); disable_unused_items(); @@ -388,6 +402,7 @@ create_menu(GtkWidget *w) xmenu_toggle_item(TOOL_WINDOW, np2oscfg.toolwin, TRUE); xmenu_toggle_item(KEY_DISPLAY, np2oscfg.keydisp, TRUE); xmenu_toggle_item(SOFT_KBD, np2oscfg.softkbd, TRUE); + xmenu_toggle_item(JAST_SOUND, np2oscfg.jastsnd, TRUE); xmenu_select_framerate(np2oscfg.DRAW_SKIP); xmenu_select_f12key(np2oscfg.F12KEY); @@ -396,9 +411,52 @@ create_menu(GtkWidget *w) xmenu_select_extmem(np2cfg.EXTMEM); xmenu_select_mouse_move_ratio(np2oscfg.mouse_move_ratio); - inited = 1; + if (np2cfg.fddequip) { + GtkWidget *fddmenu; + GtkWidget *sep; + GtkWidget *ejectall; + + fddmenu = gtk_item_factory_get_widget(menu_hdl.item_factory, "/FDD"); + for (i = 0; i < 4; i++) { + if (np2cfg.fddequip & (1 << i)) { + char label[32]; + GtkWidget *menu, *menuitem, *openitem, *ejectitem; + + menu = gtk_menu_new(); + + openitem = gtk_menu_item_new_with_label("Open..."); + gtk_widget_show(openitem); + gtk_menu_append(GTK_MENU(menu), openitem); + gtk_signal_connect(GTK_OBJECT(openitem), + "activate", GTK_SIGNAL_FUNC(fddopen), (gpointer)i); + + ejectitem = gtk_menu_item_new_with_label("Eject"); + gtk_widget_show(ejectitem); + gtk_menu_append(GTK_MENU(menu), ejectitem); + gtk_signal_connect(GTK_OBJECT(ejectitem), + "activate", GTK_SIGNAL_FUNC(fddeject), (gpointer)i); + + g_snprintf(label, sizeof(label), "Drive%d", i+1); + menuitem = gtk_menu_item_new_with_label(label); + gtk_widget_show(menuitem); - menubar = gtk_item_factory_get_widget(menu_hdl.item_factory, "
"); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); + gtk_menu_append(GTK_MENU(fddmenu), menuitem); + + } + } + sep = gtk_menu_item_new(); + gtk_widget_show(sep); + gtk_menu_append(GTK_MENU(fddmenu), sep); + + ejectall = gtk_menu_item_new_with_label("Eject All"); + gtk_widget_show(ejectall); + gtk_menu_append(GTK_MENU(fddmenu), ejectall); + gtk_signal_connect_object(GTK_OBJECT(ejectall), + "activate", GTK_SIGNAL_FUNC(fddeject), (gpointer)~0); + } + + inited = 1; if (np2oscfg.I286SAVE) { GtkWidget *debug_menu; @@ -466,12 +524,19 @@ disable_unused_items(void) "/Device/Sound/PC-9801-14", "/Device/Sound/PC-9801-26K", "/Device/Sound/PC-9801-86", + "/Device/Sound/PC-9801-26K+86", + "/Device/Sound/PC-9801-86+Chibi-oto", "/Device/Sound/PC-9801-118", - "/Device/Sound/Chibi-oto", "/Device/Sound/Speak board", "/Device/Sound/Spark board", "/Device/Sound/AMD98", - "/Device/Sound/Seek Sound" + "/Device/Sound/Seek Sound", +#endif +#if !defined(SUPPORT_KEYDISP) + "/Other/Key Display", +#endif +#if !defined(SUPPORT_SOFTKBD) + "/Other/Software Keyboard", #endif }; int i; @@ -587,8 +652,9 @@ xmenu_select_soundboard(int kind) { "/Device/Sound/PC-9801-14", PC9801_14 }, { "/Device/Sound/PC-9801-26K", PC9801_26K }, { "/Device/Sound/PC-9801-86", PC9801_86 }, + { "/Device/Sound/PC-9801-26K+86", PC9801_26K_86 }, + { "/Device/Sound/PC-9801-86+Chibi-oto", PC9801_86_CB }, { "/Device/Sound/PC-9801-118", PC9801_118 }, - { "/Device/Sound/Chibi-oto", CHIBI_OTO }, { "/Device/Sound/Speak board", SPEAK_BOARD }, { "/Device/Sound/Spark board", SPARK_BOARD }, { "/Device/Sound/AMD98", AMD98_BOARD }, @@ -605,7 +671,7 @@ xmenu_select_soundboard(int kind) #else UNUSED(kind); - np2cfg.SOUND_SW = 0; + np2cfg.SOUND_SW = NOSOUNDBOARD; xmenu_select_item(&menu_hdl, "/Device/Sound/Disable board"); #endif } @@ -677,7 +743,7 @@ exit_from_menu(gpointer data, guint acti UNUSED(action); UNUSED(w); - gtk_widget_destroy(GTK_WIDGET(window)); + gtk_widget_destroy(GTK_WIDGET(main_window)); } static void @@ -723,28 +789,28 @@ fddopen_dialog_ok_cb(void *arg, const ch } static void -fddopen(gpointer data, guint action, GtkWidget *w) +fddopen(GtkMenuItem *w, gpointer data) { - UNUSED(data); UNUSED(w); - create_file_selection("Open FDD image", fddfolder, (void *)action, - fddopen_dialog_ok_cb, NULL); + create_file_selection("Open floppy disk image", + fddfolder, (void *)data, fddopen_dialog_ok_cb, NULL); } static void -fddeject(gpointer data, guint action, GtkWidget *w) +fddeject(GtkMenuItem *w, gpointer data) { + guint action = (guint)data; int i; - UNUSED(data); UNUSED(w); if (action == (guint)~0) { - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { diskdrv_setfdd(i, NULL, FALSE); toolwin_setfdd(i, NULL); + } } else { diskdrv_setfdd(action, NULL, FALSE); toolwin_setfdd(action, NULL); @@ -752,7 +818,7 @@ fddeject(gpointer data, guint action, Gt } -/* ----- SASI */ +/* ----- SASI/IDE */ static BOOL sasiopen_dialog_ok_cb(void *arg, const char *path) { @@ -779,7 +845,7 @@ sasiopen(gpointer data, guint action, Gt UNUSED(data); UNUSED(w); - create_file_selection("Open SASI image", hddfolder, (void *)action, + create_file_selection("Open hard disk image", hddfolder, (void *)action, sasiopen_dialog_ok_cb, NULL); } @@ -792,13 +858,57 @@ sasiremove(gpointer data, guint action, UNUSED(w); if (action == (guint)~0) { - for (i = 0; i < 2; i++) + for (i = 0; i < 2; i++) { diskdrv_sethdd(i, ""); + } } else { diskdrv_sethdd(action, ""); } +} + +#if defined(SUPPORT_IDEIO) +/* ---- ATAPI */ +static BOOL +atapiopen_dialog_ok_cb(void *arg, const char *path) +{ + struct stat sb; + int drive = GPOINTER_TO_UINT(arg); + BOOL result = FALSE; + if (stat(path, &sb) == 0) { + if (S_ISREG(sb.st_mode) && (sb.st_mode & S_IRUSR)) { + file_cpyname(hddfolder, path, sizeof(hddfolder)); + sxsi_devopen(drive, path); + result = TRUE; + } + } + + return result; +} + +static void +atapiopen(gpointer data, guint action, GtkWidget *w) +{ + + UNUSED(data); + UNUSED(w); + + create_file_selection("Open CD-ROM image", hddfolder, + GUINT_TO_POINTER(action), atapiopen_dialog_ok_cb, NULL); +} + +static void +atapiremove(gpointer data, guint action, GtkWidget *w) +{ + + UNUSED(data); + UNUSED(w); + + if (action == 0x02) { + sxsi_devclose(action); + } } +#endif /* ---- font */ static BOOL @@ -961,15 +1071,15 @@ sound_board(gpointer data, guint action, switch (action) { case NOSOUNDBOARD: - case PC9801_86: case PC9801_14: case PC9801_26K: + case PC9801_86: + case PC9801_26K_86: + case PC9801_86_CB: case PC9801_118: - case CHIBI_OTO: case SPEAK_BOARD: case SPARK_BOARD: case AMD98_BOARD: - /* XXX: ÆóË纹¤· */ if (np2cfg.SOUND_SW != action) { np2cfg.SOUND_SW = action; sysmng_update(SYS_UPDATECFG); @@ -1047,6 +1157,7 @@ bmpsave_dialog_ok_cb(void *arg, const ch file_close(fh); result = TRUE; } + _MFREE(bmp); return result; } @@ -1169,7 +1280,7 @@ toggle(gpointer data, guint action, GtkW case SEEK_SOUND: np2cfg.MOTOR = !np2cfg.MOTOR; - xmenu_toggle_item(SEEK_SOUND, np2cfg.MOTOR, TRUE); + xmenu_toggle_item(SEEK_SOUND, np2cfg.MOTOR, FALSE); break; case MOUSE_MODE: @@ -1273,6 +1384,12 @@ toggle(gpointer data, guint action, GtkW } else { skbdwin_destroy(); } + break; + + case JAST_SOUND: + np2oscfg.jastsnd = !np2oscfg.jastsnd; + xmenu_toggle_item(JAST_SOUND, np2oscfg.jastsnd, FALSE); + break; case NUM_TOGGLE_ITEMS: default: